Coverage Report

Created: 2025-08-05 06:45

/src/quantlib/ql/methods/finitedifferences/utilities/fdmindicesonboundary.cpp
Line
Count
Source (jump to first uncovered line)
1
/* -*- mode: c++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2
3
/*
4
 Copyright (C) 2008 Andreas Gaida
5
 Copyright (C) 2008 Ralph Schreyer
6
 Copyright (C) 2008 Klaus Spanderen
7
8
 This file is part of QuantLib, a free-software/open-source library
9
 for financial quantitative analysts and developers - http://quantlib.org/
10
11
 QuantLib is free software: you can redistribute it and/or modify it
12
 under the terms of the QuantLib license.  You should have received a
13
 copy of the license along with this program; if not, please email
14
 <quantlib-dev@lists.sf.net>. The license is also available online at
15
 <http://quantlib.org/license.shtml>.
16
17
 This program is distributed in the hope that it will be useful, but WITHOUT
18
 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
19
 FOR A PARTICULAR PURPOSE.  See the license for more details.
20
*/
21
22
23
#include <ql/methods/finitedifferences/operators/fdmlinearoplayout.hpp>
24
#include <ql/methods/finitedifferences/utilities/fdmindicesonboundary.hpp>
25
26
namespace QuantLib {
27
    FdmIndicesOnBoundary::FdmIndicesOnBoundary(
28
        const ext::shared_ptr<FdmLinearOpLayout>& layout,
29
0
        Size direction, FdmDirichletBoundary::Side side) {
30
31
0
        std::vector<Size> newDim(layout->dim());
32
0
        newDim[direction] = 1;
33
0
        const Size hyperSize
34
0
            = std::accumulate(newDim.begin(), newDim.end(), Size(1), std::multiplies<>());
35
0
        indices_.resize(hyperSize);
36
37
0
        Size i=0;
38
0
        for (const auto& iter : *layout) {
39
0
            if (   (   side == FdmDirichletBoundary::Lower
40
0
                    && iter.coordinates()[direction] == 0)
41
0
                || (   side == FdmDirichletBoundary::Upper
42
0
                    && iter.coordinates()[direction]
43
0
                                            == layout->dim()[direction]-1)) {
44
0
                QL_REQUIRE(hyperSize > i, "index missmatch");
45
0
                indices_[i++] = iter.index();
46
0
            }
47
0
        }
48
49
50
0
    }
51
52
0
    const std::vector<Size>& FdmIndicesOnBoundary::getIndices() const {
53
0
        return indices_;
54
0
    }
55
}