From dbe37f9c769e5918ab8d2177b863adea7417aac4 Mon Sep 17 00:00:00 2001
From: Andreas Gattringer <andreas.gattringer@univie.ac.at>
Date: Tue, 30 Jan 2024 17:04:03 +0100
Subject: [PATCH] refactor: moved memory handling to library libbdc/bdc_memory

---
 CMakeLists.txt                                |  5 +-
 libbdc/CMakeLists.txt                         | 41 ++++++++++++
 libbdc/bdc_memory/CMakeLists.txt              | 13 ++++
 {src/memory => libbdc/bdc_memory}/arrays.c    | 35 ++++++----
 .../bdc_memory/bdc_memory.c                   | 20 +++---
 .../bdc_memory/bdc_memory.h                   | 65 +++++++++++++++++--
 .../memory => libbdc/bdc_memory}/raw_arrays.c | 10 +--
 src/CMakeLists.txt                            |  1 -
 src/cats/CMakeLists.txt                       |  8 +--
 src/cats/actions/setup_actions.c              |  3 +-
 src/cats/configuration/configuration.c        |  2 +-
 .../load_configuration_environments.c         | 11 ++--
 .../configuration/load_configuration_helper.c |  3 +-
 .../load_configuration_species_params.c       |  2 +-
 src/cats/data/cats_datatypes.h                |  5 --
 src/cats/data/cats_global.c                   |  2 +-
 src/cats/data/cats_grid.h                     |  3 +-
 src/cats/data/simulation_geometry.c           |  2 +-
 src/cats/data/simulation_geometry.h           |  6 +-
 src/cats/debug/debug.c                        |  4 +-
 src/cats/debug/debug_vital_rates.c            |  2 +-
 src/cats/dispersal/dispersal.c                |  2 +-
 src/cats/dispersal/dispersal_helper.c         |  3 +-
 src/cats/environment/environment.c            |  2 +-
 src/cats/environment/environment_rasters.c    |  2 +-
 src/cats/environment/environment_rasters.h    |  3 +-
 src/cats/environment/environment_registry.c   |  9 ++-
 src/cats/environment/environment_registry.h   |  5 +-
 src/cats/environment/environment_set.c        |  2 +-
 src/cats/environment/load_environment.c       |  8 +--
 src/cats/grids/cats_grid.c                    |  8 +--
 src/cats/grids/cats_grid.h                    |  6 +-
 src/cats/grids/gdal_helper.c                  |  4 +-
 src/cats/grids/gdal_helper.h                  |  4 +-
 src/cats/grids/gdal_load.c                    |  4 +-
 src/cats/grids/gdal_load.h                    |  2 +-
 src/cats/grids/gdal_save.c                    | 10 +--
 src/cats/grids/grid_converters.c              |  4 +-
 src/cats/grids/grid_converters.h              |  2 +-
 src/cats/grids/grid_setup.c                   |  6 +-
 src/cats/grids/grid_wrapper.c                 | 10 +--
 src/cats/grids/grid_wrapper.h                 | 12 ++--
 src/cats/inline.h                             |  2 +-
 src/cats/inline_population.h                  |  3 +-
 src/cats/lambda/eigen_power.c                 |  3 +-
 src/cats/lambda/lambda-grid.c                 |  4 +-
 src/cats/lambda/leslie_matrix.c               |  2 +-
 src/cats/lambda/matrix_helpers.c              |  3 +-
 src/cats/misc/cats_maths.c                    |  3 +-
 src/cats/misc/debug.c                         |  2 +-
 src/cats/misc/output.c                        |  6 +-
 src/cats/misc/output.h                        |  6 +-
 src/cats/modules/module_header.h              |  2 +-
 src/cats/mpi/mpi_cats.c                       |  3 +-
 src/cats/mpi/mpi_debug.c                      |  4 +-
 src/cats/mpi/mpi_grid_helpers.c               |  3 +-
 src/cats/mpi/mpi_save.c                       |  4 +-
 src/cats/mpi/mpi_scalefactor.c                |  4 +-
 src/cats/mpi/mpi_seeds.c                      |  4 +-
 src/cats/mpi/mpi_stats.c                      |  6 +-
 src/cats/overlays/overlay_exclusion.c         |  4 +-
 src/cats/overlays/overlay_exclusion.h         |  4 +-
 src/cats/overlays/overlay_habitat_type_cc.c   |  5 +-
 src/cats/overlays/overlay_habitat_type_cc.h   |  2 +-
 src/cats/overlays/overlay_resources.c         |  5 +-
 src/cats/overlays/overlays.h                  |  2 +-
 src/cats/performance/timer.c                  |  3 +-
 src/cats/plants/plant_structures.c            |  2 +-
 src/cats/plants/population_stats.c            |  4 +-
 src/cats/populations/plant_juveniles.c        |  3 +-
 src/cats/stats/global_stats.c                 |  3 +-
 src/cats/stats/grid_stats.c                   | 12 +---
 src/cats/stats/indices.c                      |  8 +--
 src/cats/stats/statistics.c                   |  2 +-
 src/cats/stats/write_stats.c                  |  8 +--
 src/cats/temporal/timeformat.c                |  2 +-
 src/cats/threading/block_tasks.c              |  8 +--
 src/cats/threading/dispersal_tasks.c          | 14 ++--
 src/cats/threading/threading-helpers.c        |  4 +-
 src/cats/threading/threading.c                |  4 +-
 src/cats_csv/CMakeLists.txt                   |  2 +-
 src/cats_csv/cats_csv.c                       |  2 +-
 src/cats_ini/CMakeLists.txt                   |  2 +-
 src/cats_strings/cats_strings.c               |  2 +-
 src/cats_strings/string_helpers.c             |  2 +-
 src/cats_windows.h                            |  2 +-
 src/logging/logging.c                         |  2 +-
 src/memory/CMakeLists.txt                     | 15 -----
 src/memory/arrays.h                           | 64 ------------------
 src/memory/cats_memory.h                      | 38 -----------
 src/modules/butterflies/butterflies_main.c    |  6 +-
 .../cats_test_module/register_module.c        |  2 +-
 src/tests/CMakeLists.txt                      |  4 +-
 src/tests/csv_test.c                          |  5 +-
 src/tests/vital_rate_test.c                   |  2 +-
 95 files changed, 317 insertions(+), 347 deletions(-)
 create mode 100644 libbdc/CMakeLists.txt
 create mode 100644 libbdc/bdc_memory/CMakeLists.txt
 rename {src/memory => libbdc/bdc_memory}/arrays.c (72%)
 rename src/memory/cats_memory.c => libbdc/bdc_memory/bdc_memory.c (92%)
 rename src/memory/raw_arrays.h => libbdc/bdc_memory/bdc_memory.h (54%)
 rename {src/memory => libbdc/bdc_memory}/raw_arrays.c (93%)
 delete mode 100644 src/memory/CMakeLists.txt
 delete mode 100644 src/memory/arrays.h
 delete mode 100644 src/memory/cats_memory.h

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 05993bf..e8353b4 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,6 +1,6 @@
+cmake_minimum_required(VERSION 3.19)
 project(CATS C)
 enable_language(C)
-cmake_minimum_required(VERSION 3.19)
 set(C_STANDARD 17)
 include(CTest)
 MESSAGE("Using compiler: ${CMAKE_C_COMPILER_ID}")
@@ -67,7 +67,8 @@ add_definitions("-DCATS_GIT_VERSION=${CATS_GIT_VERSION}")
 MESSAGE("GIT commit hash: ${CATS_GIT_VERSION}")
 
 add_definitions("-DCOMPILER_VERSION='${CMAKE_C_COMPILER_ID} ${CMAKE_C_COMPILER_VERSION}'")
-
+include_directories("libbdc")
+add_subdirectory(libbdc/)
 include_directories("src")
 include_directories("src/cats")
 add_subdirectory(src/)
diff --git a/libbdc/CMakeLists.txt b/libbdc/CMakeLists.txt
new file mode 100644
index 0000000..4ae0edc
--- /dev/null
+++ b/libbdc/CMakeLists.txt
@@ -0,0 +1,41 @@
+cmake_minimum_required(VERSION 3.19)
+project(LIBBDC C)
+enable_language(C)
+set(C_STANDARD 17)
+
+
+if ("${CMAKE_C_COMPILER_ID}" MATCHES "Clang" OR "${CMAKE_C_COMPILER_ID}" STREQUAL "GNU")
+    add_link_options(-Bsymbolic -fno-semantic-interposition)
+    add_compile_options(-std=gnu11
+                        -Wall
+                        -Werror
+                        -O3
+                        -g
+                        -D_GNU_SOURCE
+                        -DHAVE_INLINE
+                        -DGSL_C99_INLINE
+                        -Wno-unused-function
+                        -DGSL_DISABLE_DEPRECATED)
+endif ()
+
+if ("${CMAKE_C_COMPILER_ID}" STREQUAL "GNU")
+    add_compile_options(-Wno-stringop-truncation -Wno-stringop-overflow)
+elseif ("${CMAKE_C_COMPILER_ID}" MATCHES "Clang")
+    # nothing yet
+elseif ("${CMAKE_C_COMPILER_ID}" STREQUAL "Intel")
+    # nothing yet
+elseif ("${CMAKE_C_COMPILER_ID}" STREQUAL "MSVC")
+    add_compile_options("/std:c17")
+else ()
+    MESSAGE("Unknown compiler: ${CMAKE_C_COMPILER_ID}")
+endif ()
+
+add_subdirectory(bdc_memory)
+
+add_library(bdc STATIC "")
+
+set_target_properties(bdc PROPERTIES LINKER_LANGUAGE C)
+set_property(TARGET bdc PROPERTY POSITION_INDEPENDENT_CODE ON)
+target_link_libraries(bdc
+                      bdc_memory)
+
diff --git a/libbdc/bdc_memory/CMakeLists.txt b/libbdc/bdc_memory/CMakeLists.txt
new file mode 100644
index 0000000..38e9e22
--- /dev/null
+++ b/libbdc/bdc_memory/CMakeLists.txt
@@ -0,0 +1,13 @@
+add_library(bdc_memory STATIC "")
+
+target_sources(bdc_memory
+               PRIVATE
+               bdc_memory.c
+               raw_arrays.c
+               arrays.c
+               PUBLIC
+               bdc_memory.h
+               )
+
+
+set_property(TARGET bdc_memory PROPERTY POSITION_INDEPENDENT_CODE ON)
\ No newline at end of file
diff --git a/src/memory/arrays.c b/libbdc/bdc_memory/arrays.c
similarity index 72%
rename from src/memory/arrays.c
rename to libbdc/bdc_memory/arrays.c
index c08bc0e..a26c51f 100644
--- a/src/memory/arrays.c
+++ b/libbdc/bdc_memory/arrays.c
@@ -19,36 +19,40 @@
 // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 //
 
-#include "raw_arrays.h"
-#include <malloc.h>
-#include "cats_memory.h"
 #include <assert.h>
-#include "arrays.h"
+#include <malloc.h>
+#include <stdlib.h>
+#include <stdint.h>
 
+#include "bdc_memory.h"
 
-struct cats_2d_array_float *new_2d_array_float(struct cats_dimension dimension)
+
+__attribute__((unused)) struct cats_2d_array_float *new_2d_array_float(struct array_dimension *dimension)
 {
+        assert(dimension != NULL);
         struct cats_2d_array_float *result = malloc_or_die(sizeof(struct cats_2d_array_float));
         result->data = new_raw_2d_array_from_dimension(dimension, sizeof(float));
-        result->dimension = dimension;
+        result->dimension = *dimension;
         return result;
 }
 
 
-struct cats_2d_array_char *new_2d_array_char(struct cats_dimension dimension)
+struct cats_2d_array_char *new_2d_array_char(const struct array_dimension *dimension)
 {
+        assert(dimension != NULL);
         struct cats_2d_array_char *result = malloc_or_die(sizeof(struct cats_2d_array_char));
         result->data = new_raw_2d_array_from_dimension(dimension, sizeof(char));
-        result->dimension = dimension;
+        result->dimension = *dimension;
         return result;
 }
 
 
