diff options
Diffstat (limited to 'src/Boundary.c')
-rw-r--r-- | src/Boundary.c | 110 |
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); } } |