diff options
author | Anton Khirnov <anton@khirnov.net> | 2019-01-30 12:52:59 +0100 |
---|---|---|
committer | Anton Khirnov <anton@khirnov.net> | 2019-02-02 11:52:04 +0100 |
commit | 64ddeff65f6e16432dba67c84304d42e4ed79e4c (patch) | |
tree | 7761d731af62715fcea4bd7ac7bb0c398c164ad4 | |
parent | 7dcabe1f8d406b62df4141883e503cabb39b8d45 (diff) |
Add forgotten boundary.c file.
-rw-r--r-- | boundary.c | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/boundary.c b/boundary.c new file mode 100644 index 0000000..c0f1514 --- /dev/null +++ b/boundary.c @@ -0,0 +1,74 @@ +/* + * Boundary conditions internal API. + * Copyright 2019 Anton Khirnov <anton@khirnov.net> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include <stddef.h> +#include <stdlib.h> + +#include "common.h" +#include "mg2d_boundary.h" + +struct MG2DBoundaryInternal { + double *val_base; +}; + +MG2DBoundary *mg2di_bc_alloc(size_t domain_size) +{ + MG2DBoundary *bnd; + size_t boundary_len_max; + + if (domain_size > SIZE_MAX - 2 * (FD_STENCIL_MAX - 1)) + return NULL; + boundary_len_max = domain_size + 2 * (FD_STENCIL_MAX - 1); + if (boundary_len_max > SIZE_MAX / (FD_STENCIL_MAX * sizeof(bnd->val))) + return NULL; + + bnd = calloc(1, sizeof(*bnd)); + if (!bnd) + return NULL; + + bnd->priv = calloc(1, sizeof(*bnd->priv)); + if (!bnd->priv) { + free(bnd); + return NULL; + } + + bnd->priv->val_base = malloc(boundary_len_max * FD_STENCIL_MAX * sizeof(*bnd->val)); + if (!bnd->priv->val_base) + goto fail; + + bnd->val = bnd->priv->val_base + FD_STENCIL_MAX - 1; + bnd->val_stride = boundary_len_max; + + return bnd; +fail: + mg2di_bc_free(&bnd); + return NULL; +} + +void mg2di_bc_free(MG2DBoundary **pbnd) +{ + MG2DBoundary *bnd = *pbnd; + + if (!bnd) + return; + + free(bnd->priv->val_base); + free(bnd->priv); + free(bnd); + *pbnd = NULL; +} |