Skip to content
Snippets Groups Projects
derivs.hpp 1.59 KiB
Newer Older
  • Learn to ignore specific revisions
  • Ian Bell's avatar
    Ian Bell committed
    #pragma once
    
    template <typename TType, typename ContainerType, typename FuncType>
    typename std::enable_if<is_container<ContainerType>::value, typename ContainerType::value_type>::type
    caller(const FuncType& f, TType T, const ContainerType& rho) {
    
    Ian Bell's avatar
    Ian Bell committed
        return f(T, rho);
    
    Ian Bell's avatar
    Ian Bell committed
    }
    
    
    /// Given a function, use complex step derivatives to calculate the derivative with respect to the first variable
    /// which here is temperature
    
    Ian Bell's avatar
    Ian Bell committed
    template <typename TType, typename ContainerType, typename FuncType>
    typename std::enable_if<is_container<ContainerType>::value, typename ContainerType::value_type>::type
    
    derivT(const FuncType& f, TType T, const ContainerType& rho) {
    
    Ian Bell's avatar
    Ian Bell committed
        double h = 1e-100;
        return f(std::complex<TType>(T, h), rho).imag() / h;
    
    Ian Bell's avatar
    Ian Bell committed
    }
    
    
    /// Given a function, use complex step derivatives to calculate the derivative with respect to the first composition variable
    template <typename TType, typename ContainerType, typename FuncType, typename Integer>
    
    Ian Bell's avatar
    Ian Bell committed
    typename std::enable_if<is_container<ContainerType>::value, typename ContainerType::value_type>::type
    
    derivrhoi(const FuncType& f, TType T, const ContainerType& rho, Integer j) {
    
    Ian Bell's avatar
    Ian Bell committed
        double h = 1e-100;
        using comtype = std::complex<ContainerType::value_type>;
        std::valarray<comtype> rhocom(rho.size());
    
        for (auto i = 0; i < rho.size(); ++i) {
    
    Ian Bell's avatar
    Ian Bell committed
            rhocom[i] = comtype(rho[i], 0.0);
        }
    
        rhocom[j] = comtype(rho[j], h);
    
    Ian Bell's avatar
    Ian Bell committed
        return f(T, rhocom).imag() / h;
    
    Ian Bell's avatar
    Ian Bell committed
    }
    
    
    
    template<typename Model, typename TType, typename RhoType>
    auto build_Psir_Hessian(const Model& model, const TType T, const RhoType& rho) {
    
    Ian Bell's avatar
    Ian Bell committed
        // Double derivatives in each component's concentration
    
    Ian Bell's avatar
    Ian Bell committed
    }