diff --git a/include/fmpi_domain.h b/include/fmpi_domain.h new file mode 100644 index 0000000000000000000000000000000000000000..262bb53d8382649921e9a940ac39cbf334d6fa78 --- /dev/null +++ b/include/fmpi_domain.h @@ -0,0 +1,63 @@ +// SPDX-License-Identifier: 0BSD +/*! + * @file + * @license{ + * BSD Zero Clause License + * + * Copyright (c) 2022 by Raphael Bach + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH + * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, + * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM + * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + * } + */ +/*============================================================================== + GUARD +==============================================================================*/ +#ifndef FMPI_DOMAIN_H_20220520194220 +#define FMPI_DOMAIN_H_20220520194220 +/*============================================================================== + INCLUDE +==============================================================================*/ +// C Standard Library +#include <stddef.h> // size_t +// Internal +#include "fmpi_data.h" +/*============================================================================== + TYPE +==============================================================================*/ +// Forward declaration from `fmpi_ctx.h` +struct fmpi_ctx; +/*------------------------------------------------------------------------------ + fmpi_domain +------------------------------------------------------------------------------*/ +/** + * TODO + * + * @example{ + * TODO + * } + */ +typedef struct fmpi_domain { + struct fmpi_data data; //!< Data composing the domain. + struct fmpi_data * parts; //!< Partitions of the domain after decomposition. + size_t part_cnt; //!< Number of partitions. +} fmpi_domain; +/*============================================================================== + PUBLIC FUNCTION +==============================================================================*/ +/*------------------------------------------------------------------------------ + fmpi_new_domain +------------------------------------------------------------------------------*/ +struct fmpi_domain fmpi_new_domain(const struct fmpi_ctx * ctx, struct fmpi_data data); +/*============================================================================== + GUARD +==============================================================================*/ +#endif // FMPI_DOMAIN_H_20220520194220 diff --git a/src/fmpi_domain.c b/src/fmpi_domain.c new file mode 100644 index 0000000000000000000000000000000000000000..a3b415f6a08ef049979c46c0969e81a9f7af5fc9 --- /dev/null +++ b/src/fmpi_domain.c @@ -0,0 +1,72 @@ +// SPDX-License-Identifier: 0BSD +/*! + * @file + * @license{ + * BSD Zero Clause License + * + * Copyright (c) 2022 by Raphael Bach + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH + * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, + * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM + * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + * } + */ +/*============================================================================== + INCLUDE +==============================================================================*/ +// Own header +#include "fmpi_domain.h" +// C Standard Library +#include <assert.h> +#include <stdlib.h> +// Internal +#include "fmpi_data.h" +#include "internal/fmpi_ctx.h" +#include "internal/fmpi_mpi.h" +/*============================================================================== + PUBLIC FUNCTION +==============================================================================*/ +//! @todo Handle creation of domain with data in 2D and 3D +/*------------------------------------------------------------------------------ + fmpi_new_domain() +------------------------------------------------------------------------------*/ +struct fmpi_domain fmpi_new_domain( + const struct fmpi_ctx * const ctx, const struct fmpi_data data) +{ + assert(ctx != NULL); + const size_t proc_cnt = (size_t)ctx->mpi->size; + struct fmpi_domain domain = { + .data = data, + .part_cnt = proc_cnt + }; + domain.parts = malloc(proc_cnt * sizeof(*domain.parts)); + if(domain.parts == NULL) { + FMPI_RAISE_ERROR(ctx->err_handler, "FMPI", "malloc(domain.parts) failed!"); + } + const size_t cnt_per_proc = data.cnt/proc_cnt; + size_t rem = data.cnt % proc_cnt; + size_t offset = 0; + for(size_t i = 0; i < proc_cnt; i++) { + const size_t cnt = rem != 0 ? cnt_per_proc + 1 : cnt_per_proc; + rem = rem != 0 ? rem - 1 : rem; + const size_t size = cnt * data.type_size; + domain.parts[i] = (struct fmpi_data){ \ + .type = data.type, + .type_size = data.type_size, + .cnt = cnt, + .size = size, + .dim_len = {cnt, 1, 1}, + .dim_cnt = 1, + .start = (char *)data.start + offset + }; + offset += size; + } + return domain; +}