diff --git a/.clang-format b/.clang-format new file mode 100644 index 00000000..10b38401 --- /dev/null +++ b/.clang-format @@ -0,0 +1,45 @@ +BasedOnStyle: LLVM + +AccessModifierOffset: 0 +AlignAfterOpenBracket: Align +AlignConsecutiveAssignments: true +AlignConsecutiveDeclarations: false +AlignEscapedNewlinesLeft: false +AlignOperands: false +AlignTrailingComments: true +AllowAllParametersOfDeclarationOnNextLine: false +AllowShortBlocksOnASingleLine: true +AllowShortCaseLabelsOnASingleLine: true +AllowShortFunctionsOnASingleLine: All +AllowShortIfStatementsOnASingleLine: true +AllowShortLoopsOnASingleLine: true +AlwaysBreakBeforeMultilineStrings: true +AlwaysBreakTemplateDeclarations: false +BinPackArguments: true +BinPackParameters: true +BreakBeforeBinaryOperators: NonAssignment +BreakBeforeBraces: Attach +BreakBeforeTernaryOperators: false +BreakConstructorInitializersBeforeComma: false +BreakStringLiterals: false +ColumnLimit: 150 +ConstructorInitializerAllOnOneLineOrOnePerLine: true +ConstructorInitializerIndentWidth: 3 +ContinuationIndentWidth: 3 +Cpp11BracedListStyle: true +DerivePointerBinding : false +IndentCaseLabels: true +IndentWidth: 2 +Language: Cpp +MaxEmptyLinesToKeep: 1 +NamespaceIndentation : All +PointerAlignment: Right +ReflowComments: false +SortIncludes: false +SpaceAfterControlStatementKeyword: true +SpaceBeforeAssignmentOperators: true +SpaceInEmptyParentheses: false +SpacesInParentheses: false +Standard: Cpp11 +TabWidth: 2 +UseTab: Never diff --git a/.clang-tidy b/.clang-tidy new file mode 100644 index 00000000..8103eae9 --- /dev/null +++ b/.clang-tidy @@ -0,0 +1 @@ +Checks: '-*,modernize-*,cppcoreguidelines-*' diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 00000000..7ebf8f58 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,51 @@ + +language: cpp +sudo: required +dist: trusty + +compiler: + - gcc + # - clang + +before_install: + - sudo add-apt-repository 'deb http://apt.llvm.org/trusty/ llvm-toolchain-trusty-5.0 main' -y + - wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key|sudo apt-key add - + - sudo add-apt-repository ppa:ubuntu-toolchain-r/test -y + - sudo apt-get update + - sudo apt-get install -y --allow-unauthenticated g++-7 clang-5.0 + - export LIBRARY_PATH=/usr/lib/llvm-5.0/lib:$LIBRARY_PATH + - sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 60 --slave /usr/bin/g++ g++ /usr/bin/g++-7 + - sudo update-alternatives --install /usr/bin/clang clang /usr/bin/clang-5.0 60 --slave /usr/bin/clang++ clang++ /usr/bin/clang++-5.0 + - sudo apt-get install -y --allow-unauthenticated libboost-all-dev cmake git libgfortran3 gfortran openmpi-bin openmpi-common openmpi-doc libopenmpi-dev libblas-dev liblapack-dev libfftw3-dev libgmp-dev hdf5-tools libhdf5-serial-dev python-h5py python-dev python-numpy python-scipy python-jinja2 python-virtualenv python-matplotlib python-tornado python-zmq python-mpi4py python-mako clang-format-5.0 libclang-5.0-dev python-clang-5.0 python-sphinx libjs-mathjax valgrind libnfft3-dev + +install: true + +script: + # ===== Set up Cpp2Py + - git clone https://github.com/triqs/cpp2py + - mkdir cpp2py/build && cd cpp2py/build + - git checkout master + - cmake .. -DCMAKE_CXX_COMPILER=/usr/bin/${CXX} -DPYTHON_INTERPRETER=/usr/bin/python -DCMAKE_INSTALL_PREFIX=$TRAVIS_BUILD_DIR/root_install + - make -j8 install + - cd $TRAVIS_BUILD_DIR + - source root_install/share/cpp2pyvars.sh + # ===== Set up TRIQS + - git clone https://github.com/TRIQS/triqs --branch unstable + - mkdir triqs/build && cd triqs/build + - git checkout unstable + - cmake .. -DCMAKE_CXX_COMPILER=/usr/bin/${CXX} -DBuild_Tests=OFF -DCMAKE_INSTALL_PREFIX=$TRAVIS_BUILD_DIR/root_install -DCMAKE_BUILD_TYPE=Debug + - make -j8 install + - cd $TRAVIS_BUILD_DIR + - source root_install/share/triqsvars.sh + # ===== Set up CTINT and Test using fsanitize=address + - mkdir build && cd build + - cmake .. -DCMAKE_BUILD_TYPE=Debug -DCMAKE_CXX_COMPILER=/usr/bin/${CXX} -DGTAU_IS_COMPLEX=ON -DINTERACTION_IS_COMPLEX=ON -DCMAKE_CXX_FLAGS='-fsanitize=address -fno-omit-frame-pointer -fuse-ld=gold -Wno-register -Wno-macro-redefined' + - make -j8 + - export ASAN_SYMBOLIZER_PATH=/usr/lib/llvm-5.0/bin/llvm-symbolizer + - export ASAN_OPTIONS=symbolize=1:detect_leaks=0 + - export CTEST_OUTPUT_ON_FAILURE=1 + - cd test/c++ && ctest + - if [ "$CXX" = g++ ]; then export LD_PRELOAD=/usr/lib/gcc/x86_64-linux-gnu/7/libasan.so; elif [ "$CXX" = clang++ ]; then export LD_PRELOAD=/usr/lib/llvm-5.0/lib/clang/5.0.1/lib/linux/libclang_rt.asan-x86_64.so; fi + - cd ../python && ctest + - cd ../../ + - unset LD_PRELOAD diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 00000000..78e5d33d --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,60 @@ +# Version number +set (APP4TRIQS_VERSION "1.5") + +# Start configuration +cmake_minimum_required(VERSION 2.8) +project(app4triqs CXX) + +# Default to Release build type +if(NOT CMAKE_BUILD_TYPE) + set(CMAKE_BUILD_TYPE Release CACHE STRING "Type of build" FORCE) +endif() +message( STATUS "-------- BUILD-TYPE: ${CMAKE_BUILD_TYPE} -------------") + +# Use shared libraries +set(BUILD_SHARED_LIBS ON) + +# Load TRIQS and Cpp2Py +find_package(TRIQS 1.5 EXACT REQUIRED) +find_package(Cpp2Py 1.5 EXACT REQUIRED) + +# We will need the FindNNFT of triqs, so we adjust CMake Module Path to find it +list(APPEND CMAKE_MODULE_PATH ${TRIQS_ROOT}/share/cmake) + +# Default Install directory to TRIQS_ROOT if not given. Checks an absolute name is given. +if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT OR (NOT IS_ABSOLUTE ${CMAKE_INSTALL_PREFIX})) + message(STATUS " No install prefix given (or invalid). Defaulting to TRIQS_ROOT") + set(CMAKE_INSTALL_PREFIX ${TRIQS_ROOT} CACHE PATH "default install path" FORCE) +endif() +message(STATUS "-------- CMAKE_INSTALL_PREFIX: ${CMAKE_INSTALL_PREFIX} -------------") + +# Macro defined in TRIQS which picks the hash of repo. +triqs_get_git_hash_of_source_dir(APP4TRIQS_GIT_HASH) +message(STATUS "Git hash: ${APP4TRIQS_GIT_HASH}") + +# Common to all targets (c++, python, tests). +include_directories(c++) + +# Set up the rpath for compiled executable +triqs_set_rpath_for_all_targets() + +add_subdirectory(c++/app4triqs) +if(${TRIQS_WITH_PYTHON_SUPPORT}) + add_subdirectory(python/app4triqs) +endif() + +# Tests +enable_testing() +add_subdirectory(test) + +# Additional configuration files +add_subdirectory(share) + +option(Build_Documentation "Build documentation" OFF) +if(${Build_Documentation}) + if(NOT ${TRIQS_WITH_DOCUMENTATION}) + message("Error: TRIQS library has not been compiled with its documentation") + else() + add_subdirectory(doc) + endif() +endif() diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 00000000..909e37a6 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,10 @@ +# See ../triqs/packaging for other options +FROM flatironinstitute/triqs:master-ubuntu-clang + +COPY . ${SRC}/app4triqs +WORKDIR ${BUILD}/app4triqs +RUN chown build . +USER build +RUN cmake ${SRC}/app4triqs -DTRIQS_ROOT=${INSTALL} && make -j2 && make test +USER root +RUN make install diff --git a/Jenkinsfile b/Jenkinsfile new file mode 100644 index 00000000..4416c6c9 --- /dev/null +++ b/Jenkinsfile @@ -0,0 +1,113 @@ +def app4triqsBranch = env.CHANGE_TARGET ?: env.BRANCH_NAME +def app4triqsProject = '/TRIQS/app4triqs/' + app4triqsBranch.replaceAll('/', '%2F') + +properties([ + disableConcurrentBuilds(), + buildDiscarder(logRotator(numToKeepStr: '10', daysToKeepStr: '30')), + pipelineTriggers([ + upstream( + threshold: 'SUCCESS', + upstreamProjects: app4triqsProject + ) + ]) +]) + +def platforms = [:] + +def dockerPlatforms = ["ubuntu-clang", "ubuntu-gcc", "centos-gcc"] +for (int i = 0; i < dockerPlatforms.size(); i++) { + def platform = dockerPlatforms[i] + platforms[platform] = { -> stage(platform) { + timeout(time: 1, unit: 'HOURS') { + node('docker') { + checkout scm + /* construct a Dockerfile for this base */ + sh """ + ( echo "FROM flatironinstitute/app4triqs:${app4triqsBranch}-${env.STAGE_NAME}" ; sed '0,/^FROM /d' Dockerfile ) > Dockerfile.jenkins + mv -f Dockerfile.jenkins Dockerfile + """ + /* build and tag */ + def img = docker.build("flatironinstitute/app4triqs:${env.BRANCH_NAME}-${env.STAGE_NAME}") + /* but we don't need the tag so clean it up (alternatively, could refacter to run in container) */ + sh "docker rmi ${img.imageName()}" + } + } + } } +} + +def osxPlatforms = [ + ["gcc", ['CC=gcc-7', 'CXX=g++-7']], + ["clang", ['CC=/usr/local/opt/llvm/bin/clang', 'CXX=/usr/local/opt/llvm/bin/clang++', 'CXXFLAGS=-I/usr/local/opt/llvm/include', 'LDFLAGS=-L/usr/local/opt/llvm/lib']] +] +for (int i = 0; i < osxPlatforms.size(); i++) { + def platformEnv = osxPlatforms[i] + def platform = platformEnv[0] + platforms["osx-$platform"] = { -> stage("osx-$platform") { + timeout(time: 1, unit: 'HOURS') { + node('osx && triqs') { + def srcDir = pwd() + def tmpDir = pwd(tmp:true) + def buildDir = "$tmpDir/build" + def installDir = "$tmpDir/install" + + dir(installDir) { + deleteDir() + } + + copyArtifacts(projectName: app4triqsProject, selector: upstream(fallbackToLastSuccessful: true), filter: "osx-${platform}.zip") + unzip(zipFile: "osx-${platform}.zip", dir: installDir) + /* fixup zip-stripped permissions (JENKINS-13128) */ + sh "chmod +x $installDir/bin/*" + + checkout scm + + dir(buildDir) { withEnv(platformEnv[1]+[ + "PATH=$installDir/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin", + "CPATH=$installDir/include", + "LIBRARY_PATH=$installDir/lib", + "CMAKE_PREFIX_PATH=$installDir/share/cmake"]) { + deleteDir() + sh "cmake $srcDir -DTRIQS_ROOT=$installDir" + sh "make -j2" + try { + sh "make test" + } catch (exc) { + archiveArtifacts(artifacts: 'Testing/Temporary/LastTest.log') + throw exc + } + sh "make install" + } } + // zip(zipFile: "osx-${platform}.zip", archive: true, dir: installDir) + } + } + } } +} + +try { + parallel platforms +} catch (err) { + emailext( + subject: "\$PROJECT_NAME - Build # \$BUILD_NUMBER - FAILED", + body: """\$PROJECT_NAME - Build # \$BUILD_NUMBER - FAILED + +$err + +Check console output at \$BUILD_URL to view full results. + +Building \$BRANCH_NAME for \$CAUSE +\$JOB_DESCRIPTION + +Chages: +\$CHANGES + +End of build log: +\${BUILD_LOG,maxLines=60} + """, + to: 'nils.wentzell@gmail.com, dsimon@flatironinstitute.org', + recipientProviders: [ + [$class: 'DevelopersRecipientProvider'], + ], + replyTo: '$DEFAULT_REPLYTO' + ) + throw err +} diff --git a/c++/app4triqs/CMakeLists.txt b/c++/app4triqs/CMakeLists.txt new file mode 100644 index 00000000..449b23ee --- /dev/null +++ b/c++/app4triqs/CMakeLists.txt @@ -0,0 +1,19 @@ +file(GLOB_RECURSE sources RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *.cpp) +add_library(app4triqs_c ${sources}) + +target_link_libraries(app4triqs_c PUBLIC triqs) +target_compile_options(app4triqs_c PUBLIC -std=c++17) + +target_compile_definitions(app4triqs_c PUBLIC + APP4TRIQS_GIT_HASH=${APP4TRIQS_GIT_HASH} + TRIQS_GIT_HASH=${TRIQS_GIT_HASH} + $<$:DEBUG_APP4TRIQS> + $<$:TRIQS_ARRAYS_ENFORCE_BOUNDCHECK> + #$<$:MYOPTION> # Add compile definintions for option + ) + +# Install +install(TARGETS app4triqs_c DESTINATION lib) + +# If other applications need our headers, we can install them as well +# install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} DESTINATION include FILES_MATCHING PATTERN "*.hpp" PATTERN "*.h") diff --git a/c++/app4triqs/toto.cpp b/c++/app4triqs/toto.cpp new file mode 100644 index 00000000..6186f754 --- /dev/null +++ b/c++/app4triqs/toto.cpp @@ -0,0 +1,37 @@ +#include +#include "./toto.hpp" + +namespace app4triqs { + + toto &toto::operator+=(toto const &b) { + this->i += b.i; + return *this; + } + + toto toto::operator+(toto const &b) const { + auto res = *this; + res += b; + return res; + } + + bool toto::operator==(toto const &b) const { return (this->i == b.i); } + + void h5_write(triqs::h5::group grp, std::string subgroup_name, toto const &m) { + grp = subgroup_name.empty() ? grp : grp.create_group(subgroup_name); + h5_write(grp, "i", m.i); + h5_write_attribute(grp, "TRIQS_HDF5_data_scheme", toto::hdf5_scheme()); + } + + void h5_read(triqs::h5::group grp, std::string subgroup_name, toto &m) { + grp = subgroup_name.empty() ? grp : grp.open_group(subgroup_name); + int i; + h5_read(grp, "i", i); + m = toto(i); + } + + int chain(int i, int j) { + int n_digits_j = j > 0 ? (int)log10(j) + 1 : 1; + return i * int(pow(10, n_digits_j)) + j; + } + +} // namespace app4triqs diff --git a/c++/app4triqs/toto.hpp b/c++/app4triqs/toto.hpp new file mode 100644 index 00000000..17c4df2b --- /dev/null +++ b/c++/app4triqs/toto.hpp @@ -0,0 +1,68 @@ +#pragma once +#include +#include + +namespace app4triqs { + + /** + * A very useful and important class + * + * @note A Useful note + */ + class toto { + + int i = 0.0; + + public: + toto() = default; + + // Copy construction + toto(toto const &) = default; + toto(toto &&) = default; + + /** + * Construct from integer + * + * @param i_ a scalar + */ + toto(int i_) : i(i_) {} + + /// Copy assignment + toto &operator=(toto const &) = default; + toto &operator=(toto &&) = default; + + /// Simple accessor + int get_i() const { return i; } + + /// Arithmetic operations + toto operator+(toto const &b) const; + toto &operator+=(toto const &b); + + /// Comparison + bool operator==(toto const &b) const; + + /// HDF5 + static std::string hdf5_scheme() { return "Toto"; } + + friend void h5_write(triqs::h5::group grp, std::string subgroup_name, toto const &m); + + friend void h5_read(triqs::h5::group grp, std::string subgroup_name, toto &m); + + /// Serialization + template void serialize(Archive &ar, const unsigned int version) { ar &i; } + }; + + /** + * Chain digits of two integers + * + * Chain the decimal digits of two integers i and j, and return the result + * + * @param :math:`i` The first integer + * @param :math:`j` The second integer + * @return An integer containing the digits of both i and j + * + * @remark + */ + int chain(int i, int j); + +} // namespace app4triqs diff --git a/doc/CMakeLists.txt b/doc/CMakeLists.txt new file mode 100644 index 00000000..05eed6c9 --- /dev/null +++ b/doc/CMakeLists.txt @@ -0,0 +1,58 @@ +# Generate the conf.py +configure_file(${CMAKE_CURRENT_SOURCE_DIR}/conf.py.in ${CMAKE_CURRENT_BINARY_DIR}/conf.py @ONLY) + +# --------------------------------- +# Top Sphinx target +# --------------------------------- +# Sources +file(GLOB_RECURSE sources *.rst) + +set(sphinx_top ${CMAKE_CURRENT_BINARY_DIR}/html/contents.html) +add_custom_command(OUTPUT ${sphinx_top} DEPENDS ${sources} + COMMAND ${TRIQS_SPHINXBUILD_EXECUTABLE} -c . -j8 -b html ${CMAKE_CURRENT_BINARY_DIR} html) +add_custom_target(docs_sphinx ALL DEPENDS ${sphinx_top} ${CMAKE_CURRENT_BINARY_DIR}) + +# Application must be compiled first +add_dependencies(docs_sphinx app4triqs_c) + +# ------------------------------------------------------------------------------------------------ +# Copy the directory substructure and link all files with relevant extensions +# cp_rs is a script in cpp2py/bin, it mimics cp -rs on Linux +# and filters the relevant extension +# ------------------------------------------------------------------------------------------------ + +set(EXT_FOR_DOC "rst png txt css_t conf css js gif jpg py html bib") +execute_process(COMMAND cp_rs ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR} ${EXT_FOR_DOC}) + +# --------------------------------- +# Generate C++ doc with c++2rst +# --------------------------------- + +add_custom_target(docs_cpp2rst) + +macro(generate_docs header_file) + add_custom_command (TARGET docs_cpp2rst + COMMAND c++2rst + ${header_file} + -N app4triqs + --output_directory ${CMAKE_CURRENT_BINARY_DIR}/cpp2rst_generated + --cxxflags="-std=c++17" + -I ${CMAKE_SOURCE_DIR}/c++ + -I ${TRIQS_ROOT}/include + 2>&1 >> cpp2rst.log + ) +endmacro(generate_docs) + +generate_docs(${CMAKE_SOURCE_DIR}/c++/app4triqs/toto.hpp) + +add_dependencies(docs_sphinx docs_cpp2rst) + +# --------------------------------- +# Install +# --------------------------------- +install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/html/ COMPONENT documentation DESTINATION share/doc/app4triqs + FILES_MATCHING + REGEX "\\.(html|pdf|png|gif|jpg|js|xsl|css|py|txt|inv|bib)$" + PATTERN "_*" + ) + diff --git a/doc/_static/logo_erc.jpg b/doc/_static/logo_erc.jpg new file mode 100644 index 00000000..b7181ee0 Binary files /dev/null and b/doc/_static/logo_erc.jpg differ diff --git a/doc/_templates/sideb.html b/doc/_templates/sideb.html new file mode 100644 index 00000000..11622acf --- /dev/null +++ b/doc/_templates/sideb.html @@ -0,0 +1,7 @@ +

