From 07bfa6ab7f02f5db6ca444ad36683b4d4cf72bf7 Mon Sep 17 00:00:00 2001 From: tradke Date: Thu, 28 Oct 1999 16:24:58 +0000 Subject: Added checkpointing for parameters. Still needs some optimization. Recovery will follow soon. Also reactivated timers for checkpoint/recovery. Output this info needs to be improved somewhat. I like your timer stuff, Tom ! Thomas git-svn-id: http://svn.cactuscode.org/arrangements/CactusPUGHIO/IOFlexIO/trunk@65 ebee0441-1374-4afa-a3b5-247f3ba15b9a --- src/DumpGH.c | 207 ++++++++++++++++++++++++++++++++++++++++-------------- src/DumpVar.c | 8 +-- src/GHExtension.c | 53 ++++++++++++++ src/RecoverGH.c | 130 ++++++++++++++++++++++------------ src/RestoreFile.c | 6 +- src/Write3D.c | 8 +-- src/ioFlexGH.h | 8 +++ 7 files changed, 309 insertions(+), 111 deletions(-) (limited to 'src') diff --git a/src/DumpGH.c b/src/DumpGH.c index 9007189..2566d0c 100644 --- a/src/DumpGH.c +++ b/src/DumpGH.c @@ -18,6 +18,7 @@ static char *rcsid = "$Id$"; #include "cctk.h" #include "cctk_parameters.h" +#include "cctk_ParameterFunctions.h" #include "CactusBase/IOUtil/src/ioGH.h" #include "ioFlexGH.h" @@ -131,7 +132,82 @@ void IOFlexIO_InitialDataDumpGH (cGH *GH) } -void IOFlexIO_IEEEIOStructDump (cGH *GH, IOFile iof) +void IOFlexIO_DumpParams (cGH *GH, IOFile iof) +{ + int first; + const char *param; + + + first = 1; + while ((param = ParameterWalk (first, NULL)) != NULL) { + char *impl, *name, *msg; + + first = 0; + + if (Util_SplitString (&impl, &name, param, "::") != 0) { + + msg = (char *) malloc (100 + strlen (param)); + sprintf (msg, "Cannot dump parameter '%s' (SplitString failed)", param); + CCTK_WARN (2, msg); + free (msg); + + } else { + int type; + void *data; + + data = ParameterGet (name, CCTK_ImplementationThorn (impl), &type); + if (data == NULL) { + + msg = (char *) malloc (100 + strlen (param)); + sprintf(msg, "Cannot dump parameter '%s' (ParameterGet failed)", param); + CCTK_WARN (2, msg); + free (msg); + + } else { + CCTK_INT4 i_tmp; + + switch (type) { + case PARAMETER_KEYWORD: + case PARAMETER_STRING: + case PARAMETER_SENTENCE: + CACTUS_IEEEIO_ERROR (IOwriteAttribute (iof, param, FLEXIO_CHAR, + strlen (*(char **) data) + 1, *(char **)data)); + break; + + case PARAMETER_INT: + case PARAMETER_BOOLEAN: + /* CCTK_INTs are stored as 4 byte integers */ + i_tmp = (CCTK_INT4) (*(CCTK_INT *) data); + CACTUS_IEEEIO_ERROR (IOwriteAttribute (iof, param, FLEXIO_INT4, 1, + &i_tmp)); + break; + + case PARAMETER_REAL: + CACTUS_IEEEIO_ERROR (IOwriteAttribute (iof, param, FLEXIO_REAL, 1, + data)); + break; + + default: + msg = (char *) malloc (100 + strlen (param)); + sprintf (msg, "Cannot dump parameter '%s' (unknown type)", param); + CCTK_WARN (2, msg); + free (msg); + break; + } + } + + free (impl); + free (name); + + } + + free ((void *) param); + + } /* end of loop walking over all parameters */ +} + + +void IOFlexIO_DumpGHExtensions (cGH *GH, IOFile iof) { CCTK_INT4 i_temp; CCTK_REAL d_temp; @@ -196,28 +272,20 @@ void IOFlexIO_DumpGH (cGH *GH, int called_from) int old_downsample_x, old_downsample_y, old_downsample_z; int old_out_single; ioGH *ioUtilGH; -#if 0 - cTimer total_time, write_time; -#endif + flexioGH *myGH; + int total_time_handle, write_time_handle; static char **dumpfnames = NULL; /* dump filename ring buffer */ static int findex = 0; /* index into ring buffer */ + /* Get the handles for IOUtil and IOFlexIO extensions */ + ioUtilGH = (ioGH *) GH->extensions [CCTK_GHExtensionHandle ("IO")]; + myGH = (flexioGH *) GH->extensions [CCTK_GHExtensionHandle ("IOFlexIO")]; + /* allocate the ring buffer for filenames */ if (! dumpfnames) dumpfnames = (char **) calloc (checkpoint_keep, sizeof (char *)); -#if 0 - /* initialize timers */ - CactusResetTimer (&total_time); - CactusResetTimer (&write_time); - - CactusStartTimer (&total_time); -#endif - - /* Get the handle for IOUtil xtensions */ - ioUtilGH = (ioGH *) GH->extensions [CCTK_GHExtensionHandle ("IO")]; - /* disable downsampling after saving original downsampling params */ old_downsample_x = ioUtilGH->downsample_x; old_downsample_y = ioUtilGH->downsample_y; @@ -228,6 +296,10 @@ void IOFlexIO_DumpGH (cGH *GH, int called_from) old_out_single = ioUtilGH->out_single; ioUtilGH->out_single = 0; + /* start the total timer */ + if (print_timing_info) + CCTK_TimerStartI (myGH->checkpointTotalTimer); + /* sync all groups */ for (index = 0; index < CCTK_NumGroups (); index++) { char *gname = CCTK_GroupName (index); @@ -257,24 +329,29 @@ void IOFlexIO_DumpGH (cGH *GH, int called_from) } else iof = (IOFile) NULL; -#if 0 /* Great; Now start dumping away! */ - CactusResetTimer (&write_time); - CactusStartTimer (&write_time); -#endif + + /* start timer for dumping parameters */ + if (print_timing_info) { + CCTK_TimerResetI (myGH->dumpParamsTimer); + CCTK_TimerStartI (myGH->dumpParamsTimer); + } if (verbose) printf ("Dumping Params ...\n -- "); /* first the parameters ... */ if (iof) { -/*** FIXME ***/ -#if 0 if (out3D_parameters) - IOFlexIO_IEEEIOparamDump (iof); -#endif - if (out3D_structures) - IOFlexIO_IEEEIOStructDump (GH, iof); + IOFlexIO_DumpParams (GH, iof); + IOFlexIO_DumpGHExtensions (GH, iof); + } + + /* stop parameter timer and start timer for dumping datasets */ + if (print_timing_info) { + CCTK_TimerStopI (myGH->dumpParamsTimer); + CCTK_TimerResetI (myGH->dumpVarsTimer); + CCTK_TimerStartI (myGH->dumpVarsTimer); } wrotech = 0; @@ -283,8 +360,7 @@ void IOFlexIO_DumpGH (cGH *GH, int called_from) for (index = 0; index < CCTK_NumVars (); index++) { /* let only variables pass which have storage assigned */ - if (! CCTK_QueryGroupStorageI (GH, - CCTK_GroupIndexFromVarI (index))) + if (! CCTK_QueryGroupStorageI (GH, CCTK_GroupIndexFromVarI (index))) continue; if (verbose) { @@ -308,34 +384,22 @@ void IOFlexIO_DumpGH (cGH *GH, int called_from) IOFlexIO_DumpVar (GH, index, timelevel, iof); } /* end of loop over all variables */ -#if 0 - CactusStopTimer (&write_time); -#endif + /* stop timer for dumping datasets */ + if (print_timing_info) + CCTK_TimerStopI (myGH->dumpVarsTimer); CACTUS_IEEEIO_ERROR (IOclose (iof)); - if (verbose) -#if 0 - printf ("\nTime to write: %f sec (%f sec per Grid Func)\n", -/*** FIXME: choose right component of basic[] ***/ - write_time.total.basic [0], - write_time.total.basic [0] / CCTK_NumVars ()); -#endif -#ifndef WIN32 - /* PW: This should work on WIN32 also, since it - is in stdio.h. Someone should check this - if/when we go into WIN32 production. - */ if (CCTK_MyProc (GH) == ioUtilGH->ioproc) { if (rename (tmpfname, dumpfname)) { char msg [512]; - sprintf (msg, "Could not rename temporary checkpoint file %s to %s", tmpfname, dumpfname); + sprintf (msg, "Could not rename temporary checkpoint file %s to %s", + tmpfname, dumpfname); CCTK_WARN (0, msg); /* should not return here */ } } -#endif /* delete the oldest dumpfile if checkpoint_keep_all isn't set and put the new filename into the ring buffer */ @@ -355,15 +419,52 @@ void IOFlexIO_DumpGH (cGH *GH, int called_from) ioUtilGH->downsample_y = old_downsample_y; ioUtilGH->downsample_z = old_downsample_z; -#if 0 - CactusStopTimer (&total_time); -#endif + /* stop total checkpoint timer and print timing info */ + if (print_timing_info) { + t_TimerInfo *info; - if (verbose) { -#if 0 -/*** FIXME: choose right component of basic[] ***/ - printf ("Time to checkpoint: %f sec\n", total_time.total.basic [0]); - printf ("------------------------------------------------------------\n"); -#endif + CCTK_TimerStopI (myGH->checkpointTotalTimer); + + printf ("%s timing information for checkpointing:\n", CCTK_THORNSTRING); + + info = CCTK_TimerCreateInfo (); + if (info) { + + if (myGH->dumpParamsTimer >= 0) { + CCTK_TimerGetI (myGH->dumpParamsTimer, info); +{ +/*** FIXME: select right timers and value types !!! ***/ + +#include +assert (info->n_vals >= 2); +assert (info->vals [0].type == val_double && info->vals [1].type == val_double); +} + printf (" Time to dump parameters: %5.1f sec (GetTimeOfDay), " + "%5.1f sec (GetrUsage)\n", + info->vals [0].val.d, info->vals [1].val.d); + } + + if (myGH->dumpVarsTimer >= 0) { + CCTK_TimerGetI (myGH->dumpVarsTimer, info); + printf (" Time to dump datasets: %5.1f sec (GetTimeOfDay), " + "%5.1f sec (GetrUsage)\n", + info->vals [0].val.d, info->vals [1].val.d); + } + + if (myGH->checkpointTotalTimer >= 0) { + CCTK_TimerGetI (myGH->checkpointTotalTimer, info); + printf (" Total time to checkpoint: %5.1f sec (GetTimeOfDay), " + "%5.1f sec (GetrUsage)\n", + info->vals [0].val.d, info->vals [1].val.d); + } + + CCTK_TimerDestroyInfo (info); + } else + CCTK_WARN (1, "Couldn't create timer info structure ! No timing output " + "available."); + + printf ("----------------------------------------------------------------" + "-----------\n"); } + } diff --git a/src/DumpVar.c b/src/DumpVar.c index 96561fd..b47fe01 100644 --- a/src/DumpVar.c +++ b/src/DumpVar.c @@ -520,12 +520,12 @@ void IOFlexIO_AddCommonAttributes (cGH *GH, int index, int timelevel, ioUtilGH = (ioGH *) GH->extensions [CCTK_GHExtensionHandle ("IO")]; name = CCTK_FullName (index); - CACTUS_IEEEIO_ERROR (IOwriteAttribute (iof, "name", BYTE, + CACTUS_IEEEIO_ERROR (IOwriteAttribute (iof, "name", FLEXIO_CHAR, strlen (name) + 1, name)); free (name); gname = CCTK_GroupNameFromVarI (index); - CACTUS_IEEEIO_ERROR (IOwriteAttribute (iof, "groupname", BYTE, + CACTUS_IEEEIO_ERROR (IOwriteAttribute (iof, "groupname", FLEXIO_CHAR, strlen (gname) + 1, gname)); free (gname); @@ -542,7 +542,7 @@ void IOFlexIO_AddCommonAttributes (cGH *GH, int index, int timelevel, 1, &i_to_IO)); if (char_time_date && out3D_datestamp) - CACTUS_IEEEIO_ERROR (IOwriteAttribute (iof, "date", BYTE, + CACTUS_IEEEIO_ERROR (IOwriteAttribute (iof, "date", FLEXIO_CHAR, strlen (char_time_date) + 1, char_time_date)); CACTUS_IEEEIO_ERROR (IOwriteAttribute (iof, "time", FLEXIO_REAL, 1,&GH->cctk_time)); @@ -629,7 +629,7 @@ void IOFlexIO_AddChunkAttributes (cGH *GH, int index, CCTK_INT4 chunk_origin [3] 1, &i_to_IO)); name = CCTK_FullName (index); - CACTUS_IEEEIO_ERROR (IOwriteAttribute (iof, "name", BYTE, + CACTUS_IEEEIO_ERROR (IOwriteAttribute (iof, "name", FLEXIO_CHAR, strlen (name)+1, name)); } diff --git a/src/GHExtension.c b/src/GHExtension.c index eebb0cb..38edd5f 100644 --- a/src/GHExtension.c +++ b/src/GHExtension.c @@ -31,6 +31,7 @@ void SetupSliceCenter (cGH *GH); void *IOFlexIO_SetupGH (tFleshConfig *config, int convergence_level, cGH *GH) { + DECLARE_CCTK_PARAMETERS int i, numvars; flexioGH *newGH; @@ -122,8 +123,60 @@ int IOFlexIO_InitGH (cGH *GH) /* set up 2D planes to plot */ SetupSliceCenter (GH); + /* create timers if timing info was requested */ + if (print_timing_info) { + myGH->dumpVarsTimer = CCTK_TimerCreateI (); + myGH->dumpParamsTimer = CCTK_TimerCreateI (); + myGH->checkpointTotalTimer = CCTK_TimerCreateI (); + myGH->recoverVarsTimer = CCTK_TimerCreateI (); + myGH->recoverParamsTimer = CCTK_TimerCreateI (); + myGH->recoverTotalTimer = CCTK_TimerCreateI (); + + if (myGH->dumpVarsTimer < 0) + CCTK_WARN (1, "Could not create timer ! Timing info on dumping datasets " + "will not be available."); + if (myGH->dumpParamsTimer < 0) + CCTK_WARN (1, "Could not create timer ! Timing info on dumping parameters" + " will not be available."); + if (myGH->checkpointTotalTimer < 0) + CCTK_WARN (1, "Could not create timer ! Timing info on total checkpoint " + "time will not be available."); + + if (myGH->recoverVarsTimer < 0) + CCTK_WARN (1, "Could not create timer ! Timing info on recovering " + "datasets will not be available."); + if (myGH->recoverParamsTimer < 0) + CCTK_WARN (1, "Could not create timer ! Timing info on recovering " + " parameters will not be available."); + if (myGH->recoverTotalTimer < 0) + CCTK_WARN (1, "Could not create timer ! Timing info on total recovery " + "time will not be available."); + + CCTK_TimerResetI (myGH->checkpointTotalTimer); + CCTK_TimerResetI (myGH->recoverTotalTimer); + } + + return (0); +} + + +#if 0 +int IOFlexIO_Terminate (cGH *GH) +{ + DECLARE_CCTK_PARAMETERS + + if (print_timing_info) { + CCTK_TimerDestroyI (myGH->dumpVarsTimer); + CCTK_TimerDestroyI (myGH->dumpParamsTimer); + CCTK_TimerDestroyI (myGH->checkpointTotalTimer); + CCTK_TimerDestroyI (myGH->recoverVarsTimer); + CCTK_TimerDestroyI (myGH->recoverParamsTimer); + CCTK_TimerDestroyI (myGH->recoverTotalTimer); + } + return (0); } +#endif /****************************************************************************/ diff --git a/src/RecoverGH.c b/src/RecoverGH.c index a8fd02b..8472167 100644 --- a/src/RecoverGH.c +++ b/src/RecoverGH.c @@ -81,9 +81,7 @@ int IOFlexIO_RecoverGH (cGH *GH, const char *basename, int called_from) char msg [512]; pGH *pughGH; ioGH *ioUtilGH; -#if 0 - cTimer total_time, dataset_time, param_time; -#endif + flexioGH *myGH; #ifdef MPI CCTK_INT info [3]; #endif @@ -95,22 +93,18 @@ int IOFlexIO_RecoverGH (cGH *GH, const char *basename, int called_from) file_ioproc_every = 0; file_unchunked = 0; - /* Get the handles for PUGH and IOUtil extensions */ + /* Get the handles for PUGH, IOUtil, and IOFlexIO extensions */ pughGH = (pGH *) GH->extensions [CCTK_GHExtensionHandle ("PUGH")]; ioUtilGH = (ioGH *) GH->extensions [CCTK_GHExtensionHandle ("IO")]; + myGH = (flexioGH *) GH->extensions [CCTK_GHExtensionHandle ("IOFlexIO")]; /* identify myself */ nprocs = CCTK_nProcs (GH); myproc = CCTK_MyProc (GH); -#if 0 - /* initialize timers */ - CactusResetTimer (&total_time); - CactusResetTimer (&dataset_time); - CactusResetTimer (¶m_time); - - CactusStartTimer (&total_time); -#endif + /* start the total timer */ + if (print_timing_info) + CCTK_TimerStartI (myGH->recoverTotalTimer); /* Examine base file to find whether recovering from * one (recombined) file or from multiple files @@ -266,14 +260,20 @@ int IOFlexIO_RecoverGH (cGH *GH, const char *basename, int called_from) printf ("Recovering %schunked data with ioproc %d, ioproc_every %d.\n", file_unchunked ? "un" : "", file_ioproc, file_ioproc_every); -#if 0 - CactusStartTimer (&dataset_time); -#endif + /* start timer for restoring variables */ + if (print_timing_info) { + CCTK_TimerResetI (myGH->recoverVarsTimer); + CCTK_TimerStartI (myGH->recoverVarsTimer); + } + + /* restore all variables from checkpoint file */ IOFlexIO_RestoreIEEEIOfile (GH, ifp, file_ioproc, file_ioproc_every, file_unchunked); -#if 0 - CactusStopTimer (&dataset_time); -#endif + + /* stop variable timer */ + if (print_timing_info) + CCTK_TimerStopI (myGH->recoverVarsTimer); + /* Close the file. */ if (myproc == file_ioproc) { if (verbose) @@ -282,10 +282,8 @@ int IOFlexIO_RecoverGH (cGH *GH, const char *basename, int called_from) } if (called_from == CP_RECOVER_DATA) { + /* Must read in parameters and scalars on all processors. */ -#if 0 - CactusStartTimer (¶m_time); -#endif for (proc = file_ioproc; proc < file_ioproc+file_ioproc_every && proc < nprocs; proc++) { @@ -293,6 +291,12 @@ int IOFlexIO_RecoverGH (cGH *GH, const char *basename, int called_from) /* Only have the file open by one proc at any time. */ if (proc == myproc) { + /* start timer for restoring parameters */ + if (print_timing_info) { + CCTK_TimerResetI (myGH->recoverParamsTimer); + CCTK_TimerStartI (myGH->recoverParamsTimer); + } + /* Open file, make sure the file is valid */ ifp = IEEEopen (fname, "r"); if (! IOisValid (ifp)) { @@ -304,16 +308,8 @@ int IOFlexIO_RecoverGH (cGH *GH, const char *basename, int called_from) /* Restore the parameters. */ if (verbose) printf ("Recovering parameters on processor %d.\n", myproc); -/*** FIXME ***/ -#if 0 - IO_IEEEIOparamRestore (ifp, myproc); + IOFlexIO_restoreParams (ifp, myproc); - /* Restore the structure variables. */ - if (verbose) - printf ("Recovering GH variables.\n"); - IO_IEEEIOStructRestore (GH, ifp); -#endif - /* Restore global variables */ /* Get the main loop index. */ @@ -362,30 +358,72 @@ int IOFlexIO_RecoverGH (cGH *GH, const char *basename, int called_from) if (verbose) printf ("Closing '%s' after recovery.\n", fname); IOclose (ifp); + + /* stop timer for restoring parameters */ + if (print_timing_info) + CCTK_TimerStopI (myGH->recoverParamsTimer); + } /* Synchronise all processors */ CCTK_Barrier (GH); } -#if 0 - CactusStopTimer (¶m_time); -#endif } - /* print timing output */ - if (verbose && called_from == CP_RECOVER_DATA && myproc == 0) { -#if 0 - printf ( - "----------------------------------------------------------------\n"); -/*** FIXME: choose right component of basic[] ***/ - printf ("Time to restore data: %10.3f sec\n", - dataset_time.total.basic [0]); - printf ("Time to restore parameters: %10.3f sec\n", - param_time.total.basic [0]); - printf ("Time to recover from checkpoint: %10.3f sec\n", - total_time.total.basic [0]); -#endif + /* stop total recovery timer and print timing info */ + if (print_timing_info && called_from == CP_RECOVER_DATA) { + t_TimerInfo *info; + + CCTK_TimerStopI (myGH->recoverTotalTimer); + + printf ("%s timing information for recovery:\n", CCTK_THORNSTRING); + + info = CCTK_TimerCreateInfo (); + if (info) { + + if (myGH->recoverVarsTimer >= 0) { + CCTK_TimerGetI (myGH->recoverVarsTimer, info); +{ +/*** FIXME: select right timers and value types !!! ***/ + +#include +assert (info->n_vals >= 2); +assert (info->vals [0].type == val_double && info->vals [1].type == val_double); +} + printf ("Time to recover datasets: %5.1f sec (GetTimeOfDay), " + "%5.1f sec (GetrUsage)\n", + info->vals [0].val.d, info->vals [1].val.d); + } + + if (myGH->recoverParamsTimer >= 0) { + CCTK_TimerGetI (myGH->recoverParamsTimer, info); + printf ("Time to recover parameters: %5.1f sec (GetTimeOfDay), " + "%5.1f sec (GetrUsage)\n", + info->vals [0].val.d, info->vals [1].val.d); + } + + if (myGH->recoverTotalTimer >= 0) { + CCTK_TimerGetI (myGH->recoverTotalTimer, info); + printf ("Total time to recover: %5.1f sec (GetTimeOfDay), " + "%5.1f sec (GetrUsage)\n", + info->vals [0].val.d, info->vals [1].val.d); + } + + CCTK_TimerDestroyInfo (info); + } else + CCTK_WARN (1, "Couldn't create timer info structure ! No timing output " + "available."); + + printf ("----------------------------------------------------------------" + "---------\n"); } return (0); } + +int IOFlexIO_restoreParams (IOFile ifp, int myproc) +{ + CCTK_INFO ("Called IOFlexIO_restoreParams()\n"); + + return (0); +} diff --git a/src/RestoreFile.c b/src/RestoreFile.c index eec8999..9207000 100644 --- a/src/RestoreFile.c +++ b/src/RestoreFile.c @@ -74,7 +74,7 @@ int GetCommonAttributes (cGH *GH, IOFile ifp, int unchunked, int *index, /* retrieve the name attribute */ i = IOreadAttributeInfo (ifp, "name", &atype, &asize); - if (i < 0 || (atype != BYTE && atype != CHAR) || asize >= sizeof (fullname)) { + if (i < 0 || atype != FLEXIO_CHAR || asize >= sizeof (fullname)) { CCTK_WARN (2, "Can't read name attribute"); return (1); } @@ -90,7 +90,7 @@ int GetCommonAttributes (cGH *GH, IOFile ifp, int unchunked, int *index, /* read and verify the group name */ i = IOreadAttributeInfo (ifp, "groupname", &atype, &asize); - if (i < 0 || (atype != BYTE && atype != CHAR) || asize >= sizeof (groupname_stored)) { + if (i < 0 || atype != FLEXIO_CHAR || asize >= sizeof (groupname_stored)) { sprintf (msg, "Can't read groupname attribute of '%s'", fullname); CCTK_WARN (2, msg); return (1); @@ -232,7 +232,7 @@ int GetChunkAttributes (cGH *GH, IOFile ifp, int index) /* retrieve the name attribute */ i = IOreadAttributeInfo (ifp, "name", &atype, &asize); - if (i < 0 || (atype != BYTE && atype != CHAR) || asize >= sizeof (fullname)) { + if (i < 0 || atype != FLEXIO_CHAR || asize >= sizeof (fullname)) { CCTK_WARN (2, "Can't read name attribute"); return (1); } diff --git a/src/Write3D.c b/src/Write3D.c index 453559c..ce69ad5 100644 --- a/src/Write3D.c +++ b/src/Write3D.c @@ -195,11 +195,9 @@ void IOFlexIO_Write3D (cGH *GH, int index, const char *alias) if (IEEEfile_3D) { /* output parameters necessary for filereader datafiles */ if (isNewFile) - IOFlexIO_IEEEIOStructDump (GH, IEEEfile_3D->iofile); -#if 0 - if (ioUtilGH->parameters) - IOFlexIO_IEEEIOparamDump (IEEEfile_3D->iofile); -#endif + IOFlexIO_DumpGHExtensions (GH, IEEEfile_3D->iofile); + if (out3D_parameters) + IOFlexIO_DumpParams (GH, IEEEfile_3D->iofile); /* close the file */ IOFlexIO_Write3D_closeFile (GH, IEEEfile_3D); } diff --git a/src/ioFlexGH.h b/src/ioFlexGH.h index 69d3d73..69f9cc9 100644 --- a/src/ioFlexGH.h +++ b/src/ioFlexGH.h @@ -97,6 +97,14 @@ typedef struct IOFlexIOGH { /* slice point for 2D output */ int sp2xyz [3]; + /* handles for different timers */ + int dumpVarsTimer; + int dumpParamsTimer; + int checkpointTotalTimer; + int recoverVarsTimer; + int recoverParamsTimer; + int recoverTotalTimer; + } flexioGH; -- cgit v1.2.3