From 88489cb62684b39fc4017fd94fa446ee674fa731 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Fri, 2 Dec 2022 08:34:01 -0500 Subject: [PATCH] Restructured encounter io with new dimension for the collidiers so I can reuse the regular variables from before --- src/encounter/encounter_io.f90 | 46 ++++++++++++++++++++----------- src/modules/encounter_classes.f90 | 43 +++++++---------------------- src/modules/swiftest_globals.f90 | 1 - 3 files changed, 40 insertions(+), 50 deletions(-) diff --git a/src/encounter/encounter_io.f90 b/src/encounter/encounter_io.f90 index 5530b61e6..f858d83cf 100644 --- a/src/encounter/encounter_io.f90 +++ b/src/encounter/encounter_io.f90 @@ -55,6 +55,7 @@ module subroutine encounter_io_initialize_output(self, param) call check( nf90_def_dim(self%ncid, ENCID_DIMNAME, NF90_UNLIMITED, self%encid_dimid), "encounter_io_initialize_output nf90_def_dim encid_dimid" ) call check( nf90_def_dim(self%ncid, STR_DIMNAME, NAMELEN, self%str_dimid), "encounter_io_initialize_output nf90_def_dim str_dimid" ) ! Dimension for string variables (aka character arrays) call check( nf90_def_dim(self%ncid, TIME_DIMNAME, NF90_UNLIMITED, self%time_dimid), "encounter_io_initialize_output nf90_def_dim time_dimid" ) ! 'y' dimension + call check( nf90_def_dim(self%ncid, COLLIDER_DIMNAME, COLLIDER_DIM_SIZE, self%collider_dimid), "encounter_io_initialize_output nf90_def_dim time_dimid" ) ! 'y' dimension select case (param%out_type) case("NETCDF_FLOAT") @@ -65,21 +66,16 @@ module subroutine encounter_io_initialize_output(self, param) call check( nf90_def_var(self%ncid, TIME_DIMNAME, self%out_type, self%time_dimid, self%time_varid), "encounter_io_initialize_output nf90_def_var time_varid" ) call check( nf90_def_var(self%ncid, ENCID_DIMNAME, NF90_INT, self%encid_dimid, self%encid_varid), "encounter_io_initialize_output nf90_def_var encid_varid" ) + call check( nf90_def_var(self%ncid, COLLIDER_DIMNAME, NF90_INT, self%collider_dimid, self%encid_varid), "encounter_io_initialize_output nf90_def_var collider_varid" ) call check( nf90_def_var(self%ncid, NENC_VARNAME, NF90_INT, self%time_dimid, self%nenc_varid), "encounter_io_initialize_output nf90_def_var nenc_varid" ) - call check( nf90_def_var(self%ncid, ID1_VARNAME, NF90_INT, [self%encid_dimid, self%time_dimid], self%id1_varid), "encounter_io_initialize_output nf90_def_var id1_varid" ) - call check( nf90_def_var(self%ncid, ID2_VARNAME, NF90_INT, [self%encid_dimid, self%time_dimid], self%id2_varid), "encounter_io_initialize_output nf90_def_var id2_varid" ) - call check( nf90_def_var(self%ncid, X1X_VARNAME, self%out_type, [self%encid_dimid, self%time_dimid], self%x1x_varid), "encounter_io_initialize_output nf90_def_var x1x_varid" ) - call check( nf90_def_var(self%ncid, X1Y_VARNAME, self%out_type, [self%encid_dimid, self%time_dimid], self%x1y_varid), "encounter_io_initialize_output nf90_def_var x1y_varid" ) - call check( nf90_def_var(self%ncid, X1Z_VARNAME, self%out_type, [self%encid_dimid, self%time_dimid], self%x1z_varid), "encounter_io_initialize_output nf90_def_var x1z_varid" ) - call check( nf90_def_var(self%ncid, X2X_VARNAME, self%out_type, [self%encid_dimid, self%time_dimid], self%x2x_varid), "encounter_io_initialize_output nf90_def_var x2x_varid" ) - call check( nf90_def_var(self%ncid, X2Y_VARNAME, self%out_type, [self%encid_dimid, self%time_dimid], self%x2y_varid), "encounter_io_initialize_output nf90_def_var x2y_varid" ) - call check( nf90_def_var(self%ncid, X2Z_VARNAME, self%out_type, [self%encid_dimid, self%time_dimid], self%x2z_varid), "encounter_io_initialize_output nf90_def_var x2z_varid" ) - call check( nf90_def_var(self%ncid, V1X_VARNAME, self%out_type, [self%encid_dimid, self%time_dimid], self%v1x_varid), "encounter_io_initialize_output nf90_def_var v1x_varid" ) - call check( nf90_def_var(self%ncid, V1Y_VARNAME, self%out_type, [self%encid_dimid, self%time_dimid], self%v1y_varid), "encounter_io_initialize_output nf90_def_var v1y_varid" ) - call check( nf90_def_var(self%ncid, V1Z_VARNAME, self%out_type, [self%encid_dimid, self%time_dimid], self%v1z_varid), "encounter_io_initialize_output nf90_def_var v1z_varid" ) - call check( nf90_def_var(self%ncid, V2X_VARNAME, self%out_type, [self%encid_dimid, self%time_dimid], self%v2x_varid), "encounter_io_initialize_output nf90_def_var v2x_varid" ) - call check( nf90_def_var(self%ncid, V2Y_VARNAME, self%out_type, [self%encid_dimid, self%time_dimid], self%v2y_varid), "encounter_io_initialize_output nf90_def_var v2y_varid" ) - call check( nf90_def_var(self%ncid, V2Z_VARNAME, self%out_type, [self%encid_dimid, self%time_dimid], self%v2z_varid), "encounter_io_initialize_output nf90_def_var v2z_varid" ) + call check( nf90_def_var(self%ncid, NAME_VARNAME, NF90_CHAR, [self%str_dimid, self%collider_dimid, self%encid_dimid], self%name_varid), "encounter_io_initialize_output nf90_def_var name_varid" ) + call check( nf90_def_var(self%ncid, ID_DIMNAME, NF90_INT, [self%collider_dimid, self%encid_dimid, self%time_dimid], self%id_varid), "encounter_io_initialize_output nf90_def_var id_varid" ) + call check( nf90_def_var(self%ncid, XHX_VARNAME, self%out_type, [self%collider_dimid, self%encid_dimid, self%time_dimid], self%xhx_varid), "encounter_io_initialize_output nf90_def_var xhx_varid" ) + call check( nf90_def_var(self%ncid, XHY_VARNAME, self%out_type, [self%collider_dimid, self%encid_dimid, self%time_dimid], self%xhy_varid), "encounter_io_initialize_output nf90_def_var xhy_varid" ) + call check( nf90_def_var(self%ncid, XHZ_VARNAME, self%out_type, [self%collider_dimid, self%encid_dimid, self%time_dimid], self%xhz_varid), "encounter_io_initialize_output nf90_def_var xhz_varid" ) + call check( nf90_def_var(self%ncid, VHX_VARNAME, self%out_type, [self%collider_dimid, self%encid_dimid, self%time_dimid], self%vhx_varid), "encounter_io_initialize_output nf90_def_var vhx_varid" ) + call check( nf90_def_var(self%ncid, VHY_VARNAME, self%out_type, [self%collider_dimid, self%encid_dimid, self%time_dimid], self%vhy_varid), "encounter_io_initialize_output nf90_def_var vhy_varid" ) + call check( nf90_def_var(self%ncid, VHZ_VARNAME, self%out_type, [self%collider_dimid, self%encid_dimid, self%time_dimid], self%vhz_varid), "encounter_io_initialize_output nf90_def_var vhz_varid" ) call check( nf90_def_var(self%ncid, LEVEL_VARNAME, NF90_INT, [self%encid_dimid, self%time_dimid], self%level_varid), "encounter_io_initialize_output nf90_def_var level_varid" ) @@ -105,7 +101,6 @@ module subroutine encounter_io_open_file(self, param, readonly) logical, optional, intent(in) :: readonly !! Logical flag indicating that this should be open read only ! Internals integer(I4B) :: mode, status - character(len=NF90_MAX_NAME) :: str_dim_name character(len=STRMAX) :: errmsg mode = NF90_WRITE @@ -113,9 +108,28 @@ module subroutine encounter_io_open_file(self, param, readonly) if (readonly) mode = NF90_NOWRITE end if - write(errmsg,*) "netcdf_open nf90_open ",trim(adjustl(param%outfile)) + write(errmsg,*) "encounter_io_open_file nf90_open ",trim(adjustl(param%outfile)) call check( nf90_open(self%outfile, mode, self%ncid), errmsg) + call check( nf90_inq_dimid(self%ncid, TIME_DIMNAME, self%time_dimid), "encounter_io_open_file nf90_inq_dimid time_dimid" ) + call check( nf90_inq_dimid(self%ncid, ENCID_DIMNAME, self%encid_dimid), "encounter_io_open_file nf90_inq_dimid encid_dimid" ) + call check( nf90_inq_dimid(self%ncid, COLLIDER_DIMNAME, self%collider_dimid), "encounter_io_open_file nf90_inq_dimid collider_dimid" ) + call check( nf90_inq_dimid(self%ncid, STR_DIMNAME, self%str_dimid), "encounter_io_open_file nf90_inq_dimid collider_str" ) + + call check( nf90_inq_varid(self%ncid, TIME_DIMNAME, self%time_varid), "encounter_io_open_file nf90_inq_varid time_varid" ) + call check( nf90_inq_varid(self%ncid, ENCID_DIMNAME, self%encid_varid), "encounter_io_open_file nf90_inq_varid encid_varid" ) + call check( nf90_inq_varid(self%ncid, COLLIDER_DIMNAME, self%collider_varid), "encounter_io_open_file nf90_inq_varid collider_varid" ) + call check( nf90_inq_varid(self%ncid, NAME_VARNAME, self%name_varid), "encounter_io_open_file nf90_inq_varid name_varid" ) + call check( nf90_inq_varid(self%ncid, NENC_VARNAME, self%nenc_varid), "encounter_io_open_file nf90_inq_varid nenc_varid" ) + + call check( nf90_inq_varid(self%ncid, XHX_VARNAME, self%xhx_varid), "encounter_io_open_file nf90_inq_varid xhx_varid" ) + call check( nf90_inq_varid(self%ncid, XHY_VARNAME, self%xhy_varid), "encounter_io_open_file nf90_inq_varid xhy_varid" ) + call check( nf90_inq_varid(self%ncid, XHZ_VARNAME, self%xhz_varid), "encounter_io_open_file nf90_inq_varid xhz_varid" ) + call check( nf90_inq_varid(self%ncid, VHX_VARNAME, self%vhx_varid), "encounter_io_open_file nf90_inq_varid vhx_varid" ) + call check( nf90_inq_varid(self%ncid, VHY_VARNAME, self%vhy_varid), "encounter_io_open_file nf90_inq_varid vhy_varid" ) + call check( nf90_inq_varid(self%ncid, VHZ_VARNAME, self%vhz_varid), "encounter_io_open_file nf90_inq_varid vhz_varid" ) + call check( nf90_inq_varid(self%ncid, LEVEL_VARNAME, self%level_varid), "encounter_io_open_file nf90_inq_varid level_varid" ) + return end subroutine encounter_io_open_file diff --git a/src/modules/encounter_classes.f90 b/src/modules/encounter_classes.f90 index 144369346..6f6cfa68f 100644 --- a/src/modules/encounter_classes.f90 +++ b/src/modules/encounter_classes.f90 @@ -17,24 +17,6 @@ module encounter_classes public integer(I4B), parameter :: SWEEPDIM = 3 - !! NetCDF dimension and variable names for the enounter save object - character(*), parameter :: ENCID_DIMNAME = "encounter" - character(*), parameter :: NENC_VARNAME = "nenc" - character(*), parameter :: ID1_VARNAME = "id1" - character(*), parameter :: ID2_VARNAME = "id2" - character(*), parameter :: X1X_VARNAME = "x1x" - character(*), parameter :: X1Y_VARNAME = "x1y" - character(*), parameter :: X1Z_VARNAME = "x1z" - character(*), parameter :: X2X_VARNAME = "x2x" - character(*), parameter :: X2Y_VARNAME = "x2y" - character(*), parameter :: X2Z_VARNAME = "x2z" - character(*), parameter :: V1X_VARNAME = "v1x" - character(*), parameter :: V1Y_VARNAME = "v1y" - character(*), parameter :: V1Z_VARNAME = "v1z" - character(*), parameter :: V2X_VARNAME = "v2x" - character(*), parameter :: V2Y_VARNAME = "v2y" - character(*), parameter :: V2Z_VARNAME = "v2z" - character(*), parameter :: LEVEL_VARNAME = "level" type :: encounter_list integer(I8B) :: nenc = 0 !! Total number of encounters @@ -64,26 +46,21 @@ module encounter_classes contains procedure :: dump => encounter_io_dump_storage_list end type encounter_storage - + + !! NetCDF dimension and variable names for the enounter save object + character(*), parameter :: ENCID_DIMNAME = "encounter" !! The index of the encountering pair in the encounter list + character(*), parameter :: COLLIDER_DIMNAME = "collider" !! Dimension that defines the colliding bodies (bodies 1 and 2 are at dimension coordinates 1 and 2, respectively) + integer(I4B), parameter :: COLLIDER_DIM_SIZE = 2 !! Size of collider dimension + character(*), parameter :: NENC_VARNAME = "nenc" !! Total number of encounters + character(*), parameter :: LEVEL_VARNAME = "level" !! Recursion depth + type, extends(netcdf_parameters) :: encounter_io_parameters character(STRMAX) :: outfile = "encounter.nc" !! Encounter output file name integer(I4B) :: encid_dimid !! NetCDF ID for the encounter pair index dimension + integer(I4B) :: collider_dimid !! NetCDF ID for the collider dimension + integer(I4B) :: collider_varid !! NetCDF ID for the collider variable integer(I4B) :: encid_varid !! NetCDF ID for the encounter pair index variable integer(I4B) :: nenc_varid !! NetCDF ID for the number of encounters variable - integer(I4B) :: id1_varid !! NetCDF ID for the id1 of the encounter variable - integer(I4B) :: id2_varid !! NetCDF ID for the id2 of the encounter variable - integer(I4B) :: x1x_varid !! NetCDF ID for the body1 x position variable - integer(I4B) :: x1y_varid !! NetCDF ID for the body1 y position variable - integer(I4B) :: x1z_varid !! NetCDF ID for the body1 z position variable - integer(I4B) :: x2x_varid !! NetCDF ID for the body2 x position variable - integer(I4B) :: x2y_varid !! NetCDF ID for the body2 y position variable - integer(I4B) :: x2z_varid !! NetCDF ID for the body2 z position variable - integer(I4B) :: v1x_varid !! NetCDF ID for the body1 x velocity variable - integer(I4B) :: v1y_varid !! NetCDF ID for the body1 y velocity variable - integer(I4B) :: v1z_varid !! NetCDF ID for the body1 z velocity variable - integer(I4B) :: v2x_varid !! NetCDF ID for the body2 x velocity variable - integer(I4B) :: v2y_varid !! NetCDF ID for the body2 y velocity variable - integer(I4B) :: v2z_varid !! NetCDF ID for the body2 z velocity variable integer(I4B) :: level_varid !! NetCDF ID for the recursion level variable contains diff --git a/src/modules/swiftest_globals.f90 b/src/modules/swiftest_globals.f90 index f8e5674e4..feeb0ef1c 100644 --- a/src/modules/swiftest_globals.f90 +++ b/src/modules/swiftest_globals.f90 @@ -207,7 +207,6 @@ module swiftest_globals type :: netcdf_variables integer(I4B) :: out_type !! NetCDF output type (will be assigned either NF90_DOUBLE or NF90_FLOAT, depending on the user parameter) integer(I4B) :: ncid !! NetCDF ID for the output file - integer(I4B) :: dimids(3) !! Dimensions of the NetCDF file integer(I4B) :: time_dimid !! NetCDF ID for the time dimension integer(I4B) :: id_dimid !! NetCDF ID for the particle id dimension integer(I4B) :: str_dimid !! NetCDF ID for the character string dimension