/******************************************************************************* * * TRIQS: a Toolbox for Research in Interacting Quantum Systems * * Copyright (C) 2012 by M. Ferrero, O. Parcollet * * TRIQS 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. * * TRIQS 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 * TRIQS. If not, see . * ******************************************************************************/ #ifndef TRIQS_GF_TOOLS_H #define TRIQS_GF_TOOLS_H #include #include #include #include #include #include #include #include "triqs/utility/complex_ops.hpp" #include #include #include namespace triqs { namespace gfs { namespace tqa= triqs::arrays; namespace mpl=boost::mpl; namespace tag { struct composite{}; struct mesh_point{};} struct scalar_valued {}; template struct tensor_valued {static_assert( R>0, "tensor_valued only for rank >0");}; struct matrix_valued{}; //------------------------------------------------------ typedef std::complex dcomplex; enum statistic_enum {Boson,Fermion}; struct freq_infty{}; // the point at infinity //------------------------------------------------------ inline std::vector split(const std::string &s, char delim){ std::vector elems; std::stringstream ss(s); std::string item; while(std::getline(ss, item, delim)) { elems.push_back(item); } return elems; } //------------------------------------------------------ template struct closest_pt_wrap; template struct closest_pt_wrap : tag::mesh_point { T value; template explicit closest_pt_wrap(U&&x): value(std::forward(x)){} }; template struct closest_pt_wrap : tag::mesh_point { std::tuple value_tuple; template explicit closest_pt_wrap(U&& ... x): value_tuple (std::forward(x) ... ){} }; template closest_pt_wrap closest_mesh_pt(T && ... x) { return closest_pt_wrap (std::forward(x)...);} //------------------------------------------------------ struct nothing { template explicit nothing(Args&&...) {} // takes anything, do nothing.. nothing() {} typedef nothing view_type; typedef nothing regular_type; void rebind (nothing){} template< typename RHS> void operator=(RHS && ) {} friend void h5_write (h5::group, std::string subgroup_name, nothing ) {} friend void h5_read (h5::group, std::string subgroup_name, nothing ) {} // BOOST Serialization friend class boost::serialization::access; template void serialize(Archive & ar, const unsigned int version) { } friend nothing operator +( nothing, nothing) { return nothing();} template friend void assign_from_expression(nothing & ,RHS) {} }; template nothing operator+(nothing, T const &) { return nothing();} template nothing operator-(nothing, T const &) { return nothing();} template nothing operator*(nothing, T const &) { return nothing();} template nothing operator/(nothing, T const &) { return nothing();} template TYPE_DISABLE_IF(nothing, std::is_same) operator+(T const &, nothing) { return nothing();} template TYPE_DISABLE_IF(nothing, std::is_same) operator-(T const &, nothing) { return nothing();} template TYPE_DISABLE_IF(nothing, std::is_same) operator*(T const &, nothing) { return nothing();} template TYPE_DISABLE_IF(nothing, std::is_same) operator/(T const &, nothing) { return nothing();} //------------------------------------------------------ }} #endif