Move tally % estimator and tally % active to C++

This commit is contained in:
Sterling Harper 2019-01-26 15:13:32 -05:00
parent 69376894cc
commit 8c4a74ec84
6 changed files with 162 additions and 108 deletions

View file

@ -30,6 +30,11 @@ public:
int32_t n_filter_bins() const {return n_filter_bins_;}
//! Event type that contributes to this tally
int estimator_ {ESTIMATOR_TRACKLENGTH};
bool active_ {false};
// We need to have quick access to some filters. The following gives indices
// for various filters that could be in the tally or C_NONE if they are not
// present.
@ -58,6 +63,13 @@ extern "C" double total_weight;
namespace model {
extern std::vector<std::unique_ptr<Tally>> tallies;
extern std::vector<int> active_analog_tallies;
extern std::vector<int> active_tracklength_tallies;
extern std::vector<int> active_meshsurf_tallies;
extern std::vector<int> active_collision_tallies;
extern std::vector<int> active_tallies;
extern std::vector<int> active_surface_tallies;
}
// Threadprivate variables

View file

@ -1174,19 +1174,19 @@ contains
do j = 1, t % n_filters()
select type (filt => filters(t % filter(j)) % obj)
type is (EnergyoutFilter)
t % estimator = ESTIMATOR_ANALOG
call t % set_estimator(ESTIMATOR_ANALOG)
type is (LegendreFilter)
t % estimator = ESTIMATOR_ANALOG
call t % set_estimator(ESTIMATOR_ANALOG)
type is (SphericalHarmonicsFilter)
if (filt % cosine() == COSINE_SCATTER) then
t % estimator = ESTIMATOR_ANALOG
call t % set_estimator(ESTIMATOR_ANALOG)
end if
type is (SpatialLegendreFilter)
t % estimator = ESTIMATOR_COLLISION
call t % set_estimator(ESTIMATOR_COLLISION)
type is (ZernikeFilter)
t % estimator = ESTIMATOR_COLLISION
call t % set_estimator(ESTIMATOR_COLLISION)
type is (ZernikeRadialFilter)
t % estimator = ESTIMATOR_COLLISION
call t % set_estimator(ESTIMATOR_COLLISION)
end select
end do
@ -1312,7 +1312,7 @@ contains
t % score_bins(j) = SCORE_SCATTER
if (has_energyout .or. has_legendre) then
! Set tally estimator to analog
t % estimator = ESTIMATOR_ANALOG
call t % set_estimator(ESTIMATOR_ANALOG)
end if
case ('nu-scatter')
@ -1322,11 +1322,11 @@ contains
! (MG mode has all data available without a collision being
! necessary)
if (run_CE) then
t % estimator = ESTIMATOR_ANALOG
call t % set_estimator(ESTIMATOR_ANALOG)
else
if (has_energyout .or. has_legendre) then
! Set tally estimator to analog
t % estimator = ESTIMATOR_ANALOG
call t % set_estimator(ESTIMATOR_ANALOG)
end if
end if
@ -1358,7 +1358,7 @@ contains
t % score_bins(j) = SCORE_NU_FISSION
if (has_energyout) then
! Set tally estimator to analog
t % estimator = ESTIMATOR_ANALOG
call t % set_estimator(ESTIMATOR_ANALOG)
end if
case ('decay-rate')
t % score_bins(j) = SCORE_DECAY_RATE
@ -1366,13 +1366,13 @@ contains
t % score_bins(j) = SCORE_DELAYED_NU_FISSION
if (has_energyout) then
! Set tally estimator to analog
t % estimator = ESTIMATOR_ANALOG
call t % set_estimator(ESTIMATOR_ANALOG)
end if
case ('prompt-nu-fission')
t % score_bins(j) = SCORE_PROMPT_NU_FISSION
if (has_energyout) then
! Set tally estimator to analog
t % estimator = ESTIMATOR_ANALOG
call t % set_estimator(ESTIMATOR_ANALOG)
end if
case ('kappa-fission')
t % score_bins(j) = SCORE_KAPPA_FISSION
@ -1563,7 +1563,7 @@ contains
type is (ParticleFilter)
do l = 1, filt % n_bins
if (filt % particles(l) == ELECTRON .or. filt % particles(l) == POSITRON) then
t % estimator = ESTIMATOR_ANALOG
call t % set_estimator(ESTIMATOR_ANALOG)
end if
end do
end select
@ -1598,8 +1598,8 @@ contains
call t % set_deriv(j)
! Only analog or collision estimators are supported for differential
! tallies.
if (t % estimator == ESTIMATOR_TRACKLENGTH) then
t % estimator = ESTIMATOR_COLLISION
if (t % estimator() == ESTIMATOR_TRACKLENGTH) then
call t % set_estimator(ESTIMATOR_COLLISION)
end if
! We found the derivative we were looking for; exit the do loop.
exit
@ -1807,29 +1807,29 @@ contains
call get_node_value(node_tal, "estimator", temp_str)
select case(trim(temp_str))
case ('analog')
t % estimator = ESTIMATOR_ANALOG
call t % set_estimator(ESTIMATOR_ANALOG)
case ('tracklength', 'track-length', 'pathlength', 'path-length')
! If the estimator was set to an analog estimator, this means the
! tally needs post-collision information
if (t % estimator == ESTIMATOR_ANALOG) then
if (t % estimator() == ESTIMATOR_ANALOG) then
call fatal_error("Cannot use track-length estimator for tally " &
// to_str(t % id))
end if
! Set estimator to track-length estimator
t % estimator = ESTIMATOR_TRACKLENGTH
call t % set_estimator(ESTIMATOR_TRACKLENGTH)
case ('collision')
! If the estimator was set to an analog estimator, this means the
! tally needs post-collision information
if (t % estimator == ESTIMATOR_ANALOG) then
if (t % estimator() == ESTIMATOR_ANALOG) then
call fatal_error("Cannot use collision estimator for tally " &
// to_str(t % id))
end if
! Set estimator to collision estimator
t % estimator = ESTIMATOR_COLLISION
call t % set_estimator(ESTIMATOR_COLLISION)
case default
call fatal_error("Invalid estimator '" // trim(temp_str) &

View file

@ -254,7 +254,7 @@ contains
! Write the name for this tally
call write_dataset(tally_group, "name", tally % name)
select case(tally % estimator)
select case(tally % estimator())
case (ESTIMATOR_ANALOG)
call write_dataset(tally_group, "estimator", "analog")
case (ESTIMATOR_TRACKLENGTH)

View file

@ -125,7 +125,7 @@ contains
case (SCORE_FLUX)
if (t % estimator == ESTIMATOR_ANALOG) then
if (t % estimator() == ESTIMATOR_ANALOG) then
! All events score to a flux bin. We actually use a collision
! estimator in place of an analog one since there is no way to count
! 'events' exactly for the flux
@ -150,7 +150,7 @@ contains
case (SCORE_TOTAL)
if (t % estimator == ESTIMATOR_ANALOG) then
if (t % estimator() == ESTIMATOR_ANALOG) then
! All events will score to the total reaction rate. We can just
! use the weight of the particle entering the collision as the
! score
@ -172,7 +172,7 @@ contains
case (SCORE_INVERSE_VELOCITY)
if (t % estimator == ESTIMATOR_ANALOG) then
if (t % estimator() == ESTIMATOR_ANALOG) then
! All events score to an inverse velocity bin. We actually use a
! collision estimator in place of an analog one since there is no way
! to count 'events' exactly for the inverse velocity
@ -197,7 +197,7 @@ contains
case (SCORE_SCATTER)
if (t % estimator == ESTIMATOR_ANALOG) then
if (t % estimator() == ESTIMATOR_ANALOG) then
! Skip any event where the particle didn't scatter
if (p % event /= EVENT_SCATTER) cycle SCORE_LOOP
! Since only scattering events make it here, again we can use
@ -239,7 +239,7 @@ contains
case (SCORE_ABSORPTION)
if (t % estimator == ESTIMATOR_ANALOG) then
if (t % estimator() == ESTIMATOR_ANALOG) then
if (survival_biasing) then
! No absorption events actually occur if survival biasing is on --
! just use weight absorbed in survival biasing
@ -265,7 +265,7 @@ contains
if (material_xs % absorption == ZERO) cycle SCORE_LOOP
if (t % estimator == ESTIMATOR_ANALOG) then
if (t % estimator() == ESTIMATOR_ANALOG) then
if (survival_biasing) then
! No fission events occur if survival biasing is on -- need to
! calculate fraction of absorptions that would have resulted in
@ -299,7 +299,7 @@ contains
if (material_xs % absorption == ZERO) cycle SCORE_LOOP
if (t % estimator == ESTIMATOR_ANALOG) then
if (t % estimator() == ESTIMATOR_ANALOG) then
if (survival_biasing .or. p % fission) then
if (t % energyout_filter() > 0) then
! Normally, we only need to make contributions to one scoring
@ -345,7 +345,7 @@ contains
if (material_xs % absorption == ZERO) cycle SCORE_LOOP
if (t % estimator == ESTIMATOR_ANALOG) then
if (t % estimator() == ESTIMATOR_ANALOG) then
if (survival_biasing .or. p % fission) then
if (t % energyout_filter() > 0) then
! Normally, we only need to make contributions to one scoring
@ -413,7 +413,7 @@ contains
! Set the delayedgroup filter index and the number of delayed group bins
dg_filter = t % delayedgroup_filter()
if (t % estimator == ESTIMATOR_ANALOG) then
if (t % estimator() == ESTIMATOR_ANALOG) then
if (survival_biasing .or. p % fission) then
if (t % energyout_filter() > 0) then
! Normally, we only need to make contributions to one scoring
@ -607,7 +607,7 @@ contains
! Set the delayedgroup filter index
dg_filter = t % delayedgroup_filter()
if (t % estimator == ESTIMATOR_ANALOG) then
if (t % estimator() == ESTIMATOR_ANALOG) then
if (survival_biasing) then
! No fission events occur if survival biasing is on -- need to
! calculate fraction of absorptions that would have resulted in
@ -890,7 +890,7 @@ contains
score = ZERO
if (t % estimator == ESTIMATOR_ANALOG) then
if (t % estimator() == ESTIMATOR_ANALOG) then
if (survival_biasing) then
! No fission events occur if survival biasing is on -- need to
! calculate fraction of absorptions that would have resulted in
@ -955,7 +955,7 @@ contains
score = ONE
case (ELASTIC)
if (t % estimator == ESTIMATOR_ANALOG) then
if (t % estimator() == ESTIMATOR_ANALOG) then
! Check if event MT matches
if (p % event_MT /= ELASTIC) cycle SCORE_LOOP
score = p % last_wgt * flux
@ -991,7 +991,7 @@ contains
score = ZERO
if (t % estimator == ESTIMATOR_ANALOG) then
if (t % estimator() == ESTIMATOR_ANALOG) then
if (survival_biasing) then
! No fission events occur if survival biasing is on -- need to
! calculate fraction of absorptions that would have resulted in
@ -1063,7 +1063,7 @@ contains
end if
case (N_2N, N_3N, N_4N, N_GAMMA, N_P, N_A)
if (t % estimator == ESTIMATOR_ANALOG) then
if (t % estimator() == ESTIMATOR_ANALOG) then
! Check if event MT matches
if (p % event_MT /= score_bin) cycle SCORE_LOOP
score = p % last_wgt * flux
@ -1102,7 +1102,7 @@ contains
end if
case default
if (t % estimator == ESTIMATOR_ANALOG) then
if (t % estimator() == ESTIMATOR_ANALOG) then
! Any other score is assumed to be a MT number. Thus, we just need
! to check if it matches the MT number of the event
if (p % event_MT /= score_bin) cycle SCORE_LOOP
@ -1228,8 +1228,8 @@ contains
! to tally with.
! Set the direction and group to use with get_xs
if (t % estimator == ESTIMATOR_ANALOG .or. &
t % estimator == ESTIMATOR_COLLISION) then
if (t % estimator() == ESTIMATOR_ANALOG .or. &
t % estimator() == ESTIMATOR_COLLISION) then
if (survival_biasing) then
@ -1289,7 +1289,7 @@ contains
case (SCORE_FLUX)
if (t % estimator == ESTIMATOR_ANALOG) then
if (t % estimator() == ESTIMATOR_ANALOG) then
! All events score to a flux bin. We actually use a collision
! estimator in place of an analog one since there is no way to count
! 'events' exactly for the flux
@ -1310,7 +1310,7 @@ contains
case (SCORE_TOTAL)
if (t % estimator == ESTIMATOR_ANALOG) then
if (t % estimator() == ESTIMATOR_ANALOG) then
! All events will score to the total reaction rate. We can just
! use the weight of the particle entering the collision as the
! score
@ -1339,8 +1339,8 @@ contains
case (SCORE_INVERSE_VELOCITY)
if (t % estimator == ESTIMATOR_ANALOG .or. &
t % estimator == ESTIMATOR_COLLISION) then
if (t % estimator() == ESTIMATOR_ANALOG .or. &
t % estimator() == ESTIMATOR_COLLISION) then
! All events score to an inverse velocity bin. We actually use a
! collision estimator in place of an analog one since there is no way
! to count 'events' exactly for the inverse velocity
@ -1375,7 +1375,7 @@ contains
case (SCORE_SCATTER)
if (t % estimator == ESTIMATOR_ANALOG) then
if (t % estimator() == ESTIMATOR_ANALOG) then
! Skip any event where the particle didn't scatter
if (p % event /= EVENT_SCATTER) then
cycle SCORE_LOOP
@ -1413,7 +1413,7 @@ contains
case (SCORE_NU_SCATTER)
if (t % estimator == ESTIMATOR_ANALOG) then
if (t % estimator() == ESTIMATOR_ANALOG) then
! Skip any event where the particle didn't scatter
if (p % event /= EVENT_SCATTER) then
cycle SCORE_LOOP
@ -1448,7 +1448,7 @@ contains
case (SCORE_ABSORPTION)
if (t % estimator == ESTIMATOR_ANALOG) then
if (t % estimator() == ESTIMATOR_ANALOG) then
if (survival_biasing) then
! No absorption events actually occur if survival biasing is on --
! just use weight absorbed in survival biasing
@ -1477,7 +1477,7 @@ contains
case (SCORE_FISSION)
if (t % estimator == ESTIMATOR_ANALOG) then
if (t % estimator() == ESTIMATOR_ANALOG) then
if (survival_biasing) then
! No fission events occur if survival biasing is on -- need to
! calculate fraction of absorptions that would have resulted in
@ -1512,7 +1512,7 @@ contains
case (SCORE_NU_FISSION)
if (t % estimator == ESTIMATOR_ANALOG) then
if (t % estimator() == ESTIMATOR_ANALOG) then
if (survival_biasing .or. p % fission) then
if (t % energyout_filter() > 0) then
! Normally, we only need to make contributions to one scoring
@ -1566,7 +1566,7 @@ contains
case (SCORE_PROMPT_NU_FISSION)
if (t % estimator == ESTIMATOR_ANALOG) then
if (t % estimator() == ESTIMATOR_ANALOG) then
if (survival_biasing .or. p % fission) then
if (t % energyout_filter() > 0) then
! Normally, we only need to make contributions to one scoring
@ -1624,7 +1624,7 @@ contains
! Set the delayedgroup filter index and the number of delayed group bins
dg_filter = t % delayedgroup_filter()
if (t % estimator == ESTIMATOR_ANALOG) then
if (t % estimator() == ESTIMATOR_ANALOG) then
if (survival_biasing .or. p % fission) then
if (t % energyout_filter() > 0) then
! Normally, we only need to make contributions to one scoring
@ -1767,7 +1767,7 @@ contains
! Set the delayedgroup filter index and the number of delayed group bins
dg_filter = t % delayedgroup_filter()
if (t % estimator == ESTIMATOR_ANALOG) then
if (t % estimator() == ESTIMATOR_ANALOG) then
if (survival_biasing) then
! No fission events occur if survival biasing is on -- need to
! calculate fraction of absorptions that would have resulted in
@ -1944,7 +1944,7 @@ contains
case (SCORE_KAPPA_FISSION)
if (t % estimator == ESTIMATOR_ANALOG) then
if (t % estimator() == ESTIMATOR_ANALOG) then
if (survival_biasing) then
! No fission events occur if survival biasing is on -- need to
! calculate fraction of absorptions that would have resulted in
@ -2078,7 +2078,7 @@ contains
if (.not. filter_matches(i_filt) % bins_present) then
call filter_matches(i_filt) % bins_clear()
call filter_matches(i_filt) % weights_clear()
call filters(i_filt) % obj % get_all_bins(p, t % estimator, &
call filters(i_filt) % obj % get_all_bins(p, t % estimator(), &
filter_matches(i_filt))
filter_matches(i_filt) % bins_present = .true.
end if
@ -2224,7 +2224,7 @@ contains
if (.not. filter_matches(i_filt) % bins_present) then
call filter_matches(i_filt) % bins_clear()
call filter_matches(i_filt) % weights_clear()
call filters(i_filt) % obj % get_all_bins(p, t % estimator, &
call filters(i_filt) % obj % get_all_bins(p, t % estimator(), &
filter_matches(i_filt))
filter_matches(i_filt) % bins_present = .true.
end if
@ -2589,7 +2589,7 @@ contains
if (.not. filter_matches(i_filt) % bins_present) then
call filter_matches(i_filt) % bins_clear()
call filter_matches(i_filt) % weights_clear()
call filters(i_filt) % obj % get_all_bins(p, t % estimator, &
call filters(i_filt) % obj % get_all_bins(p, t % estimator(), &
filter_matches(i_filt))
filter_matches(i_filt) % bins_present = .true.
end if
@ -2746,7 +2746,7 @@ contains
if (.not. filter_matches(i_filt) % bins_present) then
call filter_matches(i_filt) % bins_clear()
call filter_matches(i_filt) % weights_clear()
call filters(i_filt) % obj % get_all_bins(p, t % estimator, &
call filters(i_filt) % obj % get_all_bins(p, t % estimator(), &
filter_matches(i_filt))
filter_matches(i_filt) % bins_present = .true.
end if
@ -2892,7 +2892,7 @@ contains
if (.not. filter_matches(i_filt) % bins_present) then
call filter_matches(i_filt) % bins_clear()
call filter_matches(i_filt) % weights_clear()
call filters(i_filt) % obj % get_all_bins(p, t % estimator, &
call filters(i_filt) % obj % get_all_bins(p, t % estimator(), &
filter_matches(i_filt))
filter_matches(i_filt) % bins_present = .true.
end if
@ -3026,7 +3026,7 @@ contains
! (1 / c) * (d_c / d_rho) = 1 / rho
case (DIFF_DENSITY)
select case (t % estimator)
select case (t % estimator())
case (ESTIMATOR_ANALOG)
@ -3089,7 +3089,7 @@ contains
! where i is the perturbed nuclide.
case (DIFF_NUCLIDE_DENSITY)
select case (t % estimator)
select case (t % estimator())
case (ESTIMATOR_ANALOG)
@ -3226,7 +3226,7 @@ contains
! resonance range and requires multipole data.
case (DIFF_TEMPERATURE)
select case (t % estimator)
select case (t % estimator())
case (ESTIMATOR_ANALOG)
@ -3786,7 +3786,9 @@ contains
subroutine setup_active_tallies() bind(C)
integer :: i ! loop counter
integer :: i
integer(C_INT) :: err
logical(C_BOOL) :: active
call active_tallies % clear()
call active_analog_tallies % clear()
@ -3797,17 +3799,18 @@ contains
do i = 1, n_tallies
associate (t => tallies(i) % obj)
if (t % active) then
err = openmc_tally_get_active(i, active)
if (active) then
! Add tally to active tallies
call active_tallies % push_back(i)
! Check what type of tally this is and add it to the appropriate list
if (t % type == TALLY_VOLUME) then
if (t % estimator == ESTIMATOR_ANALOG) then
if (t % estimator() == ESTIMATOR_ANALOG) then
call active_analog_tallies % push_back(i)
elseif (t % estimator == ESTIMATOR_TRACKLENGTH) then
elseif (t % estimator() == ESTIMATOR_TRACKLENGTH) then
call active_tracklength_tallies % push_back(i)
elseif (t % estimator == ESTIMATOR_COLLISION) then
elseif (t % estimator() == ESTIMATOR_COLLISION) then
call active_collision_tallies % push_back(i)
end if
elseif (t % type == TALLY_MESH_SURFACE) then

View file

@ -26,6 +26,13 @@ namespace openmc {
namespace model {
std::vector<std::unique_ptr<Tally>> tallies;
std::vector<int> active_analog_tallies;
std::vector<int> active_tracklength_tallies;
std::vector<int> active_meshsurf_tallies;
std::vector<int> active_collision_tallies;
std::vector<int> active_tallies;
std::vector<int> active_surface_tallies;
}
double global_tally_absorption;
@ -188,6 +195,28 @@ free_memory_tally_c()
// C-API functions
//==============================================================================
extern "C" int
openmc_tally_get_active(int32_t index, bool* active)
{
if (index < 1 || index > model::tallies.size()) {
set_errmsg("Index in tallies array is out of bounds.");
return OPENMC_E_OUT_OF_BOUNDS;
}
//TODO: off-by-one
*active = model::tallies[index-1]->active_;
}
extern "C" int
openmc_tally_set_active(int32_t index, bool active)
{
if (index < 1 || index > model::tallies.size()) {
set_errmsg("Index in tallies array is out of bounds.");
return OPENMC_E_OUT_OF_BOUNDS;
}
//TODO: off-by-one
model::tallies[index-1]->active_ = active;
}
extern "C" int
openmc_tally_get_filters(int32_t index, const int32_t** indices, int* n)
{
@ -196,6 +225,7 @@ openmc_tally_get_filters(int32_t index, const int32_t** indices, int* n)
return OPENMC_E_OUT_OF_BOUNDS;
}
//TODO: off-by-one
*indices = model::tallies[index-1]->filters().data();
*n = model::tallies[index-1]->filters().size();
return 0;
@ -236,6 +266,10 @@ extern "C" {
model::tallies.push_back(std::make_unique<Tally>());
}
int tally_get_estimator_c(Tally* tally) {return tally->estimator_;}
void tally_set_estimator_c(Tally* tally, int e) {tally->estimator_ = e;}
void tally_set_filters_c(Tally* tally, int n, int32_t filter_indices[])
{tally->set_filters(filter_indices, n);}

View file

@ -47,7 +47,21 @@ module tally_header
integer(C_INT), value, intent(in) :: n
integer(C_INT32_T), intent(in) :: filter_indices(n)
integer(C_INT) :: err
end function openmc_tally_set_filters
end function
function openmc_tally_set_active(index, active) result(err) bind(C)
import C_INT32_T, C_BOOL, C_INT
integer(C_INT32_T), value, intent(in) :: index
logical(C_BOOL), value, intent(in) :: active
integer(C_INT) :: err
end function
function openmc_tally_get_active(index, active) result(err) bind(C)
import C_INT32_T, C_BOOL, C_INT
integer(C_INT32_T), value :: index
logical(C_BOOL), intent(out) :: active
integer(C_INT) :: err
end function
end interface
!===============================================================================
@ -64,9 +78,9 @@ module tally_header
integer :: id ! user-defined identifier
character(len=104) :: name = "" ! user-defined name
integer :: type = TALLY_VOLUME ! volume, surface current
integer :: estimator = ESTIMATOR_TRACKLENGTH ! collision, track-length
!integer :: estimator = ESTIMATOR_TRACKLENGTH ! collision, track-length
real(8) :: volume ! volume of region
logical :: active = .false.
!logical :: active = .false.
logical :: depletion_rx = .false. ! has depletion reactions, e.g. (n,2n)
! Individual nuclides to tally
@ -98,6 +112,8 @@ module tally_header
procedure :: allocate_results => tally_allocate_results
procedure :: read_results_hdf5 => tally_read_results_hdf5
procedure :: write_results_hdf5 => tally_write_results_hdf5
procedure :: estimator => tally_get_estimator
procedure :: set_estimator => tally_set_estimator
procedure :: n_filters => tally_get_n_filters
procedure :: filter => tally_get_filter
procedure :: stride => tally_get_stride
@ -282,6 +298,32 @@ contains
end subroutine tally_allocate_results
function tally_get_estimator(this) result(e)
class(TallyObject) :: this
integer(C_INT) :: e
interface
function tally_get_estimator_c(tally) result(e) bind(C)
import C_PTR, C_INT
type(C_PTR), value :: tally
integer(C_INT) :: e
end function
end interface
e = tally_get_estimator_c(this % ptr)
end function
subroutine tally_set_estimator(this, e)
class(TallyObject) :: this
integer(C_INT) :: e
interface
subroutine tally_set_estimator_c(tally, e) bind(C)
import C_PTR, C_INT
type(C_PTR), value :: tally
integer(C_INT), value :: e
end subroutine
end interface
call tally_set_estimator_c(this % ptr, e)
end subroutine
function tally_get_n_filters(this) result(n)
class(TallyObject) :: this
integer(C_INT) :: n
@ -561,22 +603,6 @@ contains
end function openmc_global_tallies
function openmc_tally_get_active(index, active) result(err) bind(C)
! Return whether a tally is active
integer(C_INT32_T), value :: index
logical(C_BOOL), intent(out) :: active
integer(C_INT) :: err
if (index >= 1 .and. index <= size(tallies)) then
active = tallies(index) % obj % active
err = 0
else
err = E_OUT_OF_BOUNDS
call set_errmsg('Index in tallies array is out of bounds.')
end if
end function openmc_tally_get_active
function openmc_tally_get_estimator(index, estimator) result(err) bind(C)
! Return the type of estimator of a tally
integer(C_INT32_T), value :: index
@ -584,7 +610,7 @@ contains
integer(C_INT) :: err
if (index >= 1 .and. index <= size(tallies)) then
estimator = tallies(index) % obj % estimator
estimator = tallies(index) % obj % estimator()
err = 0
else
err = E_OUT_OF_BOUNDS
@ -755,11 +781,11 @@ contains
if (index >= 1 .and. index <= size(tallies)) then
select case (estimator_)
case ('analog')
tallies(index) % obj % estimator = ESTIMATOR_ANALOG
call tallies(index) % obj % set_estimator(ESTIMATOR_ANALOG)
case ('tracklength')
tallies(index) % obj % estimator = ESTIMATOR_TRACKLENGTH
call tallies(index) % obj % set_estimator(ESTIMATOR_TRACKLENGTH)
case ('collision')
tallies(index) % obj % estimator = ESTIMATOR_COLLISION
call tallies(index) % obj % set_estimator(ESTIMATOR_COLLISION)
case default
err = E_INVALID_ARGUMENT
call set_errmsg("Unknown tally estimator: " // trim(estimator_))
@ -771,27 +797,6 @@ contains
end function openmc_tally_set_estimator
function openmc_tally_set_active(index, active) result(err) bind(C)
! Set the ID of a tally
integer(C_INT32_T), value, intent(in) :: index
logical(C_BOOL), value, intent(in) :: active
integer(C_INT) :: err
if (index >= 1 .and. index <= n_tallies) then
if (allocated(tallies(index) % obj)) then
tallies(index) % obj % active = active
err = 0
else
err = E_ALLOCATE
call set_errmsg("Tally type has not been set yet.")
end if
else
err = E_OUT_OF_BOUNDS
call set_errmsg('Index in tallies array is out of bounds.')
end if
end function openmc_tally_set_active
function openmc_tally_set_id(index, id) result(err) bind(C)
! Set the ID of a tally
integer(C_INT32_T), value, intent(in) :: index