# How to get a single value from a volScalarField including the dimension

 Register Blogs Members List Search Today's Posts Mark Forums Read

 October 27, 2011, 07:17 How to get a single value from a volScalarField including the dimension #1 New Member   Sam Fredriksson Join Date: Dec 2010 Posts: 20 Rep Power: 7 Hello I have problems getting the dimension correct when I am doing a simple sum. My equation is: aveTSlab = aveTSlab + T[n]; where aveTSlab is defined as dimensionedScalar aveTSlab ( "aveTSlab", dimensionSet( 0, 0, 0, 1, 0, 0, 0), scalar( 0) ); and volScalarField T ( IOobject ( "T", runTime.timeName(), mesh, IOobject::MUST_READ ), mesh ); Both dimensions are defined correctly but when I take a single value T[n] it does not come with any dimension but the error is as: --> FOAM FATAL ERROR: LHS and RHS of + have different dimensions dimensions : [0 0 0 1 0 0 0] + [0 0 0 0 0 0 0] Please give advise how to get a single value from a volScalarField including the dimension.

October 27, 2011, 08:17
#2
Senior Member

Tomislav Maric
Join Date: Mar 2009
Posts: 277
Blog Entries: 5
Rep Power: 11
Quote:
 Originally Posted by safre Hello ... and volScalarField T ( IOobject ( "T", runTime.timeName(), mesh, IOobject::MUST_READ ), mesh );
Nope, the dimensions of the volScalarField are not set correctly, try this:

Code:
```volScalarField T
(
IOobject
(
"T",
runTime.timeName(),
mesh,
),
mesh,
dimensionedScalar
(
"0", // a dummy name for the scalar
dimTemperature, // 00051 extern const dimensionSet dimTemperature; - preset global constant dimensionSet for the temperature
pTraits<scalar>::zero  // trait for the zero value of scalar
)
);```

 October 27, 2011, 09:34 Thank you for your suggestion but it did not help me out. #3 New Member   Sam Fredriksson Join Date: Dec 2010 Posts: 20 Rep Power: 7 Thank you for your suggestion but it did not help me out. In a way I still do not think it is a problem in the definition of T since that is only read from the ordinary Temperature file from my time directory and if I print out the complete T field the dimension is correct. The problem starts when I try to get one single value out of the field. I guess there is some command to do it another way than I am trying? In fact what I really want to do is to take an average of a part of a volScalarField something like TSlab = cmptAv(T(n0-nN)); or TSlab = average(T(n0-nN)); including the dimension with n0 as the first value in a part of field T and nN being the last value in the part. Perhaps there is an even quicker solution to that problem? Regards, Sam

 October 27, 2011, 10:51 #4 Senior Member   Tomislav Maric Join Date: Mar 2009 Location: Darmstadt, Germany Posts: 277 Blog Entries: 5 Rep Power: 11 I think I've found the reason for this. When you look in the following classes: GeometricField -> DimensionedField< Type, GeoMesh> -> Field< T > -> List < T > -> UList < T>, you will find that the access operator has not been redefined all the way since UList < T >: Code: `T & operator[] (const label)` Wich will just return a scalar. So, each time you call T[label], you won't get a dimensionedScalar, but a scalar. To avoid this, you may define your own access operator [] for the GeometricField (this will probably mess up a lot of things), or you can deal with values... meaning that this should help: Code: ``` scalar& aveTSlabVal = aveTSlab.value(); aveTSlabVal = T[0];``` You can even call Code: `aveTSlab.val() = T[0]` if you like.

October 28, 2011, 02:41
#5
Senior Member

Mark Olesen
Join Date: Mar 2009
Location: http://olesenm.github.io/
Posts: 779
Rep Power: 18
Quote:
 Originally Posted by safre Hello I have problems getting the dimension correct when I am doing a simple sum. My equation is: aveTSlab = aveTSlab + T[n]; where aveTSlab is defined as dimensionedScalar aveTSlab ( "aveTSlab", dimensionSet( 0, 0, 0, 1, 0, 0, 0), scalar( 0) ); and volScalarField T ( IOobject ( "T", runTime.timeName(), mesh, IOobject::MUST_READ ), mesh ); Both dimensions are defined correctly but when I take a single value T[n] it does not come with any dimension but the error is as: --> FOAM FATAL ERROR: LHS and RHS of + have different dimensions dimensions : [0 0 0 1 0 0 0] + [0 0 0 0 0 0 0] Please give advise how to get a single value from a volScalarField including the dimension.
