Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Introduce gr_initialize_field_data #205

Merged
merged 4 commits into from
Jun 25, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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