+ CEA + Ecole Polytechnique +
+ CNRS +ERC +

diff --git a/doc/about.rst b/doc/about.rst new file mode 100644 index 00000000..8fc7917d --- /dev/null +++ b/doc/about.rst @@ -0,0 +1,3 @@ +.. _about: + +An example application using cpp2py and triqs. diff --git a/doc/conf.py.in b/doc/conf.py.in new file mode 100644 index 00000000..0bdc06f9 --- /dev/null +++ b/doc/conf.py.in @@ -0,0 +1,32 @@ +# -*- coding: utf-8 -*- +# +# TRIQS documentation build configuration file + +extensions = ['sphinx.ext.autodoc', + 'sphinx.ext.mathjax', + 'sphinx.ext.intersphinx', + 'matplotlib.sphinxext.plot_directive'] + +source_suffix = '.rst' + +project = u'APP4TRIQS - An example triqs application' +copyright = u'2018 - The TRIQS Developers' + +mathjax_path = "@TRIQS_MATHJAX_PATH@/MathJax.js?config=default" +templates_path = ['@CMAKE_SOURCE_DIR@/doc/_templates'] + +html_theme = 'triqs' +html_theme_path = ['@TRIQS_THEMES_PATH@'] +html_show_sphinx = False +html_context = {'header_title': 'app4triqs', + 'header_subtitle': 'An example application using cpp2py and triqs', + 'header_links': [['Install', 'install'], + ['Documentation', 'documentation'], + ['Issues', 'issues'], + ['About app4triqs', 'about']]} +html_static_path = ['@CMAKE_SOURCE_DIR@/doc/_static'] +html_sidebars = {'index': ['sideb.html', 'searchbox.html']} + +htmlhelp_basename = 'TRIQSIntdoc' + +intersphinx_mapping = {'python': ('http://docs.python.org/2.7', None), 'triqslibs': ('http://ipht.cea.fr/triqs', None)} diff --git a/doc/contents.rst b/doc/contents.rst new file mode 100644 index 00000000..109c3171 --- /dev/null +++ b/doc/contents.rst @@ -0,0 +1,12 @@ + +Table of contents +================= + +.. toctree:: + :maxdepth: 5 + + index + documentation + install + issues + about diff --git a/doc/documentation.rst b/doc/documentation.rst new file mode 100644 index 00000000..6bec32ee --- /dev/null +++ b/doc/documentation.rst @@ -0,0 +1,12 @@ +.. _documentation: + +Documentation +============= + +Reference manual +---------------- + +.. toctree:: + :maxdepth: 1 + + cpp2rst_generated/app4triqs/compute_Sigma_Hedin diff --git a/doc/index.rst b/doc/index.rst new file mode 100644 index 00000000..6e5c1710 --- /dev/null +++ b/doc/index.rst @@ -0,0 +1,11 @@ +.. _welcome: + +App4Triqs +========= + +An example application using cpp2py and triqs. + +This documentation is generated based on the doc/\*.rst files and +the comments in the sources and headers. + +Lets have a look at the :ref:`documentation`. diff --git a/doc/install.rst b/doc/install.rst new file mode 100644 index 00000000..4cfb66a3 --- /dev/null +++ b/doc/install.rst @@ -0,0 +1,62 @@ +.. highlight:: bash + +.. _install: + +Installation +============ + + +Prerequisite +------------------- + +#. The :ref:`TRIQS ` toolbox (see :ref:`TRIQS installation instruction `). + In the following, we will suppose that it is installed in the ``path_to_triqs`` directory. + +Installation steps +------------------ + +#. Download the sources from github:: + + $ git clone https://github.com/triqs/app4triqs.git app4triqs.src + +#. Create an empty build directory where you will compile the code:: + + $ mkdir app4triqs.build && cd app4triqs.build + +#. Make sure that you have added the TRIQS and Cpp2Py installation to your environment variables:: + + $ source path_to_triqs/share/cpp2pyvarsh.sh + $ source path_to_triqs/share/triqsvarsh.sh + +#. In the build directory call cmake:: + + $ cmake ../app4triqs.src + +#. Compile the code, run the tests and install the application:: + + $ make + $ make test + $ make install + +Version compatibility +--------------------- + +Be careful that the version of the TRIQS library and of the solver must be +compatible (more information on the :ref:`TRIQS website `). +As the TRILEX project is currently still in alpha phase (unstable), it can +only be compiled against the unstable branch of triqs. + +Custom CMake options +-------------------- + +Functionality of ``app4triqs`` can be tweaked using extra compile-time options passed to CMake:: + + cmake -DOPTION1=value1 -DOPTION2=value2 ... ../app4triqs.src + ++-----------------------------------------------------------------------+-----------------------------------------------+ +| Options | Syntax | ++=======================================================================+===============================================+ +| Specify an installation path other than path_to_triqs | -DCMAKE_INSTALL_PREFIX=path_to_app4triqs | ++-----------------------------------------------------------------------+-----------------------------------------------+ +| Build the documentation locally | -DBuild_Documentation=ON | ++-----------------------------------------------------------------------+-----------------------------------------------+ diff --git a/doc/issues.rst b/doc/issues.rst new file mode 100644 index 00000000..ea52b95c --- /dev/null +++ b/doc/issues.rst @@ -0,0 +1,23 @@ +.. _issues: + +Reporting issues +================ + +Please report all problems and bugs directly at the github issue page +``_. In order to make it easier for us +to solve the issue please follow these guidelines: + +#. In all cases specify which version of the application you are using. You can + find the version number in the file :file:`CMakeLists.txt` at the root of the + application sources. + +#. If you have a problem during the installation, give us information about + your operating system and the compiler you are using. Include the outputs of + the ``cmake`` and ``make`` commands as well as the ``CMakeCache.txt`` file + which is in the build directory. Please include these outputs in a + `gist `_ file referenced in the issue. + +#. If you are experiencing a problem during the execution of the application, provide + a script which allows to quickly reproduce the problem. + +Thanks! diff --git a/python/app4triqs/CMakeLists.txt b/python/app4triqs/CMakeLists.txt new file mode 100644 index 00000000..2784e7ff --- /dev/null +++ b/python/app4triqs/CMakeLists.txt @@ -0,0 +1,21 @@ +# Build the python module +add_cpp2py_module(toto_module) + +target_link_libraries(toto_module app4triqs_c) + +# We need to include the convertes.hxx files +target_include_directories(toto_module PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) + +# Configure the version +configure_file(version.py.in version.py) + +# All Python files. Copy them in the build dir to have a complete package for the tests. +set(PYTHON_SOURCES __init__.py) +foreach(f ${PYTHON_SOURCES}) + configure_file(${f} ${f} COPYONLY) +endforeach() + +# Install python module to proper location +set(PYTHON_LIB_DEST ${CPP2PY_PYTHON_LIB_DEST_ROOT}/app4triqs) +install(TARGETS toto_module DESTINATION ${PYTHON_LIB_DEST}) +install(FILES ${PYTHON_SOURCES} ${CMAKE_CURRENT_BINARY_DIR}/version.py DESTINATION ${PYTHON_LIB_DEST}) diff --git a/python/app4triqs/__init__.py b/python/app4triqs/__init__.py new file mode 100644 index 00000000..a44ad9d7 --- /dev/null +++ b/python/app4triqs/__init__.py @@ -0,0 +1,29 @@ +################################################################################ +# +# App4Triqs: Test application for Triqs +# +# Copyright (C) 2018 by The Simons Foundation +# Author: H. U.R. Strand +# +# App4Triqs 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 3 of the License, or (at your option) any later +# version. +# +# App4Triqs 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 +# App4Triqs. If not, see . +# +################################################################################ + +r""" +DOC + +""" +from toto_module import Toto, chain + +__all__ = ['Toto', 'chain'] diff --git a/python/app4triqs/toto_module_desc.py b/python/app4triqs/toto_module_desc.py new file mode 100644 index 00000000..a9117fc2 --- /dev/null +++ b/python/app4triqs/toto_module_desc.py @@ -0,0 +1,51 @@ +# Generated automatically using the command : +# c++2py ../../c++/app4triqs/toto.hpp -p --members_read_only -N app4triqs -a app4triqs -m toto_module -o toto_module -C pytriqs --cxxflags="-std=c++17" +from cpp2py.wrap_generator import * + +# The module +module = module_(full_name = "toto_module", doc = "", app_name = "app4triqs") + +# Imports + +# Add here all includes +module.add_include("app4triqs/toto.hpp") + +# Add here anything to add in the C++ code at the start, e.g. namespace using +module.add_preamble(""" +#include +#include + +using namespace app4triqs; +""") + + +# The class toto +c = class_( + py_type = "Toto", # name of the python class + c_type = "app4triqs::toto", # name of the C++ class + doc = """A very useful and important class\n\n @note A Useful note""", # doc of the C++ class + hdf5 = True, + arithmetic = ("add_only"), + comparisons = "==", + serializable = "tuple", +) + +c.add_constructor("""()""", doc = """""") + +c.add_constructor("""(int i_)""", doc = """Construct from integer\n\n :param i_: a scalar""") + +c.add_method("""std::string hdf5_scheme ()""", + is_static = True, + doc = """HDF5""") + +c.add_property(name = "i", + getter = cfunction("int get_i ()"), + doc = """Simple accessor""") + +module.add_class(c) + +module.add_function ("int app4triqs::chain (int i, int j)", doc = """Chain digits of two integers\n\n Chain the decimal digits of two integers i and j, and return a new \n\n @param :math:`i` The first integer\n @param :math:`j` The second integer \n @return An integer containing the digits of both i and j\n\n @remark""") + + + +module.generate_code() diff --git a/python/app4triqs/version.py.in b/python/app4triqs/version.py.in new file mode 100644 index 00000000..b28d0875 --- /dev/null +++ b/python/app4triqs/version.py.in @@ -0,0 +1,31 @@ +################################################################################ +# +# App4Triqs: Test application for Triqs +# +# Copyright (C) 2018 by The Simons Foundation +# Author: H. U.R. Strand +# +# App4Triqs 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 3 of the License, or (at your option) any later +# version. +# +# App4Triqs 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 +# App4Triqs. If not, see . +# +################################################################################ + +version = "@APP4TRIQS_VERSION@" +triqs_hash = "@TRIQS_GIT_HASH@" +app4triqs_hash = "@APP4TRIQS_GIT_HASH@" + +def show_version(): + print "\nYou are using app4triqs version %s, release %s\n"%(version, release) + +def show_git_hash(): + print "\nYou are using app4triqs git hash %s based on triqs git hash %s\n"%(app4triqs_hash, triqs_hash) diff --git a/share/CMakeLists.txt b/share/CMakeLists.txt new file mode 100644 index 00000000..734a9a5d --- /dev/null +++ b/share/CMakeLists.txt @@ -0,0 +1,17 @@ +if(NOT CMAKE_INSTALL_PREFIX STREQUAL TRIQS_ROOT) + + configure_file(${CMAKE_CURRENT_SOURCE_DIR}/app4triqs.modulefile.in ${CMAKE_CURRENT_BINARY_DIR}/app4triqs.modulefile @ONLY) + install(FILES ${CMAKE_CURRENT_BINARY_DIR}/app4triqs.modulefile DESTINATION ${CMAKE_INSTALL_PREFIX}/share) + + configure_file(${CMAKE_CURRENT_SOURCE_DIR}/app4triqsvars.sh.in ${CMAKE_CURRENT_BINARY_DIR}/app4triqsvars.sh @ONLY) + install(FILES ${CMAKE_CURRENT_BINARY_DIR}/app4triqsvars.sh DESTINATION ${CMAKE_INSTALL_PREFIX}/share) + + message(STATUS "***************************************************************") + message(STATUS "* Custom install Location. Use: ") + message(STATUS "* ") + message(STATUS "* source ${CMAKE_INSTALL_PREFIX}/share/app4triqsvars.sh ") + message(STATUS "* ") + message(STATUS "* to set up the environment variables ") + message(STATUS "***************************************************************") + +endif() diff --git a/share/app4triqs.modulefile.in b/share/app4triqs.modulefile.in new file mode 100644 index 00000000..c6b2d12d --- /dev/null +++ b/share/app4triqs.modulefile.in @@ -0,0 +1,39 @@ +#%Module1.0 +# +# To be installed as ${MODULEPATH}/app4triqs/@APP4TRIQS_VERSION@ + +set name app4triqs +set version @APP4TRIQS_VERSION@ +set root @CMAKE_INSTALL_PREFIX@ +set git_hash @APP4TRIQS_GIT_HASH@ + +set url "https://github.com/TRIQS/app4triqs" +set description "An example application using cpp2py and triqs." + +module-whatis "$description" + +proc ModulesHelp { } { + global description url version git_hash + puts stderr "Description: $description" + puts stderr "URL: $url" + puts stderr "Version: $version" + puts stderr "Git hash: $git_hash" +} + +# You may need to edit the next line if cpp2py module is installed +# under a different name in your setup. +prereq cpp2py/@CPP2PY_VERSION@ + +# Only one version of app4triqs can be loaded at a time +conflict $name + +setenv APP4TRIQS_ROOT $root +setenv APP4TRIQS_VERSION $version +setenv APP4TRIQS_GIT_HASH $git_hash + +prepend-path PATH $root/bin +prepend-path CPATH $root/include +prepend-path LIBRARY_PATH $root/lib +prepend-path LD_LIBRARY_PATH $root/lib +prepend-path PYTHONPATH $root/@CPP2PY_PYTHON_LIB_DEST_ROOT@ +prepend-path CMAKE_PREFIX_PATH $root/share/cmake diff --git a/share/app4triqsvars.sh.in b/share/app4triqsvars.sh.in new file mode 100644 index 00000000..ff0abab6 --- /dev/null +++ b/share/app4triqsvars.sh.in @@ -0,0 +1,13 @@ +# Source this in your environment. + +export TRIQS_ROOT=@CMAKE_INSTALL_PREFIX@ + +export CPATH=@CMAKE_INSTALL_PREFIX@/include:$CPATH +export PATH=@CMAKE_INSTALL_PREFIX@/bin:$PATH +export LIBRARY_PATH=@CMAKE_INSTALL_PREFIX@/lib:$LIBRARY_PATH +export LD_LIBRARY_PATH=@CMAKE_INSTALL_PREFIX@/lib:$LD_LIBRARY_PATH +export PYTHONPATH=@CMAKE_INSTALL_PREFIX@/@CPP2PY_PYTHON_LIB_DEST_ROOT@:$PYTHONPATH +export CMAKE_PREFIX_PATH=@CMAKE_INSTALL_PREFIX@/share/cmake:$CMAKE_PREFIX_PATH + + + diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt new file mode 100644 index 00000000..4e0ce259 --- /dev/null +++ b/test/CMakeLists.txt @@ -0,0 +1,4 @@ +add_subdirectory(c++) +if (${TRIQS_WITH_PYTHON_SUPPORT}) + add_subdirectory(python) +endif() diff --git a/test/c++/CMakeLists.txt b/test/c++/CMakeLists.txt new file mode 100644 index 00000000..d3eb0202 --- /dev/null +++ b/test/c++/CMakeLists.txt @@ -0,0 +1,11 @@ +# Copy reference h5 files to binary dir +file(GLOB all_h5_files *.h5) +file(COPY ${all_h5_files} DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) + +set(all_tests toto) + +foreach(t ${all_tests}) + add_executable(${t} ${CMAKE_CURRENT_SOURCE_DIR}/${t}.cpp) + target_link_libraries(${t} app4triqs_c gtest) + add_test(${t} ${CMAKE_CURRENT_BINARY_DIR}/${t}) +endforeach() diff --git a/test/c++/toto.cpp b/test/c++/toto.cpp new file mode 100644 index 00000000..85779be7 --- /dev/null +++ b/test/c++/toto.cpp @@ -0,0 +1,32 @@ +#include +#include + +using namespace app4triqs; + +TEST(Toto, Add) { + + toto a(0); + toto b(2); + + auto c = a + b; + EXPECT_EQ(c, b); +} + +TEST(Toto, H5) { + + toto a(0); + { // Local scope for file + triqs::h5::file f("f.h5", H5F_ACC_TRUNC); + h5_write(f, "a", a); + } + + toto a2; + { + triqs::h5::file f("f.h5", H5F_ACC_RDWR); + h5_read(f, "a", a2); + } + + EXPECT_EQ(a, a2); +} + +MAKE_MAIN; diff --git a/test/python/CMakeLists.txt b/test/python/CMakeLists.txt new file mode 100644 index 00000000..6864a634 --- /dev/null +++ b/test/python/CMakeLists.txt @@ -0,0 +1,12 @@ +# Copy h5 files to binary dir +file(GLOB all_h5_files *.h5) +file(COPY ${all_h5_files} DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) + +set(all_tests Toto chain) + +foreach(t ${all_tests}) + add_test(NAME ${t} COMMAND python ${CMAKE_CURRENT_SOURCE_DIR}/${t}.py) +endforeach() + +# Set the PythonPath : put the build dir first (in case there is an installed version). +set_property(TEST ${all_tests} PROPERTY ENVIRONMENT PYTHONPATH=${CMAKE_BINARY_DIR}/python:$ENV{PYTHONPATH} ) diff --git a/test/python/Toto.py b/test/python/Toto.py new file mode 100644 index 00000000..52c9058d --- /dev/null +++ b/test/python/Toto.py @@ -0,0 +1,42 @@ +#!/usr/bin/env python + +import unittest + +from app4triqs import Toto +from pytriqs.archive import * +from pytriqs.utility import mpi + +class test_toto(unittest.TestCase): + + def test_add(self): + + a=Toto(0) + b=Toto(2) + + c=a+b + self.assertEqual(c, b) + + + def test_h5(self): + + a=Toto(0) + with HDFArchive("f.h5",'a') as A: + A["a"] = a + with HDFArchive("f.h5",'r') as A: + a_read = A["a"] + self.assertEqual(a, a_read) + + + def test_mpi(self): + + a=Toto(0) + + if mpi.is_master_node(): + a=Toto(1) + mpi.bcast(a) + + self.assertEqual(a, Toto(1)) + + +if __name__ == '__main__': + unittest.main() diff --git a/test/python/chain.py b/test/python/chain.py new file mode 100644 index 00000000..e0dcfc8e --- /dev/null +++ b/test/python/chain.py @@ -0,0 +1,17 @@ +#!/usr/bin/env python + +import unittest + +from app4triqs import chain + +class test_chain(unittest.TestCase): + + def test_chain(self): + + i = 111 + j = 222 + ij = chain(i,j) + self.assertEqual(ij, 111222) + +if __name__ == '__main__': + unittest.main()