Once you understand the volFields it will make more sense.
A volField is essentially a list of normal values that is augmented by a dimension. It is not a list of dimensioned values.
The means that any dimension checking is only done once for the entire field and not for each value.

In accordance with this, the
Code:
`operator[]`
will return the plain, undimensioned value. Thus the easiest and most efficient is to use the plain values directly
Code:
`aveTSlab.value() += T[n];`
If you really prefer to work with dimensioned values (and have dimensioning checking for each addition operation within the loop!!), try something like this:

Code:
`aveTSlab += dimensionedScalar("T", T.dimensions(), T[n]);`
For ease and generality, you will probably want to declare aveTSlab using the same dimensions as "T":
Code:
```
dimensionedScalar aveTSlab
(
"aveTSlab",
T.dimensions(),
pTraits<Scalar>::zero
);```

 October 28, 2011, 03:44 #6 New Member   Sam Fredriksson Join Date: Dec 2010 Posts: 20 Rep Power: 7 Hello Yes that works or even simpler using an ordinary double definition. It was just that I wanted to keep the dimensions in order to keep the dimension check in my coding. The way I solved it now is to use a double inside the calculation and then do a nn.write(); to a correctly dimensioned volScalarFieldaveTz in the end as aveTz[k]= some value without dimension aveTz.write(); It works but it could have been more elegant. Thanks for all your help, Sam

October 28, 2011, 04:41
#7
Senior Member

Tomislav Maric
Join Date: Mar 2009
Posts: 277
Blog Entries: 5
Rep Power: 11
Quote:
 Originally Posted by safre Hello Yes that works or even simpler using an ordinary double definition. It was just that I wanted to keep the dimensions in order to keep the dimension check in my coding. The way I solved it now is to use a double inside the calculation and then do a nn.write(); to a correctly dimensioned volScalarFieldaveTz in the end as aveTz[k]= some value without dimension aveTz.write(); It works but it could have been more elegant. Thanks for all your help, Sam
Dimension checks, based on this information, are kept only for the fields, since as soon as one wants to access a DimensionedField<Type, GeoMesh> element, a Type is returned, instead of Dimensioned<Type>. This is good when one assembles field equations and performs computations on fields, not on specific elements. This means that +,/,* operators on GeometricField have built in dimension checks.

What you are describing here is an addition of value, not a complex equation involving fields: OpenFOAM is all about working with fields. I'm doing a lot of cell local explicit computation myself and the farther I get from manipulating the fields using their operators and numerics that is already there, the more problems I get into.

Anyway, good luck.

 March 1, 2012, 10:41 #8 Senior Member     mauricio Join Date: Jun 2011 Posts: 136 Rep Power: 8 hihi! within this scope.. can any1 please tell me what am i missing? i wanna change the dimensions of wallHeatFlux so i can operate with T. I figured this should work: Code: ```volScalarField wallHeatFlux(wallHeatFluxheader, mesh); wallHF += dimensionedScalar("wallHF", T.dimensions(), wallHeatFlux);``` i get the error: Code: ```conVh.C: In function ‘int main(int, char**)’: conVh.C:166:3: error: ‘wallHF’ was not declared in this scope``` thanks in advance!

 March 1, 2012, 10:50 #9 Member   Laurens Van Dyck Join Date: Jul 2011 Location: Netherlands/Germany Posts: 34 Rep Power: 6 You never defined what type wallHF is, you need to add volScalarField in front of wallHF +=... what you can also do is reset the dimensions of wallHeatFlux to something different like so: wallHeatFlux.dimensions().reset(T.dimensions()); MaLa likes this.

March 1, 2012, 14:45
#10
Senior Member

