Tries recovery during errors in .edr files.
authorSander Pronk <pronk@cbr.su.se>
Mon, 18 Oct 2010 12:50:43 +0000 (14:50 +0200)
committerSander Pronk <pronk@cbr.su.se>
Mon, 18 Oct 2010 12:50:43 +0000 (14:50 +0200)
src/gmxlib/enxio.c

index d364998b752d50f7a27f8b8f85a6bc05a15e91bb..5ab3263795e5f961d391e8a66c29418b0106dcd5 100644 (file)
@@ -472,7 +472,9 @@ static gmx_bool do_eheader(ener_file_t ef,int *file_version,t_enxframe *fr,
 
         if (fr->t < 0 || fr->t > 1e20 || fr->step < 0 )
         {
-            gmx_fatal(FARGS, "edr file with negative step number or unreasonable time (and without version number)");
+            gmx_warning("edr file with negative step number or unreasonable time (and without version number).");
+            *bOK=FALSE;
+            return FALSE;
         }
     }
     else
@@ -480,7 +482,9 @@ static gmx_bool do_eheader(ener_file_t ef,int *file_version,t_enxframe *fr,
         if (!gmx_fio_do_int(ef->fio, magic))       *bOK = FALSE;
         if (magic != -7777777)
         {
-            gmx_fatal(FARGS,"Energy header magic number mismatch, this is not a GROMACS edr file");
+            gmx_warning("Energy header magic number mismatch, this is not a GROMACS edr file");
+            *bOK=FALSE;
+            return FALSE;
         }
         *file_version = enx_version;
         if (!gmx_fio_do_int(ef->fio, *file_version)) *bOK = FALSE;
@@ -532,7 +536,11 @@ static gmx_bool do_eheader(ener_file_t ef,int *file_version,t_enxframe *fr,
     if (ndisre!=0)
     {
         if (*file_version >= 4)
-            gmx_incons("Distance restraint blocks in old style in new style file");
+        {
+            gmx_warning("Distance restraint blocks in old style in new style file");
+            *bOK=FALSE;
+            return FALSE;
+        }
         fr->nblock+=1;
     }
 
@@ -580,10 +588,16 @@ static gmx_bool do_eheader(ener_file_t ef,int *file_version,t_enxframe *fr,
             else
             {
                 if (fr->block[b].nsub != 1)
-                    gmx_incons("Writing an old version .edr file with too many subblocks");
+                {
+                    gmx_warning("Writing an old version .edr file with too many subblocks");
+                    *bOK=FALSE;
+                    return FALSE;
+                }
                 if (fr->block[b].sub[0].type != dtreal)
                 {
-                    gmx_incons("Writing an old version .edr file the wrong subblock type");
+                    gmx_warning("Writing an old version .edr file the wrong subblock type");
+                    *bOK=FALSE;
+                    return FALSE;
                 }
             }
             nrint = fr->block[b].sub[0].nr;
@@ -698,7 +712,7 @@ ener_file_t open_enx(const char *fn,const char *mode)
     gmx_enxnm_t *nms=NULL;
     int        file_version=-1;
     t_enxframe *fr;
-    gmx_bool       bWrongPrecision,bDum=TRUE;
+    gmx_bool       bWrongPrecision,bOK=TRUE;
     struct ener_file *ef;
 
     snew(ef,1);
@@ -709,8 +723,8 @@ ener_file_t open_enx(const char *fn,const char *mode)
         gmx_fio_setprecision(ef->fio,FALSE);
         do_enxnms(ef,&nre,&nms);
         snew(fr,1);
-        do_eheader(ef,&file_version,fr,nre,&bWrongPrecision,&bDum);
-        if(!bDum)
+        do_eheader(ef,&file_version,fr,nre,&bWrongPrecision,&bOK);
+        if(!bOK)
         {
             gmx_file("Cannot read energy file header. Corrupt file?");
         }
@@ -729,8 +743,8 @@ ener_file_t open_enx(const char *fn,const char *mode)
             gmx_fio_checktype(ef->fio);
             gmx_fio_setprecision(ef->fio,TRUE);
             do_enxnms(ef,&nre,&nms);
-            do_eheader(ef,&file_version,fr,nre,&bWrongPrecision,&bDum);
-            if(!bDum)
+            do_eheader(ef,&file_version,fr,nre,&bWrongPrecision,&bOK);
+            if(!bOK)
             {
                 gmx_file("Cannot write energy file header; maybe you are out of quota?");
             }