|
[Sponsors] |
How to update a volScalarField's values |
|
LinkBack | Thread Tools | Search this Thread | Display Modes |
October 23, 2013, 04:09 |
How to update a volScalarField's values
|
#1 |
Member
Thomas Vossel
Join Date: Aug 2013
Location: Germany
Posts: 45
Rep Power: 12 |
Hi!
I have a question concerning how to update a volScalarField. Imagine the following problem: You have a volScalarField T for the temperature (with values applied to it). You now have another volScalarField X which is meant to consist of values depending on the respective temperatures. How do I implement an update for X which looks up the temperature of each element and then updates the value in terms of special conditions. With that I mean a procedure of this sort: Code:
if (T<100) { X = 1; } if (T=100) { X = 2; } if (T>100) { X = 3; } |
|
October 23, 2013, 04:26 |
|
#2 |
Senior Member
|
There are several ways to do it. One of them:
Code:
forAll(X, cellI) { if (T[cellI] < 100) X[cellI] = 1; else if (T[cellI] > 100) X[cellI] = 3; else X[cellI] = 2; } |
|
October 23, 2013, 04:44 |
|
#3 |
Senior Member
Armin
Join Date: Feb 2011
Location: Helsinki, Finland
Posts: 156
Rep Power: 19 |
There are many examples in the source code, see e.g.:
https://github.com/OpenFOAM/OpenFOAM.../hePsiThermo.C Here a simplified example: Say you get your temperature field like this: Code:
const volScalarField& T = thermo.T(); Code:
scalarField& TCells = T.internalField(); forAll(TCells, celli) { if (T[celli] < 100.0) X[celli] = 1; else if (T[celli] > 100.0) X[celli] = 3; else X[celli] = 2; } |
|
October 23, 2013, 05:13 |
|
#4 |
Member
Thomas Vossel
Join Date: Aug 2013
Location: Germany
Posts: 45
Rep Power: 12 |
Thanks!
EDIT: Btw - is there a difference between writing "celli" and "cellI" (i.e. upper- / lowercase letter)? |
|
October 23, 2013, 08:15 |
|
#5 | |
Senior Member
Armin
Join Date: Feb 2011
Location: Helsinki, Finland
Posts: 156
Rep Power: 19 |
Quote:
The variable celli is a 'label' (i.e. a integer) defined in forAll, which is a macro that sets up the for loop. So, you can call the variable whatever you want, you just need to be consistent. Last edited by dkxls; October 23, 2013 at 09:45. |
||
October 28, 2013, 10:06 |
|
#6 |
Member
Thomas Vossel
Join Date: Aug 2013
Location: Germany
Posts: 45
Rep Power: 12 |
Allright thanks...
I'd like to add another more "practical" question here. Things now work fine and I define a temperature field which then is analyzed to determine the solid fraction in the respective cells. What I'd like to know is how to write the new volScalarField for the fraction solid into the "0 folder". I create the fraction solid field like this: Code:
volScalarField fracSol ( IOobject ( "fracSol", runTime.timeName(), mesh, IOobject::NO_READ, IOobject::AUTO_WRITE ), mesh, scalar(0) ); I now would like to know how I also can write the calculated fracSol into the 0 folder i.e. the fraction solid field for the initial temperatures. This also would come in handy when postprocessing the project in ParaFoam as there now is no fracSol field in time step 0 and it is a bit tedious to go to timestep 1 and activate the field plus once again any time you accidentally rewind to timestep 0 as it then gets unloaded (because there's no data for it in step 0)... I already tried to simply put a runtime.write() command before progressing time in the time loop but this didn't do the trick. I guess one usually would approach this problem with the setfields utility but as far as I know one here is limited to the premade functions like defining a block in which the variable get set to a certain value... |
|
October 28, 2013, 10:31 |
|
#7 |
Senior Member
Armin
Join Date: Feb 2011
Location: Helsinki, Finland
Posts: 156
Rep Power: 19 |
you can force the writing of a field at any time with
Code:
fracSol.write(); |
|
October 28, 2013, 11:07 |
|
#8 |
Member
Thomas Vossel
Join Date: Aug 2013
Location: Germany
Posts: 45
Rep Power: 12 |
Thanks - if I can come up with enough self-motivation after having finished my master thesis I might write a beginners tutorial so people won't have such a hard time figuring out such "mundane" things like this...
|
|
December 21, 2018, 11:39 |
|
#9 | |||
Senior Member
|
Hello Foamers,
My problem is almost similar. I have two volScalarFields T (temperature) and k (thermal conductivity). volScalarField k depends upon volScalarField T with the following expression: Quote:
I need to update the value (k) thermal conductivity for every time step based on Temperature (T). I have followed the above comments and compiled the new FOAM successfully. However, k returns constant value for every time step after solving the expression. For verification, I am hereby mentioning the source (.C) and createFields.H files. Quote:
Quote:
Thank you |
||||
March 10, 2020, 12:51 |
|
#10 | |
Member
MNM
Join Date: Aug 2017
Posts: 69
Rep Power: 8 |
Quote:
Code:
fvScalarMatrix TEqn ( fvm::ddt(T) + fvm::div(phi, T) - fvm::laplacian(alpha, T) == (1/cp)*(tau && gradU) ); TEqn.solve(); k = 1.833e-03* Foam::sqrt(T); Code:
IOobject::AUTO_WRITE |
||
|
|
Similar Threads | ||||
Thread | Thread Starter | Forum | Replies | Last Post |
Retrieving boundary patch values adjacent to a given cell | brooksmoses | OpenFOAM Post-Processing | 2 | December 8, 2008 10:00 |
strange node values @ solid/fluid interface - help | JB | FLUENT | 2 | November 1, 2008 12:04 |
Plotting raw data values | Wilesco | Siemens | 0 | January 5, 2006 05:34 |
Mass Flux values and calculations | Cb | Siemens | 1 | January 22, 2005 09:21 |
node based or cell centered Ts values | acboge | FLUENT | 0 | February 6, 2004 06:41 |