]> git.treefish.org Git - phys/latlib.git/commitdiff
Added writeoutdir sequencing for equal timestamps.
authorAlexander Schmidt <alex@treefish.org>
Mon, 9 Dec 2013 00:56:06 +0000 (01:56 +0100)
committerAlexander Schmidt <alex@treefish.org>
Mon, 9 Dec 2013 00:56:06 +0000 (01:56 +0100)
o815/o815.cpp
writeout.cpp
writeout.h

index b68a38b061df92d0741b4a3bdb6ab0f3ce1093e1..630d6803a4471c9ddfeccdde07097978c4f02f44 100644 (file)
@@ -118,19 +118,7 @@ void o815::postParaInit() {
     exit(0);
   }
   
-  if(rank==0) {
-    timestamp = time(NULL);
-#ifndef MPI_DISABLED
-    for(int idest=1; idest<numprocs; idest++)
-      MPI_Send(&timestamp, 1, MPI_LONG, idest, 123, MPI_COMM_WORLD);
-#endif
-  }
-#ifndef MPI_DISABLED
-  else if(rank>0)
-    MPI_Recv(&timestamp, 1, MPI_LONG, 0, 123, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
-#endif  
-
-  out = new writeout(comargs.outdir, programid+headMaster(), rank, numprocs, timestamp);
+  out = new writeout(comargs.outdir, programid+headMaster(), rank, numprocs);
 }
 
 void o815::mainLoop() {
index af67fb5fc913dfa9032aea8df877578e646007b4..9fc40f515be82f05c6e7671bd494f4e32f988ce0 100644 (file)
 #include <dirent.h>
 #include <errno.h>
 #include <unistd.h>
+#include <mpi.h>
 
 using namespace std;
 
-string writeout::tstamp(const long& timestamp)
+string writeout::longToStr (long arg)
 {
-  stringstream sstr;
-  if(!timestamp) sstr << time (NULL);
-  else sstr << timestamp;
-  return sstr.str();
+  stringstream ss;
+  ss << arg;
+  return ss.str();
 }
 
 void writeout::newsub(string subname) {
@@ -42,8 +42,11 @@ void writeout::newsub(string subname) {
 }
 
 writeout::writeout(const string& wdir, const string& _signature, 
-                  const int& _rank, const int& procs, const long& timestamp)
+                  const int& _rank, const int& procs)
 {
+  long timestamp;
+  int iseq=0;
+
   fulldir = "";
   signature = _signature;
   rank = _rank;
@@ -51,10 +54,38 @@ writeout::writeout(const string& wdir, const string& _signature,
   if(wdir != ""){
     numprocs = procs;
     sprintf(cRank, "%d", rank);
-    fulldir = wdir + "/" + tstamp(timestamp) + "_" + signature + ".tmp";
 
-    mkdir(fulldir.c_str(), 0775);
+    if (rank == 0) {
+      timestamp = time(NULL);
+
+      while (true) {
+       fulldir = wdir + "/" + longToStr(timestamp) + "." + longToStr(iseq) + "_" + signature + ".tmp";
+       if ( mkdir(fulldir.c_str(), 0775) == 0 )
+         break;
+       else if ( errno != EEXIST ) {
+         cerr << "WRITEOUT: Could not create outdir!" << endl << flush;
+         break;
+       }
+       iseq++;
+      }
+
+#ifndef MPI_DISABLED
+      for(int idest=1; idest<numprocs; idest++) {
+       MPI_Send(&timestamp, 1, MPI_LONG, idest, 123, MPI_COMM_WORLD);
+       MPI_Send(&iseq, 1, MPI_LONG, idest, 124, MPI_COMM_WORLD);
+      }
+#endif
+
+    }
 
+#ifndef MPI_DISABLED
+    else if(rank>0) {
+      MPI_Recv(&timestamp, 1, MPI_LONG, 0, 123, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
+      MPI_Recv(&iseq, 1, MPI_LONG, 0, 124, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
+      fulldir = wdir + "/" + longToStr(timestamp) + "." + longToStr(iseq) + "_" + signature + ".tmp";
+    }
+#endif  
+    
     logf.open( (fulldir + "/rank" + cRank + ".log").c_str() );
 
     if ( !logf.is_open() ) {
index 67c07c8d35a6e1c1fe48d832b7e395bc29ac2c73..fc48c16ae8ec48b6d4a0210c733b7b07bd487b8a 100644 (file)
@@ -11,7 +11,7 @@ class writeout
 {
  public:
   writeout(const string& wdir, const string& signature, 
-          const int& rank, const int& procs, const long& timestamp=0);
+          const int& rank, const int& procs);
   void newsub(string subname);
   map<string,ostream*> out;
   ostream *log;
@@ -25,11 +25,11 @@ class writeout
   string fulldir;
   char cRank[20];
   int rank;
-  string tstamp(const long& timestamp);
   int numprocs;
   string getdatfile(string subname);
   string timestring();
   string signature;
+  static string longToStr (long arg);
 };
 
 #endif