-struct cats_2d_array_double *new_2d_array_double(struct cats_dimension dimension)
+struct cats_2d_array_double *new_2d_array_double(const struct array_dimension *dimension)
 {
+        assert(dimension != NULL);
         struct cats_2d_array_double *result = malloc_or_die(sizeof(struct cats_2d_array_double));
         result->data = new_raw_2d_array_from_dimension(dimension, sizeof(double));
-        result->dimension = dimension;
+        result->dimension = *dimension;
         return result;
 }
 
@@ -92,7 +96,14 @@ void cleanup_2d_array_double(struct cats_2d_array_double **grid)
 }
 
 
-void *new_raw_2d_array_from_dimension(struct cats_dimension dimension, size_t member_size)
+void *new_raw_2d_array_from_dimension(const struct array_dimension *dimension, size_t member_size)
 {
-        return new_raw_2d_array(dimension.rows, dimension.cols, member_size);
+        if (dimension->cols <= 0 || dimension->rows <= 0) {
+                fprintf(stderr,
+                        "%s: invalid dimensions of %d rows %d cols",
+                        __func__, dimension->rows, dimension->cols);
+                exit(EXIT_FAILURE);
+        }
+
+        return new_raw_2d_array(dimension->rows, dimension->cols, member_size);
 }
\ No newline at end of file
diff --git a/src/memory/cats_memory.c b/libbdc/bdc_memory/bdc_memory.c
similarity index 92%
rename from src/memory/cats_memory.c
rename to libbdc/bdc_memory/bdc_memory.c
index f9ec1b0..f8ab25b 100644
--- a/src/memory/cats_memory.c
+++ b/libbdc/bdc_memory/bdc_memory.c
@@ -1,6 +1,6 @@
 // SPDX-License-Identifier: GPL-3.0-or-later
 //
-// cats_memory.c
+// bdc_memory.c
 //
 // Copyright (C) 2011-2024, University of Vienna and Vienna Institute for Nature Conservation & Analyses, Andreas Gattringer.
 //
@@ -22,7 +22,7 @@
 #include <stddef.h>
 #include <stdlib.h>
 #include <stdio.h>
-#include "cats_memory.h"
+#include "bdc_memory.h"
 
 // we do not use logging functions here --
 // if there is a memory allocation error, keep everything simple and terminate.
@@ -50,17 +50,21 @@ void *malloc_or_die_trace(size_t size, const char *func)
 
 void *realloc_or_die(void *ptr, size_t size)
 {
-        ptr = realloc(ptr, size);
+        void *new = realloc(ptr, size); // NULL if realloc failure, so we don't overwrite the old address
+
+        if (new == NULL) {
+                fprintf(stderr, "%s: error re-allocating %zu bytes. Quitting\n", __func__, size);
+                printf("%s: error re-allocating %zu bytes. Quitting\n", __func__, size); // allowed printf
+                abort();
+                // exit(EXIT_FAILURE);
+        }
+
+        ptr = new;
 
         if (size > 1000 * 1000 * 1000) {
                 fprintf(stderr, "Allocation of %zu bytes\n", size);
                 fflush(stderr);
         }
-        if (ptr == NULL) {
-                fprintf(stderr, "%s: error re-allocating %zu bytes. Quitting\n", __func__, size);
-                printf("%s: error re-allocating %zu bytes. Quitting\n", __func__, size); // allowed printf
-                exit(EXIT_FAILURE);
-        }
 
         return ptr;
 }
diff --git a/src/memory/raw_arrays.h b/libbdc/bdc_memory/bdc_memory.h
similarity index 54%
rename from src/memory/raw_arrays.h
rename to libbdc/bdc_memory/bdc_memory.h
index 2a4ca21..015638d 100644
--- a/src/memory/raw_arrays.h
+++ b/libbdc/bdc_memory/bdc_memory.h
@@ -1,6 +1,6 @@
 // SPDX-License-Identifier: GPL-3.0-or-later
 //
-// raw_arrays.h
+// bdc_memory.h
 //
 // Copyright (C) 2011-2024, University of Vienna and Vienna Institute for Nature Conservation & Analyses, Andreas Gattringer.
 //
@@ -19,11 +19,66 @@
 // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 //
 
-#ifndef CATS_RAW_ARRAYS_H
-#define CATS_RAW_ARRAYS_H
+#ifndef bdc_memory_H
+#define bdc_memory_H
 
+#include <stddef.h> // for size_t
+#include <stdbool.h>
 #include <stdint.h>
-#include <stddef.h>
+
+void *malloc_or_die_trace(size_t size, const char *func);
+
+void *realloc_or_die(void *ptr, size_t size);
+
+void *malloc_or_die(size_t size);
+
+void *calloc_or_die(size_t count, size_t size);
+
+
+struct array_dimension {
+        int32_t rows;
+        int32_t cols;
+};
+
+struct cats_2d_array_float {
+        float **data;
+        struct array_dimension dimension;
+};
+
+struct cats_2d_array_char {
+        char **data;
+        struct array_dimension dimension;
+};
+
+struct cats_2d_array_double {
+        double **data;
+        struct array_dimension dimension;
+};
+
+struct cats_2d_array_char *new_2d_array_char(const struct array_dimension *dimension);
+
+struct cats_2d_array_double *new_2d_array_double(const struct array_dimension *dimension);
+
+__attribute__((unused)) struct cats_2d_array_float *new_2d_array_float(struct array_dimension *dimension);
+
+void cleanup_2d_array_char(struct cats_2d_array_char **grid);
+
+void cleanup_2d_array_float(struct cats_2d_array_float **grid);
+
+void cleanup_2d_array_double(struct cats_2d_array_double **grid);
+
+#define free_cats_grid(PTR_TO_GRID) _Generic((PTR_TO_GRID), \
+ struct cats_2d_array_float **:        cleanup_2d_array_float, \
+ struct cats_2d_array_double **:       cleanup_2d_array_double, \
+ struct cats_2d_array_char **:         cleanup_2d_array_char \
+ )(PTR_TO_GRID)
+
+bool array_dimension_valid(const struct array_dimension *dimension);
+
+__attribute__((unused)) bool array_dimensions_match(const struct array_dimension *d1, const struct array_dimension *d2);
+
+void *new_raw_2d_array_from_dimension(const struct array_dimension *dimension, size_t member_size);
+
 
 void cleanup_raw_2d_double_array(double ***data, int64_t rows);
 
@@ -60,4 +115,4 @@ void *new_raw_2d_array(size_t rows, size_t cols, size_t size);
 
 void *new_raw_1d_array(size_t count, size_t size);
 
-#endif // CATS_RAW_ARRAYS_H
\ No newline at end of file
+#endif //bdc_memory_H
diff --git a/src/memory/raw_arrays.c b/libbdc/bdc_memory/raw_arrays.c
similarity index 93%
rename from src/memory/raw_arrays.c
rename to libbdc/bdc_memory/raw_arrays.c
index 93eca60..6a19a29 100644
--- a/src/memory/raw_arrays.c
+++ b/libbdc/bdc_memory/raw_arrays.c
@@ -19,20 +19,16 @@
 // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 //
 
-#include <assert.h>
 #include <stddef.h>
 #include <stdlib.h>
