mirror of
https://github.com/openmc-dev/openmc.git
synced 2026-07-27 21:55:41 -04:00
Move remaining functions in mgxs_data.F90
This commit is contained in:
parent
06751d5373
commit
eb576a6fd2
6 changed files with 57 additions and 147 deletions
|
|
@ -323,7 +323,6 @@ add_library(libopenmc SHARED
|
|||
src/math.F90
|
||||
src/mesh_header.F90
|
||||
src/message_passing.F90
|
||||
src/mgxs_data.F90
|
||||
src/mgxs_interface.F90
|
||||
src/multipole_header.F90
|
||||
src/nuclide_header.F90
|
||||
|
|
|
|||
|
|
@ -33,17 +33,13 @@ extern std::vector<double> rev_energy_bins;
|
|||
|
||||
void read_mgxs();
|
||||
|
||||
extern "C" void
|
||||
add_mgxs_c(hid_t file_id, const std::string& name,
|
||||
void
|
||||
add_mgxs(hid_t file_id, const std::string& name,
|
||||
const std::vector<double>& temperature);
|
||||
|
||||
extern "C" bool
|
||||
query_fissionable_c(int n_nuclides, const int i_nuclides[]);
|
||||
void create_macro_xs();
|
||||
|
||||
extern "C" void
|
||||
create_macro_xs_c(const char* mat_name, int n_nuclides, const int i_nuclides[],
|
||||
int n_temps, const double temps[], const double atom_densities[],
|
||||
double tolerance, int& method);
|
||||
std::vector<std::vector<double>> get_mat_kTs();
|
||||
|
||||
extern "C" void read_mg_cross_sections_header_c(hid_t file_id);
|
||||
|
||||
|
|
|
|||
|
|
@ -29,7 +29,6 @@
|
|||
#include "openmc/timer.h"
|
||||
|
||||
// data/functions from Fortran side
|
||||
extern "C" void create_macro_xs();
|
||||
extern "C" void normalize_ao();
|
||||
extern "C" void print_usage();
|
||||
extern "C" void print_version();
|
||||
|
|
|
|||
|
|
@ -1,95 +0,0 @@
|
|||
module mgxs_data
|
||||
|
||||
use, intrinsic :: ISO_C_BINDING
|
||||
|
||||
use constants
|
||||
use algorithm, only: find
|
||||
use dict_header, only: DictCharInt
|
||||
use error, only: fatal_error, write_message
|
||||
use geometry_header, only: cells
|
||||
use hdf5_interface
|
||||
use material_header, only: Material, materials, n_materials
|
||||
use mgxs_interface
|
||||
use nuclide_header, only: n_nuclides
|
||||
use set_header, only: SetChar
|
||||
use settings
|
||||
use stl_vector, only: VectorReal, VectorChar
|
||||
use string, only: to_lower
|
||||
implicit none
|
||||
|
||||
contains
|
||||
|
||||
!===============================================================================
|
||||
! CREATE_MACRO_XS generates the macroscopic xs from the microscopic input data
|
||||
!===============================================================================
|
||||
|
||||
subroutine create_macro_xs() bind(C)
|
||||
integer :: i_mat ! index in materials array
|
||||
type(Material), pointer :: mat ! current material
|
||||
type(VectorReal), allocatable :: kTs(:)
|
||||
character(MAX_WORD_LEN) :: name ! name of material
|
||||
|
||||
! Get temperatures to read for each material
|
||||
call get_mat_kTs(kTs)
|
||||
|
||||
! Force all nuclides in a material to be the same representation.
|
||||
! Therefore type(nuclides(mat % nuclide(1)) % obj) dictates type(macroxs).
|
||||
! At the same time, we will find the scattering type, as that will dictate
|
||||
! how we allocate the scatter object within macroxs.allocate(macro_xs(n_materials))
|
||||
do i_mat = 1, n_materials
|
||||
|
||||
! Get the material
|
||||
mat => materials(i_mat)
|
||||
|
||||
name = trim(mat % name) // C_NULL_CHAR
|
||||
|
||||
call create_macro_xs_c(name, mat % n_nuclides, mat % nuclide, &
|
||||
kTs(i_mat) % size(), kTs(i_mat) % data, mat % atom_density, &
|
||||
temperature_tolerance, temperature_method)
|
||||
end do
|
||||
|
||||
end subroutine create_macro_xs
|
||||
|
||||
!===============================================================================
|
||||
! GET_MAT_kTs returns a list of temperatures (in eV) that each
|
||||
! material appears at in the model.
|
||||
!===============================================================================
|
||||
|
||||
subroutine get_mat_kTs(kTs)
|
||||
|
||||
type(VectorReal), allocatable, intent(out) :: kTs(:)
|
||||
integer :: i, j ! Cell and material index
|
||||
integer :: i_material ! Index in materials array
|
||||
real(8) :: kT ! temperature in eV
|
||||
|
||||
allocate(kTs(size(materials)))
|
||||
|
||||
do i = 1, size(cells)
|
||||
! Skip non-material cells
|
||||
if (cells(i) % fill() /= C_NONE) cycle
|
||||
|
||||
do j = 1, cells(i) % material_size()
|
||||
|
||||
! Skip void materials
|
||||
if (cells(i) % material(j) == MATERIAL_VOID) cycle
|
||||
|
||||
! Get temperature of cell (rounding to nearest integer)
|
||||
if (cells(i) % sqrtkT_size() > 1) then
|
||||
kT = cells(i) % sqrtkT(j-1)**2
|
||||
else
|
||||
kT = cells(i) % sqrtkT(0)**2
|
||||
end if
|
||||
|
||||
i_material = cells(i) % material(j)
|
||||
|
||||
! Add temperature if it hasn't already been added
|
||||
if (find(kTs(i_material), kT) == -1) then
|
||||
call kTs(i_material) % push_back(kT)
|
||||
end if
|
||||
|
||||
end do
|
||||
end do
|
||||
|
||||
end subroutine get_mat_kTs
|
||||
|
||||
end module mgxs_data
|
||||
|
|
@ -7,20 +7,6 @@ module mgxs_interface
|
|||
implicit none
|
||||
|
||||
interface
|
||||
subroutine create_macro_xs_c(name, n_nuclides, i_nuclides, n_temps, temps, &
|
||||
atom_densities, tolerance, method) bind(C)
|
||||
use ISO_C_BINDING
|
||||
implicit none
|
||||
character(kind=C_CHAR),intent(in) :: name(*)
|
||||
integer(C_INT), value, intent(in) :: n_nuclides
|
||||
integer(C_INT), intent(in) :: i_nuclides(1:n_nuclides)
|
||||
integer(C_INT), value, intent(in) :: n_temps
|
||||
real(C_DOUBLE), intent(in) :: temps(1:n_temps)
|
||||
real(C_DOUBLE), intent(in) :: atom_densities(1:n_nuclides)
|
||||
real(C_DOUBLE), value, intent(in) :: tolerance
|
||||
integer(C_INT), intent(inout) :: method
|
||||
end subroutine create_macro_xs_c
|
||||
|
||||
subroutine calculate_xs_c(i_mat, gin, sqrtkT, uvw, total_xs, abs_xs, &
|
||||
nu_fiss_xs) bind(C)
|
||||
use ISO_C_BINDING
|
||||
|
|
|
|||
|
|
@ -3,7 +3,9 @@
|
|||
#include <string>
|
||||
#include <unordered_set>
|
||||
|
||||
#include "openmc/cell.h"
|
||||
#include "openmc/cross_sections.h"
|
||||
#include "openmc/container_util.h"
|
||||
#include "openmc/error.h"
|
||||
#include "openmc/file_utils.h"
|
||||
#include "openmc/geometry_aux.h"
|
||||
|
|
@ -84,7 +86,7 @@ void read_mgxs()
|
|||
std::string& name = nuclide_names[i_nuc];
|
||||
|
||||
if (already_read.find(name) == already_read.end()) {
|
||||
add_mgxs_c(file_id, name, nuc_temps[i_nuc]);
|
||||
add_mgxs(file_id, name, nuc_temps[i_nuc]);
|
||||
already_read.insert(name);
|
||||
}
|
||||
|
||||
|
|
@ -97,8 +99,10 @@ void read_mgxs()
|
|||
file_close(file_id);
|
||||
}
|
||||
|
||||
//==============================================================================
|
||||
|
||||
void
|
||||
add_mgxs_c(hid_t file_id, const std::string& name,
|
||||
add_mgxs(hid_t file_id, const std::string& name,
|
||||
const std::vector<double>& temperature)
|
||||
{
|
||||
write_message("Loading " + std::string(name) + " data...", 6);
|
||||
|
|
@ -118,43 +122,64 @@ add_mgxs_c(hid_t file_id, const std::string& name,
|
|||
|
||||
//==============================================================================
|
||||
|
||||
bool
|
||||
query_fissionable_c(int n_nuclides, const int i_nuclides[])
|
||||
void create_macro_xs()
|
||||
{
|
||||
bool result = false;
|
||||
for (int n = 0; n < n_nuclides; n++) {
|
||||
if (data::nuclides_MG[i_nuclides[n] - 1].fissionable) result = true;
|
||||
// Get temperatures to read for each material
|
||||
auto kTs = get_mat_kTs();
|
||||
|
||||
// Force all nuclides in a material to be the same representation.
|
||||
// Therefore type(nuclides[mat->nuclide_[0]]) dictates type(macroxs).
|
||||
// At the same time, we will find the scattering type, as that will dictate
|
||||
// how we allocate the scatter object within macroxs.
|
||||
for (int i = 0; i < model::materials.size(); ++i) {
|
||||
if (kTs[i].size() > 0) {
|
||||
// Convert atom_densities to a vector
|
||||
Material* mat = model::materials[i];
|
||||
std::vector<double> atom_densities(mat->atom_density_.begin(),
|
||||
mat->atom_density_.end());
|
||||
|
||||
// Build array of pointers to nuclides_MG's Mgxs objects needed for this
|
||||
// material
|
||||
std::vector<Mgxs*> mgxs_ptr;
|
||||
for (int i_nuclide : mat->nuclide_) {
|
||||
mgxs_ptr.push_back(&data::nuclides_MG[i_nuclide]);
|
||||
}
|
||||
|
||||
data::macro_xs.emplace_back(mat->name_, kTs[i], mgxs_ptr, atom_densities);
|
||||
} else {
|
||||
// Preserve the ordering of materials by including a blank entry
|
||||
data::macro_xs.emplace_back();
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
//==============================================================================
|
||||
|
||||
void
|
||||
create_macro_xs_c(const char* mat_name, int n_nuclides, const int i_nuclides[],
|
||||
int n_temps, const double temps[], const double atom_densities[],
|
||||
double tolerance, int& method)
|
||||
std::vector<std::vector<double>> get_mat_kTs()
|
||||
{
|
||||
if (n_temps > 0) {
|
||||
// // Convert temps to a vector
|
||||
std::vector<double> temperature(temps, temps + n_temps);
|
||||
std::vector<std::vector<double>> kTs(model::materials.size());
|
||||
|
||||
// Convert atom_densities to a vector
|
||||
std::vector<double> atom_densities_vec(atom_densities,
|
||||
atom_densities + n_nuclides);
|
||||
for (const auto& cell : model::cells) {
|
||||
// Skip non-material cells
|
||||
if (cell->fill_ != C_NONE) continue;
|
||||
|
||||
// Build array of pointers to nuclides_MG's Mgxs objects needed for this
|
||||
// material
|
||||
std::vector<Mgxs*> mgxs_ptr(n_nuclides);
|
||||
for (int n = 0; n < n_nuclides; n++) {
|
||||
mgxs_ptr[n] = &data::nuclides_MG[i_nuclides[n] - 1];
|
||||
for (int j = 0; j < cell->material_.size(); ++j) {
|
||||
// Skip void materials
|
||||
int i_material = cell->material_[j];
|
||||
if (i_material == MATERIAL_VOID) continue;
|
||||
|
||||
// Get temperature of cell (rounding to nearest integer)
|
||||
double sqrtkT = cell->sqrtkT_.size() == 1 ?
|
||||
cell->sqrtkT_[j] : cell->sqrtkT_[0];
|
||||
double kT = sqrtkT * sqrtkT;
|
||||
|
||||
// Add temperature if it hasn't already been added
|
||||
if (!contains(kTs[i_material], kT)) {
|
||||
kTs[i_material].push_back(kT);
|
||||
}
|
||||
}
|
||||
|
||||
data::macro_xs.emplace_back(mat_name, temperature, mgxs_ptr, atom_densities_vec);
|
||||
} else {
|
||||
// Preserve the ordering of materials by including a blank entry
|
||||
data::macro_xs.emplace_back();
|
||||
}
|
||||
return kTs;
|
||||
}
|
||||
|
||||
//==============================================================================
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue