Skip to content

Commit

Permalink
Merge pull request #205 from mabruzzo/initialize_field_data
Browse files Browse the repository at this point in the history
Introduce `gr_initialize_field_data`
  • Loading branch information
brittonsmith authored Jun 25, 2024
2 parents 0826a16 + e54416d commit 095363c
Show file tree
Hide file tree
Showing 13 changed files with 119 additions and 1 deletion.
3 changes: 3 additions & 0 deletions doc/source/Integration.rst
Original file line number Diff line number Diff line change
Expand Up @@ -602,6 +602,9 @@ not intend to use.
// Create struct for storing grackle field data
grackle_field_data my_fields;

// initialize members of my_fields to sensible defaults
gr_initialize_field_data(&my_fields);

// Set grid dimension and size.
// grid_start and grid_end are used to ignore ghost zones.
int field_size = 1;
Expand Down
19 changes: 19 additions & 0 deletions doc/source/Reference.rst
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@ Grackle has two versions of most functions.
and :c:data:`chemistry_data_storage` instances to be provided as
arguments. These are explicity thread-safe as they use no global data.

Additionally, there are also some :ref:`misc_functions` and :ref:`rate-functions`.

.. _primary_functions:

Primary Functions
Expand Down Expand Up @@ -417,3 +419,20 @@ The following functions are used to query the name of the ith field of the :c:da
:param unsigned int i: The index of the accessed parameter
:rtype: const char*
:returns: Pointer to the string-literal specifying the name. This is ``NULL``, if :c:data:`chemistry_data` has ``i`` or fewer ``string`` members.

.. _misc_functions:

Miscellaneous Functions
-----------------------

.. c:function:: int gr_initialize_field_data(grackle_field_data *my_fields);
Initializes the struct-members stored in the :c:type:`grackle_field_data` data structure to their default values.
This function must assume that any existing data within the data structure is garbage data.
In other words, when this function goes to overwrite a given member of :c:type:`grackle_field_data`, it completely ignores the value currently held by the member (i.e. the function does not provide special handling for members holding non- ``NULL`` pointers).
Consequently, this function should **ONLY** be called **BEFORE** initializing any members of the data structure (if it's called at any other time, the program may leak memory resources).
:param grackle_field_data \*my_fields: uninitialized field data storage
:rtype: int
:returns: 1 (success) or 0 (failure)
55 changes: 55 additions & 0 deletions src/clib/grackle_field_data_fdatamembers.def
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
/***********************************************************************
/
/ this file lists each member of the grackle_field_data struct that is
/ intended to hold field data. This list is intended to be used with
/ X-Macros in *.c files (to reduce the amount of code required to
/ interact with these fields)
/
/ Currently, we just specify each field's name. In the future, we will
/ probably add other metadata (that may be used to help track when the
/ field is required or help with unit scaling/applying floors)
/
/ Copyright (c) 2013, Enzo/Grackle Development Team.
/
/ Distributed under the terms of the Enzo Public Licence.
/
/ The full license is in the file LICENSE, distributed with this
/ software.
************************************************************************/

ENTRY(density)
ENTRY(HI_density)
ENTRY(HII_density)
ENTRY(HM_density)
ENTRY(HeI_density)
ENTRY(HeII_density)
ENTRY(HeIII_density)
ENTRY(H2I_density)
ENTRY(H2II_density)
ENTRY(DI_density)
ENTRY(DII_density)
ENTRY(HDI_density)
ENTRY(e_density)
ENTRY(metal_density)
ENTRY(dust_density)

ENTRY(internal_energy)
ENTRY(x_velocity)
ENTRY(y_velocity)
ENTRY(z_velocity)

ENTRY(volumetric_heating_rate)
ENTRY(specific_heating_rate)

ENTRY(temperature_floor)

ENTRY(RT_heating_rate)
ENTRY(RT_HI_ionization_rate)
ENTRY(RT_HeI_ionization_rate)
ENTRY(RT_HeII_ionization_rate)
ENTRY(RT_H2_dissociation_rate)

ENTRY(H2_self_shielding_length)
ENTRY(H2_custom_shielding_factor)

ENTRY(isrf_habing)
22 changes: 22 additions & 0 deletions src/clib/set_default_chemistry_parameters.c
Original file line number Diff line number Diff line change
Expand Up @@ -41,3 +41,25 @@ int set_default_chemistry_parameters(chemistry_data *my_grackle)
grackle_data = my_grackle;
return local_initialize_chemistry_parameters(my_grackle);
}