-#include <stdio.h>
-#include <inttypes.h>
-#include "raw_arrays.h"
-#include "cats_memory.h"
+#include "bdc_memory.h"
 
 
 void *new_raw_2d_array(size_t rows, size_t cols, size_t size)
 {
-        void **grid = calloc_or_die(rows, sizeof(void *));
+        void **grid = calloc_or_die(rows, sizeof(void *)); // FIXME DANGER
 
-        for (cats_dt_coord row = 0; row < rows; row++) {
+        for (size_t row = 0; row < rows; row++) {
                 grid[row] = calloc_or_die(cols, size);
                 if (grid[row] == NULL) exit(EXIT_FAILURE); // should never happen, we would exit in calloc_or_die
         }
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 2bf1b6a..e371925 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -1,5 +1,4 @@
 add_subdirectory(logging)
-add_subdirectory(memory)
 add_subdirectory(cats)
 add_subdirectory(cats_time)
 add_subdirectory(cats_strings)
diff --git a/src/cats/CMakeLists.txt b/src/cats/CMakeLists.txt
index 00239ae..8b22d87 100644
--- a/src/cats/CMakeLists.txt
+++ b/src/cats/CMakeLists.txt
@@ -321,15 +321,15 @@ set(CATS_SOURCES_MPI
     )
 
 add_executable(cats cats.c)
-target_link_libraries(libcats cats_logging cats_memory cats_strings cats_ini cats_csv)
-target_link_libraries(cats libcats cats_logging cats_memory cats_strings cats_ini cats_csv)
+target_link_libraries(libcats cats_logging bdc cats_strings cats_ini cats_csv)
+target_link_libraries(cats libcats cats_logging bdc cats_strings cats_ini cats_csv)
 
 
 if (MSVC)
     # target_include_directories(cats PRIVATE ${GDAL_INCLUDE_DIRS})
     # target_link_libraries(cats cats_logging cats_memory cats_strings cats_ini cats_csv  ${GDAL_LIBRARIES})
 else ()
-    target_link_libraries(cats cats_logging cats_memory cats_strings cats_ini cats_csv)
+    target_link_libraries(cats cats_logging bdc cats_strings cats_ini cats_csv)
 
 endif ()
 
@@ -337,7 +337,7 @@ if (MPI_FOUND)
 
 
     add_executable(cats-mpi cats.c ${CATS_SOURCES_MPI})
-    target_link_libraries(cats-mpi ${MPI_C_LIBRARIES} cats_logging cats_memory cats_strings cats_ini cats_csv libcats)
+    target_link_libraries(cats-mpi ${MPI_C_LIBRARIES} cats_logging bdc_memory cats_strings cats_ini cats_csv libcats)
 
 
     target_compile_options(cats-mpi PRIVATE -DUSEMPI)
diff --git a/src/cats/actions/setup_actions.c b/src/cats/actions/setup_actions.c
index 2868263..e3a1539 100644
--- a/src/cats/actions/setup_actions.c
+++ b/src/cats/actions/setup_actions.c
@@ -26,12 +26,11 @@
 #include "configuration/configuration.h"
 
 #include "actions/setup_actions.h"
-#include "logging.h"
 #include "actions/cats_actions.h"
 #include "actions/process_inter_period_survival.h"
 #include "cats_strings/cats_strings.h"
 #include "dispersal/dispersal.h"
-#include "memory/cats_memory.h"
+#include "bdc_memory/bdc_memory.h"
 
 
 void list_actions(const struct cats_configuration *conf)
diff --git a/src/cats/configuration/configuration.c b/src/cats/configuration/configuration.c
index 99560cc..9044c29 100644
--- a/src/cats/configuration/configuration.c
+++ b/src/cats/configuration/configuration.c
@@ -31,7 +31,7 @@
 #include <stdio.h>
 #include <errno.h>
 
-#include <memory/cats_memory.h>
+#include "bdc_memory/bdc_memory.h"
 #include <cats_ini/cats_ini.h>
 
 #include "configuration.h"
diff --git a/src/cats/configuration/load_configuration_environments.c b/src/cats/configuration/load_configuration_environments.c
index a49a67f..08f0f70 100644
--- a/src/cats/configuration/load_configuration_environments.c
+++ b/src/cats/configuration/load_configuration_environments.c
@@ -44,13 +44,15 @@ enum environment_variable_type get_environment_variable_type_from_string(const c
 
 void add_environment_variable_from_conf(struct cats_configuration *conf, struct cats_ini *ini, char *environment_section)
 {
-        struct cats_dimension *dimension = &conf->geometry.dimension;
+        struct array_dimension *dimension = &conf->geometry.dimension;
         char *name = remove_0th_token(environment_section, ":");
 
         if (conf->command_line_options.no_input_rasters_required) {
                 struct cats_environment *set = add_environment(conf, name, ENVIRONMENT_TYPE_SUITABILITY, NULL);
-                struct cats_environment_variable *env = add_environment_to_registry(&conf->environment_registry, "suitability", ENV_VAR_SUITABILITY,
-                                                                                    0, 0, "None",
+                struct cats_environment_variable *env = add_environment_to_registry(&conf->environment_registry,
+                                                                                    "suitability", ENV_VAR_SUITABILITY,
+                                                                                    "None", 0,
+                                                                                    0,
                                                                                     dimension);
                 add_to_environment(set, env);
                 return;
@@ -89,7 +91,8 @@ void add_environment_variable_from_conf(struct cats_configuration *conf, struct
         enum environment_variable_type type = get_environment_variable_type_from_string(type_name);
 
         struct cats_environment_variable *env = add_environment_to_registry(&conf->environment_registry, name, type,
-                                                                            interpolation, reload, filename_pattern,
+                                                                            filename_pattern, reload,
+                                                                            interpolation,
                                                                             dimension);
 
 
diff --git a/src/cats/configuration/load_configuration_helper.c b/src/cats/configuration/load_configuration_helper.c
index cc6e422..2e93757 100644
--- a/src/cats/configuration/load_configuration_helper.c
+++ b/src/cats/configuration/load_configuration_helper.c
@@ -22,10 +22,9 @@
 #include <assert.h>
 #include <string.h>
 #include "cats_global.h"
-#include <memory/raw_arrays.h>
+#include "bdc_memory/bdc_memory.h"
 #include "actions/setup.h"
 #include "load_configuration_helper.h"
-#include <memory/cats_memory.h>
 #include "dispersal/dispersal.h"
 #include "data/species_parameters.h"
 
diff --git a/src/cats/configuration/load_configuration_species_params.c b/src/cats/configuration/load_configuration_species_params.c
index e2504e8..a7418dd 100644
--- a/src/cats/configuration/load_configuration_species_params.c
+++ b/src/cats/configuration/load_configuration_species_params.c
@@ -28,7 +28,7 @@
 #include <string.h>
 #include <math.h>
 
-#include <memory/cats_memory.h>
+#include "bdc_memory/bdc_memory.h"
 #include <cats_ini/cats_ini.h>
 #include <logging/logging.h>
 
diff --git a/src/cats/data/cats_datatypes.h b/src/cats/data/cats_datatypes.h
index e912a70..d2bba54 100644
--- a/src/cats/data/cats_datatypes.h
+++ b/src/cats/data/cats_datatypes.h
@@ -49,11 +49,6 @@ typedef int32_t cats_dt_coord;             ///< data type for coordinates (grid
 #define CATS_MAX_COORD INT32_MAX
 
 
-/// @brief Struct for grid dimensions (number of rows and columns)
-struct cats_dimension {
-        cats_dt_coord rows;
-        cats_dt_coord cols;
-};
 
 /// @brief Struct for grid coordinates (row and column)
 struct cats_coordinates {
diff --git a/src/cats/data/cats_global.c b/src/cats/data/cats_global.c
index d2179ba..d3a5749 100644
--- a/src/cats/data/cats_global.c
+++ b/src/cats/data/cats_global.c
@@ -23,7 +23,7 @@
 #include "cats_global.h"
 #include "misc/misc.h"
 #include "defaults.h"
-#include "memory/cats_memory.h"
+#include "bdc_memory/bdc_memory.h"
 #include <logging/logging.h>
 #include <stdlib.h>
 
diff --git a/src/cats/data/cats_grid.h b/src/cats/data/cats_grid.h
index 131fbf9..043bc20 100644
--- a/src/cats/data/cats_grid.h
+++ b/src/cats/data/cats_grid.h
@@ -27,6 +27,7 @@
 #include "data/cats_datatypes.h"
 #include "stats/statistics.h"
 #include "defaults.h"
+#include "bdc_memory/bdc_memory.h"
 
 struct cats_configuration;
 struct module_grid_data {
@@ -43,7 +44,7 @@ struct cats_grid {
 
 
         /** @name spatial information **/
-        const struct cats_dimension dimension;
+        const struct array_dimension dimension;
 
 
         struct cats_environment *suitability; /**  @name hybrid mode only: suitability information **/
diff --git a/src/cats/data/simulation_geometry.c b/src/cats/data/simulation_geometry.c
index 75dee4b..ed9e0b1 100644
--- a/src/cats/data/simulation_geometry.c
+++ b/src/cats/data/simulation_geometry.c
@@ -46,7 +46,7 @@ void init_simulation_geometry(struct simulation_geometry *geo)
 }
 
 
-void check_raster_dimensions(struct cats_dimension to_check, struct cats_dimension reference)
+void check_raster_dimensions(struct array_dimension to_check, struct array_dimension reference)
 {
         if (to_check.cols != reference.cols || to_check.rows != reference.rows) {
                 log_message(LOG_ERROR, "GDAL gdal_raster dimensions do not match expected dimensions: "
diff --git a/src/cats/data/simulation_geometry.h b/src/cats/data/simulation_geometry.h
index 57de102..be25d3c 100644
--- a/src/cats/data/simulation_geometry.h
+++ b/src/cats/data/simulation_geometry.h
@@ -22,13 +22,13 @@
 
 #ifndef CATS_SIMULATION_GEOMETRY_H
 #define CATS_SIMULATION_GEOMETRY_H
-
+#include "bdc_memory/bdc_memory.h"
 #include "cats_datatypes.h"
 
 struct simulation_geometry {
         bool gdal_registered;
-        struct cats_dimension dimension;
-        struct cats_dimension dimension_orig;
+        struct array_dimension dimension;
+        struct array_dimension dimension_orig;
         cats_dt_coord row_offset;
         cats_dt_coord col_offset;
         double origin_x;
diff --git a/src/cats/debug/debug.c b/src/cats/debug/debug.c
index c2d6ed8..ebe381a 100644
--- a/src/cats/debug/debug.c
+++ b/src/cats/debug/debug.c
@@ -20,10 +20,8 @@
 //
 
 #include "cats_global.h"
-#include <stdint.h>
 #include <stdarg.h>
-#include <memory/raw_arrays.h>
-#include <memory/cats_memory.h>
+#include "bdc_memory/bdc_memory.h"
 #include "debug/debug.h"
 #include "threading/threading-helpers.h"
 #include <cats_strings/cats_strings.h>
diff --git a/src/cats/debug/debug_vital_rates.c b/src/cats/debug/debug_vital_rates.c
index 7219c57..ca9da40 100644
--- a/src/cats/debug/debug_vital_rates.c
+++ b/src/cats/debug/debug_vital_rates.c
@@ -22,7 +22,7 @@
 
 #include "debug_vital_rates.h"
 #include "data/species_parameters.h"
-#include "memory/cats_memory.h"
+#include "bdc_memory/bdc_memory.h"
 #include "inline_carrying_capacity.h"
 #include "grids/grid_setup.h"
 #include "paths/directory_helper.h"
diff --git a/src/cats/dispersal/dispersal.c b/src/cats/dispersal/dispersal.c
index 92adefe..3f0aeaf 100644
--- a/src/cats/dispersal/dispersal.c
+++ b/src/cats/dispersal/dispersal.c
@@ -47,7 +47,7 @@
 #include "mpi/mpi_cats.h"
 #endif
 
-#include "memory/cats_memory.h"
+#include "bdc_memory/bdc_memory.h"
 #include "inline_overlays.h"
 
 // ANSATZPUNKTE
diff --git a/src/cats/dispersal/dispersal_helper.c b/src/cats/dispersal/dispersal_helper.c
index 45d2fb6..df26f0c 100644
--- a/src/cats/dispersal/dispersal_helper.c
+++ b/src/cats/dispersal/dispersal_helper.c
@@ -26,8 +26,7 @@
 #include "dispersal.h"
 #include "misc/cats_random.h"
 #include "threading/threading-helpers.h"
-#include "memory/cats_memory.h"
-#include "memory/raw_arrays.h"
+#include "bdc_memory/bdc_memory.h"
 
 
 cats_dt_rates get_average_local_dispersal(const struct cats_dispersal *dispersal, const struct cats_configuration *conf)
diff --git a/src/cats/environment/environment.c b/src/cats/environment/environment.c
index 833be2c..353a797 100644
--- a/src/cats/environment/environment.c
+++ b/src/cats/environment/environment.c
@@ -152,7 +152,7 @@ load_environment_raster(struct cats_configuration *conf, struct cats_environment
         raster->interpolation_type = type;
         raster->environment_type = environment_type;
         if (raster->values == NULL) {
-                raster->values = new_raw_2d_array_from_dimension(conf->geometry.dimension, sizeof(cats_dt_environment));
+                raster->values = new_raw_2d_array_from_dimension(&conf->geometry.dimension, sizeof(cats_dt_environment));
 
         }
         struct raster_load_wrapper wrapper = {.geometry = &conf->geometry, .target_environment = raster->values,
diff --git a/src/cats/environment/environment_rasters.c b/src/cats/environment/environment_rasters.c
index 1c44aca..b5e8016 100644
--- a/src/cats/environment/environment_rasters.c
+++ b/src/cats/environment/environment_rasters.c
@@ -50,7 +50,7 @@ void create_raster_if_needed(struct cats_configuration *conf, struct cats_enviro
 
         log_message(LOG_INFO, "\tinitializing empty grid for <%s>", get_raster_type_name_specific(raster));
         log_message(LOG_DEBUG, "%s: ALLOCATING NEW GRID NOW", __func__);
-        raster->values = new_raw_2d_array_from_dimension(conf->geometry.dimension, sizeof(cats_dt_environment));
+        raster->values = new_raw_2d_array_from_dimension(&conf->geometry.dimension, sizeof(cats_dt_environment));
         raster->dimension.rows = conf->geometry.dimension.rows;
         raster->dimension.cols = conf->geometry.dimension.cols;
 
diff --git a/src/cats/environment/environment_rasters.h b/src/cats/environment/environment_rasters.h
index 6e38f42..6cb05c5 100644
--- a/src/cats/environment/environment_rasters.h
+++ b/src/cats/environment/environment_rasters.h
@@ -23,6 +23,7 @@
 #define CATS_ENVIRONMENT_RASTERS_H
 
 #include "data/cats_datatypes.h"
+#include "bdc_memory/bdc_memory.h"
 
 struct cats_configuration;
 
@@ -55,7 +56,7 @@ enum environment_type {
 
 struct cats_environment_raster {
         cats_dt_environment **values;     //!< the values as 2D-grid
-        struct cats_dimension dimension;
+        struct array_dimension dimension;
         enum interpolation_type interpolation_type;            //!< are we the start, end or current set of values?
         enum environment_variable_type environment_type;
         int year;                         //!< temporal information: which year is loaded in \ref cats_suitability.values? INT_MIN for unknown or not loaded
diff --git a/src/cats/environment/environment_registry.c b/src/cats/environment/environment_registry.c
index e7898d6..fa1f606 100644
--- a/src/cats/environment/environment_registry.c
+++ b/src/cats/environment/environment_registry.c
@@ -24,7 +24,7 @@
 #include <string.h>
 #include <limits.h>
 #include "environment/environment_structures.h"
-#include "memory/arrays.h"
+#include "bdc_memory/bdc_memory.h"
 #include <logging/logging.h>
 
 void reset_environment_registry(struct cats_environment_registry *reg)
@@ -45,9 +45,8 @@ char *get_suitability_name_from_species(const char *name)
 
 struct cats_environment_variable *
 add_environment_to_registry(struct cats_environment_registry *registry, const char *name,
-                            enum environment_variable_type type,
-                            int32_t interpolation, int32_t reload_interval,
-                            const char *file_name_pattern, const struct cats_dimension *dimension)
+                            enum environment_variable_type type, const char *file_name_pattern, int32_t reload_interval,
+                            int32_t interpolation, const struct array_dimension *dimension)
 {
         if (registry->name == NULL) {
                 log_message(LOG_ERROR, "%s: name variable is NULL!", __func__);
@@ -117,7 +116,7 @@ add_environment_to_registry(struct cats_environment_registry *registry, const ch
         env_var->current.quiet = false;
         env_var->start.quiet = false;
         env_var->end.quiet = false;
-        cats_dt_environment **tmp = new_raw_2d_array_from_dimension(*dimension, sizeof(cats_dt_environment));
+        cats_dt_environment **tmp = new_raw_2d_array_from_dimension(dimension, sizeof(cats_dt_environment));
         env_var->current.values = tmp;
         env_var->end.values = NULL;
         env_var->start.values = NULL;
diff --git a/src/cats/environment/environment_registry.h b/src/cats/environment/environment_registry.h
index 6735356..1d4680f 100644
--- a/src/cats/environment/environment_registry.h
+++ b/src/cats/environment/environment_registry.h
@@ -35,9 +35,8 @@ char *get_suitability_name_from_species(const char *name);
 
 struct cats_environment_variable *
 add_environment_to_registry(struct cats_environment_registry *registry, const char *name,
-                            enum environment_variable_type type,
-                            int32_t interpolation, int32_t reload_interval, const char *file_name_pattern,
-                            const struct cats_dimension *dimension);
+                            enum environment_variable_type type, const char *file_name_pattern, int32_t reload_interval,
+                            int32_t interpolation, const struct array_dimension *dimension);
 
 struct cats_environment_variable *get_environment_from_registry(struct cats_environment_registry *reg, char *name);
 
diff --git a/src/cats/environment/environment_set.c b/src/cats/environment/environment_set.c
index f62b1f9..7e5f6b0 100644
--- a/src/cats/environment/environment_set.c
+++ b/src/cats/environment/environment_set.c
@@ -25,7 +25,7 @@
 #include "configuration/configuration.h"
 #include "environment/environment.h"
 #include "environment_set.h"
-#include "memory/cats_memory.h"
+#include "bdc_memory/bdc_memory.h"
 #include "environment/glm.h"
 #include "configuration/print_configuration.h"
 
diff --git a/src/cats/environment/load_environment.c b/src/cats/environment/load_environment.c
index 3fa2f6e..c1324c5 100644
--- a/src/cats/environment/load_environment.c
+++ b/src/cats/environment/load_environment.c
@@ -37,8 +37,8 @@
 #include "logging.h"
 #include "environment.h"
 #include "misc/cats_maths_inline.h"
-#include "../../memory/arrays.h"
-#include "../../memory/raw_arrays.h"
+#include "bdc_memory/bdc_memory.h"
+
 #include "grids/gdal_save.h"
 #include "inline.h"
 #include "paths/paths.h"
@@ -146,7 +146,7 @@ load_environment_if_needed(struct cats_configuration *conf, struct cats_environm
                             "%s: loading interpolated %s %s for year %d (interpolated between %d and %d)",
                             short_name, name, environment->pattern, time, start, end);
                 load_environment_interpolated(conf, environment, start, end, time);
-       
+
         }
 
 }
@@ -154,7 +154,7 @@ load_environment_if_needed(struct cats_configuration *conf, struct cats_environm
 
 void save_glm(struct cats_configuration *conf, const struct cats_environment *env, int32_t time)
 {
-        double **values = new_raw_2d_array_from_dimension(conf->geometry.dimension, sizeof(double));
+        double **values = new_raw_2d_array_from_dimension(&conf->geometry.dimension, sizeof(double));
         struct cats_vital_rate rate_info = {0};
         rate_info.environment_set = (struct cats_environment *) env;
         rate_info.density = NO_DENSITY_DEP;
diff --git a/src/cats/grids/cats_grid.c b/src/cats/grids/cats_grid.c
index 04f9b4d..9665728 100644
--- a/src/cats/grids/cats_grid.c
+++ b/src/cats/grids/cats_grid.c
@@ -42,7 +42,7 @@
 #include "stats/grid_stats.h"
 #include "gdal_load.h"
 #include "grid_setup.h"
-#include "memory/cats_memory.h"
+#include "bdc_memory/bdc_memory.h"
 #include "misc/cats_random.h"
 
 #ifdef USEMPI
@@ -142,7 +142,7 @@ create_and_initialize_grid(struct cats_configuration *conf, const int32_t id, st
 }
 
 
-void initialize_grid(struct cats_grid *grid, struct cats_configuration *conf, struct cats_dimension dimension, int id)
+void initialize_grid(struct cats_grid *grid, struct cats_configuration *conf, struct array_dimension dimension, int id)
 {
         assert(conf != NULL);
         assert(grid != NULL);
@@ -217,7 +217,7 @@ void initialize_grid(struct cats_grid *grid, struct cats_configuration *conf, st
 }
 
 
-int64_t raster_cell_count(struct cats_dimension raster)
+int64_t raster_cell_count(struct array_dimension raster)
 {
         assert(raster.rows >= 0);
         assert(raster.cols >= 0);
@@ -350,7 +350,7 @@ void initialize_grid_stats(struct cats_grid *grid, struct cats_configuration *co
 {
         assert(grid != NULL);
         init_statistics(&grid->stats, &conf->stats_registry);
-        grid->stats.has_been_populated = (char **) new_raw_2d_array_from_dimension(grid->dimension, sizeof(char));
+        grid->stats.has_been_populated = (char **) new_raw_2d_array_from_dimension(&grid->dimension, sizeof(char));
 
         char *filename = get_grid_stat_filename(grid, conf);
 
diff --git a/src/cats/grids/cats_grid.h b/src/cats/grids/cats_grid.h
index 4a6ff2e..2fc3459 100644
--- a/src/cats/grids/cats_grid.h
+++ b/src/cats/grids/cats_grid.h
@@ -25,9 +25,9 @@
 #include "data/cats_grid.h"
 #include "configuration/configuration.h"
 
-int64_t raster_cell_count(struct cats_dimension raster);
+int64_t raster_cell_count(struct array_dimension raster);
 
-void initialize_grid(struct cats_grid *grid, struct cats_configuration *conf, struct cats_dimension dimension, int id);
+void initialize_grid(struct cats_grid *grid, struct cats_configuration *conf, struct array_dimension dimension, int id);
 
 
 void cleanup_grid(struct cats_grid *grid);
@@ -41,5 +41,5 @@ void cleanup_array_of_grids(struct cats_grid ***grid, int grid_count);
 
 void do_all_grids(struct cats_grid **grids, struct cats_configuration *conf, grid_function function);
 
-void check_raster_dimensions(struct cats_dimension to_check, struct cats_dimension reference);
+void check_raster_dimensions(struct array_dimension to_check, struct array_dimension reference);
 
diff --git a/src/cats/grids/gdal_helper.c b/src/cats/grids/gdal_helper.c
index 7173136..403df56 100644
--- a/src/cats/grids/gdal_helper.c
+++ b/src/cats/grids/gdal_helper.c
@@ -207,7 +207,7 @@ void get_projection_from_file(struct simulation_geometry *geometry, const char *
 
 
 GDALDatasetH
-create_gdal_dataset(const struct simulation_geometry *geometry, const char *filename, struct cats_dimension dimension,
+create_gdal_dataset(const struct simulation_geometry *geometry, const char *filename, struct array_dimension dimension,
                     int bands,
                     GDALDataType datatype, const struct cats_configuration *conf)
 {
@@ -240,7 +240,7 @@ create_gdal_dataset(const struct simulation_geometry *geometry, const char *file
 
 
 void set_gdal_dataset_geo_info(GDALDatasetH dataset, const struct simulation_geometry *geometry,
-                               const struct cats_dimension *offset)
+                               const struct array_dimension *offset)
 {
         assert(geometry != NULL);
         assert(dataset != NULL);
diff --git a/src/cats/grids/gdal_helper.h b/src/cats/grids/gdal_helper.h
index a8f4cf5..f18faed 100644
--- a/src/cats/grids/gdal_helper.h
+++ b/src/cats/grids/gdal_helper.h
@@ -46,13 +46,13 @@ void set_gdal_dataset_metadata(GDALDatasetH dataset, const char *name, const cha
 void set_gdal_band_metadata(GDALRasterBandH band, GDALColorInterp colorint, const char *description);
 
 void set_gdal_dataset_geo_info(GDALDatasetH dataset, const struct simulation_geometry *geometry,
-                               const struct cats_dimension *offset);
+                               const struct array_dimension *offset);
 
 void gdal_destroy(void);
 
 void load_global_geometry(struct simulation_geometry *geometry, const char *filename);
 
 GDALDatasetH
-create_gdal_dataset(const struct simulation_geometry *geometry, const char *filename, struct cats_dimension dimension,
+create_gdal_dataset(const struct simulation_geometry *geometry, const char *filename, struct array_dimension dimension,
                     int bands,
                     GDALDataType datatype, const struct cats_configuration *conf);
diff --git a/src/cats/grids/gdal_load.c b/src/cats/grids/gdal_load.c
index c52e27a..78b6d82 100644
--- a/src/cats/grids/gdal_load.c
+++ b/src/cats/grids/gdal_load.c
@@ -221,8 +221,8 @@ get_double_values_from_gdal(struct simulation_geometry *geometry, const char *fi
 
         cats_dt_coord rows = GDALGetRasterYSize(dataset);
         cats_dt_coord cols = GDALGetRasterXSize(dataset);
-        struct cats_dimension dim = {.rows = rows, .cols=cols};
-        struct cats_2d_array_double *raster = new_2d_array_double(dim);
+        struct array_dimension dim = {.rows = rows, .cols=cols};
+        struct cats_2d_array_double *raster = new_2d_array_double(&dim);
 
 
         if (raster->dimension.cols <= 0 || raster->dimension.rows <= 0) {
diff --git a/src/cats/grids/gdal_load.h b/src/cats/grids/gdal_load.h
index b531191..6f51eac 100644
--- a/src/cats/grids/gdal_load.h
+++ b/src/cats/grids/gdal_load.h
@@ -25,7 +25,7 @@
 #include "data/cats_datatypes.h"
 #include "configuration/configuration.h"
 #include "grid_wrapper.h"
-#include <memory/arrays.h>
+#include "bdc_memory/bdc_memory.h"
 #include "data/simulation_geometry.h"
 
 enum RASTER_LOAD_TYPE {
diff --git a/src/cats/grids/gdal_save.c b/src/cats/grids/gdal_save.c
index 26e395d..847f30a 100644
--- a/src/cats/grids/gdal_save.c
+++ b/src/cats/grids/gdal_save.c
@@ -26,12 +26,12 @@
 #include "gdal_save.h"
 #include "data/cats_grid.h"
 #include "configuration/configuration.h"
-#include "memory/raw_arrays.h"
+#include "bdc_memory/bdc_memory.h"
 #include "logging.h"
 #include "paths/paths.h"
 #include "gdal_load.h"
 #include "gdal_helper.h"
-#include "memory/arrays.h"
+
 #include "paths/output_paths.h"
 #include "inline.h"
 #include "inline_vital_rates.h"
@@ -124,7 +124,7 @@ void *save_dispersed_seeds_to_gdal(struct cats_grid *grid, struct cats_configura
 
         char *filename = get_current_dispersed_seeds_filename(grid, conf);
 
-        double **seeds = new_raw_2d_array_from_dimension(grid->dimension,
+        double **seeds = new_raw_2d_array_from_dimension(&grid->dimension,
                                                          sizeof(double));
         const int32_t rows = grid->dimension.rows;
         const int32_t cols = grid->dimension.cols;
@@ -163,7 +163,7 @@ void *save_seeds_to_gdal(struct cats_grid *grid, struct cats_configuration *conf
         for (int i = 0; i < seed_persistence; i++) {
                 char *filename = get_current_seeds_filename(grid, conf, i);
 
-                int32_t **seeds = new_raw_2d_array_from_dimension(grid->dimension,
+                int32_t **seeds = new_raw_2d_array_from_dimension(&grid->dimension,
                                                                   sizeof(int32_t)); //new_int32t_grid(grid->rows, grid->cols);
                 const int32_t rows = grid->dimension.rows;
                 const int32_t cols = grid->dimension.cols;
@@ -226,7 +226,7 @@ void *save_juveniles_to_gdal(struct cats_grid *grid, struct cats_configuration *
                                 }
                         }
                 }
-                struct cats_dimension dim = {.rows = rows, .cols = cols};
+                struct array_dimension dim = {.rows = rows, .cols = cols};
                 struct grid_wrapper data = gridwrapper(juvs, dim);
                 save_grid_to_gdal(&data, GDT_Int32, conf, filename, conf->param[id].species_name);
                 free(filename);
diff --git a/src/cats/grids/grid_converters.c b/src/cats/grids/grid_converters.c
index b6c40f2..e65ad00 100644
--- a/src/cats/grids/grid_converters.c
+++ b/src/cats/grids/grid_converters.c
@@ -24,7 +24,7 @@
 
 #include "data/cats_grid.h"
 #include "configuration/configuration.h"
-#include <memory/cats_memory.h>
+#include "bdc_memory/bdc_memory.h"
 
 #include "logging.h"
 #include "actions/cats_actions.h"
@@ -36,7 +36,7 @@
 cats_dt_environment **convert_double_to_environment(const struct cats_2d_array_double *in_grid)
 {
         log_message(LOG_DEBUG, "%s: ALLOCATING NEW GRID NOW", __func__);
-        cats_dt_environment **array = new_raw_2d_array_from_dimension(in_grid->dimension, sizeof(cats_dt_environment));
+        cats_dt_environment **array = new_raw_2d_array_from_dimension(&in_grid->dimension, sizeof(cats_dt_environment));
         const cats_dt_coord rows = in_grid->dimension.rows;
         const cats_dt_coord cols = in_grid->dimension.cols;
         for (int32_t r = 0; r < rows; r++) {
diff --git a/src/cats/grids/grid_converters.h b/src/cats/grids/grid_converters.h
index a070da1..526985a 100644
--- a/src/cats/grids/grid_converters.h
+++ b/src/cats/grids/grid_converters.h
@@ -21,7 +21,7 @@
 
 #pragma once
 
-#include <memory/arrays.h>
+#include "bdc_memory/bdc_memory.h"
 
 cats_dt_environment **convert_double_to_environment(const struct cats_2d_array_double *in_grid);
 
diff --git a/src/cats/grids/grid_setup.c b/src/cats/grids/grid_setup.c
index 63d74fc..365cff4 100644
--- a/src/cats/grids/grid_setup.c
+++ b/src/cats/grids/grid_setup.c
@@ -24,7 +24,7 @@
 #include "grid_setup.h"
 
 #include "logging.h"
-#include <memory/cats_memory.h>
+#include "bdc_memory/bdc_memory.h"
 
 
 void setup_grid_seed_structures(const struct cats_configuration *conf, struct cats_grid *const grid, int grid_id)
@@ -44,9 +44,9 @@ void setup_grid_seed_structures(const struct cats_configuration *conf, struct ca
                 exit(EXIT_FAILURE);
         }
 
-        grid->dispersed_seeds = (cats_dt_seeds **) new_raw_2d_array_from_dimension(grid->dimension,
+        grid->dispersed_seeds = (cats_dt_seeds **) new_raw_2d_array_from_dimension(&grid->dimension,
                                                                                    sizeof(cats_dt_seeds));
-        grid->seeds_produced = (cats_dt_seeds **) new_raw_2d_array_from_dimension(grid->dimension,
+        grid->seeds_produced = (cats_dt_seeds **) new_raw_2d_array_from_dimension(&grid->dimension,
                                                                                   sizeof(cats_dt_seeds));
         grid->seed_bank = calloc_or_die(rows, sizeof(cats_dt_seeds **));
 
diff --git a/src/cats/grids/grid_wrapper.c b/src/cats/grids/grid_wrapper.c
index 2fd585a..ab06ac1 100644
--- a/src/cats/grids/grid_wrapper.c
+++ b/src/cats/grids/grid_wrapper.c
@@ -25,7 +25,7 @@
 #include "grid_wrapper.h"
 
 
-struct grid_wrapper gridwrapper_from_int32t(int32_t **data, struct cats_dimension dimension)
+struct grid_wrapper gridwrapper_from_int32t(int32_t **data, struct array_dimension dimension)
 {
         struct grid_wrapper result = {0};
         result.data_int32 = data;
@@ -37,7 +37,7 @@ struct grid_wrapper gridwrapper_from_int32t(int32_t **data, struct cats_dimensio
 }
 
 
-struct grid_wrapper gridwrapper_from_double(double **data, struct cats_dimension dimension)
+struct grid_wrapper gridwrapper_from_double(double **data, struct array_dimension dimension)
 {
         struct grid_wrapper result = {0};
         result.data_double = data;
@@ -49,7 +49,7 @@ struct grid_wrapper gridwrapper_from_double(double **data, struct cats_dimension
 }
 
 
-struct grid_wrapper gridwrapper_from_float(float **data, struct cats_dimension dimension)
+struct grid_wrapper gridwrapper_from_float(float **data, struct array_dimension dimension)
 {
         struct grid_wrapper result = {0};
         result.offset.cols = 0;
@@ -64,7 +64,7 @@ struct grid_wrapper gridwrapper_from_float(float **data, struct cats_dimension d
 }
 
 
-struct grid_wrapper gridwrapper_from_env(cats_dt_environment **data, struct cats_dimension dimension)
+struct grid_wrapper gridwrapper_from_env(cats_dt_environment **data, struct array_dimension dimension)
 {
         struct grid_wrapper result = {0};
         result.data_float = data;
@@ -77,7 +77,7 @@ struct grid_wrapper gridwrapper_from_env(cats_dt_environment **data, struct cats
 }
 
 
-struct grid_wrapper gridwrapper_1d(void *data, GDALDataType dt, struct cats_dimension dimension)
+struct grid_wrapper gridwrapper_1d(void *data, GDALDataType dt, struct array_dimension dimension)
 {
         struct grid_wrapper result = {0};
         result.nodata = -9999;
diff --git a/src/cats/grids/grid_wrapper.h b/src/cats/grids/grid_wrapper.h
index 0bde452..3668443 100644
--- a/src/cats/grids/grid_wrapper.h
+++ b/src/cats/grids/grid_wrapper.h
@@ -39,8 +39,8 @@ struct grid_wrapper {
         char *data_char_1d;
         double *data_double_1d;
 
-        struct cats_dimension dimension;
-        struct cats_dimension offset;
+        struct array_dimension dimension;
+        struct array_dimension offset;
 
         GDALDataType dt;
 
@@ -49,13 +49,13 @@ struct grid_wrapper {
 };
 
 
-struct grid_wrapper gridwrapper_from_float(float **data, struct cats_dimension dimension);
+struct grid_wrapper gridwrapper_from_float(float **data, struct array_dimension dimension);
 
-struct grid_wrapper gridwrapper_from_int32t(int32_t **data, struct cats_dimension dimension);
+struct grid_wrapper gridwrapper_from_int32t(int32_t **data, struct array_dimension dimension);
 
-struct grid_wrapper gridwrapper_from_double(double **data, struct cats_dimension dimension);
+struct grid_wrapper gridwrapper_from_double(double **data, struct array_dimension dimension);
 
-struct grid_wrapper gridwrapper_1d(void *data, GDALDataType dt, struct cats_dimension dimension);
+struct grid_wrapper gridwrapper_1d(void *data, GDALDataType dt, struct array_dimension dimension);
 
 #define gridwrapper(DATA, DIMENSION) _Generic((DATA), \
  int32_t **:        gridwrapper_from_int32t, \
diff --git a/src/cats/inline.h b/src/cats/inline.h
index 1c29c28..dd1e76f 100644
--- a/src/cats/inline.h
+++ b/src/cats/inline.h
@@ -35,7 +35,7 @@
 #include "logging.h"
 #include "overlays/overlays.h"
 #include "misc/cats_maths_inline.h"
-#include "memory/arrays.h"
+#include "bdc_memory/bdc_memory.h"
 
 #include "inline_carrying_capacity.h"
 #include "inline_population.h"
diff --git a/src/cats/inline_population.h b/src/cats/inline_population.h
index 7c1ba19..20937d8 100644
--- a/src/cats/inline_population.h
+++ b/src/cats/inline_population.h
@@ -259,7 +259,7 @@ get_population_all_classes_ts(const struct cats_grid **grids, cats_dt_coord row,
 #include "defaults.h"
 #include "environment/glm.h"
 #include "cats_global.h"
-#include "../memory/raw_arrays.h"
+#include "bdc_memory/bdc_memory.h"
 #include "plants/plant_rates.h"
 #include "data/cats_grid.h"
 #include "configuration/configuration.h"
@@ -268,7 +268,6 @@ get_population_all_classes_ts(const struct cats_grid **grids, cats_dt_coord row,
 #include "logging.h"
 #include "overlays/overlays.h"
 #include "misc/cats_maths_inline.h"
-#include "memory/arrays.h"
 #include "inline_vital_rates.h"
 #include "inline_overlays.h"
 #include "inline_carrying_capacity.h"
diff --git a/src/cats/lambda/eigen_power.c b/src/cats/lambda/eigen_power.c
index 7fc8add..9768dde 100644
--- a/src/cats/lambda/eigen_power.c
+++ b/src/cats/lambda/eigen_power.c
@@ -23,8 +23,7 @@
 #include <stdbool.h>
 #include <stdlib.h>
 #include "eigen_power.h"
-#include "logging/logging.h"
-#include "memory/cats_memory.h"
+#include "bdc_memory/bdc_memory.h"
 
 
 static double *ep_empty_vec(int N)
diff --git a/src/cats/lambda/lambda-grid.c b/src/cats/lambda/lambda-grid.c
index 7cde1c3..42ea357 100644
--- a/src/cats/lambda/lambda-grid.c
+++ b/src/cats/lambda/lambda-grid.c
@@ -25,7 +25,7 @@
 #include "inline.h"
 #include "grids/gdal_save.h"
 #include "environment/environment_set.h"
-#include "memory/cats_memory.h"
+#include "bdc_memory/bdc_memory.h"
 #include "lambda.h"
 #include "inline_vital_rates.h"
 #include "inline_overlays.h"
@@ -127,7 +127,7 @@ void save_lambda_grid(struct cats_configuration *conf, struct cats_grid *grid, b
         cats_dt_coord cols = conf->geometry.dimension.cols;
 
 
-        double **lambdas = new_raw_2d_array_from_dimension(grid->dimension,
+        double **lambdas = new_raw_2d_array_from_dimension(&grid->dimension,
                                                            sizeof(double));
         log_message(LOG_IMPORTANT, "Calculating lambda grid");
         cats_dt_rates max_cc = get_vital_rate_maximum(&grid->param.carrying_capacity);
diff --git a/src/cats/lambda/leslie_matrix.c b/src/cats/lambda/leslie_matrix.c
index 2128d84..e1a8582 100644
--- a/src/cats/lambda/leslie_matrix.c
+++ b/src/cats/lambda/leslie_matrix.c
@@ -23,7 +23,7 @@
 #include <stdio.h>
 #include "dispersal/dispersal.h"
 #include "leslie_matrix.h"
-#include "memory/cats_memory.h"
+#include "bdc_memory/bdc_memory.h"
 #include "logging/logging.h"
 #include "configuration/configuration.h"
 #include "inline.h"
diff --git a/src/cats/lambda/matrix_helpers.c b/src/cats/lambda/matrix_helpers.c
index 9c653b6..c054e99 100644
--- a/src/cats/lambda/matrix_helpers.c
+++ b/src/cats/lambda/matrix_helpers.c
@@ -21,9 +21,8 @@
 //
 
 #include <assert.h>
-#include <stdio.h>
 #include <logging/logging.h>
-#include <memory/cats_memory.h>
+#include "bdc_memory/bdc_memory.h"
 #include "cats_global.h"
 
 
diff --git a/src/cats/misc/cats_maths.c b/src/cats/misc/cats_maths.c
index fc65edf..e932b4e 100644
--- a/src/cats/misc/cats_maths.c
+++ b/src/cats/misc/cats_maths.c
@@ -23,8 +23,7 @@
 #include <assert.h>
 
 #include "cats_maths.h"
-#include "../../memory/cats_memory.h"
-#include "../../memory/raw_arrays.h"
+#include "bdc_memory/bdc_memory.h"
 #include "logging.h"
 
 
diff --git a/src/cats/misc/debug.c b/src/cats/misc/debug.c
index b6d8d73..f86e57b 100644
--- a/src/cats/misc/debug.c
+++ b/src/cats/misc/debug.c
@@ -23,7 +23,7 @@
 #include "data/cats_grid.h"
 #include "misc.h"
 #include "inline.h"
-#include <memory/cats_memory.h>
+#include "bdc_memory/bdc_memory.h"
 
 
 void
diff --git a/src/cats/misc/output.c b/src/cats/misc/output.c
index 48919ca..df52926 100644
--- a/src/cats/misc/output.c
+++ b/src/cats/misc/output.c
@@ -32,7 +32,7 @@
 
 
 void
-save_1d_grid(double *src, struct cats_dimension dimension, char *filename, struct cats_configuration *conf)
+save_1d_grid(double *src, struct array_dimension dimension, char *filename, struct cats_configuration *conf)
 {
 
         struct grid_wrapper data = gridwrapper_1d(src, GDT_Float64, dimension);
@@ -40,8 +40,8 @@ save_1d_grid(double *src, struct cats_dimension dimension, char *filename, struc
 }
 
 
-void save_2d_grid(float **src, struct cats_dimension dimension, char *filename, struct cats_configuration *conf,
-                  struct cats_dimension *offset)
+void save_2d_grid(float **src, struct array_dimension dimension, char *filename, struct cats_configuration *conf,
+                  struct array_dimension *offset)
 {
         struct grid_wrapper data = gridwrapper(src, dimension);
         if (offset != NULL) {
diff --git a/src/cats/misc/output.h b/src/cats/misc/output.h
index bf39bbc..b484d46 100644
--- a/src/cats/misc/output.h
+++ b/src/cats/misc/output.h
@@ -28,10 +28,10 @@
 
 
 void
-save_1d_grid(double *src, struct cats_dimension dimension, char *filename, struct cats_configuration *conf);
+save_1d_grid(double *src, struct array_dimension dimension, char *filename, struct cats_configuration *conf);
 
-void save_2d_grid(float **src, struct cats_dimension dimension, char *filename, struct cats_configuration *conf,
-                  struct cats_dimension *offset);
+void save_2d_grid(float **src, struct array_dimension dimension, char *filename, struct cats_configuration *conf,
+                  struct array_dimension *offset);
 
 
 #endif
\ No newline at end of file
diff --git a/src/cats/modules/module_header.h b/src/cats/modules/module_header.h
index 7de3891..9f6f2c5 100644
--- a/src/cats/modules/module_header.h
+++ b/src/cats/modules/module_header.h
@@ -28,7 +28,7 @@
 #include <assert.h>
 #include "logging.h"
 #include "data/cats_grid.h"
-#include "memory/cats_memory.h"
+#include "bdc_memory/bdc_memory.h"
 
 extern int CATS_MODULE_ID_INTERNAL;
 extern void *CATS_MODULE_DATA_INTERNAL;
diff --git a/src/cats/mpi/mpi_cats.c b/src/cats/mpi/mpi_cats.c
index 92b983d..81dd183 100644
--- a/src/cats/mpi/mpi_cats.c
+++ b/src/cats/mpi/mpi_cats.c
@@ -31,11 +31,10 @@
 #include "configuration/configuration.h"
 #include "misc/misc.h"
 #include "misc/output.h"
-#include "memory/raw_arrays.h"
+#include "bdc_memory/bdc_memory.h"
 #include "paths/paths.h"
 #include "grids/gdal_load.h"
 #include "mpi_cats.h"
-#include "memory/cats_memory.h"
 #include "mpi/mpi_grid_helpers.h"
 
 
diff --git a/src/cats/mpi/mpi_debug.c b/src/cats/mpi/mpi_debug.c
index 86fc215..1570c2c 100644
--- a/src/cats/mpi/mpi_debug.c
+++ b/src/cats/mpi/mpi_debug.c
@@ -61,7 +61,7 @@ char *dispersed_seeds_mpi_local_filename(const struct cats_configuration *conf)
 void mpi_save_locally_dispersed_seeds(struct cats_configuration *conf, struct cats_grid *grid)
 {
         char *filename = dispersed_seeds_mpi_local_filename(conf);
-        struct cats_dimension offset = {0};
+        struct array_dimension offset = {0};
         offset.cols = 0;
         int radius = 0;
 
@@ -72,7 +72,7 @@ void mpi_save_locally_dispersed_seeds(struct cats_configuration *conf, struct ca
         log_message(LOG_RAW, "rank %d, rows %d cols %d, rows before %d, rows after %d, row offset %d\n\n", conf->mpi.world_rank,
                grid->dimension.rows,
                grid->dimension.cols, rows_before, rows_after, conf->geometry.row_offset);
-        struct cats_dimension dimension;
+        struct array_dimension dimension;
         dimension.cols = grid->dimension.cols;
         dimension.rows = grid->dimension.rows + rows_before + rows_after;
         save_2d_grid(grid->seeds_0_all, dimension, filename, conf, &offset);
diff --git a/src/cats/mpi/mpi_grid_helpers.c b/src/cats/mpi/mpi_grid_helpers.c
index fdb04b3..f30cad2 100644
--- a/src/cats/mpi/mpi_grid_helpers.c
+++ b/src/cats/mpi/mpi_grid_helpers.c
@@ -25,8 +25,7 @@
 #include "logging.h"
 #include "configuration/configuration.h"
 #include "mpi_grid_helpers.h"
-#include "memory/raw_arrays.h"
-#include "memory/cats_memory.h"
+#include "bdc_memory/bdc_memory.h"
 #include "grids/cats_grid.h"
 
 #ifdef USEMPI
diff --git a/src/cats/mpi/mpi_save.c b/src/cats/mpi/mpi_save.c
index a32da0b..23f638b 100644
--- a/src/cats/mpi/mpi_save.c
+++ b/src/cats/mpi/mpi_save.c
@@ -22,15 +22,13 @@
 #include <assert.h>
 #include "paths/paths.h"
 #include "cats_global.h"
-#include "memory/raw_arrays.h"
+#include "bdc_memory/bdc_memory.h"
 #include "grids/cats_grid.h"
 #include "data/cats_grid.h"
 #include "mpi_save.h"
 #include "mpi_seeds.h"
-#include "logging.h"
 #include "grids/gdal_load.h"
 #include "grids/gdal_save.h"
-#include "memory/cats_memory.h"
 #include "mpi/mpi_grid_helpers.h"
 #include "paths/output_paths.h"
 
diff --git a/src/cats/mpi/mpi_scalefactor.c b/src/cats/mpi/mpi_scalefactor.c
index 19b93a6..17c6eae 100644
--- a/src/cats/mpi/mpi_scalefactor.c
+++ b/src/cats/mpi/mpi_scalefactor.c
@@ -20,11 +20,11 @@
 //
 
 #include "mpi_scalefactor.h"
-#include <memory/raw_arrays.h>
+#include "bdc_memory/bdc_memory.h"
 #include "logging.h"
 #include "vital_rates/hybrid_functions.h"
 #include "data/cats_grid.h"
-#include <memory/cats_memory.h>
+
 
 
 #ifdef USEMPI
diff --git a/src/cats/mpi/mpi_seeds.c b/src/cats/mpi/mpi_seeds.c
index 77a1dd4..c818d57 100644
--- a/src/cats/mpi/mpi_seeds.c
+++ b/src/cats/mpi/mpi_seeds.c
@@ -22,10 +22,8 @@
 #include <assert.h>
 #include "data/cats_grid.h"
 #include "configuration/configuration.h"
-#include "logging.h"
-#include "grids/cats_grid.h"
 #include "mpi_grid_helpers.h"
-#include "memory/raw_arrays.h"
+#include "bdc_memory/bdc_memory.h"
 #include "mpi_seeds.h"
 
 
diff --git a/src/cats/mpi/mpi_stats.c b/src/cats/mpi/mpi_stats.c
index 5e2fde5..c5eff7b 100644
--- a/src/cats/mpi/mpi_stats.c
+++ b/src/cats/mpi/mpi_stats.c
@@ -24,15 +24,11 @@
 #ifdef USEMPI
 
 #include <string.h>
-#include <assert.h>
 #include "data/cats_grid.h"
 #include "configuration/configuration.h"
-#include "misc/misc.h"
 #include "stats/grid_stats.h"
-#include "logging.h"
-#include "memory/raw_arrays.h"
+#include "bdc_memory/bdc_memory.h"
 #include "mpi/mpi_stats.h"
-#include "memory/cats_memory.h"
 
 
 void collect_and_write_plant_stats_mpi(struct cats_configuration *conf, struct cats_grid *grid)
diff --git a/src/cats/overlays/overlay_exclusion.c b/src/cats/overlays/overlay_exclusion.c
index 37f0823..3b2e784 100644
--- a/src/cats/overlays/overlay_exclusion.c
+++ b/src/cats/overlays/overlay_exclusion.c
@@ -27,7 +27,7 @@
 
 #include "logging.h"
 #include "grids/cats_grid.h"
-#include <memory/cats_memory.h>
+#include "bdc_memory/bdc_memory.h"
 #include "populations/population.h"
 #include "plants/plant_structures.h"
 #include "inline_overlays.h"
@@ -100,7 +100,7 @@ void destroy_excluded_cells_all_grids(const struct cats_configuration *conf, str
 
 struct cats_2d_array_char *translate_exclusion(const struct cats_2d_array_double *data, int64_t *excluded_count)
 {
-        struct cats_2d_array_char *result = new_2d_array_char(data->dimension);
+        struct cats_2d_array_char *result = new_2d_array_char(&data->dimension);
 
         const cats_dt_coord rows = data->dimension.rows;
         const cats_dt_coord cols = data->dimension.cols;
diff --git a/src/cats/overlays/overlay_exclusion.h b/src/cats/overlays/overlay_exclusion.h
index 5bc74a8..ed0eeb3 100644
--- a/src/cats/overlays/overlay_exclusion.h
+++ b/src/cats/overlays/overlay_exclusion.h
@@ -22,8 +22,8 @@
 #ifndef CATS_OVERLAY_EXCLUSION_H
 #define CATS_OVERLAY_EXCLUSION_H
 
-#include "../../memory/raw_arrays.h"
-#include "../../memory/arrays.h"
+#include "bdc_memory/bdc_memory.h"
+
 
 struct cats_2d_array_char *translate_exclusion(const struct cats_2d_array_double *data, int64_t *excluded_count);
 
diff --git a/src/cats/overlays/overlay_habitat_type_cc.c b/src/cats/overlays/overlay_habitat_type_cc.c
index 83ab768..cba3f82 100644
--- a/src/cats/overlays/overlay_habitat_type_cc.c
+++ b/src/cats/overlays/overlay_habitat_type_cc.c
@@ -27,7 +27,8 @@
 #include "overlay_habitat_type_cc.h"
 #include "cats_csv/cats_csv.h"
 #include "logging.h"
-#include "memory/cats_memory.h"
+#include "bdc_memory/bdc_memory.h"
+#include "data/cats_datatypes.h"
 
 
 void cleanup_habitat_layer_cc_aux(void **data)
@@ -115,7 +116,7 @@ struct cats_2d_array_double *translate_habitat(const struct cats_2d_array_double
 {
         assert(aux != NULL);
         struct habitat_layer_cc_aux *habitat_info = aux;
-        struct cats_2d_array_double *result = new_2d_array_double(data->dimension);
+        struct cats_2d_array_double *result = new_2d_array_double(&data->dimension);
 
         const cats_dt_coord rows = data->dimension.rows;
         const cats_dt_coord cols = data->dimension.cols;
diff --git a/src/cats/overlays/overlay_habitat_type_cc.h b/src/cats/overlays/overlay_habitat_type_cc.h
index 5148928..fa07f3a 100644
--- a/src/cats/overlays/overlay_habitat_type_cc.h
+++ b/src/cats/overlays/overlay_habitat_type_cc.h
@@ -23,7 +23,7 @@
 #define CATS_OVERLAY_HABITAT_TYPE_CC_H
 
 #include <stdint.h>
-#include "../../memory/arrays.h"
+#include "bdc_memory/bdc_memory.h"
 
 #define MAX_HABITAT_TYPE_CODES 1024
 
diff --git a/src/cats/overlays/overlay_resources.c b/src/cats/overlays/overlay_resources.c
index acfef34..131bdea 100644
--- a/src/cats/overlays/overlay_resources.c
+++ b/src/cats/overlays/overlay_resources.c
@@ -22,12 +22,13 @@
 #include <assert.h>
 #include <math.h>
 #include "overlay_resources.h"
-#include "memory/arrays.h"
+#include "bdc_memory/bdc_memory.h"
+#include "data/cats_datatypes.h"
 
 
 struct cats_2d_array_double *translate_resources(const struct cats_2d_array_double *data)
 {
-        struct cats_2d_array_double *result = new_2d_array_double(data->dimension);
+        struct cats_2d_array_double *result = new_2d_array_double(&data->dimension);
 
         const cats_dt_coord rows = data->dimension.rows;
         const cats_dt_coord cols = data->dimension.cols;
diff --git a/src/cats/overlays/overlays.h b/src/cats/overlays/overlays.h
index b26e515..75e5b9d 100644
--- a/src/cats/overlays/overlays.h
+++ b/src/cats/overlays/overlays.h
@@ -25,7 +25,7 @@
 #include <stdbool.h>
 #include <stdint.h>
 #include "data/cats_datatypes.h"
-#include "../../memory/arrays.h"
+#include "bdc_memory/bdc_memory.h"
 
 struct cats_configuration;
 struct cats_grid;
diff --git a/src/cats/performance/timer.c b/src/cats/performance/timer.c
index 22329f6..0ba6758 100644
--- a/src/cats/performance/timer.c
+++ b/src/cats/performance/timer.c
@@ -25,12 +25,11 @@
 #include <stdint.h>
 
 #include "timer.h"
-#include "logging.h"
 #include "misc/misc.h"
 #include "temporal/phase_names.h"
 #include "temporal/years.h"
 #include "performance_stats.h"
-#include <memory/cats_memory.h>
+#include "bdc_memory/bdc_memory.h"
 
 
 struct timeval *time_difference(struct timeval *start, struct timeval *end)
diff --git a/src/cats/plants/plant_structures.c b/src/cats/plants/plant_structures.c
index ed45e5d..d9e54cc 100644
--- a/src/cats/plants/plant_structures.c
+++ b/src/cats/plants/plant_structures.c
@@ -27,7 +27,7 @@
 #include "seeds.h"
 #include "inline_population.h"
 #include "populations/population.h"
-#include <memory/cats_memory.h>
+#include "bdc_memory/bdc_memory.h"
 
 
 void destroy_plant_cell(struct cats_grid *grid, const cats_dt_coord row, const cats_dt_coord col)
diff --git a/src/cats/plants/population_stats.c b/src/cats/plants/population_stats.c
index a7471ea..a68064e 100644
--- a/src/cats/plants/population_stats.c
+++ b/src/cats/plants/population_stats.c
@@ -19,12 +19,12 @@
 // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 //
 
-#include "../../memory/raw_arrays.h"
+
 #include "population_stats.h"
 #include "configuration/configuration.h"
 #include "data/cats_grid.h"
 
-#include "logging.h"
+
 
 
 void print_populated_cell_change_carrying_capacity(struct cats_configuration *conf, struct cats_grid **parent)
diff --git a/src/cats/populations/plant_juveniles.c b/src/cats/populations/plant_juveniles.c
index bd00998..2573d9b 100644
--- a/src/cats/populations/plant_juveniles.c
+++ b/src/cats/populations/plant_juveniles.c
@@ -23,10 +23,9 @@
 #include <assert.h>
 
 #include "plant_juveniles.h"
-#include "data/cats_datatypes.h"
 #include "data/cats_grid.h"
 #include "inline_vital_rates.h"
-#include "memory/cats_memory.h"
+#include "bdc_memory/bdc_memory.h"
 
 
 void setup_plant_juvenile_weights(struct cats_species_param *param)
diff --git a/src/cats/stats/global_stats.c b/src/cats/stats/global_stats.c
index a9addfe..a412a82 100644
--- a/src/cats/stats/global_stats.c
+++ b/src/cats/stats/global_stats.c
@@ -25,12 +25,11 @@
 #include "configuration/configuration.h"
 #include "misc/misc.h"
 
-#include "logging.h"
 #include "paths/paths.h"
 #include "stats/global_stats.h"
 #include "stats/grid_stats.h"
 #include "paths/output_paths.h"
-#include "memory/cats_memory.h"
+#include "bdc_memory/bdc_memory.h"
 
 #ifdef USEMPI
 #include "mpi/mpi_stats.h"
diff --git a/src/cats/stats/grid_stats.c b/src/cats/stats/grid_stats.c
index 5438917..a355506 100644
--- a/src/cats/stats/grid_stats.c
+++ b/src/cats/stats/grid_stats.c
@@ -25,9 +25,7 @@
 #include <assert.h>
 #include "data/cats_grid.h"
 #include "configuration/configuration.h"
-#include "misc/misc.h"
 #include "grid_stats.h"
-#include "logging.h"
 #include "paths/paths.h"
 #include "temporal/phase_names.h"
 #include "temporal/years.h"
@@ -36,13 +34,9 @@
 #include "mpi/mpi_stats.h"
 #endif
 
-#include "inline.h"
-#include "memory/arrays.h"
-#include "paths/output_paths.h"
-#include "memory/cats_memory.h"
-#include "inline_overlays.h"
-#include "inline_population.h"
-#include "populations/population.h"
+
+#include "bdc_memory/bdc_memory.h"
+
 
 
 struct string_array *add_stats_header_overlay(struct string_array *x, struct cats_configuration *conf, bool header)
diff --git a/src/cats/stats/indices.c b/src/cats/stats/indices.c
index 5f5623a..7f35aef 100644
--- a/src/cats/stats/indices.c
+++ b/src/cats/stats/indices.c
@@ -32,12 +32,12 @@
 #include "configuration/configuration.h"
 #include "populations/carrying_capacity.h"
 #include "actions/cats_actions.h"
-#include "logging.h"
+
 #include "indices.h"
-#include "inline.h"
-#include "memory/cats_memory.h"
+
+#include "bdc_memory/bdc_memory.h"
 #include "inline_overlays.h"
-#include "inline_carrying_capacity.h"
+
 #include "inline_population.h"
 #include "populations/population.h"
 
diff --git a/src/cats/stats/statistics.c b/src/cats/stats/statistics.c
index e397798..c1ed496 100644
--- a/src/cats/stats/statistics.c
+++ b/src/cats/stats/statistics.c
@@ -24,7 +24,7 @@
 #include <stdlib.h>
 #include "statistics.h"
 #include "cats_strings/cats_strings.h"
-#include "memory/cats_memory.h"
+#include "bdc_memory/bdc_memory.h"
 #include "configuration/configuration.h"
 
 
diff --git a/src/cats/stats/write_stats.c b/src/cats/stats/write_stats.c
index 9700929..c99e118 100644
--- a/src/cats/stats/write_stats.c
+++ b/src/cats/stats/write_stats.c
@@ -20,14 +20,14 @@
 //
 
 #include <stdlib.h>
-#include <memory/raw_arrays.h>
+#include "bdc_memory/bdc_memory.h"
 #include <string.h>
-#include <assert.h>
+
 #include "configuration/configuration.h"
-#include "logging.h"
+
 #include "data/cats_grid.h"
 #include "grid_stats.h"
-#include "defaults.h"
+
 #include "metadata.h"
 
 
diff --git a/src/cats/temporal/timeformat.c b/src/cats/temporal/timeformat.c
index 36fb293..5120e20 100644
--- a/src/cats/temporal/timeformat.c
+++ b/src/cats/temporal/timeformat.c
@@ -23,7 +23,7 @@
 
 #include "timeformat.h"
 #include "configuration/configuration.h"
-#include "memory/cats_memory.h"
+#include "bdc_memory/bdc_memory.h"
 #include "simulation_time.h"
 
 
diff --git a/src/cats/threading/block_tasks.c b/src/cats/threading/block_tasks.c
index b245ffd..cf08e60 100644
--- a/src/cats/threading/block_tasks.c
+++ b/src/cats/threading/block_tasks.c
@@ -22,8 +22,8 @@
 #include "cats_global.h"
 
 #include <stdint.h>
-#include <memory/arrays.h>
-#include <memory/cats_memory.h>
+#include "bdc_memory/bdc_memory.h"
+
 
 #include "threading/threading-helpers.h"
 #include "threading.h"
@@ -100,9 +100,9 @@ void setup_block_tasks(struct cats_thread_controller *t, int32_t rows, int32_t c
                             (t->grid->dimension.cols % t->task_size_cols != 0);
 
 
-        struct cats_dimension dim = {.rows = grid_rows, .cols = grid_cols};
+        struct array_dimension dim = {.rows = grid_rows, .cols = grid_cols};
 
-        t->task_grid = new_2d_array_char(dim);
+        t->task_grid = new_2d_array_char(&dim);
         t->tasks_remaining = t->task_grid->dimension.rows * t->task_grid->dimension.cols;
 
         t->task_getter = block_task_getter;
diff --git a/src/cats/threading/dispersal_tasks.c b/src/cats/threading/dispersal_tasks.c
index 9c2fc45..a825f9f 100644
--- a/src/cats/threading/dispersal_tasks.c
+++ b/src/cats/threading/dispersal_tasks.c
@@ -19,12 +19,10 @@
 // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 //
 
-#include <memory/arrays.h>
+#include "bdc_memory/bdc_memory.h"
 #include "threading/threading-helpers.h"
 #include "threading/threading.h"
 #include "misc/cats_maths_inline.h"
-
-#include <memory/cats_memory.h>
 #include "cats_global.h"
 #include <stdint.h>
 #include "dispersal_tasks.h"
@@ -102,20 +100,20 @@ struct thread_task dispersal_task_getter(struct cats_thread_controller *tc, int3
 }
 
 
-struct cats_dimension get_dispersal_area_dimensions(const struct cats_configuration *conf, const struct cats_grid *grid)
+struct array_dimension get_dispersal_area_dimensions(const struct cats_configuration *conf, const struct cats_grid *grid)
 {
         int32_t id = grid->id;
         int32_t max_radius = get_dispersal_radius(conf, id);
         int32_t min_dimension = min_int32t(grid->dimension.cols, grid->dimension.rows);
         max_radius = max_int32t(max_radius, min_dimension / 32);
-        struct cats_dimension result = {.rows = max_radius, .cols = max_radius};
+        struct array_dimension result = {.rows = max_radius, .cols = max_radius};
         return result;
 }
 
 
 void setup_dispersal_tasks(struct cats_thread_controller *t)
 {
-        struct cats_dimension dispersal_area_dimensions = get_dispersal_area_dimensions(t->conf, t->grid);
+        struct array_dimension dispersal_area_dimensions = get_dispersal_area_dimensions(t->conf, t->grid);
 
         t->task_size_rows = dispersal_area_dimensions.rows;
         t->task_size_cols = dispersal_area_dimensions.cols;
@@ -129,8 +127,8 @@ void setup_dispersal_tasks(struct cats_thread_controller *t)
         t->tasks_remaining = grid_rows * grid_cols;
         t->task_getter = dispersal_task_getter;
 
-        struct cats_dimension dim = {.rows = grid_rows, .cols = grid_cols};
-        t->task_grid = new_2d_array_char(dim);
+        struct array_dimension dim = {.rows = grid_rows, .cols = grid_cols};
+        t->task_grid = new_2d_array_char(&dim);
         //t->task_grid = new_2d_array(t->task_grid_rows, t->task_grid_cols, sizeof(char));
         for (int32_t r = 0; r < t->task_grid->dimension.rows; r++) {
                 for (int32_t c = 0; c < t->task_grid->dimension.cols; c++) {
diff --git a/src/cats/threading/threading-helpers.c b/src/cats/threading/threading-helpers.c
index b5e1837..0877f6b 100644
--- a/src/cats/threading/threading-helpers.c
+++ b/src/cats/threading/threading-helpers.c
@@ -20,15 +20,13 @@
 //
 
 #include <assert.h>
-#include "data/cats_datatypes.h"
 #include "threading-helpers.h"
 #include "logging.h"
 #include "threading.h"
 #include "misc/cats_maths_inline.h"
 #include "misc/cats_random.h"
 #include "stats/grid_stats.h"
-#include "data/error.h"
-#include "memory/cats_memory.h"
+#include "bdc_memory/bdc_memory.h"
 
 void create_custom_stats_for_thread(struct statistics *thread_stats, struct statistics *grid_stats)
 {
diff --git a/src/cats/threading/threading.c b/src/cats/threading/threading.c
index 9b89dbb..008df95 100644
--- a/src/cats/threading/threading.c
+++ b/src/cats/threading/threading.c
@@ -19,9 +19,9 @@
 // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 //
 
-#include <stdint.h>
+
 #include "cats_global.h"
-#include <memory/cats_memory.h>
+#include "bdc_memory/bdc_memory.h"
 
 #include "block_tasks.h"
 #include "misc/misc.h"
diff --git a/src/cats_csv/CMakeLists.txt b/src/cats_csv/CMakeLists.txt
index e3674eb..d3afbbe 100644
--- a/src/cats_csv/CMakeLists.txt
+++ b/src/cats_csv/CMakeLists.txt
@@ -13,4 +13,4 @@ target_sources(cats_csv
 
 
 set_property(TARGET cats_csv PROPERTY POSITION_INDEPENDENT_CODE ON)
-target_link_libraries(cats_logging cats_memory cats_strings)
\ No newline at end of file
+target_link_libraries(cats_logging bdc cats_strings)
\ No newline at end of file
diff --git a/src/cats_csv/cats_csv.c b/src/cats_csv/cats_csv.c
index 45a9bf1..db8cf59 100644
--- a/src/cats_csv/cats_csv.c
+++ b/src/cats_csv/cats_csv.c
@@ -27,7 +27,7 @@
 
 #include "cats_csv.h"
 #include <logging/logging.h>
-#include <memory/cats_memory.h>
+#include "bdc_memory/bdc_memory.h"
 
 
 struct cats_csv *csv_new(char *header_line, int32_t expected_fields)
diff --git a/src/cats_ini/CMakeLists.txt b/src/cats_ini/CMakeLists.txt
index 8d8eea0..8b03aec 100644
--- a/src/cats_ini/CMakeLists.txt
+++ b/src/cats_ini/CMakeLists.txt
@@ -18,4 +18,4 @@ target_sources(cats_ini
 
 
 set_property(TARGET cats_ini PROPERTY POSITION_INDEPENDENT_CODE ON)
-target_link_libraries(cats_logging cats_memory cats_strings)
+target_link_libraries(cats_logging cats_strings bdc)
diff --git a/src/cats_strings/cats_strings.c b/src/cats_strings/cats_strings.c
index cc3ebb7..4843f1b 100644
--- a/src/cats_strings/cats_strings.c
+++ b/src/cats_strings/cats_strings.c
@@ -25,7 +25,7 @@
 #include <string.h>
 #include "cats_strings.h"
 #include <logging/logging.h>
-#include <memory/cats_memory.h>
+#include "bdc_memory/bdc_memory.h"
 #include <assert.h>
 
 
diff --git a/src/cats_strings/string_helpers.c b/src/cats_strings/string_helpers.c
index 34f5239..eb6553f 100644
--- a/src/cats_strings/string_helpers.c
+++ b/src/cats_strings/string_helpers.c
@@ -25,7 +25,7 @@
 #include <string.h>
 #include <ctype.h>
 #include <logging/logging.h>
-#include <memory/cats_memory.h>
+#include "bdc_memory/bdc_memory.h"
 
 
 bool string_is_emptyish(const char *string)
diff --git a/src/cats_windows.h b/src/cats_windows.h
index 9c28524..a9f8868 100644
--- a/src/cats_windows.h
+++ b/src/cats_windows.h
@@ -38,7 +38,7 @@
 #define F_OK 0
 
 #include <string.h>
-#include <memory/cats_memory.h>
+#include <bdc_memory/bdc_memory.h>
 
 static inline char *strndup(const char *s, size_t n)
 {
diff --git a/src/logging/logging.c b/src/logging/logging.c
index 38172c8..601a5e0 100644
--- a/src/logging/logging.c
+++ b/src/logging/logging.c
@@ -26,7 +26,7 @@
 #include <stdarg.h>
 #include <stdlib.h>
 #include "logging.h"
-#include "memory/cats_memory.h"
+#include "bdc_memory/bdc_memory.h"
 #include "cats_time/cats_time.h"
 #include "misc/misc.h"
 
diff --git a/src/memory/CMakeLists.txt b/src/memory/CMakeLists.txt
deleted file mode 100644
index 2d42f3f..0000000
--- a/src/memory/CMakeLists.txt
+++ /dev/null
@@ -1,15 +0,0 @@
-add_library(cats_memory STATIC "" ../cats_defs.h ../cats_windows.h)
-
-target_sources(cats_memory
-               PRIVATE
-               cats_memory.c
-               raw_arrays.c
-               arrays.c
-               PUBLIC
-               cats_memory.h
-               raw_arrays.h
-               arrays.h
-               )
-
-#target_include_directories(cats_memory PUBLIC "..")
-set_property(TARGET cats_memory PROPERTY POSITION_INDEPENDENT_CODE ON)
\ No newline at end of file
diff --git a/src/memory/arrays.h b/src/memory/arrays.h
deleted file mode 100644
index 3e6b70c..0000000
--- a/src/memory/arrays.h
+++ /dev/null
@@ -1,64 +0,0 @@
-// SPDX-License-Identifier: GPL-3.0-or-later
-//
-// arrays.h
-//
-// Copyright (C) 2011-2024, University of Vienna and Vienna Institute for Nature Conservation & Analyses, Andreas Gattringer.
-//
-// 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, write to the Free Software
-// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-//
-
-#ifndef CATS_ARRAYS_H
-#define CATS_ARRAYS_H
-
-#include "data/cats_datatypes.h"
-#include "raw_arrays.h"
-
-struct cats_2d_array_float {
-        float **data;
-        struct cats_dimension dimension;
-};
-
-struct cats_2d_array_char {
-        char **data;
-        struct cats_dimension dimension;
-};
-
-struct cats_2d_array_double {
-        double **data;
-        struct cats_dimension dimension;
-};
-
-struct cats_2d_array_char *new_2d_array_char(struct cats_dimension dimension);
-
-struct cats_2d_array_double *new_2d_array_double(struct cats_dimension dimension);
-
-struct cats_2d_array_float *new_2d_array_float(struct cats_dimension dimension);
-
-void cleanup_2d_array_char(struct cats_2d_array_char **grid);
-
-void cleanup_2d_array_float(struct cats_2d_array_float **grid);
-
-void cleanup_2d_array_double(struct cats_2d_array_double **grid);
-
-#define free_cats_grid(PTR_TO_GRID) _Generic((PTR_TO_GRID), \
- struct cats_2d_array_float **:        cleanup_2d_array_float, \
- struct cats_2d_array_double **:       cleanup_2d_array_double, \
- struct cats_2d_array_char **:         cleanup_2d_array_char \
- )(PTR_TO_GRID)
-
-
-void *new_raw_2d_array_from_dimension(struct cats_dimension dimension, size_t member_size);
-
-#endif //CATS_ARRAYS_H
diff --git a/src/memory/cats_memory.h b/src/memory/cats_memory.h
deleted file mode 100644
index dbe7ce9..0000000
--- a/src/memory/cats_memory.h
+++ /dev/null
@@ -1,38 +0,0 @@
-// SPDX-License-Identifier: GPL-3.0-or-later
-//
-// cats_memory.h
-//
-// Copyright (C) 2011-2024, University of Vienna and Vienna Institute for Nature Conservation & Analyses, Andreas Gattringer.
-//
-// 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, write to the Free Software
-// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-//
-
-#ifndef CATS_CATS_MEMORY_H
-#define CATS_CATS_MEMORY_H
-
-#include <stddef.h>
-
-void *malloc_or_die_trace(size_t size, const char *func);
-
-void *realloc_or_die(void *ptr, size_t size);
-
-void *malloc_or_die(size_t size);
-
-void *calloc_or_die(size_t count, size_t size);
-
-#include <stddef.h>
-#include "data/cats_datatypes.h"
-
-#endif //CATS_CATS_MEMORY_H
diff --git a/src/modules/butterflies/butterflies_main.c b/src/modules/butterflies/butterflies_main.c
index 35712a7..e8e0b29 100644
--- a/src/modules/butterflies/butterflies_main.c
+++ b/src/modules/butterflies/butterflies_main.c
@@ -63,13 +63,13 @@ void *butterfly_grid_init(__attribute__((unused)) struct cats_configuration *con
 
         struct grid_data_butterflies *data = malloc_or_die(sizeof(struct grid_data_butterflies));
         log_message(LOG_INFO, "allocating data for generations");
-        data->generations = new_raw_2d_array_from_dimension(grid->dimension, sizeof(float));
-        data->info_layer = new_raw_2d_array_from_dimension(grid->dimension, sizeof(int32_t));
+        data->generations = new_raw_2d_array_from_dimension(&grid->dimension, sizeof(float));
+        data->info_layer = new_raw_2d_array_from_dimension(&grid->dimension, sizeof(int32_t));
         log_message(LOG_INFO, "done allocating data for generations");
         data->generation_current = 0;
 
         //struct conf_data_butterflies *conf_data = CATS_MODULE_DATA;
-        data->eggs = new_raw_2d_array_from_dimension(grid->dimension, sizeof(float));
+        data->eggs = new_raw_2d_array_from_dimension(&grid->dimension, sizeof(float));
 
         if (grid->param.parametrization != PARAM_HYBRID) {
                 log_message(LOG_ERROR, "%s only works with hybrid parametrisation mode", module_name);
diff --git a/src/modules/cats_test_module/register_module.c b/src/modules/cats_test_module/register_module.c
index a4f47fa..8289752 100644
--- a/src/modules/cats_test_module/register_module.c
+++ b/src/modules/cats_test_module/register_module.c
@@ -21,7 +21,7 @@
 
 #include "configuration/configuration.h"
 #include "cats_global.h"
-#include "memory/cats_memory.h"
+#include "bdc_memory/bdc_memory.h"
 #include "modules/load_module.h"
 #include "modules/module_header.h"
 #include "second_file.h"
diff --git a/src/tests/CMakeLists.txt b/src/tests/CMakeLists.txt
index 7e0e75d..237b15d 100644
--- a/src/tests/CMakeLists.txt
+++ b/src/tests/CMakeLists.txt
@@ -9,5 +9,5 @@ add_executable(vital_rate_test vital_rate_test.c)
 add_executable(csv_test csv_test.c )
 configure_file("test.csv" "test.csv")
 
-target_link_libraries(vital_rate_test cmocka cats_logging cats_memory cats_strings cats_ini cats_csv libcats)
-target_link_libraries(csv_test cmocka cats_strings cats_csv cats_strings cats_logging cats_memory)
+target_link_libraries(vital_rate_test cmocka cats_logging bdc cats_strings cats_ini cats_csv libcats)
+target_link_libraries(csv_test cmocka cats_strings cats_csv cats_strings cats_logging bdc)
diff --git a/src/tests/csv_test.c b/src/tests/csv_test.c
index 74ec635..1375ec1 100644
--- a/src/tests/csv_test.c
+++ b/src/tests/csv_test.c
@@ -23,11 +23,10 @@
 #include <setjmp.h>
 #include <cmocka.h>
 #include <stdio.h>
-#include "memory/cats_memory.h"
+#include "bdc_memory/bdc_memory.h"
 #include "cats_strings/cats_strings.h"
 #include "cats_csv/cats_csv.h"
-#include <unistd.h>
-#include <limits.h>
+
 
 struct csv_test {
         FILE *csv_file;
diff --git a/src/tests/vital_rate_test.c b/src/tests/vital_rate_test.c
index 1a0defe..1c6f98d 100644
--- a/src/tests/vital_rate_test.c
+++ b/src/tests/vital_rate_test.c
@@ -24,7 +24,7 @@
 #include "inline_vital_rates.h"
 #include "vital_rates/setup_rates.h"
 #include "debug/debug_vital_rates.h"
-#include "memory/cats_memory.h"
+#include "bdc_memory/bdc_memory.h"
 #include <stddef.h>
 #include <stdarg.h>
 #include <setjmp.h>
-- 
GitLab