aboutsummaryrefslogtreecommitdiff
path: root/src/Boundary.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/Boundary.c')
-rw-r--r--src/Boundary.c110
1 files changed, 87 insertions, 23 deletions
diff --git a/src/Boundary.c b/src/Boundary.c
index b79aea2..84c2f54 100644
--- a/src/Boundary.c
+++ b/src/Boundary.c
@@ -39,6 +39,7 @@ struct BCVAR
{
struct BCVAR *next; /* pointer to next entry in list */
int faces; /* set of faces for this application of bc */
+ int width; /* width of the boundary, if it is equal for all faces */
int table; /* table handle holding extra arguments */
int var; /* index of grid variable to which to apply the bc */
};
@@ -80,27 +81,32 @@ CCTK_INT Bdry_Boundary_RegisterPhysicalBC(CCTK_POINTER GH,
CCTK_STRING bc_name);
CCTK_INT Bdry_Boundary_SelectVarForBC(CCTK_POINTER GH,
CCTK_INT faces,
+ CCTK_INT boundary_width,
CCTK_INT table_handle,
CCTK_STRING var_name,
CCTK_STRING bc_name);
CCTK_INT Bdry_Boundary_SelectVarForBCI(CCTK_POINTER GH,
CCTK_INT faces,
+ CCTK_INT boundary_width,
CCTK_INT table_handle,
CCTK_INT var_index,
CCTK_STRING bc_name);
CCTK_INT Bdry_Boundary_SelectGroupForBC(CCTK_POINTER GH,
CCTK_INT faces,
+ CCTK_INT boundary_width,
CCTK_INT table_handle,
CCTK_STRING group_name,
CCTK_STRING bc_name);
CCTK_INT Bdry_Boundary_SelectGroupForBCI(CCTK_POINTER GH,
CCTK_INT faces,
+ CCTK_INT boundary_width,
CCTK_INT table_handle,
CCTK_INT group_index,
CCTK_STRING bc_name);
CCTK_INT Bdry_Boundary_SelectedGVs(CCTK_POINTER GH, CCTK_INT array_size,
CCTK_POINTER var_indices,
CCTK_POINTER faces,
+ CCTK_POINTER boundary_widths,
CCTK_POINTER table_handles,
CCTK_STRING bc_name);
@@ -245,6 +251,11 @@ CCTK_INT Bdry_Boundary_RegisterPhysicalBC(CCTK_POINTER GH,
@vtype CCTK_INT
@vio in
@endvar
+ @var width
+ @vdesc if >=0, width of boundary in all directions
+ @vtype CCTK_INT
+ @vio in
+ @endvar
@var table_handle
@vdesc handle of table which holds arguments to be passed to bc
@vtype CCTK_INT
@@ -269,12 +280,19 @@ CCTK_INT Bdry_Boundary_RegisterPhysicalBC(CCTK_POINTER GH,
@@*/
CCTK_INT Bdry_Boundary_SelectVarForBC(CCTK_POINTER GH,
CCTK_INT faces,
+ CCTK_INT width,
CCTK_INT table_handle,
CCTK_STRING var_name,
CCTK_STRING bc_name)
{
int retval, var_index;
+#ifdef DEBUG
+ printf("Boundary_SelectVarForBC:\n");
+ printf(" called with faces=%d, width=%d, table_handle=%d, var_name=%s, bc_name=%s\n",
+ faces, width, table_handle, var_name, bc_name);
+#endif
+
retval = 0;
var_index = CCTK_VarIndex(var_name);
@@ -285,7 +303,7 @@ CCTK_INT Bdry_Boundary_SelectVarForBC(CCTK_POINTER GH,
retval = -3;
} else
{
- retval = Bdry_Boundary_SelectVarForBCI(GH, faces, table_handle, var_index,
+ retval = Bdry_Boundary_SelectVarForBCI(GH, faces, width, table_handle, var_index,
bc_name);
}
@@ -314,6 +332,11 @@ CCTK_INT Bdry_Boundary_SelectVarForBC(CCTK_POINTER GH,
@vtype CCTK_INT
@vio in
@endvar
+ @var width
+ @vdesc if >=0, width of boundary in all directions
+ @vtype CCTK_INT
+ @vio in
+ @endvar
@var table_handle
@vdesc handle of table which holds arguments to be passed to bc
@vtype CCTK_INT
@@ -339,6 +362,7 @@ CCTK_INT Bdry_Boundary_SelectVarForBC(CCTK_POINTER GH,
@@*/
CCTK_INT Bdry_Boundary_SelectVarForBCI(CCTK_POINTER GH,
CCTK_INT faces,
+ CCTK_INT width,
CCTK_INT table_handle,
CCTK_INT var_index,
CCTK_STRING bc_name)
@@ -358,8 +382,8 @@ CCTK_INT Bdry_Boundary_SelectVarForBCI(CCTK_POINTER GH,
#ifdef DEBUG
printf("Boundary_SelectVarForBCI:\n");
- printf(" called with table_handle=%d, var_index=%d, bc_name=%s\n",
- table_handle, var_index, bc_name);
+ printf(" called with faces=%d, width=%d, table_handle=%d, var_index=%d, bc_name=%s\n",
+ faces, width, table_handle, var_index, bc_name);
printf(" vi %d corresponds to %s\n", var_index, CCTK_VarName(var_index));
#endif
@@ -387,6 +411,7 @@ CCTK_INT Bdry_Boundary_SelectVarForBCI(CCTK_POINTER GH,
/* populate new entry with data */
new_entry -> faces = faces;
+ new_entry -> width = width;
new_entry -> table = table_handle;
new_entry -> var = var_index;
/* new_entry -> next will be filled in later */
@@ -414,10 +439,10 @@ CCTK_INT Bdry_Boundary_SelectVarForBCI(CCTK_POINTER GH,
}
}
- /* If current has not been initialized yet, this is a new bc_name
+ /* If current_bcdata is NULL, we got to the end of the above loop, this is a new bc_name
* that does not appear in the bcdata list.
*/
- if (!current) /* bc_name was not found in bcdata_list */
+ if (!current_bcdata) /* bc_name was not found in bcdata_list */
{
#ifdef DEBUG
printf("Boundary_SelectVarForBCI: adding new entry to bcdata list\n");
@@ -429,12 +454,6 @@ CCTK_INT Bdry_Boundary_SelectVarForBCI(CCTK_POINTER GH,
CCTK_VWarn(1, __LINE__, __FILE__, CCTK_THORNSTRING,
"Unable to allocate memory for internal 'bcdata' list");
retval = -4;
- } else
- {
- new_bcdata->var_list = new_entry; /* new_entry will be first element */
- new_entry->next = NULL; /* of var list for this bcdata entry */
- new_bcdata->bc_name = Util_Strdup(bc_name);
- new_bcdata->num = 1;
}
/* Place new entry into bcdata list, maintaining case independent sort. */
@@ -468,6 +487,9 @@ CCTK_INT Bdry_Boundary_SelectVarForBCI(CCTK_POINTER GH,
bcdata_list = new_bcdata;
new_bcdata->next = NULL;
}
+
+ /* Set current_bcdata to new_bcdata, so the new bcdata entry will be filled in below */
+ current_bcdata = new_bcdata;
}
#ifdef DEBUG
@@ -475,6 +497,18 @@ CCTK_INT Bdry_Boundary_SelectVarForBCI(CCTK_POINTER GH,
" previous is %p\n", current, previous);
#endif
+ if (!current) /* This is the first element in the var_list */
+ {
+#ifdef DEBUG
+ printf(" New element of var list.\n");
+#endif
+ current_bcdata->var_list = new_entry; /* new_entry will be first element */
+ new_entry->next = NULL; /* of var list for this bcdata entry */
+ current_bcdata->bc_name = Util_Strdup(bc_name);
+ current_bcdata->num = 1;
+ }
+
+
/* Enter new_entry into correct location in linked list.
* Note that this loop is skipped if new_entry was already inserted as first
* element of a new var list above (since in that case current will be
@@ -546,6 +580,11 @@ CCTK_INT Bdry_Boundary_SelectVarForBCI(CCTK_POINTER GH,
@vtype CCTK_INT
@vio in
@endvar
+ @var width
+ @vdesc if >=0, width of boundary in all directions
+ @vtype CCTK_INT
+ @vio in
+ @endvar
@var table_handle
@vdesc handle of table which holds arguments to be passed to bc
@vtype CCTK_INT
@@ -570,6 +609,7 @@ CCTK_INT Bdry_Boundary_SelectVarForBCI(CCTK_POINTER GH,
@@*/
CCTK_INT Bdry_Boundary_SelectGroupForBC(CCTK_POINTER GH,
CCTK_INT faces,
+ CCTK_INT width,
CCTK_INT table_handle,
CCTK_STRING group_name,
CCTK_STRING bc_name)
@@ -590,7 +630,7 @@ CCTK_INT Bdry_Boundary_SelectGroupForBC(CCTK_POINTER GH,
} else
{
/* call Bdry_Boundary_SelectGroupForBCI() */
- retval = Bdry_Boundary_SelectGroupForBCI(GH, faces, table_handle, gi,
+ retval = Bdry_Boundary_SelectGroupForBCI(GH, faces, width, table_handle, gi,
bc_name);
}
@@ -618,6 +658,11 @@ CCTK_INT Bdry_Boundary_SelectGroupForBC(CCTK_POINTER GH,
@vtype CCTK_INT
@vio in
@endvar
+ @var width
+ @vdesc if >=0, width of boundary in all directions
+ @vtype CCTK_INT
+ @vio in
+ @endvar
@var table_handle
@vdesc handle of table which holds arguments to be passed to bc
@vtype CCTK_INT
@@ -643,6 +688,7 @@ CCTK_INT Bdry_Boundary_SelectGroupForBC(CCTK_POINTER GH,
@@*/
CCTK_INT Bdry_Boundary_SelectGroupForBCI(CCTK_POINTER GH,
CCTK_INT faces,
+ CCTK_INT width,
CCTK_INT table_handle,
CCTK_INT group_index,
CCTK_STRING bc_name)
@@ -661,7 +707,8 @@ CCTK_INT Bdry_Boundary_SelectGroupForBCI(CCTK_POINTER GH,
}
#ifdef DEBUG
- printf("Boundary_SelectGroupForBCI: group %s has %d vars\n", CCTK_GroupName(group_index), num_vars);
+ printf("Boundary_SelectGroupForBCI: group %s has %d vars\n",
+ CCTK_GroupName(group_index), num_vars);
#endif
/* loop over variables in group */
@@ -669,7 +716,7 @@ CCTK_INT Bdry_Boundary_SelectGroupForBCI(CCTK_POINTER GH,
max_vi = vi + num_vars;
for (; vi<max_vi; ++vi)
{
- retval = Bdry_Boundary_SelectVarForBCI(GH, faces, table_handle, vi,
+ retval = Bdry_Boundary_SelectVarForBCI(GH, faces, width, table_handle, vi,
bc_name);
}
@@ -708,6 +755,12 @@ CCTK_INT Bdry_Boundary_SelectGroupForBCI(CCTK_POINTER GH,
@vtype CCTK_INT
@vio out
@endvar
+ @var widths
+ @vdesc array into which boundary widths of selected variables will be
+ placed
+ @vtype CCTK_INT
+ @vio in
+ @endvar
@var table_handles
@vdesc array into which table_handles for variables selected for bc
will be placed
@@ -730,6 +783,7 @@ CCTK_INT Bdry_Boundary_SelectedGVs(CCTK_POINTER GH,
CCTK_INT array_size,
CCTK_POINTER var_indices,
CCTK_POINTER faces,
+ CCTK_POINTER widths,
CCTK_POINTER table_handles,
CCTK_STRING bc_name)
{
@@ -754,7 +808,8 @@ CCTK_INT Bdry_Boundary_SelectedGVs(CCTK_POINTER GH,
current_bcdata = current_bcdata->next)
{
#ifdef DEBUG
- printf(" looping through bcdata list, at bcdata entry for %s bc\n", current_bcdata->bc_name);
+ printf(" looping through bcdata list, at bcdata entry for %s bc\n",
+ current_bcdata->bc_name);
#endif
if (!bc_name || CCTK_Equals(current_bcdata->bc_name,bc_name))
@@ -776,7 +831,10 @@ CCTK_INT Bdry_Boundary_SelectedGVs(CCTK_POINTER GH,
printf(" current->next is %p\n",current->next);
#endif
+ /* One should be able to pass NULL to ignore the values in any of these
+ arrays... */
((int *) faces)[i] = current->faces;
+ ((int *) widths)[i] = current->width;
((int *) table_handles)[i] = current->table;
((int *) var_indices)[i] = current->var;
}
@@ -825,12 +883,13 @@ void Boundary_ApplyPhysicalBCs(CCTK_ARGUMENTS)
{
DECLARE_CCTK_ARGUMENTS;
phys_bc_fn_ptr bc_fn;
- int num_vars, *vars, *faces, *tables, err, max_num_vars;
+ int num_vars, *vars, *faces, *widths, *tables, err, max_num_vars;
struct BCDATA *current_bcdata;
max_num_vars = 0;
vars = NULL; /* so that it won't be freed if it was never malloced */
faces = NULL; /* avoids a compiler warning */
+ widths = NULL; /* avoids a compiler warning */
tables = NULL; /* avoids a compiler warning */
/* Step through each requested physical boundary condition */
@@ -856,17 +915,19 @@ void Boundary_ApplyPhysicalBCs(CCTK_ARGUMENTS)
/* reallocate arrays if necessary */
vars = (int *) realloc(vars, num_vars*sizeof(int));
faces = (int *) realloc(faces, num_vars*sizeof(int));
+ widths = (int *) realloc(widths, num_vars*sizeof(int));
tables = (int *) realloc(tables, num_vars*sizeof(int));
} else
{
vars = (int *) malloc(num_vars*sizeof(int));
faces = (int *) malloc(num_vars*sizeof(int));
+ widths = (int *) malloc(num_vars*sizeof(int));
tables = (int *) malloc(num_vars*sizeof(int));
}
}
/* get selected vars for this bc_name */
- err = Bdry_Boundary_SelectedGVs(cctkGH, num_vars, vars, faces, tables,
+ err = Bdry_Boundary_SelectedGVs(cctkGH, num_vars, vars, faces, widths, tables,
current_bcdata->bc_name);
if (err<0) /* This is a redundant test for now,
Bdry_Boundary_SelectedGVs never returns <0 */
@@ -889,7 +950,7 @@ void Boundary_ApplyPhysicalBCs(CCTK_ARGUMENTS)
#endif
err = Util_TableGetFnPointer(physbc_table_handle, (CCTK_FPOINTER *)&bc_fn,
current_bcdata->bc_name);
- if (err<0)
+ if (err<0)
{
CCTK_VWarn(1, __LINE__, __FILE__, CCTK_THORNSTRING,
"Boundary_ApplyPhysicalBCs: Util_TableGetFnPointer "
@@ -903,7 +964,7 @@ void Boundary_ApplyPhysicalBCs(CCTK_ARGUMENTS)
" cctkGH %p, num_vars %d, vars, tables\n",
(void *) bc_fn, (const void *) cctkGH, num_vars);
#endif
- err = (*bc_fn)(cctkGH, num_vars, vars, faces, tables);
+ err = (*bc_fn)(cctkGH, num_vars, vars, faces, widths, tables);
if (err<0)
{
CCTK_VWarn(1, __LINE__, __FILE__, CCTK_THORNSTRING,
@@ -917,6 +978,7 @@ void Boundary_ApplyPhysicalBCs(CCTK_ARGUMENTS)
{
free(vars);
free(faces);
+ free(widths);
free(tables);
}
}
@@ -946,7 +1008,7 @@ void Boundary_ClearSelection(void)
current_bcdata = current_bcdata->next)
{
#ifdef DEBUG
- printf("Boundary_ClearSelection: freeing %p\n",current_bcdata);
+ printf("Boundary_ClearSelection: freeing var list rooted at %p\n",current_bcdata);
#endif
/* Free selections list */
@@ -958,6 +1020,7 @@ void Boundary_ClearSelection(void)
}
current_bcdata->var_list = NULL;
+ current_bcdata->num = 0;
}
}
@@ -1042,15 +1105,16 @@ static void print_selections_database(void)
struct BCDATA *current_bcdata;
struct BCVAR *current;
- printf(" Current list of selected vars:\n");
- printf(" bc name vi var name table handle\n");
+ printf("Current list of selected vars:\n");
for (current_bcdata = bcdata_list; current_bcdata;
current_bcdata = current_bcdata->next)
{
+ printf("%d entries for %s:\n", current_bcdata->num, current_bcdata->bc_name);
+ printf(" vi var name table handle\n");
for (current = current_bcdata->var_list; current;
current = current->next)
{
- printf(" %9s %3d %12s %2d\n", current_bcdata->bc_name, current->var,
+ printf("%3d %12s %2d\n", current->var,
CCTK_VarName(current->var), current->table);
}
}