diff options
author | Erik Schnetter <schnetter@gmail.com> | 2013-04-04 12:19:13 -0400 |
---|---|---|
committer | Erik Schnetter <schnetter@gmail.com> | 2013-04-04 12:19:13 -0400 |
commit | 3f183ce4a972d3ae34da4e830299af9a67a9ef3e (patch) | |
tree | ab84fddf2b7a9754d69fe08e102783ff5e4ac187 /Carpet/Carpet | |
parent | 7332bf6500d66a183beddd8078c864cc39bdafd0 (diff) |
Carpet: Don't call Requirements when only asking about allocated storage
When CCTK_GroupStorage{De,In}crease is called to only inquire about storage (and not modify it), don't call the Requirements thorn.
Diffstat (limited to 'Carpet/Carpet')
-rw-r--r-- | Carpet/Carpet/src/Storage.cc | 51 |
1 files changed, 29 insertions, 22 deletions
diff --git a/Carpet/Carpet/src/Storage.cc b/Carpet/Carpet/src/Storage.cc index d6ec2260a..f8f6f3516 100644 --- a/Carpet/Carpet/src/Storage.cc +++ b/Carpet/Carpet/src/Storage.cc @@ -59,6 +59,35 @@ namespace Carpet { assert (tls[n] >= 0); } +#ifdef REQUIREMENTS_HH + vector<int> vgroups, vtimelevels; + vgroups.reserve(n_groups); + vtimelevels.reserve(n_groups); + for (int i=0; i<n_groups; ++i) { + int const gi = groups[i]; + int const ml = 0; + int const grouptype = CCTK_GroupTypeI(gi); + bool const is_array = grouptype != CCTK_GF; + bool const all_rl = is_meta_mode() or is_global_mode(); + int const min_rl = is_array ? 0 : all_rl ? 0 : reflevel; + int const max_rl = is_array ? 1 : all_rl ? reflevels : reflevel+1; + int const ntls = tls[i]; + bool do_change = false; + for (int rl=min_rl; rl<max_rl; ++rl) { + int const ctls = groupdata.AT(gi).activetimelevels.AT(ml).AT(rl); + do_change = do_change or + (inc and ctls < ntls) or (not inc and ctls > ntls); + } + if (do_change) { + vgroups.push_back(gi); + vtimelevels.push_back(ntls); + } + } + if (not vgroups.empty()) { + Requirements::ChangeStorage(vgroups, vtimelevels, reflevel); + } +#endif + bool const can_do = is_meta_mode() or is_global_mode() or is_level_mode(); bool const all_ml = is_meta_mode(); int const min_ml = all_ml ? 0 : mglevel; @@ -219,28 +248,6 @@ namespace Carpet { min_num_timelevels = 0; } -#ifdef REQUIREMENTS_HH - vector<int> vgroups(n_groups), vtimelevels(n_groups); - for (int i=0; i<n_groups; ++i) { - int const gi = groups[i]; - int const ml = 0; - int const grouptype = CCTK_GroupTypeI(gi); - bool const is_array = grouptype != CCTK_GF; - bool const all_rl = is_meta_mode() or is_global_mode(); - int const min_rl = is_array ? 0 : all_rl ? 0 : reflevel; - int const max_rl = is_array ? 1 : all_rl ? reflevels : reflevel+1; - int const ntls = groupdata.AT(gi).activetimelevels.AT(ml).AT(min_rl); - for (int rl=min_rl; rl<max_rl; ++rl) { - // TODO: We assume here that all refinement levels have the - // same number of active time levels -- this may not be true - assert (groupdata.AT(gi).activetimelevels.AT(ml).AT(rl) == ntls); - } - vgroups.AT(i) = gi; - vtimelevels.AT(i) = ntls; - } - Requirements::ChangeStorage(vgroups, vtimelevels, reflevel); -#endif - return do_allow_past_timelevels ? min_num_timelevels : min(1,min_num_timelevels); } |