Remove surfaces on Fortran side

This commit is contained in:
Paul Romano 2019-02-13 23:20:19 -06:00
parent f8925b25be
commit a1de6b82a2
6 changed files with 23 additions and 222 deletions

View file

@ -336,7 +336,6 @@ add_library(libopenmc SHARED
src/state_point.F90
src/stl_vector.F90
src/string.F90
src/surface_header.F90
src/track_output.F90
src/vector_header.F90
src/xml_interface.F90

View file

@ -64,7 +64,6 @@ contains
use photon_header
use settings
use simulation_header
use surface_header
use tally_filter_header
use tally_header
@ -90,6 +89,9 @@ contains
subroutine free_memory_volume() bind(C)
end subroutine
subroutine free_memory_surfaces() bind(C)
end subroutine
subroutine sab_clear() bind(C)
end subroutine
end interface

View file

@ -5,8 +5,6 @@ module geometry
use particle_header
use simulation_header
use settings
use surface_header
use string, only: to_str
use, intrinsic :: ISO_C_BINDING

View file

@ -19,7 +19,6 @@ module input_xml
use nuclide_header
use photon_header
use random_lcg, only: prn
use surface_header
use settings
use stl_vector, only: VectorInt, VectorReal, VectorChar
use string, only: to_lower, to_str, str_to_int, &
@ -116,7 +115,6 @@ contains
call write_message("Reading DAGMC geometry...", 5)
call load_dagmc_geometry()
call allocate_surfaces()
call allocate_cells()
! setup universe data structs
@ -153,7 +151,6 @@ contains
integer :: n_cells_in_univ
real(8) :: phi, theta, psi
logical :: file_exists
logical :: boundary_exists
character(MAX_LINE_LEN) :: filename
type(Cell), pointer :: c
type(XMLDocument) :: doc
@ -188,28 +185,8 @@ contains
! ==========================================================================
! READ SURFACES FROM GEOMETRY.XML
! This variable is used to check whether at least one boundary condition was
! applied to a surface
boundary_exists = .false.
call read_surfaces(root % ptr)
! Allocate surfaces array
allocate(surfaces(surfaces_size()))
do i = 1, size(surfaces)
surfaces(i) % ptr = surface_pointer(i - 1);
if (surfaces(i) % bc() /= BC_TRANSMIT) boundary_exists = .true.
end do
! Check to make sure a boundary condition was applied to at least one
! surface
if (run_mode /= MODE_PLOTTING) then
if (.not. boundary_exists) then
call fatal_error("No boundary conditions were applied to any surfaces!")
end if
end if
! ==========================================================================
! READ CELLS FROM GEOMETRY.XML
@ -316,18 +293,6 @@ contains
end subroutine read_geometry_xml
subroutine allocate_surfaces()
integer :: i
! Allocate surfaces array
allocate(surfaces(surfaces_size()))
do i = 1, size(surfaces)
surfaces(i) % ptr = surface_pointer(i - 1);
end do
end subroutine allocate_surfaces
subroutine allocate_cells()
integer :: i
type(Cell), pointer :: c

View file

@ -7,8 +7,9 @@
#include "openmc/error.h"
#include "openmc/hdf5_interface.h"
#include "openmc/xml_interface.h"
#include "openmc/settings.h"
#include "openmc/string_utils.h"
#include "openmc/xml_interface.h"
namespace openmc {
@ -1243,59 +1244,30 @@ read_surfaces(pugi::xml_node* node)
}
}
}
// Check to make sure a boundary condition was applied to at least one
// surface
bool boundary_exists = false;
for (const auto& surf : model::surfaces) {
if (surf->bc_ != BC_TRANSMIT) {
boundary_exists = true;
break;
}
}
if (settings::run_mode != RUN_MODE_PLOTTING && !boundary_exists) {
fatal_error("No boundary conditions were applied to any surfaces!");
}
}
//==============================================================================
// Fortran compatibility functions
//==============================================================================
extern "C" {
Surface* surface_pointer(int surf_ind) {return model::surfaces[surf_ind];}
int surface_id(Surface* surf) {return surf->id_;}
int surface_bc(Surface* surf) {return surf->bc_;}
void surface_reflect(Surface* surf, double xyz[3], double uvw[3])
{
Position r {xyz};
Direction u {uvw};
u = surf->reflect(r, u);
uvw[0] = u.x;
uvw[1] = u.y;
uvw[2] = u.z;
}
int surface_i_periodic(PeriodicSurface* surf) {return surf->i_periodic_;}
bool
surface_periodic(PeriodicSurface* surf, PeriodicSurface* other, double xyz[3],
double uvw[3])
{
Position r {xyz};
Direction u {uvw};
bool rotational = surf->periodic_translate(other, r, u);
// Copy back to arrays
xyz[0] = r.x;
xyz[1] = r.y;
xyz[2] = r.z;
uvw[0] = u.x;
uvw[1] = u.y;
uvw[2] = u.z;
return rotational;
}
void free_memory_surfaces_c()
{
for (Surface* surf : model::surfaces) {delete surf;}
model::surfaces.clear();
model::surface_map.clear();
}
int surfaces_size() { return model::surfaces.size(); }
extern "C" void free_memory_surfaces()
{
for (Surface* surf : model::surfaces) {delete surf;}
model::surfaces.clear();
model::surface_map.clear();
}
} // namespace openmc

