Skip to content
Snippets Groups Projects
  1. Nov 21, 2023
  2. Jun 19, 2023
  3. May 22, 2023
    • Mark OLESEN's avatar
      ENH: centralise handling of fileOperations communicator subset · 73f6c7fe
      Mark OLESEN authored
      - use local function for the decision making, whether worldComm or a
        dedicated communicator is needed (and which sibling ranks are
        involved)
      
      Co-authored-by: mattijs <mattijs>
      73f6c7fe
    • Mark OLESEN's avatar
      ENH: more flexible handling of FOAM_IORANKS · 06147dab
      Mark OLESEN authored
      - accept plain lists (space or comma separated) as well as the
        traditional OpenFOAM lists. This simplifies argument handling
        with job scripts.
      
        For example,
           simpleFoam -ioRanks 0,4,8 ...
        vs
           simpleFoam -ioRanks '(0 4 8)'  ...
      
        It is also possible to select the IO ranks on a per-host basis:
      
           simpleFoam -ioRanks host  ...
      
      - expose rank/subrank handling as static fileOperation methods
      06147dab
    • Mark OLESEN's avatar
      ENH: check managed communicator upon construction of fileOperation · 336422e0
      Mark OLESEN authored
      - previously checked on destruction, but it is robuster to check for a
        locally defined communicator during construction
      
      - add InfoProxy output for fileOperation
      
      ENH: add fileOperation::storeComm()
      
      - transfers management of the communicator from external to internal.
        Use with caution
      336422e0
  4. Apr 04, 2023
  5. Dec 01, 2022
    • Mark OLESEN's avatar
      ENH: more consistent single-ownership when swapping fileHandlers · 9711b7f1
      Mark OLESEN authored and Andrew Heather's avatar Andrew Heather committed
      - make fileHandler deletion mechanism more
        transparent by providing a nullptr signature. A nullptr parameter
        is already being used in the argList destructor for shutdown, but that
        relied on an implicit conversion to autoPtr to trigger things.
      
      - improved handling of file handler replacement.
      
        Previously had a very basic check on old vs new handlers using their
        type() values (string comparison!!), which would unfortunately
        prevent proper swapping of the contents.
        Check the actual pointers instead.
      
        As part of the change, treat any empty autoPtr as no-op instead of as
        deletion (which is handled explicitly as nullptr instead).
      
        In addition to making the internal logic simpler, it means that the
        current file handler always changes to a valid state without
        inadvertently removing everything and falling back to creating a new
        default handler (again).
      
        This handling of no-ops also simplifies call code. For example,
      
        <code>
            autoPtr<fileHandler> oldHandler;
            autoPtr<fileHandler> writeHandler;
            word handlerName;
      
            if (arg.readIfPresent("writeHandler", handlerName))
            {
                writeHandler = fileOperation::New(handlerName);
            }
      
            oldHandler = fileHandler(std::move(writeHandler));
      
            ... do something
      
            writeHandler = fileHandler(std::move(oldHandler));
        </code>
      
        If the "writeHandler" is not specified, each call is a no-op.
        If it is specified, the handlers are swapped out each time.
      
      - the management of the fileHandler communicators is now encapsulated
        privately (managedComm_) with the final layer being responsible for
        cleaning up after itself. This makes delegation/inheritance clearer
        and avoids the risk of freeing an MPI communicator twice.
      
      STYLE: uniformFile static check relocated to fileOperation layer
      9711b7f1
  6. Nov 26, 2022
  7. Nov 15, 2022
    • Mark OLESEN's avatar
      ENH: add support for OFstream atomic file creation (#2631) · 5338e56c
      Mark OLESEN authored
      - with ATOMIC, an intermediary file is created - eg, (fileAbc~tmp~)
        where all of the output is written to. When the stream goes out of
        scope, this intermediary file is moved/renamed to the actually
        output name - eg, (fileAbc~tmp~) -> (fileAbc).
      
        This adds some safety if the simulation crashes while writing the
        file, since it will the partial (corrupt) file will be left
        behind as (fileAbc~tmp~) and not as (fileAbc), which means it will
        will be treated as a backup file and not loaded again on restart.
      
      ENH: provided enumeration for APPEND/NON_APPEND
      
      - clearer than using bool (with comments).
        Since append mode is primarily only used by masterOFstream etc
        this change is unlikely to affect user coding.
      
      ENH: use file atomic for ensight file creation
      
      - avoids corrupt (truncated) files being referenced by the ensight
        case file if the simulation crashes while writing the ensight file.
      5338e56c
  8. Jul 19, 2022
  9. Mar 12, 2022
  10. Nov 02, 2021
  11. Mar 22, 2021
  12. Mar 17, 2021
  13. Mar 16, 2021
    • Mark OLESEN's avatar
      ENH: support additional output meta data in FoamFile header · da44c100
      Mark OLESEN authored and Andrew Heather's avatar Andrew Heather committed
      - currently add to mesh zones to provide a table of contents
        of the zone names that allows downstream consumers quick access to
        the information without needing to parse the entire file.
      da44c100
    • Mark OLESEN's avatar
      ENH: additional routines for reading/writing/parsing IOObject headers · 0c985edf
      Mark OLESEN authored and Andrew Heather's avatar Andrew Heather committed
      - support selective enable/disable of the file banner.
      
      ENH: improve code isolation for decomposedBlockData
      
      - use readBlockEntry/writeBlockEntry to encapsulate the IO handling,
        which ensures more consistency
      
      - new decomposedBlockData::readHeader for chaining into the
        block header information.
      
      - remove unused constructors for decomposedBlockData
      
      ENH: minor cleanup of collated fileOperations
      0c985edf
    • Mark OLESEN's avatar
      ENH: more consistent use of IOstreamOption · e8cf2a2c
      Mark OLESEN authored and Andrew Heather's avatar Andrew Heather committed
      - improves interface and data consistency.
        Older signatures are still active (via the Foam_IOstream_extras
        define).
      
      - refine internals for IOstreamOption streamFormat, versionNumber
      
      ENH: improve data alignment for IOstream and IOobject
      
      - fit sizeof label/scalar into unsigned char
      
      STYLE: remove dead code
      e8cf2a2c
  14. Dec 08, 2020
    • Mark OLESEN's avatar
      ENH: robuster fileOperations splitProcessorPath · df74e844
      Mark OLESEN authored
      - robuster matching behaviour when encountering paths that themselves
        contain the word "processor" in them. For example,
      
          "/path/processor0generation2/case1/processor10/system"
          will now correctly match on processor10 instead of failing.
      
      - use procRangeType for encapsulating the processor ranges
      
      - provision for information of distributed vs non-distributed roots.
        The information is currently available from the initial setup, but
        can useful to access directly within fileOperation.
      
      STYLE: modernize list iteration
      df74e844
  15. Mar 16, 2020
    • Mark OLESEN's avatar
      CONFIG: improve prefix matching for system libraries (#1607) · fe17c8ad
      Mark OLESEN authored
      - missed detection of system libraries when installed with multiarch
        paths like /usr/lib/x86_64-linux-gnu
      
      CONFIG: improve handling of group/user config files (#928)
      
      - changed bashrc handling of FOAM_CONFIG_NOUSER to use
        FOAM_CONFIG_MODE instead. Propagate into foamEtcFile to make this
        a stickier control.
      
        This change allows better control, but also enables cluster
        installations to define their own value within the OpenFOAM prefs.sh
        file to prevent users accidentally mis-configuring things if
        necessary.
      
      - remove undocumented handling of an (a)ll mode in foamEtcFile to
        avoid potential pitfalls.
      
      - add support for FOAM_CONFIG_ETC handling.
        This allows injection of an extra search layer when finding
        project etc files
      
      ENH: improvements to foamConfigurePaths (#928)
      
      - handle FOAM_CONFIG_ETC implicitly, or explicitly with the new
        -etc option.
      
      STYLE: more explicit wording in foamConfigurePaths usage (#1602)
      
      - document that an absolute path (eg, -scotch-path) overrides/ignores
        the equivalent ThirdParty setting (eg, -scotch)
      
      - longer options -system-compiler and -third-compiler for -system
        and -third, respectively. Clearer as to their purpose.
      
      - adjust the location sanity check to look for META-INFO directory.
      fe17c8ad
  16. Feb 24, 2020
    • Mark OLESEN's avatar
      CONFIG: improve prefix matching for system libraries (#1607) · 5ba2cbc5
      Mark OLESEN authored
      - missed detection of system libraries when installed with multiarch
        paths like /usr/lib/x86_64-linux-gnu
      
      CONFIG: improve handling of group/user config files (#928)
      
      - changed bashrc handling of FOAM_CONFIG_NOUSER to use
        FOAM_CONFIG_MODE instead. Propagate into foamEtcFile to make this
        a stickier control.
      
        This change allows better control, but also enables cluster
        installations to define their own value within the OpenFOAM prefs.sh
        file to prevent users accidentally mis-configuring things if
        necessary.
      
      - remove undocumented handling of an (a)ll mode in foamEtcFile to
        avoid potential pitfalls.
      
      - add support for FOAM_CONFIG_ETC handling.
        This allows injection of an extra search layer when finding
        project etc files
      
      ENH: improvements to foamConfigurePaths (#928)
      
      - handle FOAM_CONFIG_ETC implicitly, or explicitly with the new
        -etc option.
      
      STYLE: more explicit wording in foamConfigurePaths usage (#1602)
      
      - document that an absolute path (eg, -scotch-path) overrides/ignores
        the equivalent ThirdParty setting (eg, -scotch)
      
      - longer options -system-compiler and -third-compiler for -system
        and -third, respectively. Clearer as to their purpose.
      
      - adjust the location sanity check to look for META-INFO directory.
      5ba2cbc5
  17. Feb 19, 2020
  18. Feb 18, 2020
  19. Jan 22, 2020
  20. Jan 09, 2020
  21. Oct 31, 2019
  22. Feb 06, 2019
  23. Jan 25, 2019
  24. Jun 27, 2018
    • Will Bainbridge's avatar
      fileHandler: Added flush method · 2ae4bf73
      Will Bainbridge authored
      This method waits until all the threads have completed IO operations and
      then clears any cached information about the files on disk. This
      replaces the deactivation of threading by means of zeroing the buffer
      size when writing and reading of a file happen in sequence. It also
      allows paraFoam to update the list of available times.
      
      Patch contributed by Mattijs Janssens
      Resolves bug report https://bugs.openfoam.org/view.php?id=2962
      2ae4bf73
  25. Jun 14, 2018
    • Will Bainbridge's avatar
      twoPhaseMixtureThermo: Fix for collated file operation · 70bc72c2
      Will Bainbridge authored
      twoPhaseMixtureThermo writes the temperatures during construction only
      for them to be read again immediately after by construction of the
      individual phases' thermo models. When running with collated file
      handling this behaviour is not thread safe. This change deactivates
      threading for the duration of this behaviour.
      
      Patch contributed by Mattijs Janssens
      70bc72c2
  26. Dec 13, 2017
  27. Jul 19, 2018
  28. Mar 21, 2018
    • Henry Weller's avatar
      ENH: Improvements to the fileHandler and collated IO · 8959b8e0
      Henry Weller authored
      Improvements to existing functionality
      --------------------------------------
        - MPI is initialised without thread support if it is not needed e.g. uncollated
        - Use native c++11 threading; avoids problem with static destruction order.
        - etc/cellModels now only read if needed.
        - etc/controlDict can now be read from the environment variable FOAM_CONTROLDICT
        - Uniform files (e.g. '0/uniform/time') are now read only once on the master only
          (with the masterUncollated or collated file handlers)
        - collated format writes to 'processorsNNN' instead of 'processors'.  The file
          format is unchanged.
        - Thread buffer and file buffer size are no longer limited to 2Gb.
      
      The global controlDict file contains parameters for file handling.  Under some
      circumstances, e.g. running in parallel on a system without NFS, the user may
      need to set some parameters, e.g. fileHandler, before the global controlDict
      file is read from file.  To support this, OpenFOAM now allows the global
      controlDict to be read as a string set to the FOAM_CONTROLDICT environment
      variable.
      
      The FOAM_CONTROLDICT environment variable can be set to the content the global
      controlDict file, e.g. from a sh/bash shell:
      
          export FOAM_CONTROLDICT=$(foamDictionary $FOAM_ETC/controlDict)
      
      FOAM_CONTROLDICT can then be passed to mpirun using the -x option, e.g.:
      
          mpirun -np 2 -x FOAM_CONTROLDICT simpleFoam -parallel
      
      Note that while this avoids the need for NFS to read the OpenFOAM configuration
      the executable still needs to load shared libraries which must either be copied
      locally or available via NFS or equivalent.
      
      New: Multiple IO ranks
      ----------------------
      The masterUncollated and collated fileHandlers can now use multiple ranks for
      writing e.g.:
      
          mpirun -np 6 simpleFoam -parallel -ioRanks '(0 3)'
      
      In this example ranks 0 ('processor0') and 3 ('processor3') now handle all the
      I/O.  Rank 0 handles 0,1,2 and rank 3 handles 3,4,5.  The set of IO ranks should always
      include 0 as first element and be sorted in increasing order.
      
      The collated fileHandler uses the directory naming processorsNNN_XXX-YYY where
      NNN is the total number of processors and XXX and YYY are first and last
      processor in the rank, e.g. in above example the directories would be
      
          processors6_0-2
          processors6_3-5
      
      and each of the collated files in these contains data of the local ranks
      only. The same naming also applies when e.g. running decomposePar:
      
      decomposePar -fileHandler collated -ioRanks '(0 3)'
      
      New: Distributed data
      ---------------------
      
      The individual root directories can be placed on different hosts with different
      paths if necessary.  In the current framework it is necessary to specify the
      root per slave process but this has been simplified with the option of specifying
      the root per host with the -hostRoots command line option:
      
          mpirun -np 6 simpleFoam -parallel -ioRanks '(0 3)' \
              -hostRoots '("machineA" "/tmp/" "machineB" "/tmp")'
      
      The hostRoots option is followed by a list of machine name + root directory, the
      machine name can contain regular expressions.
      
      New: hostCollated
      -----------------
      
      The new hostCollated fileHandler automatically sets the 'ioRanks' according to
      the host name with the lowest rank e.g. to run simpleFoam on 6 processors with
      ranks 0-2 on machineA and ranks 3-5 on machineB with the machines specified in
      the hostfile:
      
          mpirun -np 6 --hostfile hostfile simpleFoam -parallel -fileHandler hostCollated
      
      This is equivalent to
      
          mpirun -np 6 --hostfile hostfile simpleFoam -parallel -fileHandler collated -ioRanks '(0 3)'
      
      This example will write directories:
      
          processors6_0-2/
          processors6_3-5/
      
      A typical example would use distributed data e.g. no two nodes, machineA and
      machineB, each with three processes:
      
          decomposePar -fileHandler collated -case cavity
      
          # Copy case (constant/*, system/*, processors6/) to master:
          rsync -a cavity machineA:/tmp/
      
          # Create root on slave:
          ssh machineB mkdir -p /tmp/cavity
      
          # Run
          mpirun --hostfile hostfile icoFoam \
              -case /tmp/cavity -parallel -fileHandler hostCollated \
              -hostRoots '("machineA" "/tmp" "machineB" "/tmp")'
      
      Contributed by Mattijs Janssens
      8959b8e0
  29. Oct 19, 2017
  30. Jul 07, 2017
    • Andrew Heather's avatar
      INT: Integration of Mattijs' collocated parallel IO additions · d8d6030a
      Andrew Heather authored
      Original commit message:
      ------------------------
      
      Parallel IO: New collated file format
      
      When an OpenFOAM simulation runs in parallel, the data for decomposed fields and
      mesh(es) has historically been stored in multiple files within separate
      directories for each processor.  Processor directories are named 'processorN',
      where N is the processor number.
      
      This commit introduces an alternative "collated" file format where the data for
      each decomposed field (and mesh) is collated into a single file, which is
      written and read on the master processor.  The files are stored in a single
      directory named 'processors'.
      
      The new format produces significantly fewer files - one per field, instead of N
      per field.  For large parallel cases, this avoids the restriction on the number
      of open files imposed by the operating system limits.
      
      The file writing can be threaded allowing the simulation to continue running
      while the data is being written to file.  NFS (Network File System) is not
      needed when using the the collated format and additionally, there is an option
      to run without NFS with the original uncollated approach, known as
      "masterUncollated".
      
      The controls for the file handling are in the OptimisationSwitches of
      etc/controlDict:
      
      OptimisationSwitches
      {
          ...
      
          //- Parallel IO file handler
          //  uncollated (default), collated or masterUncollated
          fileHandler uncollated;
      
          //- collated: thread buffer size for queued file writes.
          //  If set to 0 or not sufficient for the file size threading is not used.
          //  Default: 2e9
          maxThreadFileBufferSize 2e9;
      
          //- masterUncollated: non-blocking buffer size.
          //  If the file exceeds this buffer size scheduled transfer is used.
          //  Default: 2e9
          maxMasterFileBufferSize 2e9;
      }
      
      When using the collated file handling, memory is allocated for the data in the
      thread.  maxThreadFileBufferSize sets the maximum size of memory in bytes that
      is allocated.  If the data exceeds this size, the write does not use threading.
      
      When using the masterUncollated file handling, non-blocking MPI communication
      requires a sufficiently large memory buffer on the master node.
      maxMasterFileBufferSize sets the maximum size in bytes of the buffer.  If the
      data exceeds this size, the system uses scheduled communication.
      
      The installation defaults for the fileHandler choice, maxThreadFileBufferSize
      and maxMasterFileBufferSize (set in etc/controlDict) can be over-ridden within
      the case controlDict file, like other parameters.  Additionally the fileHandler
      can be set by:
      - the "-fileHandler" command line argument;
      - a FOAM_FILEHANDLER environment variable.
      
      A foamFormatConvert utility allows users to convert files between the collated
      and uncollated formats, e.g.
          mpirun -np 2 foamFormatConvert -parallel -fileHandler uncollated
      
      An example case demonstrating the file handling methods is provided in:
      $FOAM_TUTORIALS/IO/fileHandling
      
      The work was undertaken by Mattijs Janssens, in collaboration with Henry Weller.
      d8d6030a