Skip to content
Snippets Groups Projects
Select Git revision
  • 1595e39d83d165cabffdad8b517f6e7da22a3930
  • master default protected
  • update_CI
3 results

PySWIFTsim

user avatar
1595e39d
History

Welcome to PySWIFTsim

This code is a python wrapper around the cosmological hydrodynamical code SWIFT hosted at https://gitlab.cosma.dur.ac.uk/swift/swiftsim.

A few examples are given in test and the API is trying to follow the SWIFT API, therefore a developer of SWIFT should be able to quickly learn how to use it.

Adding a new structure

In pyswiftsim/structure.py, a list of all SWIFT structure are described in python. When adding a new structure, a new class should be added to this file using the following example:

class SwiftParams(SwiftStruct):
   """ All object should inherit from SwiftStruct """ 
    _format = "{sec}s{data}sii{line_size}c".format(
            sec=struct.calcsize(Section._format)*PARSER_MAX_NO_OF_SECTIONS,
            data=struct.calcsize(Parameter._format)*PARSER_MAX_NO_OF_PARAMS,
            line_size=PARSER_MAX_LINE_SIZE
        )
    """ _format describes the type of the object contained in a C structure.
        see struct python package for a list of all possible types.
	For an undefined/complex object, the letter 's' is used and for string 'c'.
    """

    _name = [
            "section",
            "data_params",
            "sectionCount",
            "paramCount",
            "filename"
        ]
    """ _name defines the name of each variable """

    def __init__(self, data, parent=None):
        """ defines the constructor
	    data is a list of bytes and parent is the structure in which this one is included
	"""
        super().__init__(self.struct_format, data, parent)

    @property
    def struct_substruct(self):
    	""" This method should be defined if a substructure is present in this one.
	    It returns a dictionary where the key is the name of the object (defined in _name)
	    and the value is the array size (1 if this structure is not in an array).
	"""
        sec = {
            "class": Section,
            "size": PARSER_MAX_NO_OF_SECTIONS
        }

        param = {
            "class": Parameter,
            "size": PARSER_MAX_NO_OF_PARAMS
        }
        return {
            "section": sec,
            "data_params": param
        }

If the new structure is an option (e.g. Part, Cooling, ...) you can use an if to define the _format and _name variables.