mauricio
Join Date: Jun 2011
Posts: 136
Rep Power: 8
Quote:
 Originally Posted by laurensvd You never defined what type wallHF is, you need to add volScalarField in front of wallHF +=... what you can also do is reset the dimensions of wallHeatFlux to something different like so: wallHeatFlux.dimensions().reset(T.dimensions());

hi lauren!

but i guess the units error im getting comes from the sum (T - 300)

I guess i gotta set dimension to that 300... i've tried to find sth on the forums but so far nothing.. any ideas?

i tried a few syntax too but few would work... this one works:

scalar Tam = 300; and i set the sum to (T- Tam) .. the app compiles but the error is there.. ill keep digging

thanks once again!

EDIT:

i guess i got it..:

dimensionedScalar Tam ("Tam", dimensionSet(0, 0, 0, 1, 0, 0, 0),300.0);

now im getting other erros,

but again TY!!!!!

Last edited by calim_cfd; March 1, 2012 at 14:53. Reason: solution found

 March 25, 2013, 05:33 #11 Senior Member     Marco Longhitano Join Date: Jan 2013 Location: Aachen Posts: 103 Rep Power: 5 Hi Foamers, I would like to implement a new cavitation solver in openFoam! I added a transport equation for mass fraction where I need to compare my local pressure (p) with a scalar experimental value pEq! During the compiling of the code I got a dimension error! Can anyone help me to fix it? Here is the transport equation code: Quote: // Solve Mass Fraction Equation for the Gas Air (undissolved) { #include "sourceTerms.H" //Scalar Transport Equation for Mass Fraction if (pEq > p) //p) { fvScalarMatrix f4Eqn ( fvm::ddt(rho, f4) + fvm::div(rhoPhi /*phi*/, f4) - fvm::laplacian(Gamma4,f4) //+ fvm::Sp(AaL,f4) + fvm::Sp(AdL,f4) ); f4Eqn.relax(); solve( f4Eqn /*== AaL*fGlim*/); } else { fvScalarMatrix f4Eqn ( fvm::ddt(rho, f4) + fvm::div(rhoPhi /*phi*/, f4) - fvm::laplacian(Gamma4,f4) + fvm::Sp(AaL,f4) //+ fvm::Sp(AdL,f4) ); f4Eqn.relax(); solve( f4Eqn == AaL*fGlim); } //Update of All Phases Coeffcients //rho == scalar(1)/((f1+f4)/rho1 + f2/rho2 + f3/rho3); //rhoPhi == rho*phi; } Here the declarations for pEq and p Quote: Info<< "Reading thermodynamicProperties\n" << endl; IOdictionary thermodynamicProperties ( IOobject ( "thermodynamicProperties", runTime.constant(), mesh, IOobject::MUST_READ, IOobject::NO_WRITE ) ); dimensionedScalar pEq(thermodynamicProperties.lookup("pEq")); Quote: Info<< "Reading field p\n" << endl; volScalarField p ( IOobject ( "p", runTime.timeName(), mesh, IOobject::MUST_READ, IOobject::AUTO_WRITE ), mesh The compiling error is: Quote: Making dependency list for source file ifasFCMfoam.C Making dependency list for source file incompressibleFourPhaseMixture/fourPhaseMixture.C SOURCE=ifasFCMfoam.C ; g++ -m64 -Dlinux64 -DWM_DP -Wall -Wextra -Wno-unused-parameter -Wold-style-cast -Wnon-virtual-dtor -O3 -DNoRepository -ftemplate-depth-100 -I/opt/OpenFOAM/OpenFOAM-2.1.x/src/turbulenceModels/incompressible/turbulenceModel -I/opt/OpenFOAM/OpenFOAM-2.1.x/src/transportModels -I/opt/OpenFOAM/OpenFOAM-2.1.x/src/transportModels/incompressible/singlePhaseTransportModel -I/opt/OpenFOAM/OpenFOAM-2.1.x/src/finiteVolume/lnInclude -I/opt/OpenFOAM/OpenFOAM-2.1.x/src/meshTools/lnInclude -IlnInclude -I. -I/opt/OpenFOAM/OpenFOAM-2.1.x/src/OpenFOAM/lnInclude -I/opt/OpenFOAM/OpenFOAM-2.1.x/src/OSspecific/POSIX/lnInclude -fPIC -c \$SOURCE -o Make/linux64GccDPOpt/ifasFCMfoam.o In file included from ifasFCMfoam.C:76:0: f4Eqn.H: In function ‘int main(int, char**)’: f4Eqn.H:6:11: error: no match for ‘operator>’ in ‘pEq > p’ f4Eqn.H:6:11: note: candidates are: In file included from /opt/OpenFOAM/OpenFOAM-2.1.x/src/OpenFOAM/lnInclude/VectorSpace.H:164:0, from /opt/OpenFOAM/OpenFOAM-2.1.x/src/OpenFOAM/lnInclude/dimensionedType.H:41, from /opt/OpenFOAM/OpenFOAM-2.1.x/src/OpenFOAM/lnInclude/dimensionedScalar.H:38, from /opt/OpenFOAM/OpenFOAM-2.1.x/src/OpenFOAM/lnInclude/TimeState.H:38, from /opt/OpenFOAM/OpenFOAM-2.1.x/src/OpenFOAM/lnInclude/Time.H:47, from /opt/OpenFOAM/OpenFOAM-2.1.x/src/finiteVolume/lnInclude/fvCFD.H:6, from ifasFCMfoam.C:36: /opt/OpenFOAM/OpenFOAM-2.1.x/src/OpenFOAM/lnInclude/VectorSpaceI.H:650:13: note: template bool Foam:perator>(const Foam::VectorSpace&, const Foam::VectorSpace&) /opt/OpenFOAM/OpenFOAM-2.1.x/src/OpenFOAM/lnInclude/VectorSpaceI.H:650:13: note: template argument deduction/substitution failed: In file included from ifasFCMfoam.C:76:0: f4Eqn.H:6:11: note: ‘Foam::dimensionedScalar {aka Foam::dimensioned}’ is not derived from ‘const Foam::VectorSpace’ In file included from /opt/OpenFOAM/OpenFOAM-2.1.x/src/OpenFOAM/lnInclude/dimensionedType.H:298:0, from /opt/OpenFOAM/OpenFOAM-2.1.x/src/OpenFOAM/lnInclude/dimensionedScalar.H:38, from /opt/OpenFOAM/OpenFOAM-2.1.x/src/OpenFOAM/lnInclude/TimeState.H:38, from /opt/OpenFOAM/OpenFOAM-2.1.x/src/OpenFOAM/lnInclude/Time.H:47, from /opt/OpenFOAM/OpenFOAM-2.1.x/src/finiteVolume/lnInclude/fvCFD.H:6, from ifasFCMfoam.C:36: /opt/OpenFOAM/OpenFOAM-2.1.x/src/OpenFOAM/lnInclude/dimensionedType.C:450:6: note: template bool Foam:perator>(const Foam::dimensioned&, const Foam::dimensioned&) /opt/OpenFOAM/OpenFOAM-2.1.x/src/OpenFOAM/lnInclude/dimensionedType.C:450:6: note: template argument deduction/substitution failed: In file included from ifasFCMfoam.C:76:0: f4Eqn.H:6:11: note: ‘Foam::volScalarField {aka Foam::GeometricField}’ is not derived from ‘const Foam::dimensioned’ In file included from ifasFCMfoam.C:49:0: createFields.H:106:30: warning: unused variable ‘rho4’ [-Wunused-variable] make: *** [Make/linux64GccDPOpt/ifasFCMfoam.o] Fehler 1

 Thread Tools Display Modes Linear Mode

 Posting Rules You may not post new threads You may not post replies You may not post attachments You may not edit your posts BB code is On Smilies are On [IMG] code is On HTML code is OffTrackbacks are On Pingbacks are On Refbacks are On Forum Rules

 Similar Threads Thread Thread Starter Forum Replies Last Post sri31049 Fluent UDF and Scheme Programming 10 June 14, 2013 21:42 MDinc FLUENT 0 July 19, 2011 14:14 volker OpenFOAM 5 April 23, 2010 14:18 zeitistgeld CFX 6 September 26, 2009 06:37 Danial FLUENT 4 September 12, 2001 11:44

All times are GMT -4. The time now is 15:08.