|
[Sponsors] |
Summation in Function Object for Multiple Processors |
|
LinkBack | Thread Tools | Search this Thread | Display Modes |
October 10, 2020, 15:09 |
Summation in Function Object for Multiple Processors
|
#1 |
New Member
Emily
Join Date: Sep 2018
Posts: 10
Rep Power: 7 |
This is my first time writing my own function object for OpenFOAM and am struggling to get it to work with mpirun. There are three quantities I want to calculate and write to a file in the postprocessing directory:
- Total volume of my mesh sum(mesh_.V())- Total volume of my liquid (this is multiphase) sum(mesh_.V()*alpha.internalField())- Sum of the position of the cell times the volume times the volume fraction (this should output a vector, not a scalar) sum(mesh_.V()*mesh_.C().internalField()*alpha.inte rnalField())My code seems to work perfectly when I just run interFoam, but gets hung on the summation part with I try to use it with mpirun. To test where it's getting hung, I separated out each of the calculation steps. It made it through until it hit the summation. Please see the code below which has both these test lines and, below that, the lines with correctly write the info to a file when run on a single processor. I have tried both sum and gSum because it sounds like gSum is what should be used for multiple processors. Other forum posts have mentioned having good luck with gSum, but I can't figure out what I'm doing differently/incorrectly. Links to these posts are below. I'm also concerned that even if I can get the summation to work, that it might only sum over the master processor, not all. Does anyone have any recommendations for how to get gSum to work in function objects with mpirun? gSum( ) vs sum() How to sum up a volScalarField Code:
/*---------------------------------------------------------------------------*\ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | Website: https://openfoam.org \\ / A nd | Copyright (C) 2020 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License This file is part of OpenFOAM. OpenFOAM is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. OpenFOAM is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. \*---------------------------------------------------------------------------*/ #include "CM.H" #include "Time.H" #include "fvMesh.H" #include "addToRunTimeSelectionTable.H" #include "fvCFD.H" #include "OSspecific.H" #include <iostream> // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // namespace Foam { namespace functionObjects { defineTypeNameAndDebug(CM, 0); addToRunTimeSelectionTable(functionObject, CM, dictionary); } } // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // Foam::functionObjects::CM::CM ( const word& name, const Time& runTime, const dictionary& dict ) : fvMeshFunctionObject(name, runTime, dict), logFiles(obr_, name)//, { read(dict); resetName(name); } // * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // Foam::functionObjects::CM::~CM() {} // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // void Foam::functionObjects::CM::writeFileHeader(const label i) { } bool Foam::functionObjects::CM::read(const dictionary& dict) { return true; } bool Foam::functionObjects::CM::execute() { return true; } bool Foam::functionObjects::CM::end() { return true; } bool Foam::functionObjects::CM::write() { if (Pstream::master()) { #include "volFields.H" #include "uniformDimensionedFields.H" const volScalarField& alpha = mesh_.lookupObject<volScalarField>("alpha.water"); auto& runTime = fileObr_.time(); logFiles::write(); //This section just tests where the code is getting hung up. w, x, and y make it through fine. z is where it gets stuck when run in parallel auto w = alpha.internalField(); auto x = alpha.internalField()*mesh_.V(); auto y = mesh_.V()*mesh_.C().internalField()*alpha.internalField(); auto z = gSum(mesh_.V()); //This is where it gets stuck //This prints out the results to a file- works on one processor, but not with mpirun file() << runTime.timeName() << " " << gSum(mesh_.V()) << " " << gSum(mesh_.V()*alpha.internalField()) << " " << gSum(mesh_.V()*mesh_.C().internalField()*alpha.internalField()) << endl; } return true; } // ************************************************************************* // |
|
Tags |
function objects, gsum(), mpirun, postprocess function, sum() |
|
|
Similar Threads | ||||
Thread | Thread Starter | Forum | Replies | Last Post |
[Other] mesh airfoil NACA0012 | anand_30 | OpenFOAM Meshing & Mesh Conversion | 13 | March 7, 2022 17:22 |
How to create a function object in OpenFoam that runs properly ? | mkhm | OpenFOAM Programming & Development | 1 | October 20, 2018 16:16 |
[snappyHexMesh] Problem with parallel run of snappyHexMesh | Lorenzo92 | OpenFOAM Meshing & Mesh Conversion | 5 | April 15, 2016 04:12 |
[blockMesh] BlockMeshmergePatchPairs | hjasak | OpenFOAM Meshing & Mesh Conversion | 11 | August 15, 2008 07:36 |
[blockMesh] Axisymmetrical mesh | Rasmus Gjesing (Gjesing) | OpenFOAM Meshing & Mesh Conversion | 10 | April 2, 2007 14:00 |