CFD Online Discussion Forums

CFD Online Discussion Forums (https://www.cfd-online.com/Forums/)
-   OpenFOAM Programming & Development (https://www.cfd-online.com/Forums/openfoam-programming-development/)
-   -   Read a field at different times (https://www.cfd-online.com/Forums/openfoam-programming-development/146851-read-field-different-times.html)

GerhardHolzinger January 8, 2015 05:02

Read a field at different times
 
Hi,

I want to create a post-processing utility, which traverses all time steps and compares the data with the data of all other time steps. So I end up with two nested loops traversing all time steps.

So, in pseudo code, it looks like this:

Code:

    // go over all time steps
    forAll(timeDirs, timeI)
    {
        runTime.setTime(timeDirs[timeI], timeI);
       
        // go over all time steps
        forAll(timeDirs, timeJ)
        {
            secTime.setTime(timeDirs[timeJ], timeJ);
           
            if (timeI == timeJ)
            {
                // easy
                recurrenceMatrixAlpha[timeI][timeJ] = 1;
            }
            else
            {
                // do stuff
            }
        }
    }

In the "// do stuff" section, I read the fields at the two different times. Right now, I call the constructor, like this:

Code:

volScalarField alpha1
(
    IOobject
    (
        "alpha.air",
        runTime.timeName(),
        mesh,
        IOobject::MUST_READ,
        IOobject::NO_WRITE
    ),
    mesh
);
volScalarField alpha2
(
    IOobject
    (
        "alpha.air",
        secTime.timeName(),
        mesh,
        IOobject::MUST_READ,
        IOobject::NO_WRITE
    ),
    mesh
);


I assume, that this might be done faster.

Is there a way to just read the field at the current time, like read()?

ma-tri-x May 28, 2019 09:18

solved yet?
 
Hi Gerhard,


did you solve this already? I'm also interested...


best regards,
Shir


---- edit 2019-06-03:
seems to be the only way.

GerhardHolzinger May 29, 2019 07:26

As of now, there are two ways to deal with this problem:
  • Either, we read a pair of fields for each combination of times
  • Or, we read the fields at all times, and then compare each combination of times


So,we can choose between
  • Reading a lot
  • Using a lot of memory


I ended up implementing the second variant.

frobaux June 3, 2019 04:50

I'm quite new to OpenFoam, so maybe there is a better answer but if you know the time you need to read, you can convert into a word with the right precision using the runTime.timeName(scalar time) function.


For example, in my solver there is:

Code:

word cTime(runTime.timeName(currentTime[i].value()));

pointScalarField potPhi1
        (
            IOobject
            (
                "Phi",
                cTime,
                externalPhiRegions[i],
                IOobject::MUST_READ,
                IOobject::NO_WRITE
            ),
            pMeshes[i]
        );


ma-tri-x June 3, 2019 09:18

Code for writeAlpha2
 
1 Attachment(s)
Hi everyone,


I'd like to share my successful code for writing int_V(alpha2)dV = "volume of gas phase" to postProcessing/volumeIntegrate_volumeIntegral/0/alpha2.
It's written for foam-extend-4.0.



Can also be used for postProcessing of a parallel case via e.g.

mpirun -np $threads writeAlpha2 -parallel


Install:

extract tar.gz to
$WM_PROJECT_DIR/applications/utilities/postProcessing/miscellaneous/
and cd there and do "wmake".


All times are GMT -4. The time now is 18:26.