aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--param.ccl3
-rw-r--r--src/Startup.c51
2 files changed, 51 insertions, 3 deletions
diff --git a/param.ccl b/param.ccl
index e8ee4b6..1471218 100644
--- a/param.ccl
+++ b/param.ccl
@@ -52,6 +52,9 @@ BOOLEAN print_timing_info "Print timing information on I/O operations." STEERABL
BOOLEAN new_filename_scheme "Use the new filename scheme for output files ?" STEERABLE = RECOVER
{
} "yes"
+BOOLEAN require_empty_output_directory "Require that IO::out_dir is empty at startup ?" STEERABLE = RECOVER
+{
+} "no"
BOOLEAN strict_io_parameter_check "Stop on errors while parsing I/O parameters from parameter file ?" STEERABLE = RECOVER
{
} "yes"
diff --git a/src/Startup.c b/src/Startup.c
index 3417117..4f70c4c 100644
--- a/src/Startup.c
+++ b/src/Startup.c
@@ -25,6 +25,9 @@
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif
+#ifdef HAVE_DIRENT_H
+#include <dirent.h>
+#endif
#include "ioGH.h"
#include "ioutil_Utils.h"
@@ -218,6 +221,10 @@ static void *SetupGH (tFleshConfig *config, int convergence_level, cGH *GH)
{
int i, maxdim, myproc;
ioGH *myGH;
+#ifdef HAVE_DIRENT_H
+ DIR *dir;
+ struct dirent *file;
+#endif
DECLARE_CCTK_PARAMETERS
@@ -284,10 +291,48 @@ static void *SetupGH (tFleshConfig *config, int convergence_level, cGH *GH)
CCTK_VWarn (1, __LINE__, __FILE__, CCTK_THORNSTRING,
"Problem creating default output directory '%s'", out_dir);
}
- else if (i > 0 && CCTK_Equals (verbose, "full"))
+ else if (i > 0)
{
- CCTK_VInfo (CCTK_THORNSTRING,
- "default output directory '%s' already exists", out_dir);
+ if (CCTK_Equals (verbose, "full"))
+ {
+ CCTK_VInfo (CCTK_THORNSTRING,
+ "default output directory '%s' already exists", out_dir);
+ }
+ if (require_empty_output_directory)
+ {
+#ifdef HAVE_DIRENT_H
+ i = 0;
+ dir = opendir (out_dir);
+ while ((file = readdir (dir)) != NULL)
+ {
+ if (strcmp (file->d_name, ".") == 0 ||
+ strcmp (file->d_name, "..") == 0)
+ {
+ continue;
+ }
+ CCTK_VWarn (2, __LINE__, __FILE__, CCTK_THORNSTRING,
+ "Found file '%s' in already existing output directory '%s'",
+ file->d_name, out_dir);
+ i++;
+ }
+ closedir (dir);
+ if (i)
+ {
+ CCTK_VWarn (0, __LINE__, __FILE__, CCTK_THORNSTRING,
+ "You have set IO::out_dir = '%s' and "
+ "IO::require_empty_output_directory = 'yes'. "
+ "This output directory already exists and is non-empty.",
+ out_dir);
+ }
+#else
+ /* No opendir(3) ??? It's probably a Windows box, so just give up ! */
+ CCTK_WARN (0, "You cannot use 'IO::require_empty_output_directory = "
+ "\"yes\"' on this architecture because it doesn't provide "
+ "opendir(3) to browse the IO::out_dir directory.\n"
+ "Please use 'IO::require_empty_output_directories = "
+ "\"no\"' instead !");
+#endif
+ }
}
i = IOUtil_CreateDirectory (GH, checkpoint_dir,
! CCTK_Equals (out_mode, "onefile"),