static void rtdb_broadcast(const int msg_type, const int ma_type, const int nelem, void *data) /* Convenience routine for rtdb that broadcasts MA data types from node 0 to all other nodes */ { Integer len = MA_sizeof(ma_type, nelem, MT_CHAR); Integer from = 0; Integer type = msg_type; GA_Brdcst(data, len, from); }
static PyObject *wrap_rtdb_put(PyObject *self, PyObject *args) { int i, list, list_len; int ma_type = -1; char *name; Integer* int_array; double *dbl_array; char *char_array; char cbuf[8192], *ptr; void *array = 0; PyObject *obj; if ((PyTuple_Size(args) == 2) ) { PyArg_ParseTuple(args, "sO", &name,&obj); if (PyList_Check(obj)) list = 1; else list = 0; if (list) { list_len = PyList_Size(obj); if ( PyInt_Check(PyList_GetItem(obj, 0))) ma_type = MT_F_INT; else if ( PyFloat_Check(PyList_GetItem(obj, 0))) ma_type = MT_F_DBL; else if (PyString_Check(PyList_GetItem(obj, 0))) ma_type = MT_CHAR; else { printf("ERROR A\n"); ma_type = -1; } } else { list_len = 1; if ( PyInt_Check(obj)) ma_type = MT_F_INT; else if ( PyFloat_Check(obj)) ma_type = MT_F_DBL; else if (PyString_Check(obj)) ma_type = MT_CHAR; else { printf("ERROR B\n"); ma_type = -1; } } if (ma_type == -1) { PyErr_SetString(PyExc_TypeError, "Usage: rtdb_put - ma_type is confused"); return NULL; } if (ma_type != MT_CHAR) { if (!(array = malloc(MA_sizeof(ma_type, list_len, MT_CHAR)))) { PyErr_SetString(PyExc_MemoryError, "rtdb_put failed allocating work array"); return NULL; } } switch (ma_type) { case MT_INT: case MT_F_INT: case MT_BASE + 11: /* Logical */ int_array = array; for (i = 0; i < list_len; i++) { if (list) int_array[i] = PyInt_AS_LONG(PyList_GetItem(obj, i)); else int_array[i] = PyInt_AS_LONG(obj); } break; case MT_DBL: case MT_F_DBL: dbl_array = array; for (i = 0; i < list_len; i++) { if (list) PyArg_ParseTuple(PyList_GetItem(obj, i), "d", dbl_array+i); else PyArg_ParseTuple(obj, "d", dbl_array+i); } break; case MT_CHAR: ptr = cbuf; *ptr = 0; for (i = 0; i < list_len; i++) { if (list) PyArg_ParseTuple(PyList_GetItem(obj, i), "s", &char_array); else PyArg_ParseTuple(obj, "s", &char_array); /*printf("PROCESSED '%s'\n", char_array);*/ if ((ptr+strlen(char_array)) >= (cbuf+sizeof(cbuf))) { PyErr_SetString(PyExc_MemoryError,"rtdb_put too many strings"); return NULL; } strcpy(ptr,char_array); ptr = ptr+strlen(char_array); strcpy(ptr,"\n"); ptr = ptr + 1; } list_len = strlen(cbuf) + 1; array = cbuf; break; default: PyErr_SetString(NwchemError, "rtdb_put: ma_type is incorrect"); if (array) free(array); return NULL; break; } if (!(rtdb_seq_put(rtdb_handle, name, ma_type, list_len, array))) { PyErr_SetString(NwchemError, "rtdb_seq_put failed"); if ((ma_type != MT_CHAR) && array) free(array); return NULL; } } else { PyErr_SetString(PyExc_TypeError, "Usage: rtdb_put(value or values,[optional type])"); if ((ma_type != MT_CHAR) && array) free(array); return NULL; } Py_INCREF(Py_None); if ((ma_type != MT_CHAR) && array) free(array); return Py_None; Py_RETURN_NONE; }