CFD Online Discussion Forums

CFD Online Discussion Forums (https://www.cfd-online.com/Forums/)
-   OpenFOAM Running, Solving & CFD (https://www.cfd-online.com/Forums/openfoam-solving/)
-   -   Radiation bc problems multiplying fields (https://www.cfd-online.com/Forums/openfoam-solving/59832-radiation-bc-problems-multiplying-fields.html)

tehache January 11, 2007 10:15

Dear AllOfYou, Based on the
 
Dear AllOfYou,

Based on the existing fixedGradient boundary condition, I am trying to implement a boundary condition for thermal radiation against an environment temperature, i.e.

gradient=eps*sigma/lambda*(TRef^4-Tf^4)

eps=emissivity, lambda=thermal conductivity, sigma=Stefan-Boltzmann-constant, TRef=environment temp., Tf= boundary face temp.

However, I cant multiply fields (for T^4). I tried to calculate TRef_*TRef_, as a first step, TRef_ beeing declared as Field<type> ... , same as gradient.
TRef_*=TRef gives a compiler error, telling me there is no operator *= taking as argument a
Foam::radFluxFvPatchField<foam::vector<double> >
(I made a radFluxFvPatchField from the fixedGradientFvPatchField..)
No wonder, there is no such operator ... but why is my FvPatchField parameterized with Type = Foam::Vector<double> ? It belongs to a VolScalarField (Temperature), the dictionary looks like this:

FoamFile
{
....

class volScalarField;
object T;
}

dimensions [0 0 0 1 0 0 0];

internalField nonuniform List<scalar>
.....

The boundary file like this:

boundaryField
{
top
{
type radFlux;
gradient uniform 100;
reftemp uniform 1710;

.....


So, I expected to get Type=double, and to have a field of doubles. Apparently, I have however a field of vectors of doubles.
Probably I got something completely wrong ... please enlighten me !

(Btw., if I just specify the gradient, the implementation works)

7islands January 30, 2007 20:26

Hi, Sorry if it's too late
 
Hi,

Sorry if it's too late to answer. Probably it's because you're trying to instantiate the b. c. code template with <type>==<vector> within radFluxFvPatchFields.C. If you followed the fixedGradient b. c. code straightforward you might have a line something like

makePatchFields(radFlux);

in the file. In such case the b. c. code will be instantiated for all the scalar, vector, tensor and sphericalTensor classes. Instead you should explicitly specify only the scalar code to be instantiated by

template<>
makePatchTypeField(fvPatchScalarField, radFluxFvPatchScalarField);

in the .C file. Hope this helps.

Regards,
Takuya

tehache January 31, 2007 02:27

Yes, that was the point. I jus
 
Yes, that was the point. I just did not read carefully enough the compiler messages.
Sorry for not posting I found it before and make you think about it - thanks a lot anyways !

coops February 5, 2007 17:47

Hello, I am interested in w
 
Hello,

I am interested in writing a boundary condition that multiplies two fields that are solved for. I want the boundary condition to set the vertical gradient of a different field equal to this product. Can you please let me know how you went about writing your boundary condition.

Thankyou

tehache February 6, 2007 02:37

Hello Shaun, As Takuya Oshi
 
Hello Shaun,

As Takuya Oshima pointed out: I had to use the template specialized for scalar fields, i.e. base it on fvPatchScalarField instead of fvPatchField. If I got it correctly, there is no multiplication operator for vector fields ...

Good luck !

Thomas


All times are GMT -4. The time now is 14:51.