Alien  1.3.0
Developer documentation
Loading...
Searching...
No Matches
DoKLocalMatrixIndexer.cc
1/*
2 * Copyright 2020 IFPEN-CEA
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 *
16 * SPDX-License-Identifier: Apache-2.0
17 */
18
19/*
20 * DoKLocalMatrixIndexer.cpp
21 *
22 * Created on: 25 juil. 2016
23 * Author: chevalic
24 */
25
26#include "DoKLocalMatrixIndexer.h"
27
28#include <algorithm>
29#include <stdexcept>
30#include <vector>
31
32#include "DoKReverseIndexer.h"
33
34namespace Alien
35{
36using namespace Arccore;
37
38void DoKLocalMatrixIndexer::associate(Integer i, Integer j, Offset offset)
39{
40 m_data[Key(i, j)] = offset;
41}
42
43std::optional<ILocalMatrixIndexer::Offset>
44DoKLocalMatrixIndexer::find(Integer i, Integer j)
45{
46 try {
47 return m_data.at(DoKLocalMatrixIndexer::Key(i, j));
48 }
49 catch (std::out_of_range&) {
50 return std::nullopt;
51 }
52}
53
54DoKLocalMatrixIndexer::Offset
56Integer i, Integer j, DoKLocalMatrixIndexer::Offset& tentative_offset)
57{
58 auto to_insert = std::make_pair<Key, Offset>(Key(i, j), tentative_offset++);
59 auto [index, is_inserted] = m_data.insert(to_insert);
60 if (!is_inserted) {
61 tentative_offset--;
62 }
63 return index->second;
64}
65
67DoKLocalMatrixIndexer::clone() const
68{
69 return new DoKLocalMatrixIndexer(*this);
70}
71
72namespace
73{
74 template <class Map>
75 class KeyCompare
76 {
77 public:
78 typedef typename Map::iterator Iterator;
79 typedef typename Map::key_type Key;
80
81 public:
82 bool operator()(const Iterator& a, const Iterator& b)
83 {
84 Key vala = a->first;
85 Key valb = b->first;
86 return ((vala.first < valb.first) || ((vala.first == valb.first) && (vala.second < valb.second)));
87 }
88 };
89} // namespace
90
92DoKLocalMatrixIndexer::sort(Arccore::Array<DoKLocalMatrixIndexer::Renumbering>& perm)
93{
94 std::vector<HashTable::iterator> src(m_data.size());
95
96 auto curr = src.begin();
97 for (auto iter = m_data.begin(); iter != m_data.end(); ++iter, ++curr) {
98 *curr = iter;
99 }
100
101 KeyCompare<HashTable> compare;
102 std::sort(src.begin(), src.end(), compare);
103
104 auto* indexer = new DoKReverseIndexer();
105 auto size = static_cast<Arccore::Integer>(m_data.size());
106 perm.resize(size);
107 for (auto curs = 0; curs < size; ++curs) {
108 perm[curs] = Renumbering(src[curs]->second, curs);
109 indexer->record(curs, src[curs]->first);
110 m_data[Key(src[curs]->first.first, src[curs]->first.second)] = curs;
111 }
112
113 return indexer;
114}
115
116} // namespace Alien
Local matrix indexer using HashMap.
void associate(Integer i, Integer j, Offset offset) override
IReverseIndexer * sort(Arccore::Array< Renumbering > &perm) override
std::optional< Offset > find(Integer i, Integer j) override
Offset create(Integer i, Integer j, Offset &tentative_offset) override
ReverseIndexer based on a HashTable.
Reverse indexer: associates an Index (i,j) to an offset.
-- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature --
Definition BackEnd.h:17