mirror of
https://github.com/paboyle/Grid.git
synced 2026-04-19 02:01:02 +01:00
Compare commits
40 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 2223cf0f4b | |||
| 56d1308477 | |||
| a88ce1a573 | |||
| 6c9b8e2850 | |||
| 90b8e57765 | |||
| ae6dcd057d | |||
| f8721a4388 | |||
| 38f93f7e12 | |||
| 7c51dc07f1 | |||
| 4931505e5a | |||
| 2099047b06 | |||
| 0fb307ae17 | |||
| 2b100d76f2 | |||
| 04160eaa30 | |||
| 6cb9d2935f | |||
| ac7f845583 | |||
| ff057145b4 | |||
| 9fdb209b7e | |||
| 2d324f53cc | |||
| f250133dc5 | |||
| 8d61a552e4 | |||
| 84cac60ca9 | |||
| dfd7a2e86e | |||
| 23666f20c1 | |||
| 44f33e47d7 | |||
| b1bd88cfba | |||
| d63110d26f | |||
| a170855d84 | |||
| 416bd9a874 | |||
| bc9427c38c | |||
| 188d9472da | |||
| dc6951f43e | |||
| 2deeef622b | |||
| 8ec1950718 | |||
| dc942d5d56 | |||
| b3de0f922a | |||
| 3c0931cca9 | |||
| d75906f517 | |||
| c354838200 | |||
| 3292924e6e |
+6
-130
@@ -1,132 +1,8 @@
|
|||||||
# Compiled Object files #
|
# Exclude directories
|
||||||
#########################
|
_site
|
||||||
*.slo
|
.sass-cache
|
||||||
*.lo
|
.jekyll-metadata
|
||||||
*.o
|
pdf
|
||||||
*.obj
|
|
||||||
|
|
||||||
# Editor files #
|
# Exclude backup files
|
||||||
################
|
|
||||||
*~
|
*~
|
||||||
*#
|
|
||||||
*.sublime-*
|
|
||||||
|
|
||||||
# Precompiled Headers #
|
|
||||||
#######################
|
|
||||||
*.gch
|
|
||||||
*.pch
|
|
||||||
|
|
||||||
# Compiled Dynamic libraries #
|
|
||||||
##############################
|
|
||||||
*.so
|
|
||||||
*.dylib
|
|
||||||
*.dll
|
|
||||||
|
|
||||||
# Fortran module files #
|
|
||||||
########################
|
|
||||||
*.mod
|
|
||||||
|
|
||||||
# Compiled Static libraries #
|
|
||||||
#############################
|
|
||||||
*.lai
|
|
||||||
*.la
|
|
||||||
*.a
|
|
||||||
*.lib
|
|
||||||
|
|
||||||
# Executables #
|
|
||||||
###############
|
|
||||||
*.exe
|
|
||||||
*.out
|
|
||||||
*.app
|
|
||||||
|
|
||||||
# http://www.gnu.org/software/automake #
|
|
||||||
########################################
|
|
||||||
Makefile.in
|
|
||||||
Makefile
|
|
||||||
Config.h
|
|
||||||
Config.h.in
|
|
||||||
config.log
|
|
||||||
config.status
|
|
||||||
.deps
|
|
||||||
Make.inc
|
|
||||||
eigen.inc
|
|
||||||
Eigen.inc
|
|
||||||
|
|
||||||
# http://www.gnu.org/software/autoconf #
|
|
||||||
########################################
|
|
||||||
autom4te.cache
|
|
||||||
aclocal.m4
|
|
||||||
compile
|
|
||||||
configure
|
|
||||||
depcomp
|
|
||||||
install-sh
|
|
||||||
missing
|
|
||||||
stamp-h1
|
|
||||||
config.sub
|
|
||||||
config.guess
|
|
||||||
INSTALL
|
|
||||||
.dirstamp
|
|
||||||
ltmain.sh
|
|
||||||
|
|
||||||
# Logs and databases #
|
|
||||||
######################
|
|
||||||
*.log
|
|
||||||
*.sql
|
|
||||||
*.sqlite
|
|
||||||
|
|
||||||
# OS generated files #
|
|
||||||
######################
|
|
||||||
.DS_Store
|
|
||||||
.DS_Store?
|
|
||||||
._*
|
|
||||||
.Spotlight-V100
|
|
||||||
.Trashes
|
|
||||||
ehthumbs.db
|
|
||||||
Thumbs.db
|
|
||||||
|
|
||||||
# build directory #
|
|
||||||
###################
|
|
||||||
build*/*
|
|
||||||
|
|
||||||
# IDE related files #
|
|
||||||
#####################
|
|
||||||
*.xcodeproj/*
|
|
||||||
build.sh
|
|
||||||
.vscode
|
|
||||||
*.code-workspace
|
|
||||||
|
|
||||||
# Eigen source #
|
|
||||||
################
|
|
||||||
lib/Eigen/*
|
|
||||||
|
|
||||||
# FFTW source #
|
|
||||||
################
|
|
||||||
lib/fftw/*
|
|
||||||
|
|
||||||
# libtool macros #
|
|
||||||
##################
|
|
||||||
m4/lt*
|
|
||||||
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
|
|
||||||
lib/version.h
|
|
||||||
|
|
||||||
# vs code editor files #
|
|
||||||
########################
|
|
||||||
.vscode/
|
|
||||||
.vscode/settings.json
|
|
||||||
settings.json
|
|
||||||
|
|||||||
-60
@@ -1,60 +0,0 @@
|
|||||||
language: cpp
|
|
||||||
|
|
||||||
cache:
|
|
||||||
directories:
|
|
||||||
- clang
|
|
||||||
|
|
||||||
matrix:
|
|
||||||
include:
|
|
||||||
- os: osx
|
|
||||||
osx_image: xcode8.3
|
|
||||||
compiler: clang
|
|
||||||
|
|
||||||
before_install:
|
|
||||||
- export GRIDDIR=`pwd`
|
|
||||||
- if [[ "$TRAVIS_OS_NAME" == "linux" ]] && [[ "$CC" == "clang" ]] && [ ! -e clang/bin ]; then wget $CLANG_LINK; tar -xf `basename $CLANG_LINK`; mkdir clang; mv clang+*/* clang/; fi
|
|
||||||
- if [[ "$TRAVIS_OS_NAME" == "linux" ]] && [[ "$CC" == "clang" ]]; then export PATH="${GRIDDIR}/clang/bin:${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 install libmpc; fi
|
|
||||||
|
|
||||||
install:
|
|
||||||
- export CWD=`pwd`
|
|
||||||
- echo $CWD
|
|
||||||
- export CC=$CC$VERSION
|
|
||||||
- export CXX=$CXX$VERSION
|
|
||||||
- echo $PATH
|
|
||||||
- which autoconf
|
|
||||||
- autoconf --version
|
|
||||||
- which automake
|
|
||||||
- automake --version
|
|
||||||
- which $CC
|
|
||||||
- $CC --version
|
|
||||||
- which $CXX
|
|
||||||
- $CXX --version
|
|
||||||
- if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then export LDFLAGS='-L/usr/local/lib'; fi
|
|
||||||
|
|
||||||
script:
|
|
||||||
- ./bootstrap.sh
|
|
||||||
- mkdir build
|
|
||||||
- cd build
|
|
||||||
- mkdir lime
|
|
||||||
- cd lime
|
|
||||||
- mkdir build
|
|
||||||
- cd build
|
|
||||||
- wget http://usqcd-software.github.io/downloads/c-lime/lime-1.3.2.tar.gz
|
|
||||||
- tar xf lime-1.3.2.tar.gz
|
|
||||||
- cd lime-1.3.2
|
|
||||||
- ./configure --prefix=$CWD/build/lime/install
|
|
||||||
- make -j4
|
|
||||||
- make install
|
|
||||||
- cd $CWD/build
|
|
||||||
- ../configure --enable-precision=single --enable-simd=SSE4 --enable-comms=none --with-lime=$CWD/build/lime/install
|
|
||||||
- make -j4
|
|
||||||
- ./benchmarks/Benchmark_dwf --threads 1 --debug-signals
|
|
||||||
- echo make clean
|
|
||||||
- ../configure --enable-precision=double --enable-simd=SSE4 --enable-comms=none --with-lime=$CWD/build/lime/install
|
|
||||||
- make -j4
|
|
||||||
- ./benchmarks/Benchmark_dwf --threads 1 --debug-signals
|
|
||||||
- make check
|
|
||||||
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
Author: Azusa Yamaguchi <ayamaguc@staffmail.ed.ac.uk>
|
|
||||||
Author: Peter Boyle <paboyle@ph.ed.ac.uk>
|
|
||||||
Author: Peter Boyle <peterboyle@MacBook-Pro.local>
|
|
||||||
Author: paboyle <paboyle@ph.ed.ac.uk>
|
|
||||||
+571
@@ -0,0 +1,571 @@
|
|||||||
|
## [3.4.8](https://github.com/mmistakes/minimal-mistakes/releases/tag/3.4.8)
|
||||||
|
|
||||||
|
### Enhancements
|
||||||
|
|
||||||
|
- Improve type readability for larger viewports by bumping up base `font-size`. [#533](https://github.com/mmistakes/minimal-mistakes/issues/533)
|
||||||
|
- Update Portuguese localized UI text. [#541](https://github.com/mmistakes/minimal-mistakes/pull/541)
|
||||||
|
- Add `page.title` and via parameter to Twitter share link. [#538](https://github.com/mmistakes/minimal-mistakes/pull/538)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
- Fix Last.fm author profile URL. [#540](https://github.com/mmistakes/minimal-mistakes/pull/540)
|
||||||
|
|
||||||
|
### Maintenance
|
||||||
|
|
||||||
|
- Move Brazilian Portuguese localized text under `pt-BR` key.
|
||||||
|
|
||||||
|
## [3.4.7](https://github.com/mmistakes/minimal-mistakes/releases/tag/3.4.7)
|
||||||
|
|
||||||
|
### Enhancements
|
||||||
|
|
||||||
|
- Add `layout` based and user-defined class names to `<body>` element for added CSS hooks. [#526](https://github.com/mmistakes/minimal-mistakes/pull/526)
|
||||||
|
- Add simplified Chinese localized UI text. [#532](https://github.com/mmistakes/minimal-mistakes/pull/532)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
- Remove duplicate include of `base_path` in category-list.html [#522](https://github.com/mmistakes/minimal-mistakes/pull/522)
|
||||||
|
|
||||||
|
## [3.4.6](https://github.com/mmistakes/minimal-mistakes/releases/tag/3.4.6)
|
||||||
|
|
||||||
|
### Enhancements
|
||||||
|
|
||||||
|
- Add Italian "comments" related localized UI text. [#514](https://github.com/mmistakes/minimal-mistakes/pull/514)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
- Disable `compress` HTML layout by default. To enable add `layout: compress` to `_layouts/default.html`.
|
||||||
|
|
||||||
|
## [3.4.5](https://github.com/mmistakes/minimal-mistakes/releases/tag/3.4.5)
|
||||||
|
|
||||||
|
### Enhancements
|
||||||
|
|
||||||
|
- Improve line numbered code block styling when using `{% highlight linenos %}` tag. [#513](https://github.com/mmistakes/minimal-mistakes/issues/513)
|
||||||
|
- Add English fallback to "Follow" button label. [#496](https://github.com/mmistakes/minimal-mistakes/pull/496)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
- Fix Firefox alignment issues with code blocks generated with the `{% highlight %}` tag. [#512](https://github.com/mmistakes/minimal-mistakes/issues/512)
|
||||||
|
|
||||||
|
### Maintenance
|
||||||
|
|
||||||
|
- Clarified comment for `author.stackoverflow` value used in author sidebar links. [#487](https://github.com/mmistakes/minimal-mistakes/pull/487)
|
||||||
|
- Add list of localized text strings. [#488](https://github.com/mmistakes/minimal-mistakes/pull/488)
|
||||||
|
- Add `{% highlight %}` code block examples to demo site.
|
||||||
|
- Add documentation for using custom sidebar navigation menus. [#476](https://github.com/mmistakes/minimal-mistakes/issues/476)
|
||||||
|
|
||||||
|
## [3.4.4](https://github.com/mmistakes/minimal-mistakes/releases/tag/3.4.4)
|
||||||
|
|
||||||
|
### Enhancements
|
||||||
|
|
||||||
|
- Add French "comments" related localized UI text. [#472](https://github.com/mmistakes/minimal-mistakes/pull/472)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
- Exclude `vendor` in Jekyll config file.
|
||||||
|
- Fix Liquid syntax error for offending parenthesis. [#479](https://github.com/mmistakes/minimal-mistakes/issues/479)
|
||||||
|
|
||||||
|
### Maintenance
|
||||||
|
|
||||||
|
- Update gems: `colorator` (1.1.0), `forwardable-extended` (2.6.0), `github-pages` (93), `jekyll` (= 3.2.1), `minima` (= 1.0.1).
|
||||||
|
|
||||||
|
## [3.4.3](https://github.com/mmistakes/minimal-mistakes/releases/tag/3.4.3)
|
||||||
|
|
||||||
|
### Enhancements
|
||||||
|
|
||||||
|
- Make ["honeypot" `input`](https://github.com/mmistakes/minimal-mistakes/commit/06a8249a69a37dddda7e2a5bfbe32056c1a9a607) in Staticman comment form less obvious to spam bots
|
||||||
|
- Add padding to `.highlight` code blocks to better [align `overflow` scrollbar](https://github.com/mmistakes/minimal-mistakes/commit/e4abec0a6f7f8cff72505ca0754615df294fd5b3) to the bottom.
|
||||||
|
- Add additional image options for Twitter card social sharing meta tags. [#466](https://github.com/mmistakes/minimal-mistakes/pull/466)
|
||||||
|
- Add structured data markup for Staticman comments. [#458](https://github.com/mmistakes/minimal-mistakes/issues/458)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
- Format `og:locale` tag with `_` instead of `-`. [#462](https://github.com/mmistakes/minimal-mistakes/issues/462)
|
||||||
|
|
||||||
|
### Maintenance
|
||||||
|
|
||||||
|
- Add note to docs about using `url: http://localhost:4000` when working locally.
|
||||||
|
|
||||||
|
## [3.4.2](https://github.com/mmistakes/minimal-mistakes/releases/tag/3.4.2)
|
||||||
|
|
||||||
|
### Enhancements
|
||||||
|
|
||||||
|
- Improve UX of static comment forms. [#448](https://github.com/mmistakes/minimal-mistakes/issues/448)
|
||||||
|
|
||||||
|
## [3.4.1](https://github.com/mmistakes/minimal-mistakes/releases/tag/3.4.1)
|
||||||
|
|
||||||
|
### Enhancements
|
||||||
|
|
||||||
|
- Add `staticman.filename` configuration with UNIX timestamp for sorting data files. example ~> `comment-1470943149`.
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
- Don't add `<a>` to author name if URL is blank.
|
||||||
|
|
||||||
|
## [3.4.0](https://github.com/mmistakes/minimal-mistakes/releases/tag/3.4.0)
|
||||||
|
|
||||||
|
### Enhancements
|
||||||
|
|
||||||
|
- Support static-based commenting via [Staticman](https://staticman.net/) for sites hosted with GitHub Pages. [#424](https://github.com/mmistakes/minimal-mistakes/issues/424)
|
||||||
|
|
||||||
|
## [3.3.7](https://github.com/mmistakes/minimal-mistakes/releases/tag/3.3.7)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
- Re-enabled Jekyll plugins in `_config.yml` in case they aren't autoloaded in `Gemfile`. [#417](https://github.com/mmistakes/minimal-mistakes/issues/417)
|
||||||
|
|
||||||
|
### Enhancements
|
||||||
|
|
||||||
|
- Fallback to `site.github.url` for use in `{{ base_path }}` when `site.url` is `nil`.
|
||||||
|
- Replace Sass and Autoprefixer `npm` build scripts with [Jekyll's built-in asset support](https://jekyllrb.com/docs/assets/). [#333](https://github.com/mmistakes/minimal-mistakes/issues/333)
|
||||||
|
|
||||||
|
### Maintenance
|
||||||
|
|
||||||
|
- Document `site.repository` and its role with [`github-metadata`](https://github.com/jekyll/github-metadata) gem.
|
||||||
|
- Add sample [archive page with content](https://mmistakes.github.io/minimal-mistakes/archive-layout-with-content/) for testing styles on demo site.
|
||||||
|
|
||||||
|
## [3.3.6](https://github.com/mmistakes/minimal-mistakes/releases/tag/3.3.6)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
- Fix blank `site.teaser` bug. [#412](https://github.com/mmistakes/minimal-mistakes/issues/412)
|
||||||
|
|
||||||
|
## [3.3.5](https://github.com/mmistakes/minimal-mistakes/releases/tag/3.3.5)
|
||||||
|
|
||||||
|
### Enhancements
|
||||||
|
|
||||||
|
- Add English default text `site.locale` strings. [#407](https://github.com/mmistakes/minimal-mistakes/issues/407)
|
||||||
|
- Add Portuguese localized UI text. [#411](https://github.com/mmistakes/minimal-mistakes/pull/411)
|
||||||
|
- Add Italian localized UI text. [#409](https://github.com/mmistakes/minimal-mistakes/pull/409)
|
||||||
|
|
||||||
|
### Maintenance
|
||||||
|
|
||||||
|
- Remove unused Google AdSense variables in `_config.yml`. [#404](https://github.com/mmistakes/minimal-mistakes/issues/404)
|
||||||
|
- Update `Gemfile` instructions for using `github-pages` vs. native `jekyll` gems.
|
||||||
|
- Disable `gems:` in `_config.yml` and enable plugins with Bundler instead.
|
||||||
|
- Add `repository` to `_config.yml` to suppress GitHub Pages error `Liquid Exception: No repo name found.`
|
||||||
|
|
||||||
|
## [3.3.4](https://github.com/mmistakes/minimal-mistakes/releases/tag/3.3.4)
|
||||||
|
|
||||||
|
### Enhancements
|
||||||
|
|
||||||
|
- Add support for configurable feed URL to use a service like FeedBurner instead of linking directly to `feed.xml` in `<head>` and the site footer. [#378](https://github.com/mmistakes/minimal-mistakes/issues/378), [#379](https://github.com/mmistakes/minimal-mistakes/pull/379), [#406](https://github.com/mmistakes/minimal-mistakes/pull/406)
|
||||||
|
- Add Turkish localized UI text. [#403](https://github.com/mmistakes/minimal-mistakes/pull/403)
|
||||||
|
|
||||||
|
### Maintenance
|
||||||
|
|
||||||
|
- Update gems: `activesupport` (4.2.7), `ffi` (1.9.14), `github-pages` (88), `jekyll-redirect-from` (0.11.0), `jekyll-watch` (1.5.0).
|
||||||
|
|
||||||
|
## [3.3.3](https://github.com/mmistakes/minimal-mistakes/releases/tag/3.3.3)
|
||||||
|
|
||||||
|
### Enhancements
|
||||||
|
|
||||||
|
- Make footer stick to the bottom of the page.
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
- Fix `gallery` size bug [#402](https://github.com/mmistakes/minimal-mistakes/issues/402)
|
||||||
|
|
||||||
|
### Maintenance
|
||||||
|
|
||||||
|
- Set default `lang` to `en`.
|
||||||
|
|
||||||
|
## [3.3.2](https://github.com/mmistakes/minimal-mistakes/releases/tag/3.3.2)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
- Fix JavaScript that triggers "sticky" sidebar to avoid layout issues on screen sizes < `1024px`. [#396](https://github.com/mmistakes/minimal-mistakes/issues/396)
|
||||||
|
|
||||||
|
## [3.3.1](https://github.com/mmistakes/minimal-mistakes/releases/tag/3.3.1)
|
||||||
|
|
||||||
|
### Enhancements
|
||||||
|
|
||||||
|
- Enable image popup on < 500px wide screens. [#385](https://github.com/mmistakes/minimal-mistakes/issues/385)
|
||||||
|
- Indicate the relationship between component URLs in a paginated series by applying `rel="prev"` and `rel="next"` to pages that use `site.paginator`. [#253](https://github.com/mmistakes/minimal-mistakes/issues/253)
|
||||||
|
- Improve link posts in archive listings. [#276](https://github.com/mmistakes/minimal-mistakes/issues/276)
|
||||||
|
|
||||||
|
### Maintenance
|
||||||
|
|
||||||
|
- Update gems: `github-pages` (86), `ffi` 1.9.13, `jekyll-mentions` 1.1.3, and `rouge` 1.11.1
|
||||||
|
- Fix note about custom sidebar content appearing below author profile. [#388](https://github.com/mmistakes/minimal-mistakes/issues/388)
|
||||||
|
|
||||||
|
## [3.2.13](https://github.com/mmistakes/minimal-mistakes/releases/tag/3.2.13)
|
||||||
|
|
||||||
|
### Enhancements
|
||||||
|
|
||||||
|
- Add English default UI text for Canada, Great Britain, and Australia. [#377](https://github.com/mmistakes/minimal-mistakes/issues/377)
|
||||||
|
- Switch default locale from `en-US` to `en`.
|
||||||
|
|
||||||
|
## [3.2.12](https://github.com/mmistakes/minimal-mistakes/releases/tag/3.2.12)
|
||||||
|
|
||||||
|
### Enhancements
|
||||||
|
|
||||||
|
- Remove window width "magic number" from sticky sidebar check in `main.js` for improved flexibility. [#375](https://github.com/mmistakes/minimal-mistakes/pull/375)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
- Fix author override conditional where a missing `authors.yml` would show broken sidebar content. Defaults to `site.author`. [#376](https://github.com/mmistakes/minimal-mistakes/pull/376)
|
||||||
|
|
||||||
|
## [3.2.11](https://github.com/mmistakes/minimal-mistakes/releases/tag/3.2.11)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
- Fix disappearing author sidebar links [#372](https://github.com/mmistakes/minimal-mistakes/issues/372)
|
||||||
|
|
||||||
|
### Maintenance
|
||||||
|
|
||||||
|
- Update gems: `github-pages` (84), `jekyll-github-metadata` 2.0.2, and `kramdown` 1.11.1
|
||||||
|
- Update vendor JavaScript: jQuery 1.12.4, Stickyfill.js 1.1.4
|
||||||
|
- Update Font Awesome 4.6.3
|
||||||
|
|
||||||
|
## [3.2.10](https://github.com/mmistakes/minimal-mistakes/releases/tag/3.2.10)
|
||||||
|
|
||||||
|
### Maintenance
|
||||||
|
|
||||||
|
- Add `CONTRIBUTING.md`
|
||||||
|
|
||||||
|
## [3.2.9](https://github.com/mmistakes/minimal-mistakes/releases/tag/3.2.9)
|
||||||
|
|
||||||
|
### Enhancements
|
||||||
|
|
||||||
|
- Add support for [header overlay images](https://mmistakes.github.io/minimal-mistakes/docs/layouts/#header-overlay) for Open Graph images. [#358](https://github.com/mmistakes/minimal-mistakes/pull/358)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
- Fix `Person` typo Schema.org type [#358](https://github.com/mmistakes/minimal-mistakes/pull/358)
|
||||||
|
|
||||||
|
### Maintenance
|
||||||
|
|
||||||
|
- Update `github-pages` gem and dependencies.
|
||||||
|
- Remove `minutes_read` to avoid awkward reading time wording [#356](https://github.com/mmistakes/minimal-mistakes/issues/356)
|
||||||
|
|
||||||
|
## [3.2.8](https://github.com/mmistakes/minimal-mistakes/releases/tag/3.2.8)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
- Remove `cursor: pointer` that appears on white-space surrounding author side list items and links. [#354](https://github.com/mmistakes/minimal-mistakes/pull/354)
|
||||||
|
|
||||||
|
### Maintenance
|
||||||
|
|
||||||
|
- Add contributing information to `README.md`. [#357](https://github.com/mmistakes/minimal-mistakes/issues/357)
|
||||||
|
|
||||||
|
## [3.2.7](https://github.com/mmistakes/minimal-mistakes/releases/tag/3.2.7)
|
||||||
|
|
||||||
|
### Enhancements
|
||||||
|
|
||||||
|
- Add French localized UI text. [#346](https://github.com/mmistakes/minimal-mistakes/pull/346)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
- Fix branch logic for Yandex and Alexa in `seo.html`. [#348](https://github.com/mmistakes/minimal-mistakes/pull/348)
|
||||||
|
|
||||||
|
## [3.2.6](https://github.com/mmistakes/minimal-mistakes/releases/tag/3.2.6)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
- Fix error `Liquid Exception: divided by 0 in _includes/archive-single.html, included in _layouts/single.html` caused by null `words_per_minute` in `_config.yml`. [#345](https://github.com/mmistakes/minimal-mistakes/pull/345)
|
||||||
|
|
||||||
|
## [3.2.5](https://github.com/mmistakes/minimal-mistakes/releases/tag/3.2.5)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
- Fix link color in hero overlay to be white.
|
||||||
|
- Remove underlines from archive item titles.
|
||||||
|
|
||||||
|
## [3.2.4](https://github.com/mmistakes/minimal-mistakes/releases/tag/3.2.4)
|
||||||
|
|
||||||
|
### Enhancements
|
||||||
|
|
||||||
|
- Improve text alignment of masthead, hero overlay, page footer to be flush left and remove awkward white-space gaps. [#342](https://github.com/mmistakes/minimal-mistakes/issues/342)
|
||||||
|
- Add Spanish localized UI text. [#338](https://github.com/mmistakes/minimal-mistakes/pull/338)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
- Fix alignment of icons in author sidebar [#341](https://github.com/mmistakes/minimal-mistakes/issues/341)
|
||||||
|
|
||||||
|
### Maintenance
|
||||||
|
|
||||||
|
- Add background color to page footer to set it apart from main content. [#342](https://github.com/mmistakes/minimal-mistakes/issues/342)
|
||||||
|
- Add terms and privacy policy to theme's demo site. [#343](https://github.com/mmistakes/minimal-mistakes/issues/343)
|
||||||
|
- Update screenshots found in theme documentation.
|
||||||
|
|
||||||
|
## [3.2.3](https://github.com/mmistakes/minimal-mistakes/releases/tag/3.2.3)
|
||||||
|
|
||||||
|
### Enhancements
|
||||||
|
|
||||||
|
- Add [Discourse](https://www.discourse.org/) as a commenting provider. [#335](https://github.com/mmistakes/minimal-mistakes/pull/335)
|
||||||
|
|
||||||
|
## [3.2.2](https://github.com/mmistakes/minimal-mistakes/releases/tag/3.2.2)
|
||||||
|
|
||||||
|
### Enhancements
|
||||||
|
|
||||||
|
- Add support for image captions in Magnific Popup overlays via the [`gallery`](https://mmistakes.github.io/minimal-mistakes/docs/helpers/#gallery) helper. [#334](https://github.com/mmistakes/minimal-mistakes/issues/334)
|
||||||
|
|
||||||
|
## [3.2.1](https://github.com/mmistakes/minimal-mistakes/releases/tag/3.2.1)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
- Remove need for "double tapping" masthead menu links on iOS devices. [#315](https://github.com/mmistakes/minimal-mistakes/issues/315)
|
||||||
|
|
||||||
|
### Maintenance
|
||||||
|
|
||||||
|
- Add `ISSUE_TEMPLATE.md` for improve issue submission process.
|
||||||
|
|
||||||
|
## [3.2.0](https://github.com/mmistakes/minimal-mistakes/releases/tag/3.2.0)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
- Fix missing category/tag links in post footer due to possible conflict with `site.tags` and `site.categories`. [#329](https://github.com/mmistakes/minimal-mistakes/issues/329#issuecomment-222375568)
|
||||||
|
|
||||||
|
## [3.1.8](https://github.com/mmistakes/minimal-mistakes/releases/tag/3.1.8)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
- Fix `Liquid Exception: undefined method 'gsub' for nil:NilClass in _layouts/single.html` error when `page.title` is null. `<h1>` element is now conditional if `title: ` is not set for a `page` or collection item. [#312](https://github.com/mmistakes/minimal-mistakes/issues/312)
|
||||||
|
|
||||||
|
### Maintenance
|
||||||
|
|
||||||
|
- Remove duplicate `fa-twitter` and `fa-twitter-square` classes from `_utilities.scss`. [#302](https://github.com/mmistakes/minimal-mistakes/issues/302)
|
||||||
|
|
||||||
|
- Document installing additional Jekyll gem dependencies when using `gem "jekyll"` instead of `gem "github-pages"` to avoid any errors on run. [#305](https://github.com/mmistakes/minimal-mistakes/issues/305)
|
||||||
|
|
||||||
|
## [3.1.7](https://github.com/mmistakes/minimal-mistakes/releases/tag/3.1.7)
|
||||||
|
|
||||||
|
### Enhancements
|
||||||
|
|
||||||
|
- Add translation key for "Recent Posts" used in home page `index.html`. [#316](https://github.com/mmistakes/minimal-mistakes/pull/316)
|
||||||
|
|
||||||
|
### Maintenance
|
||||||
|
|
||||||
|
- Small fix to avoid underlying the whitespace between icons and related text when hovering. [#303](https://github.com/mmistakes/minimal-mistakes/pull/303)
|
||||||
|
|
||||||
|
## [3.1.6](https://github.com/mmistakes/minimal-mistakes/releases/tag/3.1.6)
|
||||||
|
|
||||||
|
### Maintenance
|
||||||
|
|
||||||
|
- Update gem dependencies. Run `bundle` to update `Gemfile.lock`.
|
||||||
|
|
||||||
|
## [3.1.5](https://github.com/mmistakes/minimal-mistakes/releases/tag/3.1.5)
|
||||||
|
|
||||||
|
### Maintenance
|
||||||
|
|
||||||
|
- Fix `www` and `https` links in author profile include [#293](https://github.com/mmistakes/minimal-mistakes/pull/293)
|
||||||
|
|
||||||
|
## [3.1.4](https://github.com/mmistakes/minimal-mistakes/releases/tag/3.1.4)
|
||||||
|
|
||||||
|
### Enhancements
|
||||||
|
|
||||||
|
- Add overlay_filter param to hero headers [#298](https://github.com/mmistakes/minimal-mistakes/pull/298)
|
||||||
|
|
||||||
|
## [3.1.3](https://github.com/mmistakes/minimal-mistakes/releases/tag/3.1.3)
|
||||||
|
|
||||||
|
### Enhancements
|
||||||
|
|
||||||
|
- Improve `site.locale` documentation [#284](https://github.com/mmistakes/minimal-mistakes/issues/284)
|
||||||
|
- Remove ProTip note about protocol-less `site.url` as it is an anti-pattern [#288](https://github.com/mmistakes/minimal-mistakes/issues/288)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
- Fix `og_image` URL in seo.html [#277](https://github.com/mmistakes/minimal-mistakes/issues/277)
|
||||||
|
- Fix `author_profile` toggle when assigned in a `_layout` [#285](https://github.com/mmistakes/minimal-mistakes/issues/285)
|
||||||
|
- Fix typo in `build:all` npm script [#283](https://github.com/mmistakes/minimal-mistakes/pull/283)
|
||||||
|
- Fix URL typo documentation [#287](https://github.com/mmistakes/minimal-mistakes/issues/287)
|
||||||
|
- SEO author bug. If `twitter.username` is set and `author.twitter` is `nil` bad things happen. [#289](https://github.com/mmistakes/minimal-mistakes/issues/289)
|
||||||
|
|
||||||
|
## [3.1.2](https://github.com/mmistakes/minimal-mistakes/releases/tag/3.1.2)
|
||||||
|
|
||||||
|
### Enhancements
|
||||||
|
|
||||||
|
- Explain how to use `nav_list` helper in [documentation](https://mmistakes.github.io/minimal-mistakes/docs/helpers/#navigation-list).
|
||||||
|
- Reduce left/right padding on smaller screens to increase width of main content column.
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
- Fix alignment issues with related posts [#273](https://github.com/mmistakes/minimal-mistakes/issues/273) and "Follow" button in author profile [#274](https://github.com/mmistakes/minimal-mistakes/issues/274).
|
||||||
|
|
||||||
|
## [3.1.1](https://github.com/mmistakes/minimal-mistakes/releases/tag/3.1.1)
|
||||||
|
|
||||||
|
### Bug Fix
|
||||||
|
|
||||||
|
- Fixed reading time bug when `words_per_minute` wasn't set in `_config.yml` [#271](https://github.com/mmistakes/minimal-mistakes/issues/271)
|
||||||
|
|
||||||
|
## [3.1.0](https://github.com/mmistakes/minimal-mistakes/releases/tag/3.1.0)
|
||||||
|
|
||||||
|
### Enhancements
|
||||||
|
|
||||||
|
- Updated [Font Awesome](https://fortawesome.github.io/Font-Awesome/whats-new/) to version 4.6.1
|
||||||
|
- Added optional GitHub and Bitbucket links to footer if set on `site.author` in `_config.yml`.
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
- Fixed Bitbucket URL typo in author sidebar.
|
||||||
|
|
||||||
|
## [3.0.3](https://github.com/mmistakes/minimal-mistakes/releases/tag/3.0.3)
|
||||||
|
|
||||||
|
### Enhancements
|
||||||
|
|
||||||
|
- Rebuilt the entire theme: layouts, includes, stylesheets, scripts, you name it.
|
||||||
|
- Refreshed the look and feel while staying true to the original design of the theme (author sidebar/main content).
|
||||||
|
- Replaced grid system with [Susy](http://susy.oddbird.net/).
|
||||||
|
- Replaced Grunt tasks with `npm` scripts.
|
||||||
|
- Removed Google Fonts and replaced with system fonts to improve performance (they can be [added back](https://mmistakes.github.io/minimal-mistakes/docs/stylesheets/) if desired)
|
||||||
|
- Greatly improved [theme documentation](https://mmistakes.github.io/minimal-mistakes/docs/quick-start-guide/).
|
||||||
|
- Increased the amount of sample posts, sample pages, and sample collections to throughly test the theme and edge-cases.
|
||||||
|
- Moved all sample content and assets out of `master` to keep it as clean as possible for forking.
|
||||||
|
- Added new layouts for `splash` pages, archives for [`jekyll-archives`](https://github.com/jekyll/jekyll-archives) if enabled, and [`compress.html`](https://github.com/penibelst/jekyll-compress-html) to improve performance.
|
||||||
|
- Added taxonomy links to posts (tags and categories).
|
||||||
|
- Added optional "reading time" meta data.
|
||||||
|
- Improved Liquid used for Twitter Cards and Open Graph data in `<head>`.
|
||||||
|
- Improved `gallery` include helper and added `feature_row` for use with splash page layout.
|
||||||
|
- Added Keybase.io, author web URI, and Bitbucket optional links to sidebar.
|
||||||
|
- Add `feed.xml` link to footer.
|
||||||
|
- Added a [UI text data file](https://mmistakes.github.io/minimal-mistakes/docs/ui-text/) to easily change all text found in the theme.
|
||||||
|
- Added LinkedIn to optional social share buttons.
|
||||||
|
- Added Facebook, Google+, and custom commenting options in addition to Disqus.
|
||||||
|
- Added optional breadcrumb links.
|
||||||
|
|
||||||
|
## [2.2.1](https://github.com/mmistakes/minimal-mistakes/releases/tag/2.2.1)
|
||||||
|
|
||||||
|
## [2.2.0](https://github.com/mmistakes/minimal-mistakes/releases/tag/2.2.0)
|
||||||
|
|
||||||
|
### Enhancements
|
||||||
|
|
||||||
|
- Add support for Jekyll 3.0
|
||||||
|
- Minor updates to syntax highlighting CSS and theme documentation
|
||||||
|
|
||||||
|
## [2.1.3](https://github.com/mmistakes/minimal-mistakes/releases/tag/2.1.3)
|
||||||
|
|
||||||
|
### Enhancements
|
||||||
|
|
||||||
|
- Cleaner print styles that remove the top navigation, social sharing buttons, and other elements not needed when printed.
|
||||||
|
|
||||||
|
## [2.1.2](https://github.com/mmistakes/minimal-mistakes/releases/tag/2.1.2)
|
||||||
|
|
||||||
|
### Enhancements
|
||||||
|
|
||||||
|
- Add optional CodePen icon/url to author side bar [#156](https://github.com/mmistakes/minimal-mistakes/pull/156)
|
||||||
|
- Documented Stackoverflow username explanation in `_config.yml` [#157](https://github.com/mmistakes/minimal-mistakes/pull/157)
|
||||||
|
- Simplified Liquid in `post-index.html` to better handle year listings [#166](https://github.com/mmistakes/minimal-mistakes/pull/166)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
- Cleanup Facebook related Open Graph meta tags [#149](https://github.com/mmistakes/minimal-mistakes/issues/149)
|
||||||
|
- Corrected minor typos [#158](https://github.com/mmistakes/minimal-mistakes/pull/158) [#175](https://github.com/mmistakes/minimal-mistakes/issues/175)
|
||||||
|
|
||||||
|
## [2.1.1](https://github.com/mmistakes/minimal-mistakes/releases/tag/2.1.1)
|
||||||
|
|
||||||
|
### Enhancements
|
||||||
|
|
||||||
|
- Add optional XING profile link to author sidebar
|
||||||
|
- Include open graph meta tags for feature image (if assigned) [#149](https://github.com/mmistakes/minimal-mistakes/issues/149)
|
||||||
|
- Create an include for feed footer
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
- Remove http protocol from Google search form on sample 404 page
|
||||||
|
- Only show related posts if there are one or more available
|
||||||
|
- Fix alignment of email address link in author sidebar
|
||||||
|
|
||||||
|
## [2.1.0](https://github.com/mmistakes/minimal-mistakes/releases/tag/2.1.0)
|
||||||
|
|
||||||
|
### Enhancements
|
||||||
|
|
||||||
|
- Add optional social sharing buttons ([#42](https://github.com/mmistakes/minimal-mistakes/issues/42))
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
- Add Soundcloud, YouTube ([#95](https://github.com/mmistakes/minimal-mistakes/pull/95)), Flickr ([#119](https://github.com/mmistakes/minimal-mistakes/pull/119)), and Weibo ([#116](https://github.com/mmistakes/minimal-mistakes/pull/116)) icons for use in author sidebar.
|
||||||
|
- Fix typos in posts and documentation and remove references to Less
|
||||||
|
- Include note about Octopress gem being optional
|
||||||
|
- Post author override support extended to the Atom feed ([#71](https://github.com/mmistakes/minimal-mistakes/pull/71))
|
||||||
|
- Only include email address in feed if specified in `_config.yml` or author `_data`
|
||||||
|
- Wrap all page content in `#main` to harmonize article and post index styles ([#86](https://github.com/mmistakes/minimal-mistakes/issues/86))
|
||||||
|
- Include new sample feature images for posts and pages
|
||||||
|
- Table of contents improvements: fix collapse toggle, indent nested elements, show on small screens, and create an `_include` for reusing in posts and pages.
|
||||||
|
- Include note about running Jekyll with `bundle exec` when using Bundler
|
||||||
|
- Fix home page path in top navigation
|
||||||
|
- Remove Google Authorship ([#120](https://github.com/mmistakes/minimal-mistakes/issues/120))
|
||||||
|
- Remove duplicate author content that displayed in `div.article-author-bottom`
|
||||||
|
- Removed unused `_sass/print.scss` styles
|
||||||
|
- Improve comments in `.scss` files
|
||||||
|
|
||||||
|
## [2.0.0](https://github.com/mmistakes/minimal-mistakes/releases/tag/v2.0)
|
||||||
|
|
||||||
|
## [1.3.3](https://github.com/mmistakes/minimal-mistakes/releases/tag/1.3.3)
|
||||||
|
|
||||||
|
### Enhancements
|
||||||
|
|
||||||
|
- Added new icons and profile links for Stackoverflow, Dribbble, Pinterest, Foursquare, and Steam to the author bio sidebar.
|
||||||
|
- Cleaned up the Kramdown auto table of contents styling to be more readable
|
||||||
|
- Removed page width specific .less stylesheets and created mixins for easier updating
|
||||||
|
- Removed Modernizr since it wasn't being used
|
||||||
|
- Added pages to sitemap.xml
|
||||||
|
- Added category: to rake new_post task
|
||||||
|
- Minor typographic changes
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
- Corrected various broken links in README and Theme Setup.
|
||||||
|
|
||||||
|
## [1.3.1](https://github.com/mmistakes/minimal-mistakes/releases/tag/1.3.1)
|
||||||
|
|
||||||
|
### Enhancements
|
||||||
|
|
||||||
|
- Cleaned up table of contents styling
|
||||||
|
- Reworked top navigation to be a better experience on small screens. Nav items now display vertically when the menu button is tapped, revealing links with larger touch targets.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
## [1.2.0](https://github.com/mmistakes/minimal-mistakes/releases/tag/1.2.0)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
- Table weren't filling the entire width of the content container. They now scale at 100%. Thanks [@dhruvbhatia](https://github.com/dhruvbhatia)
|
||||||
|
|
||||||
|
### Enhancements
|
||||||
|
|
||||||
|
- Decreased spacing between Markdown footnotes
|
||||||
|
- Removed dark background on footer
|
||||||
|
- Removed UPPERCASE styling on post titles in the index listing
|
||||||
|
|
||||||
|
## [1.1.4](https://github.com/mmistakes/minimal-mistakes/releases/tag/1.1.4)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
- Fix top navigation bug issue ([#10](https://github.com/mmistakes/minimal-mistakes/issues/10)) for real this time. Remember to clear your floats kids.
|
||||||
|
|
||||||
|
## [1.1.3](https://github.com/mmistakes/minimal-mistakes/releases/tag/1.1.3)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
- Fix top navigation links that weren't click able on small viewports (Issue [#10](https://github.com/mmistakes/minimal-mistakes/issues/10)).
|
||||||
|
- Remove line wrap from top navigation links that may span multiple lines.
|
||||||
|
|
||||||
|
## [1.1.2](https://github.com/mmistakes/minimal-mistakes/releases/tag/1.1.2)
|
||||||
|
|
||||||
|
### Enhancements
|
||||||
|
|
||||||
|
- Added Grunt build script for compiling Less/JavaScript and optimizing image assets.
|
||||||
|
- Added support for large image summary Twitter card.
|
||||||
|
- Stylesheet adjustments
|
||||||
|
|
||||||
|
## [1.1.1](https://github.com/mmistakes/minimal-mistakes/releases/tag/1.1.1)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
- Removed [Typeplate](http://typeplate.com/) styles. Was [causing issues with newer versions of Less](https://github.com/typeplate/typeplate.github.io/issues/108) and is no longer maintained.
|
||||||
|
|
||||||
|
### Enhancements
|
||||||
|
|
||||||
|
- Added [image attribution](http://mmistakes.github.io/minimal-mistakes/theme-setup/#feature-images) for post and page feature images.
|
||||||
|
- Added [404 page](http://mmistakes.github.io/minimal-mistakes/404.html).
|
||||||
|
- Cleaned up various Less variables to better align with naming conventions used in other MM Jekyll themes.
|
||||||
|
- Removed Chrome Frame references.
|
||||||
|
- Added global CSS3 transitions to text and block elements.
|
||||||
|
- Improved typography in a few places.
|
||||||
|
|
||||||
|
## [1.0.2](https://github.com/mmistakes/minimal-mistakes/releases/tag/v1.0.2)
|
||||||
|
|
||||||
|
### Enhancements
|
||||||
|
|
||||||
|
- Google Analytics, Google Authorship, webmaster verifies, and Twitter card meta are now optional.
|
||||||
|
|
||||||
|
## [1.0.1](https://github.com/mmistakes/minimal-mistakes/releases/tag/v1.0.1)
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
source "https://rubygems.org"
|
||||||
|
|
||||||
|
# Hello! This is where you manage which Jekyll version is used to run.
|
||||||
|
# When you want to use a different version, change it below, save the
|
||||||
|
# file and run `bundle install`. Run Jekyll with `bundle exec`, like so:
|
||||||
|
#
|
||||||
|
# bundle exec jekyll serve
|
||||||
|
#
|
||||||
|
# This will help ensure the proper Jekyll version is running.
|
||||||
|
# Happy Jekylling!
|
||||||
|
|
||||||
|
gem "github-pages", group: :jekyll_plugins
|
||||||
|
|
||||||
|
# If you want to use Jekyll native, uncomment the line below.
|
||||||
|
# To upgrade, run `bundle update`.
|
||||||
|
|
||||||
|
# gem "jekyll"
|
||||||
|
|
||||||
|
gem "wdm", "~> 0.1.0" if Gem.win_platform?
|
||||||
|
|
||||||
|
# If you have any plugins, put them here!
|
||||||
|
group :jekyll_plugins do
|
||||||
|
# gem "jekyll-archives"
|
||||||
|
|
||||||
|
gem 'jekyll-octicons'
|
||||||
|
|
||||||
|
end
|
||||||
+155
@@ -0,0 +1,155 @@
|
|||||||
|
GEM
|
||||||
|
remote: https://rubygems.org/
|
||||||
|
specs:
|
||||||
|
activesupport (4.2.7)
|
||||||
|
i18n (~> 0.7)
|
||||||
|
json (~> 1.7, >= 1.7.7)
|
||||||
|
minitest (~> 5.1)
|
||||||
|
thread_safe (~> 0.3, >= 0.3.4)
|
||||||
|
tzinfo (~> 1.1)
|
||||||
|
addressable (2.4.0)
|
||||||
|
coffee-script (2.4.1)
|
||||||
|
coffee-script-source
|
||||||
|
execjs
|
||||||
|
coffee-script-source (1.10.0)
|
||||||
|
colorator (1.1.0)
|
||||||
|
ethon (0.9.1)
|
||||||
|
ffi (>= 1.3.0)
|
||||||
|
execjs (2.7.0)
|
||||||
|
faraday (0.9.2)
|
||||||
|
multipart-post (>= 1.2, < 3)
|
||||||
|
ffi (1.9.14)
|
||||||
|
ffi (1.9.14-x64-mingw32)
|
||||||
|
forwardable-extended (2.6.0)
|
||||||
|
gemoji (2.1.0)
|
||||||
|
github-pages (104)
|
||||||
|
activesupport (= 4.2.7)
|
||||||
|
github-pages-health-check (= 1.2.0)
|
||||||
|
jekyll (= 3.3.0)
|
||||||
|
jekyll-avatar (= 0.4.2)
|
||||||
|
jekyll-coffeescript (= 1.0.1)
|
||||||
|
jekyll-feed (= 0.8.0)
|
||||||
|
jekyll-gist (= 1.4.0)
|
||||||
|
jekyll-github-metadata (= 2.2.0)
|
||||||
|
jekyll-mentions (= 1.2.0)
|
||||||
|
jekyll-paginate (= 1.1.0)
|
||||||
|
jekyll-redirect-from (= 0.11.0)
|
||||||
|
jekyll-sass-converter (= 1.3.0)
|
||||||
|
jekyll-seo-tag (= 2.1.0)
|
||||||
|
jekyll-sitemap (= 0.12.0)
|
||||||
|
jekyll-swiss (= 0.4.0)
|
||||||
|
jemoji (= 0.7.0)
|
||||||
|
kramdown (= 1.11.1)
|
||||||
|
liquid (= 3.0.6)
|
||||||
|
listen (= 3.0.6)
|
||||||
|
mercenary (~> 0.3)
|
||||||
|
minima (= 2.0.0)
|
||||||
|
rouge (= 1.11.1)
|
||||||
|
terminal-table (~> 1.4)
|
||||||
|
github-pages-health-check (1.2.0)
|
||||||
|
addressable (~> 2.3)
|
||||||
|
net-dns (~> 0.8)
|
||||||
|
octokit (~> 4.0)
|
||||||
|
public_suffix (~> 1.4)
|
||||||
|
typhoeus (~> 0.7)
|
||||||
|
html-pipeline (2.4.2)
|
||||||
|
activesupport (>= 2)
|
||||||
|
nokogiri (>= 1.4)
|
||||||
|
i18n (0.7.0)
|
||||||
|
jekyll (3.3.0)
|
||||||
|
addressable (~> 2.4)
|
||||||
|
colorator (~> 1.0)
|
||||||
|
jekyll-sass-converter (~> 1.0)
|
||||||
|
jekyll-watch (~> 1.1)
|
||||||
|
kramdown (~> 1.3)
|
||||||
|
liquid (~> 3.0)
|
||||||
|
mercenary (~> 0.3.3)
|
||||||
|
pathutil (~> 0.9)
|
||||||
|
rouge (~> 1.7)
|
||||||
|
safe_yaml (~> 1.0)
|
||||||
|
jekyll-avatar (0.4.2)
|
||||||
|
jekyll (~> 3.0)
|
||||||
|
jekyll-coffeescript (1.0.1)
|
||||||
|
coffee-script (~> 2.2)
|
||||||
|
jekyll-feed (0.8.0)
|
||||||
|
jekyll (~> 3.3)
|
||||||
|
jekyll-gist (1.4.0)
|
||||||
|
octokit (~> 4.2)
|
||||||
|
jekyll-github-metadata (2.2.0)
|
||||||
|
jekyll (~> 3.1)
|
||||||
|
octokit (~> 4.0, != 4.4.0)
|
||||||
|
jekyll-mentions (1.2.0)
|
||||||
|
activesupport (~> 4.0)
|
||||||
|
html-pipeline (~> 2.3)
|
||||||
|
jekyll (~> 3.0)
|
||||||
|
jekyll-octicons (3.0.1)
|
||||||
|
jekyll (~> 3.1)
|
||||||
|
octicons (~> 3.0)
|
||||||
|
jekyll-paginate (1.1.0)
|
||||||
|
jekyll-redirect-from (0.11.0)
|
||||||
|
jekyll (>= 2.0)
|
||||||
|
jekyll-sass-converter (1.3.0)
|
||||||
|
sass (~> 3.2)
|
||||||
|
jekyll-seo-tag (2.1.0)
|
||||||
|
jekyll (~> 3.3)
|
||||||
|
jekyll-sitemap (0.12.0)
|
||||||
|
jekyll (~> 3.3)
|
||||||
|
jekyll-swiss (0.4.0)
|
||||||
|
jekyll-watch (1.5.0)
|
||||||
|
listen (~> 3.0, < 3.1)
|
||||||
|
jemoji (0.7.0)
|
||||||
|
activesupport (~> 4.0)
|
||||||
|
gemoji (~> 2.0)
|
||||||
|
html-pipeline (~> 2.2)
|
||||||
|
jekyll (>= 3.0)
|
||||||
|
json (1.8.3)
|
||||||
|
kramdown (1.11.1)
|
||||||
|
liquid (3.0.6)
|
||||||
|
listen (3.0.6)
|
||||||
|
rb-fsevent (>= 0.9.3)
|
||||||
|
rb-inotify (>= 0.9.7)
|
||||||
|
mercenary (0.3.6)
|
||||||
|
mini_portile2 (2.1.0)
|
||||||
|
minima (2.0.0)
|
||||||
|
minitest (5.9.1)
|
||||||
|
multipart-post (2.0.0)
|
||||||
|
net-dns (0.8.0)
|
||||||
|
nokogiri (1.6.8.1)
|
||||||
|
mini_portile2 (~> 2.1.0)
|
||||||
|
nokogiri (1.6.8.1-x64-mingw32)
|
||||||
|
mini_portile2 (~> 2.1.0)
|
||||||
|
octicons (3.0.1)
|
||||||
|
nokogiri (>= 1.6.3.1)
|
||||||
|
octokit (4.4.1)
|
||||||
|
sawyer (~> 0.7.0, >= 0.5.3)
|
||||||
|
pathutil (0.14.0)
|
||||||
|
forwardable-extended (~> 2.6)
|
||||||
|
public_suffix (1.5.3)
|
||||||
|
rb-fsevent (0.9.8)
|
||||||
|
rb-inotify (0.9.7)
|
||||||
|
ffi (>= 0.5.0)
|
||||||
|
rouge (1.11.1)
|
||||||
|
safe_yaml (1.0.4)
|
||||||
|
sass (3.4.22)
|
||||||
|
sawyer (0.7.0)
|
||||||
|
addressable (>= 2.3.5, < 2.5)
|
||||||
|
faraday (~> 0.8, < 0.10)
|
||||||
|
terminal-table (1.7.3)
|
||||||
|
unicode-display_width (~> 1.1.1)
|
||||||
|
thread_safe (0.3.5)
|
||||||
|
typhoeus (0.8.0)
|
||||||
|
ethon (>= 0.8.0)
|
||||||
|
tzinfo (1.2.2)
|
||||||
|
thread_safe (~> 0.1)
|
||||||
|
unicode-display_width (1.1.1)
|
||||||
|
|
||||||
|
PLATFORMS
|
||||||
|
ruby
|
||||||
|
x64-mingw32
|
||||||
|
|
||||||
|
DEPENDENCIES
|
||||||
|
github-pages
|
||||||
|
jekyll-octicons
|
||||||
|
|
||||||
|
BUNDLED WITH
|
||||||
|
1.13.3
|
||||||
@@ -1,340 +1,21 @@
|
|||||||
GNU GENERAL PUBLIC LICENSE
|
The MIT License (MIT)
|
||||||
Version 2, June 1991
|
|
||||||
|
|
||||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
|
Copyright (c) 2016 Michael Rose
|
||||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
Everyone is permitted to copy and distribute verbatim copies
|
|
||||||
of this license document, but changing it is not allowed.
|
|
||||||
|
|
||||||
Preamble
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
The licenses for most software are designed to take away your
|
The above copyright notice and this permission notice shall be included in all
|
||||||
freedom to share and change it. By contrast, the GNU General Public
|
copies or substantial portions of the Software.
|
||||||
License is intended to guarantee your freedom to share and change free
|
|
||||||
software--to make sure the software is free for all its users. This
|
|
||||||
General Public License applies to most of the Free Software
|
|
||||||
Foundation's software and to any other program whose authors commit to
|
|
||||||
using it. (Some other Free Software Foundation software is covered by
|
|
||||||
the GNU Lesser General Public License instead.) You can apply it to
|
|
||||||
your programs, too.
|
|
||||||
|
|
||||||
When we speak of free software, we are referring to freedom, not
|
|
||||||
price. Our General Public Licenses are designed to make sure that you
|
|
||||||
have the freedom to distribute copies of free software (and charge for
|
|
||||||
this service if you wish), that you receive source code or can get it
|
|
||||||
if you want it, that you can change the software or use pieces of it
|
|
||||||
in new free programs; and that you know you can do these things.
|
|
||||||
|
|
||||||
To protect your rights, we need to make restrictions that forbid
|
|
||||||
anyone to deny you these rights or to ask you to surrender the rights.
|
|
||||||
These restrictions translate to certain responsibilities for you if you
|
|
||||||
distribute copies of the software, or if you modify it.
|
|
||||||
|
|
||||||
For example, if you distribute copies of such a program, whether
|
|
||||||
gratis or for a fee, you must give the recipients all the rights that
|
|
||||||
you have. You must make sure that they, too, receive or can get the
|
|
||||||
source code. And you must show them these terms so they know their
|
|
||||||
rights.
|
|
||||||
|
|
||||||
We protect your rights with two steps: (1) copyright the software, and
|
|
||||||
(2) offer you this license which gives you legal permission to copy,
|
|
||||||
distribute and/or modify the software.
|
|
||||||
|
|
||||||
Also, for each author's protection and ours, we want to make certain
|
|
||||||
that everyone understands that there is no warranty for this free
|
|
||||||
software. If the software is modified by someone else and passed on, we
|
|
||||||
want its recipients to know that what they have is not the original, so
|
|
||||||
that any problems introduced by others will not reflect on the original
|
|
||||||
authors' reputations.
|
|
||||||
|
|
||||||
Finally, any free program is threatened constantly by software
|
|
||||||
patents. We wish to avoid the danger that redistributors of a free
|
|
||||||
program will individually obtain patent licenses, in effect making the
|
|
||||||
program proprietary. To prevent this, we have made it clear that any
|
|
||||||
patent must be licensed for everyone's free use or not licensed at all.
|
|
||||||
|
|
||||||
The precise terms and conditions for copying, distribution and
|
|
||||||
modification follow.
|
|
||||||
|
|
||||||
GNU GENERAL PUBLIC LICENSE
|
|
||||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
|
||||||
|
|
||||||
0. This License applies to any program or other work which contains
|
|
||||||
a notice placed by the copyright holder saying it may be distributed
|
|
||||||
under the terms of this General Public License. The "Program", below,
|
|
||||||
refers to any such program or work, and a "work based on the Program"
|
|
||||||
means either the Program or any derivative work under copyright law:
|
|
||||||
that is to say, a work containing the Program or a portion of it,
|
|
||||||
either verbatim or with modifications and/or translated into another
|
|
||||||
language. (Hereinafter, translation is included without limitation in
|
|
||||||
the term "modification".) Each licensee is addressed as "you".
|
|
||||||
|
|
||||||
Activities other than copying, distribution and modification are not
|
|
||||||
covered by this License; they are outside its scope. The act of
|
|
||||||
running the Program is not restricted, and the output from the Program
|
|
||||||
is covered only if its contents constitute a work based on the
|
|
||||||
Program (independent of having been made by running the Program).
|
|
||||||
Whether that is true depends on what the Program does.
|
|
||||||
|
|
||||||
1. You may copy and distribute verbatim copies of the Program's
|
|
||||||
source code as you receive it, in any medium, provided that you
|
|
||||||
conspicuously and appropriately publish on each copy an appropriate
|
|
||||||
copyright notice and disclaimer of warranty; keep intact all the
|
|
||||||
notices that refer to this License and to the absence of any warranty;
|
|
||||||
and give any other recipients of the Program a copy of this License
|
|
||||||
along with the Program.
|
|
||||||
|
|
||||||
You may charge a fee for the physical act of transferring a copy, and
|
|
||||||
you may at your option offer warranty protection in exchange for a fee.
|
|
||||||
|
|
||||||
2. You may modify your copy or copies of the Program or any portion
|
|
||||||
of it, thus forming a work based on the Program, and copy and
|
|
||||||
distribute such modifications or work under the terms of Section 1
|
|
||||||
above, provided that you also meet all of these conditions:
|
|
||||||
|
|
||||||
a) You must cause the modified files to carry prominent notices
|
|
||||||
stating that you changed the files and the date of any change.
|
|
||||||
|
|
||||||
b) You must cause any work that you distribute or publish, that in
|
|
||||||
whole or in part contains or is derived from the Program or any
|
|
||||||
part thereof, to be licensed as a whole at no charge to all third
|
|
||||||
parties under the terms of this License.
|
|
||||||
|
|
||||||
c) If the modified program normally reads commands interactively
|
|
||||||
when run, you must cause it, when started running for such
|
|
||||||
interactive use in the most ordinary way, to print or display an
|
|
||||||
announcement including an appropriate copyright notice and a
|
|
||||||
notice that there is no warranty (or else, saying that you provide
|
|
||||||
a warranty) and that users may redistribute the program under
|
|
||||||
these conditions, and telling the user how to view a copy of this
|
|
||||||
License. (Exception: if the Program itself is interactive but
|
|
||||||
does not normally print such an announcement, your work based on
|
|
||||||
the Program is not required to print an announcement.)
|
|
||||||
|
|
||||||
These requirements apply to the modified work as a whole. If
|
|
||||||
identifiable sections of that work are not derived from the Program,
|
|
||||||
and can be reasonably considered independent and separate works in
|
|
||||||
themselves, then this License, and its terms, do not apply to those
|
|
||||||
sections when you distribute them as separate works. But when you
|
|
||||||
distribute the same sections as part of a whole which is a work based
|
|
||||||
on the Program, the distribution of the whole must be on the terms of
|
|
||||||
this License, whose permissions for other licensees extend to the
|
|
||||||
entire whole, and thus to each and every part regardless of who wrote it.
|
|
||||||
|
|
||||||
Thus, it is not the intent of this section to claim rights or contest
|
|
||||||
your rights to work written entirely by you; rather, the intent is to
|
|
||||||
exercise the right to control the distribution of derivative or
|
|
||||||
collective works based on the Program.
|
|
||||||
|
|
||||||
In addition, mere aggregation of another work not based on the Program
|
|
||||||
with the Program (or with a work based on the Program) on a volume of
|
|
||||||
a storage or distribution medium does not bring the other work under
|
|
||||||
the scope of this License.
|
|
||||||
|
|
||||||
3. You may copy and distribute the Program (or a work based on it,
|
|
||||||
under Section 2) in object code or executable form under the terms of
|
|
||||||
Sections 1 and 2 above provided that you also do one of the following:
|
|
||||||
|
|
||||||
a) Accompany it with the complete corresponding machine-readable
|
|
||||||
source code, which must be distributed under the terms of Sections
|
|
||||||
1 and 2 above on a medium customarily used for software interchange; or,
|
|
||||||
|
|
||||||
b) Accompany it with a written offer, valid for at least three
|
|
||||||
years, to give any third party, for a charge no more than your
|
|
||||||
cost of physically performing source distribution, a complete
|
|
||||||
machine-readable copy of the corresponding source code, to be
|
|
||||||
distributed under the terms of Sections 1 and 2 above on a medium
|
|
||||||
customarily used for software interchange; or,
|
|
||||||
|
|
||||||
c) Accompany it with the information you received as to the offer
|
|
||||||
to distribute corresponding source code. (This alternative is
|
|
||||||
allowed only for noncommercial distribution and only if you
|
|
||||||
received the program in object code or executable form with such
|
|
||||||
an offer, in accord with Subsection b above.)
|
|
||||||
|
|
||||||
The source code for a work means the preferred form of the work for
|
|
||||||
making modifications to it. For an executable work, complete source
|
|
||||||
code means all the source code for all modules it contains, plus any
|
|
||||||
associated interface definition files, plus the scripts used to
|
|
||||||
control compilation and installation of the executable. However, as a
|
|
||||||
special exception, the source code distributed need not include
|
|
||||||
anything that is normally distributed (in either source or binary
|
|
||||||
form) with the major components (compiler, kernel, and so on) of the
|
|
||||||
operating system on which the executable runs, unless that component
|
|
||||||
itself accompanies the executable.
|
|
||||||
|
|
||||||
If distribution of executable or object code is made by offering
|
|
||||||
access to copy from a designated place, then offering equivalent
|
|
||||||
access to copy the source code from the same place counts as
|
|
||||||
distribution of the source code, even though third parties are not
|
|
||||||
compelled to copy the source along with the object code.
|
|
||||||
|
|
||||||
4. You may not copy, modify, sublicense, or distribute the Program
|
|
||||||
except as expressly provided under this License. Any attempt
|
|
||||||
otherwise to copy, modify, sublicense or distribute the Program is
|
|
||||||
void, and will automatically terminate your rights under this License.
|
|
||||||
However, parties who have received copies, or rights, from you under
|
|
||||||
this License will not have their licenses terminated so long as such
|
|
||||||
parties remain in full compliance.
|
|
||||||
|
|
||||||
5. You are not required to accept this License, since you have not
|
|
||||||
signed it. However, nothing else grants you permission to modify or
|
|
||||||
distribute the Program or its derivative works. These actions are
|
|
||||||
prohibited by law if you do not accept this License. Therefore, by
|
|
||||||
modifying or distributing the Program (or any work based on the
|
|
||||||
Program), you indicate your acceptance of this License to do so, and
|
|
||||||
all its terms and conditions for copying, distributing or modifying
|
|
||||||
the Program or works based on it.
|
|
||||||
|
|
||||||
6. Each time you redistribute the Program (or any work based on the
|
|
||||||
Program), the recipient automatically receives a license from the
|
|
||||||
original licensor to copy, distribute or modify the Program subject to
|
|
||||||
these terms and conditions. You may not impose any further
|
|
||||||
restrictions on the recipients' exercise of the rights granted herein.
|
|
||||||
You are not responsible for enforcing compliance by third parties to
|
|
||||||
this License.
|
|
||||||
|
|
||||||
7. If, as a consequence of a court judgment or allegation of patent
|
|
||||||
infringement or for any other reason (not limited to patent issues),
|
|
||||||
conditions are imposed on you (whether by court order, agreement or
|
|
||||||
otherwise) that contradict the conditions of this License, they do not
|
|
||||||
excuse you from the conditions of this License. If you cannot
|
|
||||||
distribute so as to satisfy simultaneously your obligations under this
|
|
||||||
License and any other pertinent obligations, then as a consequence you
|
|
||||||
may not distribute the Program at all. For example, if a patent
|
|
||||||
license would not permit royalty-free redistribution of the Program by
|
|
||||||
all those who receive copies directly or indirectly through you, then
|
|
||||||
the only way you could satisfy both it and this License would be to
|
|
||||||
refrain entirely from distribution of the Program.
|
|
||||||
|
|
||||||
If any portion of this section is held invalid or unenforceable under
|
|
||||||
any particular circumstance, the balance of the section is intended to
|
|
||||||
apply and the section as a whole is intended to apply in other
|
|
||||||
circumstances.
|
|
||||||
|
|
||||||
It is not the purpose of this section to induce you to infringe any
|
|
||||||
patents or other property right claims or to contest validity of any
|
|
||||||
such claims; this section has the sole purpose of protecting the
|
|
||||||
integrity of the free software distribution system, which is
|
|
||||||
implemented by public license practices. Many people have made
|
|
||||||
generous contributions to the wide range of software distributed
|
|
||||||
through that system in reliance on consistent application of that
|
|
||||||
system; it is up to the author/donor to decide if he or she is willing
|
|
||||||
to distribute software through any other system and a licensee cannot
|
|
||||||
impose that choice.
|
|
||||||
|
|
||||||
This section is intended to make thoroughly clear what is believed to
|
|
||||||
be a consequence of the rest of this License.
|
|
||||||
|
|
||||||
8. If the distribution and/or use of the Program is restricted in
|
|
||||||
certain countries either by patents or by copyrighted interfaces, the
|
|
||||||
original copyright holder who places the Program under this License
|
|
||||||
may add an explicit geographical distribution limitation excluding
|
|
||||||
those countries, so that distribution is permitted only in or among
|
|
||||||
countries not thus excluded. In such case, this License incorporates
|
|
||||||
the limitation as if written in the body of this License.
|
|
||||||
|
|
||||||
9. The Free Software Foundation may publish revised and/or new versions
|
|
||||||
of the General Public License from time to time. Such new versions will
|
|
||||||
be similar in spirit to the present version, but may differ in detail to
|
|
||||||
address new problems or concerns.
|
|
||||||
|
|
||||||
Each version is given a distinguishing version number. If the Program
|
|
||||||
specifies a version number of this License which applies to it and "any
|
|
||||||
later version", you have the option of following the terms and conditions
|
|
||||||
either of that version or of any later version published by the Free
|
|
||||||
Software Foundation. If the Program does not specify a version number of
|
|
||||||
this License, you may choose any version ever published by the Free Software
|
|
||||||
Foundation.
|
|
||||||
|
|
||||||
10. If you wish to incorporate parts of the Program into other free
|
|
||||||
programs whose distribution conditions are different, write to the author
|
|
||||||
to ask for permission. For software which is copyrighted by the Free
|
|
||||||
Software Foundation, write to the Free Software Foundation; we sometimes
|
|
||||||
make exceptions for this. Our decision will be guided by the two goals
|
|
||||||
of preserving the free status of all derivatives of our free software and
|
|
||||||
of promoting the sharing and reuse of software generally.
|
|
||||||
|
|
||||||
NO WARRANTY
|
|
||||||
|
|
||||||
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
|
||||||
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
|
||||||
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
|
||||||
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
|
|
||||||
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
|
||||||
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
|
|
||||||
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
|
|
||||||
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
|
||||||
REPAIR OR CORRECTION.
|
|
||||||
|
|
||||||
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
|
||||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
|
||||||
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
|
||||||
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
|
|
||||||
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
|
|
||||||
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
|
|
||||||
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
|
||||||
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
|
||||||
POSSIBILITY OF SUCH DAMAGES.
|
|
||||||
|
|
||||||
END OF TERMS AND CONDITIONS
|
|
||||||
|
|
||||||
How to Apply These Terms to Your New Programs
|
|
||||||
|
|
||||||
If you develop a new program, and you want it to be of the greatest
|
|
||||||
possible use to the public, the best way to achieve this is to make it
|
|
||||||
free software which everyone can redistribute and change under these terms.
|
|
||||||
|
|
||||||
To do so, attach the following notices to the program. It is safest
|
|
||||||
to attach them to the start of each source file to most effectively
|
|
||||||
convey the exclusion of warranty; and each file should have at least
|
|
||||||
the "copyright" line and a pointer to where the full notice is found.
|
|
||||||
|
|
||||||
<one line to give the program's name and a brief idea of what it does.>
|
|
||||||
Copyright (C) <year> <name of author>
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
Also add information on how to contact you by electronic and paper mail.
|
|
||||||
|
|
||||||
If the program is interactive, make it output a short notice like this
|
|
||||||
when it starts in an interactive mode:
|
|
||||||
|
|
||||||
Gnomovision version 69, Copyright (C) year name of author
|
|
||||||
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
|
||||||
This is free software, and you are welcome to redistribute it
|
|
||||||
under certain conditions; type `show c' for details.
|
|
||||||
|
|
||||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
|
||||||
parts of the General Public License. Of course, the commands you use may
|
|
||||||
be called something other than `show w' and `show c'; they could even be
|
|
||||||
mouse-clicks or menu items--whatever suits your program.
|
|
||||||
|
|
||||||
You should also get your employer (if you work as a programmer) or your
|
|
||||||
school, if any, to sign a "copyright disclaimer" for the program, if
|
|
||||||
necessary. Here is a sample; alter the names:
|
|
||||||
|
|
||||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
|
|
||||||
`Gnomovision' (which makes passes at compilers) written by James Hacker.
|
|
||||||
|
|
||||||
<signature of Ty Coon>, 1 April 1989
|
|
||||||
Ty Coon, President of Vice
|
|
||||||
|
|
||||||
This General Public License does not permit incorporating your program into
|
|
||||||
proprietary programs. If your program is a subroutine library, you may
|
|
||||||
consider it more useful to permit linking proprietary applications with the
|
|
||||||
library. If this is what you want to do, use the GNU Lesser General
|
|
||||||
Public License instead of this License.
|
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
-21
@@ -1,21 +0,0 @@
|
|||||||
# additional include paths necessary to compile the C++ library
|
|
||||||
SUBDIRS = lib benchmarks tests extras
|
|
||||||
|
|
||||||
include $(top_srcdir)/doxygen.inc
|
|
||||||
|
|
||||||
bin_SCRIPTS=grid-config
|
|
||||||
|
|
||||||
BUILT_SOURCES = version.h
|
|
||||||
|
|
||||||
version.h:
|
|
||||||
echo "`git log -n 1 --format=format:"#define GITHASH \\"%H:%d\\"%n" HEAD`" > $(srcdir)/lib/version.h
|
|
||||||
|
|
||||||
.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
|
|
||||||
|
|
||||||
ACLOCAL_AMFLAGS = -I m4
|
|
||||||
@@ -1,407 +1,26 @@
|
|||||||
# 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 github pages.
|
||||||
|
|
||||||
**Data parallel C++ mathematical object library.**
|
|
||||||
|
|
||||||
License: GPL v2.
|
## License
|
||||||
|
|
||||||
Last update June 2017.
|
The MIT License (MIT)
|
||||||
|
|
||||||
_Please do not send pull requests to the `master` branch which is reserved for releases._
|
Copyright (c) 2016 Michael Rose
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
### Description
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
This library provides data parallel C++ container classes with internal memory layout
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
that is transformed to map efficiently to SIMD architectures. CSHIFT facilities
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
are provided, similar to HPF and cmfortran, and user control is given over the mapping of
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
array indices to both MPI tasks and SIMD processing elements.
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
* Identically shaped arrays then be processed with perfect data parallelisation.
|
SOFTWARE.
|
||||||
* Such identically shaped arrays are called conformable arrays.
|
|
||||||
|
|
||||||
The transformation is based on the observation that Cartesian array processing involves
|
|
||||||
identical processing to be performed on different regions of the Cartesian array.
|
|
||||||
|
|
||||||
The library will both geometrically decompose into MPI tasks and across SIMD lanes.
|
|
||||||
Local vector loops are parallelised with OpenMP pragmas.
|
|
||||||
|
|
||||||
Data parallel array operations can then be specified with a SINGLE data parallel paradigm, but
|
|
||||||
optimally use MPI, OpenMP and SIMD parallelism under the hood. This is a significant simplification
|
|
||||||
for most programmers.
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
These are presented as `vRealF`, `vRealD`, `vComplexF`, and `vComplexD` internal vector data types.
|
|
||||||
The corresponding scalar types are named `RealF`, `RealD`, `ComplexF` and `ComplexD`.
|
|
||||||
|
|
||||||
MPI, OpenMP, and SIMD parallelism are present in the library.
|
|
||||||
Please see [this paper](https://arxiv.org/abs/1512.03487) for more detail.
|
|
||||||
|
|
||||||
|
|
||||||
### Compilers
|
|
||||||
|
|
||||||
Intel ICPC v16.0.3 and later
|
|
||||||
|
|
||||||
Clang v3.5 and later (need 3.8 and later for OpenMP)
|
|
||||||
|
|
||||||
GCC v4.9.x (recommended)
|
|
||||||
|
|
||||||
GCC v6.3 and later
|
|
||||||
|
|
||||||
### Important:
|
|
||||||
|
|
||||||
Some versions of GCC appear to have a bug under high optimisation (-O2, -O3).
|
|
||||||
|
|
||||||
The safety of these compiler versions cannot be guaranteed at this time. Follow Issue 100 for details and updates.
|
|
||||||
|
|
||||||
GCC v5.x
|
|
||||||
|
|
||||||
GCC v6.1, v6.2
|
|
||||||
|
|
||||||
### Bug report
|
|
||||||
|
|
||||||
_To help us tracking and solving more efficiently issues with Grid, please report problems using the issue system of GitHub rather than sending emails to Grid developers._
|
|
||||||
|
|
||||||
When you file an issue, please go though the following checklist:
|
|
||||||
|
|
||||||
1. Check that the code is pointing to the `HEAD` of `develop` or any commit in `master` which is tagged with a version number.
|
|
||||||
2. Give a description of the target platform (CPU, network, compiler). Please give the full CPU part description, using for example `cat /proc/cpuinfo | grep 'model name' | uniq` (Linux) or `sysctl machdep.cpu.brand_string` (macOS) and the full output the `--version` option of your compiler.
|
|
||||||
3. Give the exact `configure` command used.
|
|
||||||
4. Attach `config.log`.
|
|
||||||
5. Attach `grid.config.summary`.
|
|
||||||
6. Attach the output of `make V=1`.
|
|
||||||
7. Describe the issue and any previous attempt to solve it. If relevant, show how to reproduce the issue using a minimal working example.
|
|
||||||
|
|
||||||
### Required libraries
|
|
||||||
Grid requires:
|
|
||||||
|
|
||||||
[GMP](https://gmplib.org/),
|
|
||||||
|
|
||||||
[MPFR](http://www.mpfr.org/)
|
|
||||||
|
|
||||||
Bootstrapping grid downloads and uses for internal dense matrix (non-QCD operations) the Eigen library.
|
|
||||||
|
|
||||||
Grid optionally uses:
|
|
||||||
|
|
||||||
[HDF5](https://support.hdfgroup.org/HDF5/)
|
|
||||||
|
|
||||||
[LIME](http://usqcd-software.github.io/c-lime/) for ILDG and SciDAC file format support.
|
|
||||||
|
|
||||||
[FFTW](http://www.fftw.org) either generic version or via the Intel MKL library.
|
|
||||||
|
|
||||||
LAPACK either generic version or Intel MKL library.
|
|
||||||
|
|
||||||
|
|
||||||
### Quick start
|
|
||||||
First, start by cloning the repository:
|
|
||||||
|
|
||||||
``` bash
|
|
||||||
git clone https://github.com/paboyle/Grid.git
|
|
||||||
```
|
|
||||||
|
|
||||||
Then enter the cloned directory and set up the build system:
|
|
||||||
|
|
||||||
``` bash
|
|
||||||
cd Grid
|
|
||||||
./bootstrap.sh
|
|
||||||
```
|
|
||||||
|
|
||||||
Now you can execute the `configure` script to generate makefiles (here from a build directory):
|
|
||||||
|
|
||||||
``` bash
|
|
||||||
mkdir build; cd build
|
|
||||||
../configure --enable-precision=double --enable-simd=AVX --enable-comms=mpi-auto --prefix=<path>
|
|
||||||
```
|
|
||||||
|
|
||||||
where `--enable-precision=` set the default precision,
|
|
||||||
`--enable-simd=` set the SIMD type, `--enable-
|
|
||||||
comms=`, and `<path>` should be replaced by the prefix path where you want to
|
|
||||||
install Grid. Other options are detailed in the next section, you can also use `configure
|
|
||||||
--help` to display them. Like with any other program using GNU autotool, the
|
|
||||||
`CXX`, `CXXFLAGS`, `LDFLAGS`, ... environment variables can be modified to
|
|
||||||
customise the build.
|
|
||||||
|
|
||||||
Finally, you can build, check, and install Grid:
|
|
||||||
|
|
||||||
``` bash
|
|
||||||
make; make check; make install
|
|
||||||
```
|
|
||||||
|
|
||||||
To minimise the build time, only the tests at the root of the `tests` directory are built by default. If you want to build tests in the sub-directory `<subdir>` you can execute:
|
|
||||||
|
|
||||||
``` bash
|
|
||||||
make -C tests/<subdir> tests
|
|
||||||
```
|
|
||||||
If you want to build all the tests at once just use `make tests`.
|
|
||||||
|
|
||||||
### Build configuration options
|
|
||||||
|
|
||||||
- `--prefix=<path>`: installation prefix for Grid.
|
|
||||||
- `--with-gmp=<path>`: look for GMP in the UNIX prefix `<path>`
|
|
||||||
- `--with-mpfr=<path>`: look for MPFR in the UNIX prefix `<path>`
|
|
||||||
- `--with-fftw=<path>`: look for FFTW in the UNIX prefix `<path>`
|
|
||||||
- `--enable-lapack[=<path>]`: enable LAPACK support in Lanczos eigensolver. A UNIX prefix containing the library can be specified (optional).
|
|
||||||
- `--enable-mkl[=<path>]`: use Intel MKL for FFT (and LAPACK if enabled) routines. A UNIX prefix containing the library can be specified (optional).
|
|
||||||
- `--enable-numa`: enable NUMA first touch optimisation
|
|
||||||
- `--enable-simd=<code>`: setup Grid for the SIMD target `<code>` (default: `GEN`). A list of possible SIMD targets is detailed in a section below.
|
|
||||||
- `--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=<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 `).
|
|
||||||
- `--disable-timers`: disable system dependent high-resolution timers.
|
|
||||||
- `--enable-chroma`: enable Chroma regression tests.
|
|
||||||
- `--enable-doxygen-doc`: enable the Doxygen documentation generation (build with `make doxygen-doc`)
|
|
||||||
|
|
||||||
### Possible communication interfaces
|
|
||||||
|
|
||||||
The following options can be use with the `--enable-comms=` option to target different communication interfaces:
|
|
||||||
|
|
||||||
| `<comm>` | Description |
|
|
||||||
| -------------- | ------------------------------------------------------------- |
|
|
||||||
| `none` | no communications |
|
|
||||||
| `mpi[-auto]` | MPI communications |
|
|
||||||
| `mpi3[-auto]` | MPI communications using MPI 3 shared memory |
|
|
||||||
| `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.
|
|
||||||
|
|
||||||
### Possible SIMD types
|
|
||||||
|
|
||||||
The following options can be use with the `--enable-simd=` option to target different SIMD instruction sets:
|
|
||||||
|
|
||||||
| `<code>` | Description |
|
|
||||||
| ----------- | -------------------------------------- |
|
|
||||||
| `GEN` | generic portable vector code |
|
|
||||||
| `SSE4` | SSE 4.2 (128 bit) |
|
|
||||||
| `AVX` | AVX (256 bit) |
|
|
||||||
| `AVXFMA` | AVX (256 bit) + FMA |
|
|
||||||
| `AVXFMA4` | AVX (256 bit) + FMA4 |
|
|
||||||
| `AVX2` | AVX 2 (256 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` | IBM QPX (256 bit) |
|
|
||||||
|
|
||||||
Alternatively, some CPU codenames can be directly used:
|
|
||||||
|
|
||||||
| `<code>` | Description |
|
|
||||||
| ----------- | -------------------------------------- |
|
|
||||||
| `KNL` | [Intel Xeon Phi codename Knights Landing](http://ark.intel.com/products/codename/48999/Knights-Landing) |
|
|
||||||
| `SKL` | [Intel Skylake with AVX512 extensions](https://ark.intel.com/products/codename/37572/Skylake#@server) |
|
|
||||||
| `BGQ` | Blue Gene/Q |
|
|
||||||
|
|
||||||
#### Notes:
|
|
||||||
- We currently support AVX512 for the Intel compiler and GCC (KNL and SKL target). Support for clang will appear in future versions of Grid when the AVX512 support in the compiler will be more advanced.
|
|
||||||
- For BG/Q only [bgclang](http://trac.alcf.anl.gov/projects/llvm-bgq) is supported. We do not presently plan to support more compilers for this platform.
|
|
||||||
- BG/Q performances are currently rather poor. This is being investigated for future versions.
|
|
||||||
- The vector size for the `GEN` target can be specified with the `configure` script option `--enable-gen-simd-width`.
|
|
||||||
|
|
||||||
### Build setup for Intel Knights Landing platform
|
|
||||||
|
|
||||||
The following configuration is recommended for the Intel Knights Landing platform:
|
|
||||||
|
|
||||||
``` bash
|
|
||||||
../configure --enable-precision=double\
|
|
||||||
--enable-simd=KNL \
|
|
||||||
--enable-comms=mpi-auto \
|
|
||||||
--enable-mkl \
|
|
||||||
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:
|
|
||||||
|
|
||||||
``` bash
|
|
||||||
../configure --enable-precision=double\
|
|
||||||
--enable-simd=KNL \
|
|
||||||
--enable-comms=mpi \
|
|
||||||
--enable-mkl \
|
|
||||||
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.
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,328 +0,0 @@
|
|||||||
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
|
|
||||||
be. This is a consequence of taking ONLY the first term in:
|
|
||||||
|
|
||||||
dSg/dt = dU/dt dSdU + dUdag/dt dSdUdag
|
|
||||||
|
|
||||||
in the fermion force.
|
|
||||||
|
|
||||||
Now, S_mom = - tr Pmu Pmu ; Pmu anti-herm
|
|
||||||
|
|
||||||
.
|
|
||||||
d Smom/dt = - 2.0 tr Pmu Pmu = - dSg/dt = - tr Pmu [Umu dSdUmu + UmuDag dSdUmuDag]
|
|
||||||
|
|
||||||
.
|
|
||||||
=> Pmu = Umu dSdUmu
|
|
||||||
|
|
||||||
Where the norm is half expected.
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
* Support different boundary conditions (finite temp, chem. potential ... )
|
|
||||||
|
|
||||||
- Sign of force term.
|
|
||||||
|
|
||||||
- Reversibility test.
|
|
||||||
|
|
||||||
- Rename "Ta" as too unclear
|
|
||||||
|
|
||||||
- Lanczos
|
|
||||||
|
|
||||||
- Audit oIndex usage for cb behaviour
|
|
||||||
|
|
||||||
- Prepare multigrid for HMC. - Alternate setup schemes.
|
|
||||||
|
|
||||||
- Support for ILDG --- ugly, not done
|
|
||||||
|
|
||||||
- Flavour matrices?
|
|
||||||
|
|
||||||
- FFTnD ?
|
|
||||||
|
|
||||||
- Gparity; hand opt use template specialisation elegance to enable the optimised paths ?
|
|
||||||
|
|
||||||
- Gparity force term; Gparity (R)HMC.
|
|
||||||
|
|
||||||
- Mobius implementation clean up to rmove #if 0 stale code sequences
|
|
||||||
|
|
||||||
- CG -- profile carefully, kernel fusion, whole CG performance measurements.
|
|
||||||
|
|
||||||
================================================================
|
|
||||||
* Hacks and bug fixes to clean up and Audits
|
|
||||||
================================================================
|
|
||||||
|
|
||||||
* Extract/merge/set cleanup ; too many variants; rationalise and call simpler ones
|
|
||||||
|
|
||||||
* Rewrite core tensor arithmetic support to be more systematic
|
|
||||||
= Use #define repetitive sequences to minimise code, decrease line count by thousands possible,
|
|
||||||
with more robust and maintainable implementation.
|
|
||||||
|
|
||||||
* Ensure we ET as much as possible; move unop functions into ET framework.
|
|
||||||
- tests with expression args to all functions
|
|
||||||
|
|
||||||
* FIXME audit
|
|
||||||
|
|
||||||
* const audit
|
|
||||||
|
|
||||||
Insert/Extract
|
|
||||||
* Replace vset with a call to merge.;
|
|
||||||
* care in Gmerge,Gextract over vset .
|
|
||||||
* extract / merge extra implementation removal
|
|
||||||
* Optimise the extract/merge SIMD routines; Azusa??
|
|
||||||
- I have collated into single location at least.
|
|
||||||
- Need to use _mm_*insert/extract routines.
|
|
||||||
|
|
||||||
* Thread scaling tests Xeon, XeonPhi
|
|
||||||
|
|
||||||
Not sure of status of this -- reverify. Things are working nicely now though.
|
|
||||||
|
|
||||||
* 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 > > >
|
|
||||||
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.
|
|
||||||
|
|
||||||
- Reductions that contract indices on a site should always demote the tensor structure.
|
|
||||||
norm2(), innerProduct.
|
|
||||||
|
|
||||||
- Result of Sum(), SliceSum // spatial sums
|
|
||||||
trace, traceIndex etc.. do not.
|
|
||||||
|
|
||||||
- problem arises because "trace" returns Lattice<TComplex> moving everything down to Scalar,
|
|
||||||
and then Sum and SliceSum to not remove the Scalars. This would be fixed if we
|
|
||||||
template specialize the scalar scalar scalar sum and SliceSum, on the basis of being
|
|
||||||
pure scalar.
|
|
||||||
|
|
||||||
======================================================================
|
|
||||||
======================================================================
|
|
||||||
======================================================================
|
|
||||||
======================================================================
|
|
||||||
RECENT
|
|
||||||
---------------
|
|
||||||
|
|
||||||
- Support different fermion representations? -- DONE
|
|
||||||
- contained entirely within the integrator presently
|
|
||||||
- Clean up HMC -- DONE
|
|
||||||
- LorentzScalar<GaugeField> gets Gauge link type (cleaner). -- DONE
|
|
||||||
- Simplified the integrators a bit. -- DONE
|
|
||||||
- Multi-timescale looks broken and operating on single timescale for now. -- DONE
|
|
||||||
- pass GaugeField as template param. -- DONE
|
|
||||||
- Reunitarise -- DONE
|
|
||||||
- Force Gradient -- DONE
|
|
||||||
- Prefer "RefreshInternal" or such like to "init" in naming -- DONE
|
|
||||||
- Parallel io improvements -- 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
|
|
||||||
- PseudoFermions
|
|
||||||
=> generalise to non-const EE ; likely defer (??) (NOT DONE)
|
|
||||||
Done:
|
|
||||||
- TwoFlavour
|
|
||||||
- TwoFlavourEvenOdd
|
|
||||||
- TwoFlavourRatio
|
|
||||||
- TwoFlavourRatioEvenOdd
|
|
||||||
|
|
||||||
Done:
|
|
||||||
- OneFlavourRationalEvenOdd
|
|
||||||
- OneFlavourRationalRatioEvenOdd
|
|
||||||
- OneFlavourRationalRatio
|
|
||||||
|
|
||||||
Done
|
|
||||||
=> Test DWF HMC
|
|
||||||
- Fix a threading bug that has been introduced and prevents HMC running hybrid OMP mode
|
|
||||||
|
|
||||||
Done:
|
|
||||||
- RNG filling from sparser grid, lower dim grid.
|
|
||||||
|
|
||||||
|
|
||||||
DONE
|
|
||||||
- MacroMagic -> virtual reader class.
|
|
||||||
|
|
||||||
*** Expression template engine: -- DONE
|
|
||||||
|
|
||||||
[ -- Norm2(expression) problem: introduce norm2 unary op, or Introduce conversion automatic from expression to Lattice<vobj>
|
|
||||||
* Strong test for norm2, conj and all primitive types. -- tests/Grid_simd.cc is almost there
|
|
||||||
* Implement where within expression template scheme.
|
|
||||||
* Check for missing functionality - partially audited against QDP++ layout
|
|
||||||
|
|
||||||
// Unary functions
|
|
||||||
// cos,sin, tan, acos, asin, cosh, acosh, tanh, sinh, // Scalar<vReal> only arg
|
|
||||||
// exp, log, sqrt, fabs
|
|
||||||
// transposeColor, transposeSpin,
|
|
||||||
// adjColor, adjSpin,
|
|
||||||
// copyMask.
|
|
||||||
// localMaxAbs
|
|
||||||
// Fourier transform equivalent.]
|
|
||||||
|
|
||||||
|
|
||||||
* CovariantShift support -----Use a class to store gauge field? (parallel transport?)
|
|
||||||
|
|
||||||
-- coherent framework for implementing actions and their forces.
|
|
||||||
Actions
|
|
||||||
|
|
||||||
DONE
|
|
||||||
* Fermion
|
|
||||||
- Wilson
|
|
||||||
- Clover
|
|
||||||
- DomainWall
|
|
||||||
- Mobius
|
|
||||||
- z-Mobius
|
|
||||||
|
|
||||||
|
|
||||||
Algorithms (lots of reuse/port from BFM)
|
|
||||||
* LinearOperator
|
|
||||||
* LinearSolver
|
|
||||||
* Polynomial
|
|
||||||
* Eigen
|
|
||||||
* CG
|
|
||||||
* Pcg
|
|
||||||
* Adef2
|
|
||||||
* DeflCG
|
|
||||||
* fPcg
|
|
||||||
* MCR
|
|
||||||
* HDCG
|
|
||||||
* HMC,
|
|
||||||
* Heatbath
|
|
||||||
* Integrators, leapfrog, omelyan, force gradient etc...
|
|
||||||
* etc..
|
|
||||||
|
|
||||||
Done
|
|
||||||
* Pauli, SU subgroup, etc..
|
|
||||||
|
|
||||||
* su3 exponentiation & log etc.. [Jamie's code?]
|
|
||||||
|
|
||||||
======================================================================================================
|
|
||||||
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
|
|
||||||
user pass these? Is this a QCD specific?
|
|
||||||
|
|
||||||
* Stencil -- DONE
|
|
||||||
* Test infrastructure -- DONE
|
|
||||||
* Fourspin, two spin project --- DONE
|
|
||||||
* Dirac Gamma/Dirac structures ---- DONE
|
|
||||||
* Conditional execution, where etc... -----DONE, simple test
|
|
||||||
* Integer relational support -----DONE
|
|
||||||
* Coordinate information, integers etc... -----DONE
|
|
||||||
* Integer type padding/union to vector. -----DONE
|
|
||||||
* LatticeCoordinate[mu] -----DONE
|
|
||||||
* expose traceIndex, peekIndex, transposeIndex etc at the Lattice Level -- DONE
|
|
||||||
* TraceColor, TraceSpin. ----- DONE (traceIndex<1>,traceIndex<2>, transposeIndex<1>,transposeIndex<2>)
|
|
||||||
----- Implement mapping between traceColour and traceSpin and traceIndex<1/2>.
|
|
||||||
* How to do U[mu] ... lorentz part of type structure or not. more like chroma if not. -- DONE
|
|
||||||
|
|
||||||
* Twospin/Fourspin/Gamma/Proj/Recon ----- DONE
|
|
||||||
* norm2l is a hack. figure out syntax error and make this norm2 c.f. tests/Grid_gamma.cc -- DONE
|
|
||||||
|
|
||||||
* subdirs lib, tests ?? ----- DONE
|
|
||||||
- lib/math
|
|
||||||
- lib/cartesian
|
|
||||||
- lib/cshift
|
|
||||||
- lib/stencil
|
|
||||||
- lib/communicator
|
|
||||||
- lib/algorithms
|
|
||||||
- lib/qcd
|
|
||||||
- lib/io/ -- GridLog, GridIn, GridErr, GridDebug, GridMessage
|
|
||||||
- lib/qcd/actions
|
|
||||||
- lib/qcd/measurements
|
|
||||||
|
|
||||||
* Subset support, slice sums etc... -----DONE
|
|
||||||
sliceSum(orthog)
|
|
||||||
sum
|
|
||||||
innerProduct
|
|
||||||
norm2
|
|
||||||
|
|
||||||
* Subgrid Transferral -----DONE
|
|
||||||
subBlock (coarseLattice,fineLattice)
|
|
||||||
projectBlockBasis
|
|
||||||
promoteBlockBasis
|
|
||||||
|
|
||||||
* random number generation ----- DONE
|
|
||||||
|
|
||||||
* Broadcast, reduction tests. innerProduct, localInnerProduct --- DONE
|
|
||||||
|
|
||||||
* I/O support
|
|
||||||
* NERSC Lattice loading, plaquette test ------- DONE single node
|
|
||||||
|
|
||||||
* Controling std::cout ------- DONE
|
|
||||||
|
|
||||||
* Had to hack assignment to 1.0 in the tests/Grid_gamma test -- DONE
|
|
||||||
* Reduce implemention is poor ; need threaded reductions; OMP isn't able to do it for generic objects. -- DONE
|
|
||||||
* Bug in RNG with complex numbers ; only filling real values; need helper function -- DONE
|
|
||||||
* Conformable test in Cshift routines. -- none needed ; there is only one
|
|
||||||
* Conformable testing in expression templates -- DONE (recursive)
|
|
||||||
|
|
||||||
* Bug in SeedFixedIntegers gave same output on each site. -- DONE
|
|
||||||
Implement and use lattice IO to verify this. -- cout for lattice types DONE
|
|
||||||
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
Version : 0.8.0
|
|
||||||
|
|
||||||
- Clang 3.5 and above, ICPC v16 and above, GCC 6.3 and above recommended
|
|
||||||
- MPI and MPI3 comms optimisations for KNL and OPA finished
|
|
||||||
- Half precision comms
|
|
||||||
+244
@@ -0,0 +1,244 @@
|
|||||||
|
# Welcome to Jekyll!
|
||||||
|
#
|
||||||
|
# This config file is meant for settings that affect your entire site, values
|
||||||
|
# which you are expected to set up once and rarely need to edit after that.
|
||||||
|
# For technical reasons, this file is *NOT* reloaded automatically when you use
|
||||||
|
# `jekyll serve`. If you change this file, please restart the server process.
|
||||||
|
|
||||||
|
# Site Settings
|
||||||
|
locale : "en"
|
||||||
|
title : "GRID"
|
||||||
|
title_separator : "|"
|
||||||
|
name : "University of Edinburgh"
|
||||||
|
authors : "Peter Boyle, Guido Cossu, Antonin Portelli, Azusa Yamaguchi"
|
||||||
|
description : "Data parallel C++ mathematical object library."
|
||||||
|
url : 'https://paboyle.github.io' # the base hostname & protocol for your site e.g. "https://mmistakes.github.io"
|
||||||
|
baseurl : '/Grid' # the subpath of your site, e.g. "/blog"
|
||||||
|
repository : "paboyle/Grid"
|
||||||
|
teaser : # filename of teaser fallback teaser image placed in /images/, .e.g. "500x300.png"
|
||||||
|
# breadcrumbs : false # true, false (default)
|
||||||
|
words_per_minute : 200
|
||||||
|
comments:
|
||||||
|
provider : # false (default), "disqus", "discourse", "facebook", "google-plus", "staticman", "custom"
|
||||||
|
disqus:
|
||||||
|
shortname : # https://help.disqus.com/customer/portal/articles/466208-what-s-a-shortname-
|
||||||
|
discourse:
|
||||||
|
server : # https://meta.discourse.org/t/embedding-discourse-comments-via-javascript/31963 , e.g.: meta.discourse.org
|
||||||
|
facebook:
|
||||||
|
# https://developers.facebook.com/docs/plugins/comments
|
||||||
|
appid :
|
||||||
|
num_posts : # 5 (default)
|
||||||
|
colorscheme : # "light" (default), "dark"
|
||||||
|
staticman:
|
||||||
|
allowedFields : ['name', 'email', 'url', 'message']
|
||||||
|
branch : # "master", "gh-pages"
|
||||||
|
commitMessage : "New comment."
|
||||||
|
filename : comment-{@timestamp}
|
||||||
|
format : "yml"
|
||||||
|
moderation : true
|
||||||
|
path : "_data/comments/{options.slug}"
|
||||||
|
requiredFields : ['name', 'email', 'message']
|
||||||
|
transforms:
|
||||||
|
email : "md5"
|
||||||
|
generatedFields:
|
||||||
|
date:
|
||||||
|
type : "date"
|
||||||
|
options:
|
||||||
|
format : "iso8601" # "iso8601" (default), "timestamp-seconds", "timestamp-milliseconds"
|
||||||
|
atom_feed:
|
||||||
|
path : # blank (default) uses feed.xml
|
||||||
|
|
||||||
|
# SEO Related
|
||||||
|
google_site_verification :
|
||||||
|
bing_site_verification :
|
||||||
|
alexa_site_verification :
|
||||||
|
yandex_site_verification :
|
||||||
|
|
||||||
|
# Social Sharing
|
||||||
|
twitter:
|
||||||
|
username :
|
||||||
|
facebook:
|
||||||
|
username :
|
||||||
|
app_id :
|
||||||
|
publisher :
|
||||||
|
og_image : # Open Graph/Twitter default site image
|
||||||
|
# For specifying social profiles
|
||||||
|
# - https://developers.google.com/structured-data/customize/social-profiles
|
||||||
|
social:
|
||||||
|
type : # Person or Organization (defaults to Person)
|
||||||
|
name : # If the user or organization name differs from the site's name
|
||||||
|
links: # An array of links to social media profiles
|
||||||
|
|
||||||
|
# Analytics
|
||||||
|
analytics:
|
||||||
|
provider : false # false (default), "google", "google-universal", "custom"
|
||||||
|
google:
|
||||||
|
tracking_id :
|
||||||
|
|
||||||
|
|
||||||
|
# Site Author
|
||||||
|
author:
|
||||||
|
name : "PPT Group"
|
||||||
|
avatar : "bio-photo.jpg"
|
||||||
|
bio : "Some info"
|
||||||
|
location : "Edinburgh"
|
||||||
|
email : "guido.cossu@ed.ac.uk"
|
||||||
|
uri :
|
||||||
|
bitbucket :
|
||||||
|
codepen :
|
||||||
|
dribbble :
|
||||||
|
flickr :
|
||||||
|
facebook :
|
||||||
|
foursquare :
|
||||||
|
github :
|
||||||
|
google_plus :
|
||||||
|
keybase :
|
||||||
|
instagram :
|
||||||
|
lastfm :
|
||||||
|
linkedin :
|
||||||
|
pinterest :
|
||||||
|
soundcloud :
|
||||||
|
stackoverflow : # "123456/username" (the last part of your profile url, e.g. http://stackoverflow.com/users/123456/username)
|
||||||
|
steam :
|
||||||
|
tumblr :
|
||||||
|
twitter :
|
||||||
|
vine :
|
||||||
|
weibo :
|
||||||
|
xing :
|
||||||
|
youtube :
|
||||||
|
|
||||||
|
|
||||||
|
# Reading Files
|
||||||
|
include:
|
||||||
|
- .htaccess
|
||||||
|
- _pages
|
||||||
|
exclude:
|
||||||
|
- "*.sublime-project"
|
||||||
|
- "*.sublime-workspace"
|
||||||
|
- vendor
|
||||||
|
- .asset-cache
|
||||||
|
- .bundle
|
||||||
|
- .jekyll-assets-cache
|
||||||
|
- .sass-cache
|
||||||
|
- assets/js/plugins
|
||||||
|
- assets/js/_main.js
|
||||||
|
- assets/js/vendor
|
||||||
|
- Capfile
|
||||||
|
- CHANGELOG
|
||||||
|
- config
|
||||||
|
- Gemfile
|
||||||
|
- Gruntfile.js
|
||||||
|
- gulpfile.js
|
||||||
|
- LICENSE
|
||||||
|
- log
|
||||||
|
- node_modules
|
||||||
|
- package.json
|
||||||
|
- Rakefile
|
||||||
|
- README
|
||||||
|
- tmp
|
||||||
|
keep_files:
|
||||||
|
- .git
|
||||||
|
- .svn
|
||||||
|
encoding: "utf-8"
|
||||||
|
markdown_ext: "markdown,mkdown,mkdn,mkd,md"
|
||||||
|
|
||||||
|
|
||||||
|
# Conversion
|
||||||
|
markdown: kramdown
|
||||||
|
highlighter: rouge
|
||||||
|
lsi: false
|
||||||
|
excerpt_separator: "\n\n"
|
||||||
|
incremental: false
|
||||||
|
|
||||||
|
|
||||||
|
# Markdown Processing
|
||||||
|
kramdown:
|
||||||
|
input: GFM
|
||||||
|
hard_wrap: false
|
||||||
|
auto_ids: true
|
||||||
|
footnote_nr: 1
|
||||||
|
entity_output: as_char
|
||||||
|
toc_levels: 1..6
|
||||||
|
smart_quotes: lsquo,rsquo,ldquo,rdquo
|
||||||
|
enable_coderay: false
|
||||||
|
|
||||||
|
|
||||||
|
# Sass/SCSS
|
||||||
|
sass:
|
||||||
|
sass_dir: _sass
|
||||||
|
style: compressed # http://sass-lang.com/documentation/file.SASS_REFERENCE.html#output_style
|
||||||
|
|
||||||
|
|
||||||
|
# Outputting
|
||||||
|
permalink: /:categories/:title/
|
||||||
|
paginate: 5 # amount of posts to show
|
||||||
|
paginate_path: /page:num/
|
||||||
|
timezone: # http://en.wikipedia.org/wiki/List_of_tz_database_time_zones
|
||||||
|
|
||||||
|
|
||||||
|
# Plugins
|
||||||
|
gems:
|
||||||
|
- jekyll-paginate
|
||||||
|
- jekyll-sitemap
|
||||||
|
- jekyll-gist
|
||||||
|
- jekyll-feed
|
||||||
|
- jekyll-octicons
|
||||||
|
- jemoji
|
||||||
|
|
||||||
|
# mimic GitHub Pages with --safe
|
||||||
|
whitelist:
|
||||||
|
- jekyll-paginate
|
||||||
|
- jekyll-sitemap
|
||||||
|
- jekyll-gist
|
||||||
|
- jekyll-feed
|
||||||
|
- jekyll-octicons
|
||||||
|
- jemoji
|
||||||
|
|
||||||
|
|
||||||
|
# Archives
|
||||||
|
# Type
|
||||||
|
# - GitHub Pages compatible archive pages built with Liquid ~> type: liquid (default)
|
||||||
|
# - Jekyll Archives plugin archive pages ~> type: jekyll-archives
|
||||||
|
# Path (examples)
|
||||||
|
# - Archive page should exist at path when using Liquid method or you can
|
||||||
|
# expect broken links (especially with breadcrumbs enabled)
|
||||||
|
# - <base_path>/tags/my-awesome-tag/index.html ~> path: /tags/
|
||||||
|
# - <base_path/categories/my-awesome-category/index.html ~> path: /categories/
|
||||||
|
# - <base_path/my-awesome-category/index.html ~> path: /
|
||||||
|
category_archive:
|
||||||
|
type: liquid
|
||||||
|
path: /categories/
|
||||||
|
tag_archive:
|
||||||
|
type: liquid
|
||||||
|
path: /tags/
|
||||||
|
# https://github.com/jekyll/jekyll-archives
|
||||||
|
# jekyll-archives:
|
||||||
|
# enabled:
|
||||||
|
# - categories
|
||||||
|
# - tags
|
||||||
|
# layouts:
|
||||||
|
# category: archive-taxonomy
|
||||||
|
# tag: archive-taxonomy
|
||||||
|
# permalinks:
|
||||||
|
# category: /categories/:name/
|
||||||
|
# tag: /tags/:name/
|
||||||
|
|
||||||
|
|
||||||
|
# HTML Compression
|
||||||
|
# - http://jch.penibelst.de/
|
||||||
|
compress_html:
|
||||||
|
clippings: all
|
||||||
|
ignore:
|
||||||
|
envs: development
|
||||||
|
|
||||||
|
|
||||||
|
output: web
|
||||||
|
defaults:
|
||||||
|
-
|
||||||
|
scope:
|
||||||
|
path: ""
|
||||||
|
type: "pages"
|
||||||
|
values:
|
||||||
|
layout: "single"
|
||||||
|
comments: false
|
||||||
|
search: true
|
||||||
@@ -0,0 +1,231 @@
|
|||||||
|
# Welcome to Jekyll!
|
||||||
|
#
|
||||||
|
# This config file is meant for settings that affect your entire site, values
|
||||||
|
# which you are expected to set up once and rarely need to edit after that.
|
||||||
|
# For technical reasons, this file is *NOT* reloaded automatically when you use
|
||||||
|
# `jekyll serve`. If you change this file, please restart the server process.
|
||||||
|
|
||||||
|
# Site Settings
|
||||||
|
locale : "en"
|
||||||
|
title : "GRID"
|
||||||
|
title_separator : "|"
|
||||||
|
name : "Our team"
|
||||||
|
description : "Data parallel C++ mathematical object library."
|
||||||
|
url : 'http://127.0.0.1:4000' # the base hostname & protocol for your site e.g. "https://mmistakes.github.io"
|
||||||
|
baseurl : '/Grid' # the subpath of your site, e.g. "/blog"
|
||||||
|
repository : "paboyle/Grid"
|
||||||
|
teaser : # filename of teaser fallback teaser image placed in /images/, .e.g. "500x300.png"
|
||||||
|
# breadcrumbs : false # true, false (default)
|
||||||
|
words_per_minute : 200
|
||||||
|
comments:
|
||||||
|
provider : # false (default), "disqus", "discourse", "facebook", "google-plus", "staticman", "custom"
|
||||||
|
disqus:
|
||||||
|
shortname : # https://help.disqus.com/customer/portal/articles/466208-what-s-a-shortname-
|
||||||
|
discourse:
|
||||||
|
server : # https://meta.discourse.org/t/embedding-discourse-comments-via-javascript/31963 , e.g.: meta.discourse.org
|
||||||
|
facebook:
|
||||||
|
# https://developers.facebook.com/docs/plugins/comments
|
||||||
|
appid :
|
||||||
|
num_posts : # 5 (default)
|
||||||
|
colorscheme : # "light" (default), "dark"
|
||||||
|
staticman:
|
||||||
|
allowedFields : ['name', 'email', 'url', 'message']
|
||||||
|
branch : # "master", "gh-pages"
|
||||||
|
commitMessage : "New comment."
|
||||||
|
filename : comment-{@timestamp}
|
||||||
|
format : "yml"
|
||||||
|
moderation : true
|
||||||
|
path : "_data/comments/{options.slug}"
|
||||||
|
requiredFields : ['name', 'email', 'message']
|
||||||
|
transforms:
|
||||||
|
email : "md5"
|
||||||
|
generatedFields:
|
||||||
|
date:
|
||||||
|
type : "date"
|
||||||
|
options:
|
||||||
|
format : "iso8601" # "iso8601" (default), "timestamp-seconds", "timestamp-milliseconds"
|
||||||
|
atom_feed:
|
||||||
|
path : # blank (default) uses feed.xml
|
||||||
|
|
||||||
|
# SEO Related
|
||||||
|
google_site_verification :
|
||||||
|
bing_site_verification :
|
||||||
|
alexa_site_verification :
|
||||||
|
yandex_site_verification :
|
||||||
|
|
||||||
|
# Social Sharing
|
||||||
|
twitter:
|
||||||
|
username :
|
||||||
|
facebook:
|
||||||
|
username :
|
||||||
|
app_id :
|
||||||
|
publisher :
|
||||||
|
og_image : # Open Graph/Twitter default site image
|
||||||
|
# For specifying social profiles
|
||||||
|
# - https://developers.google.com/structured-data/customize/social-profiles
|
||||||
|
social:
|
||||||
|
type : # Person or Organization (defaults to Person)
|
||||||
|
name : # If the user or organization name differs from the site's name
|
||||||
|
links: # An array of links to social media profiles
|
||||||
|
|
||||||
|
# Analytics
|
||||||
|
analytics:
|
||||||
|
provider : false # false (default), "google", "google-universal", "custom"
|
||||||
|
google:
|
||||||
|
tracking_id :
|
||||||
|
|
||||||
|
|
||||||
|
# Site Author
|
||||||
|
author:
|
||||||
|
name : "PPT Group"
|
||||||
|
avatar : "bio-photo.jpg"
|
||||||
|
bio : "Our group is amazing."
|
||||||
|
location : "Edinburgh"
|
||||||
|
email : "guido.cossu@ed.ac.uk"
|
||||||
|
uri :
|
||||||
|
bitbucket :
|
||||||
|
codepen :
|
||||||
|
dribbble :
|
||||||
|
flickr :
|
||||||
|
facebook :
|
||||||
|
foursquare :
|
||||||
|
github :
|
||||||
|
google_plus :
|
||||||
|
keybase :
|
||||||
|
instagram :
|
||||||
|
lastfm :
|
||||||
|
linkedin :
|
||||||
|
pinterest :
|
||||||
|
soundcloud :
|
||||||
|
stackoverflow : # "123456/username" (the last part of your profile url, e.g. http://stackoverflow.com/users/123456/username)
|
||||||
|
steam :
|
||||||
|
tumblr :
|
||||||
|
twitter :
|
||||||
|
vine :
|
||||||
|
weibo :
|
||||||
|
xing :
|
||||||
|
youtube :
|
||||||
|
|
||||||
|
|
||||||
|
# Reading Files
|
||||||
|
include:
|
||||||
|
- .htaccess
|
||||||
|
- _pages
|
||||||
|
exclude:
|
||||||
|
- "*.sublime-project"
|
||||||
|
- "*.sublime-workspace"
|
||||||
|
- vendor
|
||||||
|
- .asset-cache
|
||||||
|
- .bundle
|
||||||
|
- .jekyll-assets-cache
|
||||||
|
- .sass-cache
|
||||||
|
- assets/js/plugins
|
||||||
|
- assets/js/_main.js
|
||||||
|
- assets/js/vendor
|
||||||
|
- Capfile
|
||||||
|
- CHANGELOG
|
||||||
|
- config
|
||||||
|
- Gemfile
|
||||||
|
- Gruntfile.js
|
||||||
|
- gulpfile.js
|
||||||
|
- LICENSE
|
||||||
|
- log
|
||||||
|
- node_modules
|
||||||
|
- package.json
|
||||||
|
- Rakefile
|
||||||
|
- README
|
||||||
|
- tmp
|
||||||
|
keep_files:
|
||||||
|
- .git
|
||||||
|
- .svn
|
||||||
|
encoding: "utf-8"
|
||||||
|
markdown_ext: "markdown,mkdown,mkdn,mkd,md"
|
||||||
|
|
||||||
|
|
||||||
|
# Conversion
|
||||||
|
markdown: kramdown
|
||||||
|
highlighter: rouge
|
||||||
|
lsi: false
|
||||||
|
excerpt_separator: "\n\n"
|
||||||
|
incremental: false
|
||||||
|
|
||||||
|
|
||||||
|
# Markdown Processing
|
||||||
|
kramdown:
|
||||||
|
input: GFM
|
||||||
|
hard_wrap: false
|
||||||
|
auto_ids: true
|
||||||
|
footnote_nr: 1
|
||||||
|
entity_output: as_char
|
||||||
|
toc_levels: 1..6
|
||||||
|
smart_quotes: lsquo,rsquo,ldquo,rdquo
|
||||||
|
enable_coderay: false
|
||||||
|
|
||||||
|
|
||||||
|
# Sass/SCSS
|
||||||
|
sass:
|
||||||
|
sass_dir: _sass
|
||||||
|
style: compressed # http://sass-lang.com/documentation/file.SASS_REFERENCE.html#output_style
|
||||||
|
|
||||||
|
|
||||||
|
# Outputting
|
||||||
|
permalink: /:categories/:title/
|
||||||
|
paginate: 5 # amount of posts to show
|
||||||
|
paginate_path: /page:num/
|
||||||
|
timezone: # http://en.wikipedia.org/wiki/List_of_tz_database_time_zones
|
||||||
|
|
||||||
|
|
||||||
|
# Plugins
|
||||||
|
gems:
|
||||||
|
- jekyll-paginate
|
||||||
|
- jekyll-sitemap
|
||||||
|
- jekyll-gist
|
||||||
|
- jekyll-feed
|
||||||
|
- jekyll-octicons
|
||||||
|
- jemoji
|
||||||
|
|
||||||
|
# mimic GitHub Pages with --safe
|
||||||
|
whitelist:
|
||||||
|
- jekyll-paginate
|
||||||
|
- jekyll-sitemap
|
||||||
|
- jekyll-gist
|
||||||
|
- jekyll-feed
|
||||||
|
- jekyll-octicons
|
||||||
|
- jemoji
|
||||||
|
|
||||||
|
|
||||||
|
# Archives
|
||||||
|
# Type
|
||||||
|
# - GitHub Pages compatible archive pages built with Liquid ~> type: liquid (default)
|
||||||
|
# - Jekyll Archives plugin archive pages ~> type: jekyll-archives
|
||||||
|
# Path (examples)
|
||||||
|
# - Archive page should exist at path when using Liquid method or you can
|
||||||
|
# expect broken links (especially with breadcrumbs enabled)
|
||||||
|
# - <base_path>/tags/my-awesome-tag/index.html ~> path: /tags/
|
||||||
|
# - <base_path/categories/my-awesome-category/index.html ~> path: /categories/
|
||||||
|
# - <base_path/my-awesome-category/index.html ~> path: /
|
||||||
|
category_archive:
|
||||||
|
type: liquid
|
||||||
|
path: /categories/
|
||||||
|
tag_archive:
|
||||||
|
type: liquid
|
||||||
|
path: /tags/
|
||||||
|
# https://github.com/jekyll/jekyll-archives
|
||||||
|
# jekyll-archives:
|
||||||
|
# enabled:
|
||||||
|
# - categories
|
||||||
|
# - tags
|
||||||
|
# layouts:
|
||||||
|
# category: archive-taxonomy
|
||||||
|
# tag: archive-taxonomy
|
||||||
|
# permalinks:
|
||||||
|
# category: /categories/:name/
|
||||||
|
# tag: /tags/:name/
|
||||||
|
|
||||||
|
|
||||||
|
# HTML Compression
|
||||||
|
# - http://jch.penibelst.de/
|
||||||
|
compress_html:
|
||||||
|
clippings: all
|
||||||
|
ignore:
|
||||||
|
envs: development
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
# /_data/authors.yml
|
||||||
|
|
||||||
|
Guido Cossu:
|
||||||
|
name: "Guido Cossu"
|
||||||
|
uri: "http://www.google.com"
|
||||||
|
email: "guido.cossu@ed.ac.uk"
|
||||||
|
bio: "Senior researcher at Higgs Centre"
|
||||||
|
avatar: "bio-photo-2.jpg"
|
||||||
|
twitter: "coppolachan"
|
||||||
@@ -0,0 +1,122 @@
|
|||||||
|
# main links links
|
||||||
|
|
||||||
|
main:
|
||||||
|
- title: "Documentation"
|
||||||
|
icon: "octicon octicon-book vertical-middle"
|
||||||
|
url: /docs/
|
||||||
|
|
||||||
|
- title: "Quick-start guide"
|
||||||
|
url: /docs/quick-start-guide/
|
||||||
|
|
||||||
|
- title: "About"
|
||||||
|
url: /about/
|
||||||
|
|
||||||
|
- title: "GPL License"
|
||||||
|
url: /license/
|
||||||
|
|
||||||
|
|
||||||
|
docs:
|
||||||
|
|
||||||
|
- title:
|
||||||
|
output: pdf
|
||||||
|
type: frontmatter
|
||||||
|
children:
|
||||||
|
- title:
|
||||||
|
url: /titlepage.html
|
||||||
|
output: pdf
|
||||||
|
type: frontmatter
|
||||||
|
- title:
|
||||||
|
url: /tocpage.html
|
||||||
|
output: pdf
|
||||||
|
type: frontmatter
|
||||||
|
|
||||||
|
- title: "Introduction"
|
||||||
|
output: pdf
|
||||||
|
children:
|
||||||
|
- title: "GRID"
|
||||||
|
url: /docs/
|
||||||
|
output: pdf
|
||||||
|
|
||||||
|
- title: Getting Started
|
||||||
|
output: pdf
|
||||||
|
children:
|
||||||
|
- title: "Quick-Start Guide"
|
||||||
|
url: /docs/quick-start-guide/
|
||||||
|
output: web, pdf
|
||||||
|
- title: "Communication interfaces"
|
||||||
|
url: /docs/comm_interfaces/
|
||||||
|
output: web, pdf
|
||||||
|
- title: "Architecture targets"
|
||||||
|
url: /docs/simd_targets/
|
||||||
|
output: web, pdf
|
||||||
|
- title: "Building on Intel and AMD targets"
|
||||||
|
url: /docs/general_build/
|
||||||
|
output: web, pdf
|
||||||
|
|
||||||
|
- title: Using GRID
|
||||||
|
output: pdf
|
||||||
|
children:
|
||||||
|
- title: "Running on KNL"
|
||||||
|
url: /docs/running_knl/
|
||||||
|
output: web, pdf
|
||||||
|
|
||||||
|
- title: Development
|
||||||
|
output: pdf
|
||||||
|
children:
|
||||||
|
- title: "Execution model"
|
||||||
|
url: /docs/execution-model/
|
||||||
|
output: web, pdf
|
||||||
|
- title: "Reporting an issue"
|
||||||
|
url: /docs/bug_report/
|
||||||
|
output: web, pdf
|
||||||
|
- title: "Continuous integration"
|
||||||
|
url: /docs/travis/
|
||||||
|
output: web, pdf
|
||||||
|
|
||||||
|
- title: API description
|
||||||
|
output: pdf
|
||||||
|
children:
|
||||||
|
- title: "Introduction"
|
||||||
|
url: /docs/API/introduction.html
|
||||||
|
output: web, pdf
|
||||||
|
disable: "no"
|
||||||
|
- title: "Tensor classes"
|
||||||
|
url: /docs/API/tensor_classes.html
|
||||||
|
output: web, pdf
|
||||||
|
disable: "no"
|
||||||
|
- title: "Vectorisation"
|
||||||
|
url: /docs/API/vectorisation.html
|
||||||
|
output: web, pdf
|
||||||
|
disable: "no"
|
||||||
|
- title: "Coordinates"
|
||||||
|
url: /docs/API/coordinates.html
|
||||||
|
output: web, pdf
|
||||||
|
disable: "no"
|
||||||
|
- title: "Grids"
|
||||||
|
url: /docs/API/grids.html
|
||||||
|
output: web, pdf
|
||||||
|
disable: "no"
|
||||||
|
- title: "Lattice containers"
|
||||||
|
url: /docs/API/lattice_containers.html
|
||||||
|
output: web, pdf
|
||||||
|
disable: "no"
|
||||||
|
- title: "Random number generators"
|
||||||
|
url: /docs/API/random_number_generators.html
|
||||||
|
output: web, pdf
|
||||||
|
disable: "no"
|
||||||
|
- title: "Lattice classes"
|
||||||
|
url: /docs/lattice/
|
||||||
|
disable: "yes"
|
||||||
|
|
||||||
|
|
||||||
|
- title: "Lattice theories"
|
||||||
|
output: pdf
|
||||||
|
children:
|
||||||
|
- title : "Theories"
|
||||||
|
url: /docs/theories/
|
||||||
|
disable: "yes"
|
||||||
|
output: web
|
||||||
|
- title: "HMC"
|
||||||
|
url: /docs/theories/hmc/
|
||||||
|
disable: "no"
|
||||||
|
output: web,pdf
|
||||||
@@ -0,0 +1,355 @@
|
|||||||
|
# User interface text and labels
|
||||||
|
|
||||||
|
# English (default)
|
||||||
|
# -----------------
|
||||||
|
en: &DEFAULT_EN
|
||||||
|
page : "Page"
|
||||||
|
pagination_previous : "Previous"
|
||||||
|
pagination_next : "Next"
|
||||||
|
breadcrumb_home_label : "Home"
|
||||||
|
breadcrumb_separator : "/"
|
||||||
|
toc_label : "On This Page"
|
||||||
|
ext_link_label : "Direct Link"
|
||||||
|
less_than : "less than"
|
||||||
|
minute_read : "minute read"
|
||||||
|
share_on_label : "Share on"
|
||||||
|
meta_label :
|
||||||
|
tags_label : "Tags:"
|
||||||
|
categories_label : "Categories:"
|
||||||
|
date_label : "Updated:"
|
||||||
|
comments_label : "Leave a Comment"
|
||||||
|
comments_title : "Comments"
|
||||||
|
more_label : "Learn More"
|
||||||
|
related_label : "You May Also Enjoy"
|
||||||
|
follow_label : "Follow:"
|
||||||
|
feed_label : "Feed"
|
||||||
|
powered_by : "Powered by"
|
||||||
|
website_label : "Website"
|
||||||
|
email_label : "Email"
|
||||||
|
recent_posts : "Recent Posts"
|
||||||
|
undefined_wpm : "Undefined parameter words_per_minute at _config.yml"
|
||||||
|
comment_form_info : "Your email address will not be published. Required fields are marked"
|
||||||
|
comment_form_comment_label : "Comment"
|
||||||
|
comment_form_md_info : "Markdown is supported."
|
||||||
|
comment_form_name_label : "Name"
|
||||||
|
comment_form_email_label : "Email address"
|
||||||
|
comment_form_website_label : "Website (optional)"
|
||||||
|
comment_btn_submit : "Submit Comment"
|
||||||
|
comment_btn_submitted : "Submitted"
|
||||||
|
comment_success_msg : "Thanks for your comment! It will show on the site once it has been approved."
|
||||||
|
comment_error_msg : "Sorry, there was an error with your submission. Please make sure all required fields have been completed and try again."
|
||||||
|
loading_label : "Loading..."
|
||||||
|
en-US:
|
||||||
|
<<: *DEFAULT_EN
|
||||||
|
en-CA:
|
||||||
|
<<: *DEFAULT_EN
|
||||||
|
en-GB:
|
||||||
|
<<: *DEFAULT_EN
|
||||||
|
en-AU:
|
||||||
|
<<: *DEFAULT_EN
|
||||||
|
|
||||||
|
# Spanish
|
||||||
|
# --------------
|
||||||
|
es: &DEFAULT_ES
|
||||||
|
page : "Página"
|
||||||
|
pagination_previous : "Anterior"
|
||||||
|
pagination_next : "Siguiente"
|
||||||
|
breadcrumb_home_label : "Inicio"
|
||||||
|
breadcrumb_separator : "/"
|
||||||
|
toc_label : "Contenidos"
|
||||||
|
ext_link_label : "Enlace"
|
||||||
|
less_than : "menos de"
|
||||||
|
minute_read : "minuto de lectura"
|
||||||
|
share_on_label : "Compartir"
|
||||||
|
meta_label :
|
||||||
|
tags_label : "Etiquetas:"
|
||||||
|
categories_label : "Categorías:"
|
||||||
|
date_label : "Actualizado:"
|
||||||
|
comments_label : "Comentar"
|
||||||
|
comments_title :
|
||||||
|
more_label : "Ver más"
|
||||||
|
related_label : "Podrías ver también"
|
||||||
|
follow_label : "Seguir:"
|
||||||
|
feed_label : "Feed"
|
||||||
|
powered_by : "Powered by"
|
||||||
|
website_label : "Sitio web"
|
||||||
|
email_label : "Email"
|
||||||
|
recent_posts : "Entradas recientes"
|
||||||
|
undefined_wpm : "Parametro words_per_minute (Palabras por minuto) no definido en _config.yml"
|
||||||
|
comment_form_info :
|
||||||
|
comment_form_comment_label :
|
||||||
|
comment_form_md_info :
|
||||||
|
comment_form_name_label :
|
||||||
|
comment_form_email_label :
|
||||||
|
comment_form_website_label :
|
||||||
|
comment_btn_submit :
|
||||||
|
comment_btn_submitted :
|
||||||
|
comment_success_msg :
|
||||||
|
comment_error_msg :
|
||||||
|
loading_label :
|
||||||
|
es-ES:
|
||||||
|
<<: *DEFAULT_ES
|
||||||
|
es-CO:
|
||||||
|
<<: *DEFAULT_ES
|
||||||
|
|
||||||
|
# French
|
||||||
|
# -----------------
|
||||||
|
fr: &DEFAULT_FR
|
||||||
|
page : "Page"
|
||||||
|
pagination_previous : "Précédent"
|
||||||
|
pagination_next : "Suivant"
|
||||||
|
breadcrumb_home_label : "Accueil"
|
||||||
|
breadcrumb_separator : "/"
|
||||||
|
toc_label : "Sur cette page"
|
||||||
|
ext_link_label : "Lien direct"
|
||||||
|
less_than : "plus petit que"
|
||||||
|
minute_read : "minute de lecture"
|
||||||
|
share_on_label : "Partager sur"
|
||||||
|
meta_label :
|
||||||
|
tags_label : "Tags :"
|
||||||
|
categories_label : "Catégories :"
|
||||||
|
date_label : "Mis à jour :"
|
||||||
|
comments_label : "Laisser un commentaire"
|
||||||
|
comments_title :
|
||||||
|
more_label : "Lire plus"
|
||||||
|
related_label : "Vous pourriez aimer"
|
||||||
|
follow_label : "Suivez moi"
|
||||||
|
feed_label : "Flux"
|
||||||
|
powered_by : "Propulsé par"
|
||||||
|
website_label : "Site"
|
||||||
|
email_label : "Email"
|
||||||
|
recent_posts : "Posts récents"
|
||||||
|
undefined_wpm : "Le paramètre words_per_minute n'est pas défini dans _config.yml"
|
||||||
|
comments_title : "Commentaires"
|
||||||
|
comment_form_info : "Votre adresse email ne sera pas visible. Les champs obligatoires sont marqués"
|
||||||
|
comment_form_comment_label : "Commentaire"
|
||||||
|
comment_form_md_info : "Markdown est supporté."
|
||||||
|
comment_form_name_label : "Nom"
|
||||||
|
comment_form_email_label : "Adresse mail"
|
||||||
|
comment_form_website_label : "Site web (optionnel)"
|
||||||
|
comment_btn_submit : "Envoyer"
|
||||||
|
comment_btn_submitted : "Envoyé"
|
||||||
|
comment_success_msg : "Merci pour votre comentaire, il sera visible sur le site une fois approuvé."
|
||||||
|
comment_error_msg : "Désolé, une erreur est survenue lors de la soumission. Vérifiez que les champs obligatoires ont été remplis et réessayez."
|
||||||
|
loading_label : "Chargement..."
|
||||||
|
fr-FR:
|
||||||
|
<<: *DEFAULT_FR
|
||||||
|
fr-BE:
|
||||||
|
<<: *DEFAULT_FR
|
||||||
|
fr-CH:
|
||||||
|
<<: *DEFAULT_FR
|
||||||
|
|
||||||
|
# Turkish
|
||||||
|
# -----------------
|
||||||
|
tr: &DEFAULT_TR
|
||||||
|
page : "Sayfa"
|
||||||
|
pagination_previous : "Önceki"
|
||||||
|
pagination_next : "Sonraki"
|
||||||
|
breadcrumb_home_label : "Ana Sayfa"
|
||||||
|
breadcrumb_separator : "/"
|
||||||
|
toc_label : "İçindekiler"
|
||||||
|
ext_link_label : "Doğrudan Bağlantı"
|
||||||
|
less_than : "Şu süreden az: "
|
||||||
|
minute_read : "dakika tahmini okuma süresi"
|
||||||
|
share_on_label : "Paylaş"
|
||||||
|
meta_label :
|
||||||
|
tags_label : "Etiketler:"
|
||||||
|
categories_label : "Kategoriler:"
|
||||||
|
date_label : "Güncelleme tarihi:"
|
||||||
|
comments_label : "Yorum yapın"
|
||||||
|
comments_title :
|
||||||
|
more_label : "Daha fazlasını öğrenin"
|
||||||
|
related_label : "Bunlar ilginizi çekebilir:"
|
||||||
|
follow_label : "Takip et:"
|
||||||
|
feed_label : "RSS"
|
||||||
|
powered_by : "Emeği geçenler: "
|
||||||
|
website_label : "Web sayfası"
|
||||||
|
email_label : "E-posta"
|
||||||
|
recent_posts : "Son yazılar"
|
||||||
|
undefined_wpm : "_config.yml dosyasında tanımlanmamış words_per_minute parametresi"
|
||||||
|
comment_form_info :
|
||||||
|
comment_form_comment_label :
|
||||||
|
comment_form_md_info :
|
||||||
|
comment_form_name_label :
|
||||||
|
comment_form_email_label :
|
||||||
|
comment_form_website_label :
|
||||||
|
comment_btn_submit :
|
||||||
|
comment_btn_submitted :
|
||||||
|
comment_success_msg :
|
||||||
|
comment_error_msg :
|
||||||
|
loading_label :
|
||||||
|
tr-TR:
|
||||||
|
<<: *DEFAULT_TR
|
||||||
|
|
||||||
|
# Portuguese
|
||||||
|
# -----------------
|
||||||
|
pt: &DEFAULT_PT
|
||||||
|
page : "Página"
|
||||||
|
pagination_previous : "Anterior"
|
||||||
|
pagination_next : "Seguinte"
|
||||||
|
breadcrumb_home_label : "Início"
|
||||||
|
breadcrumb_separator : "/"
|
||||||
|
toc_label : "Nesta Página"
|
||||||
|
ext_link_label : "Link Direto"
|
||||||
|
less_than : "menos de"
|
||||||
|
minute_read : "minutos de leitura"
|
||||||
|
share_on_label : "Partilhar no"
|
||||||
|
meta_label :
|
||||||
|
tags_label : "Etiquetas:"
|
||||||
|
categories_label : "Categorias:"
|
||||||
|
date_label : "Atualizado:"
|
||||||
|
comments_label : "Deixe um Comentário"
|
||||||
|
comments_title : "Comentários"
|
||||||
|
more_label : "Saber mais"
|
||||||
|
related_label : "Também pode gostar de"
|
||||||
|
follow_label : "Siga:"
|
||||||
|
feed_label : "Feed"
|
||||||
|
powered_by : "Feito com"
|
||||||
|
website_label : "Site"
|
||||||
|
email_label : "Email"
|
||||||
|
recent_posts : "Artigos Recentes"
|
||||||
|
undefined_wpm : "Parâmetro words_per_minute não definido em _config.yml"
|
||||||
|
comment_form_info : "O seu endereço email não será publicado. Os campos obrigatórios estão assinalados"
|
||||||
|
comment_form_comment_label : "Comentário"
|
||||||
|
comment_form_md_info : "Markdown é suportado."
|
||||||
|
comment_form_name_label : "Nome"
|
||||||
|
comment_form_email_label : "Endereço Email"
|
||||||
|
comment_form_website_label : "Site (opcional)"
|
||||||
|
comment_btn_submit : "Sumbeter Comentário"
|
||||||
|
comment_btn_submitted : "Submetido"
|
||||||
|
comment_success_msg : "Obrigado pelo seu comentário! Será visível no site logo que aprovado."
|
||||||
|
comment_error_msg : "Lamento, ocorreu um erro na sua submissão. Por favor verifique se todos os campos obrigatórios estão corretamente preenchidos e tente novamente."
|
||||||
|
loading_label : "A carregar..."
|
||||||
|
# Brazilian Portuguese
|
||||||
|
pt-BR:
|
||||||
|
page : "Página"
|
||||||
|
pagination_previous : "Anterior"
|
||||||
|
pagination_next : "Próxima"
|
||||||
|
breadcrumb_home_label : "Home"
|
||||||
|
breadcrumb_separator : "/"
|
||||||
|
toc_label : "Nesta página"
|
||||||
|
ext_link_label : "Link direto"
|
||||||
|
less_than : "meno que"
|
||||||
|
minute_read : "minutos de leitura"
|
||||||
|
share_on_label : "Compartilhe em"
|
||||||
|
meta_label :
|
||||||
|
tags_label : "Tags:"
|
||||||
|
categories_label : "Categorias:"
|
||||||
|
date_label : "Atualizado em:"
|
||||||
|
comments_label : "Deixe um comentário"
|
||||||
|
comments_title :
|
||||||
|
more_label : "Aprenda Mais"
|
||||||
|
related_label : "Você Talvez Goste Também"
|
||||||
|
follow_label : "Acompanhe em"
|
||||||
|
feed_label : "Feed"
|
||||||
|
powered_by : "Feito com"
|
||||||
|
website_label : "Site"
|
||||||
|
email_label : "Email"
|
||||||
|
recent_posts : "Postagens recentes"
|
||||||
|
undefined_wpm : "Parâmetro indefinido em word_per_minute no _config.yml"
|
||||||
|
comment_form_info :
|
||||||
|
comment_form_comment_label :
|
||||||
|
comment_form_md_info :
|
||||||
|
comment_form_name_label :
|
||||||
|
comment_form_email_label :
|
||||||
|
comment_form_website_label :
|
||||||
|
comment_btn_submit :
|
||||||
|
comment_btn_submitted :
|
||||||
|
comment_success_msg :
|
||||||
|
comment_error_msg :
|
||||||
|
loading_label :
|
||||||
|
pt-PT:
|
||||||
|
<<: *DEFAULT_PT
|
||||||
|
|
||||||
|
# Italian
|
||||||
|
# -----------------
|
||||||
|
it: &DEFAULT_IT
|
||||||
|
page : "Pagina"
|
||||||
|
pagination_previous : "Precedente"
|
||||||
|
pagination_next : "Prossima"
|
||||||
|
breadcrumb_home_label : "Home"
|
||||||
|
breadcrumb_separator : "/"
|
||||||
|
toc_label : "Indice della pagina"
|
||||||
|
ext_link_label : "Link"
|
||||||
|
less_than : "meno di"
|
||||||
|
minute_read : "minuto/i di lettura"
|
||||||
|
share_on_label : "Condividi"
|
||||||
|
meta_label :
|
||||||
|
tags_label : "Tags:"
|
||||||
|
categories_label : "Categorie:"
|
||||||
|
date_label : "Aggiornato:"
|
||||||
|
comments_label : "Scrivi un commento"
|
||||||
|
comments_title :
|
||||||
|
more_label : "Scopri di più"
|
||||||
|
related_label : "Potrebbe Piacerti Anche"
|
||||||
|
follow_label : "Segui:"
|
||||||
|
feed_label : "Feed"
|
||||||
|
powered_by : "Powered by"
|
||||||
|
website_label : "Website"
|
||||||
|
email_label : "Email"
|
||||||
|
recent_posts : "Articoli Recenti"
|
||||||
|
undefined_wpm : "Parametro words_per_minute non definito in _config.yml"
|
||||||
|
comment_form_info : "Il tuo indirizzo email non sarà pubblicato. Sono segnati i campi obbligatori"
|
||||||
|
comment_form_comment_label : "Commenta"
|
||||||
|
comment_form_md_info : "Il linguaggio Markdown è supportato"
|
||||||
|
comment_form_name_label : "Nome"
|
||||||
|
comment_form_email_label : "Indirizzo email"
|
||||||
|
comment_form_website_label : "Sito Web (opzionale)"
|
||||||
|
comment_btn_submit : "Invia commento"
|
||||||
|
comment_btn_submitted : "Inviato"
|
||||||
|
comment_success_msg : "Grazie per il tuo commento! Verrà visualizzato nel sito una volta che sarà approvato."
|
||||||
|
comment_error_msg : "C'è stato un errore con il tuo invio. Assicurati che tutti i campi richiesti siano stati completati e riprova."
|
||||||
|
loading_label : "Caricamento..."
|
||||||
|
it-IT:
|
||||||
|
<<: *DEFAULT_IT
|
||||||
|
|
||||||
|
# Chinese (zh-CN Chinese - China)
|
||||||
|
# -----------------
|
||||||
|
zh: &DEFAULT_ZH
|
||||||
|
page : "页面"
|
||||||
|
pagination_previous : "向前"
|
||||||
|
pagination_next : "向后"
|
||||||
|
breadcrumb_home_label : "首页"
|
||||||
|
breadcrumb_separator : "/"
|
||||||
|
toc_label : "在本页上"
|
||||||
|
ext_link_label : "直接链接"
|
||||||
|
less_than : "少于"
|
||||||
|
minute_read : "分钟 阅读"
|
||||||
|
share_on_label : "分享"
|
||||||
|
meta_label :
|
||||||
|
tags_label : "标签:"
|
||||||
|
categories_label : "分类:"
|
||||||
|
date_label : "最新的:"
|
||||||
|
comments_label : "留下评论"
|
||||||
|
comments_title : "评论"
|
||||||
|
more_label : "了解更多"
|
||||||
|
related_label : "猜您还喜欢"
|
||||||
|
follow_label : "关注:"
|
||||||
|
feed_label : "Feed"
|
||||||
|
powered_by : "Powered by"
|
||||||
|
website_label : "网站"
|
||||||
|
email_label : "Email"
|
||||||
|
recent_posts : "最新文章"
|
||||||
|
undefined_wpm : "Undefined parameter words_per_minute at _config.yml"
|
||||||
|
comment_form_info : "Your email address will not be published. Required fields are marked"
|
||||||
|
comment_form_comment_label : "Comment"
|
||||||
|
comment_form_md_info : "Markdown is supported."
|
||||||
|
comment_form_name_label : "Name"
|
||||||
|
comment_form_email_label : "Email address"
|
||||||
|
comment_form_website_label : "Website (optional)"
|
||||||
|
comment_btn_submit : "Submit Comment"
|
||||||
|
comment_btn_submitted : "Submitted"
|
||||||
|
comment_success_msg : "Thanks for your comment! It will show on the site once it has been approved."
|
||||||
|
comment_error_msg : "Sorry, there was an error with your submission. Please make sure all required fields have been completed and try again."
|
||||||
|
loading_label : "Loading..."
|
||||||
|
zh-CN:
|
||||||
|
<<: *DEFAULT_ZH
|
||||||
|
zh-HK:
|
||||||
|
<<: *DEFAULT_ZH
|
||||||
|
zh-SG:
|
||||||
|
<<: *DEFAULT_ZH
|
||||||
|
zh-TW:
|
||||||
|
<<: *DEFAULT_ZH
|
||||||
|
|
||||||
|
# Another locale
|
||||||
|
# --------------
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
<!-- start custom analytics snippet -->
|
||||||
|
|
||||||
|
<!-- end custom analytics snippet -->
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
<script>
|
||||||
|
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
|
||||||
|
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
|
||||||
|
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
|
||||||
|
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
|
||||||
|
|
||||||
|
ga('create', '{{ site.analytics.google.tracking_id }}', 'auto');
|
||||||
|
ga('send', 'pageview');
|
||||||
|
</script>
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
<script type="text/javascript">
|
||||||
|
var _gaq = _gaq || [];
|
||||||
|
_gaq.push(['_setAccount', '{{ site.analytics.google.tracking_id }}']);
|
||||||
|
_gaq.push(['_trackPageview']);
|
||||||
|
|
||||||
|
(function() {
|
||||||
|
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
|
||||||
|
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
|
||||||
|
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
|
||||||
|
})();
|
||||||
|
</script>
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
{% if site.analytics.provider and page.analytics != false %}
|
||||||
|
|
||||||
|
{% case site.analytics.provider %}
|
||||||
|
{% when "google" %}
|
||||||
|
{% include /analytics-providers/google.html %}
|
||||||
|
{% when "google-universal" %}
|
||||||
|
{% include /analytics-providers/google-universal.html %}
|
||||||
|
{% when "custom" %}
|
||||||
|
{% include /analytics-providers/custom.html %}
|
||||||
|
{% endcase %}
|
||||||
|
|
||||||
|
{% endif %}
|
||||||
@@ -0,0 +1,40 @@
|
|||||||
|
{% include base_path %}
|
||||||
|
|
||||||
|
{% if post.header.teaser %}
|
||||||
|
{% capture teaser %}{{ post.header.teaser }}{% endcapture %}
|
||||||
|
{% else %}
|
||||||
|
{% assign teaser = site.teaser %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if post.id %}
|
||||||
|
{% assign title = post.title | markdownify | remove: "<p>" | remove: "</p>" %}
|
||||||
|
{% else %}
|
||||||
|
{% assign title = post.title %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
<div class="{{ include.type | default: "list" }}__item">
|
||||||
|
<article class="archive__item" itemscope itemtype="http://schema.org/CreativeWork">
|
||||||
|
{% if include.type == "grid" and teaser %}
|
||||||
|
<div class="archive__item-teaser">
|
||||||
|
<img src=
|
||||||
|
{% if teaser contains "://" %}
|
||||||
|
"{{ teaser }}"
|
||||||
|
{% else %}
|
||||||
|
"{{ teaser | prepend: "/images/" | prepend: base_path }}"
|
||||||
|
{% endif %}
|
||||||
|
alt="">
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
<h2 class="archive__item-title" itemprop="headline">
|
||||||
|
{% if post.link %}
|
||||||
|
<a href="{{ post.link }}">{{ title }}</a> <a href="{{ base_path }}{{ post.url }}" rel="permalink"><i class="fa fa-link" aria-hidden="true" title="permalink"></i><span class="sr-only">Permalink</span></a>
|
||||||
|
{% else %}
|
||||||
|
<a href="{{ base_path }}{{ post.url }}" rel="permalink">{{ title }}</a>
|
||||||
|
{% endif %}
|
||||||
|
</h2>
|
||||||
|
{% if post.read_time %}
|
||||||
|
<p class="page__meta"><i class="fa fa-clock-o" aria-hidden="true"></i> {% include read-time.html %}</p>
|
||||||
|
{% endif %}
|
||||||
|
{% if post.excerpt %}<p class="archive__item-excerpt" itemprop="description">{{ post.excerpt | markdownify | strip_html | truncate: 160 }}</p>{% endif %}
|
||||||
|
</article>
|
||||||
|
</div>
|
||||||
@@ -0,0 +1,102 @@
|
|||||||
|
{% include base_path %}
|
||||||
|
|
||||||
|
{% if page.author and site.data.authors[page.author] %}
|
||||||
|
{% assign author = site.data.authors[page.author] %}{% else %}{% assign author = site.author %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
<div itemscope itemtype="http://schema.org/Person">
|
||||||
|
|
||||||
|
<div class="author__avatar">
|
||||||
|
{% if author.avatar contains "://" %}
|
||||||
|
<img src="{{ author.avatar }}" alt="{{ author.name }}">
|
||||||
|
{% else %}
|
||||||
|
<img src="{{ author.avatar | prepend: "/images/" | prepend: base_path }}" class="author__avatar" alt="{{ author.name }}">
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="author__content">
|
||||||
|
<h3 class="author__name">{{ author.name }}</h3>
|
||||||
|
{% if author.bio %}<p class="author__bio">{{ author.bio }}</p>{% endif %}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="author__urls-wrapper">
|
||||||
|
<button class="btn btn--inverse">{{ site.data.ui-text[site.locale].follow_label | remove: ":" | default: "Follow" }}</button>
|
||||||
|
<ul class="author__urls social-icons">
|
||||||
|
{% if author.location %}
|
||||||
|
<li><i class="fa fa-fw fa-map-marker" aria-hidden="true"></i> {{ author.location }}</li>
|
||||||
|
{% endif %}
|
||||||
|
{% if author.uri %}
|
||||||
|
<li><a href="{{ author.uri }}"><i class="fa fa-fw fa-chain" aria-hidden="true"></i> {{ site.data.ui-text[site.locale].website_label | default: "Website" }}</a></li>
|
||||||
|
{% endif %}
|
||||||
|
{% if author.email %}
|
||||||
|
<li><a href="mailto:{{ author.email }}"><i class="fa fa-fw fa-envelope-square" aria-hidden="true"></i> {{ site.data.ui-text[site.locale].email_label | default: "Email" }}</a></li>
|
||||||
|
{% endif %}
|
||||||
|
{% if author.keybase %}
|
||||||
|
<li><a href="https://keybase.io/{{ author.keybase }}"><i class="fa fa-fw fa-key" aria-hidden="true"></i> Keybase</a></li>
|
||||||
|
{% endif %}
|
||||||
|
{% if author.twitter %}
|
||||||
|
<li><a href="https://twitter.com/{{ author.twitter }}"><i class="fa fa-fw fa-twitter-square" aria-hidden="true"></i> Twitter</a></li>
|
||||||
|
{% endif %}
|
||||||
|
{% if author.facebook %}
|
||||||
|
<li><a href="https://www.facebook.com/{{ author.facebook }}"><i class="fa fa-fw fa-facebook-square" aria-hidden="true"></i> Facebook</a></li>
|
||||||
|
{% endif %}
|
||||||
|
{% if author.google_plus %}
|
||||||
|
<li><a href="https://plus.google.com/+{{ author.google_plus }}"><i class="fa fa-fw fa-google-plus-square" aria-hidden="true"></i> Google+</a></li>
|
||||||
|
{% endif %}
|
||||||
|
{% if author.linkedin %}
|
||||||
|
<li><a href="https://www.linkedin.com/in/{{ author.linkedin }}"><i class="fa fa-fw fa-linkedin-square" aria-hidden="true"></i> LinkedIn</a></li>
|
||||||
|
{% endif %}
|
||||||
|
{% if author.xing %}
|
||||||
|
<li><a href="https://www.xing.com/profile/{{ author.xing }}"><i class="fa fa-fw fa-xing-square" aria-hidden="true"></i> XING</a></li>
|
||||||
|
{% endif %}
|
||||||
|
{% if author.instagram %}
|
||||||
|
<li><a href="https://instagram.com/{{ author.instagram }}"><i class="fa fa-fw fa-instagram" aria-hidden="true"></i> Instagram</a></li>
|
||||||
|
{% endif %}
|
||||||
|
{% if author.tumblr %}
|
||||||
|
<li><a href="https://{{ author.tumblr }}.tumblr.com"><i class="fa fa-fw fa-tumblr-square" aria-hidden="true"></i> Tumblr</a></li>
|
||||||
|
{% endif %}
|
||||||
|
{% if author.bitbucket %}
|
||||||
|
<li><a href="https://bitbucket.org/{{ author.bitbucket }}"><i class="fa fa-fw fa-bitbucket" aria-hidden="true"></i> Bitbucket</a></li>
|
||||||
|
{% endif %}
|
||||||
|
{% if author.github %}
|
||||||
|
<li><a href="https://github.com/{{ author.github }}"><i class="fa fa-fw fa-github" aria-hidden="true"></i> Github</a></li>
|
||||||
|
{% endif %}
|
||||||
|
{% if author.stackoverflow %}
|
||||||
|
<li><a href="https://www.stackoverflow.com/users/{{ author.stackoverflow }}"><i class="fa fa-fw fa-stack-overflow" aria-hidden="true"></i> Stackoverflow</a></li>
|
||||||
|
{% endif %}
|
||||||
|
{% if author.lastfm %}
|
||||||
|
<li><a href="https://last.fm/user/{{ author.lastfm }}"><i class="fa fa-fw fa-lastfm-square" aria-hidden="true"></i> Last.fm</a></li>
|
||||||
|
{% endif %}
|
||||||
|
{% if author.dribbble %}
|
||||||
|
<li><a href="https://dribbble.com/{{ author.dribbble }}"><i class="fa fa-fw fa-dribbble" aria-hidden="true"></i> Dribbble</a></li>
|
||||||
|
{% endif %}
|
||||||
|
{% if author.pinterest %}
|
||||||
|
<li><a href="https://www.pinterest.com/{{ author.pinterest }}"><i class="fa fa-fw fa-pinterest" aria-hidden="true"></i> Pinterest</a></li>
|
||||||
|
{% endif %}
|
||||||
|
{% if author.foursquare %}
|
||||||
|
<li><a href="https://foursquare.com/{{ author.foursquare }}"><i class="fa fa-fw fa-foursquare" aria-hidden="true"></i> Foursquare</a></li>
|
||||||
|
{% endif %}
|
||||||
|
{% if author.steam %}
|
||||||
|
<li><a href="https://steamcommunity.com/id/{{ author.steam }}"><i class="fa fa-fw fa-steam-square" aria-hidden="true"></i> Steam</a></li>
|
||||||
|
{% endif %}
|
||||||
|
{% if author.youtube %}
|
||||||
|
<li><a href="https://www.youtube.com/user/{{ author.youtube }}"><i class="fa fa-fw fa-youtube-square" aria-hidden="true"></i> YouTube</a></li>
|
||||||
|
{% endif %}
|
||||||
|
{% if author.soundcloud %}
|
||||||
|
<li><a href="https://soundcloud.com/{{ author.soundcloud }}"><i class="fa fa-fw fa-soundcloud" aria-hidden="true"></i> Soundcloud</a></li>
|
||||||
|
{% endif %}
|
||||||
|
{% if author.weibo %}
|
||||||
|
<li><a href="https://www.weibo.com/{{ author.weibo }}"><i class="fa fa-fw fa-weibo" aria-hidden="true"></i> Weibo</a></li>
|
||||||
|
{% endif %}
|
||||||
|
{% if author.flickr %}
|
||||||
|
<li><a href="https://www.flickr.com/{{ author.flickr }}"><i class="fa fa-fw fa-flickr" aria-hidden="true"></i> Flickr</a></li>
|
||||||
|
{% endif %}
|
||||||
|
{% if author.codepen %}
|
||||||
|
<li><a href="https://codepen.io/{{ author.codepen }}"><i class="fa fa-fw fa-codepen" aria-hidden="true"></i> CodePen</a></li>
|
||||||
|
{% endif %}
|
||||||
|
{% if author.vine %}
|
||||||
|
<li><a href="https://vine.co/u/{{ author.vine }}"><i class="fa fa-fw fa-vine" aria-hidden="true"></i> Vine</a></li>
|
||||||
|
{% endif %}
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
{% if site.url %}
|
||||||
|
{% assign base_path = site.url | append: site.baseurl %}
|
||||||
|
{% else %}
|
||||||
|
{% assign base_path = site.github.url %}
|
||||||
|
{% endif %}
|
||||||
@@ -0,0 +1,41 @@
|
|||||||
|
{% include base_path %}
|
||||||
|
|
||||||
|
{% case site.categories.type %}
|
||||||
|
{% when "liquid" %}
|
||||||
|
{% assign path_type = "#" %}
|
||||||
|
{% when "jekyll-archives" %}
|
||||||
|
{% assign path_type = nil %}
|
||||||
|
{% endcase %}
|
||||||
|
|
||||||
|
{% if page.collection != 'posts' %}
|
||||||
|
{% assign path_type = nil %}
|
||||||
|
{% assign crumb_path = '/' %}
|
||||||
|
{% else %}
|
||||||
|
{% assign crumb_path = site.categories.path %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
<nav class="breadcrumbs">
|
||||||
|
<ol itemscope itemtype="http://schema.org/BreadcrumbList">
|
||||||
|
{% assign crumbs = page.url | split: '/' %}
|
||||||
|
{% assign i = 1 %}
|
||||||
|
{% for crumb in crumbs offset: 1 %}
|
||||||
|
{% if forloop.first %}
|
||||||
|
<li itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem">
|
||||||
|
<a href="{{ base_path }}/" itemprop="item"><span itemprop="name">{{ site.data.ui-text[site.locale].breadcrumb_home_label | default: "Home" }}</span></a>
|
||||||
|
<meta itemprop="position" content="{{ i }}" />
|
||||||
|
</li>
|
||||||
|
<span class="sep">{{ site.data.ui-text[site.locale].breadcrumb_separator | default: "/" }}</span>
|
||||||
|
{% endif %}
|
||||||
|
{% if forloop.last %}
|
||||||
|
<li class="current">{{ page.title }}</li>
|
||||||
|
{% else %}
|
||||||
|
{% assign i = i | plus: 1 %}
|
||||||
|
<li itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem">
|
||||||
|
<a href="{{ base_path }}{{ crumb | downcase | replace: '%20', '-' | prepend: path_type | prepend: crumb_path }}" itemprop="item"><span itemprop="name">{{ crumb | replace: '-', ' ' | replace: '%20', ' ' | capitalize }}</span></a>
|
||||||
|
<meta itemprop="position" content="{{ i }}" />
|
||||||
|
</li>
|
||||||
|
<span class="sep">{{ site.data.ui-text[site.locale].breadcrumb_separator | default: "/" }}</span>
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
</ol>
|
||||||
|
</nav>
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
<!--[if lt IE 9]>
|
||||||
|
<div class="notice--danger align-center" style="margin: 0;">You are using an <strong>outdated</strong> browser. Please <a href="http://browsehappy.com/">upgrade your browser</a> to improve your experience.</div>
|
||||||
|
<![endif]-->
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
{% include base_path %}
|
||||||
|
|
||||||
|
{% case site.category_archive.type %}
|
||||||
|
{% when "liquid" %}
|
||||||
|
{% assign path_type = "#" %}
|
||||||
|
{% when "jekyll-archives" %}
|
||||||
|
{% assign path_type = nil %}
|
||||||
|
{% endcase %}
|
||||||
|
|
||||||
|
{% if site.category_archive.path %}
|
||||||
|
{% comment %}
|
||||||
|
<!-- Sort alphabetically regardless of case e.g. a B c d E -->
|
||||||
|
<!-- modified from http://www.codeofclimber.ru/2015/sorting-site-tags-in-jekyll/ -->
|
||||||
|
{% endcomment %}
|
||||||
|
{% capture page_categories %}{% for category in page.categories %}{{ category | downcase }}#{{ category }}{% unless forloop.last %},{% endunless %}{% endfor %}{% endcapture %}
|
||||||
|
{% assign category_hashes = (page_categories | split: ',' | sort:0) %}
|
||||||
|
|
||||||
|
<p class="page__taxonomy">
|
||||||
|
<strong><i class="fa fa-fw fa-folder-open" aria-hidden="true"></i> {{ site.data.ui-text[site.locale].categories_label | default: "Categories:" }} </strong>
|
||||||
|
<span itemprop="keywords">
|
||||||
|
{% for hash in category_hashes %}
|
||||||
|
{% assign keyValue = hash | split: '#' %}
|
||||||
|
{% capture category_word %}{{ keyValue[1] | strip_newlines }}{% endcapture %}
|
||||||
|
<a href="{{ base_path }}{{ category_word | slugify | prepend: path_type | prepend: site.category_archive.path }}" class="page__taxonomy-item" rel="tag">{{ category_word }}</a>{% unless forloop.last %}<span class="sep">, </span>{% endunless %}
|
||||||
|
{% endfor %}
|
||||||
|
</span>
|
||||||
|
</p>
|
||||||
|
{% endif %}
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
<article id="comment{{ include.index }}" class="js-comment comment" itemprop="comment" itemscope itemtype="http://schema.org/Comment">
|
||||||
|
<div class="comment__avatar-wrapper">
|
||||||
|
<img class="comment__avatar" src="https://www.gravatar.com/avatar/{{ include.email }}?d=mm&s=80">
|
||||||
|
</div>
|
||||||
|
<div class="comment__content-wrapper">
|
||||||
|
<h3 class="comment__author" itemprop="author" itemscope itemtype="http://schema.org/Person">
|
||||||
|
{% unless include.url == blank %}
|
||||||
|
<span itemprop="name"><a rel="external nofollow" itemprop="url" href="{{ include.url }}">{{ include.name }}</a></span>
|
||||||
|
{% else %}
|
||||||
|
<span itemprop="name">{{ include.name }}</span>
|
||||||
|
{% endunless %}
|
||||||
|
</h3>
|
||||||
|
<p class="comment__date">
|
||||||
|
{% if include.date %}
|
||||||
|
{% if include.index %}<a href="#comment{{ include.index }}" itemprop="url">{% endif %}
|
||||||
|
<time datetime="{{ include.date | date_to_xmlschema }}" itemprop="datePublished">{{ include.date | date: "%B %d, %Y at %I:%M %p" }}</time>
|
||||||
|
{% if include.index %}</a>{% endif %}
|
||||||
|
{% endif %}
|
||||||
|
</p>
|
||||||
|
<div itemprop="text">{{ include.message | markdownify }}</div>
|
||||||
|
</div>
|
||||||
|
</article>
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
<!-- start custom comments snippet -->
|
||||||
|
|
||||||
|
<!-- end custom comments snippet -->
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
{% if site.comments.discourse.server %}
|
||||||
|
{% include base_path %}
|
||||||
|
{% capture canonical %}{{ base_path }}{% if site.permalink contains '.html' %}{{ page.url }}{% else %}{{ page.url | remove:'index.html' | strip_slash }}{% endif %}{% endcapture %}
|
||||||
|
<script type="text/javascript">
|
||||||
|
DiscourseEmbed = { discourseUrl: '//{{ site.comments.discourse.server }}/',
|
||||||
|
discourseEmbedUrl: '{{ canonical }}' };
|
||||||
|
(function () {
|
||||||
|
var d = document.createElement('script'); d.type = 'text/javascript'; d.async = true;
|
||||||
|
d.src = DiscourseEmbed.discourseUrl + 'javascripts/embed.js';
|
||||||
|
(document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(d);
|
||||||
|
})();
|
||||||
|
</script>
|
||||||
|
<noscript>Please enable JavaScript to view the comments powered by [Discourse](http://forum.beta-europe.org/c/beta/website).</a></noscript>
|
||||||
|
{% endif %}
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
{% if site.comments.disqus.shortname %}
|
||||||
|
<script type="text/javascript">
|
||||||
|
/* * * CONFIGURATION VARIABLES: EDIT BEFORE PASTING INTO YOUR WEBPAGE * * */
|
||||||
|
var disqus_shortname = '{{ site.comments.disqus.shortname }}';
|
||||||
|
|
||||||
|
/* * * DON'T EDIT BELOW THIS LINE * * */
|
||||||
|
(function() {
|
||||||
|
var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;
|
||||||
|
dsq.src = '//' + disqus_shortname + '.disqus.com/embed.js';
|
||||||
|
(document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
|
||||||
|
})();
|
||||||
|
|
||||||
|
/* * * DON'T EDIT BELOW THIS LINE * * */
|
||||||
|
(function () {
|
||||||
|
var s = document.createElement('script'); s.async = true;
|
||||||
|
s.type = 'text/javascript';
|
||||||
|
s.src = '//' + disqus_shortname + '.disqus.com/count.js';
|
||||||
|
(document.getElementsByTagName('HEAD')[0] || document.getElementsByTagName('BODY')[0]).appendChild(s);
|
||||||
|
}());
|
||||||
|
</script>
|
||||||
|
<noscript>Please enable JavaScript to view the <a href="http://disqus.com/?ref_noscript">comments powered by Disqus.</a></noscript>
|
||||||
|
{% endif %}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
<div id="fb-root"></div>
|
||||||
|
<script>(function(d, s, id) {
|
||||||
|
var js, fjs = d.getElementsByTagName(s)[0];
|
||||||
|
if (d.getElementById(id)) return;
|
||||||
|
js = d.createElement(s); js.id = id;
|
||||||
|
js.src = "//connect.facebook.net/en_US/sdk.js#xfbml=1&version=v2.5{% if site.comments.facebook.appid %}&appId={{ site.comments.facebook.appid }}{% endif %}";
|
||||||
|
fjs.parentNode.insertBefore(js, fjs);
|
||||||
|
}(document, 'script', 'facebook-jssdk'));</script>
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
<script async type="text/javascript" src="//apis.google.com/js/plusone.js?callback=gpcb"></script>
|
||||||
|
<noscript>Please enable JavaScript to view the <a href="https://plus.google.com/">comments powered by Google+.</a></noscript>
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
{% if site.comments.provider and page.comments %}
|
||||||
|
|
||||||
|
{% case site.comments.provider %}
|
||||||
|
{% when "disqus" %}
|
||||||
|
{% include /comments-providers/disqus.html %}
|
||||||
|
{% when "discourse" %}
|
||||||
|
{% include /comments-providers/discourse.html %}
|
||||||
|
{% when "facebook" %}
|
||||||
|
{% include /comments-providers/facebook.html %}
|
||||||
|
{% when "google-plus" %}
|
||||||
|
{% include /comments-providers/google-plus.html %}
|
||||||
|
{% when "staticman" %}
|
||||||
|
{% include /comments-providers/staticman.html %}
|
||||||
|
{% when "custom" %}
|
||||||
|
{% include /comments-providers/custom.html %}
|
||||||
|
{% endcase %}
|
||||||
|
|
||||||
|
{% endif %}
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
{% if site.repository and site.staticman.branch %}
|
||||||
|
<script>
|
||||||
|
(function ($) {
|
||||||
|
var $comments = $('.js-comments');
|
||||||
|
|
||||||
|
$('#new_comment').submit(function () {
|
||||||
|
var form = this;
|
||||||
|
|
||||||
|
$(form).addClass('disabled');
|
||||||
|
$('#comment-form-submit').html('<i class="fa fa-spinner fa-spin fa-fw"></i> {{ site.data.ui-text[site.locale].loading_label | default: "Loading..." }}');
|
||||||
|
|
||||||
|
$.ajax({
|
||||||
|
type: $(this).attr('method'),
|
||||||
|
url: $(this).attr('action'),
|
||||||
|
data: $(this).serialize(),
|
||||||
|
contentType: 'application/x-www-form-urlencoded',
|
||||||
|
success: function (data) {
|
||||||
|
$('#comment-form-submit').html('{{ site.data.ui-text[site.locale].comment_btn_submitted | default: "Submitted" }}');
|
||||||
|
$('.page__comments-form .js-notice').removeClass('notice--danger');
|
||||||
|
$('.page__comments-form .js-notice').addClass('notice--success');
|
||||||
|
showAlert('{{ site.data.ui-text[site.locale].comment_success_msg | default: "Thanks for your comment! It will show on the site once it has been approved." }}');
|
||||||
|
},
|
||||||
|
error: function (err) {
|
||||||
|
console.log(err);
|
||||||
|
$('#comment-form-submit').html('{{ site.data.ui-text[site.locale].comment_btn_submit | default: "Submit Comment" }}');
|
||||||
|
$('.page__comments-form .js-notice').removeClass('notice--success');
|
||||||
|
$('.page__comments-form .js-notice').addClass('notice--danger');
|
||||||
|
showAlert('{{ site.data.ui-text[site.locale].comment_error_msg | default: "Sorry, there was an error with your submission. Please make sure all required fields have been completed and try again." }}');
|
||||||
|
$(form).removeClass('disabled');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
|
||||||
|
function showAlert(message) {
|
||||||
|
$('.page__comments-form .js-notice').removeClass('hidden');
|
||||||
|
$('.page__comments-form .js-notice-text').html(message);
|
||||||
|
}
|
||||||
|
})(jQuery);
|
||||||
|
</script>
|
||||||
|
{% endif %}
|
||||||
@@ -0,0 +1,82 @@
|
|||||||
|
{% include base_path %}
|
||||||
|
|
||||||
|
<div class="page__comments">
|
||||||
|
{% capture comments_label %}{{ site.data.ui-text[site.locale].comments_label | default: "Comments" }}{% endcapture %}
|
||||||
|
{% case site.comments.provider %}
|
||||||
|
{% when "disqus" %}
|
||||||
|
<h4 class="page__comments-title">{{ comments_label }}</h4>
|
||||||
|
<section id="disqus_thread"></section>
|
||||||
|
{% when "facebook" %}
|
||||||
|
<h4 class="page__comments-title">{{ comments_label }}</h4>
|
||||||
|
<section class="fb-comments" data-href="{{ base_path }}{{ page.url }}" data-mobile="true" data-num-posts="{{ site.comments.facebook.num_posts | default: 5 }}" data-width="100%" data-colorscheme="{{ site.comments.facebook.colorscheme | default: 'light' }}"></section>
|
||||||
|
{% when "google-plus" %}
|
||||||
|
<h4 class="page__comments-title">{{ comments_label }}</h4>
|
||||||
|
<section class="g-comments" data-href="{{ base_path }}{{ page.url }}" data-first_party_property="BLOGGER" data-view_type="FILTERED_POSTMOD">Loading Google+ Comments ...</section>
|
||||||
|
{% when "staticman" %}
|
||||||
|
<section id="comments">
|
||||||
|
{% if site.repository and site.staticman.branch %}
|
||||||
|
<!-- Start static comments -->
|
||||||
|
<div class="js-comments">
|
||||||
|
{% if site.data.comments[page.slug] %}
|
||||||
|
<h4 class="page__comments-title">{{ site.data.ui-text[site.locale].comments_title | default: "Comments" }}</h4>
|
||||||
|
{% assign comments = site.data.comments[page.slug] | sort %}
|
||||||
|
|
||||||
|
{% for comment in comments %}
|
||||||
|
{% assign email = comment[1].email %}
|
||||||
|
{% assign name = comment[1].name %}
|
||||||
|
{% assign url = comment[1].url %}
|
||||||
|
{% assign date = comment[1].date %}
|
||||||
|
{% assign message = comment[1].message %}
|
||||||
|
{% include comment.html index=forloop.index email=email name=name url=url date=date message=message %}
|
||||||
|
{% endfor %}
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
<!-- End static comments -->
|
||||||
|
|
||||||
|
<!-- Start new comment form -->
|
||||||
|
<h4 class="page__comments-title">{{ site.data.ui-text[site.locale].comments_label | default: "Leave a Comment" }}</h4>
|
||||||
|
<p class="small">{{ site.data.ui-text[site.locale].comment_form_info | default: "Your email address will not be published. Required fields are marked" }} <span class="required">*</span></p>
|
||||||
|
<form id="new_comment" class="page__comments-form js-form form" method="post" action="https://api.staticman.net/v1/entry/{{ site.repository }}/{{ site.staticman.branch }}">
|
||||||
|
<div class="form__spinner">
|
||||||
|
<i class="fa fa-spinner fa-spin fa-3x fa-fw"></i>
|
||||||
|
<span class="sr-only">{{ site.data.ui-text[site.locale].loading_label | default: "Loading..." }}</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<fieldset>
|
||||||
|
<label for="comment-form-message">{{ site.data.ui-text[site.locale].comment_form_comment_label | default: "Comment" }} <small class="required">*</small></label>
|
||||||
|
<textarea type="text" rows="3" id="comment-form-message" name="fields[message]" tabindex="1"></textarea>
|
||||||
|
<div class="small help-block"><a href="https://daringfireball.net/projects/markdown/">{{ site.data.ui-text[site.locale].comment_form_md_info | default: "Markdown is supported." }}</a></div>
|
||||||
|
</fieldset>
|
||||||
|
<fieldset>
|
||||||
|
<label for="comment-form-name">{{ site.data.ui-text[site.locale].comment_form_name_label | default: "Name" }} <small class="required">*</small></label>
|
||||||
|
<input type="text" id="comment-form-name" name="fields[name]" tabindex="2" />
|
||||||
|
</fieldset>
|
||||||
|
<fieldset>
|
||||||
|
<label for="comment-form-email">{{ site.data.ui-text[site.locale].comment_form_email_label | default: "Email address" }} <small class="required">*</small></label>
|
||||||
|
<input type="email" id="comment-form-email" name="fields[email]" tabindex="3" />
|
||||||
|
</fieldset>
|
||||||
|
<fieldset>
|
||||||
|
<label for="comment-form-url">{{ site.data.ui-text[site.locale].comment_form_website_label | default: "Website (optional)" }}</label>
|
||||||
|
<input type="url" id="comment-form-url" name="fields[url]" tabindex="4"/>
|
||||||
|
</fieldset>
|
||||||
|
<fieldset class="hidden" style="display: none;">
|
||||||
|
<input type="hidden" name="options[slug]" value="{{ page.slug }}">
|
||||||
|
<label for="comment-form-location">Not used. Leave blank if you are a human.</label>
|
||||||
|
<input type="text" id="comment-form-location" name="fields[hidden]" autocomplete="off"/>
|
||||||
|
</fieldset>
|
||||||
|
<!-- Start comment form alert messaging -->
|
||||||
|
<p class="hidden js-notice">
|
||||||
|
<strong class="js-notice-text"></strong>
|
||||||
|
</p>
|
||||||
|
<!-- End comment form alert messaging -->
|
||||||
|
<fieldset>
|
||||||
|
<button type="submit" id="comment-form-submit" tabindex="5" class="btn btn--large">{{ site.data.ui-text[site.locale].comment_btn_submit | default: "Submit Comment" }}</button>
|
||||||
|
</fieldset>
|
||||||
|
</form>
|
||||||
|
<!-- End new comment form -->
|
||||||
|
{% endif %}
|
||||||
|
</section>
|
||||||
|
{% when "custom" %}
|
||||||
|
<section id="comments"></section>
|
||||||
|
{% endcase %}
|
||||||
|
</div>
|
||||||
@@ -0,0 +1,52 @@
|
|||||||
|
{% include base_path %}
|
||||||
|
|
||||||
|
{% if include.id %}
|
||||||
|
{% assign feature_row = page.[include.id] %}
|
||||||
|
{% else %}
|
||||||
|
{% assign feature_row = page.feature_row %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
<div class="feature__wrapper">
|
||||||
|
|
||||||
|
{% for f in feature_row %}
|
||||||
|
|
||||||
|
{% if f.url contains "://" %}
|
||||||
|
{% capture f_url %}{{ f.url }}{% endcapture %}
|
||||||
|
{% else %}
|
||||||
|
{% capture f_url %}{{ f.url | prepend: base_path }}{% endcapture %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
<div class="feature__item{% if include.type %}--{{ include.type }}{% endif %}">
|
||||||
|
<div class="archive__item">
|
||||||
|
{% if f.image_path %}
|
||||||
|
<div class="archive__item-teaser">
|
||||||
|
<img src=
|
||||||
|
{% if f.image_path contains "://" %}
|
||||||
|
"{{ f.image_path }}"
|
||||||
|
{% else %}
|
||||||
|
"{{ f.image_path | prepend: "/images/" | prepend: base_path }}"
|
||||||
|
{% endif %}
|
||||||
|
alt="{% if f.alt %}{{ f.alt }}{% endif %}">
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
<div class="archive__item-body">
|
||||||
|
{% if f.title %}
|
||||||
|
<h2 class="archive__item-title">{{ f.title }}</h2>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if f.excerpt %}
|
||||||
|
<div class="archive__item-excerpt">
|
||||||
|
{{ f.excerpt | markdownify }}
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if f.url %}
|
||||||
|
<p><a href="{{ f_url }}" class="btn {{ f.btn_class }}">{{ f.btn_label | default: site.data.ui-text[site.locale].more_label | default: "Learn More" }}</a></p>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
|
</div>
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
{% include base_path %}
|
||||||
|
|
||||||
|
<div class="page__footer-follow">
|
||||||
|
<ul class="social-icons">
|
||||||
|
{% if site.data.ui-text[site.locale].follow_label %}
|
||||||
|
<li><strong>{{ site.data.ui-text[site.locale].follow_label }}</strong></li>
|
||||||
|
{% endif %}
|
||||||
|
{% if site.twitter.username %}
|
||||||
|
<li><a href="https://twitter.com/{{ site.twitter.username }}"><i class="fa fa-fw fa-twitter-square" aria-hidden="true"></i> Twitter</a></li>
|
||||||
|
{% endif %}
|
||||||
|
{% if site.facebook.username %}
|
||||||
|
<li><a href="https://facebook.com/{{ site.facebook.username }}"><i class="fa fa-fw fa-facebook-square" aria-hidden="true"></i> Facebook</a></li>
|
||||||
|
{% endif %}
|
||||||
|
{% if site.author.github %}
|
||||||
|
<li><a href="http://github.com/{{ site.author.github }}"><i class="fa fa-fw fa-github" aria-hidden="true"></i> GitHub</a></li>
|
||||||
|
{% endif %}
|
||||||
|
{% if site.author.bitbucket %}
|
||||||
|
<li><a href="http://bitbucket.org/{{ site.author.bitbucket }}"><i class="fa fa-fw fa-bitbucket" aria-hidden="true"></i> Bitbucket</a></li>
|
||||||
|
{% endif %}
|
||||||
|
<li><a href="{% if site.atom_feed.path %}{{ site.atom_feed.path }}{% else %}{{ base_path }}/feed.xml{% endif %}"><i class="fa fa-fw fa-rss-square" aria-hidden="true"></i> {{ site.data.ui-text[site.locale].feed_label | default: "Feed" }}</a></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="page__footer-copyright">© {{ site.time | date: '%Y' }} {{ site.name | default: site.title }}. {{ site.data.ui-text[site.locale].powered_by | default: "Powered by" }} <a href="http://jekyllrb.com" rel="nofollow">Jekyll</a> & <a href="https://mademistakes.com/work/minimal-mistakes-jekyll-theme/" rel="nofollow">Minimal Mistakes</a>.</div>
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
<!-- start custom footer snippets -->
|
||||||
|
|
||||||
|
<!-- end custom footer snippets -->
|
||||||
@@ -0,0 +1,49 @@
|
|||||||
|
{% include base_path %}
|
||||||
|
|
||||||
|
{% if include.id %}
|
||||||
|
{% assign gallery = page.[include.id] %}
|
||||||
|
{% else %}
|
||||||
|
{% assign gallery = page.gallery %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if gallery.size == 2 %}
|
||||||
|
{% assign gallery_layout = 'half' %}
|
||||||
|
{% elsif gallery.size >= 3 %}
|
||||||
|
{% assign gallery_layout = 'third' %}
|
||||||
|
{% else %}
|
||||||
|
{% assign gallery_layout = '' %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
<figure class="{{ gallery_layout }} {{ include.class }}">
|
||||||
|
{% for img in gallery %}
|
||||||
|
{% if img.url %}
|
||||||
|
<a href=
|
||||||
|
{% if img.url contains "://" %}
|
||||||
|
"{{ img.url }}"
|
||||||
|
{% else %}
|
||||||
|
"{{ img.url | prepend: "/images/" | prepend: base_path }}"
|
||||||
|
{% endif %}
|
||||||
|
{% if img.title %}title="{{ img.title }}"{% endif %}
|
||||||
|
>
|
||||||
|
<img src=
|
||||||
|
{% if img.image_path contains "://" %}
|
||||||
|
"{{ img.image_path }}"
|
||||||
|
{% else %}
|
||||||
|
"{{ img.image_path | prepend: "/images/" | prepend: base_path }}"
|
||||||
|
{% endif %}
|
||||||
|
alt="{% if img.alt %}{{ img.alt }}{% endif %}">
|
||||||
|
</a>
|
||||||
|
{% else %}
|
||||||
|
<img src=
|
||||||
|
{% if img.image_path contains "://" %}
|
||||||
|
"{{ img.image_path }}"
|
||||||
|
{% else %}
|
||||||
|
"{{ img.image_path | prepend: "/images/" | prepend: base_path }}"
|
||||||
|
{% endif %}
|
||||||
|
alt="{% if img.alt %}{{ img.alt }}{% endif %}">
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
{% if include.caption %}
|
||||||
|
<figcaption>{{ include.caption | markdownify | remove: "<p>" | remove: "</p>" }}</figcaption>
|
||||||
|
{% endif %}
|
||||||
|
</figure>
|
||||||
@@ -0,0 +1,47 @@
|
|||||||
|
<!--
|
||||||
|
# Jekyll Group-By-Array 0.1.0
|
||||||
|
# https://github.com/mushishi78/jekyll-group-by-array
|
||||||
|
# © 2015 Max White <mushishi78@gmail.com>
|
||||||
|
# MIT License
|
||||||
|
-->
|
||||||
|
|
||||||
|
<!-- Initialize -->
|
||||||
|
{% assign __empty_array = '' | split: ',' %}
|
||||||
|
{% assign group_names = __empty_array %}
|
||||||
|
{% assign group_items = __empty_array %}
|
||||||
|
|
||||||
|
<!-- Map -->
|
||||||
|
{% assign __names = include.collection | map: include.field %}
|
||||||
|
|
||||||
|
<!-- Flatten -->
|
||||||
|
{% assign __names = __names | join: ',' | join: ',' | split: ',' %}
|
||||||
|
|
||||||
|
<!-- Uniq -->
|
||||||
|
{% assign __names = __names | sort %}
|
||||||
|
{% for name in __names | sort %}
|
||||||
|
|
||||||
|
<!-- If not equal to previous then it must be unique as sorted -->
|
||||||
|
{% unless name == previous %}
|
||||||
|
|
||||||
|
<!-- Push to group_names -->
|
||||||
|
{% assign group_names = group_names | push: name %}
|
||||||
|
{% endunless %}
|
||||||
|
|
||||||
|
{% assign previous = name %}
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
|
|
||||||
|
<!-- group_items -->
|
||||||
|
{% for name in group_names %}
|
||||||
|
|
||||||
|
<!-- Collect if contains -->
|
||||||
|
{% assign __item = __empty_array %}
|
||||||
|
{% for __element in include.collection %}
|
||||||
|
{% if __element[include.field] contains name %}
|
||||||
|
{% assign __item = __item | push: __element %}
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
|
<!-- Push to group_items -->
|
||||||
|
{% assign group_items = group_items | push: __item %}
|
||||||
|
{% endfor %}
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
{% include base_path %}
|
||||||
|
|
||||||
|
<meta charset="utf-8">
|
||||||
|
|
||||||
|
{% include seo.html %}
|
||||||
|
|
||||||
|
<link href="{% if site.atom_feed.path %}{{ site.atom_feed.path }}{% else %}{{ base_path }}/feed.xml{% endif %}" type="application/atom+xml" rel="alternate" title="{{ site.title }} Feed">
|
||||||
|
|
||||||
|
<!-- http://t.co/dKP3o1e -->
|
||||||
|
<meta name="HandheldFriendly" content="True">
|
||||||
|
<meta name="MobileOptimized" content="320">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
|
||||||
|
<script>
|
||||||
|
document.documentElement.className = document.documentElement.className.replace(/\bno-js\b/g, '') + ' js ';
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<!-- For all browsers -->
|
||||||
|
<link rel="stylesheet" href="{{ base_path }}/assets/css/main.css">
|
||||||
|
<link rel="stylesheet" href="{{ base_path }}/assets/icons/octicons/font/octicons.min.css">
|
||||||
|
|
||||||
|
<meta http-equiv="cleartype" content="on">
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
<!-- start custom head snippets -->
|
||||||
|
|
||||||
|
<!-- insert favicons. use http://realfavicongenerator.net/ -->
|
||||||
|
<link rel='shortcut icon' type='image/x-icon' href='{{ site.baseurl }}/images/favicon-32x32.png' />
|
||||||
|
|
||||||
|
<!-- end custom head snippets -->
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
{% include base_path %}
|
||||||
|
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
<meta name="description" content="{% if page.summary %}{{ page.summary | strip_html | strip_newlines | truncate: 160 }}{% endif %}">
|
||||||
|
<meta name="keywords" content="{{page.tags}}{% if page.tags %}, {% endif %} {{page.keywords}}">
|
||||||
|
<title>{% if page.homepage == true %} {{site.title}} {% elsif page.title %}{{ page.title }}{% endif %}</title>
|
||||||
|
|
||||||
|
|
||||||
|
<link rel="stylesheet" href="{{ "/css/customstyles.css" | prepend: site.baseurl | prepend: site.url }}">
|
||||||
|
<link rel="stylesheet" href="{{ "/css/printstyles.css" | prepend: site.baseurl | prepend: site.url }}">
|
||||||
|
<link rel="stylesheet" href="{{ "/css/font-awesome.min.css" | prepend: site.baseurl | prepend: site.url }}">
|
||||||
|
<link rel="stylesheet" href="{{site.url}}/{{site.baseurl}}/css/pygments/{{site.pygments-css}}.css">
|
||||||
|
|
||||||
|
<!--
|
||||||
|
<link rel="stylesheet" href="{{ "/css/bootstrap.min.css" | prepend: site.baseurl | prepend: site.url }}">
|
||||||
|
<link rel="stylesheet" href="{{ "/css/modern-business.css" | prepend: site.baseurl | prepend: site.url }}">
|
||||||
|
<link rel="stylesheet" href="{{ "/css/theme-blue.css" | prepend: site.baseurl | prepend: site.url }}">
|
||||||
|
<link rel="stylesheet" href="{{ "/css/syntax.css" | prepend: site.baseurl | prepend: site.url }}">
|
||||||
|
/-->
|
||||||
|
|
||||||
|
<script>
|
||||||
|
Prince.addScriptFunc("datestamp", function() {
|
||||||
|
return "PDF last generated: {{ site.time | date: '%B %d, %Y' }}";
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
Prince.addScriptFunc("guideName", function() {
|
||||||
|
return "{{site.title}} User Guide";
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
|
||||||
|
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.2/MathJax.js?config=TeX-MML-AM_CHTML"></script>
|
||||||
|
<script type="text/javascript" src="{{ base_path }}/assets/js/ConfigMathJax.js"></script>
|
||||||
|
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
{% capture imagePath %}/{{ include.name }}{% endcapture %}
|
||||||
|
{% if include.caption %}
|
||||||
|
<figure>
|
||||||
|
<img src="{{ site.baseurl }}/images{{ imagePath }}" {% if include.alt %} alt="{{ include.alt }}" {% endif %} {% if include.width %} width="{{ include.width }}" style="display: block; margin-left: auto; margin-right: auto" {% endif %}/>
|
||||||
|
<figcaption>{{ include.caption }}</figcaption>
|
||||||
|
</figure>
|
||||||
|
{% else %}
|
||||||
|
<img src="{{ site.baseurl }}/images{{ imagePath }}" {% if include.alt %} alt="{{ include.alt }}" {% endif %} {% if include.width %} width="{{ include.width }}" style="display: block; margin-left: auto; margin-right: auto" {% endif %}/>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
{% include base_path %}
|
||||||
|
|
||||||
|
<div class="masthead">
|
||||||
|
<div class="masthead__inner-wrap">
|
||||||
|
<div class="masthead__menu">
|
||||||
|
<nav id="site-nav" class="greedy-nav">
|
||||||
|
<button><div class="navicon"></div></button>
|
||||||
|
<ul class="visible-links">
|
||||||
|
<li class="masthead__menu-item masthead__menu-item--lg"><a href="{{ base_path }}/">{{ site.title }}</a></li>
|
||||||
|
{% for link in site.data.navigation.main %}
|
||||||
|
{% if link.url contains 'http' %}
|
||||||
|
{% assign domain = '' %}
|
||||||
|
{% else %}
|
||||||
|
{% assign domain = base_path %}
|
||||||
|
{% endif %}
|
||||||
|
<li class="masthead__menu-item"><a href="{{ domain }}{{ link.url }}"><span class="{{ link.icon }}"></span> {{ link.title }}</a></li>
|
||||||
|
{% endfor %}
|
||||||
|
<li class="masthead__menu-item"><a href="https://github.com/paboyle/Grid" title="Github repository page"><span class="mega-octicon octicon-mark-github vertical-middle"></span></a></li>
|
||||||
|
</ul>
|
||||||
|
<ul class="hidden-links hidden"></ul>
|
||||||
|
</nav>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
@@ -0,0 +1,52 @@
|
|||||||
|
{% include base_path %}
|
||||||
|
{% assign navigation = site.data.navigation[include.nav] %}
|
||||||
|
|
||||||
|
<nav class="nav__list">
|
||||||
|
{% if page.sidebar.title %}<header><h4 class="nav__title" style="padding: 0;">{{ page.sidebar.title }}</h4></header>{% endif %}
|
||||||
|
<ul>
|
||||||
|
{% for nav in navigation %}
|
||||||
|
<li>
|
||||||
|
{% if nav.url %}
|
||||||
|
{% comment %}internal/external URL check{% endcomment %}
|
||||||
|
{% if nav.url contains "://" %}
|
||||||
|
{% assign domain = "" %}
|
||||||
|
{% else %}
|
||||||
|
{% assign domain = base_path %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
<a href="{{ domain }}{{ nav.url }}"><span class="nav__sub-title">{{ nav.title }}</span></a>
|
||||||
|
{% else %}
|
||||||
|
<span class="nav__sub-title">{{ nav.title }}</span>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if nav.children != null %}
|
||||||
|
<ul>
|
||||||
|
{% for child in nav.children %}
|
||||||
|
{% comment %}internal/external URL check{% endcomment %}
|
||||||
|
{% if child.url contains "://" %}
|
||||||
|
{% assign domain = "" %}
|
||||||
|
{% else %}
|
||||||
|
{% assign domain = base_path %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% comment %}set "active" class on current page{% endcomment %}
|
||||||
|
{% if child.url == page.url %}
|
||||||
|
{% assign active = "active" %}
|
||||||
|
{% else %}
|
||||||
|
{% assign active = "" %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if child.disable == "yes" %}
|
||||||
|
{% assign disable = "nav__noclick" %}
|
||||||
|
{% else %}
|
||||||
|
{% assign disable = "" %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
<li><a href="{{ domain }}{{ child.url }}" class="{{ disable }} {{ active }}">{{ child.title }}</a></li>
|
||||||
|
{% endfor %}
|
||||||
|
</ul>
|
||||||
|
{% endif %}
|
||||||
|
</li>
|
||||||
|
{% endfor %}
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
@@ -0,0 +1,55 @@
|
|||||||
|
{% include base_path %}
|
||||||
|
|
||||||
|
{% if page.header.image contains "://" %}
|
||||||
|
{% capture img_path %}{{ page.header.image }}{% endcapture %}
|
||||||
|
{% else %}
|
||||||
|
{% capture img_path %}{{ page.header.image | prepend: "/images/" | prepend: base_path }}{% endcapture %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if page.header.cta_url contains "://" %}
|
||||||
|
{% capture cta_path %}{{ page.header.cta_url }}{% endcapture %}
|
||||||
|
{% else %}
|
||||||
|
{% capture cta_path %}{{ page.header.cta_url | prepend: base_path }}{% endcapture %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if page.header.overlay_image contains "://" %}
|
||||||
|
{% capture overlay_img_path %}{{ page.header.overlay_image }}{% endcapture %}
|
||||||
|
{% elsif page.header.overlay_image %}
|
||||||
|
{% capture overlay_img_path %}{{ page.header.overlay_image | prepend: "/images/" | prepend: base_path }}{% endcapture %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if page.header.overlay_filter contains "rgba" %}
|
||||||
|
{% capture overlay_filter %}{{ page.header.overlay_filter }}{% endcapture %}
|
||||||
|
{% elsif page.header.overlay_filter %}
|
||||||
|
{% capture overlay_filter %}rgba(0, 0, 0, {{ page.header.overlay_filter }}){% endcapture %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
<div class="page__hero{% if page.header.overlay_color or page.header.overlay_image %}--overlay{% endif %}"
|
||||||
|
style="{% if page.header.overlay_color %}background-color: {{ page.header.overlay_color | default: 'transparent' }};{% endif %} {% if overlay_img_path %}background-image: {% if overlay_filter %}linear-gradient({{ overlay_filter }}, {{ overlay_filter }}), {% endif %}url('{{ overlay_img_path }}');{% endif %}"
|
||||||
|
>
|
||||||
|
{% if page.header.overlay_color or page.header.overlay_image %}
|
||||||
|
<div class="wrapper">
|
||||||
|
<h1 class="page__title" itemprop="headline">
|
||||||
|
{% if paginator %}
|
||||||
|
{{ site.title }}{% unless paginator.page == 1 %} {{ site.data.ui-text[site.locale].page | default: "Page" }} {{ paginator.page }}{% endunless %}
|
||||||
|
{% else %}
|
||||||
|
{{ page.title | default: site.title | markdownify | remove: "<p>" | remove: "</p>" }}
|
||||||
|
{% endif %}
|
||||||
|
</h1>
|
||||||
|
{% if page.excerpt %}
|
||||||
|
<p class="page__lead">{{ page.excerpt | markdownify | remove: "<p>" | remove: "</p>" }}</p>
|
||||||
|
{% endif %}
|
||||||
|
{% if site.read_time and page.read_time %}
|
||||||
|
<p class="page__meta"><i class="fa fa-clock-o" aria-hidden="true"></i> {% include read-time.html %}</p>
|
||||||
|
{% endif %}
|
||||||
|
{% if page.header.cta_url %}
|
||||||
|
<p><a href="{{ cta_path }}" class="btn btn--light-outline btn--large">{{ page.header.cta_label | default: site.data.ui-text[site.locale].more_label | default: "Learn More" }}</a></p>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
{% else %}
|
||||||
|
<img src="{{ img_path }}" alt="{{ page.title }}" class="page__hero-image">
|
||||||
|
{% endif %}
|
||||||
|
{% if page.header.caption %}
|
||||||
|
<span class="page__hero-caption">{{ page.header.caption | markdownify | remove: "<p>" | remove: "</p>" }}</span>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
{% include base_path %}
|
||||||
|
|
||||||
|
{% if site.tag_archive.type and page.tags[0] %}
|
||||||
|
{% include tag-list.html %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if site.category_archive.type and page.categories[0] %}
|
||||||
|
{% include category-list.html %}
|
||||||
|
{% endif %}
|
||||||
@@ -0,0 +1,70 @@
|
|||||||
|
{% include base_path %}
|
||||||
|
|
||||||
|
{% if paginator.total_pages > 1 %}
|
||||||
|
<nav class="pagination">
|
||||||
|
<ul>
|
||||||
|
{% comment %} Link for previous page {% endcomment %}
|
||||||
|
{% if paginator.previous_page %}
|
||||||
|
{% if paginator.previous_page == 1 %}
|
||||||
|
<li><a href="{{ base_path }}/">{{ site.data.ui-text[site.locale].pagination_previous | default: "Previous" }}</a></li>
|
||||||
|
{% else %}
|
||||||
|
<li><a href="{{ base_path }}/page{{ paginator.previous_page }}/">{{ site.data.ui-text[site.locale].pagination_previous | default: "Previous" }}</a></li>
|
||||||
|
{% endif %}
|
||||||
|
{% else %}
|
||||||
|
<li><a href="#" class="disabled"><span aria-hidden="true">{{ site.data.ui-text[site.locale].pagination_previous | default: "Previous" }}</span></a></li>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% comment %} First page {% endcomment %}
|
||||||
|
{% if paginator.page == 1 %}
|
||||||
|
<li><a href="#" class="disabled current">1</a></li>
|
||||||
|
{% else %}
|
||||||
|
<li><a href="{{ base_path }}/">1</a></li>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% assign page_start = 2 %}
|
||||||
|
{% if paginator.page > 4 %}
|
||||||
|
{% assign page_start = paginator.page | minus: 2 %}
|
||||||
|
{% comment %} Ellipsis for truncated links {% endcomment %}
|
||||||
|
<li><a href="#" class="disabled">…</a></li>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% assign page_end = paginator.total_pages | minus: 1 %}
|
||||||
|
{% assign pages_to_end = paginator.total_pages | minus: paginator.page %}
|
||||||
|
{% if pages_to_end > 4 %}
|
||||||
|
{% assign page_end = paginator.page | plus: 2 %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% for index in (page_start..page_end) %}
|
||||||
|
{% if index == paginator.page %}
|
||||||
|
<li><a href="{{ base_path }}/page{{ index }}/" class="disabled current">{{ index }}</a></li>
|
||||||
|
{% else %}
|
||||||
|
{% comment %} Distance from current page and this link {% endcomment %}
|
||||||
|
{% assign dist = paginator.page | minus: index %}
|
||||||
|
{% if dist < 0 %}
|
||||||
|
{% comment %} Distance must be a positive value {% endcomment %}
|
||||||
|
{% assign dist = 0 | minus: dist %}
|
||||||
|
{% endif %}
|
||||||
|
<li><a href="{{ base_path }}/page{{ index }}/">{{ index }}</a></li>
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
|
{% comment %} Ellipsis for truncated links {% endcomment %}
|
||||||
|
{% if pages_to_end > 3 %}
|
||||||
|
<li><a href="#" class="disabled">…</a></li>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if paginator.page == paginator.total_pages %}
|
||||||
|
<li><a href="#" class="disabled current">{{ paginator.page }}</a></li>
|
||||||
|
{% else %}
|
||||||
|
<li><a href="{{ base_path }}/page{{ paginator.total_pages }}/">{{ paginator.total_pages }}</a></li>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% comment %} Link next page {% endcomment %}
|
||||||
|
{% if paginator.next_page %}
|
||||||
|
<li><a href="{{ base_path }}/page{{ paginator.next_page }}/">{{ site.data.ui-text[site.locale].pagination_next | default: "Next" }}</a></li>
|
||||||
|
{% else %}
|
||||||
|
<li><a href="#" class="disabled"><span aria-hidden="true">{{ site.data.ui-text[site.locale].pagination_next | default: "Next" }}</span></a></li>
|
||||||
|
{% endif %}
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
{% endif %}
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
{% include base_path %}
|
||||||
|
|
||||||
|
{% if page.previous or page.next %}
|
||||||
|
<nav class="pagination">
|
||||||
|
{% if page.previous %}
|
||||||
|
<a href="{{ base_path }}{{ page.previous.url }}" class="pagination--pager" title="{{ page.previous.title | markdownify | strip_html }}">{{ site.data.ui-text[site.locale].pagination_previous | default: "Previous" }}</a>
|
||||||
|
{% else %}
|
||||||
|
<a href="#" class="pagination--pager disabled">{{ site.data.ui-text[site.locale].pagination_previous | default: "Previous" }}</a>
|
||||||
|
{% endif %}
|
||||||
|
{% if page.next %}
|
||||||
|
<a href="{{ base_path }}{{ page.next.url }}" class="pagination--pager" title="{{ page.next.title | markdownify | strip_html }}">{{ site.data.ui-text[site.locale].pagination_next | default: "Next" }}</a>
|
||||||
|
{% else %}
|
||||||
|
<a href="#" class="pagination--pager disabled">{{ site.data.ui-text[site.locale].pagination_next | default: "Next" }}</a>
|
||||||
|
{% endif %}
|
||||||
|
</nav>
|
||||||
|
{% endif %}
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
{% if post.read_time %}
|
||||||
|
{% assign words = post.content | strip_html | number_of_words %}
|
||||||
|
{% elsif page.read_time %}
|
||||||
|
{% assign words = page.content | strip_html | number_of_words %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if site.words_per_minute %}
|
||||||
|
{% if words < 180 %}
|
||||||
|
{{ site.data.ui-text[site.locale].less_than | default: "less than" }} 1 {{ site.data.ui-text[site.locale].minute_read | default: "minute read" }}
|
||||||
|
{% elsif words < 360 %}
|
||||||
|
1 {{ site.data.ui-text[site.locale].minute_read | default: "minute read" }}
|
||||||
|
{% else %}
|
||||||
|
{{ words | divided_by:site.words_per_minute }} {{ site.data.ui-text[site.locale].minute_read | default: "minute read" }}
|
||||||
|
{% endif %}
|
||||||
|
{% else %}
|
||||||
|
{{ site.data.ui-text[site.locale].undefined_wpm | "Undefined parameter words_per_minute at _config.yml" }}
|
||||||
|
{% endif %}
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
<script src="{{ base_path }}/assets/js/main.min.js"></script>
|
||||||
|
|
||||||
|
{% include analytics.html %}
|
||||||
|
{% include /comments-providers/scripts.html %}
|
||||||
@@ -0,0 +1,145 @@
|
|||||||
|
{% include base_path %}
|
||||||
|
|
||||||
|
<!-- begin SEO -->
|
||||||
|
{% if site.url %}
|
||||||
|
{% assign seo_url = site.url | append: site.baseurl %}
|
||||||
|
{% endif %}
|
||||||
|
{% assign seo_url = seo_url | default: site.github.url %}
|
||||||
|
|
||||||
|
{% if page.title %}
|
||||||
|
{% assign seo_title = page.title | append: " " | append: site.title_separator | append: " " | append: site.title %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if seo_title %}
|
||||||
|
{% assign seo_title = seo_title | markdownify | strip_html | strip_newlines | escape_once %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if site.url %}
|
||||||
|
{% assign canonical_url = page.url | replace: "index.html", "" | prepend: site.url %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
<title>{{ seo_title | default: site.title }}{% if paginator %}{% unless paginator.page == 1 %} {{ site.title_separator }} {{ site.data.ui-text[site.locale].page | default: "Page" }} {{ paginator.page }}{% endunless %}{% endif %}</title>
|
||||||
|
|
||||||
|
{% assign seo_description = page.description | default: page.excerpt | default: site.description %}
|
||||||
|
{% if seo_description %}
|
||||||
|
{% assign seo_description = seo_description | markdownify | strip_html | strip_newlines | escape_once %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% assign seo_author = page.author | default: page.author[0] | default: site.author[0] %}
|
||||||
|
{% if seo_author %}
|
||||||
|
{% if seo_author.twitter %}
|
||||||
|
{% assign seo_author_twitter = seo_author.twitter %}
|
||||||
|
{% else %}
|
||||||
|
{% if site.data.authors and site.data.authors[seo_author] %}
|
||||||
|
{% assign seo_author_twitter = site.data.authors[seo_author].twitter %}
|
||||||
|
{% else %}
|
||||||
|
{% assign seo_author_twitter = seo_author %}
|
||||||
|
{% endif %}
|
||||||
|
{% endif %}
|
||||||
|
{% assign seo_author_twitter = seo_author_twitter | replace: "@", "" %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
<meta property="og:locale" content="{{ site.locale | replace: "-", "_" | default: "en" }}">
|
||||||
|
<meta property="og:site_name" content="{{ site.title }}">
|
||||||
|
<meta property="og:title" content="{{ page.title | default: site.title | markdownify | strip_html | strip_newlines | escape_once }}">
|
||||||
|
|
||||||
|
{% if seo_url %}
|
||||||
|
<link rel="canonical" href="{{ page.url | prepend: seo_url | replace: "/index.html", "/" }}">
|
||||||
|
<meta property="og:url" content="{{ page.url | prepend: seo_url | replace: "/index.html", "/" }}">
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if page.excerpt %}
|
||||||
|
<meta property="og:description" content="{{ seo_description }}">
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if site.twitter.username %}
|
||||||
|
<meta name="twitter:site" content="@{{ site.twitter.username | replace: "@", "" }}">
|
||||||
|
<meta name="twitter:title" content="{{ page.title | default: site.title | markdownify | strip_html | strip_newlines | escape_once }}">
|
||||||
|
<meta name="twitter:description" content="{{ seo_description }}">
|
||||||
|
<meta name="twitter:url" content="{{ canonical_url }}">
|
||||||
|
|
||||||
|
{% if page.header.image %}
|
||||||
|
<meta name="twitter:card" content="summary_large_image">
|
||||||
|
<meta name="twitter:image" content="{% if page.header.image contains "://" %}{{ page.header.image }}{% else %}{{ page.header.image | prepend: "/images/" | prepend: base_path }}{% endif %}">
|
||||||
|
{% else %}
|
||||||
|
<meta name="twitter:card" content="summary">
|
||||||
|
{% if page.header.teaser %}
|
||||||
|
<meta name="twitter:image" content="{% if page.header.teaser contains "://" %}{{ page.header.teaser }}{% else %}{{ page.header.teaser | prepend: "/images/" | prepend: base_path }}{% endif %}">
|
||||||
|
{% elsif site.og_image %}
|
||||||
|
<meta name="twitter:image" content="{{ site.og_image | prepend: "/images/" | prepend: base_path }}">
|
||||||
|
{% endif %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if seo_author_twitter %}
|
||||||
|
<meta name="twitter:creator" content="@{{ seo_author_twitter }}">
|
||||||
|
{% endif %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if site.facebook %}
|
||||||
|
{% if site.facebook.publisher %}
|
||||||
|
<meta property="article:publisher" content="{{ site.facebook.publisher }}">
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if site.facebook.app_id %}
|
||||||
|
<meta property="fb:app_id" content="{{ site.facebook.app_id }}">
|
||||||
|
{% endif %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if page.header.image %}
|
||||||
|
<meta property="og:image" content="{% if page.header.image contains "://" %}{{ page.header.image }}{% else %}{{ page.header.image | prepend: "/images/" | prepend: base_path }}{% endif %}">
|
||||||
|
{% elsif page.header.overlay_image %}
|
||||||
|
<meta property="og:image" content="{% if page.header.overlay_image contains "://" %}{{ page.header.overlay_image }}{% else %}{{ page.header.overlay_image | prepend: "/images/" | prepend: base_path }}{% endif %}">
|
||||||
|
{% elsif page.header.teaser %}
|
||||||
|
<meta property="og:image" content="{% if page.header.teaser contains "://" %}{{ page.header.teaser }}{% else %}{{ page.header.teaser | prepend: "/images/" | prepend: base_path }}{% endif %}">
|
||||||
|
{% elsif site.og_image %}
|
||||||
|
<meta property="og:image" content="{% if site.og_image contains "://" %}{{ site.og_image }}{% else %}{{ site.og_image | prepend: "/images/" | prepend: base_path }}{% endif %}">
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if page.date %}
|
||||||
|
<meta property="og:type" content="article">
|
||||||
|
<meta property="article:published_time" content="{{ page.date | date_to_xmlschema }}">
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if paginator.previous_page %}
|
||||||
|
<link rel="prev" href="{{ paginator.previous_page_path | prepend: seo_url }}">
|
||||||
|
{% endif %}
|
||||||
|
{% if paginator.next_page %}
|
||||||
|
<link rel="next" href="{{ paginator.next_page_path | prepend: seo_url }}">
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if site.og_image %}
|
||||||
|
<script type="application/ld+json">
|
||||||
|
{
|
||||||
|
"@context": "http://schema.org",
|
||||||
|
"@type": "Organization",
|
||||||
|
"url": {{ seo_url | jsonify }},
|
||||||
|
"logo": {{ site.og_image | prepend: "/images/" | prepend: base_path | jsonify }}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if site.social %}
|
||||||
|
<script type="application/ld+json">
|
||||||
|
{
|
||||||
|
"@context" : "http://schema.org",
|
||||||
|
"@type" : "{% if site.social.type %}{{ site.social.type }}{% else %}Person{% endif %}",
|
||||||
|
"name" : "{{ site.social.name | default: site.name }}",
|
||||||
|
"url" : {{ seo_url | jsonify }},
|
||||||
|
"sameAs" : {{ site.social.links | jsonify }}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if site.google_site_verification %}
|
||||||
|
<meta name="google-site-verification" content="{{ site.google_site_verification }}" />
|
||||||
|
{% endif %}
|
||||||
|
{% if site.bing_site_verification %}
|
||||||
|
<meta name="msvalidate.01" content="{{ site.bing_site_verification }}">
|
||||||
|
{% endif %}
|
||||||
|
{% if site.alexa_site_verification %}
|
||||||
|
<meta name="alexaVerifyID" content="{{ site.alexa_site_verification }}">
|
||||||
|
{% endif %}
|
||||||
|
{% if site.yandex_site_verification %}
|
||||||
|
<meta name="yandex-verification" content="{{ site.yandex_site_verification }}">
|
||||||
|
{% endif %}
|
||||||
|
<!-- end SEO -->
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
{% include base_path %}
|
||||||
|
|
||||||
|
{% if page.author_profile or layout.author_profile or page.sidebar %}
|
||||||
|
<div class="sidebar sticky">
|
||||||
|
{% if page.author_profile or layout.author_profile %}{% include author-profile.html %}{% endif %}
|
||||||
|
{% if page.sidebar %}
|
||||||
|
{% for s in page.sidebar %}
|
||||||
|
{% if s.image %}
|
||||||
|
<img src=
|
||||||
|
{% if s.image contains "://" %}
|
||||||
|
"{{ s.image }}"
|
||||||
|
{% else %}
|
||||||
|
"{{ s.image | prepend: "/images/" | prepend: base_path }}"
|
||||||
|
{% endif %}
|
||||||
|
alt="{% if s.image_alt %}{{ s.image_alt }}{% endif %}">
|
||||||
|
{% endif %}
|
||||||
|
{% if s.title %}<h3>{{ s.title }}</h3>{% endif %}
|
||||||
|
{% if s.text %}{{ s.text | markdownify }}{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
{% if page.sidebar.nav %}
|
||||||
|
{% include nav_list nav=page.sidebar.nav %}
|
||||||
|
{% endif %}
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
{% include base_path %}
|
||||||
|
|
||||||
|
<section class="page__share">
|
||||||
|
{% if site.data.ui-text[site.locale].share_on_label %}
|
||||||
|
<h4 class="page__share-title">{{ site.data.ui-text[site.locale].share_on_label | default: "Share on" }}</h4>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
<a href="https://twitter.com/intent/tweet?{% if site.twitter.username %}via={{ site.twitter.username }}&{% endif %}text={{ page.title }} {{ base_path }}{{ page.url }}" class="btn btn--twitter" title="{{ site.data.ui-text[site.locale].share_on_label | default: 'Share on' }} Twitter"><i class="fa fa-fw fa-twitter" aria-hidden="true"></i><span> Twitter</span></a>
|
||||||
|
|
||||||
|
<a href="https://www.facebook.com/sharer/sharer.php?u={{ base_path }}{{ page.url }}" class="btn btn--facebook" title="{{ site.data.ui-text[site.locale].share_on_label | default: 'Share on' }} Facebook"><i class="fa fa-fw fa-facebook" aria-hidden="true"></i><span> Facebook</span></a>
|
||||||
|
|
||||||
|
<a href="https://plus.google.com/share?url={{ base_path }}{{ page.url }}" class="btn btn--google-plus" title="{{ site.data.ui-text[site.locale].share_on_label | default: 'Share on' }} Google Plus"><i class="fa fa-fw fa-google-plus" aria-hidden="true"></i><span> Google+</span></a>
|
||||||
|
|
||||||
|
<a href="https://www.linkedin.com/shareArticle?mini=true&url={{ base_path }}{{ page.url }}" class="btn btn--linkedin" title="{{ site.data.ui-text[site.locale].share_on_label | default: 'Share on' }} LinkedIn"><i class="fa fa-fw fa-linkedin" aria-hidden="true"></i><span> LinkedIn</span></a>
|
||||||
|
</section>
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
{% include base_path %}
|
||||||
|
|
||||||
|
{% case site.tag_archive.type %}
|
||||||
|
{% when "liquid" %}
|
||||||
|
{% assign path_type = "#" %}
|
||||||
|
{% when "jekyll-archives" %}
|
||||||
|
{% assign path_type = nil %}
|
||||||
|
{% endcase %}
|
||||||
|
|
||||||
|
{% if site.tag_archive.path %}
|
||||||
|
{% comment %}
|
||||||
|
<!-- Sort alphabetically regardless of case e.g. a B c d E -->
|
||||||
|
<!-- modified from http://www.codeofclimber.ru/2015/sorting-site-tags-in-jekyll/ -->
|
||||||
|
{% endcomment %}
|
||||||
|
{% capture page_tags %}{% for tag in page.tags %}{{ tag | downcase }}#{{ tag }}{% unless forloop.last %},{% endunless %}{% endfor %}{% endcapture %}
|
||||||
|
{% assign tag_hashes = (page_tags | split: ',' | sort:0) %}
|
||||||
|
|
||||||
|
<p class="page__taxonomy">
|
||||||
|
<strong><i class="fa fa-fw fa-tags" aria-hidden="true"></i> {{ site.data.ui-text[site.locale].tags_label | default: "Tags:" }} </strong>
|
||||||
|
<span itemprop="keywords">
|
||||||
|
{% for hash in tag_hashes %}
|
||||||
|
{% assign keyValue = hash | split: '#' %}
|
||||||
|
{% capture tag_word %}{{ keyValue[1] | strip_newlines }}{% endcapture %}
|
||||||
|
<a href="{{ base_path }}{{ tag_word | slugify | prepend: path_type | prepend: site.tag_archive.path }}" class="page__taxonomy-item" rel="tag">{{ tag_word }}</a>{% unless forloop.last %}<span class="sep">, </span>{% endunless %}
|
||||||
|
{% endfor %}
|
||||||
|
</span>
|
||||||
|
</p>
|
||||||
|
{% endif %}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
<aside class="sidebar__right">
|
||||||
|
<nav class="toc" markdown="1">
|
||||||
|
<header><h4 class="nav__title"><i class="fa fa-{{ include.icon | default: 'file-text' }}"></i> {{ include.title | default: site.data.ui-text[site.locale].toc_label }}</h4></header>
|
||||||
|
* Auto generated table of contents
|
||||||
|
{:toc .toc__menu}
|
||||||
|
</nav>
|
||||||
|
</aside>
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
---
|
||||||
|
layout: default
|
||||||
|
author_profile: false
|
||||||
|
---
|
||||||
|
|
||||||
|
<div id="main" role="main">
|
||||||
|
{% include sidebar.html %}
|
||||||
|
|
||||||
|
<div class="archive">
|
||||||
|
<h1 class="page__title">{{ page.title }}</h1>
|
||||||
|
{% include base_path %}
|
||||||
|
{% for post in page.posts %}
|
||||||
|
{% include archive-single.html %}
|
||||||
|
{% endfor %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
---
|
||||||
|
layout: default
|
||||||
|
---
|
||||||
|
|
||||||
|
{% if page.header.overlay_color or page.header.overlay_image or page.header.image %}
|
||||||
|
{% include page__hero.html %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if page.url != "/" and site.breadcrumbs %}
|
||||||
|
{% unless paginator %}
|
||||||
|
{% include breadcrumbs.html %}
|
||||||
|
{% endunless %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
<div id="main" role="main">
|
||||||
|
{% include sidebar.html %}
|
||||||
|
|
||||||
|
<div class="archive">
|
||||||
|
{% unless page.header.overlay_color or page.header.overlay_image %}
|
||||||
|
<h1 class="page__title">{{ page.title }}</h1>
|
||||||
|
{% endunless %}
|
||||||
|
{{ content }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
---
|
||||||
|
# Jekyll layout that compresses HTML
|
||||||
|
# v3.0.2
|
||||||
|
# http://jch.penibelst.de/
|
||||||
|
# © 2014–2015 Anatol Broder
|
||||||
|
# MIT License
|
||||||
|
---
|
||||||
|
|
||||||
|
{% capture _LINE_FEED %}
|
||||||
|
{% endcapture %}{% if site.compress_html.ignore.envs contains jekyll.environment %}{{ content }}{% else %}{% capture _content %}{{ content }}{% endcapture %}{% assign _profile = site.compress_html.profile %}{% if site.compress_html.endings == "all" %}{% assign _endings = "html head body li dt dd p rt rp optgroup option colgroup caption thead tbody tfoot tr td th" | split: " " %}{% else %}{% assign _endings = site.compress_html.endings %}{% endif %}{% for _element in _endings %}{% capture _end %}</{{ _element }}>{% endcapture %}{% assign _content = _content | remove: _end %}{% endfor %}{% if _profile and _endings %}{% assign _profile_endings = _content | size | plus: 1 %}{% endif %}{% for _element in site.compress_html.startings %}{% capture _start %}<{{ _element }}>{% endcapture %}{% assign _content = _content | remove: _start %}{% endfor %}{% if _profile and site.compress_html.startings %}{% assign _profile_startings = _content | size | plus: 1 %}{% endif %}{% if site.compress_html.comments == "all" %}{% assign _comments = "<!-- -->" | split: " " %}{% else %}{% assign _comments = site.compress_html.comments %}{% endif %}{% if _comments.size == 2 %}{% capture _comment_befores %}.{{ _content }}{% endcapture %}{% assign _comment_befores = _comment_befores | split: _comments.first %}{% for _comment_before in _comment_befores %}{% if forloop.first %}{% continue %}{% endif %}{% capture _comment_outside %}{% if _carry %}{{ _comments.first }}{% endif %}{{ _comment_before }}{% endcapture %}{% capture _comment %}{% unless _carry %}{{ _comments.first }}{% endunless %}{{ _comment_outside | split: _comments.last | first }}{% if _comment_outside contains _comments.last %}{{ _comments.last }}{% assign _carry = false %}{% else %}{% assign _carry = true %}{% endif %}{% endcapture %}{% assign _content = _content | remove_first: _comment %}{% endfor %}{% if _profile %}{% assign _profile_comments = _content | size | plus: 1 %}{% endif %}{% endif %}{% assign _pre_befores = _content | split: "<pre" %}{% assign _content = "" %}{% for _pre_before in _pre_befores %}{% assign _pres = _pre_before | split: "</pre>" %}{% assign _pres_after = "" %}{% if _pres.size != 0 %}{% if site.compress_html.blanklines %}{% assign _lines = _pres.last | split: _LINE_FEED %}{% capture _pres_after %}{% for _line in _lines %}{% assign _trimmed = _line | split: " " | join: " " %}{% if _trimmed != empty or forloop.last %}{% unless forloop.first %}{{ _LINE_FEED }}{% endunless %}{{ _line }}{% endif %}{% endfor %}{% endcapture %}{% else %}{% assign _pres_after = _pres.last | split: " " | join: " " %}{% endif %}{% endif %}{% capture _content %}{{ _content }}{% if _pre_before contains "</pre>" %}<pre{{ _pres.first }}</pre>{% endif %}{% unless _pre_before contains "</pre>" and _pres.size == 1 %}{{ _pres_after }}{% endunless %}{% endcapture %}{% endfor %}{% if _profile %}{% assign _profile_collapse = _content | size | plus: 1 %}{% endif %}{% if site.compress_html.clippings == "all" %}{% assign _clippings = "html head title base link meta style body article section nav aside h1 h2 h3 h4 h5 h6 hgroup header footer address p hr blockquote ol ul li dl dt dd figure figcaption main div table caption colgroup col tbody thead tfoot tr td th" | split: " " %}{% else %}{% assign _clippings = site.compress_html.clippings %}{% endif %}{% for _element in _clippings %}{% assign _edges = " <e;<e; </e>;</e>;</e> ;</e>" | replace: "e", _element | split: ";" %}{% assign _content = _content | replace: _edges[0], _edges[1] | replace: _edges[2], _edges[3] | replace: _edges[4], _edges[5] %}{% endfor %}{% if _profile and _clippings %}{% assign _profile_clippings = _content | size | plus: 1 %}{% endif %}{{ _content }}{% if _profile %} <table id="compress_html_profile_{{ site.time | date: "%Y%m%d" }}" class="compress_html_profile"> <thead> <tr> <td>Step <td>Bytes <tbody> <tr> <td>raw <td>{{ content | size }}{% if _profile_endings %} <tr> <td>endings <td>{{ _profile_endings }}{% endif %}{% if _profile_startings %} <tr> <td>startings <td>{{ _profile_startings }}{% endif %}{% if _profile_comments %} <tr> <td>comments <td>{{ _profile_comments }}{% endif %}{% if _profile_collapse %} <tr> <td>collapse <td>{{ _profile_collapse }}{% endif %}{% if _profile_clippings %} <tr> <td>clippings <td>{{ _profile_clippings }}{% endif %} </table>{% endif %}{% endif %}
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
---
|
||||||
|
---
|
||||||
|
|
||||||
|
{% include base_path %}
|
||||||
|
|
||||||
|
<!doctype html>
|
||||||
|
<html lang="{{ site.locale | slice: 0,2 | default: "en" }}" class="no-js">
|
||||||
|
<head>
|
||||||
|
{% include head.html %}
|
||||||
|
{% include head/custom.html %}
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body class="layout--{{ page.layout | default: layout.layout }}{% if page.classes or layout.classes %}{{ page.classes | default: layout.classes | join: ' ' | prepend: ' ' }}{% endif %}">
|
||||||
|
|
||||||
|
{% include browser-upgrade.html %}
|
||||||
|
{% include masthead.html %}
|
||||||
|
|
||||||
|
{{ content }}
|
||||||
|
|
||||||
|
<div class="page__footer">
|
||||||
|
<footer>
|
||||||
|
{% include footer/custom.html %}
|
||||||
|
{% include footer.html %}
|
||||||
|
</footer>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{% include scripts.html %}
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
{% include head_print.html %}
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body class="{% if page.type == " title "%}title{% elsif page.type == "frontmatter " %}frontmatter{% elsif page.type == "first_page
|
||||||
|
" %}first_page{% endif %} print">
|
||||||
|
<!-- Page Content -->
|
||||||
|
<div class="container">
|
||||||
|
<!-- Content Column -->
|
||||||
|
<div class="col-md-9">
|
||||||
|
{{content}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- /.container -->
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
---
|
||||||
|
layout: default_print
|
||||||
|
comments: false
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<div class="post-header">
|
||||||
|
<h1 class="post-title-main" id="{{page.permalink | replace: '/', '' }}">{{ page.excerpt }}</h1>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="post-content">
|
||||||
|
|
||||||
|
{% if page.summary %}
|
||||||
|
<div class="summary">{{page.summary}}</div>
|
||||||
|
{% endif %}
|
||||||
|
{{ content }}
|
||||||
|
</div>
|
||||||
@@ -0,0 +1,81 @@
|
|||||||
|
---
|
||||||
|
layout: default
|
||||||
|
---
|
||||||
|
|
||||||
|
{% include base_path %}
|
||||||
|
|
||||||
|
{% if page.header.overlay_color or page.header.overlay_image or page.header.image %}
|
||||||
|
{% include page__hero.html %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if page.url != "/" and site.breadcrumbs %}
|
||||||
|
{% unless paginator %}
|
||||||
|
{% include breadcrumbs.html %}
|
||||||
|
{% endunless %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
<script type="text/javascript" async
|
||||||
|
src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.2/MathJax.js?config=TeX-MML-AM_CHTML">
|
||||||
|
</script>
|
||||||
|
|
||||||
|
|
||||||
|
<div id="main" role="main">
|
||||||
|
{% include sidebar.html %}
|
||||||
|
|
||||||
|
<article class="page" itemscope itemtype="http://schema.org/CreativeWork">
|
||||||
|
{% if page.title %}<meta itemprop="headline" content="{{ page.title | markdownify | strip_html | strip_newlines | escape_once }}">{% endif %}
|
||||||
|
{% if page.excerpt %}<meta itemprop="description" content="{{ page.excerpt | markdownify | strip_html | strip_newlines | escape_once }}">{% endif %}
|
||||||
|
{% if page.date %}<meta itemprop="datePublished" content="{{ page.date | date: "%B %d, %Y" }}">{% endif %}
|
||||||
|
{% if page.modified %}<meta itemprop="dateModified" content="{{ page.modified | date: "%B %d, %Y" }}">{% endif %}
|
||||||
|
|
||||||
|
<div class="page__inner-wrap">
|
||||||
|
{% unless page.header.overlay_color or page.header.overlay_image %}
|
||||||
|
<header>
|
||||||
|
{% if page.title %}<h1 class="page__title" itemprop="headline">{{ page.title | markdownify | remove: "<p>" | remove: "</p>" }}</h1>{% endif %}
|
||||||
|
{% if page.read_time %}
|
||||||
|
<p class="page__meta"><i class="fa fa-clock-o" aria-hidden="true"></i> {% include read-time.html %}</p>
|
||||||
|
{% endif %}
|
||||||
|
</header>
|
||||||
|
{% endunless %}
|
||||||
|
|
||||||
|
<section class="page__content" itemprop="text">
|
||||||
|
{{ content }}
|
||||||
|
{% if page.link %}<div><a href="{{ page.link }}" class="btn">{{ site.data.ui-text[site.locale].ext_link_label | default: "Direct Link" }}</a></div>{% endif %}
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<footer class="page__meta">
|
||||||
|
{% if site.data.ui-text[site.locale].meta_label %}
|
||||||
|
<h4 class="page__meta-title">{{ site.data.ui-text[site.locale].meta_label }}</h4>
|
||||||
|
{% endif %}
|
||||||
|
{% include page__taxonomy.html %}
|
||||||
|
{% if page.modified %}
|
||||||
|
<p class="page__date"><strong><i class="fa fa-fw fa-calendar" aria-hidden="true"></i> {{ site.data.ui-text[site.locale].date_label | default: "Updated:" }}</strong> <time datetime="{{ page.modified | date: "%Y-%m-%d" }}">{{ page.modified | date: "%B %d, %Y" }}</time></p>
|
||||||
|
{% elsif page.date %}
|
||||||
|
<p class="page__date"><strong><i class="fa fa-fw fa-calendar" aria-hidden="true"></i> {{ site.data.ui-text[site.locale].date_label | default: "Updated:" }}</strong> <time datetime="{{ page.date | date_to_xmlschema }}">{{ page.date | date: "%B %d, %Y" }}</time></p>
|
||||||
|
{% endif %}
|
||||||
|
</footer>
|
||||||
|
|
||||||
|
{% if page.share %}{% include social-share.html %}{% endif %}
|
||||||
|
|
||||||
|
{% include post_pagination.html %}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{% if site.comments.provider and page.comments %}
|
||||||
|
{% include comments.html %}
|
||||||
|
{% endif %}
|
||||||
|
</article>
|
||||||
|
|
||||||
|
{% comment %}<!-- only show related on a post page when not disabled -->{% endcomment %}
|
||||||
|
{% if page.id and page.related and site.related_posts.size > 0 %}
|
||||||
|
<div class="page__related">
|
||||||
|
{% if site.data.ui-text[site.locale].related_label %}
|
||||||
|
<h4 class="page__related-title">{{ site.data.ui-text[site.locale].related_label | default: "You May Also Enjoy" }}</h4>
|
||||||
|
{% endif %}
|
||||||
|
<div class="grid__wrapper">
|
||||||
|
{% for post in site.related_posts limit:4 %}
|
||||||
|
{% include archive-single.html type="grid" %}
|
||||||
|
{% endfor %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
---
|
||||||
|
layout: default
|
||||||
|
---
|
||||||
|
|
||||||
|
{% include base_path %}
|
||||||
|
|
||||||
|
{% if page.header.overlay_color or page.header.overlay_image or page.header.image %}
|
||||||
|
{% include page__hero.html %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
<div id="main" role="main">
|
||||||
|
<article class="splash" itemscope itemtype="http://schema.org/CreativeWork">
|
||||||
|
{% if page.title %}<meta itemprop="headline" content="{{ page.title | markdownify | strip_html | strip_newlines | escape_once }}">{% endif %}
|
||||||
|
{% if page.excerpt %}<meta itemprop="description" content="{{ page.excerpt | markdownify | strip_html | strip_newlines | escape_once }}">{% endif %}
|
||||||
|
{% if page.date %}<meta itemprop="datePublished" content="{{ page.date | date: "%B %d, %Y" }}">{% endif %}
|
||||||
|
{% if page.modified %}<meta itemprop="dateModified" content="{{ page.modified | date: "%B %d, %Y" }}">{% endif %}
|
||||||
|
|
||||||
|
<section class="page__content" itemprop="text">
|
||||||
|
{{ content }}
|
||||||
|
</section>
|
||||||
|
</article>
|
||||||
|
</div>
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
---
|
||||||
|
title: "Page Not Found"
|
||||||
|
layout: single
|
||||||
|
excerpt: "Page not found. Your pixels are in another canvas."
|
||||||
|
sitemap: false
|
||||||
|
permalink: /404.html
|
||||||
|
---
|
||||||
|
|
||||||
|
Sorry, but the page you were trying to view does not exist --- perhaps you can try searching for it below.
|
||||||
|
|
||||||
|
<script type="text/javascript">
|
||||||
|
var GOOG_FIXURL_LANG = 'en';
|
||||||
|
var GOOG_FIXURL_SITE = '{{ site.url }}'
|
||||||
|
</script>
|
||||||
|
<script type="text/javascript"
|
||||||
|
src="//linkhelp.clients.google.com/tbproxy/lh/wm/fixurl.js">
|
||||||
|
</script>
|
||||||
@@ -0,0 +1,48 @@
|
|||||||
|
---
|
||||||
|
layout: splash
|
||||||
|
permalink: /about/
|
||||||
|
author_profile: false
|
||||||
|
title: "About"
|
||||||
|
excerpt: "The project and the authors"
|
||||||
|
header:
|
||||||
|
overlay_color: "#5DADE2"
|
||||||
|
---
|
||||||
|
|
||||||
|
{% include base_path %}
|
||||||
|
|
||||||
|
## Main authors and mantainers
|
||||||
|
|
||||||
|
* Peter Boyle
|
||||||
|
* Guido Cossu
|
||||||
|
* Azusa Yamaguchi
|
||||||
|
* Antonin Portelli
|
||||||
|
|
||||||
|
|
||||||
|
## Description
|
||||||
|
|
||||||
|
This library provides data parallel C++ container classes with internal memory layout
|
||||||
|
that is transformed to map efficiently to SIMD architectures. CSHIFT facilities
|
||||||
|
are provided, similar to HPF and cmfortran, and user control is given over the mapping of
|
||||||
|
array indices to both MPI tasks and SIMD processing elements.
|
||||||
|
|
||||||
|
* Identically shaped arrays then be processed with perfect data parallelisation.
|
||||||
|
* Such identically shapped arrays are called conformable arrays.
|
||||||
|
|
||||||
|
The transformation is based on the observation that Cartesian array processing involves
|
||||||
|
identical processing to be performed on different regions of the Cartesian array.
|
||||||
|
|
||||||
|
The library will both geometrically decompose into MPI tasks and across SIMD lanes.
|
||||||
|
Local vector loops are parallelised with OpenMP pragmas.
|
||||||
|
|
||||||
|
Data parallel array operations can then be specified with a SINGLE data parallel paradigm, but
|
||||||
|
optimally use MPI, OpenMP and SIMD parallelism under the hood. This is a significant simplification
|
||||||
|
for most programmers.
|
||||||
|
|
||||||
|
The layout transformations are parametrised by the SIMD vector length. This adapts according to the architecture.
|
||||||
|
Presently SSE4 (128 bit) AVX, AVX2 (256 bit) and IMCI and AVX512 (512 bit) targets are supported (ARM NEON and BG/Q QPX on the way).
|
||||||
|
|
||||||
|
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`.
|
||||||
|
|
||||||
|
MPI, OpenMP, and SIMD parallelism are present in the library.
|
||||||
|
Please see [this paper](https://arxiv.org/abs/1512.03487) for more detail.
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
---
|
||||||
|
title : "API Documentation"
|
||||||
|
author_profile: false
|
||||||
|
excerpt: "Coordinates"
|
||||||
|
header:
|
||||||
|
overlay_color: "#5DADE2"
|
||||||
|
permalink: /docs/API/coordinates.html
|
||||||
|
sidebar:
|
||||||
|
nav : docs
|
||||||
|
---
|
||||||
|
|
||||||
|
The Grid is define on a N-dimensional set of integer coordinates.
|
||||||
|
|
||||||
|
The maximum dimension is eight, and indexes in this space make use of the `Coordinate` class.
|
||||||
|
The coordinate class shares a similar interface to `std::vector<int>`, but contains all data within the
|
||||||
|
object, and has a fixed maximum length (template parameter).
|
||||||
|
|
||||||
|
**Example**:
|
||||||
|
|
||||||
|
```c++
|
||||||
|
const int Nd=4;
|
||||||
|
Coordinate point(Nd);
|
||||||
|
|
||||||
|
for(int i=0;i<Nd;i++)
|
||||||
|
point[i] = 1;
|
||||||
|
|
||||||
|
std::cout<< point <<std::endl;
|
||||||
|
point.resize(3);
|
||||||
|
std::cout<< point <<std::endl;
|
||||||
|
```
|
||||||
|
|
||||||
|
This enables the coordinates to be manipulated without heap allocation or thread contention,
|
||||||
|
and avoids introducing STL functions into GPU code, but does so at the expense of introducing
|
||||||
|
a maximum dimensionality. This limit is easy to change (`lib/util/Coordinate.h`).
|
||||||
@@ -0,0 +1,90 @@
|
|||||||
|
---
|
||||||
|
title : "API Documentation"
|
||||||
|
author_profile: false
|
||||||
|
excerpt: "Grids"
|
||||||
|
header:
|
||||||
|
overlay_color: "#5DADE2"
|
||||||
|
permalink: /docs/API/grids.html
|
||||||
|
sidebar:
|
||||||
|
nav : docs
|
||||||
|
---
|
||||||
|
|
||||||
|
A `Grid` object defines the geometry of a global cartesian array, and through inheritance
|
||||||
|
provides access to message passing decomposition, the local lattice, and the message passing primitives.
|
||||||
|
|
||||||
|
The constructor requires parameters to indicate how the spatial (and temporal) indices
|
||||||
|
are decomposed across MPI tasks and SIMD lanes of the vector length.
|
||||||
|
We use a partial vectorisation transformation, must select
|
||||||
|
which space-time dimensions participate in SIMD vectorisation.
|
||||||
|
The Lattice containers are defined to have opaque internal layout, hiding this layout transformation.
|
||||||
|
|
||||||
|
We define GridCartesian and GridRedBlackCartesian which both inherit from `GridBase`:
|
||||||
|
|
||||||
|
```c++
|
||||||
|
class GridCartesian : public GridBase
|
||||||
|
class GridRedBlackCartesian: public GridBase
|
||||||
|
```
|
||||||
|
|
||||||
|
The simplest Cartesian Grid constructor distributes across `MPI_COMM_WORLD`:
|
||||||
|
|
||||||
|
```c++
|
||||||
|
/////////////////////////////////////////////////////////////////////////
|
||||||
|
// Construct from comm world
|
||||||
|
/////////////////////////////////////////////////////////////////////////
|
||||||
|
GridCartesian(const Coordinate &dimensions,
|
||||||
|
const Coordinate &simd_layout,
|
||||||
|
const Coordinate &processor_grid);
|
||||||
|
```
|
||||||
|
|
||||||
|
A second constructor will create a child communicator from a previously declared Grid.
|
||||||
|
This allows to subdivide the processor grid, and also to define lattices of differing dimensionalities and sizes,
|
||||||
|
useful for both Chiral fermions, lower dimensional operations, and multigrid:
|
||||||
|
|
||||||
|
```c++
|
||||||
|
/////////////////////////////////////////////////////////////////////////
|
||||||
|
// Constructor takes a parent grid and possibly subdivides communicator.
|
||||||
|
/////////////////////////////////////////////////////////////////////////
|
||||||
|
GridCartesian(const Coordinate &dimensions,
|
||||||
|
const Coordinate &simd_layout,
|
||||||
|
const Coordinate &processor_grid,
|
||||||
|
const GridCartesian &parent,int &split_rank);
|
||||||
|
```
|
||||||
|
|
||||||
|
The Grid object provides much `internal` functionality to map a lattice site to
|
||||||
|
a node and lexicographic index. These are not needed by code interfacing
|
||||||
|
to the data parallel layer.
|
||||||
|
|
||||||
|
**Example** (`tests/solver/Test_split_grid.cc`):
|
||||||
|
|
||||||
|
```c++
|
||||||
|
const int Ls=8;
|
||||||
|
|
||||||
|
////////////////////////////////////////////
|
||||||
|
// Grids distributed across full machine
|
||||||
|
// pick up default command line args
|
||||||
|
////////////////////////////////////////////
|
||||||
|
Grid_init(&argc,&argv);
|
||||||
|
|
||||||
|
Coordinate latt_size = GridDefaultLatt();
|
||||||
|
Coordinate simd_layout = GridDefaultSimd(Nd,vComplex::Nsimd());
|
||||||
|
Coordinate mpi_layout = GridDefaultMpi();
|
||||||
|
|
||||||
|
GridCartesian * UGrid = SpaceTimeGrid::makeFourDimGrid(GridDefaultLatt(),
|
||||||
|
GridDefaultSimd(Nd,vComplex::Nsimd()),GridDefaultMpi());
|
||||||
|
GridCartesian * FGrid = SpaceTimeGrid::makeFiveDimGrid(Ls,UGrid);
|
||||||
|
GridRedBlackCartesian * rbGrid = SpaceTimeGrid::makeFourDimRedBlackGrid(UGrid);
|
||||||
|
GridRedBlackCartesian * FrbGrid = SpaceTimeGrid::makeFiveDimRedBlackGrid(Ls,UGrid);
|
||||||
|
|
||||||
|
/////////////////////////////////////////////
|
||||||
|
// Split into N copies of 1^4 mpi communicators
|
||||||
|
/////////////////////////////////////////////
|
||||||
|
Coordinate mpi_split (mpi_layout.size(),1);
|
||||||
|
GridCartesian * SGrid = new GridCartesian(GridDefaultLatt(),
|
||||||
|
GridDefaultSimd(Nd,vComplex::Nsimd()),
|
||||||
|
mpi_split,
|
||||||
|
*UGrid);
|
||||||
|
|
||||||
|
GridCartesian * SFGrid = SpaceTimeGrid::makeFiveDimGrid(Ls,SGrid);
|
||||||
|
GridRedBlackCartesian * SrbGrid = SpaceTimeGrid::makeFourDimRedBlackGrid(SGrid);
|
||||||
|
GridRedBlackCartesian * SFrbGrid = SpaceTimeGrid::makeFiveDimRedBlackGrid(Ls,SGrid);
|
||||||
|
```
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
---
|
||||||
|
title : "API Documentation"
|
||||||
|
author_profile: false
|
||||||
|
excerpt: "Data parallel API"
|
||||||
|
header:
|
||||||
|
overlay_color: "#5DADE2"
|
||||||
|
permalink: /docs/API/introduction.html
|
||||||
|
sidebar:
|
||||||
|
nav : docs
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
Data parallel array indices are divided into two types.
|
||||||
|
|
||||||
|
* Internal indices, such as complex, colour, spin degrees of freedom
|
||||||
|
* spatial (space-time) indices.
|
||||||
|
|
||||||
|
The ranges of all internal degrees are determined by template parameters,
|
||||||
|
and known at compile time. The ranges of spatial indices are dynamic, run time
|
||||||
|
values and the Cartesian structure information is contained and accessed via `Grid` objects.
|
||||||
|
|
||||||
|
Grid objects are the controlling entity for the decomposition of a distributed `Lattice`
|
||||||
|
array across MPI tasks, nodes, SIMD lanes, accelerators. Threaded loops are used
|
||||||
|
as appropriate on host code.
|
||||||
|
|
||||||
|
Data parallel operations can only be performed between Lattice objects constructed
|
||||||
|
from the same Grid pointer. These are called `conformable` operations.
|
||||||
|
|
||||||
|
We will focus initially on the internal indices as these are the building blocks assembled
|
||||||
|
in Lattice container classes. Every Lattice container class constructor requires a Grid object
|
||||||
|
pointer.
|
||||||
|
|
||||||
@@ -0,0 +1,560 @@
|
|||||||
|
---
|
||||||
|
title : "API Documentation"
|
||||||
|
author_profile: false
|
||||||
|
excerpt: "Lattice containers"
|
||||||
|
header:
|
||||||
|
overlay_color: "#5DADE2"
|
||||||
|
permalink: /docs/API/lattice_containers.html
|
||||||
|
sidebar:
|
||||||
|
nav : docs
|
||||||
|
---
|
||||||
|
|
||||||
|
{% include toc icon="gears" title="Contents" %}
|
||||||
|
|
||||||
|
Lattice objects may be constructed to contain the local portion of a distribued array of any tensor type.
|
||||||
|
For performance reasons the tensor type uses a vector `Real` or `Complex` as the fundamental datum.
|
||||||
|
|
||||||
|
Every lattice requires a `GridBase` object pointer to be provided in its constructor. Memory is allocated
|
||||||
|
at construction time. If a Lattice is passed a RedBlack grid, it allocates
|
||||||
|
half the storage of the full grid, and may either store the red or black checkerboard. The Lattice object
|
||||||
|
will automatically track through assignments which checkerboard it refers to.
|
||||||
|
For example, shifting a Even checkerboard by an odd distance produces an Odd result field.
|
||||||
|
|
||||||
|
Struct of array objects are defined, and used in the template parameters to the lattice class.
|
||||||
|
|
||||||
|
**Example** (`lib/qcd/QCD.h`):
|
||||||
|
|
||||||
|
```c++
|
||||||
|
template<typename vtype> using iSpinMatrix = iScalar<iMatrix<iScalar<vtype>, Ns> >;
|
||||||
|
typedef iSpinMatrix<ComplexF> SpinMatrixF; //scalar
|
||||||
|
typedef iSpinMatrix<vComplexF> vSpinMatrixF;//vectorised
|
||||||
|
typedef Lattice<vSpinMatrixF> LatticeSpinMatrixF;
|
||||||
|
```
|
||||||
|
|
||||||
|
The full range of QCD relevant lattice objects is given below.
|
||||||
|
|
||||||
|
|-----------|------------|----------|-----------|---------------|---------------------------------|--------------------------|
|
||||||
|
| Lattice | Lorentz | Spin | Colour | scalar_type | Field | Synonym |
|
||||||
|
|-----------|------------|----------|-----------|---------------|---------------------------------|--------------------------|
|
||||||
|
|`Vector` | `Scalar` | `Scalar` | `Scalar` | `RealD` | `LatticeRealD` | N/A |
|
||||||
|
|`Vector` | `Scalar` | `Scalar` | `Scalar` | `ComplexD` | `LatticeComplexD` | N/A |
|
||||||
|
|`Vector` | `Scalar` | `Scalar` | `Matrix` | `ComplexD` | `LatticeColourMatrixD` | `LatticeGaugeLink` |
|
||||||
|
|`Vector` | `Vector` | `Scalar` | `Matrix` | `ComplexD` | `LatticeLorentzColourMatrixD` | `LatticeGaugeFieldD` |
|
||||||
|
|`Vector` | `Scalar` | `Vector` | `Vector` | `ComplexD` | `LatticeSpinColourVectorD` | `LatticeFermionD` |
|
||||||
|
|`Vector` | `Scalar` | `Vector` | `Vector` | `ComplexD` | `LatticeHalfSpinColourVectorD` | `LatticeHalfFermionD` |
|
||||||
|
|`Vector` | `Scalar` | `Matrix` | `Matrix` | `ComplexD` | `LatticeSpinColourMatrixD` | `LatticePropagatorD` |
|
||||||
|
|-----------|------------|----------|-----------|---------------|---------------------------------|--------------------------|
|
||||||
|
|
||||||
|
Additional single precison variants are defined with the suffix `F`.
|
||||||
|
Other lattice objects can be defined using the sort of typedef's shown above if needed.
|
||||||
|
|
||||||
|
### Opaque containers
|
||||||
|
|
||||||
|
The layout within the container is complicated to enable maximum opportunity for vectorisation, and
|
||||||
|
is opaque from the point of view of the API definition. The key implementation observation is that
|
||||||
|
so long as data parallel operations are performed and adjacent SIMD lanes correspond to well separated
|
||||||
|
lattice sites, then identical operations are performed on all SIMD lanes and enable good vectorisation.
|
||||||
|
|
||||||
|
Because the layout is opaque, import and export routines from naturally ordered x,y,z,t arrays
|
||||||
|
are provided (`lib/lattice/Lattice_transfer.h`):
|
||||||
|
|
||||||
|
```c++
|
||||||
|
unvectorizeToLexOrdArray(std::vector<sobj> &out, const Lattice<vobj> &in);
|
||||||
|
vectorizeFromLexOrdArray(std::vector<sobj> &in , Lattice<vobj> &out);
|
||||||
|
```
|
||||||
|
|
||||||
|
The Lexicographic order of data in the external vector fields is defined by (`lib/util/Lexicographic.h`):
|
||||||
|
|
||||||
|
```c++
|
||||||
|
Lexicographic::IndexFromCoor(const Coordinate &lcoor, int &lex,Coordinate *local_dims);
|
||||||
|
```
|
||||||
|
|
||||||
|
This ordering is $$x + L_x * y + L_x*L_y*z + L_x*L_y*L_z *t$$
|
||||||
|
|
||||||
|
Peek and poke routines are provided to perform single site operations. These operations are
|
||||||
|
extremely low performance and are not intended for algorithm development or performance critical code.
|
||||||
|
|
||||||
|
The following are "collective" operations and involve communication between nodes. All nodes receive the same
|
||||||
|
result by broadcast from the owning node:
|
||||||
|
|
||||||
|
```c++
|
||||||
|
void peekSite(sobj &s,const Lattice<vobj> &l,const Coordinate &site);
|
||||||
|
void pokeSite(const sobj &s,Lattice<vobj> &l,const Coordinate &site);
|
||||||
|
```
|
||||||
|
|
||||||
|
The following are executed independently by each node:
|
||||||
|
|
||||||
|
```c++
|
||||||
|
void peekLocalSite(sobj &s,const Lattice<vobj> &l,Coordinate &site);
|
||||||
|
void pokeLocalSite(const sobj &s,Lattice<vobj> &l,Coordinate &site);
|
||||||
|
```
|
||||||
|
|
||||||
|
Lattices of one tensor type may be transformed into lattices of another tensor type by
|
||||||
|
peeking and poking specific indices in a data parallel manner:
|
||||||
|
|
||||||
|
```c++
|
||||||
|
template<int Index,class vobj> // Vector data parallel index peek
|
||||||
|
auto PeekIndex(const Lattice<vobj> &lhs,int i);
|
||||||
|
|
||||||
|
template<int Index,class vobj> // Matrix data parallel index peek
|
||||||
|
auto PeekIndex(const Lattice<vobj> &lhs,int i,int j);
|
||||||
|
|
||||||
|
template<int Index,class vobj> // Vector poke
|
||||||
|
void PokeIndex(Lattice<vobj> &lhs,const Lattice<> & rhs,int i)
|
||||||
|
|
||||||
|
template<int Index,class vobj> // Matrix poke
|
||||||
|
void PokeIndex(Lattice<vobj> &lhs,const Lattice<> & rhs,int i,int j)
|
||||||
|
```
|
||||||
|
|
||||||
|
The inconsistent capitalisation on the letter P is due to an obscure bug in g++ that has not to
|
||||||
|
our knowledge been fixed in any version. The bug was reported in 2016.
|
||||||
|
|
||||||
|
### Global Reduction operations
|
||||||
|
|
||||||
|
Reduction operations for any lattice field are provided. The result is identical on each computing node
|
||||||
|
that is part of the relevant Grid communicator:
|
||||||
|
|
||||||
|
```c++
|
||||||
|
template<class vobj>
|
||||||
|
RealD norm2(const Lattice<vobj> &arg);
|
||||||
|
|
||||||
|
template<class vobj>
|
||||||
|
ComplexD innerProduct(const Lattice<vobj> &left,const Lattice<vobj> &right);
|
||||||
|
|
||||||
|
template<class vobj>
|
||||||
|
vobj sum(const Lattice<vobj> &arg)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Site local reduction operations
|
||||||
|
|
||||||
|
Internal indices may be reduced, site by site, using the following routines:
|
||||||
|
|
||||||
|
```c++
|
||||||
|
template<class vobj>
|
||||||
|
auto localNorm2 (const Lattice<vobj> &rhs)
|
||||||
|
|
||||||
|
template<class vobj>
|
||||||
|
auto localInnerProduct (const Lattice<vobj> &lhs,const Lattice<vobj> &rhs)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Outer product
|
||||||
|
|
||||||
|
A site local outer product is defined:
|
||||||
|
|
||||||
|
```c++
|
||||||
|
template<class ll,class rr>
|
||||||
|
auto outerProduct (const Lattice<ll> &lhs,const Lattice<rr> &rhs)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Slice operations
|
||||||
|
|
||||||
|
Slice operations are defined to operate on one lower dimension than the full lattice. The omitted dimension
|
||||||
|
is the parameter orthogdim:
|
||||||
|
|
||||||
|
```c++
|
||||||
|
template<class vobj>
|
||||||
|
void sliceSum(const Lattice<vobj> &Data,
|
||||||
|
std::vector<typename vobj::scalar_object> &result,
|
||||||
|
int orthogdim);
|
||||||
|
|
||||||
|
template<class vobj>
|
||||||
|
void sliceInnerProductVector( std::vector<ComplexD> & result,
|
||||||
|
const Lattice<vobj> &lhs,
|
||||||
|
const Lattice<vobj> &rhs,
|
||||||
|
int orthogdim);
|
||||||
|
|
||||||
|
template<class vobj>
|
||||||
|
void sliceNorm (std::vector<RealD> &sn,
|
||||||
|
const Lattice<vobj> &rhs,
|
||||||
|
int orthogdim);
|
||||||
|
```
|
||||||
|
|
||||||
|
### Data parallel expression template engine
|
||||||
|
|
||||||
|
The standard arithmetic operators and some data parallel library functions are implemented site by site
|
||||||
|
on lattice types.
|
||||||
|
|
||||||
|
Operations may only ever combine lattice objects that have been constructed from the **same** grid pointer.
|
||||||
|
|
||||||
|
**Example**:
|
||||||
|
|
||||||
|
```c++
|
||||||
|
LatticeFermionD A(&grid);
|
||||||
|
LatticeFermionD B(&grid);
|
||||||
|
LatticeFermionD C(&grid);
|
||||||
|
|
||||||
|
A = B - C;
|
||||||
|
```
|
||||||
|
|
||||||
|
Such operations are said to be **conformable** and are the lattice are guaranteed to have the same dimensions
|
||||||
|
and both MPI and SIMD decomposition because they are based on the same grid object. The conformability check
|
||||||
|
is lightweight and simply requires the same grid pointers be passed to the lattice objects. The data members
|
||||||
|
of the grid objects are not compared.
|
||||||
|
|
||||||
|
Conformable lattice fields may be combined with appropriate scalar types in expressions. The implemented
|
||||||
|
rules follow those already documented for the tensor types.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
### Unary operators and functions
|
||||||
|
|
||||||
|
The following sitewise unary operations are defined:
|
||||||
|
|
||||||
|
|-----------------------|---------------------------------------------|
|
||||||
|
| Operation | Description |
|
||||||
|
|-----------------------|---------------------------------------------|
|
||||||
|
|`operator-` | negate |
|
||||||
|
|`adj` | Hermitian conjugate |
|
||||||
|
|`conjugate` | complex conjugate |
|
||||||
|
|`trace` | sitewise trace |
|
||||||
|
|`transpose` | sitewise transpose |
|
||||||
|
|`Ta` | take traceles anti Hermitian part |
|
||||||
|
|`ProjectOnGroup` | reunitarise or orthogonalise |
|
||||||
|
|`real` | take the real part |
|
||||||
|
|`imag` | take the imaginary part |
|
||||||
|
|`toReal` | demote complex to real |
|
||||||
|
|`toComplex` | promote real to complex |
|
||||||
|
|`timesI` | elementwise +i mult (0 is not multiplied) |
|
||||||
|
|`timesMinusI` | elementwise -i mult (0 is not multiplied) |
|
||||||
|
|`abs` | elementwise absolute value |
|
||||||
|
|`sqrt` | elementwise square root |
|
||||||
|
|`rsqrt` | elementwise reciprocal square root |
|
||||||
|
|`sin` | elementwise sine |
|
||||||
|
|`cos` | elementwise cosine |
|
||||||
|
|`asin` | elementwise inverse sine |
|
||||||
|
|`acos` | elementwise inverse cosine |
|
||||||
|
|`log` | elementwise logarithm |
|
||||||
|
|`exp` | elementwise exponentiation |
|
||||||
|
|`operator!` | Logical negation of integer field |
|
||||||
|
|`Not` | Logical negation of integer field |
|
||||||
|
|-----------------------|---------------------------------------------|
|
||||||
|
|
||||||
|
The following sitewise applied functions with additional parameters are:
|
||||||
|
|
||||||
|
```c++
|
||||||
|
template<class obj> Lattice<obj> pow(const Lattice<obj> &rhs_i,RealD y);
|
||||||
|
|
||||||
|
template<class obj> Lattice<obj> mod(const Lattice<obj> &rhs_i,Integer y);
|
||||||
|
|
||||||
|
template<class obj> Lattice<obj> div(const Lattice<obj> &rhs_i,Integer y);
|
||||||
|
|
||||||
|
template<class obj> Lattice<obj>
|
||||||
|
expMat(const Lattice<obj> &rhs_i, RealD alpha, Integer Nexp = DEFAULT_MAT_EXP);
|
||||||
|
```
|
||||||
|
|
||||||
|
### Binary operators
|
||||||
|
|
||||||
|
The following binary operators are defined:
|
||||||
|
|
||||||
|
```
|
||||||
|
operator+
|
||||||
|
operator-
|
||||||
|
operator*
|
||||||
|
operator/
|
||||||
|
```
|
||||||
|
|
||||||
|
Logical are defined on LatticeInteger types:
|
||||||
|
|
||||||
|
```
|
||||||
|
operator&
|
||||||
|
operator|
|
||||||
|
operator&&
|
||||||
|
operator||
|
||||||
|
```
|
||||||
|
|
||||||
|
### Ternary operator, logical operatons and where
|
||||||
|
|
||||||
|
Within the data parallel level of the API the only way to perform operations
|
||||||
|
that are differentiated between sites is use predicated execution.
|
||||||
|
|
||||||
|
The predicate takes the form of a `LatticeInteger` which is confromable with both
|
||||||
|
the `iftrue` and `iffalse` argument:
|
||||||
|
|
||||||
|
```c++
|
||||||
|
template<class vobj,class iobj> void where(const Lattice<iobj> &pred,
|
||||||
|
Lattice<vobj> &iftrue,
|
||||||
|
Lattice<vobj> &iffalse);
|
||||||
|
```
|
||||||
|
This plays the data parallel analogue of the C++ ternary operator:
|
||||||
|
|
||||||
|
```c++
|
||||||
|
a = b ? c : d;
|
||||||
|
```
|
||||||
|
|
||||||
|
In order to create the predicate in a coordinate dependent fashion it is often useful
|
||||||
|
to use the lattice coordinates.
|
||||||
|
|
||||||
|
The `LatticeCoordinate` function:
|
||||||
|
|
||||||
|
```c++
|
||||||
|
template<class iobj> LatticeCoordinate(Lattice<iobj> &coor,int dir);
|
||||||
|
```
|
||||||
|
|
||||||
|
fills an `Integer` field with the coordinate in the N-th dimension.
|
||||||
|
A usage example is given
|
||||||
|
|
||||||
|
**Example**:
|
||||||
|
|
||||||
|
```c++
|
||||||
|
int dir =3;
|
||||||
|
int block=4;
|
||||||
|
LatticeInteger coor(FineGrid);
|
||||||
|
|
||||||
|
LatticeCoordinate(coor,dir);
|
||||||
|
|
||||||
|
result = where(mod(coor,block)==(block-1),x,z);
|
||||||
|
```
|
||||||
|
|
||||||
|
(Other usage cases of LatticeCoordinate include the generation of plane wave momentum phases.)
|
||||||
|
|
||||||
|
### Site local fused operations
|
||||||
|
|
||||||
|
The biggest limitation of expression template engines is that the optimisation
|
||||||
|
visibility is a single assignment statement in the original source code.
|
||||||
|
|
||||||
|
There is no scope for loop fusion between multiple statements.
|
||||||
|
Multi-loop fusion gives scope for greater cache locality.
|
||||||
|
|
||||||
|
Two primitives for hardware aware parallel loops are provided.
|
||||||
|
These will operate directly on the site objects which are expanded by a factor
|
||||||
|
of the vector length (in our struct of array datatypes).
|
||||||
|
|
||||||
|
Since the mapping of sites
|
||||||
|
to data lanes is opaque, these vectorised loops
|
||||||
|
are *only* appropriate for optimisation of site local operations.
|
||||||
|
|
||||||
|
### View objects
|
||||||
|
|
||||||
|
Due to an obscure aspect of the way that Nvidia handle device C++11 lambda functions,
|
||||||
|
it is necessary to disable the indexing of a Lattice object.
|
||||||
|
|
||||||
|
Rather, a reference to a lattice object must be first obtained.
|
||||||
|
|
||||||
|
The reference is copyable to a GPU, and is able to be indexed on either accelerator code,
|
||||||
|
or by host code.
|
||||||
|
|
||||||
|
In order to prevent people developing code that dereferences Lattice objects in a way that
|
||||||
|
works on CPU compilation, but fails on GPU compilation, we have decided to remove the ability
|
||||||
|
to index a lattice object on CPU code.
|
||||||
|
|
||||||
|
As a result of Nvidia's constraints, all accesses to lattice objects are required to be made
|
||||||
|
through a View object.
|
||||||
|
|
||||||
|
In the following, the type is `LatticeView<vobj>`, however it is wise to use the C++11 auto keyword
|
||||||
|
to avoid naming the type. See code examples below.
|
||||||
|
|
||||||
|
|
||||||
|
### thread_loops
|
||||||
|
|
||||||
|
The first parallel primitive is the thread_loop
|
||||||
|
|
||||||
|
**Example**:
|
||||||
|
|
||||||
|
```c++
|
||||||
|
LatticeField r(grid);
|
||||||
|
LatticeField x(grid);
|
||||||
|
LatticeField p(grid);
|
||||||
|
LatticeField mmp(grid);
|
||||||
|
auto r_v = r.View();
|
||||||
|
auto x_v = x.View();
|
||||||
|
auto p_v = p.View();
|
||||||
|
auto mmp_v = mmp.View();
|
||||||
|
thread_loop(s , r_v, {
|
||||||
|
r_v[s] = r_v[s] - a * mmp_v[s];
|
||||||
|
x_v[s] = x_v[s] + a*p_v[s];
|
||||||
|
p_v[s] = p_v[s]*b + r_v[s];
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
### accelerator_loops
|
||||||
|
|
||||||
|
The second parallel primitive is an accelerated_loop
|
||||||
|
|
||||||
|
**Example**:
|
||||||
|
|
||||||
|
```c++
|
||||||
|
LatticeField r(grid);
|
||||||
|
LatticeField x(grid);
|
||||||
|
LatticeField p(grid);
|
||||||
|
LatticeField mmp(grid);
|
||||||
|
auto r_v = r.View();
|
||||||
|
auto x_v = x.View();
|
||||||
|
auto p_v = p.View();
|
||||||
|
auto mmp_v = mmp.View();
|
||||||
|
accelerator_loop(s , r_v, {
|
||||||
|
r_v[s] = r_v[s] - a * mmp_v[s];
|
||||||
|
x_v[s] = x_v[s] + a*p_v[s];
|
||||||
|
p_v[s] = p_v[s]*b + r_v[s];
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
### Cshift
|
||||||
|
|
||||||
|
Site shifting operations are provided using the Cshift function:
|
||||||
|
|
||||||
|
```c++
|
||||||
|
template<class vobj>
|
||||||
|
Lattice<vobj> Cshift(const Lattice<vobj> &rhs,int dimension,int shift)
|
||||||
|
```
|
||||||
|
|
||||||
|
This shifts the whole vector by any distance shift in the appropriate dimension.
|
||||||
|
|
||||||
|
For the avoidance of doubt on direction conventions,a positive shift moves the
|
||||||
|
lattice site $$x_mu = 1$$ in the rhs to $$x_mu = 0$$ in the result.
|
||||||
|
|
||||||
|
**Example** (`benchmarks/Benchmark_wilson.cc`):
|
||||||
|
|
||||||
|
```c++
|
||||||
|
{ // Naive wilson implementation
|
||||||
|
ref = Zero();
|
||||||
|
for(int mu=0;mu<Nd;mu++){
|
||||||
|
|
||||||
|
tmp = U[mu]*Cshift(src,mu,1);
|
||||||
|
{
|
||||||
|
auto ref_v = ref.View();
|
||||||
|
auto tmp_v = tmp.View();
|
||||||
|
for(int i=0;i<ref_v.size();i++){
|
||||||
|
ref_v[i]+= tmp_v[i] - Gamma(Gmu[mu])*tmp_v[i]; ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
tmp =adj(U[mu])*src;
|
||||||
|
tmp =Cshift(tmp,mu,-1);
|
||||||
|
{
|
||||||
|
auto ref_v = ref.View();
|
||||||
|
auto tmp_v = tmp.View();
|
||||||
|
for(int i=0;i<ref_v.size();i++){
|
||||||
|
ref_v[i]+= tmp_v[i] + Gamma(Gmu[mu])*tmp_v[i]; ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### CovariantCshift
|
||||||
|
|
||||||
|
Covariant Cshift operations are provided for common cases of boundary condition. These may be further optimised
|
||||||
|
in future:
|
||||||
|
|
||||||
|
```c++
|
||||||
|
template<class covariant,class gauge>
|
||||||
|
Lattice<covariant> CovShiftForward(const Lattice<gauge> &Link, int mu,
|
||||||
|
const Lattice<covariant> &field);
|
||||||
|
|
||||||
|
template<class covariant,class gauge>
|
||||||
|
Lattice<covariant> CovShiftBackward(const Lattice<gauge> &Link, int mu,
|
||||||
|
const Lattice<covariant> &field);
|
||||||
|
```
|
||||||
|
|
||||||
|
### Boundary conditions
|
||||||
|
|
||||||
|
The covariant shift routines occur in namespaces PeriodicBC and ConjugateBC. The correct covariant shift
|
||||||
|
for the boundary condition is passed into the gauge actions and wilson loops via an
|
||||||
|
"Impl" template policy class.
|
||||||
|
|
||||||
|
The relevant staples, plaquettes, and loops are formed by using the provided method:
|
||||||
|
|
||||||
|
```c++
|
||||||
|
Impl::CovShiftForward
|
||||||
|
Impl::CovShiftBackward
|
||||||
|
```
|
||||||
|
|
||||||
|
etc... This makes physics code transform appropriately with externally supplied rules about
|
||||||
|
treating the boundary.
|
||||||
|
|
||||||
|
**Example** (`lib/qcd/util/WilsonLoops.h`):
|
||||||
|
|
||||||
|
```c++
|
||||||
|
static void dirPlaquette(GaugeMat &plaq, const std::vector<GaugeMat> &U,
|
||||||
|
const int mu, const int nu) {
|
||||||
|
// ___
|
||||||
|
//| |
|
||||||
|
//|<__|
|
||||||
|
plaq = Gimpl::CovShiftForward(U[mu],mu,
|
||||||
|
Gimpl::CovShiftForward(U[nu],nu,
|
||||||
|
Gimpl::CovShiftBackward(U[mu],mu,
|
||||||
|
Gimpl::CovShiftIdentityBackward(U[nu], nu))));
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Inter-grid transfer operations
|
||||||
|
|
||||||
|
Transferring between different checkerboards of the same global lattice:
|
||||||
|
|
||||||
|
```c++
|
||||||
|
template<class vobj> void pickCheckerboard(int cb,Lattice<vobj> &half,const Lattice<vobj> &full);
|
||||||
|
template<class vobj> void setCheckerboard(Lattice<vobj> &full,const Lattice<vobj> &half);
|
||||||
|
```
|
||||||
|
|
||||||
|
These are used to set up Schur red-black decomposed solvers, for example.
|
||||||
|
|
||||||
|
Multi-grid projection between a fine and coarse grid:
|
||||||
|
|
||||||
|
```c++
|
||||||
|
template<class vobj,class CComplex,int nbasis>
|
||||||
|
void blockProject(Lattice<iVector<CComplex,nbasis > > &coarseData,
|
||||||
|
const Lattice<vobj> &fineData,
|
||||||
|
const std::vector<Lattice<vobj> > &Basis);
|
||||||
|
```
|
||||||
|
|
||||||
|
Multi-grid promotion to a finer grid:
|
||||||
|
|
||||||
|
```c++
|
||||||
|
template<class vobj,class CComplex,int nbasis>
|
||||||
|
void blockPromote(const Lattice<iVector<CComplex,nbasis > > &coarseData,
|
||||||
|
Lattice<vobj> &fineData,
|
||||||
|
const std::vector<Lattice<vobj> > &Basis)
|
||||||
|
```
|
||||||
|
|
||||||
|
Support for sub-block Linear algebra:
|
||||||
|
|
||||||
|
```c++
|
||||||
|
template<class vobj,class CComplex>
|
||||||
|
void blockZAXPY(Lattice<vobj> &fineZ,
|
||||||
|
const Lattice<CComplex> &coarseA,
|
||||||
|
const Lattice<vobj> &fineX,
|
||||||
|
const Lattice<vobj> &fineY)
|
||||||
|
|
||||||
|
template<class vobj,class CComplex>
|
||||||
|
void blockInnerProduct(Lattice<CComplex> &CoarseInner,
|
||||||
|
const Lattice<vobj> &fineX,
|
||||||
|
const Lattice<vobj> &fineY)
|
||||||
|
|
||||||
|
template<class vobj,class CComplex>
|
||||||
|
void blockNormalise(Lattice<CComplex> &ip,Lattice<vobj> &fineX)
|
||||||
|
|
||||||
|
template<class vobj>
|
||||||
|
void blockSum(Lattice<vobj> &coarseData,const Lattice<vobj> &fineData)
|
||||||
|
|
||||||
|
template<class vobj,class CComplex>
|
||||||
|
void blockOrthogonalise(Lattice<CComplex> &ip,std::vector<Lattice<vobj> > &Basis)
|
||||||
|
```
|
||||||
|
|
||||||
|
Conversion between different SIMD layouts:
|
||||||
|
|
||||||
|
```c++
|
||||||
|
template<class vobj,class vvobj>
|
||||||
|
void localConvert(const Lattice<vobj> &in,Lattice<vvobj> &out)
|
||||||
|
```
|
||||||
|
|
||||||
|
Slices between grid of dimension N and grid of dimentions N+1:
|
||||||
|
|
||||||
|
```c++
|
||||||
|
template<class vobj>
|
||||||
|
void InsertSlice(const Lattice<vobj> &lowDim,Lattice<vobj> & higherDim,int slice, int orthog)
|
||||||
|
|
||||||
|
template<class vobj>
|
||||||
|
void ExtractSlice(Lattice<vobj> &lowDim,const Lattice<vobj> & higherDim,int slice, int orthog)
|
||||||
|
```
|
||||||
|
|
||||||
|
Growing a lattice by a multiple factor, with periodic replication:
|
||||||
|
|
||||||
|
```c++
|
||||||
|
template<class vobj>
|
||||||
|
void Replicate(Lattice<vobj> &coarse,Lattice<vobj> & fine)
|
||||||
|
```
|
||||||
|
|
||||||
|
That latter is useful to, for example, pre-thermalise a smaller volume and then grow the volume in HMC.
|
||||||
|
It was written while debugging G-parity boundary conditions.
|
||||||
@@ -0,0 +1,107 @@
|
|||||||
|
---
|
||||||
|
title : "API Documentation"
|
||||||
|
author_profile: false
|
||||||
|
excerpt: "Random number generators"
|
||||||
|
header:
|
||||||
|
overlay_color: "#5DADE2"
|
||||||
|
permalink: /docs/API/random_number_generators.html
|
||||||
|
sidebar:
|
||||||
|
nav : docs
|
||||||
|
---
|
||||||
|
|
||||||
|
Grid provides three configure time options for random the number generator engine.
|
||||||
|
|
||||||
|
* `sitmo`
|
||||||
|
* `ranlux48`
|
||||||
|
* `mt19937`
|
||||||
|
|
||||||
|
The selection is controlled by the `--enable-rng=<option>` flag.
|
||||||
|
|
||||||
|
Sitmo is the default Grid RNG and is recommended. It is a hash based RNG that is cryptographically secure and has
|
||||||
|
|
||||||
|
#. passed the BigCrush tests
|
||||||
|
|
||||||
|
#. can Skip forward an arbitrary distance (up to 2^256) in O(1) time
|
||||||
|
|
||||||
|
We use Skip functionality to place each site in an independent well separated stream.
|
||||||
|
The Skip was trivially parallelised, important in a many core node,
|
||||||
|
and gives very low overhead parallel RNG initialisation.
|
||||||
|
|
||||||
|
Our implementation of parallel RNG
|
||||||
|
|
||||||
|
* Has passed the BigCrush tests **drawing once from each site RNG** in a round robin fashion.
|
||||||
|
|
||||||
|
This test is applied in `tests/testu01/Test_smallcrush.cc`
|
||||||
|
|
||||||
|
The interface is as follows::
|
||||||
|
|
||||||
|
```c++
|
||||||
|
class GridSerialRNG {
|
||||||
|
GridSerialRNG();
|
||||||
|
void SeedFixedIntegers(const std::vector<int> &seeds);
|
||||||
|
}
|
||||||
|
|
||||||
|
class GridParallelRNG {
|
||||||
|
GridParallelRNG(GridBase *grid);
|
||||||
|
void SeedFixedIntegers(const std::vector<int> &seeds);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class vobj> void random(GridParallelRNG &rng,Lattice<vobj> &l) { rng.fill(l,rng._uniform); }
|
||||||
|
template <class vobj> void gaussian(GridParallelRNG &rng,Lattice<vobj> &l) { rng.fill(l,rng._gaussian); }
|
||||||
|
|
||||||
|
template <class sobj> void random(GridSerialRNG &rng,sobj &l) { rng.fill(l,rng._uniform ); }
|
||||||
|
template <class sobj> void gaussian(GridSerialRNG &rng,sobj &l) { rng.fill(l,rng._gaussian ); }
|
||||||
|
```
|
||||||
|
|
||||||
|
* Serial RNG's are used to assign scalar fields.
|
||||||
|
|
||||||
|
* Parallel RNG's are used to assign lattice fields and must subdivide the field grid (need not be conformable).
|
||||||
|
|
||||||
|
It is the API users responsibility to initialise, manage, save and restore these RNG state for their algorithm.
|
||||||
|
In particular there is no single globally managed RNG state.
|
||||||
|
|
||||||
|
Input/Output routines are provided for saving and restoring RNG states.
|
||||||
|
|
||||||
|
`lib/parallelIO/BinaryIO.h`:
|
||||||
|
|
||||||
|
```c++
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Read a RNG; use IOobject and lexico map to an array of state
|
||||||
|
////////////////////////////////////////////////////////////////////////////
|
||||||
|
static void readRNG(GridSerialRNG &serial,
|
||||||
|
GridParallelRNG ¶llel,
|
||||||
|
std::string file,
|
||||||
|
Integer offset,
|
||||||
|
uint32_t &nersc_csum,
|
||||||
|
uint32_t &scidac_csuma,
|
||||||
|
uint32_t &scidac_csumb)
|
||||||
|
////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Write a RNG; lexico map to an array of state and use IOobject
|
||||||
|
////////////////////////////////////////////////////////////////////////////
|
||||||
|
static void writeRNG(GridSerialRNG &serial,
|
||||||
|
GridParallelRNG ¶llel,
|
||||||
|
std::string file,
|
||||||
|
Integer offset,
|
||||||
|
uint32_t &nersc_csum,
|
||||||
|
uint32_t &scidac_csuma,
|
||||||
|
uint32_t &scidac_csumb)
|
||||||
|
|
||||||
|
lib/parallelIO/NerscIO.h::
|
||||||
|
|
||||||
|
void writeRNGState(GridSerialRNG &serial,GridParallelRNG ¶llel,std::string file);
|
||||||
|
|
||||||
|
void readRNG(GridSerialRNG &serial,
|
||||||
|
GridParallelRNG ¶llel,
|
||||||
|
std::string file,
|
||||||
|
Integer offset,
|
||||||
|
uint32_t &nersc_csum,
|
||||||
|
uint32_t &scidac_csuma,
|
||||||
|
uint32_t &scidac_csumb);
|
||||||
|
```
|
||||||
|
|
||||||
|
**Example**:
|
||||||
|
|
||||||
|
```c++
|
||||||
|
NerscIO::writeRNGState(sRNG,pRNG,rfile);
|
||||||
|
```
|
||||||
@@ -0,0 +1,443 @@
|
|||||||
|
---
|
||||||
|
title : "API Documentation"
|
||||||
|
author_profile: false
|
||||||
|
excerpt: "Tensor classes"
|
||||||
|
header:
|
||||||
|
overlay_color: "#5DADE2"
|
||||||
|
permalink: /docs/API/tensor_classes.html
|
||||||
|
sidebar:
|
||||||
|
nav : docs
|
||||||
|
---
|
||||||
|
|
||||||
|
The Tensor data structures are built up from fundamental
|
||||||
|
scalar matrix and vector classes:
|
||||||
|
|
||||||
|
```c++
|
||||||
|
template<class vobj > class iScalar { private: vobj _internal ; }
|
||||||
|
template<class vobj,int N> class iVector { private: vobj _internal[N] ; }
|
||||||
|
template<class vobj,int N> class iMatrix { private: vobj _internal[N] ; }
|
||||||
|
```
|
||||||
|
|
||||||
|
These are template classes and can be passed a fundamental scalar or vector type, or
|
||||||
|
nested to form arbitrarily complicated tensor products of indices. All mathematical expressions
|
||||||
|
are defined to operate recursively, index by index.
|
||||||
|
|
||||||
|
Presently the constants
|
||||||
|
|
||||||
|
* `Nc`
|
||||||
|
* `Nd`
|
||||||
|
|
||||||
|
are globally predefined. However, this is planned for changed in future and policy classes
|
||||||
|
for different theories (e.g. QCD, QED, SU2 etc...) will contain these constants and enable multiple
|
||||||
|
theories to coexist more naturally.
|
||||||
|
|
||||||
|
Arbitrary tensor products of fundamental scalar, vector
|
||||||
|
and matrix objects may be formed in principle by the basic Grid code.
|
||||||
|
|
||||||
|
For Lattice field theory, we define types according to the following tensor
|
||||||
|
product structure ordering. The suffix "D" indicates either double types, and
|
||||||
|
replacing with "F" gives the corresponding single precision type.
|
||||||
|
|
||||||
|
|Lattice | Lorentz | Spin | Colour | scalar_type | Field |
|
||||||
|
|---------|----------|-----------|----------|-------------|--------------------------|
|
||||||
|
|Scalar | Scalar | Scalar | Scalar | RealD | RealD |
|
||||||
|
|Scalar | Scalar | Scalar | Scalar | ComplexD | ComplexD |
|
||||||
|
|Scalar | Scalar | Scalar | Matrix | ComplexD | ColourMatrixD |
|
||||||
|
|Scalar | Vector | Scalar | Matrix | ComplexD | LorentzColourMatrixD |
|
||||||
|
|Scalar | Scalar | Vector | Vector | ComplexD | SpinColourVectorD |
|
||||||
|
|Scalar | Scalar | Vector | Vector | ComplexD | HalfSpinColourVectorD |
|
||||||
|
|Scalar | Scalar | Matrix | Matrix | ComplexD | SpinColourMatrixD |
|
||||||
|
|---------|----------|-----------|----------|-------------|--------------------------|
|
||||||
|
|
||||||
|
The types are implemented via a recursive tensor nesting system.
|
||||||
|
|
||||||
|
**Example** we declare:
|
||||||
|
|
||||||
|
```c++
|
||||||
|
template<typename vtype>
|
||||||
|
using iLorentzColourMatrix = iVector<iScalar<iMatrix<vtype, Nc> >, Nd > ;
|
||||||
|
|
||||||
|
typedef iLorentzColourMatrix<ComplexD > LorentzColourMatrixD;
|
||||||
|
```
|
||||||
|
|
||||||
|
**Example** we declare:
|
||||||
|
|
||||||
|
```c++
|
||||||
|
template<typename vtype>
|
||||||
|
using iLorentzColourMatrix = iVector<iScalar<iMatrix<vtype, Nc> >, Nd > ;
|
||||||
|
|
||||||
|
typedef iLorentzColourMatrix<ComplexD > LorentzColourMatrixD;
|
||||||
|
```
|
||||||
|
|
||||||
|
Arbitrarily deep tensor nests may be formed. Grid uses a positional and numerical rule to associate indices for contraction
|
||||||
|
in the Einstein summation sense.
|
||||||
|
|
||||||
|
|----------------|---------|------------|
|
||||||
|
| Symbolic name | Number | Position |
|
||||||
|
|----------------|---------|------------|
|
||||||
|
|`LorentzIndex` | 0 | left |
|
||||||
|
|`SpinIndex` | 1 | middle |
|
||||||
|
|`ColourIndex` | 2 | right |
|
||||||
|
|----------------|---------|------------|
|
||||||
|
|
||||||
|
The conventions are that the index ordering left to right are: Lorentz, Spin, Colour. A scalar type (either real
|
||||||
|
or complex, single or double precision) is be provided to the innermost structure.
|
||||||
|
|
||||||
|
|
||||||
|
### Tensor arithmetic rules (`lib/tensors/Tensor_arith.h`)
|
||||||
|
|
||||||
|
Arithmetic rules are defined on these types
|
||||||
|
|
||||||
|
The multiplication operator follows the natural multiplication
|
||||||
|
table for each index, index level by index level.
|
||||||
|
|
||||||
|
`Operator *`
|
||||||
|
|
||||||
|
|----|----|----|----|
|
||||||
|
| x | S | V | M |
|
||||||
|
|----|----|----|----|
|
||||||
|
| S | S | V | M |
|
||||||
|
| V | S | S | V |
|
||||||
|
| M | M | V | M |
|
||||||
|
|----|----|----|----|
|
||||||
|
|
||||||
|
The addition and subtraction rules disallow a scalar to be added to a vector,
|
||||||
|
and vector to be added to matrix. A scalar adds to a matrix on the diagonal.
|
||||||
|
|
||||||
|
`Operator +` and `Operator -`
|
||||||
|
|
||||||
|
|----|----|----|----|
|
||||||
|
| +/-| S | V | M |
|
||||||
|
|----|----|----|----|
|
||||||
|
| S | S | - | M |
|
||||||
|
| V | - | V | - |
|
||||||
|
| M | M | - | M |
|
||||||
|
|----|----|----|----|
|
||||||
|
|
||||||
|
|
||||||
|
The rules for a nested objects are recursively inferred level by level from basic rules of multiplication
|
||||||
|
addition and subtraction for scalar/vector/matrix. Legal expressions can only be formed between objects
|
||||||
|
with the same number of nested internal indices. All the Grid QCD datatypes have precisely three internal
|
||||||
|
indices, some of which may be trivial scalar to enable expressions to be formed.
|
||||||
|
|
||||||
|
Arithmetic operations are possible where the left or right operand is a scalar type.
|
||||||
|
|
||||||
|
**Example**:
|
||||||
|
|
||||||
|
```c++
|
||||||
|
LatticeColourMatrixD U(grid);
|
||||||
|
LatticeColourMatrixD Udag(grid);
|
||||||
|
|
||||||
|
Udag = adj(U);
|
||||||
|
|
||||||
|
RealD unitary_err = norm2(U*adj(U) - 1.0);
|
||||||
|
```
|
||||||
|
|
||||||
|
Will provide a measure of how discrepant from unitarity the matrix U is.
|
||||||
|
|
||||||
|
### Internal index manipulation (`lib/tensors/Tensor_index.h`)
|
||||||
|
|
||||||
|
General code can access any specific index by number with a peek/poke semantic:
|
||||||
|
|
||||||
|
```c++
|
||||||
|
// peek index number "Level" of a vector index
|
||||||
|
template<int Level,class vtype> auto peekIndex (const vtype &arg,int i);
|
||||||
|
|
||||||
|
// peek index number "Level" of a vector index
|
||||||
|
template<int Level,class vtype> auto peekIndex (const vtype &arg,int i,int j);
|
||||||
|
|
||||||
|
// poke index number "Level" of a vector index
|
||||||
|
template<int Level,class vtype>
|
||||||
|
void pokeIndex (vtype &pokeme,arg,int i)
|
||||||
|
|
||||||
|
// poke index number "Level" of a matrix index
|
||||||
|
template<int Level,class vtype>
|
||||||
|
void pokeIndex (vtype &pokeme,arg,int i,int j)
|
||||||
|
```
|
||||||
|
|
||||||
|
**Example**:
|
||||||
|
|
||||||
|
```c++
|
||||||
|
for (int mu = 0; mu < Nd; mu++) {
|
||||||
|
U[mu] = PeekIndex<LorentzIndex>(Umu, mu);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Similar to the QDP++ package convenience routines are provided to access specific elements of
|
||||||
|
vector and matrix internal index types by physics name or meaning aliases for the above routines
|
||||||
|
with the appropriate index constant.
|
||||||
|
|
||||||
|
* `peekColour`
|
||||||
|
* `peekSpin`
|
||||||
|
* `peekLorentz`
|
||||||
|
|
||||||
|
and
|
||||||
|
|
||||||
|
* `pokeColour`
|
||||||
|
* `pokeSpin`
|
||||||
|
* `pokeLorentz`
|
||||||
|
|
||||||
|
For example, we often store Gauge Fields with a Lorentz index, but can split them into
|
||||||
|
polarisations in relevant pieces of code.
|
||||||
|
|
||||||
|
**Example**:
|
||||||
|
|
||||||
|
```c++
|
||||||
|
for (int mu = 0; mu < Nd; mu++) {
|
||||||
|
U[mu] = peekLorentz(Umu, mu);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
For convenience, direct access as both an l-value and an r-value is provided by the parenthesis operator () on each of the Scalar, Vector and Matrix classes.
|
||||||
|
For example one may write
|
||||||
|
|
||||||
|
**Example**:
|
||||||
|
|
||||||
|
```c++
|
||||||
|
ColourMatrix A, B;
|
||||||
|
A()()(i,j) = B()()(j,i);
|
||||||
|
```
|
||||||
|
|
||||||
|
bearing in mind that empty parentheses are need to address a scalar entry in the tensor index nest.
|
||||||
|
|
||||||
|
The first (left) empty parentheses move past the (scalar) Lorentz level in the tensor nest, and the second
|
||||||
|
(middle) empty parantheses move past the (scalar) spin level. The (i,j) index the colour matrix.
|
||||||
|
|
||||||
|
Other examples are easy to form for the many cases, and should be obvious to the reader.
|
||||||
|
This form of addressing is convenient and saves peek, modifying, poke
|
||||||
|
multiple temporary objects when both spin and colour indices are being accessed.
|
||||||
|
There are many cases where multiple lines of code are required with a peek/poke semantic which are
|
||||||
|
easier with direct l-value and r-value addressing.
|
||||||
|
|
||||||
|
|
||||||
|
### Matrix operations
|
||||||
|
|
||||||
|
Transposition and tracing specific internal indices are possible using:
|
||||||
|
|
||||||
|
```c++
|
||||||
|
template<int Level,class vtype>
|
||||||
|
auto traceIndex (const vtype &arg)
|
||||||
|
|
||||||
|
template<int Level,class vtype>
|
||||||
|
auto transposeIndex (const vtype &arg)
|
||||||
|
```
|
||||||
|
|
||||||
|
These may be used as
|
||||||
|
|
||||||
|
**Example**:
|
||||||
|
|
||||||
|
```c++
|
||||||
|
LatticeColourMatrixD Link(grid);
|
||||||
|
ComplexD link_trace = traceIndex<ColourIndex> (Link);
|
||||||
|
```
|
||||||
|
|
||||||
|
Again, convenience aliases for QCD naming schemes are provided via
|
||||||
|
|
||||||
|
* `traceColour`
|
||||||
|
* `traceSpin`
|
||||||
|
|
||||||
|
* `transposeColour`
|
||||||
|
* `transposeSpin`
|
||||||
|
|
||||||
|
**Example**:
|
||||||
|
|
||||||
|
```c++
|
||||||
|
ComplexD link_trace = traceColour (Link);
|
||||||
|
```
|
||||||
|
|
||||||
|
The operations only makes sense for matrix and scalar internal indices.
|
||||||
|
|
||||||
|
The trace and transpose over all indices is also defined for matrix and scalar types:
|
||||||
|
|
||||||
|
```c++
|
||||||
|
template<class vtype,int N>
|
||||||
|
auto trace(const iMatrix<vtype,N> &arg) -> iScalar
|
||||||
|
|
||||||
|
template<class vtype,int N>
|
||||||
|
auto transpose(const iMatrix<vtype,N> &arg ) -> iMatrix
|
||||||
|
```
|
||||||
|
|
||||||
|
Similar functions are:
|
||||||
|
|
||||||
|
* `conjugate`
|
||||||
|
* `adjoint`
|
||||||
|
|
||||||
|
The traceless anti-Hermitian part is taken with:
|
||||||
|
|
||||||
|
```c++
|
||||||
|
template<class vtype,int N> iMatrix<vtype,N>
|
||||||
|
Ta(const iMatrix<vtype,N> &arg)
|
||||||
|
```
|
||||||
|
|
||||||
|
Reunitarisation (or reorthogonalisation) is enabled by:
|
||||||
|
|
||||||
|
```c++
|
||||||
|
template<class vtype,int N> iMatrix<vtype,N>
|
||||||
|
ProjectOnGroup(const iMatrix<vtype,N> &arg)
|
||||||
|
```
|
||||||
|
|
||||||
|
**Example**:
|
||||||
|
|
||||||
|
```c++
|
||||||
|
LatticeColourMatrixD Mom(grid);
|
||||||
|
LatticeColourMatrixD TaMom(grid);
|
||||||
|
TaMom = Ta(Mom);
|
||||||
|
```
|
||||||
|
|
||||||
|
### Querying internal index structure
|
||||||
|
|
||||||
|
Templated code may find it useful to use query functions on the Grid datatypes they are provided.
|
||||||
|
For example general Serialisation and I/O code can inspect the nature of a type a routine has been
|
||||||
|
asked to read from disk, or even generate descriptive type strings:
|
||||||
|
|
||||||
|
```c++
|
||||||
|
////////////////////////////////////////////////////
|
||||||
|
// Support type queries on template params:
|
||||||
|
////////////////////////////////////////////////////
|
||||||
|
// int _ColourScalar = isScalar<ColourIndex,vobj>();
|
||||||
|
// int _ColourVector = isVector<ColourIndex,vobj>();
|
||||||
|
// int _ColourMatrix = isMatrix<ColourIndex,vobj>();
|
||||||
|
template<int Level,class vtype> int isScalar(void)
|
||||||
|
template<int Level,class vtype> int isVector(void)
|
||||||
|
template<int Level,class vtype> int isMatrix(void)
|
||||||
|
```
|
||||||
|
|
||||||
|
**Example** (`lib/parallelIO/IldgIO.h`):
|
||||||
|
|
||||||
|
```c++
|
||||||
|
template<class vobj> std::string ScidacRecordTypeString(int &colors, int &spins, int & typesize,int &datacount) {
|
||||||
|
|
||||||
|
/////////////////////////////////////////
|
||||||
|
// Encode a generic tensor as a string
|
||||||
|
/////////////////////////////////////////
|
||||||
|
|
||||||
|
typedef typename getPrecision<vobj>::real_scalar_type stype;
|
||||||
|
|
||||||
|
int _ColourN = indexRank<ColourIndex,vobj>();
|
||||||
|
int _ColourScalar = isScalar<ColourIndex,vobj>();
|
||||||
|
int _ColourVector = isVector<ColourIndex,vobj>();
|
||||||
|
int _ColourMatrix = isMatrix<ColourIndex,vobj>();
|
||||||
|
|
||||||
|
int _SpinN = indexRank<SpinIndex,vobj>();
|
||||||
|
int _SpinScalar = isScalar<SpinIndex,vobj>();
|
||||||
|
int _SpinVector = isVector<SpinIndex,vobj>();
|
||||||
|
int _SpinMatrix = isMatrix<SpinIndex,vobj>();
|
||||||
|
|
||||||
|
int _LorentzN = indexRank<LorentzIndex,vobj>();
|
||||||
|
int _LorentzScalar = isScalar<LorentzIndex,vobj>();
|
||||||
|
int _LorentzVector = isVector<LorentzIndex,vobj>();
|
||||||
|
int _LorentzMatrix = isMatrix<LorentzIndex,vobj>();
|
||||||
|
|
||||||
|
std::stringstream stream;
|
||||||
|
|
||||||
|
stream << "GRID_";
|
||||||
|
stream << ScidacWordMnemonic<stype>();
|
||||||
|
|
||||||
|
if ( _LorentzVector ) stream << "_LorentzVector"<<_LorentzN;
|
||||||
|
if ( _LorentzMatrix ) stream << "_LorentzMatrix"<<_LorentzN;
|
||||||
|
|
||||||
|
if ( _SpinVector ) stream << "_SpinVector"<<_SpinN;
|
||||||
|
if ( _SpinMatrix ) stream << "_SpinMatrix"<<_SpinN;
|
||||||
|
|
||||||
|
if ( _ColourVector ) stream << "_ColourVector"<<_ColourN;
|
||||||
|
if ( _ColourMatrix ) stream << "_ColourMatrix"<<_ColourN;
|
||||||
|
|
||||||
|
if ( _ColourScalar && _LorentzScalar && _SpinScalar ) stream << "_Complex";
|
||||||
|
|
||||||
|
typesize = sizeof(typename vobj::scalar_type);
|
||||||
|
|
||||||
|
if ( _ColourMatrix ) typesize*= _ColourN*_ColourN;
|
||||||
|
else typesize*= _ColourN;
|
||||||
|
|
||||||
|
if ( _SpinMatrix ) typesize*= _SpinN*_SpinN;
|
||||||
|
else typesize*= _SpinN;
|
||||||
|
|
||||||
|
};
|
||||||
|
```
|
||||||
|
|
||||||
|
### Inner and outer products
|
||||||
|
|
||||||
|
We recursively define (`tensors/Tensor_inner.h`), ultimately returning scalar in all indices:
|
||||||
|
|
||||||
|
```c++
|
||||||
|
/////////////////////////////////////////////////////////////////////////
|
||||||
|
// innerProduct Scalar x Scalar -> Scalar
|
||||||
|
// innerProduct Vector x Vector -> Scalar
|
||||||
|
// innerProduct Matrix x Matrix -> Scalar
|
||||||
|
/////////////////////////////////////////////////////////////////////////
|
||||||
|
template<class l,class r>
|
||||||
|
auto innerProductD (const iScalar<l>& lhs,const iScalar<r>& rhs)
|
||||||
|
|
||||||
|
template<class l,class r,int N>
|
||||||
|
auto innerProductD (const iVector<l,N>& lhs,const iVector<r,N>& rhs)
|
||||||
|
|
||||||
|
template<class l,class r,int N>
|
||||||
|
auto innerProductD (const iMatrix<l,N>& lhs,const iMatrix<r,N>& rhs)
|
||||||
|
|
||||||
|
template<class l,class r>
|
||||||
|
auto innerProduct (const iScalar<l>& lhs,const iScalar<r>& rhs)
|
||||||
|
|
||||||
|
template<class l,class r,int N>
|
||||||
|
auto innerProduct (const iVector<l,N>& lhs,const iVector<r,N>& rhs)
|
||||||
|
|
||||||
|
template<class l,class r,int N>
|
||||||
|
auto innerProduct (const iMatrix<l,N>& lhs,const iMatrix<r,N>& rhs)
|
||||||
|
```
|
||||||
|
|
||||||
|
The sum is always performed in double precision for the `innerProductD` variant.
|
||||||
|
|
||||||
|
We recursively define (`tensors/Tensor_outer.h`):
|
||||||
|
|
||||||
|
```c++
|
||||||
|
/////////////////////////////////////////////////////////////////////////
|
||||||
|
// outerProduct Scalar x Scalar -> Scalar
|
||||||
|
// Vector x Vector -> Matrix
|
||||||
|
/////////////////////////////////////////////////////////////////////////
|
||||||
|
template<class l,class r>
|
||||||
|
auto outerProduct (const iScalar<l>& lhs,const iScalar<r>& rhs)
|
||||||
|
|
||||||
|
template<class l,class r,int N>
|
||||||
|
auto outerProduct (const iVector<l,N>& lhs,const iVector<r,N>& rhs)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Functions of Tensor
|
||||||
|
|
||||||
|
The following unary functions are defined, which operate element by element on a tensor
|
||||||
|
data structure:
|
||||||
|
|
||||||
|
```c++
|
||||||
|
sqrt();
|
||||||
|
rsqrt();
|
||||||
|
sin();
|
||||||
|
cos();
|
||||||
|
asin();
|
||||||
|
acos();
|
||||||
|
log();
|
||||||
|
exp();
|
||||||
|
abs();
|
||||||
|
Not();
|
||||||
|
toReal();
|
||||||
|
toComplex();
|
||||||
|
```
|
||||||
|
|
||||||
|
Element wise functions are defined for::
|
||||||
|
|
||||||
|
```c++
|
||||||
|
div(tensor,Integer);
|
||||||
|
mod(tensor,Integer);
|
||||||
|
pow(tensor,RealD);
|
||||||
|
```
|
||||||
|
|
||||||
|
Matrix exponentiation (as opposed to element wise exponentiation is implemented via power series in::
|
||||||
|
|
||||||
|
```c++
|
||||||
|
Exponentiate(const Tensor &r ,RealD alpha, Integer Nexp = DEFAULT_MAT_EXP)
|
||||||
|
```
|
||||||
|
|
||||||
|
the exponentiation is distributive across vector indices (i.e. proceeds component by component for a `LorentzColourMatrix`).
|
||||||
|
|
||||||
|
Determinant is similar::
|
||||||
|
|
||||||
|
```c++
|
||||||
|
iScalar Determinant(const Tensor &r )
|
||||||
|
```
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
---
|
||||||
|
title : "API Documentation"
|
||||||
|
author_profile: false
|
||||||
|
excerpt: "Vectorisation"
|
||||||
|
header:
|
||||||
|
overlay_color: "#5DADE2"
|
||||||
|
permalink: /docs/API/vectorisation.html
|
||||||
|
sidebar:
|
||||||
|
nav : docs
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
Internally, Grid defines a portable abstraction SIMD vectorisation, via the following types:
|
||||||
|
|
||||||
|
* `vRealF`
|
||||||
|
|
||||||
|
* `vRealD`
|
||||||
|
|
||||||
|
* `vComplexF`
|
||||||
|
|
||||||
|
* `vComplexD`
|
||||||
|
|
||||||
|
These have the usual range of arithmetic operators and functions acting upon them. They do not form
|
||||||
|
part of the API, but are mentioned to (partially) explain the need for controlling the
|
||||||
|
layout transformation in lattice objects.
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
---
|
||||||
|
title : "Documentation"
|
||||||
|
author_profile: false
|
||||||
|
excerpt: "Reporting an issue"
|
||||||
|
header:
|
||||||
|
overlay_color: "#C70039"
|
||||||
|
permalink: /docs/bug_report/
|
||||||
|
sidebar:
|
||||||
|
nav : docs
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
__To help us tracking and solving more efficiently issues with Grid, please report problems using the [issue system of GitHub](https://github.com/paboyle/Grid/issues) rather than sending emails to Grid developers.__
|
||||||
|
|
||||||
|
We also suggest to have a brief look at the [closed issues pages](https://github.com/paboyle/Grid/issues?q=is%3Aissue+is%3Aclosed) and check whether the problem has been addressed already.
|
||||||
|
|
||||||
|
{% capture notice-text %}
|
||||||
|
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.
|
||||||
|
{% endcapture %}
|
||||||
|
|
||||||
|
<div class="notice--warning">
|
||||||
|
<h4>When you file an issue, please go though the following checklist:</h4>
|
||||||
|
{{ notice-text | markdownify }}
|
||||||
|
</div>
|
||||||
|
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
---
|
||||||
|
title : "Documentation"
|
||||||
|
author_profile: false
|
||||||
|
excerpt: "Supported communication interfaces"
|
||||||
|
header:
|
||||||
|
overlay_color: "#5DADE2"
|
||||||
|
permalink: /docs/comm_interfaces/
|
||||||
|
sidebar:
|
||||||
|
nav : docs
|
||||||
|
---
|
||||||
|
{% include base_path %}
|
||||||
|
|
||||||
|
The following options can be used with the `--enable-comms=` option to target different communication interfaces:
|
||||||
|
|
||||||
|
| `<comm>` | Description |
|
||||||
|
| ------------- | -------------------------------------------- |
|
||||||
|
| `none` | no communications |
|
||||||
|
| `mpi` | MPI communications using [MPI-3 shared memory](https://software.intel.com/sites/default/files/managed/eb/54/An_Introduction_to_MPI-3.pdf) |
|
||||||
|
| `mpi-auto` | MPI communications with compiler CXX but clone flags from MPICXX |
|
||||||
|
|
||||||
|
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 wrappers ( `CXX=CC` ) set up by Cray `PrgEnv` modules instead.
|
||||||
|
|
||||||
|
### Shared memory communications support
|
||||||
|
|
||||||
|
The following options can be use with the `--enable-shm=` option to target different shared memory behaviours (default `shmopen`):
|
||||||
|
|
||||||
|
| `<shm>` | Description |
|
||||||
|
| ------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ |
|
||||||
|
| `shmnone` | uses anonymous spaces, use only for 1 MPI rank per node |
|
||||||
|
| `shmopen` | uses `shm_open` to allocate a shared memory space for inter socket communications. Uses a unique file name in `/dev/shm` associated to the user. |
|
||||||
|
| `hugetlbfs` | optional [libhugetlbfs](https://github.com/libhugetlbfs/libhugetlbfs) support to map the shared memory allocation into huge 2M pages |
|
||||||
|
|
||||||
|
|
||||||
|
### Other flags
|
||||||
|
|
||||||
|
`--enable-shmpath=<path>` to select the shared memory map base path for [libhugetlbfs](https://github.com/libhugetlbfs/libhugetlbfs).
|
||||||
|
|
||||||
|
{% include paginator.html %}
|
||||||
@@ -0,0 +1,51 @@
|
|||||||
|
---
|
||||||
|
title : "Documentation"
|
||||||
|
author_profile: false
|
||||||
|
excerpt: "Execution model"
|
||||||
|
header:
|
||||||
|
overlay_color: "#5DADE2"
|
||||||
|
permalink: /docs/execution-model/
|
||||||
|
sidebar:
|
||||||
|
nav : docs
|
||||||
|
---
|
||||||
|
|
||||||
|
Grid is intended to support performance portability across a many of platforms ranging from single processors
|
||||||
|
to message passing CPU clusters and accelerated computing nodes.
|
||||||
|
|
||||||
|
The library provides data parallel C++ container classes with internal memory layout that is transformed to map efficiently to SIMD architectures. CSHIFT facilities are provided, similar to HPF and cmfortran, and user control is given over the mapping of array indices to both MPI tasks and SIMD processing elements.
|
||||||
|
|
||||||
|
Identically shaped arrays then be processed with perfect data parallelisation.
|
||||||
|
Such identically shaped arrays are called conformable arrays.
|
||||||
|
The transformation is based on the observation that Cartesian array processing involves identical processing to be performed on different regions of the Cartesian array.
|
||||||
|
|
||||||
|
The library will both geometrically decompose into MPI tasks and across SIMD lanes. Local vector loops are parallelised with OpenMP pragmas.
|
||||||
|
|
||||||
|
Data parallel array operations can then be specified with a SINGLE data parallel paradigm, but optimally use MPI, OpenMP and SIMD parallelism under the hood. This is a significant simplification for most programmers.
|
||||||
|
|
||||||
|
The two broad optimisation targets are:
|
||||||
|
|
||||||
|
* MPI, OpenMP, and SIMD parallelism
|
||||||
|
|
||||||
|
Presently SSE4, ARM NEON (128 bits) AVX, AVX2, QPX (256 bits), and AVX512 (512 bits) targets are supported
|
||||||
|
with aggressive use of architecture vectorisation intrinsic functions.
|
||||||
|
|
||||||
|
* MPI between nodes with and data parallel offload to GPU's.
|
||||||
|
|
||||||
|
For the latter generic C++ code is used both on the host and on the GPU, with a common vectorisation
|
||||||
|
granularity.
|
||||||
|
|
||||||
|
### Accelerator memory model
|
||||||
|
|
||||||
|
For accelerator targets it is assumed that heap allocations can be shared between the CPU
|
||||||
|
and the accelerator. This corresponds to lattice fields having their memory allocated with
|
||||||
|
*cudaMallocManaged* with Nvidia GPU's.
|
||||||
|
|
||||||
|
Grid does not assume that stack or data segments share a common address space with an accelerator.
|
||||||
|
|
||||||
|
* This constraint presently rules out porting Grid to AMD GPU's which do not support managed memory.
|
||||||
|
|
||||||
|
* At some point in the future a cacheing strategy may be implemented to enable running on AMD GPU's
|
||||||
|
|
||||||
|
This document was updated on March 2018.
|
||||||
|
{: .notice}
|
||||||
|
|
||||||
@@ -0,0 +1,213 @@
|
|||||||
|
---
|
||||||
|
title : "Documentation"
|
||||||
|
author_profile: false
|
||||||
|
excerpt: "Building on Intel and AMD targets"
|
||||||
|
header:
|
||||||
|
overlay_color: "#5DADE2"
|
||||||
|
permalink: /docs/general_build/
|
||||||
|
sidebar:
|
||||||
|
nav : docs
|
||||||
|
---
|
||||||
|
{% include base_path %}
|
||||||
|
The information included in this page has been updated on *March 2018* and it is valid for the [release version 0.7.0](https://github.com/paboyle/Grid/tree/release/v0.7.0).
|
||||||
|
|
||||||
|
{% include toc icon="gears" title="Contents" %}
|
||||||
|
|
||||||
|
### Building for the Intel Knights Landing
|
||||||
|
|
||||||
|
The following configuration is recommended for the [Intel Knights Landing](http://ark.intel.com/products/codename/48999/Knights-Landing) platform:
|
||||||
|
|
||||||
|
``` text
|
||||||
|
../configure --enable-precision=double\
|
||||||
|
--enable-simd=KNL \
|
||||||
|
--enable-comms=mpi-auto \
|
||||||
|
--with-gmp=<path> \
|
||||||
|
--with-mpfr=<path> \
|
||||||
|
--enable-mkl \
|
||||||
|
CXX=icpc MPICXX=mpiicpc
|
||||||
|
```
|
||||||
|
|
||||||
|
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:
|
||||||
|
|
||||||
|
``` text
|
||||||
|
../configure --enable-precision=double\
|
||||||
|
--enable-simd=KNL \
|
||||||
|
--enable-comms=mpi \
|
||||||
|
--with-gmp=<path> \
|
||||||
|
--with-mpfr=<path> \
|
||||||
|
--enable-mkl \
|
||||||
|
CXX=CC CC=cc
|
||||||
|
```
|
||||||
|
|
||||||
|
### Building for the Intel Haswell
|
||||||
|
|
||||||
|
|
||||||
|
The following configuration is recommended for the [Intel Haswell platform](https://ark.intel.com/products/codename/42174/Haswell):
|
||||||
|
|
||||||
|
```bash
|
||||||
|
../configure --enable-precision=double\
|
||||||
|
--enable-simd=AVX2 \
|
||||||
|
--enable-comms=mpi-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=mpi \
|
||||||
|
--enable-mkl \
|
||||||
|
CXX=CC CC=cc
|
||||||
|
```
|
||||||
|
|
||||||
|
If using the Intel MPI library, threads should be pinned to NUMA domains using:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
export I_MPI_PIN=1
|
||||||
|
```
|
||||||
|
This is the default.
|
||||||
|
|
||||||
|
### Building for the Intel Skylake
|
||||||
|
|
||||||
|
The following configuration is recommended for the [Intel Skylake platform](https://ark.intel.com/products/codename/37572/Skylake):
|
||||||
|
|
||||||
|
```bash
|
||||||
|
../configure --enable-precision=double\
|
||||||
|
--enable-simd=AVX512 \
|
||||||
|
--enable-comms=mpi-auto \
|
||||||
|
--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=mpi \
|
||||||
|
--enable-mkl \
|
||||||
|
CXX=CC CC=cc
|
||||||
|
```
|
||||||
|
|
||||||
|
If using the Intel MPI library, threads should be pinned to NUMA domains using:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
export I_MPI_PIN=1
|
||||||
|
```
|
||||||
|
|
||||||
|
This is the default.
|
||||||
|
|
||||||
|
### Building for the AMD Epyc
|
||||||
|
|
||||||
|
The [AMD EPYC](https://www.amd.com/en/products/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:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
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:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
#!/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
|
||||||
|
|
||||||
|
$@
|
||||||
|
```
|
||||||
|
|
||||||
|
### 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, non MPI builds are enabled with:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
--enable-comms=none
|
||||||
|
```
|
||||||
|
|
||||||
|
FFTW support that is not in the default search path may then enabled with:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
--with-fftw=<installpath>
|
||||||
|
```
|
||||||
|
|
||||||
|
BLAS will not be compiled in by default, and Lanczos will default to Eigen diagonalisation.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
### Notes
|
||||||
|
|
||||||
|
- [GMP](https://gmplib.org/) is the GNU Multiple Precision Library.
|
||||||
|
- [MPFR](http://www.mpfr.org/) is a C library for multiple-precision floating-point computations with correct rounding.
|
||||||
|
- Both libaries are necessary for the RHMC support.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
{% include paginator.html %}
|
||||||
@@ -0,0 +1,185 @@
|
|||||||
|
---
|
||||||
|
title : "Documentation"
|
||||||
|
author_profile: false
|
||||||
|
excerpt: "Quick start guide"
|
||||||
|
header:
|
||||||
|
overlay_color: "#5DADE2"
|
||||||
|
permalink: /docs/quick-start-guide/
|
||||||
|
sidebar:
|
||||||
|
nav : docs
|
||||||
|
---
|
||||||
|
{% include toc icon="gears" title="Quick-start" %}
|
||||||
|
|
||||||
|
Please send all pull requests to the `develop` branch.
|
||||||
|
{: .notice--warning}
|
||||||
|
|
||||||
|
## Requirements
|
||||||
|
|
||||||
|
### Required libraries
|
||||||
|
|
||||||
|
* [GMP](https://gmplib.org/) is the GNU Multiple Precision Library (RHMC support).
|
||||||
|
* [MPFR](http://www.mpfr.org/) is a C library for multiple-precision floating-point computations with correct rounding (RHMC support).
|
||||||
|
* [Eigen](http://eigen.tuxfamily.org/index.php?title=Main_Page): bootstrapping GRID downloads and uses for internal dense matrix (non-QCD operations) the Eigen library.
|
||||||
|
|
||||||
|
Grid optionally uses:
|
||||||
|
|
||||||
|
* [HDF5](https://support.hdfgroup.org/HDF5/) for structured data I/O
|
||||||
|
|
||||||
|
* [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](http://www.netlib.org/lapack/) either generic version or Intel MKL library.
|
||||||
|
|
||||||
|
|
||||||
|
### Compilers
|
||||||
|
|
||||||
|
* Intel ICPC v17 and later
|
||||||
|
|
||||||
|
* Clang v3.5 and later (need 3.8 and later for OpenMP)
|
||||||
|
|
||||||
|
* GCC v4.9.x
|
||||||
|
|
||||||
|
* GCC v6.3 and later (recommended)
|
||||||
|
|
||||||
|
**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](https://github.com/paboyle/Grid/issues/100) for details and updates.
|
||||||
|
|
||||||
|
GCC v5.x, v6.1, v6.2
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## Quick start
|
||||||
|
First, start by cloning the repository:
|
||||||
|
|
||||||
|
``` bash
|
||||||
|
git clone https://github.com/paboyle/Grid.git
|
||||||
|
```
|
||||||
|
|
||||||
|
Then enter the cloned directory and set up the build system:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd Grid
|
||||||
|
./bootstrap.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
Now you can execute the `configure` script to generate makefiles as in this example (here from a build directory):
|
||||||
|
|
||||||
|
``` bash
|
||||||
|
mkdir build
|
||||||
|
cd build
|
||||||
|
../configure --enable-precision=double --enable-simd=AVX --enable-comms=mpi-auto --prefix=<path>
|
||||||
|
```
|
||||||
|
|
||||||
|
where:
|
||||||
|
|
||||||
|
``` bash
|
||||||
|
--enable-precision=single|double
|
||||||
|
```
|
||||||
|
|
||||||
|
sets the **default precision**. Since this is largely a benchmarking convenience, it is anticipated that the default precision may be removed in future implementations, and that explicit type selection be made at all points. Naturally, most code will be type templated in any case.::
|
||||||
|
|
||||||
|
``` bash
|
||||||
|
--enable-simd=GEN|SSE4|AVX|AVXFMA|AVXFMA4|AVX2|AVX512|NEONv8|QPX
|
||||||
|
```
|
||||||
|
|
||||||
|
sets the **SIMD architecture**,
|
||||||
|
|
||||||
|
``` bash
|
||||||
|
--enable-comms=mpi|none
|
||||||
|
```
|
||||||
|
|
||||||
|
selects whether to use MPI communication (mpi) or no communication (none).
|
||||||
|
|
||||||
|
``` bash
|
||||||
|
--prefix=<path>
|
||||||
|
```
|
||||||
|
|
||||||
|
should be passed the prefix path where you want to install Grid.
|
||||||
|
|
||||||
|
Other options are detailed in the next section, you can also use
|
||||||
|
|
||||||
|
```bash
|
||||||
|
configure --help
|
||||||
|
```
|
||||||
|
|
||||||
|
to display them.
|
||||||
|
|
||||||
|
Like with any other program using GNU autotool, the
|
||||||
|
|
||||||
|
```bash
|
||||||
|
CXX, CXXFLAGS, LDFLAGS, ...
|
||||||
|
```
|
||||||
|
|
||||||
|
environment variables can be modified to customise the build.
|
||||||
|
|
||||||
|
Finally, you can build and install Grid:
|
||||||
|
|
||||||
|
``` bash
|
||||||
|
make
|
||||||
|
make install #this is optional
|
||||||
|
```
|
||||||
|
|
||||||
|
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:
|
||||||
|
|
||||||
|
``` bash
|
||||||
|
make -C tests/<subdir> tests
|
||||||
|
```
|
||||||
|
If you want to build all the tests at once just use `make tests`.
|
||||||
|
|
||||||
|
## Build configuration options
|
||||||
|
|
||||||
|
A full list of configurations options is available with the `./configure --help` command:
|
||||||
|
|
||||||
|
* `--prefix=<path>`: installation prefix for Grid.
|
||||||
|
|
||||||
|
* `--with-gmp=<path>`: look for GMP in the UNIX prefix `<path>`
|
||||||
|
|
||||||
|
* `--with-mpfr=<path>`: look for MPFR in the UNIX prefix `<path>`
|
||||||
|
|
||||||
|
* `--with-fftw=<path>`: look for FFTW in the UNIX prefix `<path>`
|
||||||
|
|
||||||
|
* `--with-hdf5=<path>`: look for HDF5 in the UNIX prefix `<path>`
|
||||||
|
|
||||||
|
* `--with-lime=<path>`: look for the C-LIME library in the UNIX prefix `<path>`
|
||||||
|
|
||||||
|
* `--enable-sfw-fp16=<yes|no`: Enable software FP16 communications support (default `yes`)
|
||||||
|
|
||||||
|
* `--enable-lapack[=<path>]`: enable LAPACK support in Lanczos eigensolver. A UNIX prefix containing the library can be specified (optional).
|
||||||
|
|
||||||
|
* `--enable-mkl[=<path>]`: use Intel MKL for FFT (and LAPACK if enabled) routines. A UNIX prefix containing the library can be specified (optional).
|
||||||
|
|
||||||
|
* `--enable-numa`: enable [numa first touch policy](http://queue.acm.org/detail.cfm?id=2513149) optimization (default `no`)
|
||||||
|
|
||||||
|
* `--enable-simd=<code>`: setup Grid for the SIMD target `<code>` (default: `GEN`). [List of possible SIMD targets](/Grid/docs/simd_targets/).
|
||||||
|
|
||||||
|
* `--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-comms=<comm>`: Use `<comm>` for message passing (default: `none`). [List of possible comm targets](/Grid/docs/comm_interfaces/).
|
||||||
|
|
||||||
|
* `--enable-shm=<shm>`: Use `<shm>` for shared memory behaviour (default: `shmopen`). [List of possible shm targets](/Grid/docs/comm_interfaces/).
|
||||||
|
|
||||||
|
* `--enable-shmpath=<path>`: Select `<path>` for the shared memory mmap base path for libhugetlbfs.
|
||||||
|
|
||||||
|
* `--enable-rng={sitmo|ranlux48|mt19937}` choose the RNG (default: `sitmo`).
|
||||||
|
|
||||||
|
* `--disable-timers`: disable system dependent high-resolution timers.
|
||||||
|
|
||||||
|
* `--enable-chroma`: enable Chroma regression tests. A compiled version of Chroma is assumed to be present.
|
||||||
|
|
||||||
|
* `--enable-doxygen-doc`: enable the Doxygen documentation generation (build with `make doxygen-doc`)
|
||||||
|
|
||||||
|
|
||||||
|
{% if site.option=="web" %}
|
||||||
|
More details on the *Getting started* menu entries on the left.
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
This document was updated on March 2018.
|
||||||
|
{: .notice}
|
||||||
|
|
||||||
@@ -0,0 +1,80 @@
|
|||||||
|
---
|
||||||
|
title : "Documentation"
|
||||||
|
author_profile: false
|
||||||
|
excerpt: "Running on a Intel Knights Landing"
|
||||||
|
header:
|
||||||
|
overlay_color: "#5DADE2"
|
||||||
|
permalink: /docs/running_knl/
|
||||||
|
sidebar:
|
||||||
|
nav : docs
|
||||||
|
---
|
||||||
|
{% include base_path %}
|
||||||
|
{% include toc icon="gears" title="Contents" %}
|
||||||
|
|
||||||
|
These are few suggestions in order to get the best performance on the Intel Knights Landing (KNL).
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
### Bind the memory allocation to the MCDRAM NUMA node
|
||||||
|
|
||||||
|
The KNL has two memory systems, the DDR4 (~90 GFlops/s) and the High Bandwidth Memory (MCDRAM, ~400 Gflops/s).
|
||||||
|
Each of the two memory system is attached to a different [NUMA context](https://software.intel.com/en-us/articles/optimizing-applications-for-numa).
|
||||||
|
|
||||||
|
On a KNL node the command `numactl --hardware` will report which NUMA context is connected to the faster MCDRAM.
|
||||||
|
A typical report looks like this
|
||||||
|
|
||||||
|
``` text
|
||||||
|
node 0 size: 98178 MB
|
||||||
|
node 0 free: 92899 MB
|
||||||
|
node 1 cpus:
|
||||||
|
node 1 size: 16384 MB
|
||||||
|
node 1 free: 15926 MB
|
||||||
|
```
|
||||||
|
|
||||||
|
In this case the node 1 is related to the 16GB MCDRAM (this is the typical situation on KNLs)
|
||||||
|
|
||||||
|
To bind the memory allocation to NUMA node 1 use
|
||||||
|
|
||||||
|
``` bash
|
||||||
|
numactl --membind 1 ./your-executable
|
||||||
|
```
|
||||||
|
|
||||||
|
### Controlling threading
|
||||||
|
|
||||||
|
The number of threads can be set in GRID at runtime by the flag
|
||||||
|
|
||||||
|
``` text
|
||||||
|
--threads <#threads>
|
||||||
|
```
|
||||||
|
|
||||||
|
A finer control can be achieved using the environment variable `KMP_HW_SUBSETS` (or the deprecated `KMP_PLACE_THREADS`).
|
||||||
|
|
||||||
|
From the [Intel developer guide](https://software.intel.com/en-us/node/684313):
|
||||||
|
|
||||||
|
>The KMP_HW_SUBSETS variable controls the hardware resource that will be used by the program. This variable specifies the number of sockets to use, how many cores to use per socket and how many threads to assign per core. For example, on Intel® Xeon Phi™ coprocessors, while each coprocessor can take up to four threads, specifying fewer than four threads per core may result in a better performance. While specifying two threads per core often yields better performance than one thread per core, specifying three or four threads per core may or may not improve the performance. This variable enables you to conveniently measure the performance of up to four threads per core.
|
||||||
|
|
||||||
|
A typical setting for the best performance on a single node is to use **62 cores with 1 threads per code**, on the bash shell this is set by
|
||||||
|
|
||||||
|
``` bash
|
||||||
|
export KMP_HW_SUBSETS=62c,1t
|
||||||
|
```
|
||||||
|
|
||||||
|
### Using the optimised Wilson Dslash kernels
|
||||||
|
|
||||||
|
Beside the generic implementation using stencils, GRID has optimised version of the Dslash kernels (for Wilson and DWF fermions).
|
||||||
|
|
||||||
|
Flags at runtime can be used for the optimised paths
|
||||||
|
|
||||||
|
| Flag | Description |
|
||||||
|
| --------------------- | --------------------------------------------------------------------- |
|
||||||
|
| `--dslash-generic` | This is the default option and used the implementation with stencils |
|
||||||
|
| `--dslash-unroll` | This explicitly unroll the colour loops. It is tied to `Nc=3` |
|
||||||
|
| `--dslash-asm` | This is specific for AVX512-F architectures and `Nc=3` |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
The information included in this page has been updated on *November 2016* and it is valid for the release version 0.6.0.
|
||||||
|
{: .notice}
|
||||||
|
|
||||||
|
|
||||||
|
{% include paginator.html %}
|
||||||
@@ -0,0 +1,45 @@
|
|||||||
|
---
|
||||||
|
title : "Documentation"
|
||||||
|
author_profile: false
|
||||||
|
excerpt: "Supported SIMD architectures"
|
||||||
|
header:
|
||||||
|
overlay_color: "#5DADE2"
|
||||||
|
permalink: /docs/simd_targets/
|
||||||
|
sidebar:
|
||||||
|
nav : docs
|
||||||
|
---
|
||||||
|
{% include base_path %}
|
||||||
|
|
||||||
|
The following options can be used for `--enable-simd=` flag to target different SIMD instruction sets:
|
||||||
|
|
||||||
|
| `<code>` | Description |
|
||||||
|
| ----------- | -------------------------------------- |
|
||||||
|
| `GEN` | generic portable vector code |
|
||||||
|
| `SSE4` | SSE 4.2 (128 bit) |
|
||||||
|
| `AVX` | AVX (256 bit) |
|
||||||
|
| `AVXFMA` | AVX (256 bit) + FMA |
|
||||||
|
| `AVXFMA4` | AVX (256 bit) + FMA4 |
|
||||||
|
| `AVX2` | AVX 2 (256 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) |
|
||||||
|
|
||||||
|
Alternatively, some CPU codenames can be directly used:
|
||||||
|
|
||||||
|
| `<code>` | Description |
|
||||||
|
| ----------- | -------------------------------------- |
|
||||||
|
| `KNL` | [Intel Xeon Phi codename Knights Landing](http://ark.intel.com/products/codename/48999/Knights-Landing) |
|
||||||
|
| `SKL` | [Intel Skylake with AVX512 support](https://ark.intel.com/products/codename/37572/Skylake) |
|
||||||
|
| `BGQ` | Blue Gene/Q |
|
||||||
|
|
||||||
|
|
||||||
|
#### Notes (Jan 2018):
|
||||||
|
* We currently support AVX512 for the Intel compiler and GCC (KNL and SKL target). Support for clang will appear in future
|
||||||
|
versions of Grid when the AVX512 support in the compiler is more advanced.
|
||||||
|
* For BG/Q only [bgclang](http://trac.alcf.anl.gov/projects/llvm-bgq) is supported. We do not presently plan to support more compilers for this platform.
|
||||||
|
* BG/Q performances are currently rather poor. This is being investigated for future versions.
|
||||||
|
* The vector size for the `GEN` target can be specified with the `configure` script option `--enable-gen-simd-width`.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
{% include paginator.html %}
|
||||||
@@ -0,0 +1,40 @@
|
|||||||
|
---
|
||||||
|
title : "Documentation"
|
||||||
|
author_profile: false
|
||||||
|
excerpt: "Travis Continous Integration framework"
|
||||||
|
header:
|
||||||
|
overlay_color: "#5DADE2"
|
||||||
|
permalink: /docs/travis/
|
||||||
|
sidebar:
|
||||||
|
nav : docs
|
||||||
|
---
|
||||||
|
{% include base_path %}
|
||||||
|
<!-- {% include toc icon="gears" title="Helpers" %} -->
|
||||||
|
|
||||||
|
For continous testing of every commit we use the [Travis CI framework](https://travis-ci.org/).
|
||||||
|
|
||||||
|
The current status is
|
||||||
|
|
||||||
|
| Branch | Status |
|
||||||
|
|---------- | ------ |
|
||||||
|
| [Master](https://travis-ci.org/paboyle/Grid) | [](https://travis-ci.org/paboyle/Grid) |
|
||||||
|
| [Develop](https://travis-ci.org/paboyle/Grid) | [](https://travis-ci.org/paboyle/Grid) |
|
||||||
|
| [Release 0.7.0](https://github.com/paboyle/Grid/tree/release/v0.7.0) | [](https://github.com/paboyle/Grid/tree/release/v0.7.0) |
|
||||||
|
|
||||||
|
|
||||||
|
### Automated tests
|
||||||
|
|
||||||
|
Travis will test the compilation workflow for single and double precision version on the following compilers for each commit:
|
||||||
|
|
||||||
|
- clang 3.7.0 on Ubuntu 14.04
|
||||||
|
- clang 3.8.0 on Ubuntu 14.04
|
||||||
|
- gcc 5.4.1 on Ubuntu 14.04
|
||||||
|
- gcc 4.9.4 on Ubuntu 14.04.1
|
||||||
|
- Apple LLVM version 8.1.0 (clang-802.0.42) on OSX (x86_64-apple-darwin16.5.0)
|
||||||
|
|
||||||
|
Due to the limitations of the Travis virtual machines, the archictecture is limited to SSE4 and few tests.
|
||||||
|
|
||||||
|
May 2017: a new server using [TeamCity](https://www.jetbrains.com/teamcity/specials/teamcity/teamcity.html?gclid=CjwKEAjwutXIBRDV7-SDvdiNsUoSJACIlTqlygt_V8-PqWvjV23oAj8wf2suNmct9-sFfplBFYctzBoCnTvw_wcB&gclsrc=aw.ds.ds&dclid=COOh9rPt6dMCFYOmUQodkpwLfQ) is being setup for extensive testing of every commit.
|
||||||
|
|
||||||
|
|
||||||
|
{% include paginator.html %}
|
||||||
@@ -0,0 +1,114 @@
|
|||||||
|
---
|
||||||
|
title : "Documentation"
|
||||||
|
author_profile: false
|
||||||
|
excerpt: "Using HMC"
|
||||||
|
header:
|
||||||
|
overlay_color: "#5DADE2"
|
||||||
|
permalink: /docs/theories/hmc/
|
||||||
|
sidebar:
|
||||||
|
nav : docs
|
||||||
|
---
|
||||||
|
|
||||||
|
Using HMC in Grid version 0.7.0
|
||||||
|
|
||||||
|
These are the instructions to use the Generalised HMC on Grid version 0.7.0.
|
||||||
|
Disclaimer: GRID is still under active development so any information provided here can be changed in future releases.
|
||||||
|
|
||||||
|
Introduction
|
||||||
|
=======
|
||||||
|
|
||||||
|
The general problem is to generate a Markov Chain distributed according to the action $$S(\psi)$$ in order to compute observables expectaction values.
|
||||||
|
|
||||||
|
$$ \langle O \rangle = \frac{1}{Z} \int O e^{-S(\psi)} D\psi $$
|
||||||
|
|
||||||
|
The Hybrid Monte Carlo approach is to introduce ficticious random momenta to construct an Hamiltonian $$H(\psi)$$ and generate
|
||||||
|
new configurations by integrating the corresponding Hamilton equations.
|
||||||
|
|
||||||
|
$$H(\psi) = \frac{1}{2} P^2 + S(\psi)$$
|
||||||
|
|
||||||
|
|
||||||
|
Command line options
|
||||||
|
====================
|
||||||
|
|
||||||
|
(relevant file `GenericHMCrunner.h`)
|
||||||
|
List of command line options, specific for HMC
|
||||||
|
|
||||||
|
* ```--StartingType <string>```
|
||||||
|
|
||||||
|
Choices: HotStart, ColdStart, TepidStart, CheckpointStart
|
||||||
|
|
||||||
|
* ```--StartingTrajectory <integer>```
|
||||||
|
|
||||||
|
Only for CheckpointStart, ignored otherwise.
|
||||||
|
Expected format of the filename is ```<config prefix>.<integer>``` for the configuration and ```<rng file prefix>.<integer>```
|
||||||
|
|
||||||
|
* ```--Trajectories <integer>```
|
||||||
|
|
||||||
|
Number of trajectories in this run, excluding the thermalization steps. Default: 1.
|
||||||
|
|
||||||
|
* ```--Thermalizations <integers>```
|
||||||
|
|
||||||
|
Default: 10
|
||||||
|
|
||||||
|
* ```--ParameterFile <string>```
|
||||||
|
|
||||||
|
The filename for the input parameters deserialisation.
|
||||||
|
|
||||||
|
All of them, except the starting trajectory, can be overridden by the input file (but this behaviour can be easily changed by the user writing the source file).
|
||||||
|
|
||||||
|
Actions
|
||||||
|
======
|
||||||
|
|
||||||
|
Action names are defined in the file
|
||||||
|
lib/qcd/Actions.h
|
||||||
|
|
||||||
|
Gauge action names list:
|
||||||
|
|
||||||
|
```
|
||||||
|
WilsonGaugeActionR;
|
||||||
|
WilsonGaugeActionF;
|
||||||
|
WilsonGaugeActionD;
|
||||||
|
PlaqPlusRectangleActionR;
|
||||||
|
PlaqPlusRectangleActionF;
|
||||||
|
PlaqPlusRectangleActionD;
|
||||||
|
IwasakiGaugeActionR;
|
||||||
|
IwasakiGaugeActionF;
|
||||||
|
IwasakiGaugeActionD;
|
||||||
|
SymanzikGaugeActionR;
|
||||||
|
SymanzikGaugeActionF;
|
||||||
|
SymanzikGaugeActionD;
|
||||||
|
|
||||||
|
ConjugateWilsonGaugeActionR;
|
||||||
|
ConjugateWilsonGaugeActionF;
|
||||||
|
ConjugateWilsonGaugeActionD;
|
||||||
|
ConjugatePlaqPlusRectangleActionR;
|
||||||
|
ConjugatePlaqPlusRectangleActionF;
|
||||||
|
ConjugatePlaqPlusRectangleActionD;
|
||||||
|
ConjugateIwasakiGaugeActionR;
|
||||||
|
ConjugateIwasakiGaugeActionF;
|
||||||
|
ConjugateIwasakiGaugeActionD;
|
||||||
|
ConjugateSymanzikGaugeActionR;
|
||||||
|
ConjugateSymanzikGaugeActionF;
|
||||||
|
ConjugateSymanzikGaugeActionD;
|
||||||
|
```
|
||||||
|
|
||||||
|
Scalar action names list
|
||||||
|
|
||||||
|
```
|
||||||
|
ScalarActionR;
|
||||||
|
ScalarActionF;
|
||||||
|
ScalarActionD;
|
||||||
|
```
|
||||||
|
|
||||||
|
each of these action accept one single parameter at creation time (beta).
|
||||||
|
Example for creating a Symanzik action with beta=4.0
|
||||||
|
|
||||||
|
SymanzikGaugeActionR(4.0)
|
||||||
|
|
||||||
|
The suffixes R,F,D in the action names refer to the Real
|
||||||
|
(the precision is defined at compile time by the --enable-precision flag in the configure),
|
||||||
|
Float and Double, that force the precision of the action to be 32, 64 bit respectively.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -0,0 +1,139 @@
|
|||||||
|
---
|
||||||
|
##layout : single
|
||||||
|
title : "Documentation"
|
||||||
|
author_profile: false
|
||||||
|
excerpt: "Welcome to the Grid documentation pages"
|
||||||
|
header:
|
||||||
|
overlay_color: "#5DADE2"
|
||||||
|
#cta_label: "Download documentation"
|
||||||
|
#cta_url: "https://www.google.com"
|
||||||
|
sidebar:
|
||||||
|
nav : docs
|
||||||
|
permalink: /docs/
|
||||||
|
---
|
||||||
|
|
||||||
|
{% include base_path %}
|
||||||
|
|
||||||
|
We are currently working on the full documentation.
|
||||||
|
|
||||||
|
{% if site.option=="web" %}
|
||||||
|
Use the sidebar on the left to navigate.
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
_May 2017 : The API description and Lattice Theories sections in the sidebar are work in progress_.
|
||||||
|
|
||||||
|
### Version history
|
||||||
|
|
||||||
|
* May 2017 [version 0.7.0](https://github.com/paboyle/Grid/tree/release/v0.7.0)
|
||||||
|
* November 2016 [version 0.6.0](https://github.com/paboyle/Grid/tree/release/v0.6.0)
|
||||||
|
|
||||||
|
|
||||||
|
Grid is primarily an application development interface (API) for structured Cartesian grid codes and written in C++11.
|
||||||
|
In particular it is aimed at Lattice Field Theory simulations in general gauge theories, but with a particular emphasis
|
||||||
|
on supporting SU(3) and U(1) gauge theories relevant to hadronic physics.
|
||||||
|
|
||||||
|
|
||||||
|
### Description
|
||||||
|
|
||||||
|
This library provides data parallel C++ container classes with internal memory layout
|
||||||
|
that is transformed to map efficiently to SIMD architectures. CSHIFT facilities
|
||||||
|
are provided, similar to HPF and cmfortran, and user control is given over the mapping of
|
||||||
|
array indices to both MPI tasks and SIMD processing elements.
|
||||||
|
|
||||||
|
* Identically shaped arrays then be processed with perfect data parallelisation.
|
||||||
|
* Such identically shaped arrays are called conformable arrays.
|
||||||
|
|
||||||
|
The transformation is based on the observation that Cartesian array processing involves
|
||||||
|
identical processing to be performed on different regions of the Cartesian array.
|
||||||
|
|
||||||
|
The library will both geometrically decompose into MPI tasks and across SIMD lanes.
|
||||||
|
Local vector loops are parallelised with OpenMP pragmas.
|
||||||
|
|
||||||
|
Data parallel array operations can then be specified with a SINGLE data parallel paradigm, but
|
||||||
|
optimally use MPI, OpenMP and SIMD parallelism under the hood. This is a significant simplification
|
||||||
|
for most programmers.
|
||||||
|
|
||||||
|
The layout transformations are parametrised by the SIMD vector length. This adapts according to the architecture.
|
||||||
|
Presently SSE4 (128 bit) AVX, AVX2, QPX (256 bit), IMCI, and AVX512 (512 bit) targets are supported (ARM NEON on the way).
|
||||||
|
|
||||||
|
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`.
|
||||||
|
|
||||||
|
MPI, OpenMP, and SIMD parallelism are present in the library.
|
||||||
|
Please see [this paper](https://arxiv.org/abs/1512.03487) for more detail.
|
||||||
|
|
||||||
|
|
||||||
|
### Who will use this library
|
||||||
|
|
||||||
|
As an application development interface *Grid* is primarily a programmers tool providing the
|
||||||
|
building blocks and primitives for constructing lattice gauge theory programmes.
|
||||||
|
|
||||||
|
Grid functionality includes:
|
||||||
|
|
||||||
|
* Data parallel primitives, similar to QDP++
|
||||||
|
* gauge and fermion actions
|
||||||
|
* solvers
|
||||||
|
* gauge and fermion force terms
|
||||||
|
* integrators and (R)HMC.
|
||||||
|
* parallel field I/O
|
||||||
|
* object serialisation (text, XML, JSON...)
|
||||||
|
|
||||||
|
Grid is intended to enable the rapid and easy development of code with reasonably competitive performance.
|
||||||
|
|
||||||
|
It is first and foremost a *library* to which people can programme, and develop new algorithms and measurements.
|
||||||
|
As such, it is very much hoped that peoples principle point of contact with Grid will be in
|
||||||
|
the wonderfully rich C++ language. Since import and export procedures are provided for the opaque lattice types
|
||||||
|
it should be possible to call Grid from other code bases.
|
||||||
|
|
||||||
|
Grid is most tightly coupled to the Hadrons package
|
||||||
|
developed principally by Antonin Portelli.
|
||||||
|
This package is entirely composed against the Grid data parallel interface.
|
||||||
|
|
||||||
|
Interfacing to other packages is also possible.
|
||||||
|
|
||||||
|
Several regression tests that combine Grid with Chroma are included in the Grid distribution.
|
||||||
|
Further, Grid has been successfully interfaced to
|
||||||
|
|
||||||
|
* The Columbia Physics System
|
||||||
|
* The MILC code
|
||||||
|
|
||||||
|
### Data parallel interface
|
||||||
|
|
||||||
|
Most users will wish to interact with Grid above the data parallel *Lattice* interface. At this level
|
||||||
|
a programme is simply written as a series of statements, addressing entire lattice objects.
|
||||||
|
|
||||||
|
|
||||||
|
Implementation details may be provided to explain how the code works, but are not strictly part of the API.
|
||||||
|
|
||||||
|
**Example**
|
||||||
|
|
||||||
|
For example, as an implementation detail, in a single programme multiple data (SPMD) message passing supercomputer the main programme is trivially replicated on each computing node. The data parallel operations are called *collectively* by all nodes. Any scalar values returned by the various reduction routines are the same on each node, resulting in (for example) the same decision being made by all nodes to terminate an iterative solver on the same iteration.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
### Internal development
|
||||||
|
|
||||||
|
Internal developers may contribute to Grid at a level below the data parallel interface.
|
||||||
|
|
||||||
|
Specifically, development of new lattice Dirac operators, for example,
|
||||||
|
or any codes directly interacting with the
|
||||||
|
|
||||||
|
* Communicators
|
||||||
|
|
||||||
|
* Simd
|
||||||
|
|
||||||
|
* Tensor
|
||||||
|
|
||||||
|
* Stencil
|
||||||
|
|
||||||
|
will make use of facilities provided by to assist the creation of high performance code. The internal data layout complexities
|
||||||
|
will be exposed to some degree and the interfaces are subject to change without notice as HPC architectures change.
|
||||||
|
|
||||||
|
Since some of the internal implementation details are needed to explain the design strategy of grid these will be
|
||||||
|
documented, but labelled as *implementation dependent*
|
||||||
|
|
||||||
|
Reasonable endeavours will be made to preserve functionality where practical but no guarantees are made.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
{% include paginator.html %}
|
||||||
+109
-88
@@ -1,14 +1,30 @@
|
|||||||
GNU GENERAL PUBLIC LICENSE
|
---
|
||||||
Version 2, June 1991
|
layout: splash
|
||||||
|
title : "GRID license"
|
||||||
|
author_profile: false
|
||||||
|
excerpt: "Grid is licensed under GPL 2.0"
|
||||||
|
permalink: /license/
|
||||||
|
header:
|
||||||
|
overlay_color: "#333"
|
||||||
|
cta_label: "GPL licenses FAQs"
|
||||||
|
cta_url: "https://www.gnu.org/licenses/gpl-faq.html"
|
||||||
|
---
|
||||||
|
|
||||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
|
{% include base_path %}
|
||||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
Everyone is permitted to copy and distribute verbatim copies
|
|
||||||
of this license document, but changing it is not allowed.
|
|
||||||
|
|
||||||
Preamble
|
GNU General Public License
|
||||||
|
==========================
|
||||||
|
|
||||||
The licenses for most software are designed to take away your
|
_Version 2, June 1991_
|
||||||
|
_Copyright © 1989, 1991 Free Software Foundation, Inc.,_
|
||||||
|
_51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA_
|
||||||
|
|
||||||
|
Everyone is permitted to copy and distribute verbatim copies
|
||||||
|
of this license document, but changing it is not allowed.
|
||||||
|
|
||||||
|
### Preamble
|
||||||
|
|
||||||
|
The licenses for most software are designed to take away your
|
||||||
freedom to share and change it. By contrast, the GNU General Public
|
freedom to share and change it. By contrast, the GNU General Public
|
||||||
License is intended to guarantee your freedom to share and change free
|
License is intended to guarantee your freedom to share and change free
|
||||||
software--to make sure the software is free for all its users. This
|
software--to make sure the software is free for all its users. This
|
||||||
@@ -18,56 +34,55 @@ using it. (Some other Free Software Foundation software is covered by
|
|||||||
the GNU Lesser General Public License instead.) You can apply it to
|
the GNU Lesser General Public License instead.) You can apply it to
|
||||||
your programs, too.
|
your programs, too.
|
||||||
|
|
||||||
When we speak of free software, we are referring to freedom, not
|
When we speak of free software, we are referring to freedom, not
|
||||||
price. Our General Public Licenses are designed to make sure that you
|
price. Our General Public Licenses are designed to make sure that you
|
||||||
have the freedom to distribute copies of free software (and charge for
|
have the freedom to distribute copies of free software (and charge for
|
||||||
this service if you wish), that you receive source code or can get it
|
this service if you wish), that you receive source code or can get it
|
||||||
if you want it, that you can change the software or use pieces of it
|
if you want it, that you can change the software or use pieces of it
|
||||||
in new free programs; and that you know you can do these things.
|
in new free programs; and that you know you can do these things.
|
||||||
|
|
||||||
To protect your rights, we need to make restrictions that forbid
|
To protect your rights, we need to make restrictions that forbid
|
||||||
anyone to deny you these rights or to ask you to surrender the rights.
|
anyone to deny you these rights or to ask you to surrender the rights.
|
||||||
These restrictions translate to certain responsibilities for you if you
|
These restrictions translate to certain responsibilities for you if you
|
||||||
distribute copies of the software, or if you modify it.
|
distribute copies of the software, or if you modify it.
|
||||||
|
|
||||||
For example, if you distribute copies of such a program, whether
|
For example, if you distribute copies of such a program, whether
|
||||||
gratis or for a fee, you must give the recipients all the rights that
|
gratis or for a fee, you must give the recipients all the rights that
|
||||||
you have. You must make sure that they, too, receive or can get the
|
you have. You must make sure that they, too, receive or can get the
|
||||||
source code. And you must show them these terms so they know their
|
source code. And you must show them these terms so they know their
|
||||||
rights.
|
rights.
|
||||||
|
|
||||||
We protect your rights with two steps: (1) copyright the software, and
|
We protect your rights with two steps: **(1)** copyright the software, and
|
||||||
(2) offer you this license which gives you legal permission to copy,
|
**(2)** offer you this license which gives you legal permission to copy,
|
||||||
distribute and/or modify the software.
|
distribute and/or modify the software.
|
||||||
|
|
||||||
Also, for each author's protection and ours, we want to make certain
|
Also, for each author's protection and ours, we want to make certain
|
||||||
that everyone understands that there is no warranty for this free
|
that everyone understands that there is no warranty for this free
|
||||||
software. If the software is modified by someone else and passed on, we
|
software. If the software is modified by someone else and passed on, we
|
||||||
want its recipients to know that what they have is not the original, so
|
want its recipients to know that what they have is not the original, so
|
||||||
that any problems introduced by others will not reflect on the original
|
that any problems introduced by others will not reflect on the original
|
||||||
authors' reputations.
|
authors' reputations.
|
||||||
|
|
||||||
Finally, any free program is threatened constantly by software
|
Finally, any free program is threatened constantly by software
|
||||||
patents. We wish to avoid the danger that redistributors of a free
|
patents. We wish to avoid the danger that redistributors of a free
|
||||||
program will individually obtain patent licenses, in effect making the
|
program will individually obtain patent licenses, in effect making the
|
||||||
program proprietary. To prevent this, we have made it clear that any
|
program proprietary. To prevent this, we have made it clear that any
|
||||||
patent must be licensed for everyone's free use or not licensed at all.
|
patent must be licensed for everyone's free use or not licensed at all.
|
||||||
|
|
||||||
The precise terms and conditions for copying, distribution and
|
The precise terms and conditions for copying, distribution and
|
||||||
modification follow.
|
modification follow.
|
||||||
|
|
||||||
GNU GENERAL PUBLIC LICENSE
|
### TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
|
||||||
|
|
||||||
0. This License applies to any program or other work which contains
|
**0.** This License applies to any program or other work which contains
|
||||||
a notice placed by the copyright holder saying it may be distributed
|
a notice placed by the copyright holder saying it may be distributed
|
||||||
under the terms of this General Public License. The "Program", below,
|
under the terms of this General Public License. The “Program”, below,
|
||||||
refers to any such program or work, and a "work based on the Program"
|
refers to any such program or work, and a “work based on the Program”
|
||||||
means either the Program or any derivative work under copyright law:
|
means either the Program or any derivative work under copyright law:
|
||||||
that is to say, a work containing the Program or a portion of it,
|
that is to say, a work containing the Program or a portion of it,
|
||||||
either verbatim or with modifications and/or translated into another
|
either verbatim or with modifications and/or translated into another
|
||||||
language. (Hereinafter, translation is included without limitation in
|
language. (Hereinafter, translation is included without limitation in
|
||||||
the term "modification".) Each licensee is addressed as "you".
|
the term “modification”.) Each licensee is addressed as “you”.
|
||||||
|
|
||||||
Activities other than copying, distribution and modification are not
|
Activities other than copying, distribution and modification are not
|
||||||
covered by this License; they are outside its scope. The act of
|
covered by this License; they are outside its scope. The act of
|
||||||
@@ -76,7 +91,7 @@ is covered only if its contents constitute a work based on the
|
|||||||
Program (independent of having been made by running the Program).
|
Program (independent of having been made by running the Program).
|
||||||
Whether that is true depends on what the Program does.
|
Whether that is true depends on what the Program does.
|
||||||
|
|
||||||
1. You may copy and distribute verbatim copies of the Program's
|
**1.** You may copy and distribute verbatim copies of the Program's
|
||||||
source code as you receive it, in any medium, provided that you
|
source code as you receive it, in any medium, provided that you
|
||||||
conspicuously and appropriately publish on each copy an appropriate
|
conspicuously and appropriately publish on each copy an appropriate
|
||||||
copyright notice and disclaimer of warranty; keep intact all the
|
copyright notice and disclaimer of warranty; keep intact all the
|
||||||
@@ -87,29 +102,27 @@ along with the Program.
|
|||||||
You may charge a fee for the physical act of transferring a copy, and
|
You may charge a fee for the physical act of transferring a copy, and
|
||||||
you may at your option offer warranty protection in exchange for a fee.
|
you may at your option offer warranty protection in exchange for a fee.
|
||||||
|
|
||||||
2. You may modify your copy or copies of the Program or any portion
|
**2.** You may modify your copy or copies of the Program or any portion
|
||||||
of it, thus forming a work based on the Program, and copy and
|
of it, thus forming a work based on the Program, and copy and
|
||||||
distribute such modifications or work under the terms of Section 1
|
distribute such modifications or work under the terms of Section 1
|
||||||
above, provided that you also meet all of these conditions:
|
above, provided that you also meet all of these conditions:
|
||||||
|
|
||||||
a) You must cause the modified files to carry prominent notices
|
* **a)** You must cause the modified files to carry prominent notices
|
||||||
stating that you changed the files and the date of any change.
|
stating that you changed the files and the date of any change.
|
||||||
|
* **b)** You must cause any work that you distribute or publish, that in
|
||||||
b) You must cause any work that you distribute or publish, that in
|
whole or in part contains or is derived from the Program or any
|
||||||
whole or in part contains or is derived from the Program or any
|
part thereof, to be licensed as a whole at no charge to all third
|
||||||
part thereof, to be licensed as a whole at no charge to all third
|
parties under the terms of this License.
|
||||||
parties under the terms of this License.
|
* **c)** If the modified program normally reads commands interactively
|
||||||
|
when run, you must cause it, when started running for such
|
||||||
c) If the modified program normally reads commands interactively
|
interactive use in the most ordinary way, to print or display an
|
||||||
when run, you must cause it, when started running for such
|
announcement including an appropriate copyright notice and a
|
||||||
interactive use in the most ordinary way, to print or display an
|
notice that there is no warranty (or else, saying that you provide
|
||||||
announcement including an appropriate copyright notice and a
|
a warranty) and that users may redistribute the program under
|
||||||
notice that there is no warranty (or else, saying that you provide
|
these conditions, and telling the user how to view a copy of this
|
||||||
a warranty) and that users may redistribute the program under
|
License. (Exception: if the Program itself is interactive but
|
||||||
these conditions, and telling the user how to view a copy of this
|
does not normally print such an announcement, your work based on
|
||||||
License. (Exception: if the Program itself is interactive but
|
the Program is not required to print an announcement.)
|
||||||
does not normally print such an announcement, your work based on
|
|
||||||
the Program is not required to print an announcement.)
|
|
||||||
|
|
||||||
These requirements apply to the modified work as a whole. If
|
These requirements apply to the modified work as a whole. If
|
||||||
identifiable sections of that work are not derived from the Program,
|
identifiable sections of that work are not derived from the Program,
|
||||||
@@ -131,26 +144,24 @@ with the Program (or with a work based on the Program) on a volume of
|
|||||||
a storage or distribution medium does not bring the other work under
|
a storage or distribution medium does not bring the other work under
|
||||||
the scope of this License.
|
the scope of this License.
|
||||||
|
|
||||||
3. You may copy and distribute the Program (or a work based on it,
|
**3.** You may copy and distribute the Program (or a work based on it,
|
||||||
under Section 2) in object code or executable form under the terms of
|
under Section 2) in object code or executable form under the terms of
|
||||||
Sections 1 and 2 above provided that you also do one of the following:
|
Sections 1 and 2 above provided that you also do one of the following:
|
||||||
|
|
||||||
a) Accompany it with the complete corresponding machine-readable
|
* **a)** Accompany it with the complete corresponding machine-readable
|
||||||
source code, which must be distributed under the terms of Sections
|
source code, which must be distributed under the terms of Sections
|
||||||
1 and 2 above on a medium customarily used for software interchange; or,
|
1 and 2 above on a medium customarily used for software interchange; or,
|
||||||
|
* **b)** Accompany it with a written offer, valid for at least three
|
||||||
b) Accompany it with a written offer, valid for at least three
|
years, to give any third party, for a charge no more than your
|
||||||
years, to give any third party, for a charge no more than your
|
cost of physically performing source distribution, a complete
|
||||||
cost of physically performing source distribution, a complete
|
machine-readable copy of the corresponding source code, to be
|
||||||
machine-readable copy of the corresponding source code, to be
|
distributed under the terms of Sections 1 and 2 above on a medium
|
||||||
distributed under the terms of Sections 1 and 2 above on a medium
|
customarily used for software interchange; or,
|
||||||
customarily used for software interchange; or,
|
* **c)** Accompany it with the information you received as to the offer
|
||||||
|
to distribute corresponding source code. (This alternative is
|
||||||
c) Accompany it with the information you received as to the offer
|
allowed only for noncommercial distribution and only if you
|
||||||
to distribute corresponding source code. (This alternative is
|
received the program in object code or executable form with such
|
||||||
allowed only for noncommercial distribution and only if you
|
an offer, in accord with Subsection b above.)
|
||||||
received the program in object code or executable form with such
|
|
||||||
an offer, in accord with Subsection b above.)
|
|
||||||
|
|
||||||
The source code for a work means the preferred form of the work for
|
The source code for a work means the preferred form of the work for
|
||||||
making modifications to it. For an executable work, complete source
|
making modifications to it. For an executable work, complete source
|
||||||
@@ -169,7 +180,7 @@ access to copy the source code from the same place counts as
|
|||||||
distribution of the source code, even though third parties are not
|
distribution of the source code, even though third parties are not
|
||||||
compelled to copy the source along with the object code.
|
compelled to copy the source along with the object code.
|
||||||
|
|
||||||
4. You may not copy, modify, sublicense, or distribute the Program
|
**4.** You may not copy, modify, sublicense, or distribute the Program
|
||||||
except as expressly provided under this License. Any attempt
|
except as expressly provided under this License. Any attempt
|
||||||
otherwise to copy, modify, sublicense or distribute the Program is
|
otherwise to copy, modify, sublicense or distribute the Program is
|
||||||
void, and will automatically terminate your rights under this License.
|
void, and will automatically terminate your rights under this License.
|
||||||
@@ -177,7 +188,7 @@ However, parties who have received copies, or rights, from you under
|
|||||||
this License will not have their licenses terminated so long as such
|
this License will not have their licenses terminated so long as such
|
||||||
parties remain in full compliance.
|
parties remain in full compliance.
|
||||||
|
|
||||||
5. You are not required to accept this License, since you have not
|
**5.** You are not required to accept this License, since you have not
|
||||||
signed it. However, nothing else grants you permission to modify or
|
signed it. However, nothing else grants you permission to modify or
|
||||||
distribute the Program or its derivative works. These actions are
|
distribute the Program or its derivative works. These actions are
|
||||||
prohibited by law if you do not accept this License. Therefore, by
|
prohibited by law if you do not accept this License. Therefore, by
|
||||||
@@ -186,7 +197,7 @@ Program), you indicate your acceptance of this License to do so, and
|
|||||||
all its terms and conditions for copying, distributing or modifying
|
all its terms and conditions for copying, distributing or modifying
|
||||||
the Program or works based on it.
|
the Program or works based on it.
|
||||||
|
|
||||||
6. Each time you redistribute the Program (or any work based on the
|
**6.** Each time you redistribute the Program (or any work based on the
|
||||||
Program), the recipient automatically receives a license from the
|
Program), the recipient automatically receives a license from the
|
||||||
original licensor to copy, distribute or modify the Program subject to
|
original licensor to copy, distribute or modify the Program subject to
|
||||||
these terms and conditions. You may not impose any further
|
these terms and conditions. You may not impose any further
|
||||||
@@ -194,7 +205,7 @@ restrictions on the recipients' exercise of the rights granted herein.
|
|||||||
You are not responsible for enforcing compliance by third parties to
|
You are not responsible for enforcing compliance by third parties to
|
||||||
this License.
|
this License.
|
||||||
|
|
||||||
7. If, as a consequence of a court judgment or allegation of patent
|
**7.** If, as a consequence of a court judgment or allegation of patent
|
||||||
infringement or for any other reason (not limited to patent issues),
|
infringement or for any other reason (not limited to patent issues),
|
||||||
conditions are imposed on you (whether by court order, agreement or
|
conditions are imposed on you (whether by court order, agreement or
|
||||||
otherwise) that contradict the conditions of this License, they do not
|
otherwise) that contradict the conditions of this License, they do not
|
||||||
@@ -226,7 +237,7 @@ impose that choice.
|
|||||||
This section is intended to make thoroughly clear what is believed to
|
This section is intended to make thoroughly clear what is believed to
|
||||||
be a consequence of the rest of this License.
|
be a consequence of the rest of this License.
|
||||||
|
|
||||||
8. If the distribution and/or use of the Program is restricted in
|
**8.** If the distribution and/or use of the Program is restricted in
|
||||||
certain countries either by patents or by copyrighted interfaces, the
|
certain countries either by patents or by copyrighted interfaces, the
|
||||||
original copyright holder who places the Program under this License
|
original copyright holder who places the Program under this License
|
||||||
may add an explicit geographical distribution limitation excluding
|
may add an explicit geographical distribution limitation excluding
|
||||||
@@ -234,20 +245,20 @@ those countries, so that distribution is permitted only in or among
|
|||||||
countries not thus excluded. In such case, this License incorporates
|
countries not thus excluded. In such case, this License incorporates
|
||||||
the limitation as if written in the body of this License.
|
the limitation as if written in the body of this License.
|
||||||
|
|
||||||
9. The Free Software Foundation may publish revised and/or new versions
|
**9.** The Free Software Foundation may publish revised and/or new versions
|
||||||
of the General Public License from time to time. Such new versions will
|
of the General Public License from time to time. Such new versions will
|
||||||
be similar in spirit to the present version, but may differ in detail to
|
be similar in spirit to the present version, but may differ in detail to
|
||||||
address new problems or concerns.
|
address new problems or concerns.
|
||||||
|
|
||||||
Each version is given a distinguishing version number. If the Program
|
Each version is given a distinguishing version number. If the Program
|
||||||
specifies a version number of this License which applies to it and "any
|
specifies a version number of this License which applies to it and “any
|
||||||
later version", you have the option of following the terms and conditions
|
later version”, you have the option of following the terms and conditions
|
||||||
either of that version or of any later version published by the Free
|
either of that version or of any later version published by the Free
|
||||||
Software Foundation. If the Program does not specify a version number of
|
Software Foundation. If the Program does not specify a version number of
|
||||||
this License, you may choose any version ever published by the Free Software
|
this License, you may choose any version ever published by the Free Software
|
||||||
Foundation.
|
Foundation.
|
||||||
|
|
||||||
10. If you wish to incorporate parts of the Program into other free
|
**10.** If you wish to incorporate parts of the Program into other free
|
||||||
programs whose distribution conditions are different, write to the author
|
programs whose distribution conditions are different, write to the author
|
||||||
to ask for permission. For software which is copyrighted by the Free
|
to ask for permission. For software which is copyrighted by the Free
|
||||||
Software Foundation, write to the Free Software Foundation; we sometimes
|
Software Foundation, write to the Free Software Foundation; we sometimes
|
||||||
@@ -255,19 +266,19 @@ make exceptions for this. Our decision will be guided by the two goals
|
|||||||
of preserving the free status of all derivatives of our free software and
|
of preserving the free status of all derivatives of our free software and
|
||||||
of promoting the sharing and reuse of software generally.
|
of promoting the sharing and reuse of software generally.
|
||||||
|
|
||||||
NO WARRANTY
|
### NO WARRANTY
|
||||||
|
|
||||||
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
**11.** BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
||||||
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
||||||
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
||||||
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
|
PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
|
||||||
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
|
||||||
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
|
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
|
||||||
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
||||||
REPAIR OR CORRECTION.
|
REPAIR OR CORRECTION.
|
||||||
|
|
||||||
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
**12.** IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
||||||
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
||||||
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
|
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
|
||||||
@@ -277,32 +288,32 @@ YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
|||||||
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
||||||
POSSIBILITY OF SUCH DAMAGES.
|
POSSIBILITY OF SUCH DAMAGES.
|
||||||
|
|
||||||
END OF TERMS AND CONDITIONS
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
How to Apply These Terms to Your New Programs
|
### How to Apply These Terms to Your New Programs
|
||||||
|
|
||||||
If you develop a new program, and you want it to be of the greatest
|
If you develop a new program, and you want it to be of the greatest
|
||||||
possible use to the public, the best way to achieve this is to make it
|
possible use to the public, the best way to achieve this is to make it
|
||||||
free software which everyone can redistribute and change under these terms.
|
free software which everyone can redistribute and change under these terms.
|
||||||
|
|
||||||
To do so, attach the following notices to the program. It is safest
|
To do so, attach the following notices to the program. It is safest
|
||||||
to attach them to the start of each source file to most effectively
|
to attach them to the start of each source file to most effectively
|
||||||
convey the exclusion of warranty; and each file should have at least
|
convey the exclusion of warranty; and each file should have at least
|
||||||
the "copyright" line and a pointer to where the full notice is found.
|
the “copyright” line and a pointer to where the full notice is found.
|
||||||
|
|
||||||
<one line to give the program's name and a brief idea of what it does.>
|
<one line to give the program's name and a brief idea of what it does.>
|
||||||
Copyright (C) <year> <name of author>
|
Copyright (C) <year> <name of author>
|
||||||
|
|
||||||
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.
|
||||||
@@ -317,20 +328,20 @@ when it starts in an interactive mode:
|
|||||||
This is free software, and you are welcome to redistribute it
|
This is free software, and you are welcome to redistribute it
|
||||||
under certain conditions; type `show c' for details.
|
under certain conditions; type `show c' for details.
|
||||||
|
|
||||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
The hypothetical commands `show w` and `show c` should show the appropriate
|
||||||
parts of the General Public License. Of course, the commands you use may
|
parts of the General Public License. Of course, the commands you use may
|
||||||
be called something other than `show w' and `show c'; they could even be
|
be called something other than `show w` and `show c`; they could even be
|
||||||
mouse-clicks or menu items--whatever suits your program.
|
mouse-clicks or menu items--whatever suits your program.
|
||||||
|
|
||||||
You should also get your employer (if you work as a programmer) or your
|
You should also get your employer (if you work as a programmer) or your
|
||||||
school, if any, to sign a "copyright disclaimer" for the program, if
|
school, if any, to sign a “copyright disclaimer” for the program, if
|
||||||
necessary. Here is a sample; alter the names:
|
necessary. Here is a sample; alter the names:
|
||||||
|
|
||||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
|
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
|
||||||
`Gnomovision' (which makes passes at compilers) written by James Hacker.
|
`Gnomovision' (which makes passes at compilers) written by James Hacker.
|
||||||
|
|
||||||
<signature of Ty Coon>, 1 April 1989
|
<signature of Ty Coon>, 1 April 1989
|
||||||
Ty Coon, President of Vice
|
Ty Coon, President of Vice
|
||||||
|
|
||||||
This General Public License does not permit incorporating your program into
|
This General Public License does not permit incorporating your program into
|
||||||
proprietary programs. If your program is a subroutine library, you may
|
proprietary programs. If your program is a subroutine library, you may
|
||||||
@@ -338,3 +349,13 @@ consider it more useful to permit linking proprietary applications with the
|
|||||||
library. If this is what you want to do, use the GNU Lesser General
|
library. If this is what you want to do, use the GNU Lesser General
|
||||||
Public License instead of this License.
|
Public License instead of this License.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
{% for post in paginator.posts %}
|
||||||
|
{% include archive-single.html %}
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
|
{% include paginator.html %}
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
/* ==========================================================================
|
||||||
|
ANIMATIONS
|
||||||
|
========================================================================== */
|
||||||
|
|
||||||
|
@-webkit-keyframes intro {
|
||||||
|
0% {
|
||||||
|
opacity: 0;
|
||||||
|
}
|
||||||
|
100% {
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes intro {
|
||||||
|
0% {
|
||||||
|
opacity: 0;
|
||||||
|
}
|
||||||
|
100% {
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,238 @@
|
|||||||
|
/* ==========================================================================
|
||||||
|
ARCHIVE
|
||||||
|
========================================================================== */
|
||||||
|
|
||||||
|
.archive {
|
||||||
|
margin-bottom: 2em;
|
||||||
|
|
||||||
|
@include breakpoint($medium) {
|
||||||
|
@include span(12 of 12);
|
||||||
|
}
|
||||||
|
|
||||||
|
@include breakpoint($large) {
|
||||||
|
@include span(10 of 12 last);
|
||||||
|
@include prefix(0.5 of 12);
|
||||||
|
}
|
||||||
|
|
||||||
|
a {
|
||||||
|
color: inherit;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.archive__subtitle {
|
||||||
|
margin: 1.414em 0 0;
|
||||||
|
padding-bottom: 0.5em;
|
||||||
|
font-size: $type-size-5;
|
||||||
|
color: mix(#fff, $gray, 25%);
|
||||||
|
border-bottom: 1px solid $border-color;
|
||||||
|
|
||||||
|
+ .list__item .archive__item-title {
|
||||||
|
margin-top: 0.5em;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.archive__item-title {
|
||||||
|
margin-bottom: 0.25em;
|
||||||
|
font-family: $sans-serif-narrow;
|
||||||
|
|
||||||
|
a + a {
|
||||||
|
opacity: 0.5;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* remove border*/
|
||||||
|
.page__content {
|
||||||
|
|
||||||
|
.archive__item-title {
|
||||||
|
margin-top: 1em;
|
||||||
|
border-bottom: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.archive__item-excerpt {
|
||||||
|
margin-top: 0;
|
||||||
|
font-size: $type-size-6;
|
||||||
|
|
||||||
|
& + p {
|
||||||
|
text-indent: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.archive__item-teaser {
|
||||||
|
border-radius: $border-radius;
|
||||||
|
overflow: hidden;
|
||||||
|
img {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.archive__item:hover {
|
||||||
|
.archive__item-teaser {
|
||||||
|
box-shadow: 0 0 10px rgba(#000, 0.25);
|
||||||
|
}
|
||||||
|
|
||||||
|
.archive__item-title {
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
List view
|
||||||
|
========================================================================== */
|
||||||
|
|
||||||
|
.list__item {
|
||||||
|
@include breakpoint($medium) {
|
||||||
|
padding-right: $right-sidebar-width-narrow;
|
||||||
|
}
|
||||||
|
|
||||||
|
@include breakpoint($large) {
|
||||||
|
padding-right: $right-sidebar-width;
|
||||||
|
}
|
||||||
|
|
||||||
|
@include breakpoint($x-large) {
|
||||||
|
padding-right: $right-sidebar-width-wide;
|
||||||
|
}
|
||||||
|
|
||||||
|
.page__meta {
|
||||||
|
margin: 0 0 4px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
Grid view
|
||||||
|
========================================================================== */
|
||||||
|
|
||||||
|
.grid__item {
|
||||||
|
margin-bottom: 2em;
|
||||||
|
|
||||||
|
.page__meta {
|
||||||
|
margin: 0 0 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.archive__item-title {
|
||||||
|
margin-top: 0.5em;
|
||||||
|
font-size: $type-size-5;
|
||||||
|
}
|
||||||
|
|
||||||
|
.archive__item-excerpt {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
@include breakpoint($small) {
|
||||||
|
@include gallery(5 of 10);
|
||||||
|
.archive__item-teaser {
|
||||||
|
max-height: 200px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@include breakpoint($medium) {
|
||||||
|
margin-left: 0; /* reset before mixin does its thing*/
|
||||||
|
margin-right: 0; /* reset before mixin does its thing*/
|
||||||
|
@include gallery(2.5 of 10);
|
||||||
|
|
||||||
|
.archive__item-teaser {
|
||||||
|
max-height: 120px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.archive__item-excerpt {
|
||||||
|
display: block;
|
||||||
|
font-size: $type-size-6;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
Features
|
||||||
|
========================================================================== */
|
||||||
|
|
||||||
|
.feature__wrapper {
|
||||||
|
@include clearfix();
|
||||||
|
margin-bottom: 2em;
|
||||||
|
border-bottom: 1px solid $border-color;
|
||||||
|
}
|
||||||
|
|
||||||
|
.feature__item {
|
||||||
|
margin-bottom: 2em;
|
||||||
|
font-size: 1.25rem;
|
||||||
|
|
||||||
|
@include breakpoint($small) {
|
||||||
|
margin-bottom: 0;
|
||||||
|
@include gallery(4 of 12);
|
||||||
|
|
||||||
|
.feature__item-teaser {
|
||||||
|
max-height: 200px;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&--left {
|
||||||
|
@include full();
|
||||||
|
font-size: 1.25rem;
|
||||||
|
|
||||||
|
.archive__item-teaser {
|
||||||
|
margin-bottom: 2em;
|
||||||
|
}
|
||||||
|
|
||||||
|
@include breakpoint($small) {
|
||||||
|
.archive__item-teaser {
|
||||||
|
@include span(5 of 12);
|
||||||
|
}
|
||||||
|
|
||||||
|
.archive__item-body {
|
||||||
|
@include span(7 of 12 last);
|
||||||
|
@include prefix(0.5 of 12);
|
||||||
|
@include suffix(1 of 12);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&--right {
|
||||||
|
@include full();
|
||||||
|
font-size: 1.25rem;
|
||||||
|
|
||||||
|
.archive__item-teaser {
|
||||||
|
margin-bottom: 2em;
|
||||||
|
}
|
||||||
|
|
||||||
|
@include breakpoint($small) {
|
||||||
|
text-align: right;
|
||||||
|
|
||||||
|
.archive__item-teaser {
|
||||||
|
@include span(5 of 12 rtl);
|
||||||
|
}
|
||||||
|
|
||||||
|
.archive__item-body {
|
||||||
|
@include span(7 of 12 last rtl);
|
||||||
|
@include prefix(0.5 of 12);
|
||||||
|
@include suffix(1 of 12);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&--center {
|
||||||
|
@include full();
|
||||||
|
font-size: 1.25rem;
|
||||||
|
|
||||||
|
.archive__item-teaser {
|
||||||
|
margin-bottom: 2em;
|
||||||
|
}
|
||||||
|
|
||||||
|
@include breakpoint($small) {
|
||||||
|
text-align: center;
|
||||||
|
|
||||||
|
.archive__item-teaser {
|
||||||
|
margin: 0 auto;
|
||||||
|
width: span(5 of 12);
|
||||||
|
}
|
||||||
|
|
||||||
|
.archive__item-body {
|
||||||
|
margin: 0 auto;
|
||||||
|
width: span(7 of 12);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,315 @@
|
|||||||
|
/* ==========================================================================
|
||||||
|
BASE ELEMENTS
|
||||||
|
========================================================================== */
|
||||||
|
|
||||||
|
html {
|
||||||
|
/* sticky footer fix */
|
||||||
|
position: relative;
|
||||||
|
min-height: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
color: $text-color;
|
||||||
|
font-family: $global-font-family;
|
||||||
|
line-height: 1.5;
|
||||||
|
|
||||||
|
&.overflow--hidden {
|
||||||
|
/* when primary navigation is visible, the content in the background won't scroll */
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
h1, h2, h3, h4, h5, h6 {
|
||||||
|
margin: 2em 0 0.5em;
|
||||||
|
line-height: 1.2;
|
||||||
|
font-family: $header-font-family;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
margin-top: 0;
|
||||||
|
font-size: $type-size-3;
|
||||||
|
}
|
||||||
|
|
||||||
|
h2 {
|
||||||
|
font-size: $type-size-4;
|
||||||
|
}
|
||||||
|
|
||||||
|
h3 {
|
||||||
|
font-size: $type-size-5;
|
||||||
|
}
|
||||||
|
|
||||||
|
h4 {
|
||||||
|
font-size: $type-size-6;
|
||||||
|
}
|
||||||
|
|
||||||
|
h5 {
|
||||||
|
font-size: $type-size-6;
|
||||||
|
}
|
||||||
|
|
||||||
|
h6 {
|
||||||
|
font-size: $type-size-6;
|
||||||
|
}
|
||||||
|
|
||||||
|
small, .small {
|
||||||
|
font-size: $type-size-6;
|
||||||
|
}
|
||||||
|
|
||||||
|
p {
|
||||||
|
margin-bottom: 1.3em;
|
||||||
|
}
|
||||||
|
|
||||||
|
u,
|
||||||
|
ins {
|
||||||
|
text-decoration: none;
|
||||||
|
border-bottom: 1px solid $text-color;
|
||||||
|
a {
|
||||||
|
color: inherit;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
del a {
|
||||||
|
color: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* reduce orphans and widows when printing */
|
||||||
|
|
||||||
|
p, pre, blockquote, ul, ol, dl, figure, table, fieldset {
|
||||||
|
orphans: 3;
|
||||||
|
widows: 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* abbreviations */
|
||||||
|
|
||||||
|
abbr[title],
|
||||||
|
abbr[data-original-title] {
|
||||||
|
text-decoration: none;
|
||||||
|
cursor: help;
|
||||||
|
border-bottom: 1px dotted $text-color;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* blockquotes */
|
||||||
|
|
||||||
|
blockquote {
|
||||||
|
margin: 2em 1em 2em 0;
|
||||||
|
padding-left: 1em;
|
||||||
|
padding-right: 1em;
|
||||||
|
font-style: italic;
|
||||||
|
border-left: 0.25em solid $primary-color;
|
||||||
|
|
||||||
|
cite {
|
||||||
|
font-style: italic;
|
||||||
|
|
||||||
|
&:before {
|
||||||
|
content: "\2014";
|
||||||
|
padding-right: 5px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* links */
|
||||||
|
|
||||||
|
a {
|
||||||
|
&:focus {
|
||||||
|
@extend %tab-focus;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:hover,
|
||||||
|
&:active {
|
||||||
|
outline: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* code */
|
||||||
|
|
||||||
|
tt, code, kbd, samp, pre {
|
||||||
|
font-family: $monospace;
|
||||||
|
}
|
||||||
|
|
||||||
|
pre {
|
||||||
|
overflow-x: auto; /* add scrollbars to wide code blocks*/
|
||||||
|
}
|
||||||
|
|
||||||
|
p > code,
|
||||||
|
a > code,
|
||||||
|
li > code,
|
||||||
|
figcaption > code,
|
||||||
|
td > code {
|
||||||
|
padding-top: 0.1rem;
|
||||||
|
padding-bottom: 0.1rem;
|
||||||
|
font-size: $type-size-6;
|
||||||
|
background: $code-background-color;
|
||||||
|
border: 1px solid $lighter-gray;
|
||||||
|
border-radius: $border-radius;
|
||||||
|
box-shadow: $box-shadow;
|
||||||
|
|
||||||
|
&:before, &:after {
|
||||||
|
letter-spacing: -0.2em;
|
||||||
|
content: "\00a0"; /* non-breaking space*/
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* horizontal rule */
|
||||||
|
|
||||||
|
hr {
|
||||||
|
display: block;
|
||||||
|
margin: 1em 0;
|
||||||
|
border: 0;
|
||||||
|
border-top: 1px solid $border-color;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* lists */
|
||||||
|
|
||||||
|
ul li,
|
||||||
|
ol li {
|
||||||
|
margin-bottom: 0.5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
li ul,
|
||||||
|
li ol {
|
||||||
|
margin-top: 0.5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Media and embeds
|
||||||
|
========================================================================== */
|
||||||
|
|
||||||
|
/* Figures and images */
|
||||||
|
|
||||||
|
figure {
|
||||||
|
display: -webkit-box;
|
||||||
|
display: flex;
|
||||||
|
-webkit-box-pack: justify;
|
||||||
|
justify-content: space-between;
|
||||||
|
-webkit-box-align: start;
|
||||||
|
align-items: flex-start;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
margin: 2em 0;
|
||||||
|
|
||||||
|
img,
|
||||||
|
iframe,
|
||||||
|
.fluid-width-video-wrapper {
|
||||||
|
margin-bottom: 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
img {
|
||||||
|
width: 100%;
|
||||||
|
border-radius: $border-radius;
|
||||||
|
-webkit-transition: $global-transition;
|
||||||
|
transition: $global-transition;
|
||||||
|
}
|
||||||
|
|
||||||
|
> a {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.half {
|
||||||
|
> a,
|
||||||
|
> img {
|
||||||
|
@include breakpoint($small) {
|
||||||
|
width: calc(50% - 0.5em);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
figcaption {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&.third {
|
||||||
|
> a,
|
||||||
|
> img {
|
||||||
|
@include breakpoint($small) {
|
||||||
|
width: calc(33.3333% - 0.5em);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
figcaption {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Figure captions */
|
||||||
|
|
||||||
|
figcaption {
|
||||||
|
margin-bottom: 0.5em;
|
||||||
|
color: mix(#fff, $text-color, 25%);
|
||||||
|
font-family: $caption-font-family;
|
||||||
|
font-size: $type-size-6;
|
||||||
|
|
||||||
|
a {
|
||||||
|
color: inherit;
|
||||||
|
text-decoration: none;
|
||||||
|
border-bottom: 1px solid $light-gray;
|
||||||
|
-webkit-transition: $global-transition;
|
||||||
|
transition: $global-transition;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
color: #000;
|
||||||
|
border-bottom-color: #000;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Fix IE9 SVG bug */
|
||||||
|
|
||||||
|
svg:not(:root) {
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
Navigation lists
|
||||||
|
========================================================================== */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Removes margins, padding, and bullet points from navigation lists
|
||||||
|
*
|
||||||
|
* Example usage:
|
||||||
|
* <nav>
|
||||||
|
* <ul>
|
||||||
|
* <li><a href="#link-1">Link 1</a></li>
|
||||||
|
* <li><a href="#link-2">Link 2</a></li>
|
||||||
|
* <li><a href="#link-3">Link 3</a></li>
|
||||||
|
* </ul>
|
||||||
|
* </nav>
|
||||||
|
*/
|
||||||
|
|
||||||
|
nav {
|
||||||
|
ul {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
li {
|
||||||
|
list-style: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
a {
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* override white-space for nested lists */
|
||||||
|
ul li,
|
||||||
|
ol li {
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
li ul,
|
||||||
|
li ol {
|
||||||
|
margin-top: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Global animation transition
|
||||||
|
========================================================================== */
|
||||||
|
|
||||||
|
b, i, strong, em, blockquote, p, q, span, figure, img, h1, h2, header, input, a, tr, td, form button, input[type="submit"], .btn, .highlight, .archive__item-teaser {
|
||||||
|
-webkit-transition: $global-transition;
|
||||||
|
transition: $global-transition;
|
||||||
|
}
|
||||||
@@ -0,0 +1,153 @@
|
|||||||
|
/* ==========================================================================
|
||||||
|
BUTTONS
|
||||||
|
========================================================================== */
|
||||||
|
|
||||||
|
/*
|
||||||
|
Default button
|
||||||
|
========================================================================== */
|
||||||
|
|
||||||
|
.btn {
|
||||||
|
/* default button */
|
||||||
|
display: inline-block;
|
||||||
|
margin-bottom: 0.25em;
|
||||||
|
padding: 0.5em 1em;
|
||||||
|
color: #fff !important;
|
||||||
|
font-family: $sans-serif;
|
||||||
|
font-size: $type-size-6;
|
||||||
|
font-weight: bold;
|
||||||
|
text-align: center;
|
||||||
|
text-decoration: none;
|
||||||
|
background-color: $primary-color;
|
||||||
|
border: 0 !important;
|
||||||
|
border-radius: $border-radius;
|
||||||
|
cursor: pointer;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
background-color: mix(white, #000, 20%);
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon {
|
||||||
|
margin-right: 0.5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon + .hidden {
|
||||||
|
margin-left: -0.5em; /* override for hidden text*/
|
||||||
|
}
|
||||||
|
|
||||||
|
/* fills width of parent container */
|
||||||
|
|
||||||
|
&--block {
|
||||||
|
display: block;
|
||||||
|
width: 100%;
|
||||||
|
|
||||||
|
+ .btn--block {
|
||||||
|
margin-top: 0.25em;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* for dark backgrounds */
|
||||||
|
|
||||||
|
&--inverse {
|
||||||
|
color: $gray !important;
|
||||||
|
border: 1px solid $light-gray !important; /* override*/
|
||||||
|
background-color: #fff;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
color: #fff !important;
|
||||||
|
border-color: $gray;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* light outline */
|
||||||
|
|
||||||
|
&--light-outline {
|
||||||
|
border: 1px solid #fff !important; /* override*/
|
||||||
|
background-color: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* information */
|
||||||
|
|
||||||
|
&--info {
|
||||||
|
background-color: $info-color;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
background-color: mix(#000, $info-color, 20%);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* warning */
|
||||||
|
|
||||||
|
&--warning {
|
||||||
|
background-color: $warning-color;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
background-color: mix(#000, $warning-color, 20%);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* success */
|
||||||
|
|
||||||
|
&--success {
|
||||||
|
background-color: $success-color;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
background-color: mix(#000, $success-color, 20%);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* danger */
|
||||||
|
|
||||||
|
&--danger {
|
||||||
|
background-color: $danger-color;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
background-color: mix(#000, $danger-color, 20%);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* disabled */
|
||||||
|
|
||||||
|
&--disabled {
|
||||||
|
pointer-events: none;
|
||||||
|
cursor: not-allowed;
|
||||||
|
filter: alpha(opacity=65);
|
||||||
|
box-shadow: none;
|
||||||
|
opacity: 0.65;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* social buttons */
|
||||||
|
|
||||||
|
$social:
|
||||||
|
(facebook, $facebook-color),
|
||||||
|
(twitter, $twitter-color),
|
||||||
|
(google-plus, $google-plus-color),
|
||||||
|
(linkedin, $linkedin-color);
|
||||||
|
|
||||||
|
@each $socialnetwork, $color in $social {
|
||||||
|
&--#{$socialnetwork} {
|
||||||
|
background-color: $color;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
background-color: mix(#000, $color, 20%);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* extra large button */
|
||||||
|
|
||||||
|
&--x-large {
|
||||||
|
font-size: $type-size-4;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* large button */
|
||||||
|
|
||||||
|
&--large {
|
||||||
|
font-size: $type-size-5;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* small button */
|
||||||
|
|
||||||
|
&--small {
|
||||||
|
font-size: $type-size-7;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,80 @@
|
|||||||
|
/* ==========================================================================
|
||||||
|
FOOTER
|
||||||
|
========================================================================== */
|
||||||
|
|
||||||
|
.page__footer {
|
||||||
|
@include full();
|
||||||
|
@include clearfix;
|
||||||
|
/* sticky footer fix start */
|
||||||
|
position: absolute;
|
||||||
|
bottom: 0;
|
||||||
|
width: 100%;
|
||||||
|
clear: both;
|
||||||
|
height: auto;
|
||||||
|
/* sticky footer fix end */
|
||||||
|
margin-top: 3em;
|
||||||
|
color: mix(#fff, $gray, 25%);
|
||||||
|
-webkit-animation: intro 0.3s both;
|
||||||
|
animation: intro 0.3s both;
|
||||||
|
-webkit-animation-delay: 0.45s;
|
||||||
|
animation-delay: 0.45s;
|
||||||
|
background-color: $lighter-gray;
|
||||||
|
border-top: 1px solid $light-gray;
|
||||||
|
|
||||||
|
footer {
|
||||||
|
@include container;
|
||||||
|
@include clearfix;
|
||||||
|
margin-top: 2em;
|
||||||
|
padding: 0 1em 2em;
|
||||||
|
|
||||||
|
@include breakpoint($x-large) {
|
||||||
|
max-width: $x-large;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
a {
|
||||||
|
color: inherit;
|
||||||
|
text-decoration: none;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.fa {
|
||||||
|
color: mix(#fff, $gray, 25%);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.page__footer-copyright {
|
||||||
|
font-family: $global-font-family;
|
||||||
|
font-size: $type-size-7;
|
||||||
|
}
|
||||||
|
|
||||||
|
.page__footer-follow {
|
||||||
|
|
||||||
|
ul {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
list-style-type: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
li {
|
||||||
|
display: inline-block;
|
||||||
|
padding-top: 5px;
|
||||||
|
padding-bottom: 5px;
|
||||||
|
font-family: $sans-serif-narrow;
|
||||||
|
font-size: $type-size-6;
|
||||||
|
text-transform: uppercase;
|
||||||
|
}
|
||||||
|
|
||||||
|
li + li:before {
|
||||||
|
content: "";
|
||||||
|
padding-right: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
a {
|
||||||
|
padding-right: 10px;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,391 @@
|
|||||||
|
/* ==========================================================================
|
||||||
|
Forms
|
||||||
|
========================================================================== */
|
||||||
|
|
||||||
|
form {
|
||||||
|
margin: 0 0 5px 0;
|
||||||
|
|
||||||
|
fieldset {
|
||||||
|
margin-bottom: 5px;
|
||||||
|
padding: 0;
|
||||||
|
border-width: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
legend {
|
||||||
|
display: block;
|
||||||
|
width: 100%;
|
||||||
|
margin-bottom: 5px * 2;
|
||||||
|
*margin-left: -7px;
|
||||||
|
padding: 0;
|
||||||
|
color: $text-color;
|
||||||
|
border: 0;
|
||||||
|
border-bottom: 1px solid mix(#fff, #000, 80%);
|
||||||
|
white-space: normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
p {
|
||||||
|
margin-bottom: 5px / 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
ul {
|
||||||
|
list-style-type: none;
|
||||||
|
margin: 0 0 5px 0;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
br {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
label,
|
||||||
|
input,
|
||||||
|
button,
|
||||||
|
select,
|
||||||
|
textarea {
|
||||||
|
vertical-align: baseline;
|
||||||
|
*vertical-align: middle;
|
||||||
|
}
|
||||||
|
|
||||||
|
input,
|
||||||
|
button,
|
||||||
|
select,
|
||||||
|
textarea {
|
||||||
|
box-sizing: border-box;
|
||||||
|
font-family: $sans-serif;
|
||||||
|
}
|
||||||
|
|
||||||
|
label {
|
||||||
|
display: block;
|
||||||
|
margin-bottom: 0.25em;
|
||||||
|
color: $text-color;
|
||||||
|
cursor: pointer;
|
||||||
|
|
||||||
|
small {
|
||||||
|
font-size: $type-size-6;
|
||||||
|
}
|
||||||
|
|
||||||
|
input,
|
||||||
|
textarea,
|
||||||
|
select {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
input,
|
||||||
|
textarea,
|
||||||
|
select {
|
||||||
|
display: inline-block;
|
||||||
|
width: 100%;
|
||||||
|
padding: 0.25em;
|
||||||
|
margin-bottom: 0.5em;
|
||||||
|
color: $text-color;
|
||||||
|
background-color: #fff;
|
||||||
|
border: 1px solid mix(#fff, #000, 80%);
|
||||||
|
border-radius: $border-radius;
|
||||||
|
box-shadow: $box-shadow;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
border-color: mix(#fff, $primary-color, 50%);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.input-mini {
|
||||||
|
width: 60px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.input-small {
|
||||||
|
width: 90px;
|
||||||
|
}
|
||||||
|
|
||||||
|
input[type="image"],
|
||||||
|
input[type="checkbox"],
|
||||||
|
input[type="radio"] {
|
||||||
|
width: auto;
|
||||||
|
height: auto;
|
||||||
|
padding: 0;
|
||||||
|
margin: 3px 0;
|
||||||
|
*margin-top: 0;
|
||||||
|
line-height: normal;
|
||||||
|
cursor: pointer;
|
||||||
|
border-radius: 0;
|
||||||
|
border: 0 \9;
|
||||||
|
}
|
||||||
|
|
||||||
|
input[type="checkbox"],
|
||||||
|
input[type="radio"] {
|
||||||
|
box-sizing: border-box;
|
||||||
|
padding: 0;
|
||||||
|
*width: 13px;
|
||||||
|
*height: 13px;
|
||||||
|
}
|
||||||
|
|
||||||
|
input[type="image"] {
|
||||||
|
border: 0;
|
||||||
|
box-shadow: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
input[type="file"] {
|
||||||
|
width: auto;
|
||||||
|
padding: initial;
|
||||||
|
line-height: initial;
|
||||||
|
border: initial;
|
||||||
|
background-color: transparent;
|
||||||
|
background-color: initial;
|
||||||
|
box-shadow: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
input[type="button"],
|
||||||
|
input[type="reset"],
|
||||||
|
input[type="submit"] {
|
||||||
|
width: auto;
|
||||||
|
height: auto;
|
||||||
|
cursor: pointer;
|
||||||
|
*overflow: visible;
|
||||||
|
}
|
||||||
|
|
||||||
|
select,
|
||||||
|
input[type="file"] {
|
||||||
|
*margin-top: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
select {
|
||||||
|
width: auto;
|
||||||
|
background-color: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
select[multiple],
|
||||||
|
select[size] {
|
||||||
|
height: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
textarea {
|
||||||
|
resize: vertical;
|
||||||
|
height: auto;
|
||||||
|
overflow: auto;
|
||||||
|
vertical-align: top;
|
||||||
|
}
|
||||||
|
|
||||||
|
input[type="hidden"] {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.form {
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
.radio,
|
||||||
|
.checkbox {
|
||||||
|
padding-left: 18px;
|
||||||
|
font-weight: normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
.radio input[type="radio"],
|
||||||
|
.checkbox input[type="checkbox"] {
|
||||||
|
float: left;
|
||||||
|
margin-left: -18px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.radio.inline,
|
||||||
|
.checkbox.inline {
|
||||||
|
display: inline-block;
|
||||||
|
padding-top: 5px;
|
||||||
|
margin-bottom: 0;
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
|
||||||
|
.radio.inline + .radio.inline,
|
||||||
|
.checkbox.inline + .checkbox.inline {
|
||||||
|
margin-left: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
Disabled state
|
||||||
|
========================================================================== */
|
||||||
|
|
||||||
|
input[disabled],
|
||||||
|
select[disabled],
|
||||||
|
textarea[disabled],
|
||||||
|
input[readonly],
|
||||||
|
select[readonly],
|
||||||
|
textarea[readonly] {
|
||||||
|
opacity: 0.5;
|
||||||
|
cursor: not-allowed;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
Focus & active state
|
||||||
|
========================================================================== */
|
||||||
|
|
||||||
|
input:focus,
|
||||||
|
textarea:focus {
|
||||||
|
border-color: $primary-color;
|
||||||
|
outline: 0;
|
||||||
|
outline: thin dotted \9;
|
||||||
|
}
|
||||||
|
|
||||||
|
input[type="file"]:focus,
|
||||||
|
input[type="radio"]:focus,
|
||||||
|
input[type="checkbox"]:focus,
|
||||||
|
select:focus {
|
||||||
|
box-shadow: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
Help text
|
||||||
|
========================================================================== */
|
||||||
|
|
||||||
|
.help-block,
|
||||||
|
.help-inline {
|
||||||
|
color: $info-color;
|
||||||
|
}
|
||||||
|
|
||||||
|
.help-block {
|
||||||
|
display: block;
|
||||||
|
margin-bottom: 1em;
|
||||||
|
line-height: 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.help-inline {
|
||||||
|
display: inline-block;
|
||||||
|
vertical-align: middle;
|
||||||
|
padding-left: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
.form-inline
|
||||||
|
========================================================================== */
|
||||||
|
|
||||||
|
.form-inline input,
|
||||||
|
.form-inline textarea,
|
||||||
|
.form-inline select {
|
||||||
|
display: inline-block;
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.form-inline label {
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.form-inline .radio,
|
||||||
|
.form-inline .checkbox,
|
||||||
|
.form-inline .radio {
|
||||||
|
padding-left: 0;
|
||||||
|
margin-bottom: 0;
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
|
||||||
|
.form-inline .radio input[type="radio"],
|
||||||
|
.form-inline .checkbox input[type="checkbox"] {
|
||||||
|
float: left;
|
||||||
|
margin-left: 0;
|
||||||
|
margin-right: 3px; }
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
.form-search
|
||||||
|
========================================================================== */
|
||||||
|
|
||||||
|
.form-search input,
|
||||||
|
.form-search textarea,
|
||||||
|
.form-search select {
|
||||||
|
display: inline-block;
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.form-search .search-query {
|
||||||
|
padding-left: 14px;
|
||||||
|
padding-right: 14px;
|
||||||
|
margin-bottom: 0;
|
||||||
|
border-radius: 14px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.form-search label {
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.form-search .radio,
|
||||||
|
.form-search .checkbox,
|
||||||
|
.form-inline .radio {
|
||||||
|
padding-left: 0;
|
||||||
|
margin-bottom: 0;
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
|
||||||
|
.form-search .radio input[type="radio"],
|
||||||
|
.form-search .checkbox input[type="checkbox"] {
|
||||||
|
float: left;
|
||||||
|
margin-left: 0;
|
||||||
|
margin-right: 3px;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
.form--loading
|
||||||
|
========================================================================== */
|
||||||
|
|
||||||
|
.form--loading:before {
|
||||||
|
content: '';
|
||||||
|
}
|
||||||
|
|
||||||
|
.form--loading .form__spinner {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.form:before {
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
background-color: rgba(255, 255, 255, 0.7);
|
||||||
|
z-index: 10;
|
||||||
|
}
|
||||||
|
|
||||||
|
.form__spinner {
|
||||||
|
display: none;
|
||||||
|
position: absolute;
|
||||||
|
top: 50%;
|
||||||
|
left: 50%;
|
||||||
|
z-index: 11;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
Google search form
|
||||||
|
========================================================================== */
|
||||||
|
|
||||||
|
#goog-fixurl {
|
||||||
|
ul {
|
||||||
|
list-style: none;
|
||||||
|
margin-left: 0;
|
||||||
|
padding-left: 0;
|
||||||
|
li {
|
||||||
|
list-style-type: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#goog-wm-qt {
|
||||||
|
width: auto;
|
||||||
|
margin-right: 10px;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
padding: 8px 20px;
|
||||||
|
display: inline-block;
|
||||||
|
font-size: $type-size-6;
|
||||||
|
background-color: #fff;
|
||||||
|
color: #000;
|
||||||
|
border-width: 2px !important;
|
||||||
|
border-style: solid !important;
|
||||||
|
border-color: lighten(#000,50);
|
||||||
|
border-radius: $border-radius;
|
||||||
|
}
|
||||||
|
|
||||||
|
#goog-wm-sb {
|
||||||
|
@extend .btn;
|
||||||
|
}
|
||||||
@@ -0,0 +1,56 @@
|
|||||||
|
/* ==========================================================================
|
||||||
|
MASTHEAD
|
||||||
|
========================================================================== */
|
||||||
|
|
||||||
|
.masthead {
|
||||||
|
position: relative;
|
||||||
|
border-bottom: 1px solid $border-color;
|
||||||
|
-webkit-animation: intro 0.3s both;
|
||||||
|
animation: intro 0.3s both;
|
||||||
|
-webkit-animation-delay: 0.15s;
|
||||||
|
animation-delay: 0.15s;
|
||||||
|
z-index: 20;
|
||||||
|
|
||||||
|
&__inner-wrap {
|
||||||
|
@include container;
|
||||||
|
@include clearfix;
|
||||||
|
padding-top: 0.5em;
|
||||||
|
padding-bottom: 0.5em;
|
||||||
|
padding-left: 1em;
|
||||||
|
padding-right: 1em;
|
||||||
|
font-family: $sans-serif-narrow;
|
||||||
|
|
||||||
|
@include breakpoint($x-large) {
|
||||||
|
max-width: $x-large;
|
||||||
|
}
|
||||||
|
|
||||||
|
nav {
|
||||||
|
z-index: 10;
|
||||||
|
}
|
||||||
|
|
||||||
|
a {
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.masthead__menu {
|
||||||
|
|
||||||
|
ul {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
clear: both;
|
||||||
|
list-style-type: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.masthead__menu-item {
|
||||||
|
display: block;
|
||||||
|
list-style-type: none;
|
||||||
|
white-space: nowrap;
|
||||||
|
|
||||||
|
&--lg {
|
||||||
|
padding-right: 2em;
|
||||||
|
font-weight: 700;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,53 @@
|
|||||||
|
/* ==========================================================================
|
||||||
|
MIXINS
|
||||||
|
========================================================================== */
|
||||||
|
|
||||||
|
%tab-focus {
|
||||||
|
/* Default*/
|
||||||
|
outline: thin dotted $warning-color;
|
||||||
|
/* Webkit*/
|
||||||
|
outline: 5px auto $warning-color;
|
||||||
|
outline-offset: -2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
em function
|
||||||
|
========================================================================== */
|
||||||
|
|
||||||
|
@function em($target, $context: $doc-font-size) {
|
||||||
|
@return ($target / $context) * 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
Bourbon clearfix
|
||||||
|
========================================================================== */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Provides an easy way to include a clearfix for containing floats.
|
||||||
|
* link http://cssmojo.com/latest_new_clearfix_so_far/
|
||||||
|
*
|
||||||
|
* example scss - Usage
|
||||||
|
*
|
||||||
|
* .element {
|
||||||
|
* @include clearfix;
|
||||||
|
* }
|
||||||
|
*
|
||||||
|
* example css - CSS Output
|
||||||
|
*
|
||||||
|
* .element::after {
|
||||||
|
* clear: both;
|
||||||
|
* content: "";
|
||||||
|
* display: table;
|
||||||
|
* }
|
||||||
|
*/
|
||||||
|
|
||||||
|
@mixin clearfix {
|
||||||
|
clear: both;
|
||||||
|
|
||||||
|
&::after {
|
||||||
|
clear: both;
|
||||||
|
content: "";
|
||||||
|
display: table;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,442 @@
|
|||||||
|
/* ==========================================================================
|
||||||
|
NAVIGATION
|
||||||
|
========================================================================== */
|
||||||
|
|
||||||
|
/*
|
||||||
|
Breadcrumb navigation links
|
||||||
|
========================================================================== */
|
||||||
|
|
||||||
|
.breadcrumbs {
|
||||||
|
@include container;
|
||||||
|
@include clearfix;
|
||||||
|
margin-top: 0;
|
||||||
|
margin-bottom: 0;
|
||||||
|
padding-left: 2em;
|
||||||
|
padding-right: 2em;
|
||||||
|
font-family: $sans-serif;
|
||||||
|
-webkit-animation: intro 0.3s both;
|
||||||
|
animation: intro 0.3s both;
|
||||||
|
-webkit-animation-delay: 0.30s;
|
||||||
|
animation-delay: 0.30s;
|
||||||
|
|
||||||
|
@include breakpoint($large) {
|
||||||
|
padding-left: 1em;
|
||||||
|
padding-right: 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
@include breakpoint($x-large) {
|
||||||
|
max-width: $x-large;
|
||||||
|
}
|
||||||
|
|
||||||
|
ol {
|
||||||
|
padding: 0;
|
||||||
|
list-style: none;
|
||||||
|
font-size: $type-size-6;
|
||||||
|
|
||||||
|
@include breakpoint($large) {
|
||||||
|
@include span(10 of 12 last);
|
||||||
|
}
|
||||||
|
|
||||||
|
@include breakpoint($x-large) {
|
||||||
|
@include prefix(0.5 of 12);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
li {
|
||||||
|
display: inline;
|
||||||
|
}
|
||||||
|
|
||||||
|
.current {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
Post pagination navigation links
|
||||||
|
========================================================================== */
|
||||||
|
|
||||||
|
.pagination {
|
||||||
|
@include full();
|
||||||
|
@include clearfix();
|
||||||
|
margin-top: 1em;
|
||||||
|
padding-top: 1em;
|
||||||
|
|
||||||
|
ul {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
list-style-type: none;
|
||||||
|
font-family: $sans-serif;
|
||||||
|
}
|
||||||
|
|
||||||
|
li {
|
||||||
|
display: block;
|
||||||
|
float: left;
|
||||||
|
margin-left: -1px;
|
||||||
|
|
||||||
|
a {
|
||||||
|
margin-bottom: 0.25em;
|
||||||
|
padding: 0.5em 1em;
|
||||||
|
font-family: $sans-serif;
|
||||||
|
font-size: 14px;
|
||||||
|
font-weight: bold;
|
||||||
|
line-height: 1.5;
|
||||||
|
text-align: center;
|
||||||
|
text-decoration: none;
|
||||||
|
color: mix(#fff, $gray, 25%);
|
||||||
|
border: 1px solid $light-gray;
|
||||||
|
border-radius: 0;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
color: $link-color-hover;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.current {
|
||||||
|
color: #fff;
|
||||||
|
background: $primary-color;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.disabled {
|
||||||
|
color: mix(#fff, $gray, 75%);
|
||||||
|
pointer-events: none;
|
||||||
|
cursor: not-allowed;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&:first-child {
|
||||||
|
margin-left: 0;
|
||||||
|
|
||||||
|
a {
|
||||||
|
border-top-left-radius: $border-radius;
|
||||||
|
border-bottom-left-radius: $border-radius;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&:last-child {
|
||||||
|
a {
|
||||||
|
border-top-right-radius: $border-radius;
|
||||||
|
border-bottom-right-radius: $border-radius;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* next/previous buttons */
|
||||||
|
&--pager {
|
||||||
|
display: block;
|
||||||
|
padding: 1em 2em;
|
||||||
|
float: left;
|
||||||
|
width: 50%;
|
||||||
|
font-family: $sans-serif;
|
||||||
|
font-size: $type-size-5;
|
||||||
|
font-weight: bold;
|
||||||
|
text-align: center;
|
||||||
|
text-decoration: none;
|
||||||
|
color: mix(#fff, $gray, 50%);
|
||||||
|
border: 1px solid $light-gray;
|
||||||
|
border-radius: $border-radius;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
color: $link-color-hover;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:first-child {
|
||||||
|
border-top-right-radius: 0;
|
||||||
|
border-bottom-right-radius: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:last-child {
|
||||||
|
margin-left: -1px;
|
||||||
|
border-top-left-radius: 0;
|
||||||
|
border-bottom-left-radius: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.disabled {
|
||||||
|
color: mix(#fff, $gray, 75%);
|
||||||
|
pointer-events: none;
|
||||||
|
cursor: not-allowed;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.page__content + .pagination,
|
||||||
|
.page__meta + .pagination,
|
||||||
|
.page__share + .pagination,
|
||||||
|
.page__comments + .pagination {
|
||||||
|
margin-top: 2em;
|
||||||
|
padding-top: 2em;
|
||||||
|
border-top: 1px solid $border-color;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
Priority plus navigation
|
||||||
|
========================================================================== */
|
||||||
|
|
||||||
|
.greedy-nav {
|
||||||
|
position: relative;
|
||||||
|
min-width: 250px;
|
||||||
|
background: $background-color;
|
||||||
|
|
||||||
|
a {
|
||||||
|
display: block;
|
||||||
|
margin: 0 1rem;
|
||||||
|
padding: 0.5rem 0;
|
||||||
|
color: $masthead-link-color;
|
||||||
|
text-decoration: none;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
color: $masthead-link-color-hover;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
button {
|
||||||
|
position: absolute;
|
||||||
|
height: 100%;
|
||||||
|
right: 0;
|
||||||
|
padding: 0 0.5rem;
|
||||||
|
border: 0;
|
||||||
|
outline: none;
|
||||||
|
background-color: $primary-color;
|
||||||
|
color: #fff;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
.visible-links {
|
||||||
|
display: table;
|
||||||
|
|
||||||
|
li {
|
||||||
|
display: table-cell;
|
||||||
|
vertical-align: middle;
|
||||||
|
|
||||||
|
&:first-child {
|
||||||
|
font-weight: bold;
|
||||||
|
|
||||||
|
a {
|
||||||
|
margin-left: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&:last-child {
|
||||||
|
a {
|
||||||
|
margin-right: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
a {
|
||||||
|
position: relative;
|
||||||
|
|
||||||
|
&:before {
|
||||||
|
content: "";
|
||||||
|
position: absolute;
|
||||||
|
left: 0;
|
||||||
|
bottom: 0;
|
||||||
|
height: 4px;
|
||||||
|
background: mix(#fff, $primary-color, 50%);
|
||||||
|
width: 100%;
|
||||||
|
-webkit-transition: $global-transition;
|
||||||
|
transition: $global-transition;
|
||||||
|
-webkit-transform: scaleX(0);
|
||||||
|
-ms-transform: scaleX(0);
|
||||||
|
transform: scaleX(0); /* hide*/
|
||||||
|
}
|
||||||
|
|
||||||
|
&:hover:before {
|
||||||
|
-webkit-transform: scaleX(1);
|
||||||
|
-ms-transform: scaleX(1);
|
||||||
|
transform: scaleX(1); /* reveal*/
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.hidden-links {
|
||||||
|
position: absolute;
|
||||||
|
top: 100%;
|
||||||
|
right: 0;
|
||||||
|
margin-top: 15px;
|
||||||
|
padding: 5px;
|
||||||
|
border: 1px solid $border-color;
|
||||||
|
border-radius: $border-radius;
|
||||||
|
background: #fff;
|
||||||
|
box-shadow: 0 0 10px rgba(#000, 0.25);
|
||||||
|
|
||||||
|
a {
|
||||||
|
margin: 0;
|
||||||
|
padding: 10px 20px;
|
||||||
|
font-size: $type-size-5;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
color: $masthead-link-color-hover;
|
||||||
|
background: mix(#fff, $primary-color, 75%);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&:before {
|
||||||
|
content: "";
|
||||||
|
position: absolute;
|
||||||
|
top: -11px;
|
||||||
|
right: 10px;
|
||||||
|
width: 0;
|
||||||
|
border-style: solid;
|
||||||
|
border-width: 0 10px 10px;
|
||||||
|
border-color: $border-color transparent;
|
||||||
|
display: block;
|
||||||
|
z-index: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:after {
|
||||||
|
content: "";
|
||||||
|
position: absolute;
|
||||||
|
top: -10px;
|
||||||
|
right: 10px;
|
||||||
|
width: 0;
|
||||||
|
border-style: solid;
|
||||||
|
border-width: 0 10px 10px;
|
||||||
|
border-color: #fff transparent;
|
||||||
|
display: block;
|
||||||
|
z-index: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
li {
|
||||||
|
display: block;
|
||||||
|
border-bottom: 1px solid $border-color;
|
||||||
|
|
||||||
|
&:last-child {
|
||||||
|
border-bottom: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
Navigation list
|
||||||
|
========================================================================== */
|
||||||
|
|
||||||
|
.nav__list {
|
||||||
|
font-size: 1.25rem;
|
||||||
|
|
||||||
|
ul {
|
||||||
|
margin-bottom: 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
a {
|
||||||
|
display: block;
|
||||||
|
padding: 0.125em 0;
|
||||||
|
color: inherit;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.active {
|
||||||
|
margin-left: -0.5em;
|
||||||
|
padding-left: 0.5em;
|
||||||
|
padding-right: 0.5em;
|
||||||
|
color: #fff;
|
||||||
|
font-weight: bold;
|
||||||
|
background: $primary-color;
|
||||||
|
border-radius: $border-radius;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav__noclick {
|
||||||
|
pointer-events: none;
|
||||||
|
color: #ccc;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav__title {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0.5rem 1rem;
|
||||||
|
font-family: $sans-serif-narrow;
|
||||||
|
font-size: $type-size-5;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav__sub-title {
|
||||||
|
display: block;
|
||||||
|
margin: 0.5rem 0;
|
||||||
|
padding: 0.5rem 0;
|
||||||
|
font-family: $sans-serif-narrow;
|
||||||
|
font-size: $type-size-6;
|
||||||
|
font-weight: bold;
|
||||||
|
text-transform: uppercase;
|
||||||
|
border-bottom: 1px solid $border-color;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
Table of contents navigation
|
||||||
|
========================================================================== */
|
||||||
|
|
||||||
|
.toc {
|
||||||
|
font-family: $sans-serif-narrow;
|
||||||
|
color: $gray;
|
||||||
|
text-transform: uppercase;
|
||||||
|
letter-spacing: 1px;
|
||||||
|
background-color: #fff;
|
||||||
|
border: 1px solid $border-color;
|
||||||
|
border-radius: $border-radius;
|
||||||
|
box-shadow: $box-shadow;
|
||||||
|
|
||||||
|
.nav__title {
|
||||||
|
color: #fff;
|
||||||
|
font-size: $type-size-6;
|
||||||
|
background: $primary-color;
|
||||||
|
border-top-left-radius: $border-radius;
|
||||||
|
border-top-right-radius: $border-radius;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.toc__menu {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
width: 100%;
|
||||||
|
list-style: none;
|
||||||
|
font-size: 0.8rem;
|
||||||
|
|
||||||
|
a {
|
||||||
|
display: block;
|
||||||
|
padding: 0.5rem 1rem;
|
||||||
|
color: $gray;
|
||||||
|
font-size: $type-size-7;
|
||||||
|
font-weight: bold;
|
||||||
|
line-height: 1.5;
|
||||||
|
border-bottom: 1px solid $border-color;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
color: #000;
|
||||||
|
background: $lighter-gray;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
> li:last-child {
|
||||||
|
a {
|
||||||
|
border-bottom: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
li ul > li a {
|
||||||
|
padding-left: 2rem;
|
||||||
|
font-weight: normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* hide sub sub links on small screens*/
|
||||||
|
li > ul li {
|
||||||
|
display: none;
|
||||||
|
|
||||||
|
@include breakpoint($medium) {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,99 @@
|
|||||||
|
/* ==========================================================================
|
||||||
|
NOTICE TEXT BLOCKS
|
||||||
|
========================================================================== */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Default Kramdown usage (no indents!):
|
||||||
|
* <div class="notice" markdown="1">
|
||||||
|
* #### Headline for the Notice
|
||||||
|
* Text for the notice
|
||||||
|
* </div>
|
||||||
|
*/
|
||||||
|
|
||||||
|
@mixin notice($notice-color) {
|
||||||
|
margin: 2em 0 !important; /* override*/
|
||||||
|
padding: 1em;
|
||||||
|
font-family: $global-font-family;
|
||||||
|
font-size: $type-size-6 !important;
|
||||||
|
text-indent: initial; /* override*/
|
||||||
|
background-color: mix(#fff, $notice-color, 90%);
|
||||||
|
border-radius: $border-radius;
|
||||||
|
box-shadow: 0 1px 1px rgba($notice-color, 0.25);
|
||||||
|
|
||||||
|
h4 {
|
||||||
|
margin-top: 0 !important; /* override*/
|
||||||
|
margin-bottom: 0.75em;
|
||||||
|
}
|
||||||
|
|
||||||
|
@at-root .page__content #{&} h4 {
|
||||||
|
/* using at-root to override .page-content h4 font size*/
|
||||||
|
margin-bottom: 0;
|
||||||
|
font-size: 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
p {
|
||||||
|
&:last-child {
|
||||||
|
margin-bottom: 0 !important; /* override*/
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
h4 + p {
|
||||||
|
/* remove space above paragraphs that appear directly after notice headline*/
|
||||||
|
margin-top: 0;
|
||||||
|
padding-top: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
a {
|
||||||
|
color: $notice-color;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
color: mix(#000, $notice-color, 40%);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
code {
|
||||||
|
background-color: mix(#fff, $notice-color, 95%)
|
||||||
|
}
|
||||||
|
|
||||||
|
ul {
|
||||||
|
&:last-child {
|
||||||
|
margin-bottom: 0; /* override*/
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Default notice */
|
||||||
|
|
||||||
|
.notice {
|
||||||
|
@include notice($light-gray);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Primary notice */
|
||||||
|
|
||||||
|
.notice--primary {
|
||||||
|
@include notice($primary-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Info notice */
|
||||||
|
|
||||||
|
.notice--info {
|
||||||
|
@include notice($info-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Warning notice */
|
||||||
|
|
||||||
|
.notice--warning {
|
||||||
|
@include notice($warning-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Success notice */
|
||||||
|
|
||||||
|
.notice--success {
|
||||||
|
@include notice($success-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Danger notice */
|
||||||
|
|
||||||
|
.notice--danger {
|
||||||
|
@include notice($danger-color);
|
||||||
|
}
|
||||||
@@ -0,0 +1,401 @@
|
|||||||
|
/* ==========================================================================
|
||||||
|
SINGLE PAGE/POST
|
||||||
|
========================================================================== */
|
||||||
|
|
||||||
|
#main {
|
||||||
|
@include container;
|
||||||
|
@include clearfix;
|
||||||
|
margin-top: 2em;
|
||||||
|
padding-left: 1em;
|
||||||
|
padding-right: 1em;
|
||||||
|
animation: intro 0.3s both;
|
||||||
|
animation-delay: 0.35s;
|
||||||
|
|
||||||
|
@include breakpoint($x-large) {
|
||||||
|
max-width: $x-large;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.page {
|
||||||
|
@include breakpoint($large) {
|
||||||
|
@include span(10 of 12 last);
|
||||||
|
@include prefix(0.5 of 12);
|
||||||
|
@include suffix(2 of 12);
|
||||||
|
}
|
||||||
|
|
||||||
|
.page__inner-wrap {
|
||||||
|
@include full();
|
||||||
|
|
||||||
|
.page__content,
|
||||||
|
.page__meta,
|
||||||
|
.page__share {
|
||||||
|
@include full();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.page__title {
|
||||||
|
margin-top: 0;
|
||||||
|
line-height: 1;
|
||||||
|
|
||||||
|
& + .page__meta {
|
||||||
|
margin-top: -0.5em;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.page__lead {
|
||||||
|
font-family: $global-font-family;
|
||||||
|
font-size: $type-size-4;
|
||||||
|
}
|
||||||
|
|
||||||
|
.page__content {
|
||||||
|
|
||||||
|
h2 {
|
||||||
|
padding-bottom: 0.5em;
|
||||||
|
border-bottom: 1px solid $border-color;
|
||||||
|
}
|
||||||
|
|
||||||
|
p, li, dl {
|
||||||
|
font-size: 0.8em;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* paragraph indents */
|
||||||
|
p {
|
||||||
|
margin: 0 0 $indent-var;
|
||||||
|
|
||||||
|
/* sibling indentation*/
|
||||||
|
@if $paragraph-indent == true {
|
||||||
|
& + p {
|
||||||
|
text-indent: $indent-var;
|
||||||
|
margin-top: -($indent-var);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
a {
|
||||||
|
text-decoration: none;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
text-decoration: underline;
|
||||||
|
|
||||||
|
img {
|
||||||
|
box-shadow: 0 0 10px rgba(#000, 0.25);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
dt {
|
||||||
|
margin-top: 1em;
|
||||||
|
font-family: $sans-serif;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
dd {
|
||||||
|
margin-left: 1em;
|
||||||
|
font-family: $sans-serif;
|
||||||
|
font-size: $type-size-6;
|
||||||
|
}
|
||||||
|
|
||||||
|
.small {
|
||||||
|
font-size: $type-size-6;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* blockquote citations */
|
||||||
|
blockquote + .small {
|
||||||
|
margin-top: -1.5em;
|
||||||
|
padding-left: 1.25rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.page__hero {
|
||||||
|
position: relative;
|
||||||
|
margin-bottom: 2em;
|
||||||
|
@include clearfix;
|
||||||
|
animation: intro 0.3s both;
|
||||||
|
animation-delay: 0.25s;
|
||||||
|
|
||||||
|
&--overlay {
|
||||||
|
position: relative;
|
||||||
|
margin-bottom: 2em;
|
||||||
|
padding: 2em 0;
|
||||||
|
@include clearfix;
|
||||||
|
background-size: cover;
|
||||||
|
background-repeat: no-repeat;
|
||||||
|
background-position: center;
|
||||||
|
animation: intro 0.3s both;
|
||||||
|
animation-delay: 0.25s;
|
||||||
|
|
||||||
|
a {
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.wrapper {
|
||||||
|
padding-left: 1em;
|
||||||
|
padding-right: 1em;
|
||||||
|
|
||||||
|
@include breakpoint($x-large) {
|
||||||
|
max-width: $x-large;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.page__title,
|
||||||
|
.page__meta,
|
||||||
|
.page__lead,
|
||||||
|
.btn {
|
||||||
|
color: #fff;
|
||||||
|
text-shadow: 1px 1px 4px rgba(#000, 0.5);
|
||||||
|
}
|
||||||
|
|
||||||
|
.page__lead {
|
||||||
|
max-width: $medium;
|
||||||
|
}
|
||||||
|
|
||||||
|
.page__title {
|
||||||
|
font-size: $type-size-2;
|
||||||
|
|
||||||
|
@include breakpoint($small) {
|
||||||
|
font-size: $type-size-1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.page__hero-image {
|
||||||
|
width: 100%;
|
||||||
|
height: auto;
|
||||||
|
-ms-interpolation-mode: bicubic;
|
||||||
|
}
|
||||||
|
|
||||||
|
.page__hero-caption {
|
||||||
|
position: absolute;
|
||||||
|
bottom: 0;
|
||||||
|
right: 0;
|
||||||
|
margin: 0 auto;
|
||||||
|
padding: 2px 5px;
|
||||||
|
color: #fff;
|
||||||
|
font-family: $caption-font-family;
|
||||||
|
font-size: $type-size-7;
|
||||||
|
background: #000;
|
||||||
|
text-align: right;
|
||||||
|
z-index: 5;
|
||||||
|
opacity: 0.5;
|
||||||
|
border-radius: $border-radius 0 $border-radius 0;
|
||||||
|
|
||||||
|
@include breakpoint($large) {
|
||||||
|
padding: 5px 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
a {
|
||||||
|
color: #fff;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Social sharing
|
||||||
|
========================================================================== */
|
||||||
|
|
||||||
|
.page__share {
|
||||||
|
margin-top: 2em;
|
||||||
|
padding-top: 1em;
|
||||||
|
border-top: 1px solid $border-color;
|
||||||
|
|
||||||
|
@include breakpoint(max-width $small) {
|
||||||
|
.btn span {
|
||||||
|
border: 0;
|
||||||
|
clip: rect(0 0 0 0);
|
||||||
|
height: 1px;
|
||||||
|
margin: -1px;
|
||||||
|
overflow: hidden;
|
||||||
|
padding: 0;
|
||||||
|
position: absolute;
|
||||||
|
width: 1px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.page__share-title {
|
||||||
|
margin-bottom: 10px;
|
||||||
|
font-size: $type-size-6;
|
||||||
|
text-transform: uppercase;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
Page meta
|
||||||
|
========================================================================== */
|
||||||
|
|
||||||
|
.page__meta {
|
||||||
|
margin-top: 2em;
|
||||||
|
color: mix(#fff, $gray, 25%);
|
||||||
|
font-family: $sans-serif;
|
||||||
|
font-size: $type-size-6;
|
||||||
|
|
||||||
|
p {
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
a {
|
||||||
|
color: inherit;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.page__meta-title {
|
||||||
|
margin-bottom: 10px;
|
||||||
|
font-size: $type-size-6;
|
||||||
|
text-transform: uppercase;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
Page taxonomy
|
||||||
|
========================================================================== */
|
||||||
|
|
||||||
|
.page__taxonomy {
|
||||||
|
.sep {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
strong {
|
||||||
|
margin-right: 10px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.page__taxonomy-item {
|
||||||
|
display: inline-block;
|
||||||
|
margin-right: 5px;
|
||||||
|
margin-bottom: 8px;
|
||||||
|
padding: 5px 10px;
|
||||||
|
text-decoration: none;
|
||||||
|
border: 1px solid $light-gray;
|
||||||
|
border-radius: $border-radius;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
text-decoration: none;
|
||||||
|
color: $link-color-hover;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
Comments
|
||||||
|
========================================================================== */
|
||||||
|
|
||||||
|
.page__comments {
|
||||||
|
@include full();
|
||||||
|
}
|
||||||
|
|
||||||
|
.page__comments-title {
|
||||||
|
margin-top: 2rem;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
padding-top: 2rem;
|
||||||
|
font-size: $type-size-6;
|
||||||
|
border-top: 1px solid $border-color;
|
||||||
|
text-transform: uppercase;
|
||||||
|
}
|
||||||
|
|
||||||
|
.page__comments-form {
|
||||||
|
padding: 1em;
|
||||||
|
background: $lighter-gray;
|
||||||
|
transition: $global-transition;
|
||||||
|
|
||||||
|
&.disabled {
|
||||||
|
input,
|
||||||
|
button,
|
||||||
|
textarea,
|
||||||
|
label {
|
||||||
|
pointer-events: none;
|
||||||
|
cursor: not-allowed;
|
||||||
|
filter: alpha(opacity=65);
|
||||||
|
box-shadow: none;
|
||||||
|
opacity: 0.65;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.comment {
|
||||||
|
@include clearfix();
|
||||||
|
margin: 1em 0;
|
||||||
|
|
||||||
|
&:not(:last-child) {
|
||||||
|
border-bottom: 1px solid $border-color;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.comment__avatar-wrapper {
|
||||||
|
float: left;
|
||||||
|
width: 60px;
|
||||||
|
height: 60px;
|
||||||
|
|
||||||
|
@include breakpoint($large) {
|
||||||
|
width: 100px;
|
||||||
|
height: 100px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.comment__avatar {
|
||||||
|
width: 40px;
|
||||||
|
height: 40px;
|
||||||
|
border-radius: 50%;
|
||||||
|
|
||||||
|
@include breakpoint($large) {
|
||||||
|
width: 80px;
|
||||||
|
height: 80px;
|
||||||
|
padding: 5px;
|
||||||
|
border: 1px solid $border-color;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.comment__content-wrapper {
|
||||||
|
float: right;
|
||||||
|
width: calc(100% - 60px);
|
||||||
|
|
||||||
|
@include breakpoint($large) {
|
||||||
|
width: calc(100% - 100px);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.comment__author {
|
||||||
|
margin: 0;
|
||||||
|
|
||||||
|
a {
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.comment__date {
|
||||||
|
@extend .page__meta;
|
||||||
|
margin: 0;
|
||||||
|
|
||||||
|
a {
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
Related
|
||||||
|
========================================================================== */
|
||||||
|
|
||||||
|
.page__related {
|
||||||
|
margin-top: 2em;
|
||||||
|
padding-top: 1em;
|
||||||
|
border-top: 1px solid $border-color;
|
||||||
|
@include clearfix();
|
||||||
|
float: left;
|
||||||
|
|
||||||
|
@include breakpoint($large) {
|
||||||
|
@include pre(2.5 of 12);
|
||||||
|
}
|
||||||
|
|
||||||
|
a {
|
||||||
|
color: inherit;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.page__related-title {
|
||||||
|
margin-bottom: 10px;
|
||||||
|
font-size: $type-size-6;
|
||||||
|
text-transform: uppercase;
|
||||||
|
}
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
/* ==========================================================================
|
||||||
|
PRINT STYLES
|
||||||
|
========================================================================== */
|
||||||
|
|
||||||
|
/*
|
||||||
|
Hide the following elements on print
|
||||||
|
========================================================================== */
|
||||||
|
|
||||||
|
@media print {
|
||||||
|
.masthead,
|
||||||
|
.toc,
|
||||||
|
.page__share,
|
||||||
|
.page__related,
|
||||||
|
.ads,
|
||||||
|
.page__footer {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user