While the implementation of SYMPHONY strives to shield the user from having to know anything about communications protocols or the specifics of inter-process communication, it may be necessary for the user to pass information from one module to another in order to implement a parallel application. For instance, the user may want to pass data describing the problem instance to the LP process after reading them in from a file in the master process. For the purpose of passing user data from the master process to other processes, a customization function called user_send_*_data() is provided in the master module, along with a corresponding function called user_receive_*_data() in the module *. These two functions work in tandem to transport the user's data from the maser, where it can be read in from a file, to the proper module for processing. There are also a number of other tandem pairs of send and receive functions that are used to transport user data from place to place.
All data are sent in the form of arrays of either type char, int, or double, or as strings. To send an array, the user has simply to invoke the function send_XXX_array(XXX *array, int length) where XXX is one of the previously listed types. To receive that array, there is a corresponding function called receive_?_array(? *array, int length). When receiving an array, the user must first allocate the appropriate amount of memory. In cases where variable length arrays need to be passed, the user must first pass the length of the array (as a separate array of length one) and then the array itself. In the receive function, this allows the length to be received first so that the proper amount of space can be allocated before receiving the array itself. Note that data must be received in exactly the same order as it was passed, as data is read linearly into and out of the message buffer. The easiest way to ensure this is done properly is to simply copy the send statements into the receive function and change the function names. It may then be necessary to add some allocation statements in between the receive function calls.