From 690ef3dfdf9f125f5ccff1609dc79b8685eb2a32 Mon Sep 17 00:00:00 2001 From: Trevor Keller Date: Mon, 18 Dec 2017 13:53:48 -0500 Subject: [PATCH 01/37] Add GitHub templates for issues and pull requests Add single-field functions for discrete gradient --- .github/ISSUE_TEMPLATE.md | 13 +++++++++++++ .github/PULL_REQUEST_TEMPLATE.md | 7 +++++++ include/MMSP.grid.cpp | 18 ++++++++++++++++++ include/MMSP.grid.h | 2 ++ 4 files changed, 40 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE.md create mode 100644 .github/PULL_REQUEST_TEMPLATE.md diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md new file mode 100644 index 0000000..3f8f2d3 --- /dev/null +++ b/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,13 @@ +### There's a *broken feature* in MMSP +- Bug appears in {file or program} +- Encountered running on {CPU} and {accelerator} using {OS} with {relevant software} +- The expected behavior is +- The observed behavior is + +### There's a *missing feature* in MMSP +- The gap is in {file or program} +- It deserves attention because +- A possible approach is + +### There's a *confusing feature* in MMSP +- Join the conversation on [gitter](https://gitter.im/mesoscale/mmsp)! diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..cdca1e1 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,7 @@ +The proposed changes are intended to {summary of intent}. + +This is achieved by {description of method}. + +Fixes #, Addresses # + +The modified code may have unintended consequences in {areas of concern}. diff --git a/include/MMSP.grid.cpp b/include/MMSP.grid.cpp index 8a5eb17..cc0e348 100644 --- a/include/MMSP.grid.cpp +++ b/include/MMSP.grid.cpp @@ -2152,6 +2152,24 @@ template MMSP::vector gradient(const grid& GRID return gradient; } +template MMSP::vector gradient(const grid >& GRID, const vector& x, const int field) +{ + vector gradient(dim); + vector s = x; + + for (int i=0; i vector grad(const grid& GRID, const vector& x) { return gradient(GRID, x); diff --git a/include/MMSP.grid.h b/include/MMSP.grid.h index beb3279..02a0b76 100644 --- a/include/MMSP.grid.h +++ b/include/MMSP.grid.h @@ -501,6 +501,8 @@ template sparse laplacian(const grid >& template vector gradient(const grid& GRID, const vector& x); +template vector gradient(const grid >& GRID, const vector& x, const int field); + template vector grad(const grid& GRID, const vector& x); template T divergence(const grid& GRID, const vector& x); From 9c364b0987ed87e51cd522de383b9a77f958d2d9 Mon Sep 17 00:00:00 2001 From: Dan Lewis Date: Mon, 5 Feb 2018 14:42:46 -0500 Subject: [PATCH 02/37] Update README.md Adding D. Lewis to list of administrators. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 8e3e413..df7e714 100644 --- a/README.md +++ b/README.md @@ -53,7 +53,7 @@ The MMSP manual is a work in progress. It is currently the only source for detai *Contact us* -The administrators for the MMSP source code are Jason Gruber (gruberja@gmail.com) and Trevor Keller (trevor.keller@gmail.com). Please do not hesitate to send questions or comments. +The administrators for the MMSP source code are Jason Gruber (gruberja@gmail.com), Trevor Keller (trevor.keller@gmail.com) and Dan Lewis (lucentdan@gmail.com). Please do not hesitate to send questions or comments. This work was supported in part by the US NSF under award #1056704 through the Metals and Metallic Nanostructures Program, Division of Materials Research. From 6b0f25a8cc026b6a5b503df7be6cc7f88a75e457 Mon Sep 17 00:00:00 2001 From: Matt Fields Date: Tue, 13 Feb 2018 16:10:08 -0500 Subject: [PATCH 03/37] Fixed anisotropic solidification reference grid initialization error --- .../solidification/anisotropic/solidification.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/examples/phase_transitions/solidification/anisotropic/solidification.cpp b/examples/phase_transitions/solidification/anisotropic/solidification.cpp index f9b49cb..dcb33cf 100644 --- a/examples/phase_transitions/solidification/anisotropic/solidification.cpp +++ b/examples/phase_transitions/solidification/anisotropic/solidification.cpp @@ -50,7 +50,9 @@ template void update(grid >& oldGrid, int st ghostswap(oldGrid); - static grid refGrid(oldGrid,0); // constructor copies only field 0 + static grid refGrid(oldGrid,0); + for (int i=0; i > newGrid(oldGrid); double dt=5e-5; // time-step From e56e9f737092149654269ed3d7b4aa7b0737a471 Mon Sep 17 00:00:00 2001 From: Trevor Keller Date: Tue, 13 Feb 2018 17:59:07 -0500 Subject: [PATCH 04/37] Simplify flow, improve readability, minor performance improvements --- .../anisotropic/solidification.cpp | 178 ++++++++++-------- 1 file changed, 98 insertions(+), 80 deletions(-) diff --git a/examples/phase_transitions/solidification/anisotropic/solidification.cpp b/examples/phase_transitions/solidification/anisotropic/solidification.cpp index dcb33cf..3852755 100644 --- a/examples/phase_transitions/solidification/anisotropic/solidification.cpp +++ b/examples/phase_transitions/solidification/anisotropic/solidification.cpp @@ -13,141 +13,159 @@ namespace MMSP { +/* Grid contains two fields: + 0. Phase fraction solid (phi) + 1. Undercooling (u) +*/ + void generate(int dim, const char* filename) { - const int L=128; - const double deltaX=0.025; - const double undercooling=-0.5; - if (dim==2) { + const int L = 128; + const double deltaX = 0.025; + const double undercooling = -0.5; + + if (dim == 2) { GRID2D initGrid(2,0,L,0,L); - for (int d=0; d x = position(initGrid,i); - int r=sqrt(pow(x[0]-L/2,2)+pow(x[1]-L/2,2)); - if (r<=R) initGrid(i)[0]=1.; - else initGrid(i)[0]=0.; + int r = sqrt(pow(x[0]-L/2,2) + pow(x[1]-L/2,2)); + if (r <= R) + initGrid(i)[0] = 1.; + else + initGrid(i)[0] = 0.; } output(initGrid,filename); } else { - std::cerr<<"Anisotropic solidification code is only implemented for 2D."< void update(grid >& oldGrid, int steps) { - int id=0; - int np=1; - static int iterations=1; + int id = 0; + int np = 1; + static int iterations = 1; #ifdef MPI_VERSION - id=MPI::COMM_WORLD.Get_rank(); - np=MPI::COMM_WORLD.Get_size(); + id = MPI::COMM_WORLD.Get_rank(); + np = MPI::COMM_WORLD.Get_size(); #endif ghostswap(oldGrid); - static grid refGrid(oldGrid,0); - for (int i=0; i > newGrid(oldGrid); - - double dt=5e-5; // time-step - double theta=0.; // angle relative to lab frame - double c=0.02; // degree of anisotropy - double N=6.; // symmetry - double alpha=0.015; // gradient-energy coefficient - double tau=3e-4; // time normalization constant - double k1=0.9; - double k2=20.; - double DiffT=2.25; // thermal diffusivity - double CFL=tau/(2*alpha*alpha*(1./pow(dx(oldGrid,0),2)+1./pow(dx(oldGrid,1),2))); // Courant-Friedrich-Lewy condition on dt + static grid refGrid(oldGrid, 0); // create scalar- from vector-valued grid + for (int i = 0; i < nodes(refGrid); i++) // initialize values for refGrid + refGrid(i) = oldGrid(i)[0]; + + double dt = 5e-5; // time-step + const double theta = 0.; // angle relative to lab frame + const double c = 0.02; // degree of anisotropy + const double N = 6.; // symmetry + const double alpha = 0.015; // gradient-energy coefficient + const double tau = 3e-4; // time normalization constant + const double k1 = 0.9; + const double k2 = 20.; + const double DiffT = 2.25; // thermal diffusivity + const double CFL = tau/(2*alpha*alpha*(1./pow(dx(oldGrid,0),2)+1./pow(dx(oldGrid,1),2))); // Courant-Friedrich-Lewy condition on dt if (dt>0.5*CFL) { - if (id==0) std::cout<<"dt="<0.5*CFL) dt*=3./4; - if (id==0) std::cout< 0.5*CFL) + dt *= 3./4; + if (id == 0) + std::cout << dt << "." << std::endl; } - std::cout.precision(2); - int minus=0; - int plus=0; - for (int step=0; step > Dgradphi(oldGrid); - for (int i=0; i x=position(oldGrid,i); + for (int i = 0; i < nodes(oldGrid); i++) { + vector x = position(oldGrid,i); + const T& center = oldGrid(x)[0]; // calculate grad(phi) vector gradphi(dim,0.); // (0,0) - for (int d=0; d x = position(oldGrid,i); + const vector& oldX = oldGrid(x); + const vector& dgpX = Dgradphi(x); + vector& newX = newGrid(x); // Update phase field T divDgradphi = 0.; - for (int d=0; d old=oldGrid(i); - T m_phi=old[0]-0.5-(k1/M_PI)*atan(k2*old[1]); - // Semi-implicit scheme per Warren 2003 - if (m_phi>0) { - newGrid(x)[0] = ((m_phi+tau/dt)*old[0]+divDgradphi)/(tau/dt+old[0]*m_phi); - } else { - newGrid(x)[0] = (old[0]*tau/dt+divDgradphi)/(tau/dt-(1.-old[0])*m_phi); + for (int d = 0; d < dim; d++) { + x[d]--; + const T& left = Dgradphi(x)[d]; + x[d]++; + divDgradphi += (DgpX[d] - left) / dx(oldGrid,d); } - // Fully explicit forward-Euler discretization - //newGrid(x)[0] = oldGrid(i)[0] + dt*dphidt/tau; + + // Semi-implicit scheme per Warren 2003, Eqn. A.21 + T m_phi = oldX[0]-0.5-(k1/M_PI)*atan(k2*oldX[1]); + if (m_phi>0) + newX[0] = ((m_phi+tau/dt)*oldX[0]+divDgradphi)/(tau/dt+oldX[0]*m_phi); + else + newX[0] = (oldX[0]*tau/dt+divDgradphi)/(tau/dt-(1.-oldX[0])*m_phi); // Update undercooling field - T lapT=0; - for (int d=0; d Date: Wed, 21 Feb 2018 17:44:08 -0500 Subject: [PATCH 05/37] fixed implicit casting issue and added cygwin package reqs --- doc/MMSP.chapter2.tex | 13 ++++++++++++- doc/MMSP.manual.pdf | Bin 332102 -> 409439 bytes utility/mmsp2z.cpp | 2 +- 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/doc/MMSP.chapter2.tex b/doc/MMSP.chapter2.tex index 7ad2f12..961b680 100644 --- a/doc/MMSP.chapter2.tex +++ b/doc/MMSP.chapter2.tex @@ -42,7 +42,18 @@ \section{Installation} Mac OS users will follow much of the same procedure as Linux users, so it is advisible to read the previous section on Linux installation. For those uninitiated, or who have never had any previous reason to use it, the {\tt Terminal} application can be found under {\tt Applications/Utilities}. Again, all steps described above for Linux installation should apply here as well. \paragraph{Windows} -For those who insist on using Windows, it is still possible to use \MMSP. The preferred way to do this is to use the \href{http://www.cygwin.com}{cygwin} environment. To use {\tt cygwin} with \MMSP, it is necessary that appropriate packages, such as {\tt gcc} (the GNU compiler) and {\tt make} (the GNU make utility), have been installed. These are optional packages that must be chosen manually during installation. If {\tt cygwin} has been installed properly, \MMSP\ may be installed by following the steps described above for Linux installations. +For those who insist on using Windows, it is still possible to use \MMSP. The preferred way to do this is to use the \href{http://www.cygwin.com}{cygwin} environment. To use {\tt cygwin} with \MMSP, it is necessary that appropriate packages have been installed. The following packages are required to run \MMSP\ : + +\begin{itemize} + \item \textbf{gcc-g++} + \item \textbf{make} + \item \textbf{zlib-devel} + \item \textbf{libpng-devel} + \item \textbf{openmpi} + \item \textbf{libopenmpi-devel} +\end{itemize} + +If {\tt cygwin} has been installed properly, \MMSP\ may be installed by following the steps described above for Linux installations. It is also possible to compile \MMSP\ source code within a code development environment such as Visual Studio, however, \MMSP\ code is typically so simple that any code management beyond command line or makefile compilation is only a hinderance. diff --git a/doc/MMSP.manual.pdf b/doc/MMSP.manual.pdf index 2a57802dba7036857ba07e570034db3029bf3245..66d1d25cdd0300fcdf6dc0474189472a764536a8 100644 GIT binary patch delta 144112 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

Yu^EXSb$Ul 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 Date: Wed, 21 Feb 2018 21:47:15 -0500 Subject: [PATCH 06/37] Fixed implicit cast, solidification.cpp, and added cygwin reqs --- .../solidification/anisotropic/solidification.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/phase_transitions/solidification/anisotropic/solidification.cpp b/examples/phase_transitions/solidification/anisotropic/solidification.cpp index 3852755..60a2855 100644 --- a/examples/phase_transitions/solidification/anisotropic/solidification.cpp +++ b/examples/phase_transitions/solidification/anisotropic/solidification.cpp @@ -133,7 +133,7 @@ template void update(grid >& oldGrid, int st x[d]--; const T& left = Dgradphi(x)[d]; x[d]++; - divDgradphi += (DgpX[d] - left) / dx(oldGrid,d); + divDgradphi += (dgpX[d] - left) / dx(oldGrid,d); } // Semi-implicit scheme per Warren 2003, Eqn. A.21 From 3bdb910d25836d5220f849c5ae5474b0ecb8ccd0 Mon Sep 17 00:00:00 2001 From: Trevor Keller Date: Mon, 26 Feb 2018 14:09:46 -0500 Subject: [PATCH 07/37] Outline how to contribute. Addresses #61. --- CONTRIBUTING.md | 130 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 130 insertions(+) create mode 100644 CONTRIBUTING.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..9f24f43 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,130 @@ +# Contributing to [MMSP: The Mesoscale Microstructure Simulation Project][_mmsp] + +Thank you for spending some time with MMSP. We sincerely appreciate your +interest, and hope you will consider contributing to the documentation, +source code, and community at large. This code is open-source, and we really +appreciate input from the community. There are several ways you can contribute, +including editing or adding documentation, writing tutorials, submitting bug +reports, requesting new features, and writing code to incorporate. If you'd like +to help out, please do! + +If you're looking for support or guidance, please visit our [Gitter chat][_gitter] +to talk with the developers and community members, or send an e-mail to +. + +## Ground Rules + +- Help us to maintain a considerate and supportive community by reading and + enforcing the [Code of Conduct][_conduct]. Be nice to newcomers. +- Promote clean code by ensuring your code and documentation build with neither + warnings nor errors using compiler flags equivalent to [GCC's][_gcc] + `-Wall -pedantic`. +- Engage with the community by creating [issues][_issue] for changes or + enhancements you'd like to make. Discuss ideas the open and get feedback. +- Maximize reusability by keeping code simple. Program in C if possible, and + generally follow the [Google C++ Style Guide][_goog]. Avoid creating new + classes if possible. +- Document new functions and classes with [Doxygen][_doxy]-compatible comments + in the source code. + +## Getting Started + +Interested in helping, but unsure where to start? Consider proofreading the PDF +documentation and reporting or fixing errors! There's bound to be a typo in +there. Or look through the existing [issues][_issue] for fixes or enhancements +you're interested in. The number of comments on an issue can indicate its level +of difficulty, as well as the impact closing it will have. + +If you're brand new to open source, welcome! You might benefit from the +[GitHub Help Pages][_ghhelp] and a [tutorial][_tut]. + +## Branching Workflow + +[MMSP][_mmsp] uses [git][_git] version control with a [branching workflow][_branch], +summarized below. Following this workflow ensures a pristine `master` branch +that remains synchronized, and allows collaborators to quickly and easily review +contributions for content and quality. + +The core mantra is ***never commit to `master`***. On [mesoscale/mmsp][_mmsp], +`master` is the rolling release branch, and code must only be merged into it +following [continuous integration][_ci] testing, code review, and discussion. + +Changes are made on *branches*, using `master` as the trunk. Ideally, a branch +is created based on an [issue][_issue], which captures a *feature* or *hotfix* +to MMSP. To paraphrase illustrations of more involved workflows, a simple +branching model for MMSP looks like the following, with `B` indicating a branch +named `___`, `M` a commit with message `"___"`, `?` a pull request, and `D` +deletion of a branch. Note that branches are numbered sequentially, using the +number of the [issue][_issue] outlining the missing or broken functionality to +be patched. + +``` + mesoscale/ origin/ origin/ + master hotfix feature hotfix feature + : + | + +-----------------------------------------B issue4 + | | + +--------------------------B bug5 M "create function" + | M "missing ;" M "update docs" + | ?----------------+ | + "merge bug5" M---------+ | | + | D D | + +-----------------------------------------M "merge master" + | ?-----------------------+ + | | M "address comments" + | M-----------------------+ + "merge issue4" M-----------------+ | + | D D + : +``` + +## Pull Requests + +*Please neither commit directly to the `master` branch, nor push directly to +mesoscale/mmsp.* + +1. Create a fork of [HiPerC][_hiperc] on your personal GitHub account. +2. For obvious changes, such as typos or edits to `.gitignore`, you can edit + your fork directly in the browser, then file a [pull request][_pr]. +3. Most changes begin with an [Issue][_issue]. If one does not exist, create it. +4. On your local machine, use the command line to work on your local fork of + [MMSP][_mmsp]. Create a working branch off of `master`. If you're working, + for example, on issue #42, *function template documentation*: + - [Fork][_ghhelp] mesoscale/mmsp and [clone][_ghhelp] it to your local machine. + Your fork is a `git remote` with the alias `origin` by default. + - `git pull https://github.com/mesoscale/mmsp.git master` to update your + local `master` branch from the main repository. + - `git checkout -b issue42_function-template-documentation master` to + create a local feature branch off of `master`. + - Write your edits, updates, or feature code. + - `git status`, `git add -u`, `git status`, and `git commit`, + in that order, to carefully add your changes. If something is amiss, follow + the terminal guidance to fix it. + - Write a concise commit message (first line), then in-depth commentary below + using the keywords ["Addresses" or "Closes"][_ghkey] where appropriate. + - `git push origin issue42_summarize-usage-in-pseudocode` to push the + *working branch* to your fork on GitHub. +5. Visit GitHub and make the pull request official. Please fill out the pull + request template and assign a reviewer &emdash; `@tkphd` if noone else suits. + +Obvious fixes will be merged quickly. Enhancements may undergo a code review, +which we typically conduct using [reviewable][_review]. + +## Happy Coding! + +[_mmsp]: https://github.com/mesoscale/mmsp +[_branch]: http://nvie.com/posts/a-successful-git-branching-model/ +[_ci]: https://docs.travis-ci.com/ +[_conduct]: https://github.com/mesoscale/mmsp/blob/master/CODE_OF_CONDUCT.md +[_doxy]: https://www.stack.nl/~dimitri/doxygen/manual/docblocks.html +[_gcc]: https://gcc.gnu.org/ +[_ghhelp]: https://help.github.com/ +[_ghkey]: https://help.github.com/articles/closing-issues-using-keywords/ +[_git]: https://git-scm.com/ +[_gitter]: https://gitter.im/mesoscale/mmsp +[_goog]: https://google.github.io/styleguide/cppguide.html +[_issue]: https://github.com/mesoscale/mmsp/issues +[_pr]: https://help.github.com/articles/about-pull-requests/ +[_review]: https://reviewable.io/reviews/mesoscale/mmsp +[_tut]: https://egghead.io/courses/how-to-contribute-to-an-open-source-project-on-github From 9feb9a1c8ac17ff7e18b29d03adc21f1758197a0 Mon Sep 17 00:00:00 2001 From: Trevor Keller Date: Mon, 26 Feb 2018 16:46:37 -0500 Subject: [PATCH 08/37] address reviewer comments --- CONTRIBUTING.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 9f24f43..0402e5a 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -84,7 +84,7 @@ be patched. *Please neither commit directly to the `master` branch, nor push directly to mesoscale/mmsp.* -1. Create a fork of [HiPerC][_hiperc] on your personal GitHub account. +1. Create a fork of [MMSP][_mmsp] on your personal GitHub account. 2. For obvious changes, such as typos or edits to `.gitignore`, you can edit your fork directly in the browser, then file a [pull request][_pr]. 3. Most changes begin with an [Issue][_issue]. If one does not exist, create it. @@ -99,7 +99,7 @@ mesoscale/mmsp.* create a local feature branch off of `master`. - Write your edits, updates, or feature code. - `git status`, `git add -u`, `git status`, and `git commit`, - in that order, to carefully add your changes. If something is amiss, follow + in that order, to add your changes. If something is amiss, follow the terminal guidance to fix it. - Write a concise commit message (first line), then in-depth commentary below using the keywords ["Addresses" or "Closes"][_ghkey] where appropriate. From b63c2f450569bea03d287276a0a36af75456533c Mon Sep 17 00:00:00 2001 From: Trevor Keller Date: Tue, 17 Jul 2018 17:49:48 -0400 Subject: [PATCH 09/37] check dimensionality before grid-size array access --- include/MMSP.grid.h | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/include/MMSP.grid.h b/include/MMSP.grid.h index 02a0b76..7e3e641 100644 --- a/include/MMSP.grid.h +++ b/include/MMSP.grid.h @@ -385,61 +385,61 @@ class grid // grid utility functions (y direction) friend int y0(const grid& GRID) { - return GRID.x0[1]; + return (dim>1) ? GRID.x0[1] : 0; } friend int y1(const grid& GRID) { - return GRID.x1[1]; + return (dim>1) ? GRID.x1[1] : 0; } friend int ymin(const grid& GRID) { - return GRID.x0[1]; + return (dim>1) ? GRID.x0[1] : 0; } friend int ymax(const grid& GRID) { - return GRID.x1[1]; + return (dim>1) ? GRID.x1[1] : 0; } friend int ylength(const grid& GRID) { - return GRID.x1[1] - GRID.x0[1]; + return (dim>1) ? GRID.x1[1] - GRID.x0[1] : 0; } friend double dy(const grid& GRID) { - return GRID.dx[1]; + return (dim>1) ? GRID.dx[1] : 1; } friend double& dy(grid& GRID) { - return GRID.dx[1]; + return (dim>1) ? GRID.dx[1] : 1; } // grid utility functions (z direction) friend int z0(const grid& GRID) { - return GRID.x0[2]; + return (dim>2) ? GRID.x0[2] : 0; } friend int z1(const grid& GRID) { - return GRID.x1[2]; + return (dim>2) ? GRID.x1[2] : 0; } friend int zmin(const grid& GRID) { - return GRID.x0[2]; + return (dim>2) ? GRID.x0[2] : 0; } friend int zmax(const grid& GRID) { - return GRID.x1[2]; + return (dim>2) ? GRID.x1[2] : 0; } friend int zlength(const grid& GRID) { - return GRID.x1[2] - GRID.x0[2]; + return (dim>2) ? GRID.x1[2] - GRID.x0[2] : 0; } friend double dz(const grid& GRID) { - return GRID.dx[2]; + return (dim>2) ? GRID.dx[2] : 0; } friend double& dz(grid& GRID) { - return GRID.dx[2]; + return (dim>2) ? GRID.dx[2] : 0; } @@ -451,10 +451,10 @@ class grid protected: T* data; // local grid data - int nodes; // number of nodes (excluding ghosts) - int cells; // number of nodes (including ghosts) - int fields; // number of fields - int ghosts; // ghost cell depth + int nodes; // number of nodes (excluding ghosts) + int cells; // number of nodes (including ghosts) + int fields; // number of fields + int ghosts; // ghost cell depth int g0[dim]; // global lower coordinate limit (excluding ghosts) int g1[dim]; // global upper coordinate limit (excluding ghosts) From cdace646eb77a426668389bbb659b7c74c7e287b Mon Sep 17 00:00:00 2001 From: Trevor Keller Date: Wed, 18 Jul 2018 01:14:34 -0400 Subject: [PATCH 10/37] clear compiler warnings --- utility/mmsp2png.cpp | 16 +++++++-------- utility/mmsp2xyz.cpp | 48 +++++++++++--------------------------------- 2 files changed, 20 insertions(+), 44 deletions(-) diff --git a/utility/mmsp2png.cpp b/utility/mmsp2png.cpp index 7328eb3..4f4b7a8 100644 --- a/utility/mmsp2png.cpp +++ b/utility/mmsp2png.cpp @@ -860,9 +860,9 @@ template void convert_scalars(const MMSP::grid& GRI double max=zoomax; for (int n=0; nmax) max=val; else if (val void convert_scalars(const MMSP::grid& GRI unsigned int n=0; MMSP::vector x(1,0); for (x[0] = MMSP::g0(GRID,0); x[0] < MMSP::g1(GRID,0); x[0]++) { - T val = GRID(x); + double val = GRID(x); if (mode==1) //mag - val = std::abs(val); + val = std::fabs(val); assert(n void convert_scalars(const MMSP::grid& GRI MMSP::vector x(2,0); for (x[1] = MMSP::g1(GRID,1)-1; x[1] >= MMSP::g0(GRID,1); x[1]--) for (x[0] = MMSP::g0(GRID,0); x[0] < MMSP::g1(GRID,0); x[0]++) { - T val = GRID(x); + double val = GRID(x); if (mode==1) //mag - val = std::abs(val); + val = std::fabs(val); assert(n void convert_scalars(const MMSP::grid& GRI for (x[0] = MMSP::g0(GRID,0); x[0] < MMSP::g1(GRID,0); x[0]++) { if (x[sliceaxis]!=slicelevel) // clumsy, but effective continue; - T val = GRID(x); + double val = GRID(x); if (mode==1) //mag - val = std::abs(val); + val = std::fabs(val); assert(n0) //contour diff --git a/utility/mmsp2xyz.cpp b/utility/mmsp2xyz.cpp index ca617cc..178b38a 100644 --- a/utility/mmsp2xyz.cpp +++ b/utility/mmsp2xyz.cpp @@ -231,16 +231,8 @@ int main(int argc, char* argv[]) // write grid data if (scalar_type or (not vector_type and not sparse_type)) { // must be scalar or built-in if (bool_type) { - if (dim == 1) { - MMSP::grid<1,bool> GRID(argv[datindex]); - convert_scalars(GRID, mode, normal, levelset, lvlfield, contol, xyzfil); - } else if (dim == 2) { - MMSP::grid<2,bool> GRID(argv[datindex]); - convert_scalars(GRID, mode, normal, levelset, lvlfield, contol, xyzfil); - } else if (dim == 3) { - MMSP::grid<3,bool> GRID(argv[datindex]); - convert_scalars(GRID, mode, normal, levelset, lvlfield, contol, xyzfil); - } + std::cerr << "Error: boolean fields are incompatible with " << argv[0] << std::endl; + MMSP::Abort(-1); } else if (unsigned_char_type) { if (dim == 1) { @@ -378,16 +370,8 @@ int main(int argc, char* argv[]) else if (vector_type) { if (bool_type) { - if (dim == 1) { - MMSP::grid<1,MMSP::vector > GRID(argv[datindex]); - convert_vectors(GRID, mode, normal, levelset, lvlfield, contol, fieldset, xyzfil); - } else if (dim == 2) { - MMSP::grid<2,MMSP::vector > GRID(argv[datindex]); - convert_vectors(GRID, mode, normal, levelset, lvlfield, contol, fieldset, xyzfil); - } else if (dim == 3) { - MMSP::grid<3,MMSP::vector > GRID(argv[datindex]); - convert_vectors(GRID, mode, normal, levelset, lvlfield, contol, fieldset, xyzfil); - } + std::cerr << "Error: boolean fields are incompatible with " << argv[0] << std::endl; + MMSP::Abort(-1); } else if (unsigned_char_type) { if (dim == 1) { @@ -525,16 +509,8 @@ int main(int argc, char* argv[]) else if (sparse_type) { if (bool_type) { - if (dim == 1) { - MMSP::grid<1,MMSP::sparse > GRID(argv[datindex]); - convert_sparses(GRID, mode, normal, levelset, lvlfield, contol, fieldset, xyzfil); - } else if (dim == 2) { - MMSP::grid<2,MMSP::sparse > GRID(argv[datindex]); - convert_sparses(GRID, mode, normal, levelset, lvlfield, contol, fieldset, xyzfil); - } else if (dim == 3) { - MMSP::grid<3,MMSP::sparse > GRID(argv[datindex]); - convert_sparses(GRID, mode, normal, levelset, lvlfield, contol, fieldset, xyzfil); - } + std::cerr << "Error: boolean fields are incompatible with " << argv[0] << std::endl; + MMSP::Abort(-1); } else if (unsigned_char_type) { if (dim == 1) { @@ -679,9 +655,9 @@ template void convert_scalars(const MMSP::grid& GRI if (dim==1) { for (int n=0; n::iterator it=levelset.begin(); excluded && it!=levelset.end(); it++) if (std::fabs(val-*it)/std::fabs(*it) void convert_scalars(const MMSP::grid& GRI } else if (dim==2) { for (int n=0; n::iterator it=levelset.begin(); excluded && it!=levelset.end(); it++) if (std::fabs(val-*it)/std::fabs(*it) void convert_scalars(const MMSP::grid& GRI } else if (dim==3) { for (int n=0; n::iterator it=levelset.begin(); excluded && it!=levelset.end(); it++) if (std::fabs(val-*it)/std::fabs(*it) Date: Tue, 31 Jul 2018 11:06:30 -0400 Subject: [PATCH 11/37] resolve missing-dimension access errors with preset spatial parameters up to 3D --- include/MMSP.grid.cpp | 4 +-- include/MMSP.grid.h | 63 ++++++++++++++++++++++--------------------- 2 files changed, 34 insertions(+), 33 deletions(-) diff --git a/include/MMSP.grid.cpp b/include/MMSP.grid.cpp index cc0e348..65a95cc 100644 --- a/include/MMSP.grid.cpp +++ b/include/MMSP.grid.cpp @@ -1398,7 +1398,7 @@ template void grid::output(const char* filename) con MPI::COMM_WORLD.Barrier(); unsigned int rank = MPI::COMM_WORLD.Get_rank(); unsigned int np = MPI::COMM_WORLD.Get_size(); - MPI_Request request; + MPIO_Request request; MPI_Status status; int mpi_err = 0; @@ -1757,7 +1757,7 @@ template void grid::output(const char* filename) con if (w==nwriters-1) assert(filesize-aoffsets[w]==ws); mpi_err = MPI_File_iwrite_at(output, aoffsets[w], filebuffer, ws, MPI_CHAR, &request); - MPI_Wait(&request, &status); + MPIO_Wait(&request, &status); if (mpi_err != MPI_SUCCESS) { char error_string[256]; int length_of_error_string=256; diff --git a/include/MMSP.grid.h b/include/MMSP.grid.h index 7e3e641..2802885 100644 --- a/include/MMSP.grid.h +++ b/include/MMSP.grid.h @@ -385,61 +385,60 @@ class grid // grid utility functions (y direction) friend int y0(const grid& GRID) { - return (dim>1) ? GRID.x0[1] : 0; + return GRID.x0[1]; } friend int y1(const grid& GRID) { - return (dim>1) ? GRID.x1[1] : 0; + return GRID.x1[1]; } friend int ymin(const grid& GRID) { - return (dim>1) ? GRID.x0[1] : 0; + return GRID.x0[1]; } friend int ymax(const grid& GRID) { - return (dim>1) ? GRID.x1[1] : 0; + return GRID.x1[1]; } friend int ylength(const grid& GRID) { - return (dim>1) ? GRID.x1[1] - GRID.x0[1] : 0; + return GRID.x1[1] - GRID.x0[1]; } friend double dy(const grid& GRID) { - return (dim>1) ? GRID.dx[1] : 1; + return GRID.dx[1]; } friend double& dy(grid& GRID) { - return (dim>1) ? GRID.dx[1] : 1; + return GRID.dx[1]; } - // grid utility functions (z direction) friend int z0(const grid& GRID) { - return (dim>2) ? GRID.x0[2] : 0; + return GRID.x0[2]; } friend int z1(const grid& GRID) { - return (dim>2) ? GRID.x1[2] : 0; + return GRID.x1[2]; } friend int zmin(const grid& GRID) { - return (dim>2) ? GRID.x0[2] : 0; + return GRID.x0[2]; } friend int zmax(const grid& GRID) { - return (dim>2) ? GRID.x1[2] : 0; + return GRID.x1[2]; } friend int zlength(const grid& GRID) { - return (dim>2) ? GRID.x1[2] - GRID.x0[2] : 0; + return GRID.x1[2] - GRID.x0[2]; } friend double dz(const grid& GRID) { - return (dim>2) ? GRID.dx[2] : 0; + return GRID.dx[2]; } friend double& dz(grid& GRID) { - return (dim>2) ? GRID.dx[2] : 0; + return GRID.dx[2]; } @@ -456,28 +455,30 @@ class grid int fields; // number of fields int ghosts; // ghost cell depth - int g0[dim]; // global lower coordinate limit (excluding ghosts) - int g1[dim]; // global upper coordinate limit (excluding ghosts) + #define dMax 3 + + int g0[dMax]; // global lower coordinate limit (excluding ghosts) + int g1[dMax]; // global upper coordinate limit (excluding ghosts) - int x0[dim]; // local lower coordinate limit (excluding ghosts) - int x1[dim]; // local upper coordinate limit (excluding ghosts) - int xx[dim]; // local cells in slice (excluding ghosts) + int x0[dMax]; // local lower coordinate limit (excluding ghosts) + int x1[dMax]; // local upper coordinate limit (excluding ghosts) + int xx[dMax]; // local cells in slice (excluding ghosts) - int s0[dim]; // local lower coordinate limit (including ghosts) - int s1[dim]; // local upper coordinate limit (including ghosts) - int sx[dim]; // local cells in slice (including ghosts) + int s0[dMax]; // local lower coordinate limit (including ghosts) + int s1[dMax]; // local upper coordinate limit (including ghosts) + int sx[dMax]; // local cells in slice (including ghosts) - int b0[dim]; // boundary condition at x0 - int b1[dim]; // boundary condition at x1 + int b0[dMax]; // boundary condition at x0 + int b1[dMax]; // boundary condition at x1 - double dx[dim]; // global cell spacing + double dx[dMax]; // global cell spacing - int p0[dim]; - int p1[dim]; - int sp[dim]; // global processors in slice + int p0[dMax]; + int p1[dMax]; + int sp[dMax]; // global processors in slice - int n0[dim]; // neighbor processor at x0 - int n1[dim]; // neighbor processor at x1 + int n0[dMax]; // neighbor processor at x0 + int n1[dMax]; // neighbor processor at x1 }; From 363fdbe6d98b538b4d416fa0bb21e5b566f00a76 Mon Sep 17 00:00:00 2001 From: Trevor Keller Date: Mon, 20 Aug 2018 19:19:40 -0400 Subject: [PATCH 12/37] VTK-dependent utility compiles and runs, with errors --- README.md | 1 + utility/Makefile | 8 +- utility/mmsp2vti.cpp | 1316 ++++++++++++++++++------------------------ 3 files changed, 556 insertions(+), 769 deletions(-) diff --git a/README.md b/README.md index df7e714..247c6c9 100644 --- a/README.md +++ b/README.md @@ -45,6 +45,7 @@ MMSP is nothing more than a collection of C++ header files that declare a number * An ISO compliant C++ compiler (e.g. GCC 2.95 or later) * zlib libraries for data compression (e.g. zlib 1.2.7) * libpng headers for mmsp2png image generation utility (e.g. libpng12-dev) + * libvtk headers for mmsp2vti image generation utility (e.g. libvtk6-dev) * MPI libraries if compiling parallel programs (e.g. Open MPI) *Documentation* diff --git a/utility/Makefile b/utility/Makefile index 50d1bff..5a81d3d 100644 --- a/utility/Makefile +++ b/utility/Makefile @@ -4,8 +4,8 @@ # compilers/flags compiler = g++ -flags = -O2 -Wall -pedantic -I ../include/ - +flags = -O2 -Wall -I ../include -I /usr/include/vtk-6.3 -L /usr/lib/x86_64-linux-gnu +vtklinks = -lvtkCommonCore-6.3 -lvtkCommonDataModel-6.3 -lvtkIOXML-6.3 topo = ../algorithms/topology # conversion programs @@ -36,6 +36,10 @@ mmsp2tsv : mmsp2tsv.cpp mmsp2vti : mmsp2vti.cpp $(compiler) $(flags) $< -o $@ -lz +# convert MMSP grid file to compressed VTK Image file type +mmsp2vtz : mmsp2vti.cpp + $(compiler) $(flags) -O0 -g $< -o $@ $(vtklinks) -lz + # convert MMSP grid file to XYZ point cloud file type mmsp2xyz : mmsp2xyz.cpp $(compiler) $(flags) $< -o $@ -lz diff --git a/utility/mmsp2vti.cpp b/utility/mmsp2vti.cpp index 5b7d336..2b98384 100644 --- a/utility/mmsp2vti.cpp +++ b/utility/mmsp2vti.cpp @@ -1,33 +1,47 @@ // mmsp2vti.cpp -// Convert MMSP grid data to VTK image data format +// Convert MMSP grid data to XML VTK image data format // Questions/comments to gruberja@gmail.com (Jason Gruber) -#include -#include -#include -#include -#include"MMSP.hpp" - - -template void print_scalars(std::ofstream& fstr, const MMSP::grid& GRID, const int& mode) +#include +#include +#include +#include +#include +#include +#include +#include +#include "MMSP.hpp" + +template void print_scalars(std::string filename, const MMSP::grid& GRID, const int mode) { + vtkSmartPointer imageData = vtkSmartPointer::New(); + imageData->SetDimensions(MMSP::xlength(GRID, 0), MMSP::xlength(GRID, 1), MMSP::xlength(GRID, 2)); + #if VTK_MAJOR_VERSION <= 5 + imageData->SetNumberOfScalarComponents(1); + imageData->SetScalarTypeToDouble(); + #else + imageData->AllocateScalars(VTK_DOUBLE, 1); + #endif + if (dim==1) { MMSP::vector x(1,0); for (x[0]=MMSP::x0(GRID); x[0](imageData->GetScalarPointer(x[0] - MMSP::x0(GRID), 0, 0)); if (mode==1) { // --mag - fstr << std::sqrt(GRID(x)*GRID(x)) << " "; + pixel[0] = std::sqrt(GRID(x)*GRID(x)); } else { - fstr << GRID(x) << " "; + pixel[0] = GRID(x); } } } else if (dim==2) { MMSP::vector x(2,0); for (x[1]=MMSP::y0(GRID); x[1](imageData->GetScalarPointer(x[0] - MMSP::x0(GRID), x[1] - MMSP::y0(GRID), 0)); if (mode==1) { // --mag - fstr << std::sqrt(GRID(x)*GRID(x)) << " "; + pixel[0] = std::sqrt(GRID(x)*GRID(x)); } else { - fstr << GRID(x) << " "; + pixel[0] = GRID(x); } } } @@ -36,119 +50,197 @@ template void print_scalars(std::ofstream& fstr, const MMSP for (x[2]=MMSP::z0(GRID); x[2](imageData->GetScalarPointer(x[0] - MMSP::x0(GRID), x[1] - MMSP::y0(GRID), x[2] - MMSP::z0(GRID))); if (mode==1) { // --mag - fstr << std::sqrt(GRID(x)*GRID(x)) << " "; + pixel[0] = std::sqrt(GRID(x)*GRID(x)); } else { - fstr << GRID(x) << " "; + pixel[0] = GRID(x); } } } } } + + vtkSmartPointer writer = vtkSmartPointer::New(); + writer->SetFileName(filename.c_str()); + // writer->SetCompressorType(ZLIB); + #if VTK_MAJOR_VERSION <= 5 + writer->SetInputConnection(imageData->GetProducerPort()); + #else + writer->SetInputData(imageData); + #endif + writer->Write(); } -template void print_vectors(std::ofstream& fstr, const MMSP::grid >& GRID, - const int& mode, const int& field) +template void print_vectors(std::string filename, const MMSP::grid >& GRID, + const int mode, const int field) { + vtkSmartPointer imageData = vtkSmartPointer::New(); + #if VTK_MAJOR_VERSION <= 5 + imageData->SetScalarTypeToDouble(); + #endif + if (dim==1) { + imageData->SetDimensions(MMSP::x1(GRID)-MMSP::x0(GRID), 1, 1); + #if VTK_MAJOR_VERSION <= 5 + if (mode==1 || mode==2 || mode==3) + imageData->SetNumberOfScalarComponents(1); + else + imageData->SetNumberOfScalarComponents(MMSP::fields(GRID)); + #else + if (mode==1 || mode==2 || mode==3) + imageData->AllocateScalars(VTK_DOUBLE, 1); + else + imageData->AllocateScalars(VTK_DOUBLE, MMSP::fields(GRID)); + #endif + MMSP::vector x(1,0); for (x[0]=MMSP::x0(GRID); x[0]& v = GRID(x); + double* pixel = static_cast(imageData->GetScalarPointer(x[0] - MMSP::x0(GRID), 0, 0)); if (mode==1) { // --mag double sum = 0.0; for (int h = 0; h < v.length(); h++) sum += v[h]*v[h]; - fstr << std::sqrt(sum) << " "; + pixel[0] = std::sqrt(sum); } else if (mode==2) { // --max // Export index of field with greatest magnitude int max = 0; for (int h = 1; h < v.length(); h++) if (v[h] > v[max]) max = h; - fstr << max << " "; + pixel[0] = max; } else if (mode==3) { // --field - fstr << v[field] << " "; + pixel[0] = v[field]; } else { for (int h = 0; h < v.length(); h++) - fstr << v[h] << " "; + pixel[h] = v[h]; } } } else if (dim==2) { + imageData->SetDimensions(MMSP::x1(GRID)-MMSP::x0(GRID), MMSP::y1(GRID)-MMSP::y0(GRID), 1); + #if VTK_MAJOR_VERSION <= 5 + if (mode==1 || mode==2 || mode==3) + imageData->SetNumberOfScalarComponents(1); + else + imageData->SetNumberOfScalarComponents(MMSP::fields(GRID)); + #else + if (mode==1 || mode==2 || mode==3) + imageData->AllocateScalars(VTK_DOUBLE, 1); + else + imageData->AllocateScalars(VTK_DOUBLE, MMSP::fields(GRID)); + #endif + MMSP::vector x(2,0); for (x[1]=MMSP::y0(GRID); x[1]& v = GRID(x); + double* pixel = static_cast(imageData->GetScalarPointer(x[0] - MMSP::x0(GRID), x[1] - MMSP::y0(GRID), 0)); if (mode==1) { // --mag double sum = 0.0; for (int h = 0; h < v.length(); h++) sum += v[h]*v[h]; - fstr << std::sqrt(sum) << " "; + pixel[0] = std::sqrt(sum); } else if (mode==2) { // --max // Export index of field with greatest magnitude int max = 0; for (int h = 1; h < v.length(); h++) if (v[h] > v[max]) max = h; - fstr << max << " "; + pixel[0] = max; } else if (mode==3) { // --field - fstr << v[field] << " "; + pixel[0] = v[field]; } else { for (int h = 0; h < v.length(); h++) - fstr << v[h] << " "; + pixel[h] = v[h]; } } } } else if (dim==3) { + imageData->SetDimensions(MMSP::x1(GRID)-MMSP::x0(GRID), MMSP::y1(GRID)-MMSP::y0(GRID), MMSP::z1(GRID)-MMSP::z0(GRID)); + #if VTK_MAJOR_VERSION <= 5 + if (mode==1 || mode==2 || mode==3) + imageData->SetNumberOfScalarComponents(1); + else + imageData->SetNumberOfScalarComponents(MMSP::fields(GRID)); + #else + if (mode==1 || mode==2 || mode==3) + imageData->AllocateScalars(VTK_DOUBLE, 1); + else + imageData->AllocateScalars(VTK_DOUBLE, MMSP::fields(GRID)); + #endif + MMSP::vector x(3,0); for (x[2]=MMSP::z0(GRID); x[2]& v = GRID(x); + double* pixel = static_cast(imageData->GetScalarPointer(x[0] - MMSP::x0(GRID), x[1] - MMSP::y0(GRID), x[2] - MMSP::z0(GRID))); if (mode==1) { // --mag double sum = 0.0; for (int h = 0; h < v.length(); h++) sum += v[h]*v[h]; - fstr << std::sqrt(sum) << " "; + pixel[0] = std::sqrt(sum); } else if (mode==2) { // --max // Export index of field with greatest magnitude int max = 0; for (int h = 1; h < v.length(); h++) if (v[h] > v[max]) max = h; - fstr << max << " "; + pixel[0] = max; } else if (mode==3) { // --field - fstr << v[field] << " "; + pixel[0] = v[field]; } else { for (int h = 0; h < v.length(); h++) - fstr << v[h] << " "; + pixel[h] = v[h]; } } } } } + + vtkSmartPointer writer = vtkSmartPointer::New(); + writer->SetFileName(filename.c_str()); + // writer->SetCompressorType(ZLIB); + #if VTK_MAJOR_VERSION <= 5 + writer->SetInputConnection(imageData->GetProducerPort()); + #else + writer->SetInputData(imageData); + #endif + writer->Write(); } -template void print_sparses(std::ofstream& fstr, const MMSP::grid >& GRID, - const int& mode, const int& field) +template void print_sparses(std::string filename, const MMSP::grid >& GRID, + const int mode, const int field) { + vtkSmartPointer imageData = vtkSmartPointer::New(); + imageData->SetDimensions(MMSP::xlength(GRID, 0), MMSP::xlength(GRID, 1), MMSP::xlength(GRID, 2)); + #if VTK_MAJOR_VERSION <= 5 + imageData->SetNumberOfScalarComponents(1); + imageData->SetScalarTypeToDouble(); + #else + imageData->AllocateScalars(VTK_DOUBLE, 1); + #endif + if (dim==1) { MMSP::vector x(1,0); for (x[0]=MMSP::x0(GRID); x[0]& s = GRID(x); + double* pixel = static_cast(imageData->GetScalarPointer(x[0] - MMSP::x0(GRID), 0, 0)); if (mode==2) { // --max // Export index of field with greatest magnitude int max = 0; for (int h = 1; h < s.length(); h++) if (s.value(h) > s.value(max)) max = h; - fstr << s.index(max) << " "; + pixel[0] = s.index(max); } else if (mode==3) { // --field - fstr << s[field] << " "; + pixel[0] = s[field]; } else { // --mag is redundant for sparse double sum = 0.0; for (int h = 0; h < s.length(); h++) sum += s.value(h)*s.value(h); - fstr << std::sqrt(sum) << " "; + pixel[0] = std::sqrt(sum); } } } else if (dim==2) { @@ -156,20 +248,21 @@ template void print_sparses(std::ofstream& fstr, const MMSP for (x[1]=MMSP::y0(GRID); x[1]& s = GRID(x); + double* pixel = static_cast(imageData->GetScalarPointer(x[0] - MMSP::x0(GRID), x[1] - MMSP::y0(GRID), 0)); if (mode==2) { // --max // Export index of field with greatest magnitude int max = 0; for (int h = 1; h < s.length(); h++) if (s.value(h) > s.value(max)) max = h; - fstr << s.index(max) << " "; + pixel[0] = s.index(max); } else if (mode==3) { // --field - fstr << s[field] << " "; + pixel[0] = s[field]; } else { // --mag is redundant for sparse double sum = 0.0; for (int h = 0; h < s.length(); h++) sum += s.value(h)*s.value(h); - fstr << std::sqrt(sum) << " "; + pixel[0] = std::sqrt(sum); } } } @@ -179,25 +272,36 @@ template void print_sparses(std::ofstream& fstr, const MMSP for (x[1]=MMSP::y0(GRID); x[1]& s = GRID(x); + double* pixel = static_cast(imageData->GetScalarPointer(x[0] - MMSP::x0(GRID), x[1] - MMSP::y0(GRID), x[2] - MMSP::z0(GRID))); if (mode==2) { // --max // Export index of field with greatest magnitude int max = 0; for (int h = 1; h < s.length(); h++) if (s.value(h) > s.value(max)) max = h; - fstr << s.index(max) << " "; + pixel[0] = s.index(max); } else if (mode==3) { // --field - fstr << s[field] << " "; + pixel[0] = s[field]; } else { // --mag is redundant for sparse double sum = 0.0; for (int h = 0; h < s.length(); h++) sum += s.value(h)*s.value(h); - fstr << std::sqrt(sum) << " "; + pixel[0] = std::sqrt(sum); } } } } } + + vtkSmartPointer writer = vtkSmartPointer::New(); + writer->SetFileName(filename.c_str()); + // writer->SetCompressorType(ZLIB); + #if VTK_MAJOR_VERSION <= 5 + writer->SetInputConnection(imageData->GetProducerPort()); + #else + writer->SetInputData(imageData); + #endif + writer->Write(); } int main(int argc, char* argv[]) @@ -248,14 +352,6 @@ int main(int argc, char* argv[]) else filename << argv[fileindex+1]; - // file open error check - std::ofstream output(filename.str().c_str()); - if (!output) { - std::cerr << "File output error: could not open "; - std::cerr << filename.str() << "." << std::endl; - exit(-1); - } - // read data type std::string type; getline(input, type, '\n'); @@ -280,17 +376,16 @@ int main(int argc, char* argv[]) bool double_type = (type.find("double") != std::string::npos); bool long_double_type = (type.find("long double") != std::string::npos); - bool scalar_type = (type.find("scalar") != std::string::npos); bool vector_type = (type.find("vector") != std::string::npos); bool sparse_type = (type.find("sparse") != std::string::npos); if (not bool_type and - not char_type and not unsigned_char_type and - not int_type and not unsigned_int_type and - not long_type and not unsigned_long_type and - not short_type and not unsigned_short_type and - not float_type and - not double_type and not long_double_type) { + not char_type and not unsigned_char_type and + not int_type and not unsigned_int_type and + not long_type and not unsigned_long_type and + not short_type and not unsigned_short_type and + not float_type and + not double_type and not long_double_type) { std::cerr << "File input error: unknown grid data type." << std::endl; exit(-1); } @@ -303,726 +398,413 @@ int main(int argc, char* argv[]) exit(-1); } - // read number of fields - int fields; - input >> fields; - - // read grid sizes - int x0[3] = {0, 0, 0}; - int x1[3] = {0, 0, 0}; - for (int i = 0; i < dim; i++) - input >> x0[i] >> x1[i]; - - // read cell spacing - float dx[3] = {1.0, 1.0, 1.0}; - for (int i = 0; i < dim; i++) - input >> dx[i]; - - // ignore trailing endlines - input.ignore(10, '\n'); - - - // determine byte order: 01 AND 01 = 01; 01 AND 10 = 00. - std::string byte_order; - if (0x01 & static_cast(1)) byte_order = "LittleEndian"; - else byte_order = "BigEndian"; - - // output header markup - output << "\n"; - output << "\n"; - - if (dim == 1) { - output << " \n"; - } else if (dim == 2) { - output << " \n"; - } else if (dim == 3) { - output << " \n"; - } else { - std::cerr<<"Error: "<(&blocks), sizeof(blocks)); - - for (int i = 0; i < blocks; i++) { - // read block limits - int lmin[3] = {0, 0, 0}; - int lmax[3] = {0, 0, 0}; - for (int j = 0; j < dim; j++) { - input.read(reinterpret_cast(&lmin[j]), sizeof(lmin[j])); - input.read(reinterpret_cast(&lmax[j]), sizeof(lmax[j])); - } - int blo[3]; - int bhi[3]; - // read boundary conditions - for (int j = 0; j < dim; j++) { - input.read(reinterpret_cast(&blo[j]), sizeof(blo[j])); - input.read(reinterpret_cast(&bhi[j]), sizeof(bhi[j])); - } - - // write header markup - if (dim == 1) - output << " \n"; - if (dim == 2) - output << " \n"; - if (dim == 3) - output << " \n"; - - // write cell data markup - if (scalar_type || flatten>0) { - output << " \n"; - output << " \n"; - output << " \n"; - output << " \n"; - output << " \n"; - else if (flatten==2) // max - output << " type=\"Int32\" format=\"ascii\">\n"; - else if (bool_type) - output << " type=\"UInt8\" format=\"ascii\">\n"; - else if (char_type) - output << " type=\"Int8\" format=\"ascii\">\n"; - else if (unsigned_char_type) - output << " type=\"UInt8\" format=\"ascii\">\n"; - else if (int_type) - output << " type=\"Int32\" format=\"ascii\">\n"; - else if (unsigned_int_type) - output << " type=\"UInt32\" format=\"ascii\">\n"; - else if (long_type) - output << " type=\"Int32\" format=\"ascii\">\n"; - else if (unsigned_long_type) - output << " type=\"UInt32\" format=\"ascii\">\n"; - else if (short_type) - output << " type=\"Int16\" format=\"ascii\">\n"; - else if (unsigned_short_type) - output << " type=\"UInt16\" format=\"ascii\">\n"; - else if (float_type) - output << " type=\"Float32\" format=\"ascii\">\n"; - else if (double_type) - output << " type=\"Float64\" format=\"ascii\">\n"; - else if (long_double_type) - output << " type=\"Float128\" format=\"ascii\">\n"; - - - // read grid data - unsigned long size, rawSize; - input.read(reinterpret_cast(&rawSize), sizeof(rawSize)); // read raw size - input.read(reinterpret_cast(&size), sizeof(size)); // read compressed size - char* compressed_buffer = new char[size]; - input.read(compressed_buffer, size); - char* buffer = NULL; - if (size != rawSize) { - // Decompress data - buffer = new char[rawSize]; - int status; - status = uncompress(reinterpret_cast(buffer), &rawSize, reinterpret_cast(compressed_buffer), size); - switch(status) { - case Z_OK: - break; - case Z_MEM_ERROR: - std::cerr << "Uncompress: out of memory." << std::endl; - exit(1); - break; - case Z_BUF_ERROR: - std::cerr << "Uncompress: output buffer wasn't large enough." << std::endl; - exit(1); - break; - } - delete [] compressed_buffer; - compressed_buffer = NULL; - } else { - buffer = compressed_buffer; - compressed_buffer = NULL; - } - - // write grid data - if (not vector_type and not sparse_type) { // must be scalar or built-in - if (bool_type) { - if (dim == 1) { - MMSP::grid<1, MMSP::scalar > GRID(fields, lmin, lmax); - GRID.from_buffer(buffer); - print_scalars(output, GRID, flatten); - } else if (dim == 2) { - MMSP::grid<2, MMSP::scalar > GRID(fields, lmin, lmax); - GRID.from_buffer(buffer); - print_scalars(output, GRID, flatten); - } else if (dim == 3) { - MMSP::grid<3, MMSP::scalar > GRID(fields, lmin, lmax); - GRID.from_buffer(buffer); - print_scalars(output, GRID, flatten); - } - } - else if (unsigned_char_type) { - if (dim == 1) { - MMSP::grid<1, MMSP::scalar > GRID(fields, lmin, lmax); - GRID.from_buffer(buffer); - print_scalars(output, GRID, flatten); - } else if (dim == 2) { - MMSP::grid<2, MMSP::scalar > GRID(fields, lmin, lmax); - GRID.from_buffer(buffer); - print_scalars(output, GRID, flatten); - } else if (dim == 3) { - MMSP::grid<3, MMSP::scalar > GRID(fields, lmin, lmax); - GRID.from_buffer(buffer); - print_scalars(output, GRID, flatten); - } - } - else if (char_type) { - if (dim == 1) { - MMSP::grid<1, MMSP::scalar > GRID(fields, lmin, lmax); - GRID.from_buffer(buffer); - print_scalars(output, GRID, flatten); - } else if (dim == 2) { - MMSP::grid<2, MMSP::scalar > GRID(fields, lmin, lmax); - GRID.from_buffer(buffer); - print_scalars(output, GRID, flatten); - } else if (dim == 3) { - MMSP::grid<3, MMSP::scalar > GRID(fields, lmin, lmax); - GRID.from_buffer(buffer); - print_scalars(output, GRID, flatten); - } - } - else if (unsigned_int_type) { - if (dim == 1) { - MMSP::grid<1, MMSP::scalar > GRID(fields, lmin, lmax); - GRID.from_buffer(buffer); - print_scalars(output, GRID, flatten); - } else if (dim == 2) { - MMSP::grid<2, MMSP::scalar > GRID(fields, lmin, lmax); - GRID.from_buffer(buffer); - print_scalars(output, GRID, flatten); - } else if (dim == 3) { - MMSP::grid<3, MMSP::scalar > GRID(fields, lmin, lmax); - GRID.from_buffer(buffer); - print_scalars(output, GRID, flatten); - } - } - else if (int_type) { - if (dim == 1) { - MMSP::grid<1, MMSP::scalar > GRID(fields, lmin, lmax); - GRID.from_buffer(buffer); - print_scalars(output, GRID, flatten); - } else if (dim == 2) { - MMSP::grid<2, MMSP::scalar > GRID(fields, lmin, lmax); - GRID.from_buffer(buffer); - print_scalars(output, GRID, flatten); - } else if (dim == 3) { - MMSP::grid<3, MMSP::scalar > GRID(fields, lmin, lmax); - GRID.from_buffer(buffer); - print_scalars(output, GRID, flatten); - } - } - else if (unsigned_long_type) { - if (dim == 1) { - MMSP::grid<1, MMSP::scalar > GRID(fields, lmin, lmax); - GRID.from_buffer(buffer); - print_scalars(output, GRID, flatten); - } else if (dim == 2) { - MMSP::grid<2, MMSP::scalar > GRID(fields, lmin, lmax); - GRID.from_buffer(buffer); - print_scalars(output, GRID, flatten); - } else if (dim == 3) { - MMSP::grid<3, MMSP::scalar > GRID(fields, lmin, lmax); - GRID.from_buffer(buffer); - print_scalars(output, GRID, flatten); - } - } - else if (long_type) { - if (dim == 1) { - MMSP::grid<1, MMSP::scalar > GRID(fields, lmin, lmax); - GRID.from_buffer(buffer); - print_scalars(output, GRID, flatten); - } else if (dim == 2) { - MMSP::grid<2, MMSP::scalar > GRID(fields, lmin, lmax); - GRID.from_buffer(buffer); - print_scalars(output, GRID, flatten); - } else if (dim == 3) { - MMSP::grid<3, MMSP::scalar > GRID(fields, lmin, lmax); - GRID.from_buffer(buffer); - print_scalars(output, GRID, flatten); - } - } - else if (unsigned_short_type) { - if (dim == 1) { - MMSP::grid<1, MMSP::scalar > GRID(fields, lmin, lmax); - GRID.from_buffer(buffer); - print_scalars(output, GRID, flatten); - } else if (dim == 2) { - MMSP::grid<2, MMSP::scalar > GRID(fields, lmin, lmax); - GRID.from_buffer(buffer); - print_scalars(output, GRID, flatten); - } else if (dim == 3) { - MMSP::grid<3, MMSP::scalar > GRID(fields, lmin, lmax); - GRID.from_buffer(buffer); - print_scalars(output, GRID, flatten); - } - } - else if (short_type) { - if (dim == 1) { - MMSP::grid<1, MMSP::scalar > GRID(fields, lmin, lmax); - GRID.from_buffer(buffer); - print_scalars(output, GRID, flatten); - } else if (dim == 2) { - MMSP::grid<2, MMSP::scalar > GRID(fields, lmin, lmax); - GRID.from_buffer(buffer); - print_scalars(output, GRID, flatten); - } else if (dim == 3) { - MMSP::grid<3, MMSP::scalar > GRID(fields, lmin, lmax); - GRID.from_buffer(buffer); - print_scalars(output, GRID, flatten); - } - } - else if (float_type) { - if (dim == 1) { - MMSP::grid<1, MMSP::scalar > GRID(fields, lmin, lmax); - GRID.from_buffer(buffer); - print_scalars(output, GRID, flatten); - } else if (dim == 2) { - MMSP::grid<2, MMSP::scalar > GRID(fields, lmin, lmax); - GRID.from_buffer(buffer); - print_scalars(output, GRID, flatten); - } else if (dim == 3) { - MMSP::grid<3, MMSP::scalar > GRID(fields, lmin, lmax); - GRID.from_buffer(buffer); - print_scalars(output, GRID, flatten); - } - } - else if (long_double_type) { - if (dim == 1) { - MMSP::grid<1, MMSP::scalar > GRID(fields, lmin, lmax); - GRID.from_buffer(buffer); - print_scalars(output, GRID, flatten); - } else if (dim == 2) { - MMSP::grid<2, MMSP::scalar > GRID(fields, lmin, lmax); - GRID.from_buffer(buffer); - print_scalars(output, GRID, flatten); - } else if (dim == 3) { - MMSP::grid<3, MMSP::scalar > GRID(fields, lmin, lmax); - GRID.from_buffer(buffer); - print_scalars(output, GRID, flatten); - } - } - else if (double_type) { - if (dim == 1) { - MMSP::grid<1, MMSP::scalar > GRID(fields, lmin, lmax); - GRID.from_buffer(buffer); - print_scalars(output, GRID, flatten); - } else if (dim == 2) { - MMSP::grid<2, MMSP::scalar > GRID(fields, lmin, lmax); - GRID.from_buffer(buffer); - print_scalars(output, GRID, flatten); - } else if (dim == 3) { - MMSP::grid<3, MMSP::scalar > GRID(fields, lmin, lmax); - GRID.from_buffer(buffer); - print_scalars(output, GRID, flatten); - } + // write grid data + if (not vector_type and not sparse_type) { // must be scalar or built-in + if (bool_type) { + if (dim == 1) { + MMSP::grid<1, MMSP::scalar > GRID(argv[fileindex]); + print_scalars(filename.str(), GRID, flatten); + } else if (dim == 2) { + MMSP::grid<2, MMSP::scalar > GRID(argv[fileindex]); + print_scalars(filename.str(), GRID, flatten); + } else if (dim == 3) { + MMSP::grid<3, MMSP::scalar > GRID(argv[fileindex]); + print_scalars(filename.str(), GRID, flatten); + } + } else if (unsigned_char_type) { + if (dim == 1) { + MMSP::grid<1, MMSP::scalar > GRID(argv[fileindex]); + print_scalars(filename.str(), GRID, flatten); + } else if (dim == 2) { + MMSP::grid<2, MMSP::scalar > GRID(argv[fileindex]); + print_scalars(filename.str(), GRID, flatten); + } else if (dim == 3) { + MMSP::grid<3, MMSP::scalar > GRID(argv[fileindex]); + print_scalars(filename.str(), GRID, flatten); + } + } else if (char_type) { + if (dim == 1) { + MMSP::grid<1, MMSP::scalar > GRID(argv[fileindex]); + print_scalars(filename.str(), GRID, flatten); + } else if (dim == 2) { + MMSP::grid<2, MMSP::scalar > GRID(argv[fileindex]); + print_scalars(filename.str(), GRID, flatten); + } else if (dim == 3) { + MMSP::grid<3, MMSP::scalar > GRID(argv[fileindex]); + print_scalars(filename.str(), GRID, flatten); + } + } else if (unsigned_int_type) { + if (dim == 1) { + MMSP::grid<1, MMSP::scalar > GRID(argv[fileindex]); + print_scalars(filename.str(), GRID, flatten); + } else if (dim == 2) { + MMSP::grid<2, MMSP::scalar > GRID(argv[fileindex]); + print_scalars(filename.str(), GRID, flatten); + } else if (dim == 3) { + MMSP::grid<3, MMSP::scalar > GRID(argv[fileindex]); + print_scalars(filename.str(), GRID, flatten); + } + } else if (int_type) { + if (dim == 1) { + MMSP::grid<1, MMSP::scalar > GRID(argv[fileindex]); + print_scalars(filename.str(), GRID, flatten); + } else if (dim == 2) { + MMSP::grid<2, MMSP::scalar > GRID(argv[fileindex]); + print_scalars(filename.str(), GRID, flatten); + } else if (dim == 3) { + MMSP::grid<3, MMSP::scalar > GRID(argv[fileindex]); + print_scalars(filename.str(), GRID, flatten); + } + } else if (unsigned_long_type) { + if (dim == 1) { + MMSP::grid<1, MMSP::scalar > GRID(argv[fileindex]); + print_scalars(filename.str(), GRID, flatten); + } else if (dim == 2) { + MMSP::grid<2, MMSP::scalar > GRID(argv[fileindex]); + print_scalars(filename.str(), GRID, flatten); + } else if (dim == 3) { + MMSP::grid<3, MMSP::scalar > GRID(argv[fileindex]); + print_scalars(filename.str(), GRID, flatten); + } + } else if (long_type) { + if (dim == 1) { + MMSP::grid<1, MMSP::scalar > GRID(argv[fileindex]); + print_scalars(filename.str(), GRID, flatten); + } else if (dim == 2) { + MMSP::grid<2, MMSP::scalar > GRID(argv[fileindex]); + print_scalars(filename.str(), GRID, flatten); + } else if (dim == 3) { + MMSP::grid<3, MMSP::scalar > GRID(argv[fileindex]); + print_scalars(filename.str(), GRID, flatten); + } + } else if (unsigned_short_type) { + if (dim == 1) { + MMSP::grid<1, MMSP::scalar > GRID(argv[fileindex]); + print_scalars(filename.str(), GRID, flatten); + } else if (dim == 2) { + MMSP::grid<2, MMSP::scalar > GRID(argv[fileindex]); + print_scalars(filename.str(), GRID, flatten); + } else if (dim == 3) { + MMSP::grid<3, MMSP::scalar > GRID(argv[fileindex]); + print_scalars(filename.str(), GRID, flatten); + } + } else if (short_type) { + if (dim == 1) { + MMSP::grid<1, MMSP::scalar > GRID(argv[fileindex]); + print_scalars(filename.str(), GRID, flatten); + } else if (dim == 2) { + MMSP::grid<2, MMSP::scalar > GRID(argv[fileindex]); + print_scalars(filename.str(), GRID, flatten); + } else if (dim == 3) { + MMSP::grid<3, MMSP::scalar > GRID(argv[fileindex]); + print_scalars(filename.str(), GRID, flatten); + } + } else if (float_type) { + if (dim == 1) { + MMSP::grid<1, MMSP::scalar > GRID(argv[fileindex]); + print_scalars(filename.str(), GRID, flatten); + } else if (dim == 2) { + MMSP::grid<2, MMSP::scalar > GRID(argv[fileindex]); + print_scalars(filename.str(), GRID, flatten); + } else if (dim == 3) { + MMSP::grid<3, MMSP::scalar > GRID(argv[fileindex]); + print_scalars(filename.str(), GRID, flatten); + } + } else if (long_double_type) { + if (dim == 1) { + MMSP::grid<1, MMSP::scalar > GRID(argv[fileindex]); + print_scalars(filename.str(), GRID, flatten); + } else if (dim == 2) { + MMSP::grid<2, MMSP::scalar > GRID(argv[fileindex]); + print_scalars(filename.str(), GRID, flatten); + } else if (dim == 3) { + MMSP::grid<3, MMSP::scalar > GRID(argv[fileindex]); + print_scalars(filename.str(), GRID, flatten); + } + } else if (double_type) { + if (dim == 1) { + MMSP::grid<1, MMSP::scalar > GRID(argv[fileindex]); + print_scalars(filename.str(), GRID, flatten); + } else if (dim == 2) { + MMSP::grid<2, MMSP::scalar > GRID(argv[fileindex]); + print_scalars(filename.str(), GRID, flatten); + } else if (dim == 3) { + MMSP::grid<3, MMSP::scalar > GRID(argv[fileindex]); + print_scalars(filename.str(), GRID, flatten); } } + } - else if (vector_type) { - if (bool_type) { - if (dim == 1) { - MMSP::grid<1, MMSP::vector > GRID(fields, lmin, lmax); - GRID.from_buffer(buffer); - print_vectors(output, GRID, flatten, field); - } else if (dim == 2) { - MMSP::grid<2, MMSP::vector > GRID(fields, lmin, lmax); - GRID.from_buffer(buffer); - print_vectors(output, GRID, flatten, field); - } else if (dim == 3) { - MMSP::grid<3, MMSP::vector > GRID(fields, lmin, lmax); - GRID.from_buffer(buffer); - print_vectors(output, GRID, flatten, field); - } - } - else if (unsigned_char_type) { - if (dim == 1) { - MMSP::grid<1, MMSP::vector > GRID(fields, lmin, lmax); - GRID.from_buffer(buffer); - print_vectors(output, GRID, flatten, field); - } else if (dim == 2) { - MMSP::grid<2, MMSP::vector > GRID(fields, lmin, lmax); - GRID.from_buffer(buffer); - print_vectors(output, GRID, flatten, field); - } else if (dim == 3) { - MMSP::grid<3, MMSP::vector > GRID(fields, lmin, lmax); - GRID.from_buffer(buffer); - print_vectors(output, GRID, flatten, field); - } - } - else if (char_type) { - if (dim == 1) { - MMSP::grid<1, MMSP::vector > GRID(fields, lmin, lmax); - GRID.from_buffer(buffer); - print_vectors(output, GRID, flatten, field); - } else if (dim == 2) { - MMSP::grid<2, MMSP::vector > GRID(fields, lmin, lmax); - GRID.from_buffer(buffer); - print_vectors(output, GRID, flatten, field); - } else if (dim == 3) { - MMSP::grid<3, MMSP::vector > GRID(fields, lmin, lmax); - GRID.from_buffer(buffer); - print_vectors(output, GRID, flatten, field); - } - } - else if (unsigned_int_type) { - if (dim == 1) { - MMSP::grid<1, MMSP::vector > GRID(fields, lmin, lmax); - GRID.from_buffer(buffer); - print_vectors(output, GRID, flatten, field); - } else if (dim == 2) { - MMSP::grid<2, MMSP::vector > GRID(fields, lmin, lmax); - GRID.from_buffer(buffer); - print_vectors(output, GRID, flatten, field); - } else if (dim == 3) { - MMSP::grid<3, MMSP::vector > GRID(fields, lmin, lmax); - GRID.from_buffer(buffer); - print_vectors(output, GRID, flatten, field); - } - } - else if (int_type) { - if (dim == 1) { - MMSP::grid<1, MMSP::vector > GRID(fields, lmin, lmax); - GRID.from_buffer(buffer); - print_vectors(output, GRID, flatten, field); - } else if (dim == 2) { - MMSP::grid<2, MMSP::vector > GRID(fields, lmin, lmax); - GRID.from_buffer(buffer); - print_vectors(output, GRID, flatten, field); - } else if (dim == 3) { - MMSP::grid<3, MMSP::vector > GRID(fields, lmin, lmax); - GRID.from_buffer(buffer); - print_vectors(output, GRID, flatten, field); - } - } - else if (unsigned_long_type) { - if (dim == 1) { - MMSP::grid<1, MMSP::vector > GRID(fields, lmin, lmax); - GRID.from_buffer(buffer); - print_vectors(output, GRID, flatten, field); - } else if (dim == 2) { - MMSP::grid<2, MMSP::vector > GRID(fields, lmin, lmax); - GRID.from_buffer(buffer); - print_vectors(output, GRID, flatten, field); - } else if (dim == 3) { - MMSP::grid<3, MMSP::vector > GRID(fields, lmin, lmax); - GRID.from_buffer(buffer); - print_vectors(output, GRID, flatten, field); - } - } - else if (long_type) { - if (dim == 1) { - MMSP::grid<1, MMSP::vector > GRID(fields, lmin, lmax); - GRID.from_buffer(buffer); - print_vectors(output, GRID, flatten, field); - } else if (dim == 2) { - MMSP::grid<2, MMSP::vector > GRID(fields, lmin, lmax); - GRID.from_buffer(buffer); - print_vectors(output, GRID, flatten, field); - } else if (dim == 3) { - MMSP::grid<3, MMSP::vector > GRID(fields, lmin, lmax); - GRID.from_buffer(buffer); - print_vectors(output, GRID, flatten, field); - } - } - else if (unsigned_short_type) { - if (dim == 1) { - MMSP::grid<1, MMSP::vector > GRID(fields, lmin, lmax); - GRID.from_buffer(buffer); - print_vectors(output, GRID, flatten, field); - } else if (dim == 2) { - MMSP::grid<2, MMSP::vector > GRID(fields, lmin, lmax); - GRID.from_buffer(buffer); - print_vectors(output, GRID, flatten, field); - } else if (dim == 3) { - MMSP::grid<3, MMSP::vector > GRID(fields, lmin, lmax); - GRID.from_buffer(buffer); - print_vectors(output, GRID, flatten, field); - } - } - else if (short_type) { - if (dim == 1) { - MMSP::grid<1, MMSP::vector > GRID(fields, lmin, lmax); - GRID.from_buffer(buffer); - print_vectors(output, GRID, flatten, field); - } else if (dim == 2) { - MMSP::grid<2, MMSP::vector > GRID(fields, lmin, lmax); - GRID.from_buffer(buffer); - print_vectors(output, GRID, flatten, field); - } else if (dim == 3) { - MMSP::grid<3, MMSP::vector > GRID(fields, lmin, lmax); - GRID.from_buffer(buffer); - print_vectors(output, GRID, flatten, field); - } - } - else if (float_type) { - if (dim == 1) { - MMSP::grid<1, MMSP::vector > GRID(fields, lmin, lmax); - GRID.from_buffer(buffer); - print_vectors(output, GRID, flatten, field); - } else if (dim == 2) { - MMSP::grid<2, MMSP::vector > GRID(fields, lmin, lmax); - GRID.from_buffer(buffer); - print_vectors(output, GRID, flatten, field); - } else if (dim == 3) { - MMSP::grid<3, MMSP::vector > GRID(fields, lmin, lmax); - GRID.from_buffer(buffer); - print_vectors(output, GRID, flatten, field); - } - } - else if (long_double_type) { - if (dim == 1) { - MMSP::grid<1, MMSP::vector > GRID(fields, lmin, lmax); - GRID.from_buffer(buffer); - print_vectors(output, GRID, flatten, field); - } else if (dim == 2) { - MMSP::grid<2, MMSP::vector > GRID(fields, lmin, lmax); - GRID.from_buffer(buffer); - print_vectors(output, GRID, flatten, field); - } else if (dim == 3) { - MMSP::grid<3, MMSP::vector > GRID(fields, lmin, lmax); - GRID.from_buffer(buffer); - print_vectors(output, GRID, flatten, field); - } - } - else if (double_type) { - if (dim == 1) { - MMSP::grid<1, MMSP::vector > GRID(fields, lmin, lmax); - GRID.from_buffer(buffer); - print_vectors(output, GRID, flatten, field); - } else if (dim == 2) { - MMSP::grid<2, MMSP::vector > GRID(fields, lmin, lmax); - GRID.from_buffer(buffer); - print_vectors(output, GRID, flatten, field); - } else if (dim == 3) { - MMSP::grid<3, MMSP::vector > GRID(fields, lmin, lmax); - GRID.from_buffer(buffer); - print_vectors(output, GRID, flatten, field); - } + else if (vector_type) { + if (bool_type) { + if (dim == 1) { + MMSP::grid<1, MMSP::vector > GRID(argv[fileindex]); + print_vectors(filename.str(), GRID, flatten, field); + } else if (dim == 2) { + MMSP::grid<2, MMSP::vector > GRID(argv[fileindex]); + print_vectors(filename.str(), GRID, flatten, field); + } else if (dim == 3) { + MMSP::grid<3, MMSP::vector > GRID(argv[fileindex]); + print_vectors(filename.str(), GRID, flatten, field); + } + } else if (unsigned_char_type) { + if (dim == 1) { + MMSP::grid<1, MMSP::vector > GRID(argv[fileindex]); + print_vectors(filename.str(), GRID, flatten, field); + } else if (dim == 2) { + MMSP::grid<2, MMSP::vector > GRID(argv[fileindex]); + print_vectors(filename.str(), GRID, flatten, field); + } else if (dim == 3) { + MMSP::grid<3, MMSP::vector > GRID(argv[fileindex]); + print_vectors(filename.str(), GRID, flatten, field); + } + } else if (char_type) { + if (dim == 1) { + MMSP::grid<1, MMSP::vector > GRID(argv[fileindex]); + print_vectors(filename.str(), GRID, flatten, field); + } else if (dim == 2) { + MMSP::grid<2, MMSP::vector > GRID(argv[fileindex]); + print_vectors(filename.str(), GRID, flatten, field); + } else if (dim == 3) { + MMSP::grid<3, MMSP::vector > GRID(argv[fileindex]); + print_vectors(filename.str(), GRID, flatten, field); + } + } else if (unsigned_int_type) { + if (dim == 1) { + MMSP::grid<1, MMSP::vector > GRID(argv[fileindex]); + print_vectors(filename.str(), GRID, flatten, field); + } else if (dim == 2) { + MMSP::grid<2, MMSP::vector > GRID(argv[fileindex]); + print_vectors(filename.str(), GRID, flatten, field); + } else if (dim == 3) { + MMSP::grid<3, MMSP::vector > GRID(argv[fileindex]); + print_vectors(filename.str(), GRID, flatten, field); + } + } else if (int_type) { + if (dim == 1) { + MMSP::grid<1, MMSP::vector > GRID(argv[fileindex]); + print_vectors(filename.str(), GRID, flatten, field); + } else if (dim == 2) { + MMSP::grid<2, MMSP::vector > GRID(argv[fileindex]); + print_vectors(filename.str(), GRID, flatten, field); + } else if (dim == 3) { + MMSP::grid<3, MMSP::vector > GRID(argv[fileindex]); + print_vectors(filename.str(), GRID, flatten, field); + } + } else if (unsigned_long_type) { + if (dim == 1) { + MMSP::grid<1, MMSP::vector > GRID(argv[fileindex]); + print_vectors(filename.str(), GRID, flatten, field); + } else if (dim == 2) { + MMSP::grid<2, MMSP::vector > GRID(argv[fileindex]); + print_vectors(filename.str(), GRID, flatten, field); + } else if (dim == 3) { + MMSP::grid<3, MMSP::vector > GRID(argv[fileindex]); + print_vectors(filename.str(), GRID, flatten, field); + } + } else if (long_type) { + if (dim == 1) { + MMSP::grid<1, MMSP::vector > GRID(argv[fileindex]); + print_vectors(filename.str(), GRID, flatten, field); + } else if (dim == 2) { + MMSP::grid<2, MMSP::vector > GRID(argv[fileindex]); + print_vectors(filename.str(), GRID, flatten, field); + } else if (dim == 3) { + MMSP::grid<3, MMSP::vector > GRID(argv[fileindex]); + print_vectors(filename.str(), GRID, flatten, field); + } + } else if (unsigned_short_type) { + if (dim == 1) { + MMSP::grid<1, MMSP::vector > GRID(argv[fileindex]); + print_vectors(filename.str(), GRID, flatten, field); + } else if (dim == 2) { + MMSP::grid<2, MMSP::vector > GRID(argv[fileindex]); + print_vectors(filename.str(), GRID, flatten, field); + } else if (dim == 3) { + MMSP::grid<3, MMSP::vector > GRID(argv[fileindex]); + print_vectors(filename.str(), GRID, flatten, field); + } + } else if (short_type) { + if (dim == 1) { + MMSP::grid<1, MMSP::vector > GRID(argv[fileindex]); + print_vectors(filename.str(), GRID, flatten, field); + } else if (dim == 2) { + MMSP::grid<2, MMSP::vector > GRID(argv[fileindex]); + print_vectors(filename.str(), GRID, flatten, field); + } else if (dim == 3) { + MMSP::grid<3, MMSP::vector > GRID(argv[fileindex]); + print_vectors(filename.str(), GRID, flatten, field); + } + } else if (float_type) { + if (dim == 1) { + MMSP::grid<1, MMSP::vector > GRID(argv[fileindex]); + print_vectors(filename.str(), GRID, flatten, field); + } else if (dim == 2) { + MMSP::grid<2, MMSP::vector > GRID(argv[fileindex]); + print_vectors(filename.str(), GRID, flatten, field); + } else if (dim == 3) { + MMSP::grid<3, MMSP::vector > GRID(argv[fileindex]); + print_vectors(filename.str(), GRID, flatten, field); + } + } else if (long_double_type) { + if (dim == 1) { + MMSP::grid<1, MMSP::vector > GRID(argv[fileindex]); + print_vectors(filename.str(), GRID, flatten, field); + } else if (dim == 2) { + MMSP::grid<2, MMSP::vector > GRID(argv[fileindex]); + print_vectors(filename.str(), GRID, flatten, field); + } else if (dim == 3) { + MMSP::grid<3, MMSP::vector > GRID(argv[fileindex]); + print_vectors(filename.str(), GRID, flatten, field); + } + } else if (double_type) { + if (dim == 1) { + MMSP::grid<1, MMSP::vector > GRID(argv[fileindex]); + print_vectors(filename.str(), GRID, flatten, field); + } else if (dim == 2) { + MMSP::grid<2, MMSP::vector > GRID(argv[fileindex]); + print_vectors(filename.str(), GRID, flatten, field); + } else if (dim == 3) { + MMSP::grid<3, MMSP::vector > GRID(argv[fileindex]); + print_vectors(filename.str(), GRID, flatten, field); } } + } - else if (sparse_type) { - if (bool_type) { - if (dim == 1) { - MMSP::grid<1, MMSP::sparse > GRID(fields, lmin, lmax); - GRID.from_buffer(buffer); - print_sparses(output, GRID, flatten, field); - } else if (dim == 2) { - MMSP::grid<2, MMSP::sparse > GRID(fields, lmin, lmax); - GRID.from_buffer(buffer); - print_sparses(output, GRID, flatten, field); - } else if (dim == 3) { - MMSP::grid<3, MMSP::sparse > GRID(fields, lmin, lmax); - GRID.from_buffer(buffer); - print_sparses(output, GRID, flatten, field); - } - } - else if (unsigned_char_type) { - if (dim == 1) { - MMSP::grid<1, MMSP::sparse > GRID(fields, lmin, lmax); - GRID.from_buffer(buffer); - print_sparses(output, GRID, flatten, field); - } else if (dim == 2) { - MMSP::grid<2, MMSP::sparse > GRID(fields, lmin, lmax); - GRID.from_buffer(buffer); - print_sparses(output, GRID, flatten, field); - } else if (dim == 3) { - MMSP::grid<3, MMSP::sparse > GRID(fields, lmin, lmax); - GRID.from_buffer(buffer); - print_sparses(output, GRID, flatten, field); - } - } - else if (char_type) { - if (dim == 1) { - MMSP::grid<1, MMSP::sparse > GRID(fields, lmin, lmax); - GRID.from_buffer(buffer); - print_sparses(output, GRID, flatten, field); - } else if (dim == 2) { - MMSP::grid<2, MMSP::sparse > GRID(fields, lmin, lmax); - GRID.from_buffer(buffer); - print_sparses(output, GRID, flatten, field); - } else if (dim == 3) { - MMSP::grid<3, MMSP::sparse > GRID(fields, lmin, lmax); - GRID.from_buffer(buffer); - print_sparses(output, GRID, flatten, field); - } - } - else if (unsigned_int_type) { - if (dim == 1) { - MMSP::grid<1, MMSP::sparse > GRID(fields, lmin, lmax); - GRID.from_buffer(buffer); - print_sparses(output, GRID, flatten, field); - } else if (dim == 2) { - MMSP::grid<2, MMSP::sparse > GRID(fields, lmin, lmax); - GRID.from_buffer(buffer); - print_sparses(output, GRID, flatten, field); - } else if (dim == 3) { - MMSP::grid<3, MMSP::sparse > GRID(fields, lmin, lmax); - GRID.from_buffer(buffer); - print_sparses(output, GRID, flatten, field); - } - } - else if (int_type) { - if (dim == 1) { - MMSP::grid<1, MMSP::sparse > GRID(fields, lmin, lmax); - GRID.from_buffer(buffer); - print_sparses(output, GRID, flatten, field); - } else if (dim == 2) { - MMSP::grid<2, MMSP::sparse > GRID(fields, lmin, lmax); - GRID.from_buffer(buffer); - print_sparses(output, GRID, flatten, field); - } else if (dim == 3) { - MMSP::grid<3, MMSP::sparse > GRID(fields, lmin, lmax); - GRID.from_buffer(buffer); - print_sparses(output, GRID, flatten, field); - } - } - else if (unsigned_long_type) { - if (dim == 1) { - MMSP::grid<1, MMSP::sparse > GRID(fields, lmin, lmax); - GRID.from_buffer(buffer); - print_sparses(output, GRID, flatten, field); - } else if (dim == 2) { - MMSP::grid<2, MMSP::sparse > GRID(fields, lmin, lmax); - GRID.from_buffer(buffer); - print_sparses(output, GRID, flatten, field); - } else if (dim == 3) { - MMSP::grid<3, MMSP::sparse > GRID(fields, lmin, lmax); - GRID.from_buffer(buffer); - print_sparses(output, GRID, flatten, field); - } - } - else if (long_type) { - if (dim == 1) { - MMSP::grid<1, MMSP::sparse > GRID(fields, lmin, lmax); - GRID.from_buffer(buffer); - print_sparses(output, GRID, flatten, field); - } else if (dim == 2) { - MMSP::grid<2, MMSP::sparse > GRID(fields, lmin, lmax); - GRID.from_buffer(buffer); - print_sparses(output, GRID, flatten, field); - } else if (dim == 3) { - MMSP::grid<3, MMSP::sparse > GRID(fields, lmin, lmax); - GRID.from_buffer(buffer); - print_sparses(output, GRID, flatten, field); - } - } - else if (unsigned_short_type) { - if (dim == 1) { - MMSP::grid<1, MMSP::sparse > GRID(fields, lmin, lmax); - GRID.from_buffer(buffer); - print_sparses(output, GRID, flatten, field); - } else if (dim == 2) { - MMSP::grid<2, MMSP::sparse > GRID(fields, lmin, lmax); - GRID.from_buffer(buffer); - print_sparses(output, GRID, flatten, field); - } else if (dim == 3) { - MMSP::grid<3, MMSP::sparse > GRID(fields, lmin, lmax); - GRID.from_buffer(buffer); - print_sparses(output, GRID, flatten, field); - } - } - else if (short_type) { - if (dim == 1) { - MMSP::grid<1, MMSP::sparse > GRID(fields, lmin, lmax); - GRID.from_buffer(buffer); - print_sparses(output, GRID, flatten, field); - } else if (dim == 2) { - MMSP::grid<2, MMSP::sparse > GRID(fields, lmin, lmax); - GRID.from_buffer(buffer); - print_sparses(output, GRID, flatten, field); - } else if (dim == 3) { - MMSP::grid<3, MMSP::sparse > GRID(fields, lmin, lmax); - GRID.from_buffer(buffer); - print_sparses(output, GRID, flatten, field); - } - } - else if (float_type) { - if (dim == 1) { - MMSP::grid<1, MMSP::sparse > GRID(fields, lmin, lmax); - GRID.from_buffer(buffer); - print_sparses(output, GRID, flatten, field); - } else if (dim == 2) { - MMSP::grid<2, MMSP::sparse > GRID(fields, lmin, lmax); - GRID.from_buffer(buffer); - print_sparses(output, GRID, flatten, field); - } else if (dim == 3) { - MMSP::grid<3, MMSP::sparse > GRID(fields, lmin, lmax); - GRID.from_buffer(buffer); - print_sparses(output, GRID, flatten, field); - } - } - else if (long_double_type) { - if (dim == 1) { - MMSP::grid<1, MMSP::sparse > GRID(fields, lmin, lmax); - GRID.from_buffer(buffer); - print_sparses(output, GRID, flatten, field); - } else if (dim == 2) { - MMSP::grid<2, MMSP::sparse > GRID(fields, lmin, lmax); - GRID.from_buffer(buffer); - print_sparses(output, GRID, flatten, field); - } else if (dim == 3) { - MMSP::grid<3, MMSP::sparse > GRID(fields, lmin, lmax); - GRID.from_buffer(buffer); - print_sparses(output, GRID, flatten, field); - } - } - else if (double_type) { - if (dim == 1) { - MMSP::grid<1, MMSP::sparse > GRID(fields, lmin, lmax); - GRID.from_buffer(buffer); - print_sparses(output, GRID, flatten, field); - } else if (dim == 2) { - MMSP::grid<2, MMSP::sparse > GRID(fields, lmin, lmax); - GRID.from_buffer(buffer); - print_sparses(output, GRID, flatten, field); - } else if (dim == 3) { - MMSP::grid<3, MMSP::sparse > GRID(fields, lmin, lmax); - GRID.from_buffer(buffer); - print_sparses(output, GRID, flatten, field); - } + else if (sparse_type) { + if (bool_type) { + if (dim == 1) { + MMSP::grid<1, MMSP::sparse > GRID(argv[fileindex]); + print_sparses(filename.str(), GRID, flatten, field); + } else if (dim == 2) { + MMSP::grid<2, MMSP::sparse > GRID(argv[fileindex]); + print_sparses(filename.str(), GRID, flatten, field); + } else if (dim == 3) { + MMSP::grid<3, MMSP::sparse > GRID(argv[fileindex]); + print_sparses(filename.str(), GRID, flatten, field); + } + } else if (unsigned_char_type) { + if (dim == 1) { + MMSP::grid<1, MMSP::sparse > GRID(argv[fileindex]); + print_sparses(filename.str(), GRID, flatten, field); + } else if (dim == 2) { + MMSP::grid<2, MMSP::sparse > GRID(argv[fileindex]); + print_sparses(filename.str(), GRID, flatten, field); + } else if (dim == 3) { + MMSP::grid<3, MMSP::sparse > GRID(argv[fileindex]); + print_sparses(filename.str(), GRID, flatten, field); + } + } else if (char_type) { + if (dim == 1) { + MMSP::grid<1, MMSP::sparse > GRID(argv[fileindex]); + print_sparses(filename.str(), GRID, flatten, field); + } else if (dim == 2) { + MMSP::grid<2, MMSP::sparse > GRID(argv[fileindex]); + print_sparses(filename.str(), GRID, flatten, field); + } else if (dim == 3) { + MMSP::grid<3, MMSP::sparse > GRID(argv[fileindex]); + print_sparses(filename.str(), GRID, flatten, field); + } + } else if (unsigned_int_type) { + if (dim == 1) { + MMSP::grid<1, MMSP::sparse > GRID(argv[fileindex]); + print_sparses(filename.str(), GRID, flatten, field); + } else if (dim == 2) { + MMSP::grid<2, MMSP::sparse > GRID(argv[fileindex]); + print_sparses(filename.str(), GRID, flatten, field); + } else if (dim == 3) { + MMSP::grid<3, MMSP::sparse > GRID(argv[fileindex]); + print_sparses(filename.str(), GRID, flatten, field); + } + } else if (int_type) { + if (dim == 1) { + MMSP::grid<1, MMSP::sparse > GRID(argv[fileindex]); + print_sparses(filename.str(), GRID, flatten, field); + } else if (dim == 2) { + MMSP::grid<2, MMSP::sparse > GRID(argv[fileindex]); + print_sparses(filename.str(), GRID, flatten, field); + } else if (dim == 3) { + MMSP::grid<3, MMSP::sparse > GRID(argv[fileindex]); + print_sparses(filename.str(), GRID, flatten, field); + } + } else if (unsigned_long_type) { + if (dim == 1) { + MMSP::grid<1, MMSP::sparse > GRID(argv[fileindex]); + print_sparses(filename.str(), GRID, flatten, field); + } else if (dim == 2) { + MMSP::grid<2, MMSP::sparse > GRID(argv[fileindex]); + print_sparses(filename.str(), GRID, flatten, field); + } else if (dim == 3) { + MMSP::grid<3, MMSP::sparse > GRID(argv[fileindex]); + print_sparses(filename.str(), GRID, flatten, field); + } + } else if (long_type) { + if (dim == 1) { + MMSP::grid<1, MMSP::sparse > GRID(argv[fileindex]); + print_sparses(filename.str(), GRID, flatten, field); + } else if (dim == 2) { + MMSP::grid<2, MMSP::sparse > GRID(argv[fileindex]); + print_sparses(filename.str(), GRID, flatten, field); + } else if (dim == 3) { + MMSP::grid<3, MMSP::sparse > GRID(argv[fileindex]); + print_sparses(filename.str(), GRID, flatten, field); + } + } else if (unsigned_short_type) { + if (dim == 1) { + MMSP::grid<1, MMSP::sparse > GRID(argv[fileindex]); + print_sparses(filename.str(), GRID, flatten, field); + } else if (dim == 2) { + MMSP::grid<2, MMSP::sparse > GRID(argv[fileindex]); + print_sparses(filename.str(), GRID, flatten, field); + } else if (dim == 3) { + MMSP::grid<3, MMSP::sparse > GRID(argv[fileindex]); + print_sparses(filename.str(), GRID, flatten, field); + } + } else if (short_type) { + if (dim == 1) { + MMSP::grid<1, MMSP::sparse > GRID(argv[fileindex]); + print_sparses(filename.str(), GRID, flatten, field); + } else if (dim == 2) { + MMSP::grid<2, MMSP::sparse > GRID(argv[fileindex]); + print_sparses(filename.str(), GRID, flatten, field); + } else if (dim == 3) { + MMSP::grid<3, MMSP::sparse > GRID(argv[fileindex]); + print_sparses(filename.str(), GRID, flatten, field); + } + } else if (float_type) { + if (dim == 1) { + MMSP::grid<1, MMSP::sparse > GRID(argv[fileindex]); + print_sparses(filename.str(), GRID, flatten, field); + } else if (dim == 2) { + MMSP::grid<2, MMSP::sparse > GRID(argv[fileindex]); + print_sparses(filename.str(), GRID, flatten, field); + } else if (dim == 3) { + MMSP::grid<3, MMSP::sparse > GRID(argv[fileindex]); + print_sparses(filename.str(), GRID, flatten, field); + } + } else if (long_double_type) { + if (dim == 1) { + MMSP::grid<1, MMSP::sparse > GRID(argv[fileindex]); + print_sparses(filename.str(), GRID, flatten, field); + } else if (dim == 2) { + MMSP::grid<2, MMSP::sparse > GRID(argv[fileindex]); + print_sparses(filename.str(), GRID, flatten, field); + } else if (dim == 3) { + MMSP::grid<3, MMSP::sparse > GRID(argv[fileindex]); + print_sparses(filename.str(), GRID, flatten, field); + } + } else if (double_type) { + if (dim == 1) { + MMSP::grid<1, MMSP::sparse > GRID(argv[fileindex]); + print_sparses(filename.str(), GRID, flatten, field); + } else if (dim == 2) { + MMSP::grid<2, MMSP::sparse > GRID(argv[fileindex]); + print_sparses(filename.str(), GRID, flatten, field); + } else if (dim == 3) { + MMSP::grid<3, MMSP::sparse > GRID(argv[fileindex]); + print_sparses(filename.str(), GRID, flatten, field); } } - - // clean up - delete [] buffer; - - // write closing markup - output << "\n"; - output << " \n"; - output << " \n"; - output << " \n"; } -// output closing markup - output << " \n"; - output << "\n"; } From 54191f5e3071a0059153b6f39ae485c75c7dfcd8 Mon Sep 17 00:00:00 2001 From: Trevor Keller Date: Tue, 21 Aug 2018 17:56:59 -0400 Subject: [PATCH 13/37] VTK utility runs, output larger than expected, only implemented for vectors --- utility/Makefile | 2 +- utility/mmsp2vti.cpp | 115 +++++++++++++++++++++++++------------------ 2 files changed, 68 insertions(+), 49 deletions(-) diff --git a/utility/Makefile b/utility/Makefile index 5a81d3d..8b0b47c 100644 --- a/utility/Makefile +++ b/utility/Makefile @@ -38,7 +38,7 @@ mmsp2vti : mmsp2vti.cpp # convert MMSP grid file to compressed VTK Image file type mmsp2vtz : mmsp2vti.cpp - $(compiler) $(flags) -O0 -g $< -o $@ $(vtklinks) -lz + $(compiler) $(flags) $< -o $@ $(vtklinks) -lz # convert MMSP grid file to XYZ point cloud file type mmsp2xyz : mmsp2xyz.cpp diff --git a/utility/mmsp2vti.cpp b/utility/mmsp2vti.cpp index 2b98384..9d72a7d 100644 --- a/utility/mmsp2vti.cpp +++ b/utility/mmsp2vti.cpp @@ -5,28 +5,31 @@ #include #include #include -#include -#include +#include +#include +#include #include +#include +#include #include -#include +#include #include "MMSP.hpp" template void print_scalars(std::string filename, const MMSP::grid& GRID, const int mode) { - vtkSmartPointer imageData = vtkSmartPointer::New(); - imageData->SetDimensions(MMSP::xlength(GRID, 0), MMSP::xlength(GRID, 1), MMSP::xlength(GRID, 2)); + vtkSmartPointer vtkData = vtkSmartPointer::New(); + vtkData->SetDimensions(MMSP::xlength(GRID, 0), MMSP::xlength(GRID, 1), MMSP::xlength(GRID, 2)); #if VTK_MAJOR_VERSION <= 5 - imageData->SetNumberOfScalarComponents(1); - imageData->SetScalarTypeToDouble(); + vtkData->SetNumberOfScalarComponents(1); + vtkData->SetScalarTypeToDouble(); #else - imageData->AllocateScalars(VTK_DOUBLE, 1); + vtkData->AllocateScalars(VTK_DOUBLE, 1); #endif if (dim==1) { MMSP::vector x(1,0); for (x[0]=MMSP::x0(GRID); x[0](imageData->GetScalarPointer(x[0] - MMSP::x0(GRID), 0, 0)); + double* pixel = static_cast(vtkData->GetScalarPointer(x[0], 0, 0)); if (mode==1) { // --mag pixel[0] = std::sqrt(GRID(x)*GRID(x)); } else { @@ -37,7 +40,7 @@ template void print_scalars(std::string filename, const MMS MMSP::vector x(2,0); for (x[1]=MMSP::y0(GRID); x[1](imageData->GetScalarPointer(x[0] - MMSP::x0(GRID), x[1] - MMSP::y0(GRID), 0)); + double* pixel = static_cast(vtkData->GetScalarPointer(x[0], x[1], 0)); if (mode==1) { // --mag pixel[0] = std::sqrt(GRID(x)*GRID(x)); } else { @@ -50,7 +53,7 @@ template void print_scalars(std::string filename, const MMS for (x[2]=MMSP::z0(GRID); x[2](imageData->GetScalarPointer(x[0] - MMSP::x0(GRID), x[1] - MMSP::y0(GRID), x[2] - MMSP::z0(GRID))); + double* pixel = static_cast(vtkData->GetScalarPointer(x[0], x[1], x[2])); if (mode==1) { // --mag pixel[0] = std::sqrt(GRID(x)*GRID(x)); } else { @@ -63,41 +66,46 @@ template void print_scalars(std::string filename, const MMS vtkSmartPointer writer = vtkSmartPointer::New(); writer->SetFileName(filename.c_str()); - // writer->SetCompressorType(ZLIB); + writer->SetCompressorTypeToZLib(); #if VTK_MAJOR_VERSION <= 5 - writer->SetInputConnection(imageData->GetProducerPort()); + writer->SetInputConnection(vtkData->GetProducerPort()); #else - writer->SetInputData(imageData); + writer->SetInputData(vtkData); #endif writer->Write(); + + vtkData = NULL; + writer = NULL; } template void print_vectors(std::string filename, const MMSP::grid >& GRID, const int mode, const int field) { - vtkSmartPointer imageData = vtkSmartPointer::New(); + vtkSmartPointer vtkData = vtkSmartPointer::New(); #if VTK_MAJOR_VERSION <= 5 - imageData->SetScalarTypeToDouble(); + vtkData->SetScalarTypeToDouble(); #endif if (dim==1) { - imageData->SetDimensions(MMSP::x1(GRID)-MMSP::x0(GRID), 1, 1); + vtkData->SetDimensions(MMSP::x1(GRID)-MMSP::x0(GRID), 1, 1); + vtkData->SetExtent(MMSP::x0(GRID), MMSP::x1(GRID) - 1, 0, 0, 0, 0); + vtkData->SetSpacing(MMSP::dx(GRID), 1, 1); #if VTK_MAJOR_VERSION <= 5 if (mode==1 || mode==2 || mode==3) - imageData->SetNumberOfScalarComponents(1); + vtkData->SetNumberOfScalarComponents(1); else - imageData->SetNumberOfScalarComponents(MMSP::fields(GRID)); + vtkData->SetNumberOfScalarComponents(MMSP::fields(GRID)); #else if (mode==1 || mode==2 || mode==3) - imageData->AllocateScalars(VTK_DOUBLE, 1); + vtkData->AllocateScalars(VTK_DOUBLE, 1); else - imageData->AllocateScalars(VTK_DOUBLE, MMSP::fields(GRID)); + vtkData->AllocateScalars(VTK_DOUBLE, MMSP::fields(GRID)); #endif MMSP::vector x(1,0); for (x[0]=MMSP::x0(GRID); x[0]& v = GRID(x); - double* pixel = static_cast(imageData->GetScalarPointer(x[0] - MMSP::x0(GRID), 0, 0)); + double* pixel = static_cast(vtkData->GetScalarPointer(x[0], 0, 0)); if (mode==1) { // --mag double sum = 0.0; for (int h = 0; h < v.length(); h++) @@ -118,24 +126,26 @@ template void print_vectors(std::string filename, const MMS } } } else if (dim==2) { - imageData->SetDimensions(MMSP::x1(GRID)-MMSP::x0(GRID), MMSP::y1(GRID)-MMSP::y0(GRID), 1); + vtkData->SetDimensions(MMSP::x1(GRID)-MMSP::x0(GRID), MMSP::y1(GRID)-MMSP::y0(GRID), 1); + vtkData->SetExtent(MMSP::x0(GRID), MMSP::x1(GRID) - 1, MMSP::y0(GRID), MMSP::y1(GRID) - 1, 0, 0); + vtkData->SetSpacing(MMSP::dx(GRID, 0), MMSP::dx(GRID, 1), 1); #if VTK_MAJOR_VERSION <= 5 if (mode==1 || mode==2 || mode==3) - imageData->SetNumberOfScalarComponents(1); + vtkData->SetNumberOfScalarComponents(1); else - imageData->SetNumberOfScalarComponents(MMSP::fields(GRID)); + vtkData->SetNumberOfScalarComponents(MMSP::fields(GRID)); #else if (mode==1 || mode==2 || mode==3) - imageData->AllocateScalars(VTK_DOUBLE, 1); + vtkData->AllocateScalars(VTK_DOUBLE, 1); else - imageData->AllocateScalars(VTK_DOUBLE, MMSP::fields(GRID)); + vtkData->AllocateScalars(VTK_DOUBLE, MMSP::fields(GRID)); #endif MMSP::vector x(2,0); for (x[1]=MMSP::y0(GRID); x[1]& v = GRID(x); - double* pixel = static_cast(imageData->GetScalarPointer(x[0] - MMSP::x0(GRID), x[1] - MMSP::y0(GRID), 0)); + double* pixel = static_cast(vtkData->GetScalarPointer(x[0], x[1], 0)); if (mode==1) { // --mag double sum = 0.0; for (int h = 0; h < v.length(); h++) @@ -157,17 +167,19 @@ template void print_vectors(std::string filename, const MMS } } } else if (dim==3) { - imageData->SetDimensions(MMSP::x1(GRID)-MMSP::x0(GRID), MMSP::y1(GRID)-MMSP::y0(GRID), MMSP::z1(GRID)-MMSP::z0(GRID)); + vtkData->SetDimensions(MMSP::x1(GRID)-MMSP::x0(GRID), MMSP::y1(GRID)-MMSP::y0(GRID), MMSP::z1(GRID)-MMSP::z0(GRID)); + vtkData->SetExtent(MMSP::x0(GRID), MMSP::x1(GRID) - 1, MMSP::y0(GRID), MMSP::y1(GRID) - 1, MMSP::z0(GRID), MMSP::z1(GRID) - 1); + vtkData->SetSpacing(MMSP::dx(GRID, 0), MMSP::dx(GRID, 1), MMSP::dx(GRID, 2)); #if VTK_MAJOR_VERSION <= 5 if (mode==1 || mode==2 || mode==3) - imageData->SetNumberOfScalarComponents(1); + vtkData->SetNumberOfScalarComponents(1); else - imageData->SetNumberOfScalarComponents(MMSP::fields(GRID)); + vtkData->SetNumberOfScalarComponents(MMSP::fields(GRID)); #else if (mode==1 || mode==2 || mode==3) - imageData->AllocateScalars(VTK_DOUBLE, 1); + vtkData->AllocateScalars(VTK_DOUBLE, 1); else - imageData->AllocateScalars(VTK_DOUBLE, MMSP::fields(GRID)); + vtkData->AllocateScalars(VTK_DOUBLE, MMSP::fields(GRID)); #endif MMSP::vector x(3,0); @@ -175,7 +187,7 @@ template void print_vectors(std::string filename, const MMS for (x[1]=MMSP::y0(GRID); x[1]& v = GRID(x); - double* pixel = static_cast(imageData->GetScalarPointer(x[0] - MMSP::x0(GRID), x[1] - MMSP::y0(GRID), x[2] - MMSP::z0(GRID))); + double* pixel = static_cast(vtkData->GetScalarPointer(x[0], x[1], x[2])); if (mode==1) { // --mag double sum = 0.0; for (int h = 0; h < v.length(); h++) @@ -198,35 +210,39 @@ template void print_vectors(std::string filename, const MMS } } } + vtkData->GetPointData()->GetAbstractArray(0)->SetName("vector_data"); vtkSmartPointer writer = vtkSmartPointer::New(); writer->SetFileName(filename.c_str()); - // writer->SetCompressorType(ZLIB); + writer->SetCompressorTypeToZLib(); #if VTK_MAJOR_VERSION <= 5 - writer->SetInputConnection(imageData->GetProducerPort()); + writer->SetInputConnection(vtkData->GetProducerPort()); #else - writer->SetInputData(imageData); + writer->SetInputData(vtkData); #endif writer->Write(); + + vtkData = NULL; + writer = NULL; } template void print_sparses(std::string filename, const MMSP::grid >& GRID, const int mode, const int field) { - vtkSmartPointer imageData = vtkSmartPointer::New(); - imageData->SetDimensions(MMSP::xlength(GRID, 0), MMSP::xlength(GRID, 1), MMSP::xlength(GRID, 2)); + vtkSmartPointer vtkData = vtkSmartPointer::New(); + vtkData->SetDimensions(MMSP::xlength(GRID, 0), MMSP::xlength(GRID, 1), MMSP::xlength(GRID, 2)); #if VTK_MAJOR_VERSION <= 5 - imageData->SetNumberOfScalarComponents(1); - imageData->SetScalarTypeToDouble(); + vtkData->SetNumberOfScalarComponents(1); + vtkData->SetScalarTypeToDouble(); #else - imageData->AllocateScalars(VTK_DOUBLE, 1); + vtkData->AllocateScalars(VTK_DOUBLE, 1); #endif if (dim==1) { MMSP::vector x(1,0); for (x[0]=MMSP::x0(GRID); x[0]& s = GRID(x); - double* pixel = static_cast(imageData->GetScalarPointer(x[0] - MMSP::x0(GRID), 0, 0)); + double* pixel = static_cast(vtkData->GetScalarPointer(x[0], 0, 0)); if (mode==2) { // --max // Export index of field with greatest magnitude int max = 0; @@ -248,7 +264,7 @@ template void print_sparses(std::string filename, const MMS for (x[1]=MMSP::y0(GRID); x[1]& s = GRID(x); - double* pixel = static_cast(imageData->GetScalarPointer(x[0] - MMSP::x0(GRID), x[1] - MMSP::y0(GRID), 0)); + double* pixel = static_cast(vtkData->GetScalarPointer(x[0], x[1], 0)); if (mode==2) { // --max // Export index of field with greatest magnitude int max = 0; @@ -272,7 +288,7 @@ template void print_sparses(std::string filename, const MMS for (x[1]=MMSP::y0(GRID); x[1]& s = GRID(x); - double* pixel = static_cast(imageData->GetScalarPointer(x[0] - MMSP::x0(GRID), x[1] - MMSP::y0(GRID), x[2] - MMSP::z0(GRID))); + double* pixel = static_cast(vtkData->GetScalarPointer(x[0], x[1], x[2])); if (mode==2) { // --max // Export index of field with greatest magnitude int max = 0; @@ -295,13 +311,16 @@ template void print_sparses(std::string filename, const MMS vtkSmartPointer writer = vtkSmartPointer::New(); writer->SetFileName(filename.c_str()); - // writer->SetCompressorType(ZLIB); + writer->SetCompressorTypeToZLib(); #if VTK_MAJOR_VERSION <= 5 - writer->SetInputConnection(imageData->GetProducerPort()); + writer->SetInputConnection(vtkData->GetProducerPort()); #else - writer->SetInputData(imageData); + writer->SetInputData(vtkData); #endif writer->Write(); + + vtkData = NULL; + writer = NULL; } int main(int argc, char* argv[]) From db00e0050cc6409981decc80fe07681858e158ca Mon Sep 17 00:00:00 2001 From: Trevor Keller Date: Wed, 22 Aug 2018 00:46:03 -0400 Subject: [PATCH 14/37] functional, tested vector and sparse VTK writers --- utility/Makefile | 4 +- utility/mmsp2vti.cpp | 123 +++++++++++++++++++++++++++++++++---------- 2 files changed, 97 insertions(+), 30 deletions(-) diff --git a/utility/Makefile b/utility/Makefile index 8b0b47c..a387efa 100644 --- a/utility/Makefile +++ b/utility/Makefile @@ -4,8 +4,8 @@ # compilers/flags compiler = g++ -flags = -O2 -Wall -I ../include -I /usr/include/vtk-6.3 -L /usr/lib/x86_64-linux-gnu -vtklinks = -lvtkCommonCore-6.3 -lvtkCommonDataModel-6.3 -lvtkIOXML-6.3 +flags = -O2 -Wall -I ../include -I /usr/include/vtk -L /usr/lib/x86_64-linux-gnu +vtklinks = -lvtkCommonCore -lvtkCommonDataModel -lvtkIOXML topo = ../algorithms/topology # conversion programs diff --git a/utility/mmsp2vti.cpp b/utility/mmsp2vti.cpp index 9d72a7d..84b3b1e 100644 --- a/utility/mmsp2vti.cpp +++ b/utility/mmsp2vti.cpp @@ -6,27 +6,27 @@ #include #include #include -#include #include -#include #include #include #include -#include #include "MMSP.hpp" template void print_scalars(std::string filename, const MMSP::grid& GRID, const int mode) { vtkSmartPointer vtkData = vtkSmartPointer::New(); - vtkData->SetDimensions(MMSP::xlength(GRID, 0), MMSP::xlength(GRID, 1), MMSP::xlength(GRID, 2)); - #if VTK_MAJOR_VERSION <= 5 - vtkData->SetNumberOfScalarComponents(1); - vtkData->SetScalarTypeToDouble(); - #else - vtkData->AllocateScalars(VTK_DOUBLE, 1); - #endif if (dim==1) { + vtkData->SetDimensions(MMSP::x1(GRID)-MMSP::x0(GRID), 1, 1); + vtkData->SetExtent(MMSP::x0(GRID), MMSP::x1(GRID) - 1, 0, 0, 0, 0); + vtkData->SetSpacing(MMSP::dx(GRID), 1, 1); + #if VTK_MAJOR_VERSION <= 5 + vtkData->SetScalarTypeToDouble(); + vtkData->SetNumberOfScalarComponents(1); + #else + vtkData->AllocateScalars(VTK_DOUBLE, 1); + #endif + MMSP::vector x(1,0); for (x[0]=MMSP::x0(GRID); x[0](vtkData->GetScalarPointer(x[0], 0, 0)); @@ -37,6 +37,20 @@ template void print_scalars(std::string filename, const MMS } } } else if (dim==2) { + vtkData->SetDimensions(MMSP::x1(GRID)-MMSP::x0(GRID), + MMSP::y1(GRID)-MMSP::y0(GRID), + 1); + vtkData->SetExtent(MMSP::x0(GRID), MMSP::x1(GRID) - 1, + MMSP::y0(GRID), MMSP::y1(GRID) - 1, + 0, 0); + vtkData->SetSpacing(MMSP::dx(GRID, 0), MMSP::dx(GRID, 1), 1); + #if VTK_MAJOR_VERSION <= 5 + vtkData->SetScalarTypeToDouble(); + vtkData->SetNumberOfScalarComponents(1); + #else + vtkData->AllocateScalars(VTK_DOUBLE, 1); + #endif + MMSP::vector x(2,0); for (x[1]=MMSP::y0(GRID); x[1] void print_scalars(std::string filename, const MMS } } } else if (dim==3) { + vtkData->SetDimensions(MMSP::x1(GRID)-MMSP::x0(GRID), + MMSP::y1(GRID)-MMSP::y0(GRID), + MMSP::z1(GRID)-MMSP::z0(GRID)); + vtkData->SetExtent(MMSP::x0(GRID), MMSP::x1(GRID) - 1, + MMSP::y0(GRID), MMSP::y1(GRID) - 1, + MMSP::z0(GRID), MMSP::z1(GRID) - 1); + vtkData->SetSpacing(MMSP::dx(GRID, 0), MMSP::dx(GRID, 1), MMSP::dx(GRID, 2)); + #if VTK_MAJOR_VERSION <= 5 + vtkData->SetScalarTypeToDouble(); + vtkData->SetNumberOfScalarComponents(1); + #else + vtkData->AllocateScalars(VTK_DOUBLE, 1); + #endif + MMSP::vector x(3,0); for (x[2]=MMSP::z0(GRID); x[2] void print_scalars(std::string filename, const MMS } } } + vtkData->GetPointData()->GetAbstractArray(0)->SetName("scalar_data"); vtkSmartPointer writer = vtkSmartPointer::New(); writer->SetFileName(filename.c_str()); - writer->SetCompressorTypeToZLib(); #if VTK_MAJOR_VERSION <= 5 writer->SetInputConnection(vtkData->GetProducerPort()); #else @@ -82,15 +110,13 @@ template void print_vectors(std::string filename, const MMS const int mode, const int field) { vtkSmartPointer vtkData = vtkSmartPointer::New(); - #if VTK_MAJOR_VERSION <= 5 - vtkData->SetScalarTypeToDouble(); - #endif if (dim==1) { vtkData->SetDimensions(MMSP::x1(GRID)-MMSP::x0(GRID), 1, 1); - vtkData->SetExtent(MMSP::x0(GRID), MMSP::x1(GRID) - 1, 0, 0, 0, 0); + vtkData->SetExtent(MMSP::x0(GRID), MMSP::x1(GRID) - 1, 0, 0, 0, 0); vtkData->SetSpacing(MMSP::dx(GRID), 1, 1); #if VTK_MAJOR_VERSION <= 5 + vtkData->SetScalarTypeToDouble(); if (mode==1 || mode==2 || mode==3) vtkData->SetNumberOfScalarComponents(1); else @@ -126,10 +152,15 @@ template void print_vectors(std::string filename, const MMS } } } else if (dim==2) { - vtkData->SetDimensions(MMSP::x1(GRID)-MMSP::x0(GRID), MMSP::y1(GRID)-MMSP::y0(GRID), 1); - vtkData->SetExtent(MMSP::x0(GRID), MMSP::x1(GRID) - 1, MMSP::y0(GRID), MMSP::y1(GRID) - 1, 0, 0); + vtkData->SetDimensions(MMSP::x1(GRID)-MMSP::x0(GRID), + MMSP::y1(GRID)-MMSP::y0(GRID), + 1); + vtkData->SetExtent(MMSP::x0(GRID), MMSP::x1(GRID) - 1, + MMSP::y0(GRID), MMSP::y1(GRID) - 1, + 0, 0); vtkData->SetSpacing(MMSP::dx(GRID, 0), MMSP::dx(GRID, 1), 1); #if VTK_MAJOR_VERSION <= 5 + vtkData->SetScalarTypeToDouble(); if (mode==1 || mode==2 || mode==3) vtkData->SetNumberOfScalarComponents(1); else @@ -167,10 +198,15 @@ template void print_vectors(std::string filename, const MMS } } } else if (dim==3) { - vtkData->SetDimensions(MMSP::x1(GRID)-MMSP::x0(GRID), MMSP::y1(GRID)-MMSP::y0(GRID), MMSP::z1(GRID)-MMSP::z0(GRID)); - vtkData->SetExtent(MMSP::x0(GRID), MMSP::x1(GRID) - 1, MMSP::y0(GRID), MMSP::y1(GRID) - 1, MMSP::z0(GRID), MMSP::z1(GRID) - 1); + vtkData->SetDimensions(MMSP::x1(GRID)-MMSP::x0(GRID), + MMSP::y1(GRID)-MMSP::y0(GRID), + MMSP::z1(GRID)-MMSP::z0(GRID)); + vtkData->SetExtent(MMSP::x0(GRID), MMSP::x1(GRID) - 1, + MMSP::y0(GRID), MMSP::y1(GRID) - 1, + MMSP::z0(GRID), MMSP::z1(GRID) - 1); vtkData->SetSpacing(MMSP::dx(GRID, 0), MMSP::dx(GRID, 1), MMSP::dx(GRID, 2)); #if VTK_MAJOR_VERSION <= 5 + vtkData->SetScalarTypeToDouble(); if (mode==1 || mode==2 || mode==3) vtkData->SetNumberOfScalarComponents(1); else @@ -214,12 +250,12 @@ template void print_vectors(std::string filename, const MMS vtkSmartPointer writer = vtkSmartPointer::New(); writer->SetFileName(filename.c_str()); - writer->SetCompressorTypeToZLib(); #if VTK_MAJOR_VERSION <= 5 writer->SetInputConnection(vtkData->GetProducerPort()); #else writer->SetInputData(vtkData); #endif + writer->Write(); vtkData = NULL; @@ -230,15 +266,18 @@ template void print_sparses(std::string filename, const MMS const int mode, const int field) { vtkSmartPointer vtkData = vtkSmartPointer::New(); - vtkData->SetDimensions(MMSP::xlength(GRID, 0), MMSP::xlength(GRID, 1), MMSP::xlength(GRID, 2)); - #if VTK_MAJOR_VERSION <= 5 - vtkData->SetNumberOfScalarComponents(1); - vtkData->SetScalarTypeToDouble(); - #else - vtkData->AllocateScalars(VTK_DOUBLE, 1); - #endif if (dim==1) { + vtkData->SetDimensions(MMSP::x1(GRID)-MMSP::x0(GRID), 1, 1); + vtkData->SetExtent(MMSP::x0(GRID), MMSP::x1(GRID) - 1, 0, 0, 0, 0); + vtkData->SetSpacing(MMSP::dx(GRID, 0), 1, 1); + #if VTK_MAJOR_VERSION <= 5 + vtkData->SetNumberOfScalarComponents(1); + vtkData->SetScalarTypeToDouble(); + #else + vtkData->AllocateScalars(VTK_DOUBLE, 1); + #endif + MMSP::vector x(1,0); for (x[0]=MMSP::x0(GRID); x[0]& s = GRID(x); @@ -260,6 +299,20 @@ template void print_sparses(std::string filename, const MMS } } } else if (dim==2) { + vtkData->SetDimensions(MMSP::x1(GRID)-MMSP::x0(GRID), + MMSP::y1(GRID)-MMSP::y0(GRID), + 1); + vtkData->SetExtent(MMSP::x0(GRID), MMSP::x1(GRID) - 1, + MMSP::y0(GRID), MMSP::y1(GRID) - 1, + 0, 0); + vtkData->SetSpacing(MMSP::dx(GRID, 0), MMSP::dx(GRID, 1), 1); + #if VTK_MAJOR_VERSION <= 5 + vtkData->SetNumberOfScalarComponents(1); + vtkData->SetScalarTypeToDouble(); + #else + vtkData->AllocateScalars(VTK_DOUBLE, 1); + #endif + MMSP::vector x(2,0); for (x[1]=MMSP::y0(GRID); x[1] void print_sparses(std::string filename, const MMS } } } else if (dim==3) { + vtkData->SetDimensions(MMSP::x1(GRID)-MMSP::x0(GRID), + MMSP::y1(GRID)-MMSP::y0(GRID), + MMSP::z1(GRID)-MMSP::z0(GRID)); + vtkData->SetExtent(MMSP::x0(GRID), MMSP::x1(GRID) - 1, + MMSP::y0(GRID), MMSP::y1(GRID) - 1, + MMSP::z0(GRID), MMSP::z1(GRID) - 1); + vtkData->SetSpacing(MMSP::dx(GRID, 0), MMSP::dx(GRID, 1), MMSP::dx(GRID, 2)); + #if VTK_MAJOR_VERSION <= 5 + vtkData->SetNumberOfScalarComponents(1); + vtkData->SetScalarTypeToDouble(); + #else + vtkData->AllocateScalars(VTK_DOUBLE, 1); + #endif + MMSP::vector x(3,0); for (x[2]=MMSP::z0(GRID); x[2] void print_sparses(std::string filename, const MMS } } } + vtkData->GetPointData()->GetAbstractArray(0)->SetName("sparse_data"); vtkSmartPointer writer = vtkSmartPointer::New(); writer->SetFileName(filename.c_str()); - writer->SetCompressorTypeToZLib(); #if VTK_MAJOR_VERSION <= 5 writer->SetInputConnection(vtkData->GetProducerPort()); #else From 2dc871accf5401797853f7cf085d9c24b092cbcf Mon Sep 17 00:00:00 2001 From: Trevor Keller Date: Wed, 22 Aug 2018 11:26:23 -0400 Subject: [PATCH 15/37] search for VTK, rather than hard-coding paths --- utility/Makefile | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/utility/Makefile b/utility/Makefile index a387efa..06b4427 100644 --- a/utility/Makefile +++ b/utility/Makefile @@ -2,9 +2,13 @@ # GNU makefile for grid conversion programs using MMSP # Questions/comments to gruberja@gmail.com (Jason Gruber) +# VTK path +VTK_SRC = $(shell dirname $(shell locate --limit 1 vtkImageData.h)) +VTK_LIB = $(shell dirname $(shell locate --limit 1 vtkCommonCore.so)) + # compilers/flags compiler = g++ -flags = -O2 -Wall -I ../include -I /usr/include/vtk -L /usr/lib/x86_64-linux-gnu +flags = -O2 -Wall -I ../include -I $(VTK_SRC) -L $(VTK_LIB) vtklinks = -lvtkCommonCore -lvtkCommonDataModel -lvtkIOXML topo = ../algorithms/topology From 2ce5fb36cfe968bcddebfb0a0176bffa5217e79a Mon Sep 17 00:00:00 2001 From: Trevor Keller Date: Wed, 22 Aug 2018 12:51:30 -0400 Subject: [PATCH 16/37] enable reading built-in grids, working VTK conversion --- include/MMSP.grid.cpp | 8 +- utility/Makefile | 11 ++- utility/mmsp2vti.cpp | 216 +++++++++++++++++++++--------------------- 3 files changed, 123 insertions(+), 112 deletions(-) diff --git a/include/MMSP.grid.cpp b/include/MMSP.grid.cpp index 65a95cc..94debbb 100644 --- a/include/MMSP.grid.cpp +++ b/include/MMSP.grid.cpp @@ -1181,10 +1181,14 @@ template void grid::input(const char* filename, int } // grid data type error check - std::string type; + std::string type, scalar_type; getline(input, type, '\n'); + scalar_type = "grid:scalar" + type.substr(type.find_last_of(":", 8)); + if (type != name(*this) && scalar_type == name(*this)) { + type = scalar_type; + } if (type != name(*this)) { - std::cerr << "File read error: wrong data type (" << type << ")." << std::endl; + std::cerr << "File read error: wrong data type (" << type << "), expected (" << name(*this) << ")." << std::endl; exit(-2); } diff --git a/utility/Makefile b/utility/Makefile index 06b4427..e7bc230 100644 --- a/utility/Makefile +++ b/utility/Makefile @@ -2,14 +2,21 @@ # GNU makefile for grid conversion programs using MMSP # Questions/comments to gruberja@gmail.com (Jason Gruber) -# VTK path +# find VTK libraries VTK_SRC = $(shell dirname $(shell locate --limit 1 vtkImageData.h)) VTK_LIB = $(shell dirname $(shell locate --limit 1 vtkCommonCore.so)) +vtklinks = -lvtkCommonCore -lvtkCommonDataModel -lvtkIOXML + +# handle special cases of VTK installation +VTK_DEB = $(shell locate --limit 1 vtkCommonCore-6.3.so) +ifneq ($(VTK_DEB), "") + VTK_LIB = $(shell dirname $(shell locate --limit 1 vtkCommonCore-6.3.so)) + vtklinks = -lvtkCommonCore-6.3 -lvtkCommonDataModel-6.3 -lvtkIOXML-6.3 +endif # compilers/flags compiler = g++ flags = -O2 -Wall -I ../include -I $(VTK_SRC) -L $(VTK_LIB) -vtklinks = -lvtkCommonCore -lvtkCommonDataModel -lvtkIOXML topo = ../algorithms/topology # conversion programs diff --git a/utility/mmsp2vti.cpp b/utility/mmsp2vti.cpp index 84b3b1e..9f3b29c 100644 --- a/utility/mmsp2vti.cpp +++ b/utility/mmsp2vti.cpp @@ -14,183 +14,183 @@ template void print_scalars(std::string filename, const MMSP::grid& GRID, const int mode) { - vtkSmartPointer vtkData = vtkSmartPointer::New(); + vtkSmartPointer scalarData = vtkSmartPointer::New(); if (dim==1) { - vtkData->SetDimensions(MMSP::x1(GRID)-MMSP::x0(GRID), 1, 1); - vtkData->SetExtent(MMSP::x0(GRID), MMSP::x1(GRID) - 1, 0, 0, 0, 0); - vtkData->SetSpacing(MMSP::dx(GRID), 1, 1); + scalarData->SetDimensions(MMSP::x1(GRID)-MMSP::x0(GRID), 1, 1); + scalarData->SetExtent(MMSP::x0(GRID), MMSP::x1(GRID) - 1, 0, 0, 0, 0); + scalarData->SetSpacing(MMSP::dx(GRID), 1, 1); #if VTK_MAJOR_VERSION <= 5 - vtkData->SetScalarTypeToDouble(); - vtkData->SetNumberOfScalarComponents(1); + scalarData->SetScalarTypeToDouble(); + scalarData->SetNumberOfScalarComponents(1); #else - vtkData->AllocateScalars(VTK_DOUBLE, 1); + scalarData->AllocateScalars(VTK_DOUBLE, 1); #endif MMSP::vector x(1,0); for (x[0]=MMSP::x0(GRID); x[0](vtkData->GetScalarPointer(x[0], 0, 0)); + double* pixel = static_cast(scalarData->GetScalarPointer(x[0], 0, 0)); if (mode==1) { // --mag - pixel[0] = std::sqrt(GRID(x)*GRID(x)); + *pixel = std::sqrt(GRID(x)*GRID(x)); } else { - pixel[0] = GRID(x); + *pixel = GRID(x); } } } else if (dim==2) { - vtkData->SetDimensions(MMSP::x1(GRID)-MMSP::x0(GRID), + scalarData->SetDimensions(MMSP::x1(GRID)-MMSP::x0(GRID), MMSP::y1(GRID)-MMSP::y0(GRID), 1); - vtkData->SetExtent(MMSP::x0(GRID), MMSP::x1(GRID) - 1, + scalarData->SetExtent(MMSP::x0(GRID), MMSP::x1(GRID) - 1, MMSP::y0(GRID), MMSP::y1(GRID) - 1, 0, 0); - vtkData->SetSpacing(MMSP::dx(GRID, 0), MMSP::dx(GRID, 1), 1); + scalarData->SetSpacing(MMSP::dx(GRID, 0), MMSP::dx(GRID, 1), 1); #if VTK_MAJOR_VERSION <= 5 - vtkData->SetScalarTypeToDouble(); - vtkData->SetNumberOfScalarComponents(1); + scalarData->SetScalarTypeToDouble(); + scalarData->SetNumberOfScalarComponents(1); #else - vtkData->AllocateScalars(VTK_DOUBLE, 1); + scalarData->AllocateScalars(VTK_DOUBLE, 1); #endif MMSP::vector x(2,0); for (x[1]=MMSP::y0(GRID); x[1](vtkData->GetScalarPointer(x[0], x[1], 0)); + double* pixel = static_cast(scalarData->GetScalarPointer(x[0], x[1], 0)); if (mode==1) { // --mag - pixel[0] = std::sqrt(GRID(x)*GRID(x)); + *pixel = std::sqrt(GRID(x)*GRID(x)); } else { - pixel[0] = GRID(x); + *pixel = GRID(x); } } } } else if (dim==3) { - vtkData->SetDimensions(MMSP::x1(GRID)-MMSP::x0(GRID), + scalarData->SetDimensions(MMSP::x1(GRID)-MMSP::x0(GRID), MMSP::y1(GRID)-MMSP::y0(GRID), MMSP::z1(GRID)-MMSP::z0(GRID)); - vtkData->SetExtent(MMSP::x0(GRID), MMSP::x1(GRID) - 1, + scalarData->SetExtent(MMSP::x0(GRID), MMSP::x1(GRID) - 1, MMSP::y0(GRID), MMSP::y1(GRID) - 1, MMSP::z0(GRID), MMSP::z1(GRID) - 1); - vtkData->SetSpacing(MMSP::dx(GRID, 0), MMSP::dx(GRID, 1), MMSP::dx(GRID, 2)); + scalarData->SetSpacing(MMSP::dx(GRID, 0), MMSP::dx(GRID, 1), MMSP::dx(GRID, 2)); #if VTK_MAJOR_VERSION <= 5 - vtkData->SetScalarTypeToDouble(); - vtkData->SetNumberOfScalarComponents(1); + scalarData->SetScalarTypeToDouble(); + scalarData->SetNumberOfScalarComponents(1); #else - vtkData->AllocateScalars(VTK_DOUBLE, 1); + scalarData->AllocateScalars(VTK_DOUBLE, 1); #endif MMSP::vector x(3,0); for (x[2]=MMSP::z0(GRID); x[2](vtkData->GetScalarPointer(x[0], x[1], x[2])); + double* pixel = static_cast(scalarData->GetScalarPointer(x[0], x[1], x[2])); if (mode==1) { // --mag - pixel[0] = std::sqrt(GRID(x)*GRID(x)); + *pixel = std::sqrt(GRID(x)*GRID(x)); } else { - pixel[0] = GRID(x); + *pixel = GRID(x); } } } } } - vtkData->GetPointData()->GetAbstractArray(0)->SetName("scalar_data"); + scalarData->GetPointData()->GetAbstractArray(0)->SetName("scalar_data"); vtkSmartPointer writer = vtkSmartPointer::New(); writer->SetFileName(filename.c_str()); #if VTK_MAJOR_VERSION <= 5 - writer->SetInputConnection(vtkData->GetProducerPort()); + writer->SetInputConnection(scalarData->GetProducerPort()); #else - writer->SetInputData(vtkData); + writer->SetInputData(scalarData); #endif writer->Write(); - vtkData = NULL; + scalarData = NULL; writer = NULL; } template void print_vectors(std::string filename, const MMSP::grid >& GRID, const int mode, const int field) { - vtkSmartPointer vtkData = vtkSmartPointer::New(); + vtkSmartPointer vectorData = vtkSmartPointer::New(); if (dim==1) { - vtkData->SetDimensions(MMSP::x1(GRID)-MMSP::x0(GRID), 1, 1); - vtkData->SetExtent(MMSP::x0(GRID), MMSP::x1(GRID) - 1, 0, 0, 0, 0); - vtkData->SetSpacing(MMSP::dx(GRID), 1, 1); + vectorData->SetDimensions(MMSP::x1(GRID)-MMSP::x0(GRID), 1, 1); + vectorData->SetExtent(MMSP::x0(GRID), MMSP::x1(GRID) - 1, 0, 0, 0, 0); + vectorData->SetSpacing(MMSP::dx(GRID), 1, 1); #if VTK_MAJOR_VERSION <= 5 - vtkData->SetScalarTypeToDouble(); + vectorData->SetScalarTypeToDouble(); if (mode==1 || mode==2 || mode==3) - vtkData->SetNumberOfScalarComponents(1); + vectorData->SetNumberOfScalarComponents(1); else - vtkData->SetNumberOfScalarComponents(MMSP::fields(GRID)); + vectorData->SetNumberOfScalarComponents(MMSP::fields(GRID)); #else if (mode==1 || mode==2 || mode==3) - vtkData->AllocateScalars(VTK_DOUBLE, 1); + vectorData->AllocateScalars(VTK_DOUBLE, 1); else - vtkData->AllocateScalars(VTK_DOUBLE, MMSP::fields(GRID)); + vectorData->AllocateScalars(VTK_DOUBLE, MMSP::fields(GRID)); #endif MMSP::vector x(1,0); for (x[0]=MMSP::x0(GRID); x[0]& v = GRID(x); - double* pixel = static_cast(vtkData->GetScalarPointer(x[0], 0, 0)); + double* pixel = static_cast(vectorData->GetScalarPointer(x[0], 0, 0)); if (mode==1) { // --mag double sum = 0.0; for (int h = 0; h < v.length(); h++) sum += v[h]*v[h]; - pixel[0] = std::sqrt(sum); + *pixel = std::sqrt(sum); } else if (mode==2) { // --max // Export index of field with greatest magnitude int max = 0; for (int h = 1; h < v.length(); h++) if (v[h] > v[max]) max = h; - pixel[0] = max; + *pixel = max; } else if (mode==3) { // --field - pixel[0] = v[field]; + *pixel = v[field]; } else { for (int h = 0; h < v.length(); h++) pixel[h] = v[h]; } } } else if (dim==2) { - vtkData->SetDimensions(MMSP::x1(GRID)-MMSP::x0(GRID), + vectorData->SetDimensions(MMSP::x1(GRID)-MMSP::x0(GRID), MMSP::y1(GRID)-MMSP::y0(GRID), 1); - vtkData->SetExtent(MMSP::x0(GRID), MMSP::x1(GRID) - 1, + vectorData->SetExtent(MMSP::x0(GRID), MMSP::x1(GRID) - 1, MMSP::y0(GRID), MMSP::y1(GRID) - 1, 0, 0); - vtkData->SetSpacing(MMSP::dx(GRID, 0), MMSP::dx(GRID, 1), 1); + vectorData->SetSpacing(MMSP::dx(GRID, 0), MMSP::dx(GRID, 1), 1); #if VTK_MAJOR_VERSION <= 5 - vtkData->SetScalarTypeToDouble(); + vectorData->SetScalarTypeToDouble(); if (mode==1 || mode==2 || mode==3) - vtkData->SetNumberOfScalarComponents(1); + vectorData->SetNumberOfScalarComponents(1); else - vtkData->SetNumberOfScalarComponents(MMSP::fields(GRID)); + vectorData->SetNumberOfScalarComponents(MMSP::fields(GRID)); #else if (mode==1 || mode==2 || mode==3) - vtkData->AllocateScalars(VTK_DOUBLE, 1); + vectorData->AllocateScalars(VTK_DOUBLE, 1); else - vtkData->AllocateScalars(VTK_DOUBLE, MMSP::fields(GRID)); + vectorData->AllocateScalars(VTK_DOUBLE, MMSP::fields(GRID)); #endif MMSP::vector x(2,0); for (x[1]=MMSP::y0(GRID); x[1]& v = GRID(x); - double* pixel = static_cast(vtkData->GetScalarPointer(x[0], x[1], 0)); + double* pixel = static_cast(vectorData->GetScalarPointer(x[0], x[1], 0)); if (mode==1) { // --mag double sum = 0.0; for (int h = 0; h < v.length(); h++) sum += v[h]*v[h]; - pixel[0] = std::sqrt(sum); + *pixel = std::sqrt(sum); } else if (mode==2) { // --max // Export index of field with greatest magnitude int max = 0; for (int h = 1; h < v.length(); h++) if (v[h] > v[max]) max = h; - pixel[0] = max; + *pixel = max; } else if (mode==3) { // --field - pixel[0] = v[field]; + *pixel = v[field]; } else { for (int h = 0; h < v.length(); h++) pixel[h] = v[h]; @@ -198,24 +198,24 @@ template void print_vectors(std::string filename, const MMS } } } else if (dim==3) { - vtkData->SetDimensions(MMSP::x1(GRID)-MMSP::x0(GRID), + vectorData->SetDimensions(MMSP::x1(GRID)-MMSP::x0(GRID), MMSP::y1(GRID)-MMSP::y0(GRID), MMSP::z1(GRID)-MMSP::z0(GRID)); - vtkData->SetExtent(MMSP::x0(GRID), MMSP::x1(GRID) - 1, + vectorData->SetExtent(MMSP::x0(GRID), MMSP::x1(GRID) - 1, MMSP::y0(GRID), MMSP::y1(GRID) - 1, MMSP::z0(GRID), MMSP::z1(GRID) - 1); - vtkData->SetSpacing(MMSP::dx(GRID, 0), MMSP::dx(GRID, 1), MMSP::dx(GRID, 2)); + vectorData->SetSpacing(MMSP::dx(GRID, 0), MMSP::dx(GRID, 1), MMSP::dx(GRID, 2)); #if VTK_MAJOR_VERSION <= 5 - vtkData->SetScalarTypeToDouble(); + vectorData->SetScalarTypeToDouble(); if (mode==1 || mode==2 || mode==3) - vtkData->SetNumberOfScalarComponents(1); + vectorData->SetNumberOfScalarComponents(1); else - vtkData->SetNumberOfScalarComponents(MMSP::fields(GRID)); + vectorData->SetNumberOfScalarComponents(MMSP::fields(GRID)); #else if (mode==1 || mode==2 || mode==3) - vtkData->AllocateScalars(VTK_DOUBLE, 1); + vectorData->AllocateScalars(VTK_DOUBLE, 1); else - vtkData->AllocateScalars(VTK_DOUBLE, MMSP::fields(GRID)); + vectorData->AllocateScalars(VTK_DOUBLE, MMSP::fields(GRID)); #endif MMSP::vector x(3,0); @@ -223,21 +223,21 @@ template void print_vectors(std::string filename, const MMS for (x[1]=MMSP::y0(GRID); x[1]& v = GRID(x); - double* pixel = static_cast(vtkData->GetScalarPointer(x[0], x[1], x[2])); + double* pixel = static_cast(vectorData->GetScalarPointer(x[0], x[1], x[2])); if (mode==1) { // --mag double sum = 0.0; for (int h = 0; h < v.length(); h++) sum += v[h]*v[h]; - pixel[0] = std::sqrt(sum); + *pixel = std::sqrt(sum); } else if (mode==2) { // --max // Export index of field with greatest magnitude int max = 0; for (int h = 1; h < v.length(); h++) if (v[h] > v[max]) max = h; - pixel[0] = max; + *pixel = max; } else if (mode==3) { // --field - pixel[0] = v[field]; + *pixel = v[field]; } else { for (int h = 0; h < v.length(); h++) pixel[h] = v[h]; @@ -246,108 +246,108 @@ template void print_vectors(std::string filename, const MMS } } } - vtkData->GetPointData()->GetAbstractArray(0)->SetName("vector_data"); + vectorData->GetPointData()->GetAbstractArray(0)->SetName("vector_data"); vtkSmartPointer writer = vtkSmartPointer::New(); writer->SetFileName(filename.c_str()); #if VTK_MAJOR_VERSION <= 5 - writer->SetInputConnection(vtkData->GetProducerPort()); + writer->SetInputConnection(vectorData->GetProducerPort()); #else - writer->SetInputData(vtkData); + writer->SetInputData(vectorData); #endif writer->Write(); - vtkData = NULL; + vectorData = NULL; writer = NULL; } template void print_sparses(std::string filename, const MMSP::grid >& GRID, const int mode, const int field) { - vtkSmartPointer vtkData = vtkSmartPointer::New(); + vtkSmartPointer sparseData = vtkSmartPointer::New(); if (dim==1) { - vtkData->SetDimensions(MMSP::x1(GRID)-MMSP::x0(GRID), 1, 1); - vtkData->SetExtent(MMSP::x0(GRID), MMSP::x1(GRID) - 1, 0, 0, 0, 0); - vtkData->SetSpacing(MMSP::dx(GRID, 0), 1, 1); + sparseData->SetDimensions(MMSP::x1(GRID)-MMSP::x0(GRID), 1, 1); + sparseData->SetExtent(MMSP::x0(GRID), MMSP::x1(GRID) - 1, 0, 0, 0, 0); + sparseData->SetSpacing(MMSP::dx(GRID, 0), 1, 1); #if VTK_MAJOR_VERSION <= 5 - vtkData->SetNumberOfScalarComponents(1); - vtkData->SetScalarTypeToDouble(); + sparseData->SetNumberOfScalarComponents(1); + sparseData->SetScalarTypeToDouble(); #else - vtkData->AllocateScalars(VTK_DOUBLE, 1); + sparseData->AllocateScalars(VTK_DOUBLE, 1); #endif MMSP::vector x(1,0); for (x[0]=MMSP::x0(GRID); x[0]& s = GRID(x); - double* pixel = static_cast(vtkData->GetScalarPointer(x[0], 0, 0)); + double* pixel = static_cast(sparseData->GetScalarPointer(x[0], 0, 0)); if (mode==2) { // --max // Export index of field with greatest magnitude int max = 0; for (int h = 1; h < s.length(); h++) if (s.value(h) > s.value(max)) max = h; - pixel[0] = s.index(max); + *pixel = s.index(max); } else if (mode==3) { // --field - pixel[0] = s[field]; + *pixel = s[field]; } else { // --mag is redundant for sparse double sum = 0.0; for (int h = 0; h < s.length(); h++) sum += s.value(h)*s.value(h); - pixel[0] = std::sqrt(sum); + *pixel = std::sqrt(sum); } } } else if (dim==2) { - vtkData->SetDimensions(MMSP::x1(GRID)-MMSP::x0(GRID), + sparseData->SetDimensions(MMSP::x1(GRID)-MMSP::x0(GRID), MMSP::y1(GRID)-MMSP::y0(GRID), 1); - vtkData->SetExtent(MMSP::x0(GRID), MMSP::x1(GRID) - 1, + sparseData->SetExtent(MMSP::x0(GRID), MMSP::x1(GRID) - 1, MMSP::y0(GRID), MMSP::y1(GRID) - 1, 0, 0); - vtkData->SetSpacing(MMSP::dx(GRID, 0), MMSP::dx(GRID, 1), 1); + sparseData->SetSpacing(MMSP::dx(GRID, 0), MMSP::dx(GRID, 1), 1); #if VTK_MAJOR_VERSION <= 5 - vtkData->SetNumberOfScalarComponents(1); - vtkData->SetScalarTypeToDouble(); + sparseData->SetNumberOfScalarComponents(1); + sparseData->SetScalarTypeToDouble(); #else - vtkData->AllocateScalars(VTK_DOUBLE, 1); + sparseData->AllocateScalars(VTK_DOUBLE, 1); #endif MMSP::vector x(2,0); for (x[1]=MMSP::y0(GRID); x[1]& s = GRID(x); - double* pixel = static_cast(vtkData->GetScalarPointer(x[0], x[1], 0)); + double* pixel = static_cast(sparseData->GetScalarPointer(x[0], x[1], 0)); if (mode==2) { // --max // Export index of field with greatest magnitude int max = 0; for (int h = 1; h < s.length(); h++) if (s.value(h) > s.value(max)) max = h; - pixel[0] = s.index(max); + *pixel = s.index(max); } else if (mode==3) { // --field - pixel[0] = s[field]; + *pixel = s[field]; } else { // --mag is redundant for sparse double sum = 0.0; for (int h = 0; h < s.length(); h++) sum += s.value(h)*s.value(h); - pixel[0] = std::sqrt(sum); + *pixel = std::sqrt(sum); } } } } else if (dim==3) { - vtkData->SetDimensions(MMSP::x1(GRID)-MMSP::x0(GRID), + sparseData->SetDimensions(MMSP::x1(GRID)-MMSP::x0(GRID), MMSP::y1(GRID)-MMSP::y0(GRID), MMSP::z1(GRID)-MMSP::z0(GRID)); - vtkData->SetExtent(MMSP::x0(GRID), MMSP::x1(GRID) - 1, + sparseData->SetExtent(MMSP::x0(GRID), MMSP::x1(GRID) - 1, MMSP::y0(GRID), MMSP::y1(GRID) - 1, MMSP::z0(GRID), MMSP::z1(GRID) - 1); - vtkData->SetSpacing(MMSP::dx(GRID, 0), MMSP::dx(GRID, 1), MMSP::dx(GRID, 2)); + sparseData->SetSpacing(MMSP::dx(GRID, 0), MMSP::dx(GRID, 1), MMSP::dx(GRID, 2)); #if VTK_MAJOR_VERSION <= 5 - vtkData->SetNumberOfScalarComponents(1); - vtkData->SetScalarTypeToDouble(); + sparseData->SetNumberOfScalarComponents(1); + sparseData->SetScalarTypeToDouble(); #else - vtkData->AllocateScalars(VTK_DOUBLE, 1); + sparseData->AllocateScalars(VTK_DOUBLE, 1); #endif MMSP::vector x(3,0); @@ -355,38 +355,38 @@ template void print_sparses(std::string filename, const MMS for (x[1]=MMSP::y0(GRID); x[1]& s = GRID(x); - double* pixel = static_cast(vtkData->GetScalarPointer(x[0], x[1], x[2])); + double* pixel = static_cast(sparseData->GetScalarPointer(x[0], x[1], x[2])); if (mode==2) { // --max // Export index of field with greatest magnitude int max = 0; for (int h = 1; h < s.length(); h++) if (s.value(h) > s.value(max)) max = h; - pixel[0] = s.index(max); + *pixel = s.index(max); } else if (mode==3) { // --field - pixel[0] = s[field]; + *pixel = s[field]; } else { // --mag is redundant for sparse double sum = 0.0; for (int h = 0; h < s.length(); h++) sum += s.value(h)*s.value(h); - pixel[0] = std::sqrt(sum); + *pixel = std::sqrt(sum); } } } } } - vtkData->GetPointData()->GetAbstractArray(0)->SetName("sparse_data"); + sparseData->GetPointData()->GetAbstractArray(0)->SetName("sparse_data"); vtkSmartPointer writer = vtkSmartPointer::New(); writer->SetFileName(filename.c_str()); #if VTK_MAJOR_VERSION <= 5 - writer->SetInputConnection(vtkData->GetProducerPort()); + writer->SetInputConnection(sparseData->GetProducerPort()); #else - writer->SetInputData(vtkData); + writer->SetInputData(sparseData); #endif writer->Write(); - vtkData = NULL; + sparseData = NULL; writer = NULL; } From dcd0dc7c6ce743d66cb941272c2be4a8873ef86b Mon Sep 17 00:00:00 2001 From: Trevor Keller Date: Wed, 22 Aug 2018 12:57:00 -0400 Subject: [PATCH 17/37] replace mmsp2vti with library-based code --- utility/Makefile | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/utility/Makefile b/utility/Makefile index e7bc230..d110c09 100644 --- a/utility/Makefile +++ b/utility/Makefile @@ -43,12 +43,8 @@ mmsp2pvd : mmsp2pvd.cpp mmsp2tsv : mmsp2tsv.cpp $(compiler) $(flags) $< -o $@ -lz -# convert MMSP grid file to VTK Image file type -mmsp2vti : mmsp2vti.cpp - $(compiler) $(flags) $< -o $@ -lz - # convert MMSP grid file to compressed VTK Image file type -mmsp2vtz : mmsp2vti.cpp +mmsp2vti : mmsp2vti.cpp $(compiler) $(flags) $< -o $@ $(vtklinks) -lz # convert MMSP grid file to XYZ point cloud file type From 459a055275033ab46c666350e32d2c62a36a0751 Mon Sep 17 00:00:00 2001 From: Trevor Keller Date: Wed, 22 Aug 2018 13:49:55 -0400 Subject: [PATCH 18/37] compress VTK data to float instead of double (much smaller files) --- utility/mmsp2vti.cpp | 60 ++++++++++++++++++++++---------------------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/utility/mmsp2vti.cpp b/utility/mmsp2vti.cpp index 9f3b29c..b7e477d 100644 --- a/utility/mmsp2vti.cpp +++ b/utility/mmsp2vti.cpp @@ -21,15 +21,15 @@ template void print_scalars(std::string filename, const MMS scalarData->SetExtent(MMSP::x0(GRID), MMSP::x1(GRID) - 1, 0, 0, 0, 0); scalarData->SetSpacing(MMSP::dx(GRID), 1, 1); #if VTK_MAJOR_VERSION <= 5 - scalarData->SetScalarTypeToDouble(); + scalarData->SetScalarTypeToFloat(); scalarData->SetNumberOfScalarComponents(1); #else - scalarData->AllocateScalars(VTK_DOUBLE, 1); + scalarData->AllocateScalars(VTK_FLOAT, 1); #endif MMSP::vector x(1,0); for (x[0]=MMSP::x0(GRID); x[0](scalarData->GetScalarPointer(x[0], 0, 0)); + float* pixel = static_cast(scalarData->GetScalarPointer(x[0], 0, 0)); if (mode==1) { // --mag *pixel = std::sqrt(GRID(x)*GRID(x)); } else { @@ -45,16 +45,16 @@ template void print_scalars(std::string filename, const MMS 0, 0); scalarData->SetSpacing(MMSP::dx(GRID, 0), MMSP::dx(GRID, 1), 1); #if VTK_MAJOR_VERSION <= 5 - scalarData->SetScalarTypeToDouble(); + scalarData->SetScalarTypeToFloat(); scalarData->SetNumberOfScalarComponents(1); #else - scalarData->AllocateScalars(VTK_DOUBLE, 1); + scalarData->AllocateScalars(VTK_FLOAT, 1); #endif MMSP::vector x(2,0); for (x[1]=MMSP::y0(GRID); x[1](scalarData->GetScalarPointer(x[0], x[1], 0)); + float* pixel = static_cast(scalarData->GetScalarPointer(x[0], x[1], 0)); if (mode==1) { // --mag *pixel = std::sqrt(GRID(x)*GRID(x)); } else { @@ -71,17 +71,17 @@ template void print_scalars(std::string filename, const MMS MMSP::z0(GRID), MMSP::z1(GRID) - 1); scalarData->SetSpacing(MMSP::dx(GRID, 0), MMSP::dx(GRID, 1), MMSP::dx(GRID, 2)); #if VTK_MAJOR_VERSION <= 5 - scalarData->SetScalarTypeToDouble(); + scalarData->SetScalarTypeToFloat(); scalarData->SetNumberOfScalarComponents(1); #else - scalarData->AllocateScalars(VTK_DOUBLE, 1); + scalarData->AllocateScalars(VTK_FLOAT, 1); #endif MMSP::vector x(3,0); for (x[2]=MMSP::z0(GRID); x[2](scalarData->GetScalarPointer(x[0], x[1], x[2])); + float* pixel = static_cast(scalarData->GetScalarPointer(x[0], x[1], x[2])); if (mode==1) { // --mag *pixel = std::sqrt(GRID(x)*GRID(x)); } else { @@ -116,22 +116,22 @@ template void print_vectors(std::string filename, const MMS vectorData->SetExtent(MMSP::x0(GRID), MMSP::x1(GRID) - 1, 0, 0, 0, 0); vectorData->SetSpacing(MMSP::dx(GRID), 1, 1); #if VTK_MAJOR_VERSION <= 5 - vectorData->SetScalarTypeToDouble(); + vectorData->SetScalarTypeToFloat(); if (mode==1 || mode==2 || mode==3) vectorData->SetNumberOfScalarComponents(1); else vectorData->SetNumberOfScalarComponents(MMSP::fields(GRID)); #else if (mode==1 || mode==2 || mode==3) - vectorData->AllocateScalars(VTK_DOUBLE, 1); + vectorData->AllocateScalars(VTK_FLOAT, 1); else - vectorData->AllocateScalars(VTK_DOUBLE, MMSP::fields(GRID)); + vectorData->AllocateScalars(VTK_FLOAT, MMSP::fields(GRID)); #endif MMSP::vector x(1,0); for (x[0]=MMSP::x0(GRID); x[0]& v = GRID(x); - double* pixel = static_cast(vectorData->GetScalarPointer(x[0], 0, 0)); + float* pixel = static_cast(vectorData->GetScalarPointer(x[0], 0, 0)); if (mode==1) { // --mag double sum = 0.0; for (int h = 0; h < v.length(); h++) @@ -160,23 +160,23 @@ template void print_vectors(std::string filename, const MMS 0, 0); vectorData->SetSpacing(MMSP::dx(GRID, 0), MMSP::dx(GRID, 1), 1); #if VTK_MAJOR_VERSION <= 5 - vectorData->SetScalarTypeToDouble(); + vectorData->SetScalarTypeToFloat(); if (mode==1 || mode==2 || mode==3) vectorData->SetNumberOfScalarComponents(1); else vectorData->SetNumberOfScalarComponents(MMSP::fields(GRID)); #else if (mode==1 || mode==2 || mode==3) - vectorData->AllocateScalars(VTK_DOUBLE, 1); + vectorData->AllocateScalars(VTK_FLOAT, 1); else - vectorData->AllocateScalars(VTK_DOUBLE, MMSP::fields(GRID)); + vectorData->AllocateScalars(VTK_FLOAT, MMSP::fields(GRID)); #endif MMSP::vector x(2,0); for (x[1]=MMSP::y0(GRID); x[1]& v = GRID(x); - double* pixel = static_cast(vectorData->GetScalarPointer(x[0], x[1], 0)); + float* pixel = static_cast(vectorData->GetScalarPointer(x[0], x[1], 0)); if (mode==1) { // --mag double sum = 0.0; for (int h = 0; h < v.length(); h++) @@ -206,16 +206,16 @@ template void print_vectors(std::string filename, const MMS MMSP::z0(GRID), MMSP::z1(GRID) - 1); vectorData->SetSpacing(MMSP::dx(GRID, 0), MMSP::dx(GRID, 1), MMSP::dx(GRID, 2)); #if VTK_MAJOR_VERSION <= 5 - vectorData->SetScalarTypeToDouble(); + vectorData->SetScalarTypeToFloat(); if (mode==1 || mode==2 || mode==3) vectorData->SetNumberOfScalarComponents(1); else vectorData->SetNumberOfScalarComponents(MMSP::fields(GRID)); #else if (mode==1 || mode==2 || mode==3) - vectorData->AllocateScalars(VTK_DOUBLE, 1); + vectorData->AllocateScalars(VTK_FLOAT, 1); else - vectorData->AllocateScalars(VTK_DOUBLE, MMSP::fields(GRID)); + vectorData->AllocateScalars(VTK_FLOAT, MMSP::fields(GRID)); #endif MMSP::vector x(3,0); @@ -223,7 +223,7 @@ template void print_vectors(std::string filename, const MMS for (x[1]=MMSP::y0(GRID); x[1]& v = GRID(x); - double* pixel = static_cast(vectorData->GetScalarPointer(x[0], x[1], x[2])); + float* pixel = static_cast(vectorData->GetScalarPointer(x[0], x[1], x[2])); if (mode==1) { // --mag double sum = 0.0; for (int h = 0; h < v.length(); h++) @@ -273,15 +273,15 @@ template void print_sparses(std::string filename, const MMS sparseData->SetSpacing(MMSP::dx(GRID, 0), 1, 1); #if VTK_MAJOR_VERSION <= 5 sparseData->SetNumberOfScalarComponents(1); - sparseData->SetScalarTypeToDouble(); + sparseData->SetScalarTypeToFloat(); #else - sparseData->AllocateScalars(VTK_DOUBLE, 1); + sparseData->AllocateScalars(VTK_FLOAT, 1); #endif MMSP::vector x(1,0); for (x[0]=MMSP::x0(GRID); x[0]& s = GRID(x); - double* pixel = static_cast(sparseData->GetScalarPointer(x[0], 0, 0)); + float* pixel = static_cast(sparseData->GetScalarPointer(x[0], 0, 0)); if (mode==2) { // --max // Export index of field with greatest magnitude int max = 0; @@ -308,16 +308,16 @@ template void print_sparses(std::string filename, const MMS sparseData->SetSpacing(MMSP::dx(GRID, 0), MMSP::dx(GRID, 1), 1); #if VTK_MAJOR_VERSION <= 5 sparseData->SetNumberOfScalarComponents(1); - sparseData->SetScalarTypeToDouble(); + sparseData->SetScalarTypeToFloat(); #else - sparseData->AllocateScalars(VTK_DOUBLE, 1); + sparseData->AllocateScalars(VTK_FLOAT, 1); #endif MMSP::vector x(2,0); for (x[1]=MMSP::y0(GRID); x[1]& s = GRID(x); - double* pixel = static_cast(sparseData->GetScalarPointer(x[0], x[1], 0)); + float* pixel = static_cast(sparseData->GetScalarPointer(x[0], x[1], 0)); if (mode==2) { // --max // Export index of field with greatest magnitude int max = 0; @@ -345,9 +345,9 @@ template void print_sparses(std::string filename, const MMS sparseData->SetSpacing(MMSP::dx(GRID, 0), MMSP::dx(GRID, 1), MMSP::dx(GRID, 2)); #if VTK_MAJOR_VERSION <= 5 sparseData->SetNumberOfScalarComponents(1); - sparseData->SetScalarTypeToDouble(); + sparseData->SetScalarTypeToFloat(); #else - sparseData->AllocateScalars(VTK_DOUBLE, 1); + sparseData->AllocateScalars(VTK_FLOAT, 1); #endif MMSP::vector x(3,0); @@ -355,7 +355,7 @@ template void print_sparses(std::string filename, const MMS for (x[1]=MMSP::y0(GRID); x[1]& s = GRID(x); - double* pixel = static_cast(sparseData->GetScalarPointer(x[0], x[1], x[2])); + float* pixel = static_cast(sparseData->GetScalarPointer(x[0], x[1], x[2])); if (mode==2) { // --max // Export index of field with greatest magnitude int max = 0; From 64b2e9bf51ba94a6013ff49ec2c75bd5fe8211e5 Mon Sep 17 00:00:00 2001 From: Trevor Keller Date: Tue, 16 Oct 2018 11:59:32 -0400 Subject: [PATCH 19/37] fix VTK library detection --- utility/Makefile | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/utility/Makefile b/utility/Makefile index d110c09..48165c6 100644 --- a/utility/Makefile +++ b/utility/Makefile @@ -3,20 +3,13 @@ # Questions/comments to gruberja@gmail.com (Jason Gruber) # find VTK libraries -VTK_SRC = $(shell dirname $(shell locate --limit 1 vtkImageData.h)) -VTK_LIB = $(shell dirname $(shell locate --limit 1 vtkCommonCore.so)) +VTK_SRC = -I $(shell dirname $(shell locate --limit 1 vtkImageData.h)) +VTK_LIB = -L $(shell dirname $(shell locate --limit 1 vtkCommonCore.so)) vtklinks = -lvtkCommonCore -lvtkCommonDataModel -lvtkIOXML -# handle special cases of VTK installation -VTK_DEB = $(shell locate --limit 1 vtkCommonCore-6.3.so) -ifneq ($(VTK_DEB), "") - VTK_LIB = $(shell dirname $(shell locate --limit 1 vtkCommonCore-6.3.so)) - vtklinks = -lvtkCommonCore-6.3 -lvtkCommonDataModel-6.3 -lvtkIOXML-6.3 -endif - # compilers/flags compiler = g++ -flags = -O2 -Wall -I ../include -I $(VTK_SRC) -L $(VTK_LIB) +flags = -O2 -Wall -I ../include $(VTK_SRC) $(VTK_LIB) topo = ../algorithms/topology # conversion programs From b78eb12c7d42e75330a24f7ff5fd18bc53ca20f5 Mon Sep 17 00:00:00 2001 From: Trevor Keller Date: Mon, 4 Mar 2019 17:40:20 -0500 Subject: [PATCH 20/37] add DOI & Zenodo badge --- README.md | 5 ++++- utility/Makefile | 7 ++++--- utility/mmsp2vti.cpp | 9 +++++---- 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 247c6c9..dd044fc 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,7 @@ Mesoscale Microstructure Simulation Project ==== [![Build Status](https://travis-ci.org/mesoscale/mmsp.svg?branch=develop)](https://travis-ci.org/mesoscale/mmsp) +[![DOI](https://zenodo.org/badge/19985417.svg)](https://zenodo.org/badge/latestdoi/19985417) The goal of the Mesoscale Microstructure Simulation Project (MMSP) is to provide a simple, consistent, and extensible programming interface for all grid and mesh based microstructure @@ -54,7 +55,9 @@ The MMSP manual is a work in progress. It is currently the only source for detai *Contact us* -The administrators for the MMSP source code are Jason Gruber (gruberja@gmail.com), Trevor Keller (trevor.keller@gmail.com) and Dan Lewis (lucentdan@gmail.com). Please do not hesitate to send questions or comments. +The administrators for the MMSP source code are Jason Gruber (gruberja@gmail.com), Trevor Keller (trevor.keller@gmail.com) and Dan Lewis (lucentdan@gmail.com). Please do not hesitate to send questions or comments. Please cite using the following DOI: + +[![DOI](https://zenodo.org/badge/19985417.svg)](https://zenodo.org/badge/latestdoi/19985417) This work was supported in part by the US NSF under award #1056704 through the Metals and Metallic Nanostructures Program, Division of Materials Research. diff --git a/utility/Makefile b/utility/Makefile index 48165c6..52db549 100644 --- a/utility/Makefile +++ b/utility/Makefile @@ -9,7 +9,8 @@ vtklinks = -lvtkCommonCore -lvtkCommonDataModel -lvtkIOXML # compilers/flags compiler = g++ -flags = -O2 -Wall -I ../include $(VTK_SRC) $(VTK_LIB) +flags = -O1 -g -Wall -I ../include +vtkflags = $(flags) $(VTK_SRC) $(VTK_LIB) topo = ../algorithms/topology # conversion programs @@ -30,7 +31,7 @@ mmsp2png : mmsp2png.cpp # convert MMSP grid file to ParaView Data file type mmsp2pvd : mmsp2pvd.cpp - $(compiler) $(flags) $< -o $@ -lz + $(compiler) $(vtkflags) $< -o $@ $(vtklinks) -lz # convert MMSP grid file to tab-delimited ASCII (TSV) file type mmsp2tsv : mmsp2tsv.cpp @@ -38,7 +39,7 @@ mmsp2tsv : mmsp2tsv.cpp # convert MMSP grid file to compressed VTK Image file type mmsp2vti : mmsp2vti.cpp - $(compiler) $(flags) $< -o $@ $(vtklinks) -lz + $(compiler) $(vtkflags) $< -o $@ $(vtklinks) -lz # convert MMSP grid file to XYZ point cloud file type mmsp2xyz : mmsp2xyz.cpp diff --git a/utility/mmsp2vti.cpp b/utility/mmsp2vti.cpp index b7e477d..85d3054 100644 --- a/utility/mmsp2vti.cpp +++ b/utility/mmsp2vti.cpp @@ -167,16 +167,16 @@ template void print_vectors(std::string filename, const MMS vectorData->SetNumberOfScalarComponents(MMSP::fields(GRID)); #else if (mode==1 || mode==2 || mode==3) - vectorData->AllocateScalars(VTK_FLOAT, 1); + vectorData->AllocateScalars(VTK_DOUBLE, 1); else - vectorData->AllocateScalars(VTK_FLOAT, MMSP::fields(GRID)); + vectorData->AllocateScalars(VTK_DOUBLE, MMSP::fields(GRID)); #endif MMSP::vector x(2,0); for (x[1]=MMSP::y0(GRID); x[1]& v = GRID(x); - float* pixel = static_cast(vectorData->GetScalarPointer(x[0], x[1], 0)); + double* pixel = static_cast(vectorData->GetScalarPointer(x[0], x[1], 0)); if (mode==1) { // --mag double sum = 0.0; for (int h = 0; h < v.length(); h++) @@ -246,7 +246,8 @@ template void print_vectors(std::string filename, const MMS } } } - vectorData->GetPointData()->GetAbstractArray(0)->SetName("vector_data"); + + // vectorData->GetPointData()->GetAbstractArray(0)->SetName("vector_data"); vtkSmartPointer writer = vtkSmartPointer::New(); writer->SetFileName(filename.c_str()); From 947f6a9dd2e90715a83d1d3d294518bb6b8c9dea Mon Sep 17 00:00:00 2001 From: David Kleiven Date: Fri, 12 Apr 2019 10:40:53 +0200 Subject: [PATCH 21/37] Add tab delimiter in convert scalars --- utility/mmsp2tsv.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/utility/mmsp2tsv.cpp b/utility/mmsp2tsv.cpp index dc12a50..ab0e776 100644 --- a/utility/mmsp2tsv.cpp +++ b/utility/mmsp2tsv.cpp @@ -579,7 +579,7 @@ template void convert_scalars(const MMSP::grid& GRI tsvfil << dx(GRID,0)*x[0]; for (int d=1; d void convert_scalars(const MMSP::grid& GRI tsvfil << dx(GRID,0)*x[0]; for (int d=1; d void convert_scalars(const MMSP::grid& GRI tsvfil << dx(GRID,0)*x[0]; for (int d=1; d Date: Fri, 26 Apr 2019 10:52:37 -0500 Subject: [PATCH 22/37] more efficient PVD generator --- utility/vti2pvd | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100755 utility/vti2pvd diff --git a/utility/vti2pvd b/utility/vti2pvd new file mode 100755 index 0000000..05f1822 --- /dev/null +++ b/utility/vti2pvd @@ -0,0 +1,26 @@ +#!/bin/bash + +# Convert MMSP to VTI + +for f in *.dat; do + if [[ ! -f ${f/dat/vti} ]]; then + mmsp2vti $f + fi +done + +files=($(ls -rt *.dat)) +first=${files[0]} +PVD="${first/.dat/.pvd}" +LEN=${#files[@]} + +echo "" > ${PVD} +echo "" >> ${PVD} +echo " " >> ${PVD} + +for ((i=0;i" >> ${PVD} +done + +echo " " >> ${PVD} +echo "" >> ${PVD} From 4521a422982879bfe17af65993b373555c116195 Mon Sep 17 00:00:00 2001 From: Trevor Keller Date: Fri, 26 Apr 2019 10:55:19 -0500 Subject: [PATCH 23/37] increment optimization level --- utility/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utility/Makefile b/utility/Makefile index 52db549..3239418 100644 --- a/utility/Makefile +++ b/utility/Makefile @@ -9,7 +9,7 @@ vtklinks = -lvtkCommonCore -lvtkCommonDataModel -lvtkIOXML # compilers/flags compiler = g++ -flags = -O1 -g -Wall -I ../include +flags = -O2 -Wall -I ../include vtkflags = $(flags) $(VTK_SRC) $(VTK_LIB) topo = ../algorithms/topology From b626a95ec248d923f32ab2f758ce1047dd4a9907 Mon Sep 17 00:00:00 2001 From: Trevor Keller Date: Fri, 26 Apr 2019 19:21:21 -0400 Subject: [PATCH 24/37] enabled compression, yet uncertain if used --- utility/Makefile | 2 +- utility/mmsp2vti.cpp | 7 ++++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/utility/Makefile b/utility/Makefile index 3239418..08937b7 100644 --- a/utility/Makefile +++ b/utility/Makefile @@ -5,7 +5,7 @@ # find VTK libraries VTK_SRC = -I $(shell dirname $(shell locate --limit 1 vtkImageData.h)) VTK_LIB = -L $(shell dirname $(shell locate --limit 1 vtkCommonCore.so)) -vtklinks = -lvtkCommonCore -lvtkCommonDataModel -lvtkIOXML +vtklinks = -lvtkCommonCore -lvtkCommonDataModel -lvtkIOCore -lvtkIOXML # compilers/flags compiler = g++ diff --git a/utility/mmsp2vti.cpp b/utility/mmsp2vti.cpp index 85d3054..4a5a7a7 100644 --- a/utility/mmsp2vti.cpp +++ b/utility/mmsp2vti.cpp @@ -100,6 +100,8 @@ template void print_scalars(std::string filename, const MMS #else writer->SetInputData(scalarData); #endif + writer->SetDataModeToBinary(); + writer->SetCompressorTypeToZLib(); writer->Write(); scalarData = NULL; @@ -256,7 +258,8 @@ template void print_vectors(std::string filename, const MMS #else writer->SetInputData(vectorData); #endif - + writer->SetDataModeToBinary(); + writer->SetCompressorTypeToZLib(); writer->Write(); vectorData = NULL; @@ -385,6 +388,8 @@ template void print_sparses(std::string filename, const MMS #else writer->SetInputData(sparseData); #endif + writer->SetDataModeToBinary(); + writer->SetCompressorTypeToZLib(); writer->Write(); sparseData = NULL; From 1434505cb0d307cf2d0a9992c3045b1ecacf9595 Mon Sep 17 00:00:00 2001 From: Trevor Keller Date: Mon, 29 Apr 2019 15:17:45 -0400 Subject: [PATCH 25/37] parallelize efficient PVD generator --- utility/vti2pvd | 32 +++++++++++++++++++++++--------- 1 file changed, 23 insertions(+), 9 deletions(-) diff --git a/utility/vti2pvd b/utility/vti2pvd index 05f1822..424b134 100755 --- a/utility/vti2pvd +++ b/utility/vti2pvd @@ -1,24 +1,38 @@ #!/bin/bash +# Convert MMSP data files to VTI, then build PVD summary file -# Convert MMSP to VTI +if [[ $(which parallel) == "" ]]; then + echo "This script depends on GNU parallel. Please install it, then try again." + return 1 +fi -for f in *.dat; do - if [[ ! -f ${f/dat/vti} ]]; then - mmsp2vti $f +Nthreads=$(( $(nproc)/2 )) + +function dat2vti { + if [[ ! -f ${1/dat/vti} ]]; then + mmsp2vti $1 fi -done +} +export -f dat2vti -files=($(ls -rt *.dat)) -first=${files[0]} +fileLst=$(ls -rt *.dat) +fileArr=($(ls -rt *.dat)) +first=${fileArr[0]} PVD="${first/.dat/.pvd}" -LEN=${#files[@]} +LEN=${#fileArr[@]} + +# Convert all data fileArr in parallel + +parallel -j ${Nthreads} dat2vti ::: ${fileLst} + +# Build PVD in serial echo "" > ${PVD} echo "" >> ${PVD} echo " " >> ${PVD} for ((i=0;i" >> ${PVD} done From 96aa4a03d9fa89ece7ab6e21fb76bcae9884a4e8 Mon Sep 17 00:00:00 2001 From: Trevor Keller Date: Tue, 30 Apr 2019 14:55:01 -0400 Subject: [PATCH 26/37] better dependency documentation --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index dd044fc..a36f4f8 100644 --- a/README.md +++ b/README.md @@ -43,11 +43,11 @@ MMSP is nothing more than a collection of C++ header files that declare a number *MMSP requires:* * Minimal programming experience - * An ISO compliant C++ compiler (e.g. GCC 2.95 or later) - * zlib libraries for data compression (e.g. zlib 1.2.7) - * libpng headers for mmsp2png image generation utility (e.g. libpng12-dev) - * libvtk headers for mmsp2vti image generation utility (e.g. libvtk6-dev) - * MPI libraries if compiling parallel programs (e.g. Open MPI) + * An ISO compliant C++ compiler (e.g. `gcc` 2.95 or later) + * zlib libraries for data compression (e.g. `zlib` 1.2.7) + * libpng headers for mmsp2png image generation utility (e.g. `libpng12-dev`) + * ParaView VTK headers for VTI and PVD visualization utilities (e.g. `paraview` and `paraview-dev`) + * MPI libraries if compiling parallel programs (e.g. `openmpi`) *Documentation* From 0b2de187919526d0aaa9fdd2198b9f45b5ed7f27 Mon Sep 17 00:00:00 2001 From: Trevor Keller Date: Wed, 1 May 2019 12:34:05 -0400 Subject: [PATCH 27/37] move VTK writers to separate header --- include/MMSP.hpp | 2 + include/MMSP.output.cpp | 399 ++++++++++++++++++++++++++++++++++++++++ include/MMSP.output.h | 16 ++ include/MMSP.utility.h | 1 - utility/Makefile | 2 +- utility/mmsp2vti.cpp | 392 --------------------------------------- 6 files changed, 418 insertions(+), 394 deletions(-) create mode 100644 include/MMSP.output.cpp create mode 100644 include/MMSP.output.h diff --git a/include/MMSP.hpp b/include/MMSP.hpp index 373f5d3..dba8adb 100644 --- a/include/MMSP.hpp +++ b/include/MMSP.hpp @@ -11,3 +11,5 @@ #include"MMSP.sparse.h" #include"MMSP.grid.h" + +#include"MMSP.output.h" diff --git a/include/MMSP.output.cpp b/include/MMSP.output.cpp new file mode 100644 index 0000000..e81925c --- /dev/null +++ b/include/MMSP.output.cpp @@ -0,0 +1,399 @@ +// MMSP.output.cpp +// Convert MMSP grid data to XML VTK image data format +// Questions/comments to trevor.keller@gmail.com (Trevor Keller) + +#include +#include +#include +#include +#include +#include +#include + +namespace MMSP { + +template void print_scalars(std::string filename, const grid& GRID, const int mode) +{ + vtkSmartPointer scalarData = vtkSmartPointer::New(); + + if (dim==1) { + scalarData->SetDimensions(x1(GRID)-x0(GRID), 1, 1); + scalarData->SetExtent(x0(GRID), x1(GRID) - 1, 0, 0, 0, 0); + scalarData->SetSpacing(dx(GRID), 1, 1); + #if VTK_MAJOR_VERSION <= 5 + scalarData->SetScalarTypeToFloat(); + scalarData->SetNumberOfScalarComponents(1); + #else + scalarData->AllocateScalars(VTK_FLOAT, 1); + #endif + + vector x(1,0); + for (x[0]=x0(GRID); x[0](scalarData->GetScalarPointer(x[0], 0, 0)); + if (mode==1) { // --mag + *pixel = std::sqrt(GRID(x)*GRID(x)); + } else { + *pixel = GRID(x); + } + } + } else if (dim==2) { + scalarData->SetDimensions(x1(GRID)-x0(GRID), + y1(GRID)-y0(GRID), + 1); + scalarData->SetExtent(x0(GRID), x1(GRID) - 1, + y0(GRID), y1(GRID) - 1, + 0, 0); + scalarData->SetSpacing(dx(GRID, 0), dx(GRID, 1), 1); + #if VTK_MAJOR_VERSION <= 5 + scalarData->SetScalarTypeToFloat(); + scalarData->SetNumberOfScalarComponents(1); + #else + scalarData->AllocateScalars(VTK_FLOAT, 1); + #endif + + vector x(2,0); + for (x[1]=y0(GRID); x[1](scalarData->GetScalarPointer(x[0], x[1], 0)); + if (mode==1) { // --mag + *pixel = std::sqrt(GRID(x)*GRID(x)); + } else { + *pixel = GRID(x); + } + } + } + } else if (dim==3) { + scalarData->SetDimensions(x1(GRID)-x0(GRID), + y1(GRID)-y0(GRID), + z1(GRID)-z0(GRID)); + scalarData->SetExtent(x0(GRID), x1(GRID) - 1, + y0(GRID), y1(GRID) - 1, + z0(GRID), z1(GRID) - 1); + scalarData->SetSpacing(dx(GRID, 0), dx(GRID, 1), dx(GRID, 2)); + #if VTK_MAJOR_VERSION <= 5 + scalarData->SetScalarTypeToFloat(); + scalarData->SetNumberOfScalarComponents(1); + #else + scalarData->AllocateScalars(VTK_FLOAT, 1); + #endif + + vector x(3,0); + for (x[2]=z0(GRID); x[2](scalarData->GetScalarPointer(x[0], x[1], x[2])); + if (mode==1) { // --mag + *pixel = std::sqrt(GRID(x)*GRID(x)); + } else { + *pixel = GRID(x); + } + } + } + } + } + scalarData->GetPointData()->GetAbstractArray(0)->SetName("scalar_data"); + + vtkSmartPointer writer = vtkSmartPointer::New(); + writer->SetFileName(filename.c_str()); + #if VTK_MAJOR_VERSION <= 5 + writer->SetInputConnection(scalarData->GetProducerPort()); + #else + writer->SetInputData(scalarData); + #endif + writer->SetDataModeToBinary(); + writer->SetCompressorTypeToZLib(); + writer->Write(); + + scalarData = NULL; + writer = NULL; +} + +template void print_vectors(std::string filename, const grid >& GRID, + const int mode, const int field) +{ + vtkSmartPointer vectorData = vtkSmartPointer::New(); + + if (dim==1) { + vectorData->SetDimensions(x1(GRID)-x0(GRID), 1, 1); + vectorData->SetExtent(x0(GRID), x1(GRID) - 1, 0, 0, 0, 0); + vectorData->SetSpacing(dx(GRID), 1, 1); + #if VTK_MAJOR_VERSION <= 5 + vectorData->SetScalarTypeToFloat(); + if (mode==1 || mode==2 || mode==3) + vectorData->SetNumberOfScalarComponents(1); + else + vectorData->SetNumberOfScalarComponents(fields(GRID)); + #else + if (mode==1 || mode==2 || mode==3) + vectorData->AllocateScalars(VTK_FLOAT, 1); + else + vectorData->AllocateScalars(VTK_FLOAT, fields(GRID)); + #endif + + vector x(1,0); + for (x[0]=x0(GRID); x[0]& v = GRID(x); + float* pixel = static_cast(vectorData->GetScalarPointer(x[0], 0, 0)); + if (mode==1) { // --mag + double sum = 0.0; + for (int h = 0; h < v.length(); h++) + sum += v[h]*v[h]; + *pixel = std::sqrt(sum); + } else if (mode==2) { // --max + // Export index of field with greatest magnitude + int max = 0; + for (int h = 1; h < v.length(); h++) + if (v[h] > v[max]) + max = h; + *pixel = max; + } else if (mode==3) { // --field + *pixel = v[field]; + } else { + for (int h = 0; h < v.length(); h++) + pixel[h] = v[h]; + } + } + } else if (dim==2) { + vectorData->SetDimensions(x1(GRID)-x0(GRID), + y1(GRID)-y0(GRID), + 1); + vectorData->SetExtent(x0(GRID), x1(GRID) - 1, + y0(GRID), y1(GRID) - 1, + 0, 0); + vectorData->SetSpacing(dx(GRID, 0), dx(GRID, 1), 1); + #if VTK_MAJOR_VERSION <= 5 + vectorData->SetScalarTypeToFloat(); + if (mode==1 || mode==2 || mode==3) + vectorData->SetNumberOfScalarComponents(1); + else + vectorData->SetNumberOfScalarComponents(fields(GRID)); + #else + if (mode==1 || mode==2 || mode==3) + vectorData->AllocateScalars(VTK_DOUBLE, 1); + else + vectorData->AllocateScalars(VTK_DOUBLE, fields(GRID)); + #endif + + vector x(2,0); + for (x[1]=y0(GRID); x[1]& v = GRID(x); + double* pixel = static_cast(vectorData->GetScalarPointer(x[0], x[1], 0)); + if (mode==1) { // --mag + double sum = 0.0; + for (int h = 0; h < v.length(); h++) + sum += v[h]*v[h]; + *pixel = std::sqrt(sum); + } else if (mode==2) { // --max + // Export index of field with greatest magnitude + int max = 0; + for (int h = 1; h < v.length(); h++) + if (v[h] > v[max]) + max = h; + *pixel = max; + } else if (mode==3) { // --field + *pixel = v[field]; + } else { + for (int h = 0; h < v.length(); h++) + pixel[h] = v[h]; + } + } + } + } else if (dim==3) { + vectorData->SetDimensions(x1(GRID)-x0(GRID), + y1(GRID)-y0(GRID), + z1(GRID)-z0(GRID)); + vectorData->SetExtent(x0(GRID), x1(GRID) - 1, + y0(GRID), y1(GRID) - 1, + z0(GRID), z1(GRID) - 1); + vectorData->SetSpacing(dx(GRID, 0), dx(GRID, 1), dx(GRID, 2)); + #if VTK_MAJOR_VERSION <= 5 + vectorData->SetScalarTypeToFloat(); + if (mode==1 || mode==2 || mode==3) + vectorData->SetNumberOfScalarComponents(1); + else + vectorData->SetNumberOfScalarComponents(fields(GRID)); + #else + if (mode==1 || mode==2 || mode==3) + vectorData->AllocateScalars(VTK_FLOAT, 1); + else + vectorData->AllocateScalars(VTK_FLOAT, fields(GRID)); + #endif + + vector x(3,0); + for (x[2]=z0(GRID); x[2]& v = GRID(x); + float* pixel = static_cast(vectorData->GetScalarPointer(x[0], x[1], x[2])); + if (mode==1) { // --mag + double sum = 0.0; + for (int h = 0; h < v.length(); h++) + sum += v[h]*v[h]; + *pixel = std::sqrt(sum); + } else if (mode==2) { // --max + // Export index of field with greatest magnitude + int max = 0; + for (int h = 1; h < v.length(); h++) + if (v[h] > v[max]) + max = h; + *pixel = max; + } else if (mode==3) { // --field + *pixel = v[field]; + } else { + for (int h = 0; h < v.length(); h++) + pixel[h] = v[h]; + } + } + } + } + } + + // vectorData->GetPointData()->GetAbstractArray(0)->SetName("vector_data"); + + vtkSmartPointer writer = vtkSmartPointer::New(); + writer->SetFileName(filename.c_str()); + #if VTK_MAJOR_VERSION <= 5 + writer->SetInputConnection(vectorData->GetProducerPort()); + #else + writer->SetInputData(vectorData); + #endif + writer->SetDataModeToBinary(); + writer->SetCompressorTypeToZLib(); + writer->Write(); + + vectorData = NULL; + writer = NULL; +} + +template void print_sparses(std::string filename, const grid >& GRID, + const int mode, const int field) +{ + vtkSmartPointer sparseData = vtkSmartPointer::New(); + + if (dim==1) { + sparseData->SetDimensions(x1(GRID)-x0(GRID), 1, 1); + sparseData->SetExtent(x0(GRID), x1(GRID) - 1, 0, 0, 0, 0); + sparseData->SetSpacing(dx(GRID, 0), 1, 1); + #if VTK_MAJOR_VERSION <= 5 + sparseData->SetNumberOfScalarComponents(1); + sparseData->SetScalarTypeToFloat(); + #else + sparseData->AllocateScalars(VTK_FLOAT, 1); + #endif + + vector x(1,0); + for (x[0]=x0(GRID); x[0]& s = GRID(x); + float* pixel = static_cast(sparseData->GetScalarPointer(x[0], 0, 0)); + if (mode==2) { // --max + // Export index of field with greatest magnitude + int max = 0; + for (int h = 1; h < s.length(); h++) + if (s.value(h) > s.value(max)) + max = h; + *pixel = s.index(max); + } else if (mode==3) { // --field + *pixel = s[field]; + } else { // --mag is redundant for sparse + double sum = 0.0; + for (int h = 0; h < s.length(); h++) + sum += s.value(h)*s.value(h); + *pixel = std::sqrt(sum); + } + } + } else if (dim==2) { + sparseData->SetDimensions(x1(GRID)-x0(GRID), + y1(GRID)-y0(GRID), + 1); + sparseData->SetExtent(x0(GRID), x1(GRID) - 1, + y0(GRID), y1(GRID) - 1, + 0, 0); + sparseData->SetSpacing(dx(GRID, 0), dx(GRID, 1), 1); + #if VTK_MAJOR_VERSION <= 5 + sparseData->SetNumberOfScalarComponents(1); + sparseData->SetScalarTypeToFloat(); + #else + sparseData->AllocateScalars(VTK_FLOAT, 1); + #endif + + vector x(2,0); + for (x[1]=y0(GRID); x[1]& s = GRID(x); + float* pixel = static_cast(sparseData->GetScalarPointer(x[0], x[1], 0)); + if (mode==2) { // --max + // Export index of field with greatest magnitude + int max = 0; + for (int h = 1; h < s.length(); h++) + if (s.value(h) > s.value(max)) + max = h; + *pixel = s.index(max); + } else if (mode==3) { // --field + *pixel = s[field]; + } else { // --mag is redundant for sparse + double sum = 0.0; + for (int h = 0; h < s.length(); h++) + sum += s.value(h)*s.value(h); + *pixel = std::sqrt(sum); + } + } + } + } else if (dim==3) { + sparseData->SetDimensions(x1(GRID)-x0(GRID), + y1(GRID)-y0(GRID), + z1(GRID)-z0(GRID)); + sparseData->SetExtent(x0(GRID), x1(GRID) - 1, + y0(GRID), y1(GRID) - 1, + z0(GRID), z1(GRID) - 1); + sparseData->SetSpacing(dx(GRID, 0), dx(GRID, 1), dx(GRID, 2)); + #if VTK_MAJOR_VERSION <= 5 + sparseData->SetNumberOfScalarComponents(1); + sparseData->SetScalarTypeToFloat(); + #else + sparseData->AllocateScalars(VTK_FLOAT, 1); + #endif + + vector x(3,0); + for (x[2]=z0(GRID); x[2]& s = GRID(x); + float* pixel = static_cast(sparseData->GetScalarPointer(x[0], x[1], x[2])); + if (mode==2) { // --max + // Export index of field with greatest magnitude + int max = 0; + for (int h = 1; h < s.length(); h++) + if (s.value(h) > s.value(max)) + max = h; + *pixel = s.index(max); + } else if (mode==3) { // --field + *pixel = s[field]; + } else { // --mag is redundant for sparse + double sum = 0.0; + for (int h = 0; h < s.length(); h++) + sum += s.value(h)*s.value(h); + *pixel = std::sqrt(sum); + } + } + } + } + } + sparseData->GetPointData()->GetAbstractArray(0)->SetName("sparse_data"); + + vtkSmartPointer writer = vtkSmartPointer::New(); + writer->SetFileName(filename.c_str()); + #if VTK_MAJOR_VERSION <= 5 + writer->SetInputConnection(sparseData->GetProducerPort()); + #else + writer->SetInputData(sparseData); + #endif + writer->SetDataModeToBinary(); + writer->SetCompressorTypeToZLib(); + writer->Write(); + + sparseData = NULL; + writer = NULL; +} + +} // namespace diff --git a/include/MMSP.output.h b/include/MMSP.output.h new file mode 100644 index 0000000..9f2cf79 --- /dev/null +++ b/include/MMSP.output.h @@ -0,0 +1,16 @@ +// MMSP.output.hpp +// Declaration of MMSP output functions +// Questions/comments to trevor.keller@gmail.com (Trevor Keller) + +#include + +namespace MMSP { + + template void print_scalars(std::string filename, const grid& GRID, const int mode); + template void print_vectors(std::string filename, const grid >& GRID, + const int mode, const int field); + template void print_sparses(std::string filename, const grid >& GRID, + const int mode, const int field); +} // namespace + +#include "MMSP.output.cpp" diff --git a/include/MMSP.utility.h b/include/MMSP.utility.h index 3d0eac4..baa3b2c 100644 --- a/include/MMSP.utility.h +++ b/include/MMSP.utility.h @@ -229,7 +229,6 @@ template T global(T& value, const char* operation); // simple progress bar for the terminal void print_progress(const int step, const int steps); - } // namespace MMSP #include "MMSP.utility.cpp" diff --git a/utility/Makefile b/utility/Makefile index 08937b7..2eb1fc6 100644 --- a/utility/Makefile +++ b/utility/Makefile @@ -38,7 +38,7 @@ mmsp2tsv : mmsp2tsv.cpp $(compiler) $(flags) $< -o $@ -lz # convert MMSP grid file to compressed VTK Image file type -mmsp2vti : mmsp2vti.cpp +mmsp2vti : mmsp2vti.cpp ../include/MMSP.output.h $(compiler) $(vtkflags) $< -o $@ $(vtklinks) -lz # convert MMSP grid file to XYZ point cloud file type diff --git a/utility/mmsp2vti.cpp b/utility/mmsp2vti.cpp index 4a5a7a7..13d7773 100644 --- a/utility/mmsp2vti.cpp +++ b/utility/mmsp2vti.cpp @@ -2,400 +2,8 @@ // Convert MMSP grid data to XML VTK image data format // Questions/comments to gruberja@gmail.com (Jason Gruber) -#include -#include -#include -#include -#include -#include -#include -#include #include "MMSP.hpp" -template void print_scalars(std::string filename, const MMSP::grid& GRID, const int mode) -{ - vtkSmartPointer scalarData = vtkSmartPointer::New(); - - if (dim==1) { - scalarData->SetDimensions(MMSP::x1(GRID)-MMSP::x0(GRID), 1, 1); - scalarData->SetExtent(MMSP::x0(GRID), MMSP::x1(GRID) - 1, 0, 0, 0, 0); - scalarData->SetSpacing(MMSP::dx(GRID), 1, 1); - #if VTK_MAJOR_VERSION <= 5 - scalarData->SetScalarTypeToFloat(); - scalarData->SetNumberOfScalarComponents(1); - #else - scalarData->AllocateScalars(VTK_FLOAT, 1); - #endif - - MMSP::vector x(1,0); - for (x[0]=MMSP::x0(GRID); x[0](scalarData->GetScalarPointer(x[0], 0, 0)); - if (mode==1) { // --mag - *pixel = std::sqrt(GRID(x)*GRID(x)); - } else { - *pixel = GRID(x); - } - } - } else if (dim==2) { - scalarData->SetDimensions(MMSP::x1(GRID)-MMSP::x0(GRID), - MMSP::y1(GRID)-MMSP::y0(GRID), - 1); - scalarData->SetExtent(MMSP::x0(GRID), MMSP::x1(GRID) - 1, - MMSP::y0(GRID), MMSP::y1(GRID) - 1, - 0, 0); - scalarData->SetSpacing(MMSP::dx(GRID, 0), MMSP::dx(GRID, 1), 1); - #if VTK_MAJOR_VERSION <= 5 - scalarData->SetScalarTypeToFloat(); - scalarData->SetNumberOfScalarComponents(1); - #else - scalarData->AllocateScalars(VTK_FLOAT, 1); - #endif - - MMSP::vector x(2,0); - for (x[1]=MMSP::y0(GRID); x[1](scalarData->GetScalarPointer(x[0], x[1], 0)); - if (mode==1) { // --mag - *pixel = std::sqrt(GRID(x)*GRID(x)); - } else { - *pixel = GRID(x); - } - } - } - } else if (dim==3) { - scalarData->SetDimensions(MMSP::x1(GRID)-MMSP::x0(GRID), - MMSP::y1(GRID)-MMSP::y0(GRID), - MMSP::z1(GRID)-MMSP::z0(GRID)); - scalarData->SetExtent(MMSP::x0(GRID), MMSP::x1(GRID) - 1, - MMSP::y0(GRID), MMSP::y1(GRID) - 1, - MMSP::z0(GRID), MMSP::z1(GRID) - 1); - scalarData->SetSpacing(MMSP::dx(GRID, 0), MMSP::dx(GRID, 1), MMSP::dx(GRID, 2)); - #if VTK_MAJOR_VERSION <= 5 - scalarData->SetScalarTypeToFloat(); - scalarData->SetNumberOfScalarComponents(1); - #else - scalarData->AllocateScalars(VTK_FLOAT, 1); - #endif - - MMSP::vector x(3,0); - for (x[2]=MMSP::z0(GRID); x[2](scalarData->GetScalarPointer(x[0], x[1], x[2])); - if (mode==1) { // --mag - *pixel = std::sqrt(GRID(x)*GRID(x)); - } else { - *pixel = GRID(x); - } - } - } - } - } - scalarData->GetPointData()->GetAbstractArray(0)->SetName("scalar_data"); - - vtkSmartPointer writer = vtkSmartPointer::New(); - writer->SetFileName(filename.c_str()); - #if VTK_MAJOR_VERSION <= 5 - writer->SetInputConnection(scalarData->GetProducerPort()); - #else - writer->SetInputData(scalarData); - #endif - writer->SetDataModeToBinary(); - writer->SetCompressorTypeToZLib(); - writer->Write(); - - scalarData = NULL; - writer = NULL; -} - -template void print_vectors(std::string filename, const MMSP::grid >& GRID, - const int mode, const int field) -{ - vtkSmartPointer vectorData = vtkSmartPointer::New(); - - if (dim==1) { - vectorData->SetDimensions(MMSP::x1(GRID)-MMSP::x0(GRID), 1, 1); - vectorData->SetExtent(MMSP::x0(GRID), MMSP::x1(GRID) - 1, 0, 0, 0, 0); - vectorData->SetSpacing(MMSP::dx(GRID), 1, 1); - #if VTK_MAJOR_VERSION <= 5 - vectorData->SetScalarTypeToFloat(); - if (mode==1 || mode==2 || mode==3) - vectorData->SetNumberOfScalarComponents(1); - else - vectorData->SetNumberOfScalarComponents(MMSP::fields(GRID)); - #else - if (mode==1 || mode==2 || mode==3) - vectorData->AllocateScalars(VTK_FLOAT, 1); - else - vectorData->AllocateScalars(VTK_FLOAT, MMSP::fields(GRID)); - #endif - - MMSP::vector x(1,0); - for (x[0]=MMSP::x0(GRID); x[0]& v = GRID(x); - float* pixel = static_cast(vectorData->GetScalarPointer(x[0], 0, 0)); - if (mode==1) { // --mag - double sum = 0.0; - for (int h = 0; h < v.length(); h++) - sum += v[h]*v[h]; - *pixel = std::sqrt(sum); - } else if (mode==2) { // --max - // Export index of field with greatest magnitude - int max = 0; - for (int h = 1; h < v.length(); h++) - if (v[h] > v[max]) - max = h; - *pixel = max; - } else if (mode==3) { // --field - *pixel = v[field]; - } else { - for (int h = 0; h < v.length(); h++) - pixel[h] = v[h]; - } - } - } else if (dim==2) { - vectorData->SetDimensions(MMSP::x1(GRID)-MMSP::x0(GRID), - MMSP::y1(GRID)-MMSP::y0(GRID), - 1); - vectorData->SetExtent(MMSP::x0(GRID), MMSP::x1(GRID) - 1, - MMSP::y0(GRID), MMSP::y1(GRID) - 1, - 0, 0); - vectorData->SetSpacing(MMSP::dx(GRID, 0), MMSP::dx(GRID, 1), 1); - #if VTK_MAJOR_VERSION <= 5 - vectorData->SetScalarTypeToFloat(); - if (mode==1 || mode==2 || mode==3) - vectorData->SetNumberOfScalarComponents(1); - else - vectorData->SetNumberOfScalarComponents(MMSP::fields(GRID)); - #else - if (mode==1 || mode==2 || mode==3) - vectorData->AllocateScalars(VTK_DOUBLE, 1); - else - vectorData->AllocateScalars(VTK_DOUBLE, MMSP::fields(GRID)); - #endif - - MMSP::vector x(2,0); - for (x[1]=MMSP::y0(GRID); x[1]& v = GRID(x); - double* pixel = static_cast(vectorData->GetScalarPointer(x[0], x[1], 0)); - if (mode==1) { // --mag - double sum = 0.0; - for (int h = 0; h < v.length(); h++) - sum += v[h]*v[h]; - *pixel = std::sqrt(sum); - } else if (mode==2) { // --max - // Export index of field with greatest magnitude - int max = 0; - for (int h = 1; h < v.length(); h++) - if (v[h] > v[max]) - max = h; - *pixel = max; - } else if (mode==3) { // --field - *pixel = v[field]; - } else { - for (int h = 0; h < v.length(); h++) - pixel[h] = v[h]; - } - } - } - } else if (dim==3) { - vectorData->SetDimensions(MMSP::x1(GRID)-MMSP::x0(GRID), - MMSP::y1(GRID)-MMSP::y0(GRID), - MMSP::z1(GRID)-MMSP::z0(GRID)); - vectorData->SetExtent(MMSP::x0(GRID), MMSP::x1(GRID) - 1, - MMSP::y0(GRID), MMSP::y1(GRID) - 1, - MMSP::z0(GRID), MMSP::z1(GRID) - 1); - vectorData->SetSpacing(MMSP::dx(GRID, 0), MMSP::dx(GRID, 1), MMSP::dx(GRID, 2)); - #if VTK_MAJOR_VERSION <= 5 - vectorData->SetScalarTypeToFloat(); - if (mode==1 || mode==2 || mode==3) - vectorData->SetNumberOfScalarComponents(1); - else - vectorData->SetNumberOfScalarComponents(MMSP::fields(GRID)); - #else - if (mode==1 || mode==2 || mode==3) - vectorData->AllocateScalars(VTK_FLOAT, 1); - else - vectorData->AllocateScalars(VTK_FLOAT, MMSP::fields(GRID)); - #endif - - MMSP::vector x(3,0); - for (x[2]=MMSP::z0(GRID); x[2]& v = GRID(x); - float* pixel = static_cast(vectorData->GetScalarPointer(x[0], x[1], x[2])); - if (mode==1) { // --mag - double sum = 0.0; - for (int h = 0; h < v.length(); h++) - sum += v[h]*v[h]; - *pixel = std::sqrt(sum); - } else if (mode==2) { // --max - // Export index of field with greatest magnitude - int max = 0; - for (int h = 1; h < v.length(); h++) - if (v[h] > v[max]) - max = h; - *pixel = max; - } else if (mode==3) { // --field - *pixel = v[field]; - } else { - for (int h = 0; h < v.length(); h++) - pixel[h] = v[h]; - } - } - } - } - } - - // vectorData->GetPointData()->GetAbstractArray(0)->SetName("vector_data"); - - vtkSmartPointer writer = vtkSmartPointer::New(); - writer->SetFileName(filename.c_str()); - #if VTK_MAJOR_VERSION <= 5 - writer->SetInputConnection(vectorData->GetProducerPort()); - #else - writer->SetInputData(vectorData); - #endif - writer->SetDataModeToBinary(); - writer->SetCompressorTypeToZLib(); - writer->Write(); - - vectorData = NULL; - writer = NULL; -} - -template void print_sparses(std::string filename, const MMSP::grid >& GRID, - const int mode, const int field) -{ - vtkSmartPointer sparseData = vtkSmartPointer::New(); - - if (dim==1) { - sparseData->SetDimensions(MMSP::x1(GRID)-MMSP::x0(GRID), 1, 1); - sparseData->SetExtent(MMSP::x0(GRID), MMSP::x1(GRID) - 1, 0, 0, 0, 0); - sparseData->SetSpacing(MMSP::dx(GRID, 0), 1, 1); - #if VTK_MAJOR_VERSION <= 5 - sparseData->SetNumberOfScalarComponents(1); - sparseData->SetScalarTypeToFloat(); - #else - sparseData->AllocateScalars(VTK_FLOAT, 1); - #endif - - MMSP::vector x(1,0); - for (x[0]=MMSP::x0(GRID); x[0]& s = GRID(x); - float* pixel = static_cast(sparseData->GetScalarPointer(x[0], 0, 0)); - if (mode==2) { // --max - // Export index of field with greatest magnitude - int max = 0; - for (int h = 1; h < s.length(); h++) - if (s.value(h) > s.value(max)) - max = h; - *pixel = s.index(max); - } else if (mode==3) { // --field - *pixel = s[field]; - } else { // --mag is redundant for sparse - double sum = 0.0; - for (int h = 0; h < s.length(); h++) - sum += s.value(h)*s.value(h); - *pixel = std::sqrt(sum); - } - } - } else if (dim==2) { - sparseData->SetDimensions(MMSP::x1(GRID)-MMSP::x0(GRID), - MMSP::y1(GRID)-MMSP::y0(GRID), - 1); - sparseData->SetExtent(MMSP::x0(GRID), MMSP::x1(GRID) - 1, - MMSP::y0(GRID), MMSP::y1(GRID) - 1, - 0, 0); - sparseData->SetSpacing(MMSP::dx(GRID, 0), MMSP::dx(GRID, 1), 1); - #if VTK_MAJOR_VERSION <= 5 - sparseData->SetNumberOfScalarComponents(1); - sparseData->SetScalarTypeToFloat(); - #else - sparseData->AllocateScalars(VTK_FLOAT, 1); - #endif - - MMSP::vector x(2,0); - for (x[1]=MMSP::y0(GRID); x[1]& s = GRID(x); - float* pixel = static_cast(sparseData->GetScalarPointer(x[0], x[1], 0)); - if (mode==2) { // --max - // Export index of field with greatest magnitude - int max = 0; - for (int h = 1; h < s.length(); h++) - if (s.value(h) > s.value(max)) - max = h; - *pixel = s.index(max); - } else if (mode==3) { // --field - *pixel = s[field]; - } else { // --mag is redundant for sparse - double sum = 0.0; - for (int h = 0; h < s.length(); h++) - sum += s.value(h)*s.value(h); - *pixel = std::sqrt(sum); - } - } - } - } else if (dim==3) { - sparseData->SetDimensions(MMSP::x1(GRID)-MMSP::x0(GRID), - MMSP::y1(GRID)-MMSP::y0(GRID), - MMSP::z1(GRID)-MMSP::z0(GRID)); - sparseData->SetExtent(MMSP::x0(GRID), MMSP::x1(GRID) - 1, - MMSP::y0(GRID), MMSP::y1(GRID) - 1, - MMSP::z0(GRID), MMSP::z1(GRID) - 1); - sparseData->SetSpacing(MMSP::dx(GRID, 0), MMSP::dx(GRID, 1), MMSP::dx(GRID, 2)); - #if VTK_MAJOR_VERSION <= 5 - sparseData->SetNumberOfScalarComponents(1); - sparseData->SetScalarTypeToFloat(); - #else - sparseData->AllocateScalars(VTK_FLOAT, 1); - #endif - - MMSP::vector x(3,0); - for (x[2]=MMSP::z0(GRID); x[2]& s = GRID(x); - float* pixel = static_cast(sparseData->GetScalarPointer(x[0], x[1], x[2])); - if (mode==2) { // --max - // Export index of field with greatest magnitude - int max = 0; - for (int h = 1; h < s.length(); h++) - if (s.value(h) > s.value(max)) - max = h; - *pixel = s.index(max); - } else if (mode==3) { // --field - *pixel = s[field]; - } else { // --mag is redundant for sparse - double sum = 0.0; - for (int h = 0; h < s.length(); h++) - sum += s.value(h)*s.value(h); - *pixel = std::sqrt(sum); - } - } - } - } - } - sparseData->GetPointData()->GetAbstractArray(0)->SetName("sparse_data"); - - vtkSmartPointer writer = vtkSmartPointer::New(); - writer->SetFileName(filename.c_str()); - #if VTK_MAJOR_VERSION <= 5 - writer->SetInputConnection(sparseData->GetProducerPort()); - #else - writer->SetInputData(sparseData); - #endif - writer->SetDataModeToBinary(); - writer->SetCompressorTypeToZLib(); - writer->Write(); - - sparseData = NULL; - writer = NULL; -} - int main(int argc, char* argv[]) { // command line error check From 7b58d8dde1c1ebdbdda96714627e805cab059f2a Mon Sep 17 00:00:00 2001 From: Trevor Keller Date: Wed, 1 May 2019 20:15:36 -0400 Subject: [PATCH 28/37] guard against MPI (unsupported) --- include/MMSP.output.cpp | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/include/MMSP.output.cpp b/include/MMSP.output.cpp index e81925c..2fb8b98 100644 --- a/include/MMSP.output.cpp +++ b/include/MMSP.output.cpp @@ -14,6 +14,11 @@ namespace MMSP { template void print_scalars(std::string filename, const grid& GRID, const int mode) { + #ifdef MPI_VERSION + std::cerr << "Error: cannot write VTK in parallel." < scalarData = vtkSmartPointer::New(); if (dim==1) { @@ -111,6 +116,11 @@ template void print_scalars(std::string filename, const gri template void print_vectors(std::string filename, const grid >& GRID, const int mode, const int field) { + #ifdef MPI_VERSION + std::cerr << "Error: cannot write VTK in parallel." < vectorData = vtkSmartPointer::New(); if (dim==1) { @@ -269,6 +279,11 @@ template void print_vectors(std::string filename, const gri template void print_sparses(std::string filename, const grid >& GRID, const int mode, const int field) { + #ifdef MPI_VERSION + std::cerr << "Error: cannot write VTK in parallel." < sparseData = vtkSmartPointer::New(); if (dim==1) { From cd90cebccee01de3f52d882f3da2b16c0a13c6b3 Mon Sep 17 00:00:00 2001 From: Trevor Keller Date: Thu, 2 May 2019 15:49:57 -0400 Subject: [PATCH 29/37] harmonize VTK writers --- include/MMSP.output.cpp | 6 +- include/MMSP.output.h | 6 +- utility/Makefile | 2 +- utility/mmsp2pvd.cpp | 528 ++++++++++------------------------------ utility/mmsp2vti.cpp | 216 ++++++++-------- utility/vti2pvd | 4 +- 6 files changed, 240 insertions(+), 522 deletions(-) diff --git a/include/MMSP.output.cpp b/include/MMSP.output.cpp index 2fb8b98..f35569a 100644 --- a/include/MMSP.output.cpp +++ b/include/MMSP.output.cpp @@ -12,7 +12,7 @@ namespace MMSP { -template void print_scalars(std::string filename, const grid& GRID, const int mode) +template void scalar_field_to_vtk(std::string filename, const grid& GRID, const int mode) { #ifdef MPI_VERSION std::cerr << "Error: cannot write VTK in parallel." < void print_scalars(std::string filename, const gri writer = NULL; } -template void print_vectors(std::string filename, const grid >& GRID, +template void vector_field_to_vtk(std::string filename, const grid >& GRID, const int mode, const int field) { #ifdef MPI_VERSION @@ -276,7 +276,7 @@ template void print_vectors(std::string filename, const gri writer = NULL; } -template void print_sparses(std::string filename, const grid >& GRID, +template void sparse_field_to_vtk(std::string filename, const grid >& GRID, const int mode, const int field) { #ifdef MPI_VERSION diff --git a/include/MMSP.output.h b/include/MMSP.output.h index 9f2cf79..511ecf1 100644 --- a/include/MMSP.output.h +++ b/include/MMSP.output.h @@ -6,10 +6,10 @@ namespace MMSP { - template void print_scalars(std::string filename, const grid& GRID, const int mode); - template void print_vectors(std::string filename, const grid >& GRID, + template void scalar_field_to_vtk(std::string filename, const grid& GRID, const int mode); + template void vector_field_to_vtk(std::string filename, const grid >& GRID, const int mode, const int field); - template void print_sparses(std::string filename, const grid >& GRID, + template void sparse_field_to_vtk(std::string filename, const grid >& GRID, const int mode, const int field); } // namespace diff --git a/utility/Makefile b/utility/Makefile index 2eb1fc6..2a10d23 100644 --- a/utility/Makefile +++ b/utility/Makefile @@ -30,7 +30,7 @@ mmsp2png : mmsp2png.cpp $(compiler) $(flags) $< -o $@ -lz -lpng # convert MMSP grid file to ParaView Data file type -mmsp2pvd : mmsp2pvd.cpp +mmsp2pvd : mmsp2pvd.cpp ../include/MMSP.output.h $(compiler) $(vtkflags) $< -o $@ $(vtklinks) -lz # convert MMSP grid file to tab-delimited ASCII (TSV) file type diff --git a/utility/mmsp2pvd.cpp b/utility/mmsp2pvd.cpp index 45bf7e8..5244199 100644 --- a/utility/mmsp2pvd.cpp +++ b/utility/mmsp2pvd.cpp @@ -6,197 +6,6 @@ #include #include"MMSP.hpp" -template void print_scalars(std::ofstream& fstr, const MMSP::grid& GRID, const int& mode) -{ - if (dim==1) { - MMSP::vector x(1,0); - for (x[0]=MMSP::x0(GRID); x[0] x(2,0); - for (x[1]=MMSP::y0(GRID); x[1] x(3,0); - for (x[2]=MMSP::z0(GRID); x[2] void print_vectors(std::ofstream& fstr, const MMSP::grid >& GRID, - const int& mode, const int& field) -{ - if (dim==1) { - MMSP::vector x(1,0); - for (x[0]=MMSP::x0(GRID); x[0]& v = GRID(x); - if (mode==1) { // --mag - double sum = 0.0; - for (int h = 0; h < v.length(); h++) - sum += v[h]*v[h]; - fstr << std::sqrt(sum) << " "; - } else if (mode==2) { // --max - // Export index of field with greatest magnitude - int max = 0; - for (int h = 1; h < v.length(); h++) - if (v[h] > v[max]) - max = h; - fstr << max << " "; - } else if (mode==3) { // --field - fstr << v[field] << " "; - } else { - for (int h = 0; h < v.length(); h++) - fstr << v[h] << " "; - } - } - } else if (dim==2) { - MMSP::vector x(2,0); - for (x[1]=MMSP::y0(GRID); x[1]& v = GRID(x); - if (mode==1) { // --mag - double sum = 0.0; - for (int h = 0; h < v.length(); h++) - sum += v[h]*v[h]; - fstr << std::sqrt(sum) << " "; - } else if (mode==2) { // --max - // Export index of field with greatest magnitude - int max = 0; - for (int h = 1; h < v.length(); h++) - if (v[h] > v[max]) - max = h; - fstr << max << " "; - } else if (mode==3) { // --field - fstr << v[field] << " "; - } else { - for (int h = 0; h < v.length(); h++) - fstr << v[h] << " "; - } - } - } - } else if (dim==3) { - MMSP::vector x(3,0); - for (x[2]=MMSP::z0(GRID); x[2]& v = GRID(x); - if (mode==1) { // --mag - double sum = 0.0; - for (int h = 0; h < v.length(); h++) - sum += v[h]*v[h]; - fstr << std::sqrt(sum) << " "; - } else if (mode==2) { // --max - // Export index of field with greatest magnitude - int max = 0; - for (int h = 1; h < v.length(); h++) - if (v[h] > v[max]) - max = h; - fstr << max << " "; - } else if (mode==3) { // --field - fstr << v[field] << " "; - } else { - for (int h = 0; h < v.length(); h++) - fstr << v[h] << " "; - } - } - } - } - } -} - -template void print_sparses(std::ofstream& fstr, const MMSP::grid >& GRID, - const int& mode, const int& field) -{ - if (dim==1) { - MMSP::vector x(1,0); - for (x[0]=MMSP::x0(GRID); x[0]& s = GRID(x); - if (mode==2) { // --max - // Export index of field with greatest magnitude - int max = 0; - for (int h = 1; h < s.length(); h++) - if (s.value(h) > s.value(max)) - max = h; - fstr << s.index(max) << " "; - } else if (mode==3) { // --field - fstr << s[field] << " "; - } else { // --mag is redundant for sparse - double sum = 0.0; - for (int h = 0; h < s.length(); h++) - sum += s.value(h)*s.value(h); - fstr << std::sqrt(sum) << " "; - } - } - } else if (dim==2) { - MMSP::vector x(2,0); - for (x[1]=MMSP::y0(GRID); x[1]& s = GRID(x); - if (mode==2) { // --max - // Export index of field with greatest magnitude - int max = 0; - for (int h = 1; h < s.length(); h++) - if (s.value(h) > s.value(max)) - max = h; - fstr << s.index(max) << " "; - } else if (mode==3) { // --field - fstr << s[field] << " "; - } else { // --mag is redundant for sparse - double sum = 0.0; - for (int h = 0; h < s.length(); h++) - sum += s.value(h)*s.value(h); - fstr << std::sqrt(sum) << " "; - } - } - } - } else if (dim==3) { - MMSP::vector x(3,0); - for (x[2]=MMSP::z0(GRID); x[2]& s = GRID(x); - if (mode==2) { // --max - // Export index of field with greatest magnitude - int max = 0; - for (int h = 1; h < s.length(); h++) - if (s.value(h) > s.value(max)) - max = h; - fstr << s.index(max) << " "; - } else if (mode==3) { // --field - fstr << s[field] << " "; - } else { // --mag is redundant for sparse - double sum = 0.0; - for (int h = 0; h < s.length(); h++) - sum += s.value(h)*s.value(h); - fstr << std::sqrt(sum) << " "; - } - } - } - } - } -} - int main(int argc, char* argv[]) { // command line error check if (argc < 2) { @@ -292,31 +101,28 @@ int main(int argc, char* argv[]) { // process each file on the command line - for (int if_idx = dat_idx; if_idx < argc; if_idx++) { - if (if_idx==pvd_idx) + for (int file_idx = dat_idx; file_idx < argc; file_idx++) { + if (file_idx==pvd_idx) continue; - filename.str(""); // clear stream for new input - // file open error check - input.open(argv[if_idx]); - if (!input) { - std::cerr << "File input error: could not open " << argv[if_idx] << ".\n\n"; - exit(-1); - } // generate output file name - filename << std::string(argv[if_idx]).substr(0, std::string(argv[if_idx]).find_last_of(".")) << ".vti"; + filename.str(""); // clear stream for new input + filename << std::string(argv[file_idx]).substr(0, std::string(argv[file_idx]).find_last_of(".")) << ".vti"; + + // write PVD file data + pvdfile << " \n"; + + // skip pre-existing VTK file + if (std::ifstream(filename.str())) // file exists + continue; // file open error check - std::ofstream output(filename.str().c_str()); - if (!output) { - std::cerr << "File output error: could not open "; - std::cerr << filename.str() << "." << std::endl; + input.open(argv[file_idx]); + if (!input) { + std::cerr << "File input error: could not open " << argv[file_idx] << ".\n\n"; exit(-1); } - // write PVD file data - pvdfile << " \n"; - // read data type std::string type; getline(input, type, '\n'); @@ -382,25 +188,6 @@ int main(int argc, char* argv[]) { // ignore trailing endlines input.ignore(10, '\n'); - // output header markup - output << "\n"; - output << "\n"; - if (dim == 1) { - output << " \n"; - } - if (dim == 2) { - output << " \n"; - } - if (dim == 3) { - output << " \n"; - } - // read number of blocks int blocks; input.read(reinterpret_cast(&blocks), sizeof(blocks)); @@ -421,68 +208,6 @@ int main(int argc, char* argv[]) { input.read(reinterpret_cast(&bhi[j]), sizeof(bhi[j])); } - // write header markup - if (dim == 1) - output << " \n"; - if (dim == 2) - output << " \n"; - if (dim == 3) - output << " \n"; - - // write cell data markup - if (scalar_type || flatten>0) { - output << " \n"; - output << " \n"; - output << " \n"; - output << " \n"; - output << " \n"; - else if (flatten==2) // max - output << " type=\"Int32\" format=\"ascii\">\n"; - else if (bool_type) - output << " type=\"UInt8\" format=\"ascii\">\n"; - else if (char_type) - output << " type=\"Int8\" format=\"ascii\">\n"; - else if (unsigned_char_type) - output << " type=\"UInt8\" format=\"ascii\">\n"; - else if (int_type) - output << " type=\"Int32\" format=\"ascii\">\n"; - else if (unsigned_int_type) - output << " type=\"UInt32\" format=\"ascii\">\n"; - else if (long_type) - output << " type=\"Int32\" format=\"ascii\">\n"; - else if (unsigned_long_type) - output << " type=\"UInt32\" format=\"ascii\">\n"; - else if (short_type) - output << " type=\"Int16\" format=\"ascii\">\n"; - else if (unsigned_short_type) - output << " type=\"UInt16\" format=\"ascii\">\n"; - else if (float_type) - output << " type=\"Float32\" format=\"ascii\">\n"; - else if (double_type) - output << " type=\"Float64\" format=\"ascii\">\n"; - else if (long_double_type) - output << " type=\"Float128\" format=\"ascii\">\n"; - - // read grid data unsigned long size, rawSize; input.read(reinterpret_cast(&rawSize), sizeof(rawSize)); // read raw size @@ -515,185 +240,185 @@ int main(int argc, char* argv[]) { } // write grid data - if (not vector_type and not sparse_type) { // must be scalar or built-in + if (scalar_type or (not vector_type and not sparse_type)) { // must be scalar or built-in if (bool_type) { if (dim == 1) { MMSP::grid<1, MMSP::scalar > GRID(fields, lmin, lmax); GRID.from_buffer(buffer); - print_scalars(output, GRID, flatten); + scalar_field_to_vtk(filename.str(), GRID, flatten); } else if (dim == 2) { MMSP::grid<2, MMSP::scalar > GRID(fields, lmin, lmax); GRID.from_buffer(buffer); - print_scalars(output, GRID, flatten); + scalar_field_to_vtk(filename.str(), GRID, flatten); } else if (dim == 3) { MMSP::grid<3, MMSP::scalar > GRID(fields, lmin, lmax); GRID.from_buffer(buffer); - print_scalars(output, GRID, flatten); + scalar_field_to_vtk(filename.str(), GRID, flatten); } } else if (unsigned_char_type) { if (dim == 1) { MMSP::grid<1, MMSP::scalar > GRID(fields, lmin, lmax); GRID.from_buffer(buffer); - print_scalars(output, GRID, flatten); + scalar_field_to_vtk(filename.str(), GRID, flatten); } else if (dim == 2) { MMSP::grid<2, MMSP::scalar > GRID(fields, lmin, lmax); GRID.from_buffer(buffer); - print_scalars(output, GRID, flatten); + scalar_field_to_vtk(filename.str(), GRID, flatten); } else if (dim == 3) { MMSP::grid<3, MMSP::scalar > GRID(fields, lmin, lmax); GRID.from_buffer(buffer); - print_scalars(output, GRID, flatten); + scalar_field_to_vtk(filename.str(), GRID, flatten); } } else if (char_type) { if (dim == 1) { MMSP::grid<1, MMSP::scalar > GRID(fields, lmin, lmax); GRID.from_buffer(buffer); - print_scalars(output, GRID, flatten); + scalar_field_to_vtk(filename.str(), GRID, flatten); } else if (dim == 2) { MMSP::grid<2, MMSP::scalar > GRID(fields, lmin, lmax); GRID.from_buffer(buffer); - print_scalars(output, GRID, flatten); + scalar_field_to_vtk(filename.str(), GRID, flatten); } else if (dim == 3) { MMSP::grid<3, MMSP::scalar > GRID(fields, lmin, lmax); GRID.from_buffer(buffer); - print_scalars(output, GRID, flatten); + scalar_field_to_vtk(filename.str(), GRID, flatten); } } else if (unsigned_int_type) { if (dim == 1) { MMSP::grid<1, MMSP::scalar > GRID(fields, lmin, lmax); GRID.from_buffer(buffer); - print_scalars(output, GRID, flatten); + scalar_field_to_vtk(filename.str(), GRID, flatten); } else if (dim == 2) { MMSP::grid<2, MMSP::scalar > GRID(fields, lmin, lmax); GRID.from_buffer(buffer); - print_scalars(output, GRID, flatten); + scalar_field_to_vtk(filename.str(), GRID, flatten); } else if (dim == 3) { MMSP::grid<3, MMSP::scalar > GRID(fields, lmin, lmax); GRID.from_buffer(buffer); - print_scalars(output, GRID, flatten); + scalar_field_to_vtk(filename.str(), GRID, flatten); } } else if (int_type) { if (dim == 1) { MMSP::grid<1, MMSP::scalar > GRID(fields, lmin, lmax); GRID.from_buffer(buffer); - print_scalars(output, GRID, flatten); + scalar_field_to_vtk(filename.str(), GRID, flatten); } else if (dim == 2) { MMSP::grid<2, MMSP::scalar > GRID(fields, lmin, lmax); GRID.from_buffer(buffer); - print_scalars(output, GRID, flatten); + scalar_field_to_vtk(filename.str(), GRID, flatten); } else if (dim == 3) { MMSP::grid<3, MMSP::scalar > GRID(fields, lmin, lmax); GRID.from_buffer(buffer); - print_scalars(output, GRID, flatten); + scalar_field_to_vtk(filename.str(), GRID, flatten); } } else if (unsigned_long_type) { if (dim == 1) { MMSP::grid<1, MMSP::scalar > GRID(fields, lmin, lmax); GRID.from_buffer(buffer); - print_scalars(output, GRID, flatten); + scalar_field_to_vtk(filename.str(), GRID, flatten); } else if (dim == 2) { MMSP::grid<2, MMSP::scalar > GRID(fields, lmin, lmax); GRID.from_buffer(buffer); - print_scalars(output, GRID, flatten); + scalar_field_to_vtk(filename.str(), GRID, flatten); } else if (dim == 3) { MMSP::grid<3, MMSP::scalar > GRID(fields, lmin, lmax); GRID.from_buffer(buffer); - print_scalars(output, GRID, flatten); + scalar_field_to_vtk(filename.str(), GRID, flatten); } } else if (long_type) { if (dim == 1) { MMSP::grid<1, MMSP::scalar > GRID(fields, lmin, lmax); GRID.from_buffer(buffer); - print_scalars(output, GRID, flatten); + scalar_field_to_vtk(filename.str(), GRID, flatten); } else if (dim == 2) { MMSP::grid<2, MMSP::scalar > GRID(fields, lmin, lmax); GRID.from_buffer(buffer); - print_scalars(output, GRID, flatten); + scalar_field_to_vtk(filename.str(), GRID, flatten); } else if (dim == 3) { MMSP::grid<3, MMSP::scalar > GRID(fields, lmin, lmax); GRID.from_buffer(buffer); - print_scalars(output, GRID, flatten); + scalar_field_to_vtk(filename.str(), GRID, flatten); } } else if (unsigned_short_type) { if (dim == 1) { MMSP::grid<1, MMSP::scalar > GRID(fields, lmin, lmax); GRID.from_buffer(buffer); - print_scalars(output, GRID, flatten); + scalar_field_to_vtk(filename.str(), GRID, flatten); } else if (dim == 2) { MMSP::grid<2, MMSP::scalar > GRID(fields, lmin, lmax); GRID.from_buffer(buffer); - print_scalars(output, GRID, flatten); + scalar_field_to_vtk(filename.str(), GRID, flatten); } else if (dim == 3) { MMSP::grid<3, MMSP::scalar > GRID(fields, lmin, lmax); GRID.from_buffer(buffer); - print_scalars(output, GRID, flatten); + scalar_field_to_vtk(filename.str(), GRID, flatten); } } else if (short_type) { if (dim == 1) { MMSP::grid<1, MMSP::scalar > GRID(fields, lmin, lmax); GRID.from_buffer(buffer); - print_scalars(output, GRID, flatten); + scalar_field_to_vtk(filename.str(), GRID, flatten); } else if (dim == 2) { MMSP::grid<2, MMSP::scalar > GRID(fields, lmin, lmax); GRID.from_buffer(buffer); - print_scalars(output, GRID, flatten); + scalar_field_to_vtk(filename.str(), GRID, flatten); } else if (dim == 3) { MMSP::grid<3, MMSP::scalar > GRID(fields, lmin, lmax); GRID.from_buffer(buffer); - print_scalars(output, GRID, flatten); + scalar_field_to_vtk(filename.str(), GRID, flatten); } } else if (float_type) { if (dim == 1) { MMSP::grid<1, MMSP::scalar > GRID(fields, lmin, lmax); GRID.from_buffer(buffer); - print_scalars(output, GRID, flatten); + scalar_field_to_vtk(filename.str(), GRID, flatten); } else if (dim == 2) { MMSP::grid<2, MMSP::scalar > GRID(fields, lmin, lmax); GRID.from_buffer(buffer); - print_scalars(output, GRID, flatten); + scalar_field_to_vtk(filename.str(), GRID, flatten); } else if (dim == 3) { MMSP::grid<3, MMSP::scalar > GRID(fields, lmin, lmax); GRID.from_buffer(buffer); - print_scalars(output, GRID, flatten); + scalar_field_to_vtk(filename.str(), GRID, flatten); } } else if (long_double_type) { if (dim == 1) { MMSP::grid<1, MMSP::scalar > GRID(fields, lmin, lmax); GRID.from_buffer(buffer); - print_scalars(output, GRID, flatten); + scalar_field_to_vtk(filename.str(), GRID, flatten); } else if (dim == 2) { MMSP::grid<2, MMSP::scalar > GRID(fields, lmin, lmax); GRID.from_buffer(buffer); - print_scalars(output, GRID, flatten); + scalar_field_to_vtk(filename.str(), GRID, flatten); } else if (dim == 3) { MMSP::grid<3, MMSP::scalar > GRID(fields, lmin, lmax); GRID.from_buffer(buffer); - print_scalars(output, GRID, flatten); + scalar_field_to_vtk(filename.str(), GRID, flatten); } } else if (double_type) { if (dim == 1) { MMSP::grid<1, MMSP::scalar > GRID(fields, lmin, lmax); GRID.from_buffer(buffer); - print_scalars(output, GRID, flatten); + scalar_field_to_vtk(filename.str(), GRID, flatten); } else if (dim == 2) { MMSP::grid<2, MMSP::scalar > GRID(fields, lmin, lmax); GRID.from_buffer(buffer); - print_scalars(output, GRID, flatten); + scalar_field_to_vtk(filename.str(), GRID, flatten); } else if (dim == 3) { MMSP::grid<3, MMSP::scalar > GRID(fields, lmin, lmax); GRID.from_buffer(buffer); - print_scalars(output, GRID, flatten); + scalar_field_to_vtk(filename.str(), GRID, flatten); } } } @@ -703,180 +428,180 @@ int main(int argc, char* argv[]) { if (dim == 1) { MMSP::grid<1, MMSP::vector > GRID(fields, lmin, lmax); GRID.from_buffer(buffer); - print_vectors(output, GRID, flatten, field); + vector_field_to_vtk(filename.str(), GRID, flatten, field); } else if (dim == 2) { MMSP::grid<2, MMSP::vector > GRID(fields, lmin, lmax); GRID.from_buffer(buffer); - print_vectors(output, GRID, flatten, field); + vector_field_to_vtk(filename.str(), GRID, flatten, field); } else if (dim == 3) { MMSP::grid<3, MMSP::vector > GRID(fields, lmin, lmax); GRID.from_buffer(buffer); - print_vectors(output, GRID, flatten, field); + vector_field_to_vtk(filename.str(), GRID, flatten, field); } } else if (unsigned_char_type) { if (dim == 1) { MMSP::grid<1, MMSP::vector > GRID(fields, lmin, lmax); GRID.from_buffer(buffer); - print_vectors(output, GRID, flatten, field); + vector_field_to_vtk(filename.str(), GRID, flatten, field); } else if (dim == 2) { MMSP::grid<2, MMSP::vector > GRID(fields, lmin, lmax); GRID.from_buffer(buffer); - print_vectors(output, GRID, flatten, field); + vector_field_to_vtk(filename.str(), GRID, flatten, field); } else if (dim == 3) { MMSP::grid<3, MMSP::vector > GRID(fields, lmin, lmax); GRID.from_buffer(buffer); - print_vectors(output, GRID, flatten, field); + vector_field_to_vtk(filename.str(), GRID, flatten, field); } } else if (char_type) { if (dim == 1) { MMSP::grid<1, MMSP::vector > GRID(fields, lmin, lmax); GRID.from_buffer(buffer); - print_vectors(output, GRID, flatten, field); + vector_field_to_vtk(filename.str(), GRID, flatten, field); } else if (dim == 2) { MMSP::grid<2, MMSP::vector > GRID(fields, lmin, lmax); GRID.from_buffer(buffer); - print_vectors(output, GRID, flatten, field); + vector_field_to_vtk(filename.str(), GRID, flatten, field); } else if (dim == 3) { MMSP::grid<3, MMSP::vector > GRID(fields, lmin, lmax); GRID.from_buffer(buffer); - print_vectors(output, GRID, flatten, field); + vector_field_to_vtk(filename.str(), GRID, flatten, field); } } else if (unsigned_int_type) { if (dim == 1) { MMSP::grid<1, MMSP::vector > GRID(fields, lmin, lmax); GRID.from_buffer(buffer); - print_vectors(output, GRID, flatten, field); + vector_field_to_vtk(filename.str(), GRID, flatten, field); } else if (dim == 2) { MMSP::grid<2, MMSP::vector > GRID(fields, lmin, lmax); GRID.from_buffer(buffer); - print_vectors(output, GRID, flatten, field); + vector_field_to_vtk(filename.str(), GRID, flatten, field); } else if (dim == 3) { MMSP::grid<3, MMSP::vector > GRID(fields, lmin, lmax); GRID.from_buffer(buffer); - print_vectors(output, GRID, flatten, field); + vector_field_to_vtk(filename.str(), GRID, flatten, field); } } else if (int_type) { if (dim == 1) { MMSP::grid<1, MMSP::vector > GRID(fields, lmin, lmax); GRID.from_buffer(buffer); - print_vectors(output, GRID, flatten, field); + vector_field_to_vtk(filename.str(), GRID, flatten, field); } else if (dim == 2) { MMSP::grid<2, MMSP::vector > GRID(fields, lmin, lmax); GRID.from_buffer(buffer); - print_vectors(output, GRID, flatten, field); + vector_field_to_vtk(filename.str(), GRID, flatten, field); } else if (dim == 3) { MMSP::grid<3, MMSP::vector > GRID(fields, lmin, lmax); GRID.from_buffer(buffer); - print_vectors(output, GRID, flatten, field); + vector_field_to_vtk(filename.str(), GRID, flatten, field); } } else if (unsigned_long_type) { if (dim == 1) { MMSP::grid<1, MMSP::vector > GRID(fields, lmin, lmax); GRID.from_buffer(buffer); - print_vectors(output, GRID, flatten, field); + vector_field_to_vtk(filename.str(), GRID, flatten, field); } else if (dim == 2) { MMSP::grid<2, MMSP::vector > GRID(fields, lmin, lmax); GRID.from_buffer(buffer); - print_vectors(output, GRID, flatten, field); + vector_field_to_vtk(filename.str(), GRID, flatten, field); } else if (dim == 3) { MMSP::grid<3, MMSP::vector > GRID(fields, lmin, lmax); GRID.from_buffer(buffer); - print_vectors(output, GRID, flatten, field); + vector_field_to_vtk(filename.str(), GRID, flatten, field); } } else if (long_type) { if (dim == 1) { MMSP::grid<1, MMSP::vector > GRID(fields, lmin, lmax); GRID.from_buffer(buffer); - print_vectors(output, GRID, flatten, field); + vector_field_to_vtk(filename.str(), GRID, flatten, field); } else if (dim == 2) { MMSP::grid<2, MMSP::vector > GRID(fields, lmin, lmax); GRID.from_buffer(buffer); - print_vectors(output, GRID, flatten, field); + vector_field_to_vtk(filename.str(), GRID, flatten, field); } else if (dim == 3) { MMSP::grid<3, MMSP::vector > GRID(fields, lmin, lmax); GRID.from_buffer(buffer); - print_vectors(output, GRID, flatten, field); + vector_field_to_vtk(filename.str(), GRID, flatten, field); } } else if (unsigned_short_type) { if (dim == 1) { MMSP::grid<1, MMSP::vector > GRID(fields, lmin, lmax); GRID.from_buffer(buffer); - print_vectors(output, GRID, flatten, field); + vector_field_to_vtk(filename.str(), GRID, flatten, field); } else if (dim == 2) { MMSP::grid<2, MMSP::vector > GRID(fields, lmin, lmax); GRID.from_buffer(buffer); - print_vectors(output, GRID, flatten, field); + vector_field_to_vtk(filename.str(), GRID, flatten, field); } else if (dim == 3) { MMSP::grid<3, MMSP::vector > GRID(fields, lmin, lmax); GRID.from_buffer(buffer); - print_vectors(output, GRID, flatten, field); + vector_field_to_vtk(filename.str(), GRID, flatten, field); } } else if (short_type) { if (dim == 1) { MMSP::grid<1, MMSP::vector > GRID(fields, lmin, lmax); GRID.from_buffer(buffer); - print_vectors(output, GRID, flatten, field); + vector_field_to_vtk(filename.str(), GRID, flatten, field); } else if (dim == 2) { MMSP::grid<2, MMSP::vector > GRID(fields, lmin, lmax); GRID.from_buffer(buffer); - print_vectors(output, GRID, flatten, field); + vector_field_to_vtk(filename.str(), GRID, flatten, field); } else if (dim == 3) { MMSP::grid<3, MMSP::vector > GRID(fields, lmin, lmax); GRID.from_buffer(buffer); - print_vectors(output, GRID, flatten, field); + vector_field_to_vtk(filename.str(), GRID, flatten, field); } } else if (float_type) { if (dim == 1) { MMSP::grid<1, MMSP::vector > GRID(fields, lmin, lmax); GRID.from_buffer(buffer); - print_vectors(output, GRID, flatten, field); + vector_field_to_vtk(filename.str(), GRID, flatten, field); } else if (dim == 2) { MMSP::grid<2, MMSP::vector > GRID(fields, lmin, lmax); GRID.from_buffer(buffer); - print_vectors(output, GRID, flatten, field); + vector_field_to_vtk(filename.str(), GRID, flatten, field); } else if (dim == 3) { MMSP::grid<3, MMSP::vector > GRID(fields, lmin, lmax); GRID.from_buffer(buffer); - print_vectors(output, GRID, flatten, field); + vector_field_to_vtk(filename.str(), GRID, flatten, field); } } else if (long_double_type) { if (dim == 1) { MMSP::grid<1, MMSP::vector > GRID(fields, lmin, lmax); GRID.from_buffer(buffer); - print_vectors(output, GRID, flatten, field); + vector_field_to_vtk(filename.str(), GRID, flatten, field); } else if (dim == 2) { MMSP::grid<2, MMSP::vector > GRID(fields, lmin, lmax); GRID.from_buffer(buffer); - print_vectors(output, GRID, flatten, field); + vector_field_to_vtk(filename.str(), GRID, flatten, field); } else if (dim == 3) { MMSP::grid<3, MMSP::vector > GRID(fields, lmin, lmax); GRID.from_buffer(buffer); - print_vectors(output, GRID, flatten, field); + vector_field_to_vtk(filename.str(), GRID, flatten, field); } } else if (double_type) { if (dim == 1) { MMSP::grid<1, MMSP::vector > GRID(fields, lmin, lmax); GRID.from_buffer(buffer); - print_vectors(output, GRID, flatten, field); + vector_field_to_vtk(filename.str(), GRID, flatten, field); } else if (dim == 2) { MMSP::grid<2, MMSP::vector > GRID(fields, lmin, lmax); GRID.from_buffer(buffer); - print_vectors(output, GRID, flatten, field); + vector_field_to_vtk(filename.str(), GRID, flatten, field); } else if (dim == 3) { MMSP::grid<3, MMSP::vector > GRID(fields, lmin, lmax); GRID.from_buffer(buffer); - print_vectors(output, GRID, flatten, field); + vector_field_to_vtk(filename.str(), GRID, flatten, field); } } } @@ -886,180 +611,180 @@ int main(int argc, char* argv[]) { if (dim == 1) { MMSP::grid<1, MMSP::sparse > GRID(fields, lmin, lmax); GRID.from_buffer(buffer); - print_sparses(output, GRID, flatten, field); + sparse_field_to_vtk(filename.str(), GRID, flatten, field); } else if (dim == 2) { MMSP::grid<2, MMSP::sparse > GRID(fields, lmin, lmax); GRID.from_buffer(buffer); - print_sparses(output, GRID, flatten, field); + sparse_field_to_vtk(filename.str(), GRID, flatten, field); } else if (dim == 3) { MMSP::grid<3, MMSP::sparse > GRID(fields, lmin, lmax); GRID.from_buffer(buffer); - print_sparses(output, GRID, flatten, field); + sparse_field_to_vtk(filename.str(), GRID, flatten, field); } } else if (unsigned_char_type) { if (dim == 1) { MMSP::grid<1, MMSP::sparse > GRID(fields, lmin, lmax); GRID.from_buffer(buffer); - print_sparses(output, GRID, flatten, field); + sparse_field_to_vtk(filename.str(), GRID, flatten, field); } else if (dim == 2) { MMSP::grid<2, MMSP::sparse > GRID(fields, lmin, lmax); GRID.from_buffer(buffer); - print_sparses(output, GRID, flatten, field); + sparse_field_to_vtk(filename.str(), GRID, flatten, field); } else if (dim == 3) { MMSP::grid<3, MMSP::sparse > GRID(fields, lmin, lmax); GRID.from_buffer(buffer); - print_sparses(output, GRID, flatten, field); + sparse_field_to_vtk(filename.str(), GRID, flatten, field); } } else if (char_type) { if (dim == 1) { MMSP::grid<1, MMSP::sparse > GRID(fields, lmin, lmax); GRID.from_buffer(buffer); - print_sparses(output, GRID, flatten, field); + sparse_field_to_vtk(filename.str(), GRID, flatten, field); } else if (dim == 2) { MMSP::grid<2, MMSP::sparse > GRID(fields, lmin, lmax); GRID.from_buffer(buffer); - print_sparses(output, GRID, flatten, field); + sparse_field_to_vtk(filename.str(), GRID, flatten, field); } else if (dim == 3) { MMSP::grid<3, MMSP::sparse > GRID(fields, lmin, lmax); GRID.from_buffer(buffer); - print_sparses(output, GRID, flatten, field); + sparse_field_to_vtk(filename.str(), GRID, flatten, field); } } else if (unsigned_int_type) { if (dim == 1) { MMSP::grid<1, MMSP::sparse > GRID(fields, lmin, lmax); GRID.from_buffer(buffer); - print_sparses(output, GRID, flatten, field); + sparse_field_to_vtk(filename.str(), GRID, flatten, field); } else if (dim == 2) { MMSP::grid<2, MMSP::sparse > GRID(fields, lmin, lmax); GRID.from_buffer(buffer); - print_sparses(output, GRID, flatten, field); + sparse_field_to_vtk(filename.str(), GRID, flatten, field); } else if (dim == 3) { MMSP::grid<3, MMSP::sparse > GRID(fields, lmin, lmax); GRID.from_buffer(buffer); - print_sparses(output, GRID, flatten, field); + sparse_field_to_vtk(filename.str(), GRID, flatten, field); } } else if (int_type) { if (dim == 1) { MMSP::grid<1, MMSP::sparse > GRID(fields, lmin, lmax); GRID.from_buffer(buffer); - print_sparses(output, GRID, flatten, field); + sparse_field_to_vtk(filename.str(), GRID, flatten, field); } else if (dim == 2) { MMSP::grid<2, MMSP::sparse > GRID(fields, lmin, lmax); GRID.from_buffer(buffer); - print_sparses(output, GRID, flatten, field); + sparse_field_to_vtk(filename.str(), GRID, flatten, field); } else if (dim == 3) { MMSP::grid<3, MMSP::sparse > GRID(fields, lmin, lmax); GRID.from_buffer(buffer); - print_sparses(output, GRID, flatten, field); + sparse_field_to_vtk(filename.str(), GRID, flatten, field); } } else if (unsigned_long_type) { if (dim == 1) { MMSP::grid<1, MMSP::sparse > GRID(fields, lmin, lmax); GRID.from_buffer(buffer); - print_sparses(output, GRID, flatten, field); + sparse_field_to_vtk(filename.str(), GRID, flatten, field); } else if (dim == 2) { MMSP::grid<2, MMSP::sparse > GRID(fields, lmin, lmax); GRID.from_buffer(buffer); - print_sparses(output, GRID, flatten, field); + sparse_field_to_vtk(filename.str(), GRID, flatten, field); } else if (dim == 3) { MMSP::grid<3, MMSP::sparse > GRID(fields, lmin, lmax); GRID.from_buffer(buffer); - print_sparses(output, GRID, flatten, field); + sparse_field_to_vtk(filename.str(), GRID, flatten, field); } } else if (long_type) { if (dim == 1) { MMSP::grid<1, MMSP::sparse > GRID(fields, lmin, lmax); GRID.from_buffer(buffer); - print_sparses(output, GRID, flatten, field); + sparse_field_to_vtk(filename.str(), GRID, flatten, field); } else if (dim == 2) { MMSP::grid<2, MMSP::sparse > GRID(fields, lmin, lmax); GRID.from_buffer(buffer); - print_sparses(output, GRID, flatten, field); + sparse_field_to_vtk(filename.str(), GRID, flatten, field); } else if (dim == 3) { MMSP::grid<3, MMSP::sparse > GRID(fields, lmin, lmax); GRID.from_buffer(buffer); - print_sparses(output, GRID, flatten, field); + sparse_field_to_vtk(filename.str(), GRID, flatten, field); } } else if (unsigned_short_type) { if (dim == 1) { MMSP::grid<1, MMSP::sparse > GRID(fields, lmin, lmax); GRID.from_buffer(buffer); - print_sparses(output, GRID, flatten, field); + sparse_field_to_vtk(filename.str(), GRID, flatten, field); } else if (dim == 2) { MMSP::grid<2, MMSP::sparse > GRID(fields, lmin, lmax); GRID.from_buffer(buffer); - print_sparses(output, GRID, flatten, field); + sparse_field_to_vtk(filename.str(), GRID, flatten, field); } else if (dim == 3) { MMSP::grid<3, MMSP::sparse > GRID(fields, lmin, lmax); GRID.from_buffer(buffer); - print_sparses(output, GRID, flatten, field); + sparse_field_to_vtk(filename.str(), GRID, flatten, field); } } else if (short_type) { if (dim == 1) { MMSP::grid<1, MMSP::sparse > GRID(fields, lmin, lmax); GRID.from_buffer(buffer); - print_sparses(output, GRID, flatten, field); + sparse_field_to_vtk(filename.str(), GRID, flatten, field); } else if (dim == 2) { MMSP::grid<2, MMSP::sparse > GRID(fields, lmin, lmax); GRID.from_buffer(buffer); - print_sparses(output, GRID, flatten, field); + sparse_field_to_vtk(filename.str(), GRID, flatten, field); } else if (dim == 3) { MMSP::grid<3, MMSP::sparse > GRID(fields, lmin, lmax); GRID.from_buffer(buffer); - print_sparses(output, GRID, flatten, field); + sparse_field_to_vtk(filename.str(), GRID, flatten, field); } } else if (float_type) { if (dim == 1) { MMSP::grid<1, MMSP::sparse > GRID(fields, lmin, lmax); GRID.from_buffer(buffer); - print_sparses(output, GRID, flatten, field); + sparse_field_to_vtk(filename.str(), GRID, flatten, field); } else if (dim == 2) { MMSP::grid<2, MMSP::sparse > GRID(fields, lmin, lmax); GRID.from_buffer(buffer); - print_sparses(output, GRID, flatten, field); + sparse_field_to_vtk(filename.str(), GRID, flatten, field); } else if (dim == 3) { MMSP::grid<3, MMSP::sparse > GRID(fields, lmin, lmax); GRID.from_buffer(buffer); - print_sparses(output, GRID, flatten, field); + sparse_field_to_vtk(filename.str(), GRID, flatten, field); } } else if (long_double_type) { if (dim == 1) { MMSP::grid<1, MMSP::sparse > GRID(fields, lmin, lmax); GRID.from_buffer(buffer); - print_sparses(output, GRID, flatten, field); + sparse_field_to_vtk(filename.str(), GRID, flatten, field); } else if (dim == 2) { MMSP::grid<2, MMSP::sparse > GRID(fields, lmin, lmax); GRID.from_buffer(buffer); - print_sparses(output, GRID, flatten, field); + sparse_field_to_vtk(filename.str(), GRID, flatten, field); } else if (dim == 3) { MMSP::grid<3, MMSP::sparse > GRID(fields, lmin, lmax); GRID.from_buffer(buffer); - print_sparses(output, GRID, flatten, field); + sparse_field_to_vtk(filename.str(), GRID, flatten, field); } } else if (double_type) { if (dim == 1) { MMSP::grid<1, MMSP::sparse > GRID(fields, lmin, lmax); GRID.from_buffer(buffer); - print_sparses(output, GRID, flatten, field); + sparse_field_to_vtk(filename.str(), GRID, flatten, field); } else if (dim == 2) { MMSP::grid<2, MMSP::sparse > GRID(fields, lmin, lmax); GRID.from_buffer(buffer); - print_sparses(output, GRID, flatten, field); + sparse_field_to_vtk(filename.str(), GRID, flatten, field); } else if (dim == 3) { MMSP::grid<3, MMSP::sparse > GRID(fields, lmin, lmax); GRID.from_buffer(buffer); - print_sparses(output, GRID, flatten, field); + sparse_field_to_vtk(filename.str(), GRID, flatten, field); } } } @@ -1067,14 +792,7 @@ int main(int argc, char* argv[]) { // clean up delete [] buffer; - // output closing markup - output << "\n"; - output << " \n"; - output << " \n"; - output << " \n"; } // loop for blocks - output << " \n"; - output << "\n"; input.close(); } // loop for files diff --git a/utility/mmsp2vti.cpp b/utility/mmsp2vti.cpp index 13d7773..d0c5698 100644 --- a/utility/mmsp2vti.cpp +++ b/utility/mmsp2vti.cpp @@ -103,134 +103,134 @@ int main(int argc, char* argv[]) if (bool_type) { if (dim == 1) { MMSP::grid<1, MMSP::scalar > GRID(argv[fileindex]); - print_scalars(filename.str(), GRID, flatten); + scalar_field_to_vtk(filename.str(), GRID, flatten); } else if (dim == 2) { MMSP::grid<2, MMSP::scalar > GRID(argv[fileindex]); - print_scalars(filename.str(), GRID, flatten); + scalar_field_to_vtk(filename.str(), GRID, flatten); } else if (dim == 3) { MMSP::grid<3, MMSP::scalar > GRID(argv[fileindex]); - print_scalars(filename.str(), GRID, flatten); + scalar_field_to_vtk(filename.str(), GRID, flatten); } } else if (unsigned_char_type) { if (dim == 1) { MMSP::grid<1, MMSP::scalar > GRID(argv[fileindex]); - print_scalars(filename.str(), GRID, flatten); + scalar_field_to_vtk(filename.str(), GRID, flatten); } else if (dim == 2) { MMSP::grid<2, MMSP::scalar > GRID(argv[fileindex]); - print_scalars(filename.str(), GRID, flatten); + scalar_field_to_vtk(filename.str(), GRID, flatten); } else if (dim == 3) { MMSP::grid<3, MMSP::scalar > GRID(argv[fileindex]); - print_scalars(filename.str(), GRID, flatten); + scalar_field_to_vtk(filename.str(), GRID, flatten); } } else if (char_type) { if (dim == 1) { MMSP::grid<1, MMSP::scalar > GRID(argv[fileindex]); - print_scalars(filename.str(), GRID, flatten); + scalar_field_to_vtk(filename.str(), GRID, flatten); } else if (dim == 2) { MMSP::grid<2, MMSP::scalar > GRID(argv[fileindex]); - print_scalars(filename.str(), GRID, flatten); + scalar_field_to_vtk(filename.str(), GRID, flatten); } else if (dim == 3) { MMSP::grid<3, MMSP::scalar > GRID(argv[fileindex]); - print_scalars(filename.str(), GRID, flatten); + scalar_field_to_vtk(filename.str(), GRID, flatten); } } else if (unsigned_int_type) { if (dim == 1) { MMSP::grid<1, MMSP::scalar > GRID(argv[fileindex]); - print_scalars(filename.str(), GRID, flatten); + scalar_field_to_vtk(filename.str(), GRID, flatten); } else if (dim == 2) { MMSP::grid<2, MMSP::scalar > GRID(argv[fileindex]); - print_scalars(filename.str(), GRID, flatten); + scalar_field_to_vtk(filename.str(), GRID, flatten); } else if (dim == 3) { MMSP::grid<3, MMSP::scalar > GRID(argv[fileindex]); - print_scalars(filename.str(), GRID, flatten); + scalar_field_to_vtk(filename.str(), GRID, flatten); } } else if (int_type) { if (dim == 1) { MMSP::grid<1, MMSP::scalar > GRID(argv[fileindex]); - print_scalars(filename.str(), GRID, flatten); + scalar_field_to_vtk(filename.str(), GRID, flatten); } else if (dim == 2) { MMSP::grid<2, MMSP::scalar > GRID(argv[fileindex]); - print_scalars(filename.str(), GRID, flatten); + scalar_field_to_vtk(filename.str(), GRID, flatten); } else if (dim == 3) { MMSP::grid<3, MMSP::scalar > GRID(argv[fileindex]); - print_scalars(filename.str(), GRID, flatten); + scalar_field_to_vtk(filename.str(), GRID, flatten); } } else if (unsigned_long_type) { if (dim == 1) { MMSP::grid<1, MMSP::scalar > GRID(argv[fileindex]); - print_scalars(filename.str(), GRID, flatten); + scalar_field_to_vtk(filename.str(), GRID, flatten); } else if (dim == 2) { MMSP::grid<2, MMSP::scalar > GRID(argv[fileindex]); - print_scalars(filename.str(), GRID, flatten); + scalar_field_to_vtk(filename.str(), GRID, flatten); } else if (dim == 3) { MMSP::grid<3, MMSP::scalar > GRID(argv[fileindex]); - print_scalars(filename.str(), GRID, flatten); + scalar_field_to_vtk(filename.str(), GRID, flatten); } } else if (long_type) { if (dim == 1) { MMSP::grid<1, MMSP::scalar > GRID(argv[fileindex]); - print_scalars(filename.str(), GRID, flatten); + scalar_field_to_vtk(filename.str(), GRID, flatten); } else if (dim == 2) { MMSP::grid<2, MMSP::scalar > GRID(argv[fileindex]); - print_scalars(filename.str(), GRID, flatten); + scalar_field_to_vtk(filename.str(), GRID, flatten); } else if (dim == 3) { MMSP::grid<3, MMSP::scalar > GRID(argv[fileindex]); - print_scalars(filename.str(), GRID, flatten); + scalar_field_to_vtk(filename.str(), GRID, flatten); } } else if (unsigned_short_type) { if (dim == 1) { MMSP::grid<1, MMSP::scalar > GRID(argv[fileindex]); - print_scalars(filename.str(), GRID, flatten); + scalar_field_to_vtk(filename.str(), GRID, flatten); } else if (dim == 2) { MMSP::grid<2, MMSP::scalar > GRID(argv[fileindex]); - print_scalars(filename.str(), GRID, flatten); + scalar_field_to_vtk(filename.str(), GRID, flatten); } else if (dim == 3) { MMSP::grid<3, MMSP::scalar > GRID(argv[fileindex]); - print_scalars(filename.str(), GRID, flatten); + scalar_field_to_vtk(filename.str(), GRID, flatten); } } else if (short_type) { if (dim == 1) { MMSP::grid<1, MMSP::scalar > GRID(argv[fileindex]); - print_scalars(filename.str(), GRID, flatten); + scalar_field_to_vtk(filename.str(), GRID, flatten); } else if (dim == 2) { MMSP::grid<2, MMSP::scalar > GRID(argv[fileindex]); - print_scalars(filename.str(), GRID, flatten); + scalar_field_to_vtk(filename.str(), GRID, flatten); } else if (dim == 3) { MMSP::grid<3, MMSP::scalar > GRID(argv[fileindex]); - print_scalars(filename.str(), GRID, flatten); + scalar_field_to_vtk(filename.str(), GRID, flatten); } } else if (float_type) { if (dim == 1) { MMSP::grid<1, MMSP::scalar > GRID(argv[fileindex]); - print_scalars(filename.str(), GRID, flatten); + scalar_field_to_vtk(filename.str(), GRID, flatten); } else if (dim == 2) { MMSP::grid<2, MMSP::scalar > GRID(argv[fileindex]); - print_scalars(filename.str(), GRID, flatten); + scalar_field_to_vtk(filename.str(), GRID, flatten); } else if (dim == 3) { MMSP::grid<3, MMSP::scalar > GRID(argv[fileindex]); - print_scalars(filename.str(), GRID, flatten); + scalar_field_to_vtk(filename.str(), GRID, flatten); } } else if (long_double_type) { if (dim == 1) { MMSP::grid<1, MMSP::scalar > GRID(argv[fileindex]); - print_scalars(filename.str(), GRID, flatten); + scalar_field_to_vtk(filename.str(), GRID, flatten); } else if (dim == 2) { MMSP::grid<2, MMSP::scalar > GRID(argv[fileindex]); - print_scalars(filename.str(), GRID, flatten); + scalar_field_to_vtk(filename.str(), GRID, flatten); } else if (dim == 3) { MMSP::grid<3, MMSP::scalar > GRID(argv[fileindex]); - print_scalars(filename.str(), GRID, flatten); + scalar_field_to_vtk(filename.str(), GRID, flatten); } } else if (double_type) { if (dim == 1) { MMSP::grid<1, MMSP::scalar > GRID(argv[fileindex]); - print_scalars(filename.str(), GRID, flatten); + scalar_field_to_vtk(filename.str(), GRID, flatten); } else if (dim == 2) { MMSP::grid<2, MMSP::scalar > GRID(argv[fileindex]); - print_scalars(filename.str(), GRID, flatten); + scalar_field_to_vtk(filename.str(), GRID, flatten); } else if (dim == 3) { MMSP::grid<3, MMSP::scalar > GRID(argv[fileindex]); - print_scalars(filename.str(), GRID, flatten); + scalar_field_to_vtk(filename.str(), GRID, flatten); } } } @@ -239,134 +239,134 @@ int main(int argc, char* argv[]) if (bool_type) { if (dim == 1) { MMSP::grid<1, MMSP::vector > GRID(argv[fileindex]); - print_vectors(filename.str(), GRID, flatten, field); + vector_field_to_vtk(filename.str(), GRID, flatten, field); } else if (dim == 2) { MMSP::grid<2, MMSP::vector > GRID(argv[fileindex]); - print_vectors(filename.str(), GRID, flatten, field); + vector_field_to_vtk(filename.str(), GRID, flatten, field); } else if (dim == 3) { MMSP::grid<3, MMSP::vector > GRID(argv[fileindex]); - print_vectors(filename.str(), GRID, flatten, field); + vector_field_to_vtk(filename.str(), GRID, flatten, field); } } else if (unsigned_char_type) { if (dim == 1) { MMSP::grid<1, MMSP::vector > GRID(argv[fileindex]); - print_vectors(filename.str(), GRID, flatten, field); + vector_field_to_vtk(filename.str(), GRID, flatten, field); } else if (dim == 2) { MMSP::grid<2, MMSP::vector > GRID(argv[fileindex]); - print_vectors(filename.str(), GRID, flatten, field); + vector_field_to_vtk(filename.str(), GRID, flatten, field); } else if (dim == 3) { MMSP::grid<3, MMSP::vector > GRID(argv[fileindex]); - print_vectors(filename.str(), GRID, flatten, field); + vector_field_to_vtk(filename.str(), GRID, flatten, field); } } else if (char_type) { if (dim == 1) { MMSP::grid<1, MMSP::vector > GRID(argv[fileindex]); - print_vectors(filename.str(), GRID, flatten, field); + vector_field_to_vtk(filename.str(), GRID, flatten, field); } else if (dim == 2) { MMSP::grid<2, MMSP::vector > GRID(argv[fileindex]); - print_vectors(filename.str(), GRID, flatten, field); + vector_field_to_vtk(filename.str(), GRID, flatten, field); } else if (dim == 3) { MMSP::grid<3, MMSP::vector > GRID(argv[fileindex]); - print_vectors(filename.str(), GRID, flatten, field); + vector_field_to_vtk(filename.str(), GRID, flatten, field); } } else if (unsigned_int_type) { if (dim == 1) { MMSP::grid<1, MMSP::vector > GRID(argv[fileindex]); - print_vectors(filename.str(), GRID, flatten, field); + vector_field_to_vtk(filename.str(), GRID, flatten, field); } else if (dim == 2) { MMSP::grid<2, MMSP::vector > GRID(argv[fileindex]); - print_vectors(filename.str(), GRID, flatten, field); + vector_field_to_vtk(filename.str(), GRID, flatten, field); } else if (dim == 3) { MMSP::grid<3, MMSP::vector > GRID(argv[fileindex]); - print_vectors(filename.str(), GRID, flatten, field); + vector_field_to_vtk(filename.str(), GRID, flatten, field); } } else if (int_type) { if (dim == 1) { MMSP::grid<1, MMSP::vector > GRID(argv[fileindex]); - print_vectors(filename.str(), GRID, flatten, field); + vector_field_to_vtk(filename.str(), GRID, flatten, field); } else if (dim == 2) { MMSP::grid<2, MMSP::vector > GRID(argv[fileindex]); - print_vectors(filename.str(), GRID, flatten, field); + vector_field_to_vtk(filename.str(), GRID, flatten, field); } else if (dim == 3) { MMSP::grid<3, MMSP::vector > GRID(argv[fileindex]); - print_vectors(filename.str(), GRID, flatten, field); + vector_field_to_vtk(filename.str(), GRID, flatten, field); } } else if (unsigned_long_type) { if (dim == 1) { MMSP::grid<1, MMSP::vector > GRID(argv[fileindex]); - print_vectors(filename.str(), GRID, flatten, field); + vector_field_to_vtk(filename.str(), GRID, flatten, field); } else if (dim == 2) { MMSP::grid<2, MMSP::vector > GRID(argv[fileindex]); - print_vectors(filename.str(), GRID, flatten, field); + vector_field_to_vtk(filename.str(), GRID, flatten, field); } else if (dim == 3) { MMSP::grid<3, MMSP::vector > GRID(argv[fileindex]); - print_vectors(filename.str(), GRID, flatten, field); + vector_field_to_vtk(filename.str(), GRID, flatten, field); } } else if (long_type) { if (dim == 1) { MMSP::grid<1, MMSP::vector > GRID(argv[fileindex]); - print_vectors(filename.str(), GRID, flatten, field); + vector_field_to_vtk(filename.str(), GRID, flatten, field); } else if (dim == 2) { MMSP::grid<2, MMSP::vector > GRID(argv[fileindex]); - print_vectors(filename.str(), GRID, flatten, field); + vector_field_to_vtk(filename.str(), GRID, flatten, field); } else if (dim == 3) { MMSP::grid<3, MMSP::vector > GRID(argv[fileindex]); - print_vectors(filename.str(), GRID, flatten, field); + vector_field_to_vtk(filename.str(), GRID, flatten, field); } } else if (unsigned_short_type) { if (dim == 1) { MMSP::grid<1, MMSP::vector > GRID(argv[fileindex]); - print_vectors(filename.str(), GRID, flatten, field); + vector_field_to_vtk(filename.str(), GRID, flatten, field); } else if (dim == 2) { MMSP::grid<2, MMSP::vector > GRID(argv[fileindex]); - print_vectors(filename.str(), GRID, flatten, field); + vector_field_to_vtk(filename.str(), GRID, flatten, field); } else if (dim == 3) { MMSP::grid<3, MMSP::vector > GRID(argv[fileindex]); - print_vectors(filename.str(), GRID, flatten, field); + vector_field_to_vtk(filename.str(), GRID, flatten, field); } } else if (short_type) { if (dim == 1) { MMSP::grid<1, MMSP::vector > GRID(argv[fileindex]); - print_vectors(filename.str(), GRID, flatten, field); + vector_field_to_vtk(filename.str(), GRID, flatten, field); } else if (dim == 2) { MMSP::grid<2, MMSP::vector > GRID(argv[fileindex]); - print_vectors(filename.str(), GRID, flatten, field); + vector_field_to_vtk(filename.str(), GRID, flatten, field); } else if (dim == 3) { MMSP::grid<3, MMSP::vector > GRID(argv[fileindex]); - print_vectors(filename.str(), GRID, flatten, field); + vector_field_to_vtk(filename.str(), GRID, flatten, field); } } else if (float_type) { if (dim == 1) { MMSP::grid<1, MMSP::vector > GRID(argv[fileindex]); - print_vectors(filename.str(), GRID, flatten, field); + vector_field_to_vtk(filename.str(), GRID, flatten, field); } else if (dim == 2) { MMSP::grid<2, MMSP::vector > GRID(argv[fileindex]); - print_vectors(filename.str(), GRID, flatten, field); + vector_field_to_vtk(filename.str(), GRID, flatten, field); } else if (dim == 3) { MMSP::grid<3, MMSP::vector > GRID(argv[fileindex]); - print_vectors(filename.str(), GRID, flatten, field); + vector_field_to_vtk(filename.str(), GRID, flatten, field); } } else if (long_double_type) { if (dim == 1) { MMSP::grid<1, MMSP::vector > GRID(argv[fileindex]); - print_vectors(filename.str(), GRID, flatten, field); + vector_field_to_vtk(filename.str(), GRID, flatten, field); } else if (dim == 2) { MMSP::grid<2, MMSP::vector > GRID(argv[fileindex]); - print_vectors(filename.str(), GRID, flatten, field); + vector_field_to_vtk(filename.str(), GRID, flatten, field); } else if (dim == 3) { MMSP::grid<3, MMSP::vector > GRID(argv[fileindex]); - print_vectors(filename.str(), GRID, flatten, field); + vector_field_to_vtk(filename.str(), GRID, flatten, field); } } else if (double_type) { if (dim == 1) { MMSP::grid<1, MMSP::vector > GRID(argv[fileindex]); - print_vectors(filename.str(), GRID, flatten, field); + vector_field_to_vtk(filename.str(), GRID, flatten, field); } else if (dim == 2) { MMSP::grid<2, MMSP::vector > GRID(argv[fileindex]); - print_vectors(filename.str(), GRID, flatten, field); + vector_field_to_vtk(filename.str(), GRID, flatten, field); } else if (dim == 3) { MMSP::grid<3, MMSP::vector > GRID(argv[fileindex]); - print_vectors(filename.str(), GRID, flatten, field); + vector_field_to_vtk(filename.str(), GRID, flatten, field); } } } @@ -375,134 +375,134 @@ int main(int argc, char* argv[]) if (bool_type) { if (dim == 1) { MMSP::grid<1, MMSP::sparse > GRID(argv[fileindex]); - print_sparses(filename.str(), GRID, flatten, field); + sparse_field_to_vtk(filename.str(), GRID, flatten, field); } else if (dim == 2) { MMSP::grid<2, MMSP::sparse > GRID(argv[fileindex]); - print_sparses(filename.str(), GRID, flatten, field); + sparse_field_to_vtk(filename.str(), GRID, flatten, field); } else if (dim == 3) { MMSP::grid<3, MMSP::sparse > GRID(argv[fileindex]); - print_sparses(filename.str(), GRID, flatten, field); + sparse_field_to_vtk(filename.str(), GRID, flatten, field); } } else if (unsigned_char_type) { if (dim == 1) { MMSP::grid<1, MMSP::sparse > GRID(argv[fileindex]); - print_sparses(filename.str(), GRID, flatten, field); + sparse_field_to_vtk(filename.str(), GRID, flatten, field); } else if (dim == 2) { MMSP::grid<2, MMSP::sparse > GRID(argv[fileindex]); - print_sparses(filename.str(), GRID, flatten, field); + sparse_field_to_vtk(filename.str(), GRID, flatten, field); } else if (dim == 3) { MMSP::grid<3, MMSP::sparse > GRID(argv[fileindex]); - print_sparses(filename.str(), GRID, flatten, field); + sparse_field_to_vtk(filename.str(), GRID, flatten, field); } } else if (char_type) { if (dim == 1) { MMSP::grid<1, MMSP::sparse > GRID(argv[fileindex]); - print_sparses(filename.str(), GRID, flatten, field); + sparse_field_to_vtk(filename.str(), GRID, flatten, field); } else if (dim == 2) { MMSP::grid<2, MMSP::sparse > GRID(argv[fileindex]); - print_sparses(filename.str(), GRID, flatten, field); + sparse_field_to_vtk(filename.str(), GRID, flatten, field); } else if (dim == 3) { MMSP::grid<3, MMSP::sparse > GRID(argv[fileindex]); - print_sparses(filename.str(), GRID, flatten, field); + sparse_field_to_vtk(filename.str(), GRID, flatten, field); } } else if (unsigned_int_type) { if (dim == 1) { MMSP::grid<1, MMSP::sparse > GRID(argv[fileindex]); - print_sparses(filename.str(), GRID, flatten, field); + sparse_field_to_vtk(filename.str(), GRID, flatten, field); } else if (dim == 2) { MMSP::grid<2, MMSP::sparse > GRID(argv[fileindex]); - print_sparses(filename.str(), GRID, flatten, field); + sparse_field_to_vtk(filename.str(), GRID, flatten, field); } else if (dim == 3) { MMSP::grid<3, MMSP::sparse > GRID(argv[fileindex]); - print_sparses(filename.str(), GRID, flatten, field); + sparse_field_to_vtk(filename.str(), GRID, flatten, field); } } else if (int_type) { if (dim == 1) { MMSP::grid<1, MMSP::sparse > GRID(argv[fileindex]); - print_sparses(filename.str(), GRID, flatten, field); + sparse_field_to_vtk(filename.str(), GRID, flatten, field); } else if (dim == 2) { MMSP::grid<2, MMSP::sparse > GRID(argv[fileindex]); - print_sparses(filename.str(), GRID, flatten, field); + sparse_field_to_vtk(filename.str(), GRID, flatten, field); } else if (dim == 3) { MMSP::grid<3, MMSP::sparse > GRID(argv[fileindex]); - print_sparses(filename.str(), GRID, flatten, field); + sparse_field_to_vtk(filename.str(), GRID, flatten, field); } } else if (unsigned_long_type) { if (dim == 1) { MMSP::grid<1, MMSP::sparse > GRID(argv[fileindex]); - print_sparses(filename.str(), GRID, flatten, field); + sparse_field_to_vtk(filename.str(), GRID, flatten, field); } else if (dim == 2) { MMSP::grid<2, MMSP::sparse > GRID(argv[fileindex]); - print_sparses(filename.str(), GRID, flatten, field); + sparse_field_to_vtk(filename.str(), GRID, flatten, field); } else if (dim == 3) { MMSP::grid<3, MMSP::sparse > GRID(argv[fileindex]); - print_sparses(filename.str(), GRID, flatten, field); + sparse_field_to_vtk(filename.str(), GRID, flatten, field); } } else if (long_type) { if (dim == 1) { MMSP::grid<1, MMSP::sparse > GRID(argv[fileindex]); - print_sparses(filename.str(), GRID, flatten, field); + sparse_field_to_vtk(filename.str(), GRID, flatten, field); } else if (dim == 2) { MMSP::grid<2, MMSP::sparse > GRID(argv[fileindex]); - print_sparses(filename.str(), GRID, flatten, field); + sparse_field_to_vtk(filename.str(), GRID, flatten, field); } else if (dim == 3) { MMSP::grid<3, MMSP::sparse > GRID(argv[fileindex]); - print_sparses(filename.str(), GRID, flatten, field); + sparse_field_to_vtk(filename.str(), GRID, flatten, field); } } else if (unsigned_short_type) { if (dim == 1) { MMSP::grid<1, MMSP::sparse > GRID(argv[fileindex]); - print_sparses(filename.str(), GRID, flatten, field); + sparse_field_to_vtk(filename.str(), GRID, flatten, field); } else if (dim == 2) { MMSP::grid<2, MMSP::sparse > GRID(argv[fileindex]); - print_sparses(filename.str(), GRID, flatten, field); + sparse_field_to_vtk(filename.str(), GRID, flatten, field); } else if (dim == 3) { MMSP::grid<3, MMSP::sparse > GRID(argv[fileindex]); - print_sparses(filename.str(), GRID, flatten, field); + sparse_field_to_vtk(filename.str(), GRID, flatten, field); } } else if (short_type) { if (dim == 1) { MMSP::grid<1, MMSP::sparse > GRID(argv[fileindex]); - print_sparses(filename.str(), GRID, flatten, field); + sparse_field_to_vtk(filename.str(), GRID, flatten, field); } else if (dim == 2) { MMSP::grid<2, MMSP::sparse > GRID(argv[fileindex]); - print_sparses(filename.str(), GRID, flatten, field); + sparse_field_to_vtk(filename.str(), GRID, flatten, field); } else if (dim == 3) { MMSP::grid<3, MMSP::sparse > GRID(argv[fileindex]); - print_sparses(filename.str(), GRID, flatten, field); + sparse_field_to_vtk(filename.str(), GRID, flatten, field); } } else if (float_type) { if (dim == 1) { MMSP::grid<1, MMSP::sparse > GRID(argv[fileindex]); - print_sparses(filename.str(), GRID, flatten, field); + sparse_field_to_vtk(filename.str(), GRID, flatten, field); } else if (dim == 2) { MMSP::grid<2, MMSP::sparse > GRID(argv[fileindex]); - print_sparses(filename.str(), GRID, flatten, field); + sparse_field_to_vtk(filename.str(), GRID, flatten, field); } else if (dim == 3) { MMSP::grid<3, MMSP::sparse > GRID(argv[fileindex]); - print_sparses(filename.str(), GRID, flatten, field); + sparse_field_to_vtk(filename.str(), GRID, flatten, field); } } else if (long_double_type) { if (dim == 1) { MMSP::grid<1, MMSP::sparse > GRID(argv[fileindex]); - print_sparses(filename.str(), GRID, flatten, field); + sparse_field_to_vtk(filename.str(), GRID, flatten, field); } else if (dim == 2) { MMSP::grid<2, MMSP::sparse > GRID(argv[fileindex]); - print_sparses(filename.str(), GRID, flatten, field); + sparse_field_to_vtk(filename.str(), GRID, flatten, field); } else if (dim == 3) { MMSP::grid<3, MMSP::sparse > GRID(argv[fileindex]); - print_sparses(filename.str(), GRID, flatten, field); + sparse_field_to_vtk(filename.str(), GRID, flatten, field); } } else if (double_type) { if (dim == 1) { MMSP::grid<1, MMSP::sparse > GRID(argv[fileindex]); - print_sparses(filename.str(), GRID, flatten, field); + sparse_field_to_vtk(filename.str(), GRID, flatten, field); } else if (dim == 2) { MMSP::grid<2, MMSP::sparse > GRID(argv[fileindex]); - print_sparses(filename.str(), GRID, flatten, field); + sparse_field_to_vtk(filename.str(), GRID, flatten, field); } else if (dim == 3) { MMSP::grid<3, MMSP::sparse > GRID(argv[fileindex]); - print_sparses(filename.str(), GRID, flatten, field); + sparse_field_to_vtk(filename.str(), GRID, flatten, field); } } } diff --git a/utility/vti2pvd b/utility/vti2pvd index 424b134..8f5e74f 100755 --- a/utility/vti2pvd +++ b/utility/vti2pvd @@ -3,7 +3,7 @@ if [[ $(which parallel) == "" ]]; then echo "This script depends on GNU parallel. Please install it, then try again." - return 1 + exit 1 fi Nthreads=$(( $(nproc)/2 )) @@ -21,7 +21,7 @@ first=${fileArr[0]} PVD="${first/.dat/.pvd}" LEN=${#fileArr[@]} -# Convert all data fileArr in parallel +# Convert all data files in parallel parallel -j ${Nthreads} dat2vti ::: ${fileLst} From 0e161a742a964398dfc53f34df1db39f157951a0 Mon Sep 17 00:00:00 2001 From: Trevor Keller Date: Thu, 2 May 2019 16:17:55 -0400 Subject: [PATCH 30/37] separate PNG routines, shared include with VTK --- include/MMSP.output.cpp | 532 +++++++++++++++++++++++++++++- include/MMSP.output.h | 45 ++- utility/Makefile | 10 +- utility/mmsp2png.cpp | 710 +++++++--------------------------------- utility/mmsp2pvd.cpp | 8 +- utility/mmsp2vti.cpp | 6 + 6 files changed, 687 insertions(+), 624 deletions(-) diff --git a/include/MMSP.output.cpp b/include/MMSP.output.cpp index f35569a..2d55edf 100644 --- a/include/MMSP.output.cpp +++ b/include/MMSP.output.cpp @@ -4,19 +4,522 @@ #include #include -#include -#include -#include -#include -#include namespace MMSP { -template void scalar_field_to_vtk(std::string filename, const grid& GRID, const int mode) +#ifdef PNG_LIBPNG_VER +int writePNG(const int w, const int h, const int bpp, unsigned char* imData, const char* filename) +{ + #ifdef MPI_VERSION + std::cerr << "Error: cannot write PNG in parallel." < +void scalar_field_to_png(const grid& GRID, + const int& mode, int sliceaxis, int slicelevel, + const double& zoomin, const double& zoomax, + const bool coninv, const std::set& levelset, const int& lvlfield, + const double& contol, const unsigned int& bufsize, unsigned char* buffer) +{ + #ifdef MPI_VERSION + std::cerr << "Error: cannot write PNG in parallel." <max) + max=val; + else if (val x(1,0); + for (x[0] = g0(GRID,0); x[0] < g1(GRID,0); x[0]++) { + double val = GRID(x); + if (mode==1) //mag + val = std::fabs(val); + assert(n::iterator it=levelset.begin(); it!=levelset.end(); it++) + if (std::fabs(val-*it)/std::fabs(*it) x(2,0); + for (x[1] = g1(GRID,1)-1; x[1] >= g0(GRID,1); x[1]--) + for (x[0] = g0(GRID,0); x[0] < g1(GRID,0); x[0]++) { + double val = GRID(x); + if (mode==1) //mag + val = std::fabs(val); + assert(n::iterator it=levelset.begin(); it!=levelset.end(); it++) + if (std::fabs(val-*it)/std::fabs(*it) x(3,0); + for (x[2] = g0(GRID,2); x[2] < g1(GRID,2); x[2]++) + for (x[1] = g1(GRID,1)-1; x[1] >= g0(GRID,1); x[1]--) + for (x[0] = g0(GRID,0); x[0] < g1(GRID,0); x[0]++) { + if (x[sliceaxis]!=slicelevel) // clumsy, but effective + continue; + double val = GRID(x); + if (mode==1) //mag + val = std::fabs(val); + assert(n0) //contour + for (std::set::iterator it=levelset.begin(); it!=levelset.end(); it++) + if (std::fabs(val-*it)/std::fabs(*it) +void vector_field_to_png(const grid >& GRID, + const int& mode, int sliceaxis, int slicelevel, + const double& zoomin, const double& zoomax, + const bool coninv, const std::set& levelset, const int& lvlfield, + const double& contol, const std::set& fieldset, + const unsigned int& bufsize, unsigned char* buffer) +{ + #ifdef MPI_VERSION + std::cerr << "Error: cannot write PNG in parallel." <1) + sum += pow(GRID(n)[i],2.0); + else + sum = GRID(n)[i]; + } else if (mode==1) { // --mag + for (int i=0; i1) + for (std::set::iterator it=fieldset.begin(); it!=fieldset.end(); it++) + sum += pow(GRID(n)[*it],2.0); + else + sum = GRID(n)[*fieldset.begin()]; + } else if (mode==3) { // --exclude + for (int i=0; i::iterator it=fieldset.find(i); + if (it == fieldset.end()) { + if (included>1) + sum += pow(GRID(n)[i],2.0); + else + sum = GRID(n)[i]; + } + } + } + if (mode==1 || included!=1) + sum = std::sqrt(sum); + if (sum>max) + max=sum; + else if (sum x(1,0); + for (x[0] = g0(GRID,0); x[0] < g1(GRID,0); x[0]++) { + double sum=0.0; + if (mode==0) { // default selection + for (int i=0; i1) + sum += pow(GRID(x)[i],2.0); + else + sum = GRID(x)[i]; + } + } else if (mode==1) { // --mag + for (int i=0; i::iterator it=fieldset.begin(); it!=fieldset.end(); it++) + sum += pow(GRID(x)[*it],2.0); + } else if (mode==3) { // --exclude + for (int i=0; i::iterator it=fieldset.find(i); + if (it == fieldset.end()) { + if (included>1) + sum += pow(GRID(x)[i],2.0); + else + sum = GRID(x)[i]; + } + } + } + if (mode==1 || included!=1) + sum = std::sqrt(sum); + assert(n0) // --contour + for (std::set::iterator itl=levelset.begin(); itl!=levelset.end(); itl++) + if (std::fabs(GRID(x)[lvlfield]-*itl)/std::fabs(*itl) x(2,0); + for (x[1] = g1(GRID,1)-1; x[1] >= g0(GRID,1); x[1]--) + for (x[0] = g0(GRID,0); x[0] < g1(GRID,0); x[0]++) { + double sum=0.0; + if (mode==0) { // default selection + for (int i=0; i1) + sum += pow(GRID(x)[i],2.0); + else + sum = GRID(x)[i]; + } + } else if (mode==1) { // --mag + for (int i=0; i::iterator it=fieldset.begin(); it!=fieldset.end(); it++) + sum += pow(GRID(x)[*it],2.0); + } + } else if (mode==3) { // --exclude + for (int i=0; i::iterator it=fieldset.find(i); + if (it == fieldset.end()) { + if (included>1) + sum += pow(GRID(x)[i],2.0); + else + sum = GRID(x)[i]; + } + } + } + if (mode==1 || included!=1) + sum = std::sqrt(sum); + assert(n0) // --contour + for (std::set::iterator itl=levelset.begin(); itl!=levelset.end(); itl++) + if (std::fabs(GRID(x)[lvlfield]-*itl)/std::fabs(*itl) x(3,0); + for (x[2] = g0(GRID,2); x[2] < g1(GRID,2); x[2]++) + for (x[1] = g1(GRID,1)-1; x[1] >= g0(GRID,1); x[1]--) + for (x[0] = g0(GRID,0); x[0] < g1(GRID,0); x[0]++) { + if (x[sliceaxis]!=slicelevel) // clumsy, but effective + continue; + double sum=0.0; + if (mode==0) { // default selection + for (int i=0; i1) + sum += pow(GRID(x)[i],2.0); + else + sum = GRID(x)[i]; + } + } else if (mode==1) { // --mag + for (int i=0; i::iterator it=fieldset.begin(); it!=fieldset.end(); it++) + sum += pow(GRID(x)[*it],2.0); + } else if (mode==3) { // --exclude + for (int i=0; i::iterator it=fieldset.find(i); + if (it == fieldset.end()) { + if (included>1) + sum += pow(GRID(x)[i],2.0); + else + sum = GRID(x)[i]; + } + } + } + if (mode==1 || included!=1) + sum = std::sqrt(sum); + assert(n0) // --contour + for (std::set::iterator itl=levelset.begin(); itl!=levelset.end(); itl++) + if (std::fabs(GRID(x)[lvlfield]-*itl)/std::fabs(*itl) +void sparse_field_to_png(const grid >& GRID, + const int& mode, int sliceaxis, int slicelevel, + const double& zoomin, const double& zoomax, + const bool coninv, const std::set& levelset, const int& lvlfield, + const double& contol, const std::set& fieldset, + const unsigned int& bufsize, unsigned char* buffer) +{ + #ifdef MPI_VERSION + std::cerr << "Error: cannot write PNG in parallel." <::iterator it=fieldset.begin(); it!=fieldset.end(); it++) { + if (included>1) + sum += pow(GRID(n)[*it],2.0); + else + sum = GRID(n)[*it]; + } + } else if (mode==3) { // --exclude + for (int h=0; h::iterator it=fieldset.find(i); + if (it == fieldset.end()) + sum += pow(GRID(n).value(h),2.0); + } + } + if (included!=1) + sum = std::sqrt(sum); + if (sum>max) + max=sum; + else if (sum x(1,0); + for (x[0] = g0(GRID,0); x[0] < g1(GRID,0); x[0]++) { + double sum=0.0; + if (mode<2) { // --mag + for (int h=0; h::iterator it=fieldset.begin(); it!=fieldset.end(); it++) { + if (included>1) + sum += pow(GRID(x)[*it],2.0); + else + sum = GRID(x)[*it]; + } + } else if (mode==3) { // --exclude + for (int h=0; h::iterator it=fieldset.find(i); + if (it == fieldset.end()) + sum += pow(GRID(x).value(h),2.0); + } + } + if (mode!=2 || included!=1) + sum = std::sqrt(sum); + assert(n0) // --contour + for (std::set::iterator itl=levelset.begin(); itl!=levelset.end(); itl++) + if (std::fabs(GRID(x)[lvlfield]-*itl)/std::fabs(*itl) x(2,0); + for (x[1] = g1(GRID,1)-1; x[1] >= g0(GRID,1); x[1]--) + for (x[0] = g0(GRID,0); x[0] < g1(GRID,0); x[0]++) { + double sum=0.0; + if (mode<2) { // --mag + for (int h=0; h::iterator it=fieldset.begin(); it!=fieldset.end(); it++) { + if (included>1) + sum += pow(GRID(x)[*it],2.0); + else + sum = GRID(x)[*it]; + } + } else if (mode==3) { // --exclude + for (int h=0; h::iterator it=fieldset.find(i); + if (it == fieldset.end()) + sum += pow(GRID(x).value(h),2.0); + } + } + if (mode!=2 || included!=1) + sum = std::sqrt(sum); + assert(n0) // --contour + for (std::set::iterator itl=levelset.begin(); itl!=levelset.end(); itl++) + if (std::fabs(GRID(x)[lvlfield]-*itl)/std::fabs(*itl) x(3,0); + for (x[2] = g0(GRID,2); x[2] < g1(GRID,2); x[2]++) + for (x[1] = g1(GRID,1)-1; x[1] >= g0(GRID,1); x[1]--) + for (x[0] = g0(GRID,0); x[0] < g1(GRID,0); x[0]++) { + if (x[sliceaxis]!=slicelevel) // clumsy, but effective + continue; + double sum=0.0; + if (mode<2) { // --mag + for (int h=0; h::iterator it=fieldset.begin(); it!=fieldset.end(); it++) { + if (included>1) + sum += pow(GRID(x)[*it],2.0); + else + sum = GRID(x)[*it]; + } + } else if (mode==3) { // --exclude + for (int h=0; h::iterator it=fieldset.find(i); + if (it == fieldset.end()) + sum += pow(GRID(x).value(h),2.0); + } + } + if (mode!=2 || included!=1) + sum = std::sqrt(sum); + assert(n0) // --contour + for (std::set::iterator itl=levelset.begin(); itl!=levelset.end(); itl++) + if (std::fabs(GRID(x)[lvlfield]-*itl)/std::fabs(*itl) +void scalar_field_to_vtk(std::string filename, const grid& GRID, const int mode) { #ifdef MPI_VERSION std::cerr << "Error: cannot write VTK in parallel." < scalarData = vtkSmartPointer::New(); @@ -113,12 +616,13 @@ template void scalar_field_to_vtk(std::string filename, con writer = NULL; } -template void vector_field_to_vtk(std::string filename, const grid >& GRID, - const int mode, const int field) +template +void vector_field_to_vtk(std::string filename, const grid >& GRID, + const int mode, const int field) { #ifdef MPI_VERSION std::cerr << "Error: cannot write VTK in parallel." < vectorData = vtkSmartPointer::New(); @@ -276,12 +780,13 @@ template void vector_field_to_vtk(std::string filename, con writer = NULL; } -template void sparse_field_to_vtk(std::string filename, const grid >& GRID, - const int mode, const int field) +template +void sparse_field_to_vtk(std::string filename, const grid >& GRID, + const int mode, const int field) { #ifdef MPI_VERSION std::cerr << "Error: cannot write VTK in parallel." < sparseData = vtkSmartPointer::New(); @@ -410,5 +915,6 @@ template void sparse_field_to_vtk(std::string filename, con sparseData = NULL; writer = NULL; } +#endif // VTK } // namespace diff --git a/include/MMSP.output.h b/include/MMSP.output.h index 511ecf1..4ec90be 100644 --- a/include/MMSP.output.h +++ b/include/MMSP.output.h @@ -3,14 +3,49 @@ // Questions/comments to trevor.keller@gmail.com (Trevor Keller) #include +#include namespace MMSP { + #ifdef PNG_LIBPNG_VER + int writePNG(const int w, const int h, const int bpp, unsigned char* imData, const char* filename); + + template + void scalar_field_to_png(const grid& GRID, + const int& mode, int sliceaxis, int slicelevel, + const double& zoomin, const double& zoomax, + const bool coninv, const std::set& levelset, const int& lvlfield, + const double& contol, const unsigned int& bufsize, unsigned char* buffer); + + template + void vector_field_to_png(const grid >& GRID, + const int& mode, int sliceaxis, int slicelevel, + const double& zoomin, const double& zoomax, + const bool coninv, const std::set& levelset, const int& lvlfield, + const double& contol, const std::set& fieldset, + const unsigned int& bufsize, unsigned char* buffer); + + template + void sparse_field_to_png(const grid >& GRID, + const int& mode, int sliceaxis, int slicelevel, + const double& zoomin, const double& zoomax, + const bool coninv, const std::set& leveOBlset, const int& lvlfield, + const double& contol, const std::set& fieldset, + const unsigned int& bufsize, unsigned char* buffer); + #endif // PNG + + #ifdef VTK_VERSION + template + void scalar_field_to_vtk(std::string filename, const grid& GRID, const int mode); + + template + void vector_field_to_vtk(std::string filename, const grid >& GRID, + const int mode, const int field); + + template + void sparse_field_to_vtk(std::string filename, const grid >& GRID, + const int mode, const int field); + #endif // VTK - template void scalar_field_to_vtk(std::string filename, const grid& GRID, const int mode); - template void vector_field_to_vtk(std::string filename, const grid >& GRID, - const int mode, const int field); - template void sparse_field_to_vtk(std::string filename, const grid >& GRID, - const int mode, const int field); } // namespace #include "MMSP.output.cpp" diff --git a/utility/Makefile b/utility/Makefile index 2a10d23..05040c5 100644 --- a/utility/Makefile +++ b/utility/Makefile @@ -5,7 +5,7 @@ # find VTK libraries VTK_SRC = -I $(shell dirname $(shell locate --limit 1 vtkImageData.h)) VTK_LIB = -L $(shell dirname $(shell locate --limit 1 vtkCommonCore.so)) -vtklinks = -lvtkCommonCore -lvtkCommonDataModel -lvtkIOCore -lvtkIOXML +VTK_LNK = -lvtkCommonCore -lvtkCommonDataModel -lvtkIOCore -lvtkIOXML # compilers/flags compiler = g++ @@ -26,12 +26,12 @@ utility : mmsp2vti mmsp2pvd mmsp2png mmsp2tsv mmsp2xyz \ # # convert MMSP grid file to PNG image file type -mmsp2png : mmsp2png.cpp - $(compiler) $(flags) $< -o $@ -lz -lpng +mmsp2png : mmsp2png.cpp ../include/MMSP.output.h + $(compiler) $(flags) $< -o $@ -lpng -lz # convert MMSP grid file to ParaView Data file type mmsp2pvd : mmsp2pvd.cpp ../include/MMSP.output.h - $(compiler) $(vtkflags) $< -o $@ $(vtklinks) -lz + $(compiler) $(vtkflags) $< -o $@ $(VTK_LNK) -lz # convert MMSP grid file to tab-delimited ASCII (TSV) file type mmsp2tsv : mmsp2tsv.cpp @@ -39,7 +39,7 @@ mmsp2tsv : mmsp2tsv.cpp # convert MMSP grid file to compressed VTK Image file type mmsp2vti : mmsp2vti.cpp ../include/MMSP.output.h - $(compiler) $(vtkflags) $< -o $@ $(vtklinks) -lz + $(compiler) $(vtkflags) $< -o $@ $(VTK_LNK) -lz # convert MMSP grid file to XYZ point cloud file type mmsp2xyz : mmsp2xyz.cpp diff --git a/utility/mmsp2png.cpp b/utility/mmsp2png.cpp index 4f4b7a8..fc26bde 100644 --- a/utility/mmsp2png.cpp +++ b/utility/mmsp2png.cpp @@ -10,26 +10,10 @@ #include #include #include -#include +#include #include"MMSP.hpp" -int writePNG(const int w, const int h, const int bpp, unsigned char* imData, const char* filename); - -template void convert_scalars(const MMSP::grid& GRID, - const int& mode, int sliceaxis, int slicelevel, const double& zoomin, const double& zoomax, const bool coninv, - const std::set& levelset, const int& lvlfield, const double& contol, const unsigned int& bufsize, unsigned char* buffer); - -template void convert_vectors(const MMSP::grid >& GRID, - const int& mode, int sliceaxis, int slicelevel, const double& zoomin, const double& zoomax, const bool coninv, - const std::set& levelset, const int& lvlfield, const double& contol, const std::set& fieldset, - const unsigned int& bufsize, unsigned char* buffer); - -template void convert_sparses(const MMSP::grid >& GRID, - const int& mode, int sliceaxis, int slicelevel, const double& zoomin, const double& zoomax, const bool coninv, - const std::set& levelset, const int& lvlfield, const double& contol, const std::set& fieldset, - const unsigned int& bufsize, unsigned char* buffer); - int main(int argc, char* argv[]) { // command line error check @@ -329,145 +313,145 @@ int main(int argc, char* argv[]) if (bool_type) { if (dim == 1) { MMSP::grid<1,bool> GRID(argv[datindex]); - convert_scalars(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, theSize, buffer); + scalar_field_to_png(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, theSize, buffer); } else if (dim == 2) { MMSP::grid<2,bool> GRID(argv[datindex]); - convert_scalars(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, theSize, buffer); + scalar_field_to_png(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, theSize, buffer); } else if (dim == 3) { MMSP::grid<3,bool> GRID(argv[datindex]); - convert_scalars(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, theSize, buffer); + scalar_field_to_png(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, theSize, buffer); } } else if (unsigned_char_type) { if (dim == 1) { MMSP::grid<1,unsigned char> GRID(argv[datindex]); - convert_scalars(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, theSize, buffer); + scalar_field_to_png(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, theSize, buffer); } else if (dim == 2) { MMSP::grid<2,unsigned char> GRID(argv[datindex]); - convert_scalars(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, theSize, buffer); + scalar_field_to_png(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, theSize, buffer); } else if (dim == 3) { MMSP::grid<3,unsigned char> GRID(argv[datindex]); - convert_scalars(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, theSize, buffer); + scalar_field_to_png(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, theSize, buffer); } } else if (char_type) { if (dim == 1) { MMSP::grid<1,char> GRID(argv[datindex]); - convert_scalars(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, theSize, buffer); + scalar_field_to_png(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, theSize, buffer); } else if (dim == 2) { MMSP::grid<2,char> GRID(argv[datindex]); - convert_scalars(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, theSize, buffer); + scalar_field_to_png(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, theSize, buffer); } else if (dim == 3) { MMSP::grid<3,char> GRID(argv[datindex]); - convert_scalars(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, theSize, buffer); + scalar_field_to_png(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, theSize, buffer); } } else if (unsigned_int_type) { if (dim == 1) { MMSP::grid<1,unsigned int> GRID(argv[datindex]); - convert_scalars(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, theSize, buffer); + scalar_field_to_png(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, theSize, buffer); } else if (dim == 2) { MMSP::grid<2,unsigned int> GRID(argv[datindex]); - convert_scalars(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, theSize, buffer); + scalar_field_to_png(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, theSize, buffer); } else if (dim == 3) { MMSP::grid<3,unsigned int> GRID(argv[datindex]); - convert_scalars(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, theSize, buffer); + scalar_field_to_png(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, theSize, buffer); } } else if (int_type) { if (dim == 1) { MMSP::grid<1,int> GRID(argv[datindex]); - convert_scalars(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, theSize, buffer); + scalar_field_to_png(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, theSize, buffer); } else if (dim == 2) { MMSP::grid<2,int> GRID(argv[datindex]); - convert_scalars(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, theSize, buffer); + scalar_field_to_png(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, theSize, buffer); } else if (dim == 3) { MMSP::grid<3,int> GRID(argv[datindex]); - convert_scalars(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, theSize, buffer); + scalar_field_to_png(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, theSize, buffer); } } else if (unsigned_long_type) { if (dim == 1) { MMSP::grid<1,unsigned long> GRID(argv[datindex]); - convert_scalars(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, theSize, buffer); + scalar_field_to_png(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, theSize, buffer); } else if (dim == 2) { MMSP::grid<2,unsigned long> GRID(argv[datindex]); - convert_scalars(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, theSize, buffer); + scalar_field_to_png(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, theSize, buffer); } else if (dim == 3) { MMSP::grid<3,unsigned long> GRID(argv[datindex]); - convert_scalars(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, theSize, buffer); + scalar_field_to_png(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, theSize, buffer); } } else if (long_type) { if (dim == 1) { MMSP::grid<1,long> GRID(argv[datindex]); - convert_scalars(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, theSize, buffer); + scalar_field_to_png(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, theSize, buffer); } else if (dim == 2) { MMSP::grid<2,long> GRID(argv[datindex]); - convert_scalars(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, theSize, buffer); + scalar_field_to_png(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, theSize, buffer); } else if (dim == 3) { MMSP::grid<3,long> GRID(argv[datindex]); - convert_scalars(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, theSize, buffer); + scalar_field_to_png(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, theSize, buffer); } } else if (unsigned_short_type) { if (dim == 1) { MMSP::grid<1,unsigned short> GRID(argv[datindex]); - convert_scalars(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, theSize, buffer); + scalar_field_to_png(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, theSize, buffer); } else if (dim == 2) { MMSP::grid<2,unsigned short> GRID(argv[datindex]); - convert_scalars(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, theSize, buffer); + scalar_field_to_png(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, theSize, buffer); } else if (dim == 3) { MMSP::grid<3,unsigned short> GRID(argv[datindex]); - convert_scalars(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, theSize, buffer); + scalar_field_to_png(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, theSize, buffer); } } else if (short_type) { if (dim == 1) { MMSP::grid<1,short> GRID(argv[datindex]); - convert_scalars(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, theSize, buffer); + scalar_field_to_png(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, theSize, buffer); } else if (dim == 2) { MMSP::grid<2,short> GRID(argv[datindex]); - convert_scalars(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, theSize, buffer); + scalar_field_to_png(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, theSize, buffer); } else if (dim == 3) { MMSP::grid<3,short> GRID(argv[datindex]); - convert_scalars(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, theSize, buffer); + scalar_field_to_png(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, theSize, buffer); } } else if (float_type) { if (dim == 1) { MMSP::grid<1,float> GRID(argv[datindex]); - convert_scalars(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, theSize, buffer); + scalar_field_to_png(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, theSize, buffer); } else if (dim == 2) { MMSP::grid<2,float> GRID(argv[datindex]); - convert_scalars(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, theSize, buffer); + scalar_field_to_png(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, theSize, buffer); } else if (dim == 3) { MMSP::grid<3,float> GRID(argv[datindex]); - convert_scalars(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, theSize, buffer); + scalar_field_to_png(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, theSize, buffer); } } else if (long_double_type) { if (dim == 1) { MMSP::grid<1,long double> GRID(argv[datindex]); - convert_scalars(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, theSize, buffer); + scalar_field_to_png(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, theSize, buffer); } else if (dim == 2) { MMSP::grid<2,long double> GRID(argv[datindex]); - convert_scalars(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, theSize, buffer); + scalar_field_to_png(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, theSize, buffer); } else if (dim == 3) { MMSP::grid<3,long double> GRID(argv[datindex]); - convert_scalars(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, theSize, buffer); + scalar_field_to_png(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, theSize, buffer); } } else if (double_type) { if (dim == 1) { MMSP::grid<1,double> GRID(argv[datindex]); - convert_scalars(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, theSize, buffer); + scalar_field_to_png(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, theSize, buffer); } else if (dim == 2) { MMSP::grid<2,double> GRID(argv[datindex]); - convert_scalars(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, theSize, buffer); + scalar_field_to_png(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, theSize, buffer); } else if (dim == 3) { MMSP::grid<3,double> GRID(argv[datindex]); - convert_scalars(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, theSize, buffer); + scalar_field_to_png(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, theSize, buffer); } } } @@ -475,145 +459,145 @@ int main(int argc, char* argv[]) if (bool_type) { if (dim == 1) { MMSP::grid<1,MMSP::vector > GRID(argv[datindex]); - convert_vectors(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); + vector_field_to_png(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); } else if (dim == 2) { MMSP::grid<2,MMSP::vector > GRID(argv[datindex]); - convert_vectors(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); + vector_field_to_png(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); } else if (dim == 3) { MMSP::grid<3,MMSP::vector > GRID(argv[datindex]); - convert_vectors(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); + vector_field_to_png(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); } } else if (unsigned_char_type) { if (dim == 1) { MMSP::grid<1,MMSP::vector > GRID(argv[datindex]); - convert_vectors(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); + vector_field_to_png(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); } else if (dim == 2) { MMSP::grid<2,MMSP::vector > GRID(argv[datindex]); - convert_vectors(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); + vector_field_to_png(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); } else if (dim == 3) { MMSP::grid<3,MMSP::vector > GRID(argv[datindex]); - convert_vectors(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); + vector_field_to_png(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); } } else if (char_type) { if (dim == 1) { MMSP::grid<1,MMSP::vector > GRID(argv[datindex]); - convert_vectors(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); + vector_field_to_png(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); } else if (dim == 2) { MMSP::grid<2,MMSP::vector > GRID(argv[datindex]); - convert_vectors(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); + vector_field_to_png(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); } else if (dim == 3) { MMSP::grid<3,MMSP::vector > GRID(argv[datindex]); - convert_vectors(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); + vector_field_to_png(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); } } else if (unsigned_int_type) { if (dim == 1) { MMSP::grid<1,MMSP::vector > GRID(argv[datindex]); - convert_vectors(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); + vector_field_to_png(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); } else if (dim == 2) { MMSP::grid<2,MMSP::vector > GRID(argv[datindex]); - convert_vectors(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); + vector_field_to_png(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); } else if (dim == 3) { MMSP::grid<3,MMSP::vector > GRID(argv[datindex]); - convert_vectors(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); + vector_field_to_png(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); } } else if (int_type) { if (dim == 1) { MMSP::grid<1,MMSP::vector > GRID(argv[datindex]); - convert_vectors(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); + vector_field_to_png(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); } else if (dim == 2) { MMSP::grid<2,MMSP::vector > GRID(argv[datindex]); - convert_vectors(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); + vector_field_to_png(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); } else if (dim == 3) { MMSP::grid<3,MMSP::vector > GRID(argv[datindex]); - convert_vectors(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); + vector_field_to_png(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); } } else if (unsigned_long_type) { if (dim == 1) { MMSP::grid<1,MMSP::vector > GRID(argv[datindex]); - convert_vectors(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); + vector_field_to_png(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); } else if (dim == 2) { MMSP::grid<2,MMSP::vector > GRID(argv[datindex]); - convert_vectors(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); + vector_field_to_png(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); } else if (dim == 3) { MMSP::grid<3,MMSP::vector > GRID(argv[datindex]); - convert_vectors(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); + vector_field_to_png(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); } } else if (long_type) { if (dim == 1) { MMSP::grid<1,MMSP::vector > GRID(argv[datindex]); - convert_vectors(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); + vector_field_to_png(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); } else if (dim == 2) { MMSP::grid<2,MMSP::vector > GRID(argv[datindex]); - convert_vectors(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); + vector_field_to_png(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); } else if (dim == 3) { MMSP::grid<3,MMSP::vector > GRID(argv[datindex]); - convert_vectors(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); + vector_field_to_png(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); } } else if (unsigned_short_type) { if (dim == 1) { MMSP::grid<1,MMSP::vector > GRID(argv[datindex]); - convert_vectors(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); + vector_field_to_png(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); } else if (dim == 2) { MMSP::grid<2,MMSP::vector > GRID(argv[datindex]); - convert_vectors(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); + vector_field_to_png(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); } else if (dim == 3) { MMSP::grid<3,MMSP::vector > GRID(argv[datindex]); - convert_vectors(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); + vector_field_to_png(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); } } else if (short_type) { if (dim == 1) { MMSP::grid<1,MMSP::vector > GRID(argv[datindex]); - convert_vectors(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); + vector_field_to_png(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); } else if (dim == 2) { MMSP::grid<2,MMSP::vector > GRID(argv[datindex]); - convert_vectors(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); + vector_field_to_png(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); } else if (dim == 3) { MMSP::grid<3,MMSP::vector > GRID(argv[datindex]); - convert_vectors(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); + vector_field_to_png(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); } } else if (float_type) { if (dim == 1) { MMSP::grid<1,MMSP::vector > GRID(argv[datindex]); - convert_vectors(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); + vector_field_to_png(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); } else if (dim == 2) { MMSP::grid<2,MMSP::vector > GRID(argv[datindex]); - convert_vectors(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); + vector_field_to_png(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); } else if (dim == 3) { MMSP::grid<3,MMSP::vector > GRID(argv[datindex]); - convert_vectors(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); + vector_field_to_png(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); } } else if (long_double_type) { if (dim == 1) { MMSP::grid<1,MMSP::vector > GRID(argv[datindex]); - convert_vectors(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); + vector_field_to_png(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); } else if (dim == 2) { MMSP::grid<2,MMSP::vector > GRID(argv[datindex]); - convert_vectors(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); + vector_field_to_png(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); } else if (dim == 3) { MMSP::grid<3,MMSP::vector > GRID(argv[datindex]); - convert_vectors(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); + vector_field_to_png(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); } } else if (double_type) { if (dim == 1) { MMSP::grid<1,MMSP::vector > GRID(argv[datindex]); - convert_vectors(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); + vector_field_to_png(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); } else if (dim == 2) { MMSP::grid<2,MMSP::vector > GRID(argv[datindex]); - convert_vectors(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); + vector_field_to_png(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); } else if (dim == 3) { MMSP::grid<3,MMSP::vector > GRID(argv[datindex]); - convert_vectors(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); + vector_field_to_png(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); } } } @@ -622,145 +606,145 @@ int main(int argc, char* argv[]) if (bool_type) { if (dim == 1) { MMSP::grid<1,MMSP::sparse > GRID(argv[datindex]); - convert_sparses(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); + sparse_field_to_png(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); } else if (dim == 2) { MMSP::grid<2,MMSP::sparse > GRID(argv[datindex]); - convert_sparses(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); + sparse_field_to_png(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); } else if (dim == 3) { MMSP::grid<3,MMSP::sparse > GRID(argv[datindex]); - convert_sparses(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); + sparse_field_to_png(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); } } else if (unsigned_char_type) { if (dim == 1) { MMSP::grid<1,MMSP::sparse > GRID(argv[datindex]); - convert_sparses(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); + sparse_field_to_png(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); } else if (dim == 2) { MMSP::grid<2,MMSP::sparse > GRID(argv[datindex]); - convert_sparses(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); + sparse_field_to_png(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); } else if (dim == 3) { MMSP::grid<3,MMSP::sparse > GRID(argv[datindex]); - convert_sparses(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); + sparse_field_to_png(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); } } else if (char_type) { if (dim == 1) { MMSP::grid<1,MMSP::sparse > GRID(argv[datindex]); - convert_sparses(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); + sparse_field_to_png(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); } else if (dim == 2) { MMSP::grid<2,MMSP::sparse > GRID(argv[datindex]); - convert_sparses(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); + sparse_field_to_png(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); } else if (dim == 3) { MMSP::grid<3,MMSP::sparse > GRID(argv[datindex]); - convert_sparses(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); + sparse_field_to_png(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); } } else if (unsigned_int_type) { if (dim == 1) { MMSP::grid<1,MMSP::sparse > GRID(argv[datindex]); - convert_sparses(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); + sparse_field_to_png(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); } else if (dim == 2) { MMSP::grid<2,MMSP::sparse > GRID(argv[datindex]); - convert_sparses(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); + sparse_field_to_png(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); } else if (dim == 3) { MMSP::grid<3,MMSP::sparse > GRID(argv[datindex]); - convert_sparses(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); + sparse_field_to_png(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); } } else if (int_type) { if (dim == 1) { MMSP::grid<1,MMSP::sparse > GRID(argv[datindex]); - convert_sparses(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); + sparse_field_to_png(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); } else if (dim == 2) { MMSP::grid<2,MMSP::sparse > GRID(argv[datindex]); - convert_sparses(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); + sparse_field_to_png(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); } else if (dim == 3) { MMSP::grid<3,MMSP::sparse > GRID(argv[datindex]); - convert_sparses(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); + sparse_field_to_png(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); } } else if (unsigned_long_type) { if (dim == 1) { MMSP::grid<1,MMSP::sparse > GRID(argv[datindex]); - convert_sparses(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); + sparse_field_to_png(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); } else if (dim == 2) { MMSP::grid<2,MMSP::sparse > GRID(argv[datindex]); - convert_sparses(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); + sparse_field_to_png(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); } else if (dim == 3) { MMSP::grid<3,MMSP::sparse > GRID(argv[datindex]); - convert_sparses(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); + sparse_field_to_png(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); } } else if (long_type) { if (dim == 1) { MMSP::grid<1,MMSP::sparse > GRID(argv[datindex]); - convert_sparses(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); + sparse_field_to_png(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); } else if (dim == 2) { MMSP::grid<2,MMSP::sparse > GRID(argv[datindex]); - convert_sparses(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); + sparse_field_to_png(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); } else if (dim == 3) { MMSP::grid<3,MMSP::sparse > GRID(argv[datindex]); - convert_sparses(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); + sparse_field_to_png(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); } } else if (unsigned_short_type) { if (dim == 1) { MMSP::grid<1,MMSP::sparse > GRID(argv[datindex]); - convert_sparses(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); + sparse_field_to_png(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); } else if (dim == 2) { MMSP::grid<2,MMSP::sparse > GRID(argv[datindex]); - convert_sparses(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); + sparse_field_to_png(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); } else if (dim == 3) { MMSP::grid<3,MMSP::sparse > GRID(argv[datindex]); - convert_sparses(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); + sparse_field_to_png(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); } } else if (short_type) { if (dim == 1) { MMSP::grid<1,MMSP::sparse > GRID(argv[datindex]); - convert_sparses(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); + sparse_field_to_png(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); } else if (dim == 2) { MMSP::grid<2,MMSP::sparse > GRID(argv[datindex]); - convert_sparses(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); + sparse_field_to_png(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); } else if (dim == 3) { MMSP::grid<3,MMSP::sparse > GRID(argv[datindex]); - convert_sparses(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); + sparse_field_to_png(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); } } else if (float_type) { if (dim == 1) { MMSP::grid<1,MMSP::sparse > GRID(argv[datindex]); - convert_sparses(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); + sparse_field_to_png(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); } else if (dim == 2) { MMSP::grid<2,MMSP::sparse > GRID(argv[datindex]); - convert_sparses(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); + sparse_field_to_png(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); } else if (dim == 3) { MMSP::grid<3,MMSP::sparse > GRID(argv[datindex]); - convert_sparses(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); + sparse_field_to_png(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); } } else if (long_double_type) { if (dim == 1) { MMSP::grid<1,MMSP::sparse > GRID(argv[datindex]); - convert_sparses(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); + sparse_field_to_png(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); } else if (dim == 2) { MMSP::grid<2,MMSP::sparse > GRID(argv[datindex]); - convert_sparses(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); + sparse_field_to_png(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); } else if (dim == 3) { MMSP::grid<3,MMSP::sparse > GRID(argv[datindex]); - convert_sparses(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); + sparse_field_to_png(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); } } else if (double_type) { if (dim == 1) { MMSP::grid<1,MMSP::sparse > GRID(argv[datindex]); - convert_sparses(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); + sparse_field_to_png(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); } else if (dim == 2) { MMSP::grid<2,MMSP::sparse > GRID(argv[datindex]); - convert_sparses(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); + sparse_field_to_png(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); } else if (dim == 3) { MMSP::grid<3,MMSP::sparse > GRID(argv[datindex]); - convert_sparses(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); + sparse_field_to_png(GRID, mode, sliceaxis, slicelevel, zoomin, zoomax, coninv, levelset, lvlfield, contol, fieldset, theSize, buffer); } } } @@ -769,7 +753,7 @@ int main(int argc, char* argv[]) for (unsigned int n=0; n void convert_scalars(const MMSP::grid& GRID, - const int& mode, int sliceaxis, int slicelevel, const double& zoomin, const double& zoomax, const bool coninv, - const std::set& levelset, const int& lvlfield, const double& contol, const unsigned int& bufsize, unsigned char* buffer) -{ - double min=zoomin; - double max=zoomax; - - for (int n=0; nmax) - max=val; - else if (val x(1,0); - for (x[0] = MMSP::g0(GRID,0); x[0] < MMSP::g1(GRID,0); x[0]++) { - double val = GRID(x); - if (mode==1) //mag - val = std::fabs(val); - assert(n::iterator it=levelset.begin(); it!=levelset.end(); it++) - if (std::fabs(val-*it)/std::fabs(*it) x(2,0); - for (x[1] = MMSP::g1(GRID,1)-1; x[1] >= MMSP::g0(GRID,1); x[1]--) - for (x[0] = MMSP::g0(GRID,0); x[0] < MMSP::g1(GRID,0); x[0]++) { - double val = GRID(x); - if (mode==1) //mag - val = std::fabs(val); - assert(n::iterator it=levelset.begin(); it!=levelset.end(); it++) - if (std::fabs(val-*it)/std::fabs(*it) x(3,0); - for (x[2] = MMSP::g0(GRID,2); x[2] < MMSP::g1(GRID,2); x[2]++) - for (x[1] = MMSP::g1(GRID,1)-1; x[1] >= MMSP::g0(GRID,1); x[1]--) - for (x[0] = MMSP::g0(GRID,0); x[0] < MMSP::g1(GRID,0); x[0]++) { - if (x[sliceaxis]!=slicelevel) // clumsy, but effective - continue; - double val = GRID(x); - if (mode==1) //mag - val = std::fabs(val); - assert(n0) //contour - for (std::set::iterator it=levelset.begin(); it!=levelset.end(); it++) - if (std::fabs(val-*it)/std::fabs(*it) void convert_vectors(const MMSP::grid >& GRID, - const int& mode, int sliceaxis, int slicelevel, const double& zoomin, const double& zoomax, const bool coninv, - const std::set& levelset, const int& lvlfield, const double& contol, const std::set& fieldset, - const unsigned int& bufsize, unsigned char* buffer) -{ - double min=zoomin; - double max=zoomax; - int included = (mode==2) ? fieldset.size() : MMSP::fields(GRID)-fieldset.size(); - - for (int n=0; n1) - sum += pow(GRID(n)[i],2.0); - else - sum = GRID(n)[i]; - } else if (mode==1) { // --mag - for (int i=0; i1) - for (std::set::iterator it=fieldset.begin(); it!=fieldset.end(); it++) - sum += pow(GRID(n)[*it],2.0); - else - sum = GRID(n)[*fieldset.begin()]; - } else if (mode==3) { // --exclude - for (int i=0; i::iterator it=fieldset.find(i); - if (it == fieldset.end()) { - if (included>1) - sum += pow(GRID(n)[i],2.0); - else - sum = GRID(n)[i]; - } - } - } - if (mode==1 || included!=1) - sum = std::sqrt(sum); - if (sum>max) - max=sum; - else if (sum x(1,0); - for (x[0] = MMSP::g0(GRID,0); x[0] < MMSP::g1(GRID,0); x[0]++) { - double sum=0.0; - if (mode==0) { // default selection - for (int i=0; i1) - sum += pow(GRID(x)[i],2.0); - else - sum = GRID(x)[i]; - } - } else if (mode==1) { // --mag - for (int i=0; i::iterator it=fieldset.begin(); it!=fieldset.end(); it++) - sum += pow(GRID(x)[*it],2.0); - } else if (mode==3) { // --exclude - for (int i=0; i::iterator it=fieldset.find(i); - if (it == fieldset.end()) { - if (included>1) - sum += pow(GRID(x)[i],2.0); - else - sum = GRID(x)[i]; - } - } - } - if (mode==1 || included!=1) - sum = std::sqrt(sum); - assert(n0) // --contour - for (std::set::iterator itl=levelset.begin(); itl!=levelset.end(); itl++) - if (std::fabs(GRID(x)[lvlfield]-*itl)/std::fabs(*itl) x(2,0); - for (x[1] = MMSP::g1(GRID,1)-1; x[1] >= MMSP::g0(GRID,1); x[1]--) - for (x[0] = MMSP::g0(GRID,0); x[0] < MMSP::g1(GRID,0); x[0]++) { - double sum=0.0; - if (mode==0) { // default selection - for (int i=0; i1) - sum += pow(GRID(x)[i],2.0); - else - sum = GRID(x)[i]; - } - } else if (mode==1) { // --mag - for (int i=0; i::iterator it=fieldset.begin(); it!=fieldset.end(); it++) - sum += pow(GRID(x)[*it],2.0); - } - } else if (mode==3) { // --exclude - for (int i=0; i::iterator it=fieldset.find(i); - if (it == fieldset.end()) { - if (included>1) - sum += pow(GRID(x)[i],2.0); - else - sum = GRID(x)[i]; - } - } - } - if (mode==1 || included!=1) - sum = std::sqrt(sum); - assert(n0) // --contour - for (std::set::iterator itl=levelset.begin(); itl!=levelset.end(); itl++) - if (std::fabs(GRID(x)[lvlfield]-*itl)/std::fabs(*itl) x(3,0); - for (x[2] = MMSP::g0(GRID,2); x[2] < MMSP::g1(GRID,2); x[2]++) - for (x[1] = MMSP::g1(GRID,1)-1; x[1] >= MMSP::g0(GRID,1); x[1]--) - for (x[0] = MMSP::g0(GRID,0); x[0] < MMSP::g1(GRID,0); x[0]++) { - if (x[sliceaxis]!=slicelevel) // clumsy, but effective - continue; - double sum=0.0; - if (mode==0) { // default selection - for (int i=0; i1) - sum += pow(GRID(x)[i],2.0); - else - sum = GRID(x)[i]; - } - } else if (mode==1) { // --mag - for (int i=0; i::iterator it=fieldset.begin(); it!=fieldset.end(); it++) - sum += pow(GRID(x)[*it],2.0); - } else if (mode==3) { // --exclude - for (int i=0; i::iterator it=fieldset.find(i); - if (it == fieldset.end()) { - if (included>1) - sum += pow(GRID(x)[i],2.0); - else - sum = GRID(x)[i]; - } - } - } - if (mode==1 || included!=1) - sum = std::sqrt(sum); - assert(n0) // --contour - for (std::set::iterator itl=levelset.begin(); itl!=levelset.end(); itl++) - if (std::fabs(GRID(x)[lvlfield]-*itl)/std::fabs(*itl) void convert_sparses(const MMSP::grid >& GRID, - const int& mode, int sliceaxis, int slicelevel, const double& zoomin, const double& zoomax, const bool coninv, - const std::set& levelset, const int& lvlfield, const double& contol, const std::set& fieldset, - const unsigned int& bufsize, unsigned char* buffer) -{ - double min=zoomin; - double max=zoomax; - int included = fieldset.size(); - - for (int n=0; n::iterator it=fieldset.begin(); it!=fieldset.end(); it++) { - if (included>1) - sum += pow(GRID(n)[*it],2.0); - else - sum = GRID(n)[*it]; - } - } else if (mode==3) { // --exclude - for (int h=0; h::iterator it=fieldset.find(i); - if (it == fieldset.end()) - sum += pow(GRID(n).value(h),2.0); - } - } - if (included!=1) - sum = std::sqrt(sum); - if (sum>max) - max=sum; - else if (sum x(1,0); - for (x[0] = MMSP::g0(GRID,0); x[0] < MMSP::g1(GRID,0); x[0]++) { - double sum=0.0; - if (mode<2) { // --mag - for (int h=0; h::iterator it=fieldset.begin(); it!=fieldset.end(); it++) { - if (included>1) - sum += pow(GRID(x)[*it],2.0); - else - sum = GRID(x)[*it]; - } - } else if (mode==3) { // --exclude - for (int h=0; h::iterator it=fieldset.find(i); - if (it == fieldset.end()) - sum += pow(GRID(x).value(h),2.0); - } - } - if (mode!=2 || included!=1) - sum = std::sqrt(sum); - assert(n0) // --contour - for (std::set::iterator itl=levelset.begin(); itl!=levelset.end(); itl++) - if (std::fabs(GRID(x)[lvlfield]-*itl)/std::fabs(*itl) x(2,0); - for (x[1] = MMSP::g1(GRID,1)-1; x[1] >= MMSP::g0(GRID,1); x[1]--) - for (x[0] = MMSP::g0(GRID,0); x[0] < MMSP::g1(GRID,0); x[0]++) { - double sum=0.0; - if (mode<2) { // --mag - for (int h=0; h::iterator it=fieldset.begin(); it!=fieldset.end(); it++) { - if (included>1) - sum += pow(GRID(x)[*it],2.0); - else - sum = GRID(x)[*it]; - } - } else if (mode==3) { // --exclude - for (int h=0; h::iterator it=fieldset.find(i); - if (it == fieldset.end()) - sum += pow(GRID(x).value(h),2.0); - } - } - if (mode!=2 || included!=1) - sum = std::sqrt(sum); - assert(n0) // --contour - for (std::set::iterator itl=levelset.begin(); itl!=levelset.end(); itl++) - if (std::fabs(GRID(x)[lvlfield]-*itl)/std::fabs(*itl) x(3,0); - for (x[2] = MMSP::g0(GRID,2); x[2] < MMSP::g1(GRID,2); x[2]++) - for (x[1] = MMSP::g1(GRID,1)-1; x[1] >= MMSP::g0(GRID,1); x[1]--) - for (x[0] = MMSP::g0(GRID,0); x[0] < MMSP::g1(GRID,0); x[0]++) { - if (x[sliceaxis]!=slicelevel) // clumsy, but effective - continue; - double sum=0.0; - if (mode<2) { // --mag - for (int h=0; h::iterator it=fieldset.begin(); it!=fieldset.end(); it++) { - if (included>1) - sum += pow(GRID(x)[*it],2.0); - else - sum = GRID(x)[*it]; - } - } else if (mode==3) { // --exclude - for (int h=0; h::iterator it=fieldset.find(i); - if (it == fieldset.end()) - sum += pow(GRID(x).value(h),2.0); - } - } - if (mode!=2 || included!=1) - sum = std::sqrt(sum); - assert(n0) // --contour - for (std::set::iterator itl=levelset.begin(); itl!=levelset.end(); itl++) - if (std::fabs(GRID(x)[lvlfield]-*itl)/std::fabs(*itl) +#include +#include +#include +#include +#include +#include + #include"MMSP.hpp" int main(int argc, char* argv[]) { diff --git a/utility/mmsp2vti.cpp b/utility/mmsp2vti.cpp index d0c5698..e15b2f7 100644 --- a/utility/mmsp2vti.cpp +++ b/utility/mmsp2vti.cpp @@ -2,6 +2,12 @@ // Convert MMSP grid data to XML VTK image data format // Questions/comments to gruberja@gmail.com (Jason Gruber) +#include +#include +#include +#include +#include + #include "MMSP.hpp" int main(int argc, char* argv[]) From a3b446ef8c1921593823a7fae38d5531306ecf7d Mon Sep 17 00:00:00 2001 From: Trevor Keller Date: Mon, 10 Jun 2019 12:04:48 -0400 Subject: [PATCH 31/37] global grid length helper --- include/MMSP.grid.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/include/MMSP.grid.h b/include/MMSP.grid.h index 2802885..bb6c337 100644 --- a/include/MMSP.grid.h +++ b/include/MMSP.grid.h @@ -285,6 +285,10 @@ class grid { return GRID.g1[i]; } + friend int glength(const grid& GRID, int i) + { + return GRID.g1[i] - GRID.g0[i]; + } friend int b0(const grid& GRID, int i) { return GRID.b0[i]; From a8c6b04a0dd266accfb15198c63546af7cfac8b5 Mon Sep 17 00:00:00 2001 From: Trevor Keller Date: Wed, 21 Oct 2020 17:26:51 -0400 Subject: [PATCH 32/37] let examples warn with verbosity --- .../grain_growth/anisotropic/Monte_Carlo/Makefile | 4 ++-- .../grain_growth/anisotropic/phase_field/Makefile | 2 +- .../coarsening/grain_growth/anisotropic/sparsePF/Makefile | 2 +- .../coarsening/grain_growth/isotropic/Monte_Carlo/Makefile | 4 ++-- .../coarsening/grain_growth/isotropic/phase_field/Makefile | 2 +- .../coarsening/grain_growth/isotropic/sparsePF/Makefile | 2 +- .../ostwald_ripening/isotropic/phase_field/Makefile | 2 +- .../zener_pinning/anisotropic/Monte_Carlo/Makefile | 2 +- .../zener_pinning/anisotropic/phase_field/Makefile | 2 +- .../coarsening/zener_pinning/anisotropic/sparsePF/Makefile | 2 +- .../coarsening/zener_pinning/isotropic/Monte_Carlo/Makefile | 2 +- .../coarsening/zener_pinning/isotropic/phase_field/Makefile | 2 +- .../coarsening/zener_pinning/isotropic/sparsePF/Makefile | 2 +- examples/differential_equations/elliptic/Poisson/Makefile | 2 +- examples/phase_transitions/allen-cahn/Makefile | 2 +- .../cahn-hilliard/convex_splitting/Makefile | 2 +- examples/phase_transitions/cahn-hilliard/explicit/Makefile | 2 +- examples/phase_transitions/model_A/Makefile | 2 +- examples/phase_transitions/model_B/Makefile | 2 +- .../phase_transitions/solidification/anisotropic/Makefile | 6 +++--- examples/phase_transitions/spinodal/Makefile | 2 +- examples/statistical_mechanics/Heisenberg/Makefile | 2 +- examples/statistical_mechanics/Ising/Makefile | 2 +- examples/statistical_mechanics/Potts/Makefile | 2 +- 24 files changed, 28 insertions(+), 28 deletions(-) diff --git a/examples/coarsening/grain_growth/anisotropic/Monte_Carlo/Makefile b/examples/coarsening/grain_growth/anisotropic/Monte_Carlo/Makefile index 7483eed..64e476a 100644 --- a/examples/coarsening/grain_growth/anisotropic/Monte_Carlo/Makefile +++ b/examples/coarsening/grain_growth/anisotropic/Monte_Carlo/Makefile @@ -8,8 +8,8 @@ incdir = ../../../../../include # compilers/flags compiler = g++ pcompiler = mpic++ -flags = -O3 -I $(incdir) -pflags = $(flags) -include mpi.h +flags = -O3 -Wall -I $(incdir) +pflags = $(flags) -include mpi.h # the program graingrowth: graingrowth.cpp diff --git a/examples/coarsening/grain_growth/anisotropic/phase_field/Makefile b/examples/coarsening/grain_growth/anisotropic/phase_field/Makefile index 97baf9e..64e476a 100644 --- a/examples/coarsening/grain_growth/anisotropic/phase_field/Makefile +++ b/examples/coarsening/grain_growth/anisotropic/phase_field/Makefile @@ -8,7 +8,7 @@ incdir = ../../../../../include # compilers/flags compiler = g++ pcompiler = mpic++ -flags = -O3 -I $(incdir) +flags = -O3 -Wall -I $(incdir) pflags = $(flags) -include mpi.h # the program diff --git a/examples/coarsening/grain_growth/anisotropic/sparsePF/Makefile b/examples/coarsening/grain_growth/anisotropic/sparsePF/Makefile index 97baf9e..64e476a 100644 --- a/examples/coarsening/grain_growth/anisotropic/sparsePF/Makefile +++ b/examples/coarsening/grain_growth/anisotropic/sparsePF/Makefile @@ -8,7 +8,7 @@ incdir = ../../../../../include # compilers/flags compiler = g++ pcompiler = mpic++ -flags = -O3 -I $(incdir) +flags = -O3 -Wall -I $(incdir) pflags = $(flags) -include mpi.h # the program diff --git a/examples/coarsening/grain_growth/isotropic/Monte_Carlo/Makefile b/examples/coarsening/grain_growth/isotropic/Monte_Carlo/Makefile index 7483eed..64e476a 100644 --- a/examples/coarsening/grain_growth/isotropic/Monte_Carlo/Makefile +++ b/examples/coarsening/grain_growth/isotropic/Monte_Carlo/Makefile @@ -8,8 +8,8 @@ incdir = ../../../../../include # compilers/flags compiler = g++ pcompiler = mpic++ -flags = -O3 -I $(incdir) -pflags = $(flags) -include mpi.h +flags = -O3 -Wall -I $(incdir) +pflags = $(flags) -include mpi.h # the program graingrowth: graingrowth.cpp diff --git a/examples/coarsening/grain_growth/isotropic/phase_field/Makefile b/examples/coarsening/grain_growth/isotropic/phase_field/Makefile index 97baf9e..64e476a 100644 --- a/examples/coarsening/grain_growth/isotropic/phase_field/Makefile +++ b/examples/coarsening/grain_growth/isotropic/phase_field/Makefile @@ -8,7 +8,7 @@ incdir = ../../../../../include # compilers/flags compiler = g++ pcompiler = mpic++ -flags = -O3 -I $(incdir) +flags = -O3 -Wall -I $(incdir) pflags = $(flags) -include mpi.h # the program diff --git a/examples/coarsening/grain_growth/isotropic/sparsePF/Makefile b/examples/coarsening/grain_growth/isotropic/sparsePF/Makefile index 97baf9e..64e476a 100644 --- a/examples/coarsening/grain_growth/isotropic/sparsePF/Makefile +++ b/examples/coarsening/grain_growth/isotropic/sparsePF/Makefile @@ -8,7 +8,7 @@ incdir = ../../../../../include # compilers/flags compiler = g++ pcompiler = mpic++ -flags = -O3 -I $(incdir) +flags = -O3 -Wall -I $(incdir) pflags = $(flags) -include mpi.h # the program diff --git a/examples/coarsening/ostwald_ripening/isotropic/phase_field/Makefile b/examples/coarsening/ostwald_ripening/isotropic/phase_field/Makefile index 750204f..edf0b88 100644 --- a/examples/coarsening/ostwald_ripening/isotropic/phase_field/Makefile +++ b/examples/coarsening/ostwald_ripening/isotropic/phase_field/Makefile @@ -8,7 +8,7 @@ incdir = ../../../../../include # compilers/flags compiler = g++ pcompiler = mpic++ -flags = -O3 -I $(incdir) +flags = -O3 -Wall -I $(incdir) pflags = $(flags) -include mpi.h # the program diff --git a/examples/coarsening/zener_pinning/anisotropic/Monte_Carlo/Makefile b/examples/coarsening/zener_pinning/anisotropic/Monte_Carlo/Makefile index 80ba9c8..25a81d7 100644 --- a/examples/coarsening/zener_pinning/anisotropic/Monte_Carlo/Makefile +++ b/examples/coarsening/zener_pinning/anisotropic/Monte_Carlo/Makefile @@ -8,7 +8,7 @@ incdir = ../../../../../include # compilers/flags compiler = g++ pcompiler = mpic++ -flags = -O3 -I $(incdir) +flags = -O3 -Wall -I $(incdir) pflags = $(flags) -include mpi.h # the program diff --git a/examples/coarsening/zener_pinning/anisotropic/phase_field/Makefile b/examples/coarsening/zener_pinning/anisotropic/phase_field/Makefile index c9247f6..0f05587 100644 --- a/examples/coarsening/zener_pinning/anisotropic/phase_field/Makefile +++ b/examples/coarsening/zener_pinning/anisotropic/phase_field/Makefile @@ -8,7 +8,7 @@ incdir = ../../../../../include # compilers/flags compiler = g++ pcompiler = mpic++ -flags = -O3 -I $(incdir) +flags = -O3 -Wall -I $(incdir) pflags = $(flags) -include mpi.h # the program diff --git a/examples/coarsening/zener_pinning/anisotropic/sparsePF/Makefile b/examples/coarsening/zener_pinning/anisotropic/sparsePF/Makefile index c9247f6..0f05587 100644 --- a/examples/coarsening/zener_pinning/anisotropic/sparsePF/Makefile +++ b/examples/coarsening/zener_pinning/anisotropic/sparsePF/Makefile @@ -8,7 +8,7 @@ incdir = ../../../../../include # compilers/flags compiler = g++ pcompiler = mpic++ -flags = -O3 -I $(incdir) +flags = -O3 -Wall -I $(incdir) pflags = $(flags) -include mpi.h # the program diff --git a/examples/coarsening/zener_pinning/isotropic/Monte_Carlo/Makefile b/examples/coarsening/zener_pinning/isotropic/Monte_Carlo/Makefile index c9247f6..0f05587 100644 --- a/examples/coarsening/zener_pinning/isotropic/Monte_Carlo/Makefile +++ b/examples/coarsening/zener_pinning/isotropic/Monte_Carlo/Makefile @@ -8,7 +8,7 @@ incdir = ../../../../../include # compilers/flags compiler = g++ pcompiler = mpic++ -flags = -O3 -I $(incdir) +flags = -O3 -Wall -I $(incdir) pflags = $(flags) -include mpi.h # the program diff --git a/examples/coarsening/zener_pinning/isotropic/phase_field/Makefile b/examples/coarsening/zener_pinning/isotropic/phase_field/Makefile index c9247f6..0f05587 100644 --- a/examples/coarsening/zener_pinning/isotropic/phase_field/Makefile +++ b/examples/coarsening/zener_pinning/isotropic/phase_field/Makefile @@ -8,7 +8,7 @@ incdir = ../../../../../include # compilers/flags compiler = g++ pcompiler = mpic++ -flags = -O3 -I $(incdir) +flags = -O3 -Wall -I $(incdir) pflags = $(flags) -include mpi.h # the program diff --git a/examples/coarsening/zener_pinning/isotropic/sparsePF/Makefile b/examples/coarsening/zener_pinning/isotropic/sparsePF/Makefile index c9247f6..0f05587 100644 --- a/examples/coarsening/zener_pinning/isotropic/sparsePF/Makefile +++ b/examples/coarsening/zener_pinning/isotropic/sparsePF/Makefile @@ -8,7 +8,7 @@ incdir = ../../../../../include # compilers/flags compiler = g++ pcompiler = mpic++ -flags = -O3 -I $(incdir) +flags = -O3 -Wall -I $(incdir) pflags = $(flags) -include mpi.h # the program diff --git a/examples/differential_equations/elliptic/Poisson/Makefile b/examples/differential_equations/elliptic/Poisson/Makefile index a509277..6f2c9d4 100644 --- a/examples/differential_equations/elliptic/Poisson/Makefile +++ b/examples/differential_equations/elliptic/Poisson/Makefile @@ -8,7 +8,7 @@ incdir = ../../../../include compiler = g++ pcompiler = mpic++ flags = -O3 -Wall -I $(incdir) -pflags = $(flags) -include mpi.h +pflags = $(flags) -include mpi.h # the program poisson: poisson.cpp diff --git a/examples/phase_transitions/allen-cahn/Makefile b/examples/phase_transitions/allen-cahn/Makefile index 39fbc09..b15a975 100644 --- a/examples/phase_transitions/allen-cahn/Makefile +++ b/examples/phase_transitions/allen-cahn/Makefile @@ -8,7 +8,7 @@ incdir = ../../../include # compilers/flags compiler = g++ pcompiler = mpic++ -flags = -O3 -I $(incdir) +flags = -O3 -Wall -I $(incdir) pflags = $(flags) -include mpi.h # the program diff --git a/examples/phase_transitions/cahn-hilliard/convex_splitting/Makefile b/examples/phase_transitions/cahn-hilliard/convex_splitting/Makefile index b553b94..f16aeee 100644 --- a/examples/phase_transitions/cahn-hilliard/convex_splitting/Makefile +++ b/examples/phase_transitions/cahn-hilliard/convex_splitting/Makefile @@ -9,7 +9,7 @@ incdir = ../../../../include # compilers/flags compiler = g++ pcompiler = mpic++ -flags = -O3 -DVANILLA -I $(incdir) +flags = -O3 -Wall -DVANILLA -I $(incdir) pflags = $(flags) -include mpi.h # the program diff --git a/examples/phase_transitions/cahn-hilliard/explicit/Makefile b/examples/phase_transitions/cahn-hilliard/explicit/Makefile index 8238f04..081bd9f 100644 --- a/examples/phase_transitions/cahn-hilliard/explicit/Makefile +++ b/examples/phase_transitions/cahn-hilliard/explicit/Makefile @@ -8,7 +8,7 @@ incdir = ../../../../include # compilers/flags compiler = g++ pcompiler = mpic++ -flags = -O3 -I $(incdir) +flags = -O3 -Wall -I $(incdir) pflags = $(flags) -include mpi.h # the program diff --git a/examples/phase_transitions/model_A/Makefile b/examples/phase_transitions/model_A/Makefile index 6107a43..89830cd 100644 --- a/examples/phase_transitions/model_A/Makefile +++ b/examples/phase_transitions/model_A/Makefile @@ -8,7 +8,7 @@ incdir = ../../../include # compilers/flags compiler = g++ pcompiler = mpic++ -flags = -O3 -I $(incdir) +flags = -O3 -Wall -I $(incdir) pflags = $(flags) -include mpi.h # the program diff --git a/examples/phase_transitions/model_B/Makefile b/examples/phase_transitions/model_B/Makefile index 76da3b1..d246041 100644 --- a/examples/phase_transitions/model_B/Makefile +++ b/examples/phase_transitions/model_B/Makefile @@ -8,7 +8,7 @@ incdir = ../../../include # compilers/flags compiler = g++ pcompiler = mpic++ -flags = -O3 -I $(incdir) +flags = -O3 -Wall -I $(incdir) pflags = $(flags) -include mpi.h # the program diff --git a/examples/phase_transitions/solidification/anisotropic/Makefile b/examples/phase_transitions/solidification/anisotropic/Makefile index 2fb3d6e..307516d 100644 --- a/examples/phase_transitions/solidification/anisotropic/Makefile +++ b/examples/phase_transitions/solidification/anisotropic/Makefile @@ -6,9 +6,9 @@ incdir = ../../../../include # compilers/flags -compiler = g++ -O3 -pcompiler = mpic++ -O3 -flags = -I $(incdir) +compiler = g++ +pcompiler = mpic++ +flags = -O3 -Wall -I $(incdir) pflags = $(flags) -include mpi.h # the program diff --git a/examples/phase_transitions/spinodal/Makefile b/examples/phase_transitions/spinodal/Makefile index df97f0f..50acefe 100644 --- a/examples/phase_transitions/spinodal/Makefile +++ b/examples/phase_transitions/spinodal/Makefile @@ -8,7 +8,7 @@ incdir = ../../../include # compilers/flags compiler = g++ pcompiler = mpic++ -flags = -O3 -I $(incdir) +flags = -O3 -Wall -I $(incdir) pflags = $(flags) -include mpi.h # the program diff --git a/examples/statistical_mechanics/Heisenberg/Makefile b/examples/statistical_mechanics/Heisenberg/Makefile index 50d5bc7..f9eca48 100644 --- a/examples/statistical_mechanics/Heisenberg/Makefile +++ b/examples/statistical_mechanics/Heisenberg/Makefile @@ -8,7 +8,7 @@ incdir = ../../../include/ # compilers/flags compiler = g++ pcompiler = mpic++ -flags = -O3 -I $(incdir) +flags = -O3 -Wall -I $(incdir) pflags = $(flags) -include mpi.h # the program diff --git a/examples/statistical_mechanics/Ising/Makefile b/examples/statistical_mechanics/Ising/Makefile index dd7fa6f..464ec18 100644 --- a/examples/statistical_mechanics/Ising/Makefile +++ b/examples/statistical_mechanics/Ising/Makefile @@ -8,7 +8,7 @@ incdir = ../../../include/ # compilers/flags compiler = g++ pcompiler = mpic++ -flags = -O3 -I $(incdir) +flags = -O3 -Wall -I $(incdir) pflags = $(flags) -include mpi.h # the program diff --git a/examples/statistical_mechanics/Potts/Makefile b/examples/statistical_mechanics/Potts/Makefile index 44e8a18..36cebbe 100644 --- a/examples/statistical_mechanics/Potts/Makefile +++ b/examples/statistical_mechanics/Potts/Makefile @@ -8,7 +8,7 @@ incdir = ../../../include/ # compilers/flags compiler = g++ pcompiler = mpic++ -flags = -O3 -I $(incdir) +flags = -O3 -Wall -I $(incdir) pflags = $(flags) -include mpi.h # the program From 4fbd7a9f5d24e83d98cc1f20d41720e4e1f191b2 Mon Sep 17 00:00:00 2001 From: Trevor Keller Date: Wed, 21 Oct 2020 19:12:52 -0400 Subject: [PATCH 33/37] C-style MPI bindings in example codes --- .../anisotropic/Monte_Carlo/Makefile | 2 +- .../anisotropic/Monte_Carlo/graingrowth.cpp | 6 +++--- .../anisotropic/phase_field/graingrowth.cpp | 2 +- .../anisotropic/sparsePF/graingrowth.cpp | 2 +- .../isotropic/Monte_Carlo/graingrowth.cpp | 6 +++--- .../isotropic/phase_field/graingrowth.cpp | 8 +++---- .../isotropic/sparsePF/graingrowth.cpp | 2 +- .../isotropic/phase_field/ostwald.cpp | 2 +- .../anisotropic/Monte_Carlo/zener.cpp | 2 +- .../anisotropic/phase_field/zener.cpp | 2 +- .../anisotropic/sparsePF/zener.cpp | 2 +- .../isotropic/Monte_Carlo/zener.cpp | 2 +- .../isotropic/phase_field/zener.cpp | 2 +- .../isotropic/sparsePF/zener.cpp | 2 +- .../allen-cahn/allen-cahn.cpp | 2 +- .../convex_splitting/cahn-hilliard.cpp | 21 ++++++++++--------- .../cahn-hilliard/explicit/cahn-hilliard.cpp | 2 +- .../phase_transitions/model_A/model_A.cpp | 2 +- .../phase_transitions/model_B/model_B.cpp | 2 +- .../anisotropic/solidification.cpp | 8 +++---- .../phase_transitions/spinodal/spinodal.cpp | 2 +- .../Heisenberg/heisenberg.cpp | 2 +- .../statistical_mechanics/Ising/ising.cpp | 2 +- .../statistical_mechanics/Potts/potts.cpp | 2 +- 24 files changed, 43 insertions(+), 44 deletions(-) diff --git a/examples/coarsening/grain_growth/anisotropic/Monte_Carlo/Makefile b/examples/coarsening/grain_growth/anisotropic/Monte_Carlo/Makefile index 64e476a..1794c14 100644 --- a/examples/coarsening/grain_growth/anisotropic/Monte_Carlo/Makefile +++ b/examples/coarsening/grain_growth/anisotropic/Monte_Carlo/Makefile @@ -8,7 +8,7 @@ incdir = ../../../../../include # compilers/flags compiler = g++ pcompiler = mpic++ -flags = -O3 -Wall -I $(incdir) +flags = -g -Wall -I $(incdir) pflags = $(flags) -include mpi.h # the program diff --git a/examples/coarsening/grain_growth/anisotropic/Monte_Carlo/graingrowth.cpp b/examples/coarsening/grain_growth/anisotropic/Monte_Carlo/graingrowth.cpp index 7c3c341..31b25a6 100644 --- a/examples/coarsening/grain_growth/anisotropic/Monte_Carlo/graingrowth.cpp +++ b/examples/coarsening/grain_growth/anisotropic/Monte_Carlo/graingrowth.cpp @@ -64,7 +64,7 @@ template void update(grid& mcGrid, int steps) { int rank = 0; #ifdef MPI_VERSION - rank = MPI::COMM_WORLD.Get_rank(); + MPI_Comm_rank(MPI_COMM_WORLD, &rank); #endif ghostswap(mcGrid); @@ -181,7 +181,7 @@ template void update(grid& mcGrid, int steps) // This particular algorithm requires that srand() be called here. unsigned long seed=time(NULL); #ifdef MPI_VERSION - MPI::COMM_WORLD.Bcast(&seed, 1, MPI_UNSIGNED_LONG, 0); + MPI_Bcast(&seed, 1, MPI_UNSIGNED_LONG, 0, MPI_COMM_WORLD); #endif srand(seed); // Also, time(NULL)+rank is an INCORRECT seed for this purpose. @@ -368,7 +368,7 @@ template void update(grid& mcGrid, int steps) } // hh #ifdef MPI_VERSION - MPI::COMM_WORLD.Barrier(); + MPI_Barrier(MPI_COMM_WORLD); #endif ghostswap(mcGrid, sublattice); // once looped over a "color", ghostswap. }//loop over sublattice diff --git a/examples/coarsening/grain_growth/anisotropic/phase_field/graingrowth.cpp b/examples/coarsening/grain_growth/anisotropic/phase_field/graingrowth.cpp index 131eee5..cb9c6c2 100644 --- a/examples/coarsening/grain_growth/anisotropic/phase_field/graingrowth.cpp +++ b/examples/coarsening/grain_growth/anisotropic/phase_field/graingrowth.cpp @@ -95,7 +95,7 @@ template void update(grid >& oldGrid, int st { int rank=0; #ifdef MPI_VERSION - rank = MPI::COMM_WORLD.Get_rank(); + MPI_Comm_rank(MPI_COMM_WORLD, &rank); #endif ghostswap(oldGrid); diff --git a/examples/coarsening/grain_growth/anisotropic/sparsePF/graingrowth.cpp b/examples/coarsening/grain_growth/anisotropic/sparsePF/graingrowth.cpp index 105130d..0aa9b30 100644 --- a/examples/coarsening/grain_growth/anisotropic/sparsePF/graingrowth.cpp +++ b/examples/coarsening/grain_growth/anisotropic/sparsePF/graingrowth.cpp @@ -88,7 +88,7 @@ template void update(grid >& oldGrid, int st { int rank=0; #ifdef MPI_VERSION - rank = MPI::COMM_WORLD.Get_rank(); + MPI_Comm_rank(MPI_COMM_WORLD, &rank); #endif double dt = 0.01; double width = 8.0; diff --git a/examples/coarsening/grain_growth/isotropic/Monte_Carlo/graingrowth.cpp b/examples/coarsening/grain_growth/isotropic/Monte_Carlo/graingrowth.cpp index 9513571..15d82de 100644 --- a/examples/coarsening/grain_growth/isotropic/Monte_Carlo/graingrowth.cpp +++ b/examples/coarsening/grain_growth/isotropic/Monte_Carlo/graingrowth.cpp @@ -63,7 +63,7 @@ template void update(grid& mcGrid, int steps) { int rank = 0; #ifdef MPI_VERSION - rank = MPI::COMM_WORLD.Get_rank(); + MPI_Comm_rank(MPI_COMM_WORLD, &rank); #endif ghostswap(mcGrid); @@ -180,7 +180,7 @@ template void update(grid& mcGrid, int steps) // This particular algorithm requires that srand() be called here. unsigned long seed=time(NULL); #ifdef MPI_VERSION - MPI::COMM_WORLD.Bcast(&seed, 1, MPI_UNSIGNED_LONG, 0); + MPI_Bcast(&seed, 1, MPI_UNSIGNED_LONG, 0, MPI_COMM_WORLD); #endif srand(seed); // Also, time(NULL)+rank is an INCORRECT seed for this purpose. @@ -364,7 +364,7 @@ template void update(grid& mcGrid, int steps) } // hh #ifdef MPI_VERSION - MPI::COMM_WORLD.Barrier(); + MPI_Barrier(MPI_COMM_WORLD); #endif ghostswap(mcGrid, sublattice); // once looped over a "color", ghostswap. }//loop over sublattice diff --git a/examples/coarsening/grain_growth/isotropic/phase_field/graingrowth.cpp b/examples/coarsening/grain_growth/isotropic/phase_field/graingrowth.cpp index f8eff4c..d7bb2b2 100644 --- a/examples/coarsening/grain_growth/isotropic/phase_field/graingrowth.cpp +++ b/examples/coarsening/grain_growth/isotropic/phase_field/graingrowth.cpp @@ -74,7 +74,7 @@ template void update(grid >& oldGrid, int st { int rank=0; #ifdef MPI_VERSION - rank = MPI::COMM_WORLD.Get_rank(); + MPI_Comm_rank(MPI_COMM_WORLD, &rank); #endif ghostswap(oldGrid); @@ -138,7 +138,7 @@ TEST(grid1DTest, Finite) { #ifdef MPI_VERSION for (int i=0; i<2; i++) { double myLen(length[i]); - MPI::COMM_WORLD.Allreduce(&myLen,&length[i],1,MPI_DOUBLE,MPI_SUM); + MPI_Allreduce(&myLen,&length[i],1,MPI_DOUBLE,MPI_SUM,MPI_COMM_WORLD); } #endif for (int n=0; n void update(grid >& oldGrid, int st { int rank=0; #ifdef MPI_VERSION - rank = MPI::COMM_WORLD.Get_rank(); + MPI_Comm_rank(MPI_COMM_WORLD, &rank); #endif ghostswap(oldGrid); diff --git a/examples/coarsening/ostwald_ripening/isotropic/phase_field/ostwald.cpp b/examples/coarsening/ostwald_ripening/isotropic/phase_field/ostwald.cpp index 2857466..6182ca9 100644 --- a/examples/coarsening/ostwald_ripening/isotropic/phase_field/ostwald.cpp +++ b/examples/coarsening/ostwald_ripening/isotropic/phase_field/ostwald.cpp @@ -57,7 +57,7 @@ template void update(grid >& oldGrid, int st { int rank=0; #ifdef MPI_VERSION - rank = MPI::COMM_WORLD.Get_rank(); + MPI_Comm_rank(MPI_COMM_WORLD, &rank); #endif ghostswap(oldGrid); diff --git a/examples/coarsening/zener_pinning/anisotropic/Monte_Carlo/zener.cpp b/examples/coarsening/zener_pinning/anisotropic/Monte_Carlo/zener.cpp index b534ba1..0ff458a 100644 --- a/examples/coarsening/zener_pinning/anisotropic/Monte_Carlo/zener.cpp +++ b/examples/coarsening/zener_pinning/anisotropic/Monte_Carlo/zener.cpp @@ -91,7 +91,7 @@ template void update(grid& mcGrid, int steps) { int rank=0; #ifdef MPI_VERSION - rank = MPI::COMM_WORLD.Get_rank(); + MPI_Comm_rank(MPI_COMM_WORLD, &rank); #endif ghostswap(mcGrid); diff --git a/examples/coarsening/zener_pinning/anisotropic/phase_field/zener.cpp b/examples/coarsening/zener_pinning/anisotropic/phase_field/zener.cpp index 57456d9..e694b15 100644 --- a/examples/coarsening/zener_pinning/anisotropic/phase_field/zener.cpp +++ b/examples/coarsening/zener_pinning/anisotropic/phase_field/zener.cpp @@ -106,7 +106,7 @@ template void update(grid >& oldGrid, int st { int rank=0; #ifdef MPI_VERSION - rank = MPI::COMM_WORLD.Get_rank(); + MPI_Comm_rank(MPI_COMM_WORLD, &rank); #endif ghostswap(oldGrid); diff --git a/examples/coarsening/zener_pinning/anisotropic/sparsePF/zener.cpp b/examples/coarsening/zener_pinning/anisotropic/sparsePF/zener.cpp index 1e828e1..237ed7d 100644 --- a/examples/coarsening/zener_pinning/anisotropic/sparsePF/zener.cpp +++ b/examples/coarsening/zener_pinning/anisotropic/sparsePF/zener.cpp @@ -100,7 +100,7 @@ template void update(grid >& oldGrid, int st { int rank=0; #ifdef MPI_VERSION - rank = MPI::COMM_WORLD.Get_rank(); + MPI_Comm_rank(MPI_COMM_WORLD, &rank); #endif ghostswap(oldGrid); diff --git a/examples/coarsening/zener_pinning/isotropic/Monte_Carlo/zener.cpp b/examples/coarsening/zener_pinning/isotropic/Monte_Carlo/zener.cpp index 775a0dd..31dfc59 100644 --- a/examples/coarsening/zener_pinning/isotropic/Monte_Carlo/zener.cpp +++ b/examples/coarsening/zener_pinning/isotropic/Monte_Carlo/zener.cpp @@ -90,7 +90,7 @@ template void update(grid& mcGrid, int steps) { int rank=0; #ifdef MPI_VERSION - rank = MPI::COMM_WORLD.Get_rank(); + MPI_Comm_rank(MPI_COMM_WORLD, &rank); #endif ghostswap(mcGrid); diff --git a/examples/coarsening/zener_pinning/isotropic/phase_field/zener.cpp b/examples/coarsening/zener_pinning/isotropic/phase_field/zener.cpp index 27cfa08..4427fe1 100644 --- a/examples/coarsening/zener_pinning/isotropic/phase_field/zener.cpp +++ b/examples/coarsening/zener_pinning/isotropic/phase_field/zener.cpp @@ -105,7 +105,7 @@ template void update(grid >& oldGrid, int st { int rank=0; #ifdef MPI_VERSION - rank = MPI::COMM_WORLD.Get_rank(); + MPI_Comm_rank(MPI_COMM_WORLD, &rank); #endif ghostswap(oldGrid); diff --git a/examples/coarsening/zener_pinning/isotropic/sparsePF/zener.cpp b/examples/coarsening/zener_pinning/isotropic/sparsePF/zener.cpp index d8d1c0e..dfe8a07 100644 --- a/examples/coarsening/zener_pinning/isotropic/sparsePF/zener.cpp +++ b/examples/coarsening/zener_pinning/isotropic/sparsePF/zener.cpp @@ -99,7 +99,7 @@ template void update(grid >& oldGrid, int st { int rank=0; #ifdef MPI_VERSION - rank = MPI::COMM_WORLD.Get_rank(); + MPI_Comm_rank(MPI_COMM_WORLD, &rank); #endif ghostswap(oldGrid); diff --git a/examples/phase_transitions/allen-cahn/allen-cahn.cpp b/examples/phase_transitions/allen-cahn/allen-cahn.cpp index d3185f4..21e30d4 100644 --- a/examples/phase_transitions/allen-cahn/allen-cahn.cpp +++ b/examples/phase_transitions/allen-cahn/allen-cahn.cpp @@ -48,7 +48,7 @@ template void update(grid& oldGrid, int steps) { int rank=0; #ifdef MPI_VERSION - rank = MPI::COMM_WORLD.Get_rank(); + MPI_Comm_rank(MPI_COMM_WORLD, &rank); #endif ghostswap(oldGrid); diff --git a/examples/phase_transitions/cahn-hilliard/convex_splitting/cahn-hilliard.cpp b/examples/phase_transitions/cahn-hilliard/convex_splitting/cahn-hilliard.cpp index fa6fdb0..eabe0f3 100644 --- a/examples/phase_transitions/cahn-hilliard/convex_splitting/cahn-hilliard.cpp +++ b/examples/phase_transitions/cahn-hilliard/convex_splitting/cahn-hilliard.cpp @@ -180,7 +180,7 @@ template void reportEnergy(const MMSP::grid > { int rank=0; #ifdef MPI_VERSION - rank = MPI::COMM_WORLD.Get_rank(); + MPI_Comm_rank(MPI_COMM_WORLD, &rank); #endif double dV = 1.0; @@ -205,8 +205,8 @@ template void reportEnergy(const MMSP::grid > #ifdef MPI_VERSION double localEnergy = energy; double localMass = mass; - MPI::COMM_WORLD.Reduce(&localEnergy, &energy, 1, MPI_DOUBLE, MPI_SUM, 0); - MPI::COMM_WORLD.Reduce(&localMass, &mass, 1, MPI_DOUBLE, MPI_SUM, 0); + MPI_Reduce(&localEnergy, &energy, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); + MPI_Reduce(&localMass, &mass, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); #endif //if (rank==0) // std::cout<<'0'<<'\t'< >& oldGrid, int steps) { int rank=0; #ifdef MPI_VERSION - rank = MPI::COMM_WORLD.Get_rank(); + MPI_Comm_rank(MPI_COMM_WORLD, &rank); #endif ghostswap(oldGrid); @@ -296,7 +296,7 @@ void update(grid >& oldGrid, int steps) double gridSize = static_cast(nodes(oldGrid)); #ifdef MPI_VERSION double localGridSize = gridSize; - MPI::COMM_WORLD.Allreduce(&localGridSize, &gridSize, 1, MPI_DOUBLE, MPI_SUM); + MPI_Allreduce(&localGridSize, &gridSize, 1, MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD); #endif double lapWeight = 0.0; @@ -416,9 +416,9 @@ void update(grid >& oldGrid, int steps) #ifdef MPI_VERSION double localResidual=residual; - MPI::COMM_WORLD.Allreduce(&localResidual, &residual, 1, MPI_DOUBLE, MPI_SUM); + MPI_Allreduce(&localResidual, &residual, 1, MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD); double localNormB=normB; - MPI::COMM_WORLD.Allreduce(&localNormB, &normB, 1, MPI_DOUBLE, MPI_SUM); + MPI_Allreduce(&localNormB, &normB, 1, MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD); #endif residual = sqrt(residual/normB)/(2.0*gridSize); @@ -429,7 +429,8 @@ void update(grid >& oldGrid, int steps) if (iter==max_iter) { if (rank==0) std::cerr<<" Solver stagnated on step "< >& grid, const std::vec void seedswap(std::vector > >& seeds) { #ifdef MPI_VERSION - int id=MPI::COMM_WORLD.Get_rank(); - int np=MPI::COMM_WORLD.Get_size(); + int id=0, np=0; + MPI_Comm_rank(MPI_COMM_WORLD, &id); + MPI_Comm_size(MPI_COMM_WORLD, &np); // Exchange seeds between all processors int send_size=3*seeds[id].size(); // number of integers int* send_buffer = new int[send_size]; // number of integers send_size = seeds_to_buffer(seeds[id], send_buffer); int* seed_sizes = new int[np]; - MPI::COMM_WORLD.Barrier(); - MPI::COMM_WORLD.Allgather(&send_size, 1, MPI_INT, seed_sizes, 1, MPI_INT); + MPI_Barrier(MPI_COMM_WORLD); + MPI_Allgather(&send_size, 1, MPI_INT, seed_sizes, 1, MPI_INT, MPI_COMM_WORLD); int total_size=0; for (int i=0; i > >& seeds) delete [] seed_block; seed_block=NULL; int vote=1; int total_procs=0; - MPI::COMM_WORLD.Barrier(); - MPI::COMM_WORLD.Allreduce(&vote, &total_procs, 1, MPI_INT, MPI_SUM); + MPI_Barrier(MPI_COMM_WORLD); + MPI_Allreduce(&vote, &total_procs, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD); #ifdef DEBUG if (id==0) std::cout<<"Synchronized "< > >& seeds) template void seeds_from_poisson_process(const int x0[dim], const int x1[dim], const int g0[dim], const int g1[dim], const int& nseeds, std::vector > >& seeds) { - int id=0; - int np=1; + int id=0, np=1; #ifdef MPI_VERSION - id=MPI::COMM_WORLD.Get_rank(); - np=MPI::COMM_WORLD.Get_size(); + MPI_Comm_rank(MPI_COMM_WORLD, &id); + MPI_Comm_size(MPI_COMM_WORLD, &np); #endif std::vector > local_seeds; // blank for now seeds.clear(); @@ -482,7 +483,7 @@ void seeds_to_file(const int g0[dim], const int g1[dim], const std::vector void seeds_from_file(const int x0[dim], const int x1[dim], const int g0[dim], const int g1[dim], const char* seedfilename, std::vector > >& seeds) { - int id=0; - int np=1; + int id=0, np=1; #ifdef MPI_VERSION - id=MPI::COMM_WORLD.Get_rank(); - np=MPI::COMM_WORLD.Get_size(); + MPI_Comm_rank(MPI_COMM_WORLD, &id); + MPI_Comm_size(MPI_COMM_WORLD, &np); #endif std::ifstream input(seedfilename); if (!input) { @@ -547,11 +547,10 @@ void seeds_from_file(const int x0[dim], const int x1[dim], const int g0[dim], co template void honeycomb_seeds(const int x0[dim], const int x1[dim], const int g0[dim], const int g1[dim], const int a, std::vector > >& seeds) { - int id=0; - int np=1; + int id=0, np=1; #ifdef MPI_VERSION - id=MPI::COMM_WORLD.Get_rank(); - np=MPI::COMM_WORLD.Get_size(); + MPI_Comm_rank(MPI_COMM_WORLD, &id); + MPI_Comm_size(MPI_COMM_WORLD, &np); #endif std::vector > local_seeds; // blank for now seeds.clear(); @@ -597,7 +596,7 @@ void tessellate(MMSP::grid >& grid, const int& nseeds) { approximate_voronoi(grid, seeds); #else exact_voronoi(grid, seeds); - MPI::COMM_WORLD.Barrier(); + MPI_Barrier(MPI_COMM_WORLD); #endif } // tessellate diff --git a/algorithms/tessellate.hpp b/algorithms/tessellate.hpp index bdd529d..0d5a073 100644 --- a/algorithms/tessellate.hpp +++ b/algorithms/tessellate.hpp @@ -114,7 +114,8 @@ namespace MMSP { #ifdef MPI_VERSION template void exact_voronoi(MMSP::grid >& grid, const std::vector > >& seeds) { - int id=MPI::COMM_WORLD.Get_rank(); + int id=0; + MPI_Comm_rank(MPI_COMM_WORLD, &id); // Exact Voronoi tessellation from seeds, based on Euclidean distance function. Runtime is O(Nseeds*L*W*H). // seeds must contain every seed from every rank. #ifdef DEBUG @@ -223,8 +224,9 @@ void approximate_voronoi(MMSP::grid >& grid, const std::vector >& grid, const std::vector >& grid, const std::vector void tessellate(const std::vector >& local_seeds, std::vector > >& seeds, MMSP::grid >& grid) { - int id=0; - int np=1; + int id=0, np=1; #ifdef MPI_VERSION - id=MPI::COMM_WORLD.Get_rank(); - np=MPI::COMM_WORLD.Get_size(); + MPI_Comm_rank(MPI_COMM_WORLD, &id); + MPI_Comm_size(MPI_COMM_WORLD, &np); #endif #ifndef MPI_VERSION @@ -455,16 +459,16 @@ void tessellate(const std::vector >& local_seeds, std::vector< int* send_buffer = new int[send_size]; // number of integers send_size = seeds_to_buffer(local_seeds, send_buffer); int* seed_sizes = new int[np]; - MPI::COMM_WORLD.Barrier(); - MPI::COMM_WORLD.Allgather(&send_size, 1, MPI_INT, seed_sizes, 1, MPI_INT); + MPI_Barrier(MPI_COMM_WORLD); + MPI_Allgather(&send_size, 1, MPI_INT, seed_sizes, 1, MPI_INT, MPI_COMM_WORLD); int total_size=0; for (int i=0; i >& local_seeds, std::vector< delete [] seed_block; seed_block=NULL; int vote=1; int total_procs=0; - MPI::COMM_WORLD.Barrier(); - MPI::COMM_WORLD.Allreduce(&vote, &total_procs, 1, MPI_INT, MPI_SUM); + MPI_Barrier(MPI_COMM_WORLD); + MPI_Allreduce(&vote, &total_procs, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD); if (id==0) std::cout<<"Synchronized "< >& local_seeds, std::vector< approximate_voronoi(grid, seeds); #else exact_voronoi(grid, seeds); - MPI::COMM_WORLD.Barrier(); + MPI_Barrier(MPI_COMM_WORLD); total_procs=0; - MPI::COMM_WORLD.Allreduce(&vote, &total_procs, 1, MPI_INT, MPI_SUM); + MPI_Allreduce(&vote, &total_procs, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD); #endif } // tessellate @@ -497,7 +501,7 @@ template void seeds_from_prng(const MMSP::grid >& grid, const int& nseeds, std::vector >& local_seeds) { int id=0; #ifdef MPI_VERSION - id=MPI::COMM_WORLD.Get_rank(); + MPI_Comm_rank(MPI_COMM_WORLD, &id); #endif unsigned long int pseudorand_seed = time(NULL); @@ -524,7 +528,7 @@ template void seeds_from_file(const MMSP::grid >& grid, const std::string& seed_filename, std::vector >& local_seeds) { int id=0; #ifdef MPI_VERSION - id=MPI::COMM_WORLD.Get_rank(); + MPI_Comm_rank(MPI_COMM_WORLD, &id); #endif if (id == 0) std::cout << "Reading seeds from " << seed_filename << std::endl; @@ -565,7 +569,7 @@ template void tessellate(MMSP::grid >& grid, const int& nseeds) { int np=1; #ifdef MPI_VERSION - np=MPI::COMM_WORLD.Get_size(); + MPI_Comm_size(MPI_COMM_WORLD, &np); #endif std::vector > local_seeds; // blank for now std::vector > > seeds; @@ -583,7 +587,7 @@ template void tessellate(MMSP::grid >& grid, const std::string& seed_filename) { int np=1; #ifdef MPI_VERSION - np=MPI::COMM_WORLD.Get_size(); + MPI_Comm_size(MPI_COMM_WORLD, &np); #endif std::vector > local_seeds; // blank for now std::vector > > seeds; diff --git a/doc/MMSP.chapter3.tex b/doc/MMSP.chapter3.tex index f2dc693..8a05a81 100644 --- a/doc/MMSP.chapter3.tex +++ b/doc/MMSP.chapter3.tex @@ -34,7 +34,7 @@ \subsection{The {\tt Hello MMSP!} program} MMSP::Finalize(); \end{verbatim} \end{shadebox} -What do these lines do? For single processor programs, they do absolutely nothing -- they could actually be removed without any consequences. However, for programs that use the message passing interface (MPI), they act as wrappers for the similarly named {\tt MPI::Init} and {\tt MPI::Finalize} commands. It's useful to include them here because they'll allow us to write programs that may be compiled for both single or multiple processor environments. +What do these lines do? For single processor programs, they do absolutely nothing -- they could actually be removed without any consequences. However, for programs that use the message passing interface (MPI), they act as wrappers for the similarly named {\tt MPI_Init} and {\tt MPI_Finalize} commands. It's useful to include them here because they'll allow us to write programs that may be compiled for both single or multiple processor environments. Programmers familiar with {\tt c++} will notice that there's obviously some \MMSP\ namespace being used here. For those less familiar, namespaces are a somewhat recent addition to {\tt c++} that are used as a means of avoiding naming conflicts. We can avoid using namespace resolution so frequently if we use an appropriate {\tt using} statement, i.e. \begin{shadebox} diff --git a/include/MMSP.grid.cpp b/include/MMSP.grid.cpp index 94debbb..3fac742 100644 --- a/include/MMSP.grid.cpp +++ b/include/MMSP.grid.cpp @@ -161,20 +161,21 @@ void grid::setup(bool SINGLE) #ifdef MPI_VERSION // get global grid data, set neighbor processors - unsigned int rank = MPI::COMM_WORLD.Get_rank(); - unsigned int np = MPI::COMM_WORLD.Get_size(); + int rank = 0, np = 0; + MPI_Comm_rank(MPI_COMM_WORLD, &rank); + MPI_Comm_size(MPI_COMM_WORLD, &np); // if bool SINGLE is set to true, // we generate grid data only on proc 0 if (not SINGLE) { // compute integral factors of "np" int nfac = 0; - for (unsigned int i=1; i<=np; i++) + for (int i=1; i<=np; i++) if ((np / i)*i == np) nfac += 1; int* factors = new int[nfac]; nfac = 0; - for (unsigned int i=1; i<=np; i++) + for (int i=1; i<=np; i++) if ((np / i)*i == np) { factors[nfac] = i; nfac += 1; @@ -208,7 +209,7 @@ void grid::setup(bool SINGLE) } // compute the product of "dim" factors - unsigned int product = 1; + int product = 1; for (int j=0; j::setup(bool SINGLE) resize(data[i], fields); #ifdef MPI_VERSION - MPI::COMM_WORLD.Barrier(); + MPI_Barrier(MPI_COMM_WORLD); #endif } @@ -413,7 +414,9 @@ template MMSP::vector grid::position(int i) con template void grid::ghostswap() { #ifdef MPI_VERSION - MPI::COMM_WORLD.Barrier(); + MPI_Barrier(MPI_COMM_WORLD); + MPI_Request requests[2]; + MPI_Status statuses[2]; for (int i=0; i void grid::ghostswap() unsigned long recv_size = 0; // Small data transfer: blocking Sendrecv should scale -- but don't plan on it. - MPI::Request requests[2]; - requests[0] = MPI::COMM_WORLD.Isend(&send_size, 1, MPI_UNSIGNED_LONG, send_proc, 100); // send number of ghosts - requests[1] = MPI::COMM_WORLD.Irecv(&recv_size, 1, MPI_UNSIGNED_LONG, recv_proc, 100); // receive number of ghosts - MPI::Request::Waitall(2, requests); - MPI::COMM_WORLD.Barrier(); + MPI_Irecv(&recv_size, 1, MPI_UNSIGNED_LONG, recv_proc, 100, MPI_COMM_WORLD, &requests[0]); // receive number of ghosts + MPI_Isend(&send_size, 1, MPI_UNSIGNED_LONG, send_proc, 100, MPI_COMM_WORLD, &requests[1]);// send number of ghosts + MPI_Waitall(2, requests, statuses); + MPI_Barrier(MPI_COMM_WORLD); + char* send_buffer = new char[send_size]; char* recv_buffer = new char[recv_size]; send_size = this->to_buffer(send_buffer, send_min, send_max); // Large data transfer requires non-blocking communication - requests[0] = MPI::COMM_WORLD.Isend(send_buffer, send_size, MPI_CHAR, send_proc, 200); // send ghosts - requests[1] = MPI::COMM_WORLD.Irecv(recv_buffer, recv_size, MPI_CHAR, recv_proc, 200); // receive ghosts - MPI::Request::Waitall(2, requests); - MPI::COMM_WORLD.Barrier(); + MPI_Irecv(recv_buffer, recv_size, MPI_CHAR, recv_proc, 200, MPI_COMM_WORLD, &requests[0]); // receive ghosts + MPI_Isend(send_buffer, send_size, MPI_CHAR, send_proc, 200, MPI_COMM_WORLD, &requests[1]);// send ghosts + MPI_Waitall(2, requests, statuses); + MPI_Barrier(MPI_COMM_WORLD); + this->from_buffer(recv_buffer, recv_min, recv_max); // populate ghost cell data from buffer + delete [] send_buffer; send_buffer=NULL; delete [] recv_buffer; @@ -482,20 +487,20 @@ template void grid::ghostswap() unsigned long recv_size = 0; // Small data transfer: blocking Sendrecv should scale -- but don't plan on it. - MPI::Request requests[2]; - requests[0] = MPI::COMM_WORLD.Isend(&send_size, 1, MPI_UNSIGNED_LONG, send_proc, 300); // send number of ghosts - requests[1] = MPI::COMM_WORLD.Irecv(&recv_size, 1, MPI_UNSIGNED_LONG, recv_proc, 300); // receive number of incoming ghosts - MPI::Request::Waitall(2, requests); - MPI::COMM_WORLD.Barrier(); + MPI_Irecv(&recv_size, 1, MPI_UNSIGNED_LONG, recv_proc, 300, MPI_COMM_WORLD, &requests[0]); // receive number of incoming ghosts + MPI_Isend(&send_size, 1, MPI_UNSIGNED_LONG, send_proc, 300, MPI_COMM_WORLD, &requests[1]);// send number of ghosts + MPI_Waitall(2, requests, statuses); + MPI_Barrier(MPI_COMM_WORLD); + char* send_buffer = new char[send_size]; char* recv_buffer = new char[recv_size]; send_size = this->to_buffer(send_buffer, send_min, send_max); // Large data transfer requires non-blocking communication - requests[0] = MPI::COMM_WORLD.Isend(send_buffer, send_size, MPI_CHAR, send_proc, 400); // send ghosts - requests[1] = MPI::COMM_WORLD.Irecv(recv_buffer, recv_size, MPI_CHAR, recv_proc, 400); // receive ghosts - MPI::Request::Waitall(2, requests); - MPI::COMM_WORLD.Barrier(); + MPI_Irecv(recv_buffer, recv_size, MPI_CHAR, recv_proc, 400, MPI_COMM_WORLD, &requests[0]); // receive ghosts + MPI_Isend(send_buffer, send_size, MPI_CHAR, send_proc, 400, MPI_COMM_WORLD, &requests[1]);// send ghosts + MPI_Waitall(2, requests, statuses); + MPI_Barrier(MPI_COMM_WORLD); this->from_buffer(recv_buffer, recv_min, recv_max); // populate ghost cell data from buffer @@ -505,16 +510,19 @@ template void grid::ghostswap() recv_buffer=NULL; } } - MPI::COMM_WORLD.Barrier(); + MPI_Barrier(MPI_COMM_WORLD); #endif } template void grid::ghostswap(const int sublattice) // ghostswap for Monte Carlo communiation reduction. { #ifdef MPI_VERSION - MPI::COMM_WORLD.Barrier(); + MPI_Barrier(MPI_COMM_WORLD); for (int i=0; i void grid::ghostswap(const int sublattice) unsigned long recv_size = 0; // Small data transfer: blocking Sendrecv should scale -- but don't plan on it. - MPI::Request requests[2]; - requests[0] = MPI::COMM_WORLD.Isend(&send_size, 1, MPI_UNSIGNED_LONG, send_proc, 100); // send number of ghosts - requests[1] = MPI::COMM_WORLD.Irecv(&recv_size, 1, MPI_UNSIGNED_LONG, recv_proc, 100); // receive number of ghosts - MPI::Request::Waitall(2, requests); - MPI::COMM_WORLD.Barrier(); + MPI_Irecv(&recv_size, 1, MPI_UNSIGNED_LONG, recv_proc, 100, MPI_COMM_WORLD, &requests[0]); // receive number of ghosts + MPI_Isend(&send_size, 1, MPI_UNSIGNED_LONG, send_proc, 100, MPI_COMM_WORLD, &requests[1]);// send number of ghosts + MPI_Waitall(2, requests, statuses); + MPI_Barrier(MPI_COMM_WORLD); + char* send_buffer = new char[send_size]; char* recv_buffer = new char[recv_size]; send_size = this->to_buffer_save(send_buffer, send_min, send_max); // Large data transfer requires non-blocking communication - requests[0] = MPI::COMM_WORLD.Isend(send_buffer, send_size, MPI_CHAR, send_proc, 200); // send ghosts - requests[1] = MPI::COMM_WORLD.Irecv(recv_buffer, recv_size, MPI_CHAR, recv_proc, 200); // receive ghosts - MPI::Request::Waitall(2, requests); - MPI::COMM_WORLD.Barrier(); + MPI_Irecv(recv_buffer, recv_size, MPI_CHAR, recv_proc, 200, MPI_COMM_WORLD, &requests[0]); // receive ghosts + MPI_Isend(send_buffer, send_size, MPI_CHAR, send_proc, 200, MPI_COMM_WORLD, &requests[1]);// send ghosts + MPI_Waitall(2, requests, statuses); + MPI_Barrier(MPI_COMM_WORLD); this->from_buffer_save(recv_buffer, recv_min, recv_max); // populate ghost cell data from buffer @@ -777,6 +785,9 @@ template void grid::ghostswap(const int sublattice) } if (1) { + MPI_Request requests[2]; + MPI_Status statuses[2]; + // send to processor below and receive from processor above int send_proc = n0[i]; int recv_proc = n1[i]; @@ -1015,21 +1026,20 @@ template void grid::ghostswap(const int sublattice) unsigned long recv_size = 0; // Small data transfer: blocking Sendrecv should scale -- but don't plan on it. - MPI::Request requests[2]; - requests[0] = MPI::COMM_WORLD.Isend(&send_size, 1, MPI_UNSIGNED_LONG, send_proc, 300); // send number of ghosts - requests[1] = MPI::COMM_WORLD.Irecv(&recv_size, 1, MPI_UNSIGNED_LONG, recv_proc, 300); // receive number of incoming ghosts - MPI::Request::Waitall(2, requests); - MPI::COMM_WORLD.Barrier(); + MPI_Irecv(&recv_size, 1, MPI_UNSIGNED_LONG, recv_proc, 300, MPI_COMM_WORLD, &requests[0]); // receive number of incoming ghosts + MPI_Isend(&send_size, 1, MPI_UNSIGNED_LONG, send_proc, 300, MPI_COMM_WORLD, &requests[1]); // send number of ghosts + MPI_Waitall(2, requests, statuses); + MPI_Barrier(MPI_COMM_WORLD); + char* send_buffer = new char[send_size]; char* recv_buffer = new char[recv_size]; - send_size = this->to_buffer_save(send_buffer, send_min, send_max); // Large data transfer requires non-blocking communication - requests[0] = MPI::COMM_WORLD.Isend(send_buffer, send_size, MPI_CHAR, send_proc, 400); // send ghosts - requests[1] = MPI::COMM_WORLD.Irecv(recv_buffer, recv_size, MPI_CHAR, recv_proc, 400); // receive ghosts - MPI::Request::Waitall(2, requests); - MPI::COMM_WORLD.Barrier(); + MPI_Irecv(recv_buffer, recv_size, MPI_CHAR, recv_proc, 400, MPI_COMM_WORLD, &requests[0]); // receive ghosts + MPI_Isend(send_buffer, send_size, MPI_CHAR, send_proc, 400, MPI_COMM_WORLD, &requests[1]); // send ghosts + MPI_Waitall(2, requests, statuses); + MPI_Barrier(MPI_COMM_WORLD); this->from_buffer_save(recv_buffer, recv_min, recv_max); // populate ghost cell data from buffer @@ -1039,7 +1049,7 @@ template void grid::ghostswap(const int sublattice) recv_buffer=NULL; } } - MPI::COMM_WORLD.Barrier(); + MPI_Barrier(MPI_COMM_WORLD); #endif } @@ -1341,14 +1351,14 @@ template void grid::read(std::ifstream& file, int GH } #ifdef MPI_VERSION - MPI::COMM_WORLD.Barrier(); + MPI_Barrier(MPI_COMM_WORLD); #endif } template void grid::output(const char* filename) const { #ifndef MPI_VERSION - unsigned int np=1; + int np=1; // file open error check std::ofstream output(filename); if (!output) { @@ -1399,9 +1409,10 @@ template void grid::output(const char* filename) con // C-style strings are null-terminated ('\0') by definition for (unsigned int i=0; i void grid::output(const char* filename) con std::cerr << "File output error: could not open " << fname << "." << std::endl; exit(-1); } - MPI::COMM_WORLD.Barrier(); + MPI_Barrier(MPI_COMM_WORLD); // Generate MMSP header from rank 0 unsigned long header_offset=0; @@ -1462,8 +1473,8 @@ template void grid::output(const char* filename) con header=NULL; } MPI_File_sync(output); - MPI::COMM_WORLD.Barrier(); - MPI::COMM_WORLD.Bcast(&header_offset, 1, MPI_UNSIGNED_LONG, 0); // broadcast header size from rank 0 + MPI_Barrier(MPI_COMM_WORLD); + MPI_Bcast(&header_offset, 1, MPI_UNSIGNED_LONG, 0, MPI_COMM_WORLD); // broadcast header size from rank 0 // get grid data to write char* buffer=NULL; @@ -1472,16 +1483,16 @@ template void grid::output(const char* filename) con // Compute file offsets based on buffer sizes unsigned long* datasizes = new unsigned long[np]; - MPI::COMM_WORLD.Allgather(&size_of_buffer, 1, MPI_UNSIGNED_LONG, datasizes, 1, MPI_UNSIGNED_LONG); + MPI_Allgather(&size_of_buffer, 1, MPI_UNSIGNED_LONG, datasizes, 1, MPI_UNSIGNED_LONG, MPI_COMM_WORLD); // Calculate disk space unsigned long filesize=0; - for (unsigned int i=0; i(std::numeric_limits::max())); offsets[n]=offsets[n-1]+datasizes[n-1]; } @@ -1491,14 +1502,16 @@ template void grid::output(const char* filename) con #endif // Write buffer to disk - MPI::COMM_WORLD.Barrier(); + MPI_Barrier(MPI_COMM_WORLD); MPI_File_write_at_all(output, offsets[rank], buffer, datasizes[rank], MPI_CHAR, &status); #ifdef GRIDDEBUG - int error, write_errors=0; + int error, errclass, write_errors=0; MPI_Get_count(&status, MPI_INT, &error); - if (error!=0) - std::cerr<<" Error on Rank "< void grid::output(const char* filename) con // Make sure everything's written before closing the file. MPI_File_sync(output); - MPI::COMM_WORLD.Barrier(); + MPI_Barrier(MPI_COMM_WORLD); MPI_Offset actual_size; MPI_File_get_size(output, &actual_size); - MPI::COMM_WORLD.Barrier(); + MPI_Barrier(MPI_COMM_WORLD); MPI_File_close(&output); if (rank==0) { @@ -1541,7 +1554,7 @@ template void grid::output(const char* filename) con char* databuffer=NULL; char* headbuffer=NULL; char* filebuffer=NULL; - unsigned int* writeranks=NULL; + int* writeranks=NULL; MPI_Request* recvrequests = NULL; MPI_Status* recvstatuses = NULL; int mpi_err = 0; @@ -1572,27 +1585,27 @@ template void grid::output(const char* filename) con memcpy(headbuffer+header_offset, reinterpret_cast(&np), sizeof(np)); header_offset+=sizeof(rank); } - MPI::COMM_WORLD.Bcast(&header_offset, 1, MPI_UNSIGNED_LONG, 0); // broadcast header size from rank 0 + MPI_Bcast(&header_offset, 1, MPI_UNSIGNED_LONG, 0, MPI_COMM_WORLD); // broadcast header size from rank 0 #ifdef GRIDDEBUG if (rank==0) std::cout<<"Prepared file header."<(std::numeric_limits::max())); offsets[n]=offsets[n-1]+datasizes[n-1]; } @@ -1603,9 +1616,9 @@ template void grid::output(const char* filename) con #endif // Calculate number of writers & write size - unsigned long blocks = filesize/blocksize; + unsigned int blocks = filesize/blocksize; while (blocks*blocksizenp)?np:blocks; + const unsigned int nwriters = (int(blocks)>np)?np:blocks; const unsigned long writesize=blocksize*(blocks/nwriters); assert(writesize % blocksize==0); const unsigned long excessblocks=blocks % nwriters; @@ -1615,10 +1628,10 @@ template void grid::output(const char* filename) con #endif // Scan to determine which ranks are writers - writeranks = new unsigned int[nwriters+1]; + writeranks = new int[nwriters+1]; aoffsets = new unsigned long[nwriters]; writeranks[nwriters]=np-1; // generalization for last writer's benefit - unsigned int temprank=0; + int temprank=0; for (unsigned int w=0; w void grid::output(const char* filename) con } // Collect block misalignments misalignments = new unsigned long[np]; - MPI::COMM_WORLD.Allgather(&deficiency, 1, MPI_UNSIGNED_LONG, misalignments, 1, MPI_UNSIGNED_LONG); + MPI_Allgather(&deficiency, 1, MPI_UNSIGNED_LONG, misalignments, 1, MPI_UNSIGNED_LONG, MPI_COMM_WORLD); #ifdef GRIDDEBUG if (datasizes[rank]-deficiency>ws) @@ -1669,9 +1682,9 @@ template void grid::output(const char* filename) con #endif // Accumulate data - const unsigned int silentranks=writeranks[nextwriter]-rank; // number of MPI ranks between this rank and the next writer + const int silentranks=writeranks[nextwriter]-rank; // number of MPI ranks between this rank and the next writer MPI_Request sendrequest; - MPI::COMM_WORLD.Barrier(); + MPI_Barrier(MPI_COMM_WORLD); if (isWriter) { // This rank is a writer. assert(misalignments[rank] < datasizes[rank]); @@ -1700,8 +1713,8 @@ template void grid::output(const char* filename) con recvrequests = new MPI_Request[silentranks]; recvstatuses = new MPI_Status[silentranks]; } - for (unsigned int i=0; inp) @@ -1713,7 +1726,7 @@ template void grid::output(const char* filename) con if (p+recv_size>filebuffer+ws) std::fprintf(stderr, "Error on Rank %u, receiving from %i: %lu B > %lu B\n", rank, recv_proc, p-filebuffer, ws-recv_size); #endif - MPI_Irecv(p, recv_size, MPI_CHAR, recv_proc, recv_proc, MPI::COMM_WORLD, &recvrequests[i]); + MPI_Irecv(p, recv_size, MPI_CHAR, recv_proc, recv_proc, MPI_COMM_WORLD, &recvrequests[i]); p+=recv_size; } #ifdef GRIDDEBUG @@ -1723,17 +1736,17 @@ template void grid::output(const char* filename) con if (rank>0 && misalignments[rank]>0) { q=databuffer; assert(writeranks[prevwriter]= datasizes[rank]) { assert(writeranks[prevwriter]0) MPI_Wait(&sendrequest, &status); - MPI::COMM_WORLD.Barrier(); + MPI_Barrier(MPI_COMM_WORLD); // file open error check #ifdef GRIDDEBUG @@ -1751,7 +1764,7 @@ template void grid::output(const char* filename) con std::cerr << "File output error: could not open " << fname << "." << std::endl; exit(-1); } - MPI::COMM_WORLD.Barrier(); + MPI_Barrier(MPI_COMM_WORLD); // Write to disk if (filebuffer!=NULL) { @@ -1773,7 +1786,7 @@ template void grid::output(const char* filename) con } MPI_File_sync(output); - MPI::COMM_WORLD.Barrier(); + MPI_Barrier(MPI_COMM_WORLD); MPI_File_close(&output); if (recvrequests!=NULL) { diff --git a/include/MMSP.main.hpp b/include/MMSP.main.hpp index 9ec3d88..4a73e43 100644 --- a/include/MMSP.main.hpp +++ b/include/MMSP.main.hpp @@ -50,7 +50,7 @@ int main(int argc, char* argv[]) { // _exactly once_, making this the proper place for it. int rank = 0; #ifdef MPI_VERSION - rank = MPI::COMM_WORLD.Get_rank(); + MPI_Comm_rank(MPI_COMM_WORLD, &rank); #endif srand(time(NULL)+rank); diff --git a/include/MMSP.utility.cpp b/include/MMSP.utility.cpp index 2cb51a1..ad9bb2e 100644 --- a/include/MMSP.utility.cpp +++ b/include/MMSP.utility.cpp @@ -14,7 +14,7 @@ namespace MMSP void Init(int argc, char* argv[]) { #ifdef MPI_VERSION - MPI::Init(argc, argv); + MPI_Init(&argc, &argv); #endif } @@ -22,7 +22,7 @@ void Init(int argc, char* argv[]) void Finalize() { #ifdef MPI_VERSION - MPI::Finalize(); + MPI_Finalize(); #endif } @@ -30,7 +30,7 @@ void Finalize() void Abort(int err) { #ifdef MPI_VERSION - MPI::COMM_WORLD.Abort(err); + MPI_Abort(MPI_COMM_WORLD, err); #endif exit(err); } @@ -64,17 +64,19 @@ template T global(T& value, const char* operation) T global = value; #ifdef MPI_VERSION - int rank = MPI::COMM_WORLD.Get_rank(); - int np = MPI::COMM_WORLD.Get_size(); + int rank = 0, np = 1; + MPI_Comm_rank(MPI_COMM_WORLD, &rank); + MPI_Comm_size(MPI_COMM_WORLD, &np); + MPI_Status status; if (rank == 0) { // receive local values for (int i = 1; i < np; i++) { T temp; int size; - MPI::COMM_WORLD.Recv(&size, 1, MPI_INT, i, 100); + MPI_Recv(&size, 1, MPI_INT, i, 100, MPI_COMM_WORLD, &status); char* buffer = new char[size]; - MPI::COMM_WORLD.Recv(buffer, size, MPI_CHAR, i, 200); + MPI_Recv(buffer, size, MPI_CHAR, i, 200, MPI_COMM_WORLD, &status); from_buffer(temp, buffer); if (buffer != NULL) { delete [] buffer; @@ -93,10 +95,10 @@ template T global(T& value, const char* operation) // send global value for (int i = 1; i < np; i++) { int size = buffer_size(global); - MPI::COMM_WORLD.Send(&size, 1, MPI_INT, i, 300); + MPI_Send(&size, 1, MPI_INT, i, 300, MPI_COMM_WORLD); char* buffer = new char[size]; to_buffer(global, buffer); - MPI::COMM_WORLD.Send(buffer, size, MPI_CHAR, i, 400); + MPI_Send(buffer, size, MPI_CHAR, i, 400, MPI_COMM_WORLD); if (buffer != NULL) { delete [] buffer; buffer=NULL; @@ -107,19 +109,19 @@ template T global(T& value, const char* operation) else { // send local value int size = buffer_size(value); - MPI::COMM_WORLD.Send(&size, 1, MPI_INT, 0, 100); + MPI_Send(&size, 1, MPI_INT, 0, 100, MPI_COMM_WORLD); char* buffer = new char[size]; to_buffer(value, buffer); - MPI::COMM_WORLD.Send(buffer, size, MPI_CHAR, 0, 200); + MPI_Send(buffer, size, MPI_CHAR, 0, 200, MPI_COMM_WORLD); if (buffer != NULL) { delete [] buffer; buffer=NULL; } // receive global value - MPI::COMM_WORLD.Recv(&size, 1, MPI_INT, 0, 300); + MPI_Recv(&size, 1, MPI_INT, 0, 300, MPI_COMM_WORLD, &status); buffer = new char[size]; - MPI::COMM_WORLD.Recv(buffer, size, MPI_CHAR, 0, 400); + MPI_Recv(buffer, size, MPI_CHAR, 0, 400, MPI_COMM_WORLD, &status); from_buffer(global, buffer); if (buffer != NULL) { delete [] buffer; @@ -127,7 +129,7 @@ template T global(T& value, const char* operation) } } - MPI::COMM_WORLD.Barrier(); + MPI_Barrier(MPI_COMM_WORLD); #endif return global; @@ -139,8 +141,13 @@ void print_progress(const int step, const int steps) Prints timestamps and a 20-point progress bar to stdout. Call once inside the update function (or equivalent). - for (int step=0; stepgrid1D),64); #else - int np = MPI::COMM_WORLD.Get_size(); + int np = 0; + MPI_Comm_size(MPI_COMM_WORLD, &size); EXPECT_LE(MMSP::nodes(this->grid1D),1+64/np); #endif EXPECT_EQ(this->grid1D.buffer_size(),MMSP::nodes(this->grid1D)*sizeof(TypeParam)); diff --git a/test/test.cpp b/test/test.cpp index e6dafb4..5be566c 100644 --- a/test/test.cpp +++ b/test/test.cpp @@ -13,8 +13,9 @@ int main(int argc, char* argv[]) #endif #ifdef MPI_VERSION - int id = MPI::COMM_WORLD.Get_rank(); - int np = MPI::COMM_WORLD.Get_size(); + int id = 0, np = 1; + MPI_Comm_rank(MPI_COMM_WORLD, &id); + MPI_Comm_size(MPI_COMM_WORLD, &np); std::cout<<"This is a test (processor "< Date: Wed, 21 Oct 2020 20:24:58 -0400 Subject: [PATCH 35/37] resolve OpenMPI error with non-const pointer in Allgather --- include/MMSP.grid.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/include/MMSP.grid.cpp b/include/MMSP.grid.cpp index 3fac742..1b9080f 100644 --- a/include/MMSP.grid.cpp +++ b/include/MMSP.grid.cpp @@ -1593,7 +1593,8 @@ template void grid::output(const char* filename) con // Compute file offsets based on buffer sizes datasizes = new unsigned long[np]; - MPI_Allgather(&size_of_buffer, 1, MPI_UNSIGNED_LONG, datasizes, 1, MPI_UNSIGNED_LONG, MPI_COMM_WORLD); + const unsigned long* size_pointer = &size_of_buffer; // because OpenMPI is annoying about the first pointer being const + MPI_Allgather(size_pointer, 1, MPI_UNSIGNED_LONG, datasizes, 1, MPI_UNSIGNED_LONG, MPI_COMM_WORLD); #ifdef GRIDDEBUG if (rank==0) std::cout<<"Synchronized data sizes."< Date: Thu, 22 Oct 2020 11:16:37 -0400 Subject: [PATCH 36/37] Revert "resolve OpenMPI error with non-const pointer in Allgather" This reverts commit dbd9768176ce1e276ac5d832a79050c982dcbfb2. --- include/MMSP.grid.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/include/MMSP.grid.cpp b/include/MMSP.grid.cpp index 1b9080f..3fac742 100644 --- a/include/MMSP.grid.cpp +++ b/include/MMSP.grid.cpp @@ -1593,8 +1593,7 @@ template void grid::output(const char* filename) con // Compute file offsets based on buffer sizes datasizes = new unsigned long[np]; - const unsigned long* size_pointer = &size_of_buffer; // because OpenMPI is annoying about the first pointer being const - MPI_Allgather(size_pointer, 1, MPI_UNSIGNED_LONG, datasizes, 1, MPI_UNSIGNED_LONG, MPI_COMM_WORLD); + MPI_Allgather(&size_of_buffer, 1, MPI_UNSIGNED_LONG, datasizes, 1, MPI_UNSIGNED_LONG, MPI_COMM_WORLD); #ifdef GRIDDEBUG if (rank==0) std::cout<<"Synchronized data sizes."< Date: Thu, 22 Oct 2020 11:20:40 -0400 Subject: [PATCH 37/37] evade dodgy OpenMPI compiler error --- .../coarsening/grain_growth/anisotropic/Monte_Carlo/Makefile | 4 ++-- .../coarsening/grain_growth/anisotropic/phase_field/Makefile | 2 +- .../coarsening/grain_growth/anisotropic/sparsePF/Makefile | 2 +- .../coarsening/grain_growth/isotropic/Monte_Carlo/Makefile | 2 +- .../coarsening/grain_growth/isotropic/phase_field/Makefile | 2 +- examples/coarsening/grain_growth/isotropic/sparsePF/Makefile | 2 +- .../ostwald_ripening/isotropic/phase_field/Makefile | 2 +- .../coarsening/zener_pinning/anisotropic/Monte_Carlo/Makefile | 2 +- .../coarsening/zener_pinning/anisotropic/phase_field/Makefile | 2 +- .../coarsening/zener_pinning/anisotropic/sparsePF/Makefile | 2 +- .../coarsening/zener_pinning/isotropic/Monte_Carlo/Makefile | 2 +- .../coarsening/zener_pinning/isotropic/phase_field/Makefile | 2 +- examples/coarsening/zener_pinning/isotropic/sparsePF/Makefile | 2 +- examples/differential_equations/elliptic/Poisson/Makefile | 2 +- examples/phase_transitions/allen-cahn/Makefile | 2 +- .../phase_transitions/cahn-hilliard/convex_splitting/Makefile | 2 +- examples/phase_transitions/cahn-hilliard/explicit/Makefile | 2 +- examples/phase_transitions/model_A/Makefile | 2 +- examples/phase_transitions/model_B/Makefile | 2 +- .../phase_transitions/solidification/anisotropic/Makefile | 2 +- examples/phase_transitions/spinodal/Makefile | 2 +- examples/statistical_mechanics/Heisenberg/Makefile | 2 +- examples/statistical_mechanics/Ising/Makefile | 2 +- examples/statistical_mechanics/Potts/Makefile | 2 +- 24 files changed, 25 insertions(+), 25 deletions(-) diff --git a/examples/coarsening/grain_growth/anisotropic/Monte_Carlo/Makefile b/examples/coarsening/grain_growth/anisotropic/Monte_Carlo/Makefile index 1794c14..e08b00d 100644 --- a/examples/coarsening/grain_growth/anisotropic/Monte_Carlo/Makefile +++ b/examples/coarsening/grain_growth/anisotropic/Monte_Carlo/Makefile @@ -8,8 +8,8 @@ incdir = ../../../../../include # compilers/flags compiler = g++ pcompiler = mpic++ -flags = -g -Wall -I $(incdir) -pflags = $(flags) -include mpi.h +flags = -O3 -Wall -I $(incdir) +pflags = $(flags) -fpermissive -include mpi.h # the program graingrowth: graingrowth.cpp diff --git a/examples/coarsening/grain_growth/anisotropic/phase_field/Makefile b/examples/coarsening/grain_growth/anisotropic/phase_field/Makefile index 64e476a..e08b00d 100644 --- a/examples/coarsening/grain_growth/anisotropic/phase_field/Makefile +++ b/examples/coarsening/grain_growth/anisotropic/phase_field/Makefile @@ -9,7 +9,7 @@ incdir = ../../../../../include compiler = g++ pcompiler = mpic++ flags = -O3 -Wall -I $(incdir) -pflags = $(flags) -include mpi.h +pflags = $(flags) -fpermissive -include mpi.h # the program graingrowth: graingrowth.cpp diff --git a/examples/coarsening/grain_growth/anisotropic/sparsePF/Makefile b/examples/coarsening/grain_growth/anisotropic/sparsePF/Makefile index 64e476a..e08b00d 100644 --- a/examples/coarsening/grain_growth/anisotropic/sparsePF/Makefile +++ b/examples/coarsening/grain_growth/anisotropic/sparsePF/Makefile @@ -9,7 +9,7 @@ incdir = ../../../../../include compiler = g++ pcompiler = mpic++ flags = -O3 -Wall -I $(incdir) -pflags = $(flags) -include mpi.h +pflags = $(flags) -fpermissive -include mpi.h # the program graingrowth: graingrowth.cpp diff --git a/examples/coarsening/grain_growth/isotropic/Monte_Carlo/Makefile b/examples/coarsening/grain_growth/isotropic/Monte_Carlo/Makefile index 64e476a..e08b00d 100644 --- a/examples/coarsening/grain_growth/isotropic/Monte_Carlo/Makefile +++ b/examples/coarsening/grain_growth/isotropic/Monte_Carlo/Makefile @@ -9,7 +9,7 @@ incdir = ../../../../../include compiler = g++ pcompiler = mpic++ flags = -O3 -Wall -I $(incdir) -pflags = $(flags) -include mpi.h +pflags = $(flags) -fpermissive -include mpi.h # the program graingrowth: graingrowth.cpp diff --git a/examples/coarsening/grain_growth/isotropic/phase_field/Makefile b/examples/coarsening/grain_growth/isotropic/phase_field/Makefile index 64e476a..e08b00d 100644 --- a/examples/coarsening/grain_growth/isotropic/phase_field/Makefile +++ b/examples/coarsening/grain_growth/isotropic/phase_field/Makefile @@ -9,7 +9,7 @@ incdir = ../../../../../include compiler = g++ pcompiler = mpic++ flags = -O3 -Wall -I $(incdir) -pflags = $(flags) -include mpi.h +pflags = $(flags) -fpermissive -include mpi.h # the program graingrowth: graingrowth.cpp diff --git a/examples/coarsening/grain_growth/isotropic/sparsePF/Makefile b/examples/coarsening/grain_growth/isotropic/sparsePF/Makefile index 64e476a..e08b00d 100644 --- a/examples/coarsening/grain_growth/isotropic/sparsePF/Makefile +++ b/examples/coarsening/grain_growth/isotropic/sparsePF/Makefile @@ -9,7 +9,7 @@ incdir = ../../../../../include compiler = g++ pcompiler = mpic++ flags = -O3 -Wall -I $(incdir) -pflags = $(flags) -include mpi.h +pflags = $(flags) -fpermissive -include mpi.h # the program graingrowth: graingrowth.cpp diff --git a/examples/coarsening/ostwald_ripening/isotropic/phase_field/Makefile b/examples/coarsening/ostwald_ripening/isotropic/phase_field/Makefile index edf0b88..25f52c3 100644 --- a/examples/coarsening/ostwald_ripening/isotropic/phase_field/Makefile +++ b/examples/coarsening/ostwald_ripening/isotropic/phase_field/Makefile @@ -9,7 +9,7 @@ incdir = ../../../../../include compiler = g++ pcompiler = mpic++ flags = -O3 -Wall -I $(incdir) -pflags = $(flags) -include mpi.h +pflags = $(flags) -fpermissive -include mpi.h # the program ostwald: ostwald.cpp diff --git a/examples/coarsening/zener_pinning/anisotropic/Monte_Carlo/Makefile b/examples/coarsening/zener_pinning/anisotropic/Monte_Carlo/Makefile index 25a81d7..c1c5d68 100644 --- a/examples/coarsening/zener_pinning/anisotropic/Monte_Carlo/Makefile +++ b/examples/coarsening/zener_pinning/anisotropic/Monte_Carlo/Makefile @@ -9,7 +9,7 @@ incdir = ../../../../../include compiler = g++ pcompiler = mpic++ flags = -O3 -Wall -I $(incdir) -pflags = $(flags) -include mpi.h +pflags = $(flags) -fpermissive -include mpi.h # the program zener: zener.cpp diff --git a/examples/coarsening/zener_pinning/anisotropic/phase_field/Makefile b/examples/coarsening/zener_pinning/anisotropic/phase_field/Makefile index 0f05587..33ad0c3 100644 --- a/examples/coarsening/zener_pinning/anisotropic/phase_field/Makefile +++ b/examples/coarsening/zener_pinning/anisotropic/phase_field/Makefile @@ -9,7 +9,7 @@ incdir = ../../../../../include compiler = g++ pcompiler = mpic++ flags = -O3 -Wall -I $(incdir) -pflags = $(flags) -include mpi.h +pflags = $(flags) -fpermissive -include mpi.h # the program zener: zener.cpp diff --git a/examples/coarsening/zener_pinning/anisotropic/sparsePF/Makefile b/examples/coarsening/zener_pinning/anisotropic/sparsePF/Makefile index 0f05587..33ad0c3 100644 --- a/examples/coarsening/zener_pinning/anisotropic/sparsePF/Makefile +++ b/examples/coarsening/zener_pinning/anisotropic/sparsePF/Makefile @@ -9,7 +9,7 @@ incdir = ../../../../../include compiler = g++ pcompiler = mpic++ flags = -O3 -Wall -I $(incdir) -pflags = $(flags) -include mpi.h +pflags = $(flags) -fpermissive -include mpi.h # the program zener: zener.cpp diff --git a/examples/coarsening/zener_pinning/isotropic/Monte_Carlo/Makefile b/examples/coarsening/zener_pinning/isotropic/Monte_Carlo/Makefile index 0f05587..33ad0c3 100644 --- a/examples/coarsening/zener_pinning/isotropic/Monte_Carlo/Makefile +++ b/examples/coarsening/zener_pinning/isotropic/Monte_Carlo/Makefile @@ -9,7 +9,7 @@ incdir = ../../../../../include compiler = g++ pcompiler = mpic++ flags = -O3 -Wall -I $(incdir) -pflags = $(flags) -include mpi.h +pflags = $(flags) -fpermissive -include mpi.h # the program zener: zener.cpp diff --git a/examples/coarsening/zener_pinning/isotropic/phase_field/Makefile b/examples/coarsening/zener_pinning/isotropic/phase_field/Makefile index 0f05587..33ad0c3 100644 --- a/examples/coarsening/zener_pinning/isotropic/phase_field/Makefile +++ b/examples/coarsening/zener_pinning/isotropic/phase_field/Makefile @@ -9,7 +9,7 @@ incdir = ../../../../../include compiler = g++ pcompiler = mpic++ flags = -O3 -Wall -I $(incdir) -pflags = $(flags) -include mpi.h +pflags = $(flags) -fpermissive -include mpi.h # the program zener: zener.cpp diff --git a/examples/coarsening/zener_pinning/isotropic/sparsePF/Makefile b/examples/coarsening/zener_pinning/isotropic/sparsePF/Makefile index 0f05587..33ad0c3 100644 --- a/examples/coarsening/zener_pinning/isotropic/sparsePF/Makefile +++ b/examples/coarsening/zener_pinning/isotropic/sparsePF/Makefile @@ -9,7 +9,7 @@ incdir = ../../../../../include compiler = g++ pcompiler = mpic++ flags = -O3 -Wall -I $(incdir) -pflags = $(flags) -include mpi.h +pflags = $(flags) -fpermissive -include mpi.h # the program zener: zener.cpp diff --git a/examples/differential_equations/elliptic/Poisson/Makefile b/examples/differential_equations/elliptic/Poisson/Makefile index 6f2c9d4..d288be5 100644 --- a/examples/differential_equations/elliptic/Poisson/Makefile +++ b/examples/differential_equations/elliptic/Poisson/Makefile @@ -8,7 +8,7 @@ incdir = ../../../../include compiler = g++ pcompiler = mpic++ flags = -O3 -Wall -I $(incdir) -pflags = $(flags) -include mpi.h +pflags = $(flags) -fpermissive -include mpi.h # the program poisson: poisson.cpp diff --git a/examples/phase_transitions/allen-cahn/Makefile b/examples/phase_transitions/allen-cahn/Makefile index b15a975..5b66949 100644 --- a/examples/phase_transitions/allen-cahn/Makefile +++ b/examples/phase_transitions/allen-cahn/Makefile @@ -9,7 +9,7 @@ incdir = ../../../include compiler = g++ pcompiler = mpic++ flags = -O3 -Wall -I $(incdir) -pflags = $(flags) -include mpi.h +pflags = $(flags) -fpermissive -include mpi.h # the program allen-cahn: allen-cahn.cpp diff --git a/examples/phase_transitions/cahn-hilliard/convex_splitting/Makefile b/examples/phase_transitions/cahn-hilliard/convex_splitting/Makefile index f16aeee..a2b81a0 100644 --- a/examples/phase_transitions/cahn-hilliard/convex_splitting/Makefile +++ b/examples/phase_transitions/cahn-hilliard/convex_splitting/Makefile @@ -10,7 +10,7 @@ incdir = ../../../../include compiler = g++ pcompiler = mpic++ flags = -O3 -Wall -DVANILLA -I $(incdir) -pflags = $(flags) -include mpi.h +pflags = $(flags) -fpermissive -include mpi.h # the program cahn-hilliard: cahn-hilliard.cpp diff --git a/examples/phase_transitions/cahn-hilliard/explicit/Makefile b/examples/phase_transitions/cahn-hilliard/explicit/Makefile index 081bd9f..9f2c418 100644 --- a/examples/phase_transitions/cahn-hilliard/explicit/Makefile +++ b/examples/phase_transitions/cahn-hilliard/explicit/Makefile @@ -9,7 +9,7 @@ incdir = ../../../../include compiler = g++ pcompiler = mpic++ flags = -O3 -Wall -I $(incdir) -pflags = $(flags) -include mpi.h +pflags = $(flags) -fpermissive -include mpi.h # the program cahn-hilliard: cahn-hilliard.cpp diff --git a/examples/phase_transitions/model_A/Makefile b/examples/phase_transitions/model_A/Makefile index 89830cd..267978f 100644 --- a/examples/phase_transitions/model_A/Makefile +++ b/examples/phase_transitions/model_A/Makefile @@ -9,7 +9,7 @@ incdir = ../../../include compiler = g++ pcompiler = mpic++ flags = -O3 -Wall -I $(incdir) -pflags = $(flags) -include mpi.h +pflags = $(flags) -fpermissive -include mpi.h # the program model_A: model_A.cpp diff --git a/examples/phase_transitions/model_B/Makefile b/examples/phase_transitions/model_B/Makefile index d246041..9fde539 100644 --- a/examples/phase_transitions/model_B/Makefile +++ b/examples/phase_transitions/model_B/Makefile @@ -9,7 +9,7 @@ incdir = ../../../include compiler = g++ pcompiler = mpic++ flags = -O3 -Wall -I $(incdir) -pflags = $(flags) -include mpi.h +pflags = $(flags) -fpermissive -include mpi.h # the program model_B: model_B.cpp diff --git a/examples/phase_transitions/solidification/anisotropic/Makefile b/examples/phase_transitions/solidification/anisotropic/Makefile index 307516d..a60f119 100644 --- a/examples/phase_transitions/solidification/anisotropic/Makefile +++ b/examples/phase_transitions/solidification/anisotropic/Makefile @@ -9,7 +9,7 @@ incdir = ../../../../include compiler = g++ pcompiler = mpic++ flags = -O3 -Wall -I $(incdir) -pflags = $(flags) -include mpi.h +pflags = $(flags) -fpermissive -include mpi.h # the program solidification.out: solidification.cpp diff --git a/examples/phase_transitions/spinodal/Makefile b/examples/phase_transitions/spinodal/Makefile index 50acefe..ee6a4bb 100644 --- a/examples/phase_transitions/spinodal/Makefile +++ b/examples/phase_transitions/spinodal/Makefile @@ -9,7 +9,7 @@ incdir = ../../../include compiler = g++ pcompiler = mpic++ flags = -O3 -Wall -I $(incdir) -pflags = $(flags) -include mpi.h +pflags = $(flags) -fpermissive -include mpi.h # the program spinodal: spinodal.cpp diff --git a/examples/statistical_mechanics/Heisenberg/Makefile b/examples/statistical_mechanics/Heisenberg/Makefile index f9eca48..cd7314a 100644 --- a/examples/statistical_mechanics/Heisenberg/Makefile +++ b/examples/statistical_mechanics/Heisenberg/Makefile @@ -9,7 +9,7 @@ incdir = ../../../include/ compiler = g++ pcompiler = mpic++ flags = -O3 -Wall -I $(incdir) -pflags = $(flags) -include mpi.h +pflags = $(flags) -fpermissive -include mpi.h # the program heisenberg: heisenberg.cpp diff --git a/examples/statistical_mechanics/Ising/Makefile b/examples/statistical_mechanics/Ising/Makefile index 464ec18..f2e55d5 100644 --- a/examples/statistical_mechanics/Ising/Makefile +++ b/examples/statistical_mechanics/Ising/Makefile @@ -9,7 +9,7 @@ incdir = ../../../include/ compiler = g++ pcompiler = mpic++ flags = -O3 -Wall -I $(incdir) -pflags = $(flags) -include mpi.h +pflags = $(flags) -fpermissive -include mpi.h # the program ising: ising.cpp diff --git a/examples/statistical_mechanics/Potts/Makefile b/examples/statistical_mechanics/Potts/Makefile index 36cebbe..e4ef077 100644 --- a/examples/statistical_mechanics/Potts/Makefile +++ b/examples/statistical_mechanics/Potts/Makefile @@ -9,7 +9,7 @@ incdir = ../../../include/ compiler = g++ pcompiler = mpic++ flags = -O3 -Wall -I $(incdir) -pflags = $(flags) -include mpi.h +pflags = $(flags) -fpermissive -include mpi.h # the program potts: potts.cpp