summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorschnetter <schnetter@17b73243-c579-4c4c-a9d2-2d5706c11dac>2003-11-21 15:27:25 +0000
committerschnetter <schnetter@17b73243-c579-4c4c-a9d2-2d5706c11dac>2003-11-21 15:27:25 +0000
commita78302e02db75eefebcaea943239ec48099c556e (patch)
tree67328e853b33fda8b98b400a39c5601c26d3c1e5
parentd214164831555d2307ac1c6b9bd53bee8f6f84f4 (diff)
Allow vector groups of scalars.
Allow vector groups with more than one declared variable. Much of this patch consists of removing special case code for scalars. Scalars are now almost everywhere treated as rank 0 arrays. git-svn-id: http://svn.cactuscode.org/flesh/trunk@3465 17b73243-c579-4c4c-a9d2-2d5706c11dac
-rwxr-xr-xlib/make/configure5
-rw-r--r--lib/make/configure.in5
-rw-r--r--lib/make/force-rebuild6
-rw-r--r--lib/sbin/CST4
-rw-r--r--lib/sbin/GridFuncStuff.pl24
-rw-r--r--lib/sbin/interface_parser.pl42
-rw-r--r--src/include/cctk_Groups.h1
-rw-r--r--src/include/cctki_Groups.h3
-rw-r--r--src/main/Groups.c106
9 files changed, 80 insertions, 116 deletions
diff --git a/lib/make/configure b/lib/make/configure
index d2c5d802..b9cb7727 100755
--- a/lib/make/configure
+++ b/lib/make/configure
@@ -4824,10 +4824,7 @@ fi
# How to link the cactus libraries
-# Currently (2003-10-07) the dependencies from the configure.ccl file are
-# not handled correctly. As a temporary work-around, we re-enable the
-# old behaviour.
-: ${CACTUSLIBLINKLINE='-L$(CCTK_LIBDIR) $(addprefix -l, $(ALLCACTUSLIBS) $(ALLCACTUSLIBS))'}
+: ${CACTUSLIBLINKLINE='-L$(CCTK_LIBDIR) $(addprefix -l, $(ALLCACTUSLIBS))'}
# How to generate C dependency info
diff --git a/lib/make/configure.in b/lib/make/configure.in
index 7c650159..3fb273a5 100644
--- a/lib/make/configure.in
+++ b/lib/make/configure.in
@@ -904,10 +904,7 @@ AC_SUBST(LIBNAME_SUFFIX)
# How to link the cactus libraries
AC_SUBST(CACTUSLIBLINKLINE)
-# Currently (2003-10-07) the dependencies from the configure.ccl file are
-# not handled correctly. As a temporary work-around, we re-enable the
-# old behaviour.
-: ${CACTUSLIBLINKLINE='-L$(CCTK_LIBDIR) $(addprefix -l, $(ALLCACTUSLIBS) $(ALLCACTUSLIBS))'}
+: ${CACTUSLIBLINKLINE='-L$(CCTK_LIBDIR) $(addprefix -l, $(ALLCACTUSLIBS))'}
# How to generate C dependency info
AC_SUBST(C_DEPEND)
diff --git a/lib/make/force-rebuild b/lib/make/force-rebuild
index e43dab88..c0cb471b 100644
--- a/lib/make/force-rebuild
+++ b/lib/make/force-rebuild
@@ -5,7 +5,7 @@
# @desc
# Timestamp file for forcing rebuilds of configurations
# @enddesc
-# @version $Id: force-rebuild,v 1.9 2003-11-19 16:47:40 schnetter Exp $
+# @version $Id: force-rebuild,v 1.10 2003-11-21 15:27:24 schnetter Exp $
# @@*/
6 March 2003: minor changes to CreateFunctionBindings.pl
@@ -17,4 +17,6 @@
27 October 2003: Provide function prototypes for both Fortran and C
28 October 2003: Correct passing of pointers between C and Fortran.
6 November 2003: Treat scalars as rank 0 arrays.
-19 November 2003: Change include mechanism for cctk_Functions.h
+19 November 2003: Change include mechanism for cctk_Functions.h.
+21 November 2003: Allow vector scalars.
+21 November 2003: Allow vector groups to have multiple variables.
diff --git a/lib/sbin/CST b/lib/sbin/CST
index 372632e3..d36a675c 100644
--- a/lib/sbin/CST
+++ b/lib/sbin/CST
@@ -6,7 +6,7 @@
# @desc
# Parses the the configuration files for thorns.
# @enddesc
-# @version $Header: /mnt/data2/cvs2svn/cvs-repositories/Cactus/lib/sbin/CST,v 1.58 2003-11-18 18:27:28 tradke Exp $
+# @version $Header: /mnt/data2/cvs2svn/cvs-repositories/Cactus/lib/sbin/CST,v 1.59 2003-11-21 15:27:24 schnetter Exp $
#@@*/
# Global parameter to track the number of errors from the CST
@@ -326,7 +326,7 @@ sub CreateMakeThornlist
$thorn_linklist .= ' ' . &CreateThornLinkList($thorns, $config);
- return ($thornlist . "\n" . $thorn_linklist . "\n" . $config_thornlist);
+ return ($thornlist . "\n" . $thorn_linklist . "\n" . $config_thornlist . "\n");
}
diff --git a/lib/sbin/GridFuncStuff.pl b/lib/sbin/GridFuncStuff.pl
index e83985ad..80fc511a 100644
--- a/lib/sbin/GridFuncStuff.pl
+++ b/lib/sbin/GridFuncStuff.pl
@@ -349,7 +349,7 @@ sub GetThornArguments
my $vararraysize = $rhinterface_db->{"\U$thorn GROUP $group\E VARARRAY_SIZE"};
my $compactgroup = $rhinterface_db->{"\U$thorn GROUP $group\E COMPACT"};
- if($gtype eq 'GF' || $gtype eq 'ARRAY')
+ if($gtype eq 'GF' || $gtype eq 'ARRAY' || ($gtype eq 'SCALAR' && defined($vararraysize)))
{
$type .= ' (';
@@ -1078,29 +1078,25 @@ sub CreateThornGroupInitialisers
{
# Check that the size is allowed.
&CheckArraySizes($rhinterface_db->{"\U$thorn GROUP $group\E VARARRAY_SIZE"},$thorn,$rhparameter_db,$rhinterface_db);
- # Flag Cactus that it is a vector group.
- $line = ' -1';
+ # Pass in the size of the GV array, which may be a valid parameter expression
+ $line = ' "'
+ . $rhinterface_db->{"\U$thorn GROUP $group\E VARARRAY_SIZE"}
+ . '",';
+ push(@data, $line);
}
else
{
- $line = ' ' . scalar(@variables);
+ $line = ' NULL,';
+ push(@data, $line);
}
+ $line = ' ' . scalar(@variables);
+
foreach $variable (@variables)
{
$line .= ",\n \"$variable\"";
}
- # Pass in the size of the GV array, which may be a valid parameter expression
- if(defined($rhinterface_db->{"\U$thorn GROUP $group\E VARARRAY_SIZE"}))
- {
- $line .= ',';
- push(@data, $line);
- $line = ' "';
- $line .= $rhinterface_db->{"\U$thorn GROUP $group\E VARARRAY_SIZE"};
- $line .= '"';
- }
-
$line .= ') == 1)';
push(@data, $line);
diff --git a/lib/sbin/interface_parser.pl b/lib/sbin/interface_parser.pl
index 53ad310a..2259c2a7 100644
--- a/lib/sbin/interface_parser.pl
+++ b/lib/sbin/interface_parser.pl
@@ -786,7 +786,7 @@ sub parse_interface_ccl
$interface_db{"\U$thorn FUNCTION\E $funcname ARGS"} .= "${funcargs} ";
$interface_db{"\U$thorn FUNCTION\E $funcname RET"} .= "${rettype} ";
}
- elsif ($line =~ m/^\s*(CCTK_)?(CHAR|BYTE|INT|INT1|INT2|INT4|INT8|REAL|REAL4|REAL8|REAL16|COMPLEX|COMPLEX8|COMPLEX16|COMPLEX32)\s*(([a-zA-Z]+[a-zA-Z_0-9]*)(\[([^]]+)\])?)\s*(.*)\s*$/i)
+ elsif ($line =~ m/^\s*(CCTK_)?(CHAR|BYTE|INT|INT1|INT2|INT4|INT8|REAL|REAL4|REAL8|REAL16|COMPLEX|COMPLEX8|COMPLEX16|COMPLEX32)\s*(([a-zA-Z][a-zA-Z_0-9]*)\s*(\[([^]]+)\])?)\s*(.*)\s*$/i)
{
# for($i = 1; $i < 10; $i++)
# {
@@ -912,11 +912,6 @@ sub parse_interface_ccl
$interface_db{"\U$thorn GROUP $current_group\E DIM"} = 3;
}
- if($interface_db{"\U$thorn GROUP $current_group\E GTYPE"} eq "SCALAR")
- {
- $interface_db{"\U$thorn GROUP $current_group\E DIM"} = 0;
- }
-
if(! $interface_db{"\U$thorn GROUP $current_group\E TIMELEVELS"})
{
$interface_db{"\U$thorn GROUP $current_group\E TIMELEVELS"} = 1;
@@ -937,6 +932,13 @@ sub parse_interface_ccl
$interface_db{"\U$thorn GROUP $current_group\E COMPACT"} = 0;
}
+ # Override defaults for scalars
+ if($interface_db{"\U$thorn GROUP $current_group\E GTYPE"} eq "SCALAR")
+ {
+ $interface_db{"\U$thorn GROUP $current_group\E DIM"} = 0;
+ $interface_db{"\U$thorn GROUP $current_group\E DISTRIB"} = "CONSTANT";
+ }
+
# Check that it is a known group type
if($interface_db{"\U$thorn GROUP $current_group\E GTYPE"} !~ m:^\s*(SCALAR|GF|ARRAY)\s*$:)
{
@@ -971,37 +973,12 @@ sub parse_interface_ccl
next;
}
- # Is it is a vararray ?
-
+ # Is it a vararray?
if($isgrouparray)
{
- # Create a variable with the same name as the group
- $function = $current_group;
-
- if(! $known_variables{"\U$function\E"})
- {
- $known_variables{"\U$function\E"} = 1;
-
- $interface_db{"\U$thorn GROUP $current_group\E"} .= " $function";
- }
- else
- {
- &CST_error(0,"Duplicate variable $function in thorn $thorn",'',
- __LINE__,__FILE__);
- }
-
# get its size
-
$interface_db{"\U$thorn GROUP $current_group\E VARARRAY_SIZE"} = $grouparray_size;
-
- if($data[$line_number+1] =~ m/^\s*\{\s*$/)
- {
- &CST_error(1,"Can't give explicit list of array names with an array group - ignoring list","",__LINE__,__FILE__);
- $line_number++ until ($data[$line_number] =~ m:\}:);
- }
}
- else
- {
# Fill in data for the scalars/arrays/functions
$line_number++;
if($data[$line_number] =~ m/^\s*\{\s*$/)
@@ -1055,7 +1032,6 @@ sub parse_interface_ccl
$line_number--;
}
$interface_db{"\U$thorn GROUP $current_group\E DESCRIPTION"} = $description;
- }
}
elsif ($line =~ m/^\s*(USES\s*INCLUDE)S?\s*(SOURCE)S?\s*:\s*(.*)\s*$/i)
{
diff --git a/src/include/cctk_Groups.h b/src/include/cctk_Groups.h
index 2e822a98..8e5c58c9 100644
--- a/src/include/cctk_Groups.h
+++ b/src/include/cctk_Groups.h
@@ -21,6 +21,7 @@ typedef struct
int numvars;
int numtimelevels;
int vectorgroup;
+ int vectorlength;
} cGroup;
/* Prototypes */
diff --git a/src/include/cctki_Groups.h b/src/include/cctki_Groups.h
index c0b81ba9..a4b7d34b 100644
--- a/src/include/cctki_Groups.h
+++ b/src/include/cctki_Groups.h
@@ -32,7 +32,8 @@ int CCTKi_CreateGroup(const char *gname,
const char *size,
const char *ghostsize,
const char *tags,
- int n_variables,
+ const char *vararraysize,
+ int n_basevars,
...);
#ifdef __cplusplus
diff --git a/src/main/Groups.c b/src/main/Groups.c
index 603a3e7d..38da4390 100644
--- a/src/main/Groups.c
+++ b/src/main/Groups.c
@@ -144,6 +144,8 @@ typedef struct
int n_variables;
+ int vectorlength;
+
/* *size[dim] - pointers to parameter data*/
CCTK_INT **size;
@@ -190,7 +192,8 @@ static int staggered = 0;
static cGroupDefinition *CCTKi_SetupGroup (const char *implementation,
const char *name,
int staggercode,
- int n_variables);
+ int n_variables,
+ int vectorlength);
static CCTK_INT **CCTKi_ExtractSize (int dimension,
const char *thorn,
const char *sizestring);
@@ -1008,6 +1011,7 @@ int CCTK_GroupData (int group, cGroup *gp)
gp->disttype = groups[group].dtype;
gp->dim = groups[group].dim;
gp->numvars = groups[group].n_variables;
+ gp->vectorlength = groups[group].vectorlength;
gp->numtimelevels = groups[group].n_timelevels;
gp->stagtype = groups[group].staggertype;
@@ -2167,7 +2171,8 @@ int CCTKi_CreateGroup (const char *gname,
const char *size,
const char *ghostsize,
const char *tags,
- int n_variables,
+ const char *vararraysize,
+ int n_basevars,
...
)
{
@@ -2176,33 +2181,35 @@ int CCTKi_CreateGroup (const char *gname,
int staggercode;
int variable;
+ int vectorlength;
+ int elem;
+
va_list ap;
char *variable_name;
- char *vararraysize;
cGroupDefinition *group;
+ vectorlength = 1;
+
group = NULL;
variable_name = NULL;
- vararraysize = NULL;
retval = 0;
- va_start (ap, n_variables);
+ va_start (ap, n_basevars);
/* get the staggercode */
staggercode = CCTKi_ParseStaggerString (dimension, imp, gname, stype);
- if(n_variables == -1)
+ if (vararraysize)
{
- variable_name = va_arg (ap, char *);
-
- vararraysize = Util_Strdup(va_arg (ap, char *));
+ vararraysize = Util_Strdup(vararraysize);
+ assert (vararraysize);
- n_variables = CCTKi_ParamExpressionToInt(vararraysize,thorn);
+ vectorlength = CCTKi_ParamExpressionToInt(vararraysize,thorn);
- if(n_variables < 0)
+ if(vectorlength < 0)
{
CCTK_VWarn (0, __LINE__, __FILE__, "Cactus",
"CCTKi_CreateGroup: length of group %s less than 0 !",
@@ -2214,11 +2221,13 @@ int CCTKi_CreateGroup (const char *gname,
groupscope = CCTK_GroupScopeNumber (gscope);
if (groupscope == CCTK_PUBLIC || groupscope == CCTK_PROTECTED)
{
- group = CCTKi_SetupGroup (imp, gname, staggercode, n_variables);
+ group = CCTKi_SetupGroup (imp, gname, staggercode,
+ n_basevars * vectorlength, vectorlength);
}
else if (groupscope == CCTK_PRIVATE)
{
- group = CCTKi_SetupGroup (thorn, gname, staggercode, n_variables);
+ group = CCTKi_SetupGroup (thorn, gname, staggercode,
+ n_basevars * vectorlength, vectorlength);
}
else
{
@@ -2248,58 +2257,41 @@ int CCTKi_CreateGroup (const char *gname,
/* Extract the variable names from the argument list. */
- if(!vararraysize)
+ group->vararraysize = vararraysize;
+
+ for (variable = 0; variable < n_basevars; variable++)
{
- group->vararraysize = NULL;
- for (variable = 0; variable < n_variables; variable++)
- {
- variable_name = va_arg (ap, char *);
+ variable_name = va_arg (ap, char *);
- group->variables[variable].name =
- (char *)malloc ((strlen (variable_name)+1)*sizeof (char));
-
- if (group->variables[variable].name)
- {
- strcpy (group->variables[variable].name, variable_name);
- }
- else
- {
- break;
- }
+ if (!vararraysize)
+ {
+ assert (vectorlength == 1);
+ group->variables[variable].name = Util_Strdup(variable_name);
}
- }
- else
- {
- group->vararraysize = vararraysize;
-
- for (variable = 0; variable < n_variables; variable++)
+ else
{
- char *name = NULL;
- Util_asprintf(&name, "%s[%d]", variable_name, variable);
-
- group->variables[variable].name = name;
+ for (elem = 0; elem < vectorlength; elem++)
+ {
+ char *name = NULL;
+ Util_asprintf(&name, "%s[%d]", variable_name, elem);
+
+ group->variables[variable * vectorlength + elem].name = name;
+ }
}
}
va_end (ap);
- if (variable < n_variables)
+ if (dimension > maxdim)
{
- retval = 3;
+ maxdim = dimension;
}
- else
+ if (staggercode > 0)
{
- if (dimension > maxdim)
- {
- maxdim = dimension;
- }
- if (staggercode > 0)
- {
- staggered = 1;
- }
- group->size = CCTKi_ExtractSize (dimension, thorn, size);
- group->ghostsize = CCTKi_ExtractSize (dimension, thorn, ghostsize);
+ staggered = 1;
}
+ group->size = CCTKi_ExtractSize (dimension, thorn, size);
+ group->ghostsize = CCTKi_ExtractSize (dimension, thorn, ghostsize);
/* Only typically have GFs in a single dimension */
if (group->gtype == CCTK_GF)
@@ -2376,7 +2368,8 @@ const char *CCTK_GroupImplementationI(int group)
static cGroupDefinition *CCTKi_SetupGroup (const char *implementation,
const char *name,
int staggercode,
- int n_variables)
+ int n_variables,
+ int vectorlength)
{
int *temp_int;
void *temp;
@@ -2426,9 +2419,10 @@ static cGroupDefinition *CCTKi_SetupGroup (const char *implementation,
strcpy (groups[n_groups].implementation, implementation);
strcpy (groups[n_groups].name, name);
- groups[n_groups].number = n_groups;
- groups[n_groups].staggertype= staggercode;
- groups[n_groups].n_variables= n_variables;
+ groups[n_groups].number = n_groups;
+ groups[n_groups].staggertype = staggercode;
+ groups[n_groups].n_variables = n_variables;
+ groups[n_groups].vectorlength = vectorlength;
/* Fill in global variable numbers. */
for (variable = 0; variable < n_variables; variable++)