PRISMS-PF Manual
Loading...
Searching...
No Matches
dependency_extents.h
Go to the documentation of this file.
1// SPDX-FileCopyrightText: © 2025 PRISMS Center at the University of Michigan
2// SPDX-License-Identifier: GNU Lesser General Public Version 2.1
3
4#pragma once
5
9
10#include <prismspf/config.h>
11
12#include <vector>
13
15inline unsigned int
16oldest(Dependency dependencies)
17{
18 for (long int age_index = long(dependencies.old_flags.size()) - 1; age_index >= 0;
19 age_index--)
20 {
21 if (dependencies.old_flags[age_index])
22 {
23 return age_index + 1;
24 }
25 }
26 return 0;
27}
28
29inline int
30oldest2(Dependency dependencies)
31{
32 for (long int age_index = long(dependencies.old_flags.size()) - 1; age_index >= 0;
33 age_index--)
34 {
35 if (dependencies.old_flags[age_index])
36 {
37 return age_index + 1;
38 }
39 }
40 if (dependencies.flag)
41 {
42 return 0;
43 }
44 return -1;
45}
46
52{
53 unsigned int oldest_age = 0;
54 unsigned int max_mg_level = 0;
55
56 // TODO: update this to account multigrid levels. Will need more
57 // than std::list<DependencyMap>
58 DependencyExtents(const std::set<unsigned int> &field_indices,
59 const std::list<DependencyMap> &all_dependeny_sets)
60 {
61 for (const DependencyMap &dependency_set : all_dependeny_sets)
62 {
63 for (unsigned int field_index : field_indices)
64 {
65 const auto &dep_pair_it = dependency_set.find(field_index);
66 if (dep_pair_it != dependency_set.end())
67 {
68 oldest_age = std::max(oldest_age, oldest(dep_pair_it->second));
69 }
70 }
71 }
72 }
73};
74
76{
77 unsigned int max_age = 0;
78 std::vector<unsigned int> max_age_per_level;
79
80 NewDependencyExtents(const std::set<unsigned int> &field_indices,
81 const std::list<SolveBlock> &solve_blocks)
82 {
83 for (const SolveBlock &solve_block : solve_blocks)
84 {
85 const unsigned int num_levels =
86 solve_block.linear_solver_parameters.preconditioner == GMG
87 ? solve_block.linear_solver_parameters.mg_depth
88 : 0;
89 for (unsigned int field_index : field_indices)
90 {
91 {
92 const auto &dep_pair_it = solve_block.dependencies_rhs.find(field_index);
93 if (dep_pair_it != solve_block.dependencies_rhs.end())
94 {
95 unsigned int age = oldest2(dep_pair_it->second);
96 if (age != -1)
97 {
98 max_age = std::max(max_age, age);
99 }
100 // ignore mg_dependencies for rhs
101 }
102 }
103 {
104 const auto &dep_pair_it = solve_block.dependencies_lhs.find(field_index);
105 if (dep_pair_it != solve_block.dependencies_lhs.end())
106 {
107 // mg dependencies TODO: when issue #1182 is closed, remove this
108 if (solve_block.field_indices.contains(field_index) &&
109 num_levels > max_age_per_level.size())
110 {
111 max_age_per_level.resize(num_levels, 0);
112 }
113 unsigned int age = oldest2(dep_pair_it->second);
114 if (age != -1)
115 {
116 max_age = std::max(max_age, age);
117 if (num_levels > max_age_per_level.size())
118 {
119 max_age_per_level.resize(num_levels, 0);
120 }
121 for (unsigned int relative_level = 0; relative_level < num_levels;
122 ++relative_level)
123 {
124 max_age_per_level[relative_level] =
125 std::max(max_age_per_level[relative_level], age);
126 }
127 }
128 }
129 }
130 }
131 }
132 }
133};
134
135PRISMS_PF_END_NAMESPACE
Structure to hold the attributes of a solve-block.
Definition solve_block.h:59
std::map< Types::Index, Dependency > DependencyMap
Definition dependencies.h:129
int oldest2(Dependency dependencies)
Definition dependency_extents.h:30
PRISMS_PF_BEGIN_NAMESPACE unsigned int oldest(Dependency dependencies)
Definition dependency_extents.h:16
Definition conditional_ostreams.cc:20
unsigned int max_mg_level
Definition dependency_extents.h:54
unsigned int oldest_age
Definition dependency_extents.h:53
DependencyExtents(const std::set< unsigned int > &field_indices, const std::list< DependencyMap > &all_dependeny_sets)
Definition dependency_extents.h:58
Dependency struct containing evaluation flags for each field.
Definition dependencies.h:30
std::vector< EvalFlags > old_flags
Collection of evaluation flags for the old solutions.
Definition dependencies.h:47
EvalFlags flag
Evaluation flags for the current solution.
Definition dependencies.h:36
std::vector< unsigned int > max_age_per_level
Definition dependency_extents.h:78
NewDependencyExtents(const std::set< unsigned int > &field_indices, const std::list< SolveBlock > &solve_blocks)
Definition dependency_extents.h:80
unsigned int max_age
Definition dependency_extents.h:77
@ GMG
Definition type_enums.h:146