summaryrefslogtreecommitdiff
path: root/src/io/parallelIO.cpp
diff options
context:
space:
mode:
authorAdrian Kummerlaender2019-06-24 14:43:36 +0200
committerAdrian Kummerlaender2019-06-24 14:43:36 +0200
commit94d3e79a8617f88dc0219cfdeedfa3147833719d (patch)
treec1a6894679563e271f5c6ea7a17fa3462f7212a3 /src/io/parallelIO.cpp
downloadgrid_refinement_openlb-94d3e79a8617f88dc0219cfdeedfa3147833719d.tar
grid_refinement_openlb-94d3e79a8617f88dc0219cfdeedfa3147833719d.tar.gz
grid_refinement_openlb-94d3e79a8617f88dc0219cfdeedfa3147833719d.tar.bz2
grid_refinement_openlb-94d3e79a8617f88dc0219cfdeedfa3147833719d.tar.lz
grid_refinement_openlb-94d3e79a8617f88dc0219cfdeedfa3147833719d.tar.xz
grid_refinement_openlb-94d3e79a8617f88dc0219cfdeedfa3147833719d.tar.zst
grid_refinement_openlb-94d3e79a8617f88dc0219cfdeedfa3147833719d.zip
Initialize at openlb-1-3
Diffstat (limited to 'src/io/parallelIO.cpp')
-rw-r--r--src/io/parallelIO.cpp335
1 files changed, 335 insertions, 0 deletions
diff --git a/src/io/parallelIO.cpp b/src/io/parallelIO.cpp
new file mode 100644
index 0000000..2777b97
--- /dev/null
+++ b/src/io/parallelIO.cpp
@@ -0,0 +1,335 @@
+/* This file is part of the OpenLB library
+ *
+ * Copyright (C) 2007 Jonas Latt
+ * E-mail contact: info@openlb.net
+ * The most recent release of OpenLB can be downloaded at
+ * <http://www.openlb.net/>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+*/
+
+#include "communication/mpiManager.h"
+#include "parallelIO.h"
+
+namespace olb {
+
+///////////////////////////////////////////////////////////////////
+// Class ParBuf
+///////////////////////////////////////////////////////////////////
+
+ParBuf::ParBuf(std::streambuf* _originalBuf)
+ : originalBuf(_originalBuf), mode(normal)
+{ }
+
+std::streambuf::int_type
+ParBuf::overflow (std::streambuf::int_type c)
+{
+ int_type returnVal = c;
+ if (c != EOF) {
+#ifdef PARALLEL_MODE_MPI
+ if (singleton::mpi().isMainProcessor()) {
+#endif
+ returnVal = originalBuf->sputc((char)c);
+#ifdef PARALLEL_MODE_MPI
+ }
+ if (mode==normal) {
+ singleton::mpi().bCast(&returnVal, 1);
+ }
+#endif
+ }
+ return returnVal;
+}
+
+ParBuf::Modes
+ParBuf::getMode() const
+{
+ return mode;
+}
+
+void
+ParBuf::setMode(ParBuf::Modes _mode)
+{
+ mode = _mode;
+}
+
+std::streamsize
+ParBuf::xsputn(const char* s, std::streamsize num)
+{
+#ifdef PARALLEL_MODE_MPI
+ if (singleton::mpi().isMainProcessor()) {
+#endif
+ return originalBuf->sputn(s,num);
+#ifdef PARALLEL_MODE_MPI
+ } else {
+ return num;
+ }
+#endif
+}
+
+std::streambuf::int_type
+ParBuf::uflow()
+{
+ int_type value;
+#ifdef PARALLEL_MODE_MPI
+ if (singleton::mpi().isMainProcessor()) {
+#endif
+ value = originalBuf->sbumpc();
+#ifdef PARALLEL_MODE_MPI
+ }
+ if (mode==normal) {
+ singleton::mpi().bCast(&value, 1);
+ }
+#endif
+ return value;
+}
+
+std::streambuf::int_type
+ParBuf::underflow()
+{
+ int_type value;
+#ifdef PARALLEL_MODE_MPI
+ if (singleton::mpi().isMainProcessor()) {
+#endif
+ value = originalBuf->sgetc();
+#ifdef PARALLEL_MODE_MPI
+ }
+ if (mode==normal) {
+ singleton::mpi().bCast(&value, 1);
+ }
+#endif
+ return value;
+}
+
+std::streamsize
+ParBuf::xsgetn (char* s, std::streamsize num)
+{
+ std::streamsize sizeRead=0;
+#ifdef PARALLEL_MODE_MPI
+ if (singleton::mpi().isMainProcessor()) {
+#endif
+ sizeRead = originalBuf->sgetn(s, num);
+#ifdef PARALLEL_MODE_MPI
+ }
+ if (mode==normal) {
+ int intSizeRead = (int) sizeRead;
+ singleton::mpi().bCast(&intSizeRead, 1);
+ singleton::mpi().bCast(s, intSizeRead);
+ sizeRead = (std::streamsize) intSizeRead;
+ }
+#endif
+ return sizeRead;
+}
+
+///////////////////////////////////////////////////////////////////
+// Class olb_ofstream
+///////////////////////////////////////////////////////////////////
+
+olb_ofstream::olb_ofstream() : std::ostream(nullptr), fbuf(), mybuf(&fbuf)
+{
+ this->init(&mybuf);
+}
+
+olb_ofstream::olb_ofstream(const char * filename, openmode mode)
+ : std::ostream(nullptr), fbuf(), mybuf(&fbuf)
+{
+ init(&mybuf);
+ open(filename, mode);
+}
+
+olb_ofstream::~olb_ofstream()
+{ }
+
+std::streambuf*
+olb_ofstream::rdbuf() const
+{
+ return const_cast<ParBuf*>(&mybuf);
+}
+
+bool
+olb_ofstream::is_open()
+{
+ return fbuf.is_open();
+}
+
+void
+olb_ofstream::open(const char* filename, openmode mode)
+{
+ int ok;
+#ifdef PARALLEL_MODE_MPI
+ if (singleton::mpi().isMainProcessor()) {
+#endif
+ ok = (bool) fbuf.open(filename, mode | ios_base::out);
+#ifdef PARALLEL_MODE_MPI
+ }
+ singleton::mpi().bCast(&ok, 1);
+#endif
+ if (!ok) {
+ this->setstate(ios_base::failbit);
+ }
+}
+
+void
+olb_ofstream::close()
+{
+ int ok;
+#ifdef PARALLEL_MODE_MPI
+ if (singleton::mpi().isMainProcessor()) {
+#endif
+ ok = (bool) fbuf.close();
+#ifdef PARALLEL_MODE_MPI
+ }
+ singleton::mpi().bCast(&ok, 1);
+#endif
+ if (!ok) {
+ setstate(ios_base::failbit);
+ }
+}
+
+
+
+///////////////////////////////////////////////////////////////////
+// Class olb_ifstream
+///////////////////////////////////////////////////////////////////
+
+olb_ifstream::olb_ifstream() : std::istream(nullptr), fbuf(), mybuf(&fbuf)
+{
+ init(&mybuf);
+}
+
+olb_ifstream::olb_ifstream(const char * filename, openmode mode)
+ : std::istream(nullptr), fbuf(), mybuf(&fbuf)
+{
+ init(&mybuf);
+ open(filename, mode);
+}
+
+olb_ifstream::~olb_ifstream()
+{ }
+
+std::streambuf*
+olb_ifstream::rdbuf() const
+{
+ return const_cast<ParBuf*>(&mybuf);
+}
+
+bool
+olb_ifstream::is_open()
+{
+ return fbuf.is_open();
+}
+
+
+void
+olb_ifstream::open(const char* filename, openmode mode)
+{
+ int ok;
+#ifdef PARALLEL_MODE_MPI
+ if (singleton::mpi().isMainProcessor()) {
+#endif
+ ok = (bool) fbuf.open(filename, mode | ios_base::in);
+#ifdef PARALLEL_MODE_MPI
+ }
+ singleton::mpi().bCast(&ok, 1);
+#endif
+ if (!ok) {
+ this->setstate(ios_base::failbit);
+ }
+}
+
+void
+olb_ifstream::close()
+{
+ int ok;
+#ifdef PARALLEL_MODE_MPI
+ if (singleton::mpi().isMainProcessor()) {
+#endif
+ ok = (bool) fbuf.close();
+#ifdef PARALLEL_MODE_MPI
+ }
+ singleton::mpi().bCast(&ok, 1);
+#endif
+ if (!ok) {
+ setstate(ios_base::failbit);
+ }
+}
+
+
+///////////////////////////////////////////////////////////////////
+// Class olb_fstream
+///////////////////////////////////////////////////////////////////
+
+olb_fstream::olb_fstream() : std::iostream(nullptr), fbuf(), mybuf(&fbuf)
+{
+ this->init(&mybuf);
+}
+
+olb_fstream::olb_fstream(const char * filename, openmode mode)
+ : std::iostream(nullptr), fbuf(), mybuf(&fbuf)
+{
+ init(&mybuf);
+ open(filename, mode);
+}
+
+olb_fstream::~olb_fstream()
+{ }
+
+std::streambuf*
+olb_fstream::rdbuf() const
+{
+ return const_cast<ParBuf*>(&mybuf);
+}
+
+bool
+olb_fstream::is_open()
+{
+ return fbuf.is_open();
+}
+
+void
+olb_fstream::open(const char* filename, openmode mode)
+{
+ int ok;
+#ifdef PARALLEL_MODE_MPI
+ if (singleton::mpi().isMainProcessor()) {
+#endif
+ ok = (bool) fbuf.open(filename, mode);
+#ifdef PARALLEL_MODE_MPI
+ }
+ singleton::mpi().bCast(&ok, 1);
+#endif
+ if (!ok) {
+ this->setstate(ios_base::failbit);
+ }
+}
+
+void
+olb_fstream::close()
+{
+ int ok;
+#ifdef PARALLEL_MODE_MPI
+ if (singleton::mpi().isMainProcessor()) {
+#endif
+ ok = (bool) fbuf.close();
+#ifdef PARALLEL_MODE_MPI
+ }
+ singleton::mpi().bCast(&ok, 1);
+#endif
+ if (!ok) {
+ setstate(ios_base::failbit);
+ }
+}
+
+}