/usr/include/ql/methods/finitedifferences/parallelevolver.hpp is in libquantlib0-dev 1.4-2.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 | /* -*- mode: c++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
Copyright (C) 2005 Joseph Wang
This file is part of QuantLib, a free-software/open-source library
for financial quantitative analysts and developers - http://quantlib.org/
QuantLib is free software: you can redistribute it and/or modify it
under the terms of the QuantLib license. You should have received a
copy of the license along with this program; if not, please email
<quantlib-dev@lists.sf.net>. The license is also available online at
<http://quantlib.org/license.shtml>.
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 license for more details.
*/
/*! \file parallelevolver.hpp
\brief Parallel evolver for multiple arrays
This class takes the evolver class and creates a new class which evolves
each of the evolvers in parallel. Part of what this does is to take the
types for each evolver class and then wrapper them so that they create
new types which are sets of the old types.
This class is intended to be run in situations where there are parallel
differential equations such as with some convertible bond models.
*/
#ifndef quantlib_system_evolver_hpp
#define quantlib_system_evolver_hpp
#include <ql/methods/finitedifferences/finitedifferencemodel.hpp>
#include <ql/methods/finitedifferences/stepcondition.hpp>
#include <ql/numericalmethod.hpp>
#include <vector>
namespace QuantLib {
//! Parallel evolver for multiple arrays
/*! \ingroup findiff */
template <typename array_type>
class StepConditionSet {
typedef boost::shared_ptr<StepCondition<array_type> > itemType;
std::vector<itemType> stepConditions_;
public:
void applyTo(std::vector<array_type>& a, Time t) const {
#pragma omp parallel for
for (Size i=0; i < stepConditions_.size(); i++) {
stepConditions_[i]->applyTo(a[i], t);
}
}
void push_back(const itemType& a) {
stepConditions_.push_back(a);
}
};
template <typename bc_set>
class BoundaryConditionSet {
std::vector<bc_set> bcSet_;
public:
void push_back(const bc_set& a) {
bcSet_.push_back(a);
}
const bc_set& operator[](Size i) const {
return bcSet_[i];
}
};
template <typename traits>
class ParallelEvolverTraits {
public:
typedef std::vector<typename traits::array_type> array_type;
typedef std::vector<typename traits::operator_type> operator_type;
typedef std::vector<typename traits::bc_type> bc_type;
typedef BoundaryConditionSet<typename traits::bc_set> bc_set;
typedef StepConditionSet<typename traits::array_type> condition_type;
};
template <class Evolver>
class ParallelEvolver {
public:
// typedefs
typedef ParallelEvolverTraits<typename Evolver::traits> traits;
typedef typename traits::operator_type operator_type;
typedef typename traits::array_type array_type;
typedef typename traits::bc_set bc_set;
// constructors
ParallelEvolver(const operator_type& L,
const bc_set& bcs) {
evolvers_.reserve(L.size());
for (Size i=0; i < L.size(); i++) {
evolvers_.push_back(boost::shared_ptr<Evolver>(new
Evolver(L[i], bcs[i])));
}
}
void step(array_type& a,
Time t) {
#pragma omp parallel for
for (Size i=0; i < evolvers_.size(); i++) {
evolvers_[i]->step(a[i], t);
}
}
void setStep(Time dt) {
for (Size i=0; i < evolvers_.size(); i++) {
evolvers_[i]->setStep(dt);
}
}
private:
std::vector<boost::shared_ptr<Evolver> > evolvers_;
};
}
#endif
|