int gr_initialize_field_data(grackle_field_data *my_fields)
{
if (my_fields == NULL) {
fprintf(stderr, "gr_initial_field_data was passed a NULL pointer\n");
return FAIL;
}

my_fields->grid_rank = -1;
my_fields->grid_dimension = NULL;
my_fields->grid_start = NULL;
my_fields->grid_end = NULL;
my_fields->grid_dx = -1.0;

// now, modify all members holding datafields to have values of NULL
// (we use X-Macros to do this)
#define ENTRY(MEMBER_NAME) my_fields->MEMBER_NAME = NULL;
#include "grackle_field_data_fdatamembers.def"
#undef ENTRY

return SUCCESS;
}
3 changes: 2 additions & 1 deletion src/example/c_example.c
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,7 @@ int main(int argc, char *argv[])

// Create struct for storing grackle field data
grackle_field_data my_fields;
gr_initialize_field_data(&my_fields);

// Set grid dimension and size.
// grid_start and grid_end are used to ignore ghost zones.
Expand Down Expand Up @@ -244,4 +245,4 @@ int main(int argc, char *argv[])
fprintf(stderr, "dust_temperature = %g K.\n", dust_temperature[0]);

return EXIT_SUCCESS;
}
}
1 change: 1 addition & 0 deletions src/example/c_local_example.c
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,7 @@ int main(int argc, char *argv[])

// Create struct for storing grackle field data
grackle_field_data my_fields;
gr_initialize_field_data(&my_fields);

// Set grid dimension and size.
// grid_start and grid_end are used to ignore ghost zones.
Expand Down
1 change: 1 addition & 0 deletions src/example/cxx_grid_example.C
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@ grackle_field_data construct_field_data(grid_props& my_grid_props,

// Create struct for storing grackle field data
grackle_field_data my_fields;
gr_initialize_field_data(&my_fields);

// Set grid dimension and size.
// grid_start and grid_end are used to ignore ghost zones.
Expand Down
2 changes: 2 additions & 0 deletions src/example/cxx_omp_example.C
Original file line number Diff line number Diff line change
Expand Up @@ -179,6 +179,8 @@ int main(int argc, char *argv[])
}

grackle_field_data my_fields_t1, my_fields_tN;
gr_initialize_field_data(&my_fields_t1);
gr_initialize_field_data(&my_fields_tN);

// Set grid dimension and size.
// grid_start and grid_end are used to ignore ghost zones.
Expand Down
1 change: 1 addition & 0 deletions src/example/fortran_example.F
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,7 @@ program fortran_example
iresult = initialize_chemistry_data(my_units)

c Set field arrays
iresult = gr_initialize_field_data(my_fields)

c If grid rank is less than 3, set the other dimensions,
c start indices, and end indices to 0.
Expand Down
2 changes: 2 additions & 0 deletions src/include/grackle.h
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,8 @@ int local_free_chemistry_data(chemistry_data *my_chemistry, chemistry_data_stora

grackle_version get_grackle_version(void);

int gr_initialize_field_data(grackle_field_data *my_fields);

#ifdef __cplusplus
} /* extern "C" */
#endif /* __cplusplus */
Expand Down
8 changes: 8 additions & 0 deletions src/include/grackle_fortran_interface.def
Original file line number Diff line number Diff line change
Expand Up @@ -245,3 +245,11 @@ c The following define the fortran interfaces to the C routines
REAL(C_DOUBLE), INTENT(OUT) :: dust_temperature(*)
END FUNCTION calculate_dust_temperature
END INTERFACE

INTERFACE
INTEGER(C_INT) FUNCTION gr_initialize_field_data(my_fields)
& bind(C)
IMPORT
TYPE(grackle_field_data), INTENT(INOUT) :: my_fields
END FUNCTION gr_initialize_field_data
END INTERFACE
2 changes: 2 additions & 0 deletions src/python/pygrackle/grackle_defs.pxd
Original file line number Diff line number Diff line change
Expand Up @@ -249,3 +249,5 @@ cdef extern from "grackle.h":
c_chemistry_data_storage *my_rates)

c_grackle_version c_get_grackle_version "get_grackle_version"()

int gr_initialize_field_data(c_field_data *my_fields)
1 change: 1 addition & 0 deletions src/python/pygrackle/grackle_wrapper.pyx
Original file line number Diff line number Diff line change
Expand Up @@ -696,6 +696,7 @@ cdef c_field_data setup_field_data(object fc, int[::1] buf,

# now initialize my_fields
cdef c_field_data my_fields
gr_initialize_field_data(&my_fields)
my_fields.grid_rank = 1
my_fields.grid_dimension = grid_dimension
my_fields.grid_start = grid_start
Expand Down

0 comments on commit 095363c

Please sign in to comment.