View file

@ -1,135 +0,0 @@
module surface_header
use, intrinsic :: ISO_C_BINDING
use hdf5_interface
implicit none
interface
pure function surface_pointer(surf_ind) bind(C) result(ptr)
use ISO_C_BINDING
implicit none
integer(C_INT), intent(in), value :: surf_ind
type(C_PTR) :: ptr
end function surface_pointer
pure function surface_id_c(surf_ptr) bind(C, name='surface_id') result(id)
use ISO_C_BINDING
implicit none
type(C_PTR), intent(in), value :: surf_ptr
integer(C_INT) :: id
end function surface_id_c
pure function surface_bc_c(surf_ptr) bind(C, name='surface_bc') result(bc)
use ISO_C_BINDING
implicit none
type(C_PTR), intent(in), value :: surf_ptr
integer(C_INT) :: bc
end function surface_bc_c
pure subroutine surface_reflect_c(surf_ptr, xyz, uvw) &
bind(C, name='surface_reflect')
use ISO_C_BINDING
implicit none
type(C_PTR), intent(in), value :: surf_ptr
real(C_DOUBLE), intent(in) :: xyz(3);
real(C_DOUBLE), intent(inout) :: uvw(3);
end subroutine surface_reflect_c
pure function surface_i_periodic_c(surf_ptr) &
bind(C, name="surface_i_periodic") result(i_periodic)
use ISO_C_BINDING
implicit none
type(C_PTR), intent(in), value :: surf_ptr
integer(C_INT) :: i_periodic
end function surface_i_periodic_c
function surface_periodic_c(surf_ptr, other_ptr, xyz, uvw) &
bind(C, name="surface_periodic") result(rotational)
use ISO_C_BINDING
implicit none
type(C_PTR), intent(in), value :: surf_ptr
type(C_PTR), intent(in), value :: other_ptr
real(C_DOUBLE), intent(inout) :: xyz(3);
real(C_DOUBLE), intent(inout) :: uvw(3);
logical(C_BOOL) :: rotational
end function surface_periodic_c
subroutine free_memory_surfaces_c() bind(C)
end subroutine free_memory_surfaces_c
end interface
!===============================================================================
! SURFACE type defines a first- or second-order surface that can be used to
! construct closed volumes (cells)
!===============================================================================
type :: Surface
type(C_PTR) :: ptr
contains
procedure :: id => surface_id
procedure :: bc => surface_bc
procedure :: reflect => surface_reflect
procedure :: i_periodic => surface_i_periodic
procedure :: periodic_translate => surface_periodic
end type Surface
type(Surface), allocatable, target :: surfaces(:)
interface
function surfaces_size() result(sz) bind(C)
import C_INT
integer(C_INT) :: sz
end function
end interface
contains
pure function surface_id(this) result(id)
class(Surface), intent(in) :: this
integer(C_INT) :: id
id = surface_id_c(this % ptr)
end function surface_id
pure function surface_bc(this) result(bc)
class(Surface), intent(in) :: this
integer(C_INT) :: bc
bc = surface_bc_c(this % ptr)
end function surface_bc
pure subroutine surface_reflect(this, xyz, uvw)
class(Surface), intent(in) :: this
real(C_DOUBLE), intent(in) :: xyz(3);
real(C_DOUBLE), intent(inout) :: uvw(3);
call surface_reflect_c(this % ptr, xyz, uvw)
end subroutine surface_reflect
pure function surface_i_periodic(this) result(i_periodic)
class(Surface), intent(in) :: this
integer(C_INT) :: i_periodic
i_periodic = surface_i_periodic_c(this % ptr)
end function surface_i_periodic
function surface_periodic(this, other, xyz, uvw) result(rotational)
class(Surface), intent(in) :: this
class(Surface), intent(in) :: other
real(C_DOUBLE), intent(inout) :: xyz(3);
real(C_DOUBLE), intent(inout) :: uvw(3);
logical(C_BOOL) :: rotational
rotational = surface_periodic_c(this % ptr, other % ptr, xyz, uvw)
end function surface_periodic
!===============================================================================
! FREE_MEMORY_SURFACES deallocates global arrays defined in this module
!===============================================================================
subroutine free_memory_surfaces()
if (allocated(surfaces)) deallocate(surfaces)
call free_memory_surfaces_c()
end subroutine free_memory_surfaces
end module surface_header