From d82585cd90da93dbc4dfecacd97659509f72bb1f Mon Sep 17 00:00:00 2001
From: Danny Auble <da@llnl.gov>
Date: Fri, 21 May 2010 00:17:31 +0000
Subject: [PATCH] smap is on it's way, jobs and such don't work yet though, but
 partitions and blocks do

---
 slurm/slurmdb.h                 |   4 +
 src/common/hostlist.c           | 214 +++++++++++++--------------
 src/common/hostlist.h           |   4 +
 src/common/slurm_protocol_api.h |   1 +
 src/common/slurmdb_defs.c       |  32 ++++
 src/common/slurmdb_defs.h       |   1 +
 src/common/slurmdb_pack.c       |   2 +
 src/smap/opts.c                 |   2 +
 src/smap/partition_functions.c  | 197 +++++++++++--------------
 src/smap/smap.c                 | 254 +++++++++++++++++---------------
 src/smap/smap.h                 |   2 +
 11 files changed, 367 insertions(+), 346 deletions(-)

diff --git a/slurm/slurmdb.h b/slurm/slurmdb.h
index d7b8cb7369e..c9ef4ad1fdc 100644
--- a/slurm/slurmdb.h
+++ b/slurm/slurmdb.h
@@ -411,6 +411,10 @@ typedef struct {
 	uint32_t control_port;
 	uint32_t cpu_count;
 	uint16_t dimensions; /* number of dimensions this cluster is */
+	int *dim_size; /* For convenience only.
+			* Size of each dimension For now only on
+			* a bluegene cluster.  DOESN'T GET
+			* PACKED, is set up in slurmdb_get_info_cluster */
 	uint32_t flags;      /* set of CLUSTER_FLAG_* */
 	char *name;
 	char *nodes;
diff --git a/src/common/hostlist.c b/src/common/hostlist.c
index a802d136085..f52ca3a4e68 100644
--- a/src/common/hostlist.c
+++ b/src/common/hostlist.c
@@ -75,6 +75,7 @@
 #include "src/common/xmalloc.h"
 #include "src/common/timers.h"
 #include "src/common/xassert.h"
+#include "src/common/slurmdb_defs.h"
 
 /*
  * Define slurm-specific aliases for use by plugins, see slurm_xlator.h
@@ -294,8 +295,6 @@ static int dim_grid_size  = -1;
 /* used to protect the above grid, grid_start, and grid_end. */
 static pthread_mutex_t multi_dim_lock = PTHREAD_MUTEX_INITIALIZER;
 
-static int _set_hostlist_base();
-static void _parse_int_to_array(int in, int *out);
 static int _tell_if_used(int dim, int curr,
 			 int *start,
 			 int *end,
@@ -602,8 +601,7 @@ static int _width_equiv(unsigned long n, int *wn, unsigned long m, int *wm)
 static int host_prefix_end(const char *hostname)
 {
 	int idx, len;
-	int dims = working_cluster_rec ?
-		working_cluster_rec->dimensions : SYSTEM_DIMENSIONS;
+	int dims = slurmdb_setup_cluster_dims();
 
 	assert(hostname != NULL);
 
@@ -640,9 +638,8 @@ static hostname_t hostname_create(const char *hostname)
 	hostname_t hn = NULL;
 	char *p = '\0';
 	int idx = 0;
-	int hostlist_base = _set_hostlist_base();
-	int dims = working_cluster_rec ?
-		working_cluster_rec->dimensions : SYSTEM_DIMENSIONS;
+	int hostlist_base = hostlist_get_base();
+	int dims = slurmdb_setup_cluster_dims();
 	assert(hostname != NULL);
 
 	if (!(hn = (hostname_t) malloc(sizeof(*hn))))
@@ -950,8 +947,7 @@ static char *hostrange_pop(hostrange_t hr)
 {
 	size_t size = 0;
 	char *host = NULL;
-	int dims = working_cluster_rec ?
-		working_cluster_rec->dimensions : SYSTEM_DIMENSIONS;
+	int dims = slurmdb_setup_cluster_dims();
 
 	assert(hr != NULL);
 
@@ -968,7 +964,8 @@ static char *hostrange_pop(hostrange_t hr)
 				int i2=0;
 				int coord[dims];
 
-				_parse_int_to_array(hr->hi, coord);
+				hostlist_parse_int_to_array(
+					hr->hi, coord, dims, 0);
 
 				len = snprintf(host, size, "%s", hr->prefix);
 				for(i2 = 0; i2<dims; i2++) {
@@ -996,8 +993,7 @@ static char *hostrange_shift(hostrange_t hr)
 {
 	size_t size = 0;
 	char *host = NULL;
-	int dims = working_cluster_rec ?
-		working_cluster_rec->dimensions : SYSTEM_DIMENSIONS;
+	int dims = slurmdb_setup_cluster_dims();
 
 	assert(hr != NULL);
 
@@ -1015,7 +1011,8 @@ static char *hostrange_shift(hostrange_t hr)
 				int i2=0;
 				int coord[dims];
 
-				_parse_int_to_array(hr->lo, coord);
+				hostlist_parse_int_to_array(
+					hr->lo, coord, dims, 0);
 
 				len = snprintf(host, size, "%s", hr->prefix);
 				for(i2 = 0; i2<dims; i2++) {
@@ -1171,8 +1168,7 @@ hostrange_to_string(hostrange_t hr, size_t n, char *buf, char *separator)
 	int truncated = 0;
 	int len = 0;
 	char sep = separator == NULL ? ',' : separator[0];
-	int dims = working_cluster_rec ?
-		working_cluster_rec->dimensions : SYSTEM_DIMENSIONS;
+	int dims = slurmdb_setup_cluster_dims();
 
 	if (n == 0)
 		return 0;
@@ -1190,7 +1186,8 @@ hostrange_to_string(hostrange_t hr, size_t n, char *buf, char *separator)
 				int i2=0;
 				int coord[dims];
 
-				_parse_int_to_array(i, coord);
+				hostlist_parse_int_to_array(
+					i, coord, dims, 0);
 				ret = snprintf(buf+len, m, "%s", hr->prefix);
 				for(i2 = 0; i2<dims; i2++) {
 					if(len+ret < n)
@@ -1232,8 +1229,7 @@ hostrange_to_string(hostrange_t hr, size_t n, char *buf, char *separator)
 static size_t hostrange_numstr(hostrange_t hr, size_t n, char *buf)
 {
 	int len = 0;
-	int dims = working_cluster_rec ?
-		working_cluster_rec->dimensions : SYSTEM_DIMENSIONS;
+	int dims = slurmdb_setup_cluster_dims();
 
 	assert(buf != NULL);
 	assert(hr != NULL);
@@ -1246,7 +1242,8 @@ static size_t hostrange_numstr(hostrange_t hr, size_t n, char *buf)
 			int i2=0;
 			int coord[dims];
 
-			_parse_int_to_array(hr->lo, coord);
+			hostlist_parse_int_to_array(
+				hr->lo, coord, dims, 0);
 
 			for(i2 = 0; i2<dims; i2++) {
 				if(len <= n)
@@ -1267,7 +1264,8 @@ static size_t hostrange_numstr(hostrange_t hr, size_t n, char *buf)
 				int i2=0;
 				int coord[dims];
 
-				_parse_int_to_array(hr->hi, coord);
+				hostlist_parse_int_to_array(
+					hr->hi, coord, dims, 0);
 
 				buf[len++] = '-';
 				for(i2 = 0; i2<dims; i2++) {
@@ -1500,7 +1498,7 @@ hostlist_t _hostlist_create(const char *hostlist, char *sep, char *r_op)
 	char prefix[256] = "";
 	int pos = 0;
 	int error = 0;
-	int hostlist_base = _set_hostlist_base();
+	int hostlist_base = hostlist_get_base();
 	char range_op = r_op[0];/* XXX support > 1 char range ops in future? */
 
 	hostlist_t new = hostlist_new();
@@ -1651,8 +1649,7 @@ hostlist_t _hostlist_create(const char *hostlist, char *sep, char *r_op)
 static int _parse_box_range(char *str, struct _range *ranges,
  			    int len, int *count)
 {
-	int dims = working_cluster_rec ?
-		working_cluster_rec->dimensions : SYSTEM_DIMENSIONS;
+	int dims = slurmdb_setup_cluster_dims();
 	int start[dims], end[dims],
 		pos[dims];
 	char coord[dims+1];
@@ -1703,9 +1700,8 @@ static int _parse_single_range(const char *str, struct _range *range)
 {
 	char *p, *q;
 	char *orig = strdup(str);
-	int hostlist_base = _set_hostlist_base();
-	int dims = working_cluster_rec ?
-		working_cluster_rec->dimensions : SYSTEM_DIMENSIONS;
+	int hostlist_base = hostlist_get_base();
+	int dims = slurmdb_setup_cluster_dims();
 
 	if (!orig)
 		seterrno_ret(ENOMEM, 0);
@@ -1769,8 +1765,7 @@ static int _parse_range_list(char *str, struct _range *ranges, int len)
 {
 	char *p;
 	int count = 0;
-	int dims = working_cluster_rec ?
-		working_cluster_rec->dimensions : SYSTEM_DIMENSIONS;
+	int dims = slurmdb_setup_cluster_dims();
 
 	while (str) {
 		if (count == len) {
@@ -2225,8 +2220,7 @@ _hostrange_string(hostrange_t hr, int depth)
 {
 	char buf[MAXHOSTNAMELEN + 16];
 	int  len = snprintf(buf, MAXHOSTNAMELEN + 15, "%s", hr->prefix);
-	int dims = working_cluster_rec ?
-		working_cluster_rec->dimensions : SYSTEM_DIMENSIONS;
+	int dims = slurmdb_setup_cluster_dims();
 
 	if (!hr->singlehost) {
 		if (dims > 1) {
@@ -2234,7 +2228,8 @@ _hostrange_string(hostrange_t hr, int depth)
 				int i2=0;
 				int coord[dims];
 
-				_parse_int_to_array((hr->lo+depth), coord);
+				hostlist_parse_int_to_array(
+					(hr->lo+depth), coord, dims, 0);
 
 				for(i2 = 0; i2<dims; i2++) {
 					if(len <= (MAXHOSTNAMELEN + 15))
@@ -2538,6 +2533,63 @@ ssize_t hostlist_deranged_string(hostlist_t hl, size_t n, char *buf)
 	return truncated ? -1 : len;
 }
 
+int hostlist_get_base()
+{
+	int hostlist_base;
+	if(working_cluster_rec) {
+		if(working_cluster_rec->dimensions > 1)
+			hostlist_base = 36;
+		else
+			hostlist_base = 10;
+	} else
+		hostlist_base = HOSTLIST_BASE;
+
+	return hostlist_base;
+}
+
+
+void hostlist_parse_int_to_array(int in, int *out, int dims, int hostlist_base)
+{
+	int a;
+
+	static int my_start_pow_minus = 0;
+	static int my_start_pow = 0;
+	static int last_dims = 0;
+        int my_pow_minus = my_start_pow_minus;
+	int my_pow = my_start_pow;
+
+	if(!hostlist_base)
+		hostlist_base = hostlist_get_base();
+
+	if(!my_start_pow || (last_dims != dims)) {
+		/* this will never change so just calculate it once */
+		my_start_pow = 1;
+
+		/* To avoid having to use the pow function and include
+		   the math lib everywhere just do this. */
+		for(a = 0; a<dims; a++)
+			my_start_pow *= hostlist_base;
+
+		my_pow = my_start_pow;
+		my_pow_minus = my_start_pow_minus =
+			my_start_pow / hostlist_base;
+		last_dims = dims;
+	}
+
+	for(a = 0; a<dims; a++) {
+		out[a] = (int)in % my_pow;
+		/* This only needs to be done until we get a 0 here
+		   meaning we are on the last dimension. This avoids
+		   dividing by 0. */
+		if(dims - a) {
+			out[a] /= my_pow_minus;
+			/* set this up for the next dimension */
+			my_pow = my_pow_minus;
+			my_pow_minus /= hostlist_base;
+		}
+	}
+}
+
 /* return true if a bracket is needed for the range at i in hostlist hl */
 static int _is_bracket_needed(hostlist_t hl, int i)
 {
@@ -2598,61 +2650,6 @@ _get_bracketed_list(hostlist_t hl, int *start, const size_t n, char *buf)
 	return len;
 }
 
-static int _set_hostlist_base()
-{
-	int hostlist_base;
-	if(working_cluster_rec) {
-		if(working_cluster_rec->dimensions > 1)
-			hostlist_base = 36;
-		else
-			hostlist_base = 10;
-	} else
-		hostlist_base = HOSTLIST_BASE;
-
-	return hostlist_base;
-}
-
-static void _parse_int_to_array(int in, int *out)
-{
-	int a;
-
-	static int my_start_pow_minus = 0;
-	static int my_start_pow = 0;
-        int my_pow_minus = my_start_pow_minus;
-	int my_pow = my_start_pow;
-	int hostlist_base = _set_hostlist_base();
-	int dims = working_cluster_rec ?
-		working_cluster_rec->dimensions : SYSTEM_DIMENSIONS;
-
-	if(!my_start_pow) {
-		/* this will never change so just calculate it once */
-		my_start_pow = 1;
-
-		/* To avoid having to use the pow function and include
-		   the math lib everywhere just do this. */
-		for(a = 0; a<dims; a++)
-			my_start_pow *= hostlist_base;
-
-		my_pow = my_start_pow;
-		my_pow_minus = my_start_pow_minus =
-			my_start_pow / hostlist_base;
-	}
-
-	for(a = 0; a<dims; a++) {
-		out[a] = (int)in % my_pow;
-		/* This only needs to be done until we get a 0 here
-		   meaning we are on the last dimension. This avoids
-		   dividing by 0. */
-		if(dims - a) {
-			out[a] /= my_pow_minus;
-
-			/* set this up for the next dimension */
-			my_pow = my_pow_minus;
-			my_pow_minus /= hostlist_base;
-		}
-	}
-}
-
 static int _tell_if_used(int dim, int curr,
 			 int *start,
 			 int *end,
@@ -2660,8 +2657,7 @@ static int _tell_if_used(int dim, int curr,
 {
 	int rc = 1;
 	int start_curr = curr;
-	int dims = working_cluster_rec ?
-		working_cluster_rec->dimensions : SYSTEM_DIMENSIONS;
+	int dims = slurmdb_setup_cluster_dims();
 /* 	int i; */
 /* 	char coord[dims+1]; */
 /* 	memset(coord, 0, sizeof(coord)); */
@@ -2730,9 +2726,8 @@ end_it:
 static int _get_next_box(int *start,
 			 int *end)
 {
-	int hostlist_base = _set_hostlist_base();
-	int dims = working_cluster_rec ?
-		working_cluster_rec->dimensions : SYSTEM_DIMENSIONS;
+	int hostlist_base = hostlist_get_base();
+	int dims = slurmdb_setup_cluster_dims();
 	static int orig_grid_end[HIGHEST_DIMENSIONS];
 	static int last[HIGHEST_DIMENSIONS];
 	int pos[dims];
@@ -2826,8 +2821,7 @@ static int
 _get_boxes(char *buf, int max_len)
 {
 	int len=0, i;
-	int dims = working_cluster_rec ?
-		working_cluster_rec->dimensions : SYSTEM_DIMENSIONS;
+	int dims = slurmdb_setup_cluster_dims();
 	int curr_min[dims], curr_max[dims];
 /* 	char coord[dims+1]; */
 /* 	char coord2[dims+1]; */
@@ -2892,8 +2886,7 @@ _set_box_in_grid(int dim, int curr, int *start,
 {
 	int i;
 	int start_curr = curr;
-	int dims = working_cluster_rec ?
-		working_cluster_rec->dimensions : SYSTEM_DIMENSIONS;
+	int dims = slurmdb_setup_cluster_dims();
 
 	for (i=start[dim]; i<=end[dim]; i++) {
 		curr = start_curr + (i * offset[dim]);
@@ -2914,8 +2907,7 @@ static int _add_box_ranges(int dim,  int curr,
 {
 	int i;
 	int start_curr = curr;
-	int dims = working_cluster_rec ?
-		working_cluster_rec->dimensions : SYSTEM_DIMENSIONS;
+	int dims = slurmdb_setup_cluster_dims();
 
 	for (pos[dim]=start[dim]; pos[dim]<=end[dim]; pos[dim]++) {
 		curr = start_curr + (pos[dim] * offset[dim]);
@@ -2961,8 +2953,7 @@ static void _set_min_max_of_grid(int dim, int curr,
 {
 	int i;
 	int start_curr = curr;
-	int dims = working_cluster_rec ?
-		working_cluster_rec->dimensions : SYSTEM_DIMENSIONS;
+	int dims = slurmdb_setup_cluster_dims();
 
 	for (pos[dim]=start[dim]; pos[dim]<=end[dim]; pos[dim]++) {
 		curr = start_curr + (pos[dim] * offset[dim]);
@@ -2982,8 +2973,7 @@ static void _set_min_max_of_grid(int dim, int curr,
 static void
 _set_grid(unsigned long start, unsigned long end)
 {
-	int dims = working_cluster_rec ?
-		working_cluster_rec->dimensions : SYSTEM_DIMENSIONS;
+	int dims = slurmdb_setup_cluster_dims();
 	int sent_start[dims], sent_end[dims];
 	int i;
 /* 	char coord[dims+1]; */
@@ -2991,8 +2981,8 @@ _set_grid(unsigned long start, unsigned long end)
 /* 	memset(coord, 0, sizeof(coord)); */
 /* 	memset(coord2, 0, sizeof(coord2)); */
 
-	_parse_int_to_array(start, sent_start);
-	_parse_int_to_array(end, sent_end);
+	hostlist_parse_int_to_array(start, sent_start, dims, 0);
+	hostlist_parse_int_to_array(end, sent_end, dims, 0);
 
 	for(i = 0; i<dims; i++) {
 		grid_start[i] = MIN(grid_start[i], sent_start[i]);
@@ -3011,8 +3001,7 @@ _test_box_in_grid(int dim, int curr,
 {
 	int i;
 	int start_curr = curr;
-	int dims = working_cluster_rec ?
-		working_cluster_rec->dimensions : SYSTEM_DIMENSIONS;
+	int dims = slurmdb_setup_cluster_dims();
 
 	for (i=start[dim]; i<=end[dim]; i++) {
 		curr = start_curr + (i * offset[dim]);
@@ -3032,8 +3021,7 @@ static bool
 _test_box(int *start, int *end)
 {
 	int i;
-	int dims = working_cluster_rec ?
-		working_cluster_rec->dimensions : SYSTEM_DIMENSIONS;
+	int dims = slurmdb_setup_cluster_dims();
 
 	if(!memcmp(start, end, dim_grid_size)) /* single node */
 		return false;
@@ -3051,9 +3039,8 @@ ssize_t hostlist_ranged_string(hostlist_t hl, size_t n, char *buf)
 	int len = 0;
 	int truncated = 0;
 	bool box = false;
-	int hostlist_base = _set_hostlist_base();
-	int dims = working_cluster_rec ?
-		working_cluster_rec->dimensions : SYSTEM_DIMENSIONS;
+	int hostlist_base = hostlist_get_base();
+	int dims = slurmdb_setup_cluster_dims();
 	DEF_TIMERS;
 
 	START_TIMER;
@@ -3277,8 +3264,7 @@ char *hostlist_next(hostlist_iterator_t i)
 {
 	char buf[MAXHOSTNAMELEN + 16];
 	int len = 0;
-	int dims = working_cluster_rec ?
-		working_cluster_rec->dimensions : SYSTEM_DIMENSIONS;
+	int dims = slurmdb_setup_cluster_dims();
 
 	assert(i != NULL);
 	assert(i->magic == HOSTLIST_MAGIC);
@@ -3296,8 +3282,8 @@ char *hostlist_next(hostlist_iterator_t i)
 			if (i->hr->width == dims) {
 				int i2=0;
 				int coord[dims];
-				_parse_int_to_array((i->hr->lo + i->depth),
-						    coord);
+				hostlist_parse_int_to_array(
+					(i->hr->lo + i->depth), coord, dims, 0);
 				for(i2 = 0; i2<dims; i2++) {
 					if(len <= (MAXHOSTNAMELEN + 15))
 						buf[len++] =
diff --git a/src/common/hostlist.h b/src/common/hostlist.h
index 450950eb93a..812be1b2140 100644
--- a/src/common/hostlist.h
+++ b/src/common/hostlist.h
@@ -318,6 +318,10 @@ void hostlist_sort(hostlist_t hl);
  */
 void hostlist_uniq(hostlist_t hl);
 
+int hostlist_get_base();
+
+/* given a int will parse it into sizes in each dimension */
+void hostlist_parse_int_to_array(int in, int *out, int dims, int hostlist_base);
 
 /* ----[ hostlist print functions ]---- */
 
diff --git a/src/common/slurm_protocol_api.h b/src/common/slurm_protocol_api.h
index 428fa522d9f..6ff64149497 100644
--- a/src/common/slurm_protocol_api.h
+++ b/src/common/slurm_protocol_api.h
@@ -1056,6 +1056,7 @@ extern char *nodelist_nth_host(const char *nodelist, int inx);
 extern int nodelist_find(const char *nodelist, const char *name);
 extern void convert_num_unit(float num, char *buf, int buf_size, int orig_type);
 extern int revert_num_unit(const char *buf);
+extern void parse_int_to_array(int in, int *out);
 
 /*
  * slurm_job_step_create - Ask the slurm controller for a new job step
diff --git a/src/common/slurmdb_defs.c b/src/common/slurmdb_defs.c
index 2b973097ec0..f63fddf8f97 100644
--- a/src/common/slurmdb_defs.c
+++ b/src/common/slurmdb_defs.c
@@ -229,6 +229,7 @@ extern void slurmdb_destroy_cluster_rec(void *object)
 		if(slurmdb_cluster->accounting_list)
 			list_destroy(slurmdb_cluster->accounting_list);
 		xfree(slurmdb_cluster->control_host);
+		xfree(slurmdb_cluster->dim_size);
 		xfree(slurmdb_cluster->name);
 		xfree(slurmdb_cluster->nodes);
 		slurmdb_destroy_association_rec(slurmdb_cluster->root_assoc);
@@ -754,6 +755,12 @@ extern void slurmdb_destroy_report_cluster_grouping(void *object)
 	}
 }
 
+extern uint16_t slurmdb_setup_cluster_dims()
+{
+	return working_cluster_rec ?
+		working_cluster_rec->dimensions : SYSTEM_DIMENSIONS;
+}
+
 extern uint32_t slurmdb_setup_cluster_flags()
 {
 	uint32_t cluster_flags = 0;
@@ -863,6 +870,31 @@ extern List slurmdb_get_info_cluster(char *cluster_names)
 			err = 1;
 			goto next;
 		}
+
+		if(cluster_rec->flags & CLUSTER_FLAG_BG) {
+			int number, i, len;
+			char *nodes = cluster_rec->nodes;
+
+			cluster_rec->dim_size = xmalloc(
+				sizeof(int) * cluster_rec->dimensions);
+			len = strlen(nodes);
+			i = len - cluster_rec->dimensions;
+			if(nodes[len-1] == ']')
+				i--;
+			if(i > cluster_rec->dimensions) {
+				char *p = '\0';
+				number = strtoul(nodes + i, &p, 36);
+				hostlist_parse_int_to_array(
+					number, cluster_rec->dim_size,
+					cluster_rec->dimensions, 36);
+				/* all calculations this is for should
+				   be expecting 0 not to count as a
+				   number so add 1 to it. */
+				for(i=0; i<cluster_rec->dimensions; i++)
+					cluster_rec->dim_size[i]++;
+			}
+		}
+
 	next:
 		list_iterator_reset(itr);
 	}
diff --git a/src/common/slurmdb_defs.h b/src/common/slurmdb_defs.h
index ddc19c492c2..906b0468372 100644
--- a/src/common/slurmdb_defs.h
+++ b/src/common/slurmdb_defs.h
@@ -100,6 +100,7 @@ extern void slurmdb_destroy_report_cluster_grouping(void *object);
 extern void slurmdb_init_association_rec(slurmdb_association_rec_t *assoc);
 extern void slurmdb_init_qos_rec(slurmdb_qos_rec_t *qos);
 
+extern uint16_t slurmdb_setup_cluster_dims();
 extern uint32_t slurmdb_setup_cluster_flags();
 extern List slurmdb_get_info_cluster(char *cluster_name);
 extern char *slurmdb_qos_str(List qos_list, uint32_t level);
diff --git a/src/common/slurmdb_pack.c b/src/common/slurmdb_pack.c
index 00d2743cabd..44eb94962c9 100644
--- a/src/common/slurmdb_pack.c
+++ b/src/common/slurmdb_pack.c
@@ -36,6 +36,7 @@
  *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA.
 \*****************************************************************************/
 
+#include <stdlib.h>
 #include "slurmdb_pack.h"
 #include "slurm_protocol_defs.h"
 #include "list.h"
@@ -671,6 +672,7 @@ extern int slurmdb_unpack_cluster_rec(void **object, uint16_t rpc_version,
 
 		safe_unpack16(&object_ptr->rpc_version, buffer);
 	}
+
 	return SLURM_SUCCESS;
 
 unpack_error:
diff --git a/src/smap/opts.c b/src/smap/opts.c
index 47618327136..951c4b6bb81 100644
--- a/src/smap/opts.c
+++ b/src/smap/opts.c
@@ -169,6 +169,8 @@ extern void parse_command_line(int argc, char *argv[])
 			exit(0);
 		}
 	}
+	params.cluster_dims = slurmdb_setup_cluster_dims();
+	params.cluster_flags = slurmdb_setup_cluster_flags();
 }
 
 extern void print_date()
diff --git a/src/smap/partition_functions.c b/src/smap/partition_functions.c
index 5b3c371223d..376cd53325e 100644
--- a/src/smap/partition_functions.c
+++ b/src/smap/partition_functions.c
@@ -49,9 +49,7 @@
 typedef struct {
 	char *bg_block_name;
 	enum connection_type bg_conn_type;
-#ifdef HAVE_BGL
 	enum node_use_type bg_node_use;
-#endif
 	char *bg_user_name;
 	char *ionodes;
 	int job_running;
@@ -65,24 +63,18 @@ typedef struct {
 	rm_partition_state_t state;
 } db2_block_info_t;
 
-#ifdef HAVE_BG
 static List block_list = NULL;
-#endif
 
-#ifdef HAVE_BG
 static int _marknodes(db2_block_info_t *block_ptr, int count);
-#endif
 static void _print_header_part(void);
 static int  _print_text_part(partition_info_t *part_ptr,
 			     db2_block_info_t *db2_info_ptr);
-#ifdef HAVE_BG
 static void _block_list_del(void *object);
 static void _nodelist_del(void *object);
 static int _list_match_all(void *object, void *key);
 static int _in_slurm_partition(List slurm_nodes, List bg_nodes);
 static int _print_rest(db2_block_info_t *block_ptr);
 static int _make_nodelist(char *nodes, List nodelist);
-#endif
 
 extern void get_slurm_part()
 {
@@ -187,7 +179,6 @@ extern void get_slurm_part()
 
 extern void get_bg_part()
 {
-#ifdef HAVE_BG
 	int error_code, i, j, recs=0, count = 0, last_count = -1;
 	static partition_info_msg_t *part_info_ptr = NULL;
 	static partition_info_msg_t *new_part_ptr = NULL;
@@ -201,6 +192,9 @@ extern void get_bg_part()
 	List nodelist = NULL;
 	bitstr_t *nodes_req = NULL;
 
+	if(!(params.cluster_flags & CLUSTER_FLAG_BG))
+		return;
+
 	if (part_info_ptr) {
 		error_code = slurm_load_partitions(part_info_ptr->last_update,
 						   &new_part_ptr, SHOW_ALL);
@@ -310,9 +304,10 @@ extern void get_bg_part()
 			= xstrdup(new_bg_ptr->block_array[i].owner_name);
 		block_ptr->state = new_bg_ptr->block_array[i].state;
 		block_ptr->bg_conn_type	= new_bg_ptr->block_array[i].conn_type;
-#ifdef HAVE_BGL
-		block_ptr->bg_node_use = new_bg_ptr->block_array[i].node_use;
-#endif
+		if(params.cluster_flags & CLUSTER_FLAG_BGL)
+			block_ptr->bg_node_use =
+				new_bg_ptr->block_array[i].node_use;
+
 		block_ptr->ionodes
 			= xstrdup(new_bg_ptr->block_array[i].ionodes);
 		block_ptr->node_cnt = new_bg_ptr->block_array[i].node_cnt;
@@ -393,20 +388,21 @@ extern void get_bg_part()
 
 	if (params.commandline && params.iterate)
 		printf("\n");
-
+	
 	part_info_ptr = new_part_ptr;
 	bg_info_ptr = new_bg_ptr;
-#endif /* HAVE_BG */
 	return;
 }
 
-#ifdef HAVE_BG
 static int _marknodes(db2_block_info_t *block_ptr, int count)
 {
 	int j=0;
 	int start[BA_SYSTEM_DIMENSIONS];
 	int end[BA_SYSTEM_DIMENSIONS];
 	int number = 0;
+	int dims = slurmdb_setup_cluster_dims();
+	int hostlist_base = hostlist_get_base();
+	char *p = '\0';
 
 	block_ptr->letter_num = count;
 	while (block_ptr->nodes[j] != '\0') {
@@ -417,33 +413,23 @@ static int _marknodes(db2_block_info_t *block_ptr, int count)
 		    && (block_ptr->nodes[j+4] == 'x'
 			|| block_ptr->nodes[j+4] == '-')) {
 			j++;
-			number = xstrntol(block_ptr->nodes + j,
-					  NULL, BA_SYSTEM_DIMENSIONS,
-					  HOSTLIST_BASE);
-			start[X] = number / (HOSTLIST_BASE * HOSTLIST_BASE);
-			start[Y] = (number % (HOSTLIST_BASE * HOSTLIST_BASE))
-				/ HOSTLIST_BASE;
-			start[Z] = (number % HOSTLIST_BASE);
+			number = strtoul(block_ptr->nodes + j, &p,
+					 hostlist_base);
+			hostlist_parse_int_to_array(
+				number, start, dims, hostlist_base);
 			j += 4;
-			number = xstrntol(block_ptr->nodes + j,
-					  NULL, BA_SYSTEM_DIMENSIONS,
-					  HOSTLIST_BASE);
-			end[X] = number / (HOSTLIST_BASE * HOSTLIST_BASE);
-			end[Y] = (number % (HOSTLIST_BASE * HOSTLIST_BASE))
-				/ HOSTLIST_BASE;
-			end[Z] = (number % HOSTLIST_BASE);
+			number = strtoul(block_ptr->nodes + j, &p,
+					 hostlist_base);
+			hostlist_parse_int_to_array(
+				number, end, dims, hostlist_base);
 			j += 3;
 
 			if(block_ptr->state != RM_PARTITION_FREE)
-				block_ptr->size += set_grid_bg(start,
-							       end,
-							       count,
-							       1);
+				block_ptr->size += set_grid_bg(
+					start, end, count, 1);
 			else
-				block_ptr->size += set_grid_bg(start,
-							       end,
-							       count,
-							       0);
+				block_ptr->size += set_grid_bg(
+					start, end, count, 0);
 			if(block_ptr->nodes[j] != ',')
 				break;
 			j--;
@@ -452,18 +438,13 @@ static int _marknodes(db2_block_info_t *block_ptr, int count)
 			  || (block_ptr->nodes[j] >= 'A'
 			      && block_ptr->nodes[j] <= 'Z')) {
 
-			number = xstrntol(block_ptr->nodes + j,
-					  NULL, BA_SYSTEM_DIMENSIONS,
-					  HOSTLIST_BASE);
-			start[X] = number / (HOSTLIST_BASE * HOSTLIST_BASE);
-			start[Y] = (number % (HOSTLIST_BASE * HOSTLIST_BASE))
-				/ HOSTLIST_BASE;
-			start[Z] = (number % HOSTLIST_BASE);
+			number = strtoul(block_ptr->nodes + j, &p,
+					 hostlist_base);
+			hostlist_parse_int_to_array(
+				number, start, dims, hostlist_base);
 			j+=3;
-			block_ptr->size += set_grid_bg(start,
-						       start,
-						       count,
-						       0);
+			block_ptr->size += set_grid_bg(
+				start, start, count, 0);
 			if(block_ptr->nodes[j] != ',')
 				break;
 			j--;
@@ -472,7 +453,6 @@ static int _marknodes(db2_block_info_t *block_ptr, int count)
 	}
 	return SLURM_SUCCESS;
 }
-#endif
 
 static void _print_header_part(void)
 {
@@ -514,24 +494,23 @@ static void _print_header_part(void)
 				  main_ycord,
 				  main_xcord, "CONN");
 			main_xcord += 7;
-#ifdef HAVE_BGL
-			mvwprintw(text_win,
-				  main_ycord,
-				  main_xcord, "NODE_USE");
-			main_xcord += 10;
-#endif
+			if(params.cluster_flags & CLUSTER_FLAG_BGL) {
+				mvwprintw(text_win,
+					  main_ycord,
+					  main_xcord, "NODE_USE");
+				main_xcord += 10;
+			}
 		}
 
 		mvwprintw(text_win, main_ycord,
 			  main_xcord, "NODES");
 		main_xcord += 7;
-#ifdef HAVE_BG
-		mvwprintw(text_win, main_ycord,
-			  main_xcord, "BP_LIST");
-#else
-		mvwprintw(text_win, main_ycord,
-			  main_xcord, "NODELIST");
-#endif
+		if(params.cluster_flags & CLUSTER_FLAG_BG)
+			mvwprintw(text_win, main_ycord,
+				  main_xcord, "BP_LIST");
+		else
+			mvwprintw(text_win, main_ycord,
+				  main_xcord, "NODELIST");
 		main_xcord = 1;
 		main_ycord++;
 	} else {
@@ -545,17 +524,15 @@ static void _print_header_part(void)
 			printf("   JOBID ");
 			printf("    USER ");
 			printf(" CONN ");
-#ifdef HAVE_BGL
-			printf(" NODE_USE ");
-#endif
+			if(params.cluster_flags & CLUSTER_FLAG_BGL)
+				printf(" NODE_USE ");
 		}
 
 		printf("NODES ");
-#ifdef HAVE_BG
-		printf("BP_LIST\n");
-#else
-		printf("NODELIST\n");
-#endif
+		if(params.cluster_flags & CLUSTER_FLAG_BG)
+			printf("BP_LIST\n");
+		else
+			printf("NODELIST\n");
 	}
 }
 
@@ -571,12 +548,11 @@ static int _print_text_part(partition_info_t *part_ptr,
 	char tmp_cnt[8];
 	char tmp_char[8];
 
-#ifdef HAVE_BG
-	convert_num_unit((float)part_ptr->total_nodes, tmp_cnt,
-			 sizeof(tmp_cnt), UNIT_NONE);
-#else
-	snprintf(tmp_cnt, sizeof(tmp_cnt), "%u", part_ptr->total_nodes);
-#endif
+	if(params.cluster_flags & CLUSTER_FLAG_BG)
+		convert_num_unit((float)part_ptr->total_nodes, tmp_cnt,
+				 sizeof(tmp_cnt), UNIT_NONE);
+	else
+		snprintf(tmp_cnt, sizeof(tmp_cnt), "%u", part_ptr->total_nodes);
 
 	if(!params.commandline) {
 		uint16_t root_only = 0;
@@ -672,14 +648,15 @@ static int _print_text_part(partition_info_t *part_ptr,
 						  db2_info_ptr->
 						  bg_conn_type));
 				main_xcord += 7;
-#ifdef HAVE_BGL
-				mvwprintw(text_win,
-					  main_ycord,
-					  main_xcord, "%.9s",
-					  node_use_string(
-						  db2_info_ptr->bg_node_use));
-				main_xcord += 10;
-#endif
+				if(params.cluster_flags & CLUSTER_FLAG_BGL) {
+					mvwprintw(text_win,
+						  main_ycord,
+						  main_xcord, "%.9s",
+						  node_use_string(
+							  db2_info_ptr->
+							  bg_node_use));
+					main_xcord += 10;
+				}
 			} else {
 				mvwprintw(text_win,
 					  main_ycord,
@@ -810,10 +787,10 @@ static int _print_text_part(partition_info_t *part_ptr,
 
 				printf("%5.5s ", conn_type_string(
 					       db2_info_ptr->bg_conn_type));
-#ifdef HAVE_BGL
-				printf("%9.9s ",  node_use_string(
-					       db2_info_ptr->bg_node_use));
-#endif
+				if(params.cluster_flags & CLUSTER_FLAG_BGL)
+					printf("%9.9s ", node_use_string(
+						       db2_info_ptr->
+						       bg_node_use));
 			}
 		}
 
@@ -833,7 +810,6 @@ static int _print_text_part(partition_info_t *part_ptr,
 	return printed;
 }
 
-#ifdef HAVE_BG
 static void _block_list_del(void *object)
 {
 	db2_block_info_t *block_ptr = (db2_block_info_t *)object;
@@ -932,10 +908,11 @@ static int _addto_nodelist(List nodelist, int *start, int *end)
 {
 	int *coord = NULL;
 	int x,y,z;
-
-	if(end[X] >= DIM_SIZE[X]
-	   || end[Y] >= DIM_SIZE[Y]
-	   || end[Z] >= DIM_SIZE[Z]) {
+	int *use_dims = working_cluster_rec ?
+		working_cluster_rec->dim_size : DIM_SIZE;
+	if(end[X] >= use_dims[X]
+	   || end[Y] >= use_dims[Y]
+	   || end[Z] >= use_dims[Z]) {
 		fatal("It appears the slurm.conf file has changed since "
 		      "the last restart.\nThings are in an incompatible "
 		      "state, please restart the slurmctld.");
@@ -965,6 +942,9 @@ static int _make_nodelist(char *nodes, List nodelist)
 	int number;
 	int start[BA_SYSTEM_DIMENSIONS];
 	int end[BA_SYSTEM_DIMENSIONS];
+	char *p = '\0';
+	int dims = slurmdb_setup_cluster_dims();
+	int hostlist_base = hostlist_get_base();
 
 	if(!nodelist)
 		nodelist = list_create(_nodelist_del);
@@ -976,21 +956,13 @@ static int _make_nodelist(char *nodes, List nodelist)
 		    && (nodes[j+4] == 'x'
 			|| nodes[j+4] == '-')) {
 			j++;
-			number = xstrntol(nodes + j, NULL,
-					  BA_SYSTEM_DIMENSIONS, HOSTLIST_BASE);
-			start[X] = number / (HOSTLIST_BASE * HOSTLIST_BASE);
-			start[Y] = (number % (HOSTLIST_BASE * HOSTLIST_BASE))
-				/ HOSTLIST_BASE;
-			start[Z] = (number % HOSTLIST_BASE);
-
+			number = strtoul(nodes + j, &p, hostlist_base);
+			hostlist_parse_int_to_array(
+				number, start, dims, hostlist_base);
 			j += 4;
-			number = xstrntol(nodes + j, NULL,
-					  BA_SYSTEM_DIMENSIONS, HOSTLIST_BASE);
-			end[X] = number / (HOSTLIST_BASE * HOSTLIST_BASE);
-			end[Y] = (number % (HOSTLIST_BASE * HOSTLIST_BASE))
-				/ HOSTLIST_BASE;
-			end[Z] = (number % HOSTLIST_BASE);
-
+			number = strtoul(nodes + j, &p, hostlist_base);
+			hostlist_parse_int_to_array(
+				number, end, dims, hostlist_base);
 			j += 3;
 			_addto_nodelist(nodelist, start, end);
 			if(nodes[j] != ',')
@@ -999,12 +971,9 @@ static int _make_nodelist(char *nodes, List nodelist)
 		} else if((nodes[j] >= '0' && nodes[j] <= '9')
 			  || (nodes[j] >= 'A' && nodes[j] <= 'Z')) {
 
-			number = xstrntol(nodes + j, NULL,
-					  BA_SYSTEM_DIMENSIONS, HOSTLIST_BASE);
-			start[X] = number / (HOSTLIST_BASE * HOSTLIST_BASE);
-			start[Y] = (number % (HOSTLIST_BASE * HOSTLIST_BASE))
-				/ HOSTLIST_BASE;
-			start[Z] = (number % HOSTLIST_BASE);
+			number = strtoul(nodes + j, &p, hostlist_base);
+			hostlist_parse_int_to_array(
+				number, start, dims, hostlist_base);
 			j+=3;
 			_addto_nodelist(nodelist, start, start);
 			if(nodes[j] != ',')
@@ -1015,5 +984,3 @@ static int _make_nodelist(char *nodes, List nodelist)
 	}
 	return 1;
 }
-
-#endif
diff --git a/src/smap/smap.c b/src/smap/smap.c
index 64d699af52a..9d50a8de385 100644
--- a/src/smap/smap.c
+++ b/src/smap/smap.c
@@ -44,11 +44,8 @@
 #include <signal.h>
 #include "src/smap/smap.h"
 
-#ifdef HAVE_3D
-#define MIN_SCREEN_WIDTH 92
-#else
-#define MIN_SCREEN_WIDTH 72
-#endif
+static int min_screen_width = 72;
+
 /********************
  * Global Variables *
  ********************/
@@ -87,9 +84,7 @@ int main(int argc, char *argv[])
 	int end = 0;
 	int i;
 	int rc;
-#ifdef HAVE_BG
 	int mapset = 0;
-#endif
 	//char *name;
 
 	log_init(xbasename(argv[0]), opts, SYSLOG_FACILITY_DAEMON, NULL);
@@ -99,8 +94,12 @@ int main(int argc, char *argv[])
 		log_alter(opts, SYSLOG_FACILITY_USER, NULL);
 	}
 
-	if(params.clusters)
-		working_cluster_rec = list_peek(params.clusters);
+	if(params.cluster_dims == 4) {
+		/* FIX ME: smap doesn't do anything correctly with
+		   more than 3 dims yet.
+		*/
+	} else if(params.cluster_dims == 3)
+		min_screen_width = 92;
 
 	while (slurm_load_node((time_t) NULL, &new_node_ptr, SHOW_ALL)) {
 		error_code = slurm_get_errno();
@@ -161,33 +160,36 @@ int main(int argc, char *argv[])
 		}
 part_fini:
 #else
-		printf("Must be on BG System to resolve.\n");
+		printf("Must be physically on a BG System to resolve.\n");
 #endif
 		ba_fini();
 		xfree(params.resolve);
 		exit(0);
 	}
 	if(!params.commandline) {
-
+		int check_width = min_screen_width;
 		signal(SIGWINCH, (void (*)(int))_resize_handler);
 		initscr();
 
-#ifdef HAVE_3D
-		height = DIM_SIZE[Y] * DIM_SIZE[Z] + DIM_SIZE[Y] + 3;
-		width = DIM_SIZE[X] + DIM_SIZE[Z] + 3;
-		if (COLS < (MIN_SCREEN_WIDTH + width) || LINES < height) {
-			width += MIN_SCREEN_WIDTH;
-#else
-		height = 10;
-		width = COLS;
-	        if (COLS < MIN_SCREEN_WIDTH || LINES < height) {
-			width = MIN_SCREEN_WIDTH;
-#endif
+		if(params.cluster_dims == 4) {
+			/* FIX ME: smap doesn't do anything correctly with
+			   more than 3 dims yet.
+			*/
+		} else if(params.cluster_dims == 3) {
+			height = DIM_SIZE[Y] * DIM_SIZE[Z] + DIM_SIZE[Y] + 3;
+			width = DIM_SIZE[X] + DIM_SIZE[Z] + 3;
+			check_width += width;
+		} else {
+			height = 10;
+			width = COLS;
+		}
+
+	        if (COLS < check_width || LINES < height) {
 			endwin();
 			error("Screen is too small make sure the screen "
 			      "is at least %dx%d\n"
 			      "Right now it is %dx%d\n",
-			      width,
+			      check_width,
 			      height,
 			      COLS,
 			      LINES);
@@ -208,17 +210,20 @@ part_fini:
 		max_display = grid_win->_maxy * grid_win->_maxx;
 		//scrollok(grid_win, TRUE);
 
-#ifdef HAVE_3D
-		startx = width;
-		COLS -= 2;
-		width = COLS - width;
-		height = LINES;
-#else
-		startx = 0;
-		starty = height;
-		height = LINES - height;
-
-#endif
+		if(params.cluster_dims == 4) {
+			/* FIX ME: smap doesn't do anything correctly with
+			   more than 3 dims yet.
+			*/
+		} else if(params.cluster_dims == 3) {
+			startx = width;
+			COLS -= 2;
+			width = COLS - width;
+			height = LINES;
+		} else {
+			startx = 0;
+			starty = height;
+			height = LINES - height;
+		}
 
 		text_win = newwin(height, width, starty, startx);
         }
@@ -249,29 +254,36 @@ part_fini:
 		case SLURMPART:
 			get_slurm_part();
 			break;
-#ifdef HAVE_BG
 		case COMMANDS:
-			if(!mapset) {
-				mapset = set_bp_map();
-				wclear(text_win);
-				//doupdate();
-				//move(0,0);
+			if(params.cluster_flags & CLUSTER_FLAG_BG) {
+				if(!mapset) {
+					mapset = set_bp_map();
+					wclear(text_win);
+					//doupdate();
+					//move(0,0);
+				}
+				get_command();
+			} else {
+				error("Must be on a BG SYSTEM to "
+				      "run this command");
+				if(!params.commandline)
+					endwin();
+				ba_fini();
+				exit(1);
 			}
-			get_command();
-			break;
-		case BGPART:
-			get_bg_part();
 			break;
-#else
-		case COMMANDS:
 		case BGPART:
-			error("Must be on a BG SYSTEM to run this command");
-			if(!params.commandline)
-				endwin();
-			ba_fini();
-			exit(1);
+			if(params.cluster_flags & CLUSTER_FLAG_BG)
+				get_bg_part();
+			else {
+				error("Must be on a BG SYSTEM to "
+				      "run this command");
+				if(!params.commandline)
+					endwin();
+				ba_fini();
+				exit(1);
+			}
 			break;
-#endif
 		}
 
 		if(!params.commandline) {
@@ -359,19 +371,19 @@ static int _get_option()
 	case '-':
 	case '_':
 		text_line_cnt++;
-		return 1;
-		break;
+	return 1;
+	break;
 	case KEY_LEFT:
 	case '=':
 	case '+':
 		text_line_cnt--;
-		if(text_line_cnt<0) {
-			text_line_cnt = 0;
-			return 0;
+	if(text_line_cnt<0) {
+		text_line_cnt = 0;
+		return 0;
 
-		}
-		return 1;
-		break;
+	}
+	return 1;
+	break;
 
 	case 'H':
 	case 'h':
@@ -379,8 +391,8 @@ static int _get_option()
 			params.all_flag = 0;
 		else
 			params.all_flag = 1;
-		return 1;
-	        break;
+	return 1;
+	break;
 	case 's':
 		text_line_cnt = 0;
 		grid_line_cnt = 0;
@@ -399,47 +411,49 @@ static int _get_option()
 		params.display = RESERVATIONS;
 		return 1;
 		break;
-#ifdef HAVE_BG
 	case 'b':
-		text_line_cnt = 0;
-		grid_line_cnt = 0;
-		params.display = BGPART;
-		return 1;
+		if(params.cluster_flags & CLUSTER_FLAG_BG) {
+			text_line_cnt = 0;
+			grid_line_cnt = 0;
+			params.display = BGPART;
+			return 1;
+		}
 		break;
 	case 'c':
-		params.display = COMMANDS;
-		return 1;
+		if(params.cluster_flags & CLUSTER_FLAG_BG) {
+			params.display = COMMANDS;
+			return 1;
+		}
 		break;
-#endif
-
-#ifndef HAVE_BG
 	case 'u':
 	case KEY_UP:
-		grid_line_cnt--;
-		if(grid_line_cnt<0) {
-			grid_line_cnt = 0;
-			return 0;
+		if(!(params.cluster_flags & CLUSTER_FLAG_BG)) {
+			grid_line_cnt--;
+			if(grid_line_cnt<0) {
+				grid_line_cnt = 0;
+				return 0;
+			}
+			return 1;
 		}
-		return 1;
-		break;
+	break;
 	case 'd':
 	case KEY_DOWN:
-		grid_line_cnt++;
-		if((((grid_line_cnt-2) * (grid_win->_maxx-1)) +
-		    max_display) > DIM_SIZE[X]) {
-			grid_line_cnt--;
-			return 0;
+		if(!(params.cluster_flags & CLUSTER_FLAG_BG)) {
+			grid_line_cnt++;
+			if((((grid_line_cnt-2) * (grid_win->_maxx-1)) +
+			    max_display) > DIM_SIZE[X]) {
+				grid_line_cnt--;
+				return 0;
+			}
+			return 1;
 		}
-
-		return 1;
-		break;
-#endif
+	break;
 	case 'q':
 	case '\n':
 		endwin();
-		ba_fini();
-		exit(0);
-		break;
+	ba_fini();
+	exit(0);
+	break;
 	}
 	return 0;
 }
@@ -447,7 +461,8 @@ static int _get_option()
 static void *_resize_handler(int sig)
 {
 	int startx=0, starty=0;
-	int height, width;
+	int height = 40, width = 100;
+	int check_width = min_screen_width;
 	main_ycord = 1;
 
 	/* clear existing data and update to avoid ghost during resize */
@@ -464,18 +479,20 @@ static void *_resize_handler(int sig)
 	doupdate();	/* update now to make sure we get the new size */
 	getmaxyx(stdscr,LINES,COLS);
 
-#ifdef HAVE_3D
-	height = DIM_SIZE[Y] * DIM_SIZE[Z] + DIM_SIZE[Y] + 3;
-	width = DIM_SIZE[X] + DIM_SIZE[Z] + 3;
-	if (COLS < (MIN_SCREEN_WIDTH + width) || LINES < height) {
-		width += MIN_SCREEN_WIDTH;
-#else
-	height = 10;
-	width = COLS;
-	if (COLS < MIN_SCREEN_WIDTH || LINES < height) {
-		width = MIN_SCREEN_WIDTH;
-#endif
+	if(params.cluster_dims == 4) {
+		/* FIX ME: smap doesn't do anything correctly with
+		   more than 3 dims yet.
+		*/
+	} else if(params.cluster_dims == 3) {
+		height = DIM_SIZE[Y] * DIM_SIZE[Z] + DIM_SIZE[Y] + 3;
+		width = DIM_SIZE[X] + DIM_SIZE[Z] + 3;
+		check_width += width;
+	} else {
+		height = 10;
+		width = COLS;
+	}
 
+	if (COLS < check_width || LINES < height) {
 		endwin();
 		error("Screen is too small make sure "
 		      "the screen is at least %dx%d\n"
@@ -487,17 +504,20 @@ static void *_resize_handler(int sig)
 	grid_win = newwin(height, width, starty, startx);
 	max_display = grid_win->_maxy * grid_win->_maxx;
 
-#ifdef HAVE_3D
-	startx = width;
-	COLS -= 2;
-	width = COLS - width;
-	height = LINES;
-#else
-	startx = 0;
-	starty = height;
-	height = LINES - height;
-
-#endif
+	if(params.cluster_dims == 4) {
+		/* FIX ME: smap doesn't do anything correctly with
+		   more than 3 dims yet.
+		*/
+	} else if(params.cluster_dims == 3) {
+		startx = width;
+		COLS -= 2;
+		width = COLS - width;
+		height = LINES;
+	} else {
+		startx = 0;
+		starty = height;
+		height = LINES - height;
+	}
 
 	text_win = newwin(height, width, starty, startx);
 
@@ -512,14 +532,14 @@ static void *_resize_handler(int sig)
 	case SLURMPART:
 		get_slurm_part();
 		break;
-#ifdef HAVE_BG
 	case COMMANDS:
-		get_command();
+		if(params.cluster_flags & CLUSTER_FLAG_BG)
+			get_command();
 		break;
 	case BGPART:
-		get_bg_part();
+		if(params.cluster_flags & CLUSTER_FLAG_BG)
+			get_bg_part();
 		break;
-#endif
 	}
 
 	print_grid(grid_line_cnt * (grid_win->_maxx-1));
diff --git a/src/smap/smap.h b/src/smap/smap.h
index e3d66880cce..5ea1eb4cdbf 100644
--- a/src/smap/smap.h
+++ b/src/smap/smap.h
@@ -115,6 +115,8 @@ enum { JOBS, RESERVATIONS, SLURMPART, BGPART, COMMANDS };
 typedef struct {
 	bool all_flag;
 	List clusters;
+	uint16_t cluster_dims;
+	uint32_t cluster_flags;
 	bool commandline;
 	int display;
 	int iterate;
-- 
GitLab