CFD Online Discussion Forums

CFD Online Discussion Forums (https://www.cfd-online.com/Forums/)
-   OpenFOAM Pre-Processing (https://www.cfd-online.com/Forums/openfoam-pre-processing/)
-   -   Heat loss calculated on cell-by-cell basis for sidewalls (https://www.cfd-online.com/Forums/openfoam-pre-processing/157912-heat-loss-calculated-cell-cell-basis-sidewalls.html)

mick223 August 11, 2015 04:26

Heat loss calculated on cell-by-cell basis for sidewalls
 
Hi everyone,

I am working with a case that is a flat topped pyramid, with Qin and Qout at the top and bottom respectively. The case is modeled with meltFoam, and gradually solidifies. Heat loss through the side walls is calculated with groovyBC lookup tables, with average temperatures applied to 6 vertical patches for each sidewall. This is not accurate enough, as convection driven melting leading to non-perpendicularites, and varying temperatures along the horizontal planes.

What I am looking to do is to set boundary conditions to each cell, such that heat flux is calculated on a cell-by-cell basis, so as to remove this issue. Is this possible, or am I better of continuing as it is but increasing the number of patches on each sidewall?

Thanks.

Nicole August 13, 2015 03:51

Hi Mick,

I am not sure I understand your question completely, but maybe this will help.

It is possible to calculate the heat loss on a cell-by-cell basis using groovyBC, I have done this before for convection and radiative heat losses from a surface with the following entry in the 0/T file:

Code:

 
curves
    {
        type groovyBC;
        variables "htot=50.0;Tinf=273.15;rho_steel=7735.0;k=-0.0419*T+73.2;sigma=5.6e-8;E=0.8;";
        gradientExpression "-htot/k*(T-Tinf)-(sigma/k)*E*(pow(T,4)-pow(Tinf,4))";
        fractionExpression "0";
    }


mick223 August 16, 2015 08:25

Hi Nicole,

Thanks for the help. How can I use apply a similar condition but using lookup tables instead of an equation to calculate the heat loss?

Thanks again.

Nicole August 17, 2015 04:28

Hi Mick,

Sorry, I have no idea. You could try your best guess and see if the error messages are helpful enough. Good luck!

mick223 August 20, 2015 01:08

Hi Nicole,

No worries, I should be able to use equations instead. At what point is the value 'T' calculated for in the equation, is it the temperature on the cell boundary, or an average of an area? The code I am building on at the moment currently applies the heat loss formula using temperatures as averages of slices taken vertically, and then applying a gradient. This obviously is not as accurate. Could you possible upload the whole 0/T file so I can better understand how it's working?

Thanks again, this has been very helpful.

Nicole August 20, 2015 03:03

Hi Mick,

I am still not completely sure what you are trying to do. So I am going to say a couple of things that may be obvious to you, just to make sure we are on the same page:

1) We are solving discretised equations in OpenFOAM, therefore we only calculate the values for a volScalarField such as T, at cell centres.
2) At the boundaries, T at the cell centre adjacent to the boundary face is interpolated from the value at the centre of the cell face by some interpolation scheme that you have specified in fvSchemes.
3) My code gives OpenFOAM an equation for T at the cell face (instead of just making it a fixedValue boundary condition), therefore this will be worked into the larger set of equations on a cell-by-cell basis.

I am not sure why you are using slices and tables, perhaps this relates to your physical problem. But if you have one equation that holds for an entire boundary patch then I recommend using groovyBC rather. (or consider breaking your geometry up into patches that have the same equation on each of them) The point of swak4foam is to save everyone from having to do the coding that Bernhard (who is probably much smarter than most of us) has already done. I am slowly learning (the hard way) that it is better to use as much as possible of other people's code than try to develop my own.

I'm not sure what I have done with the T file. But the other boundaries just have regular zeroGradient or fixedValue boundary conditions so you won't learn much form it. I think you also have to #include the groovyBC or swak4foam library, you can just Google an example, which is probably more correct than the way I did it in any case.

I hope this helps, but I still have pretty much no idea what you are trying to do. If this isn't helpful perhaps you could post some of your files or code so I can try to understand your work better. I am by no means an expert though, only just learning myself :D

mick223 August 21, 2015 00:54

Hi Nicole,

It might just be easiest if I post the relevant section of code that I meant to be changing so you can see. Disregard the "thingtop", as is fine and will stay the same, it is leftwall1-6, rightwall1-6 etc that I need to adjust.

Code:

dimensions
[0 0 0 1 0 0 0];
internalField
uniform %s; //body_temp
boundaryField
{
thingtop
{
type
groovyBC;
variables (
"Toutlet{thingtop}=T;" //temperature of surface at inlet
);
gradientExpression "-function(Toutlet)"; //heat loss formula
fractionExpression "0";
lookuptables (
{
name function;
outOfBounds clamp;
fileName "$FOAM_CASE/lookupfunction.data";
}
);
value
uniform %s;
}
leftWall1
{
// type fixedGradient;
// gradient uniform 100000;
type
groovyBC;
variables (
"h=10.0;" //W.m^-2.K^-1 CONVECTION COEFF
"A=%s;" //m^2 AREA-SEE BLOCKMESH
"T_inf=297.0;" //K AMBIENT TEMP
"T_surr=297.0;" //K Surrounding air temperature
"esp=0.7;" //surface emissivity 0<esp<1
"sig=5.67e-8;" //stefan-boltzmann constant for q_rad
"ks=20;"
"kl=60;"
"Toutlet{leftWall1}=oldTime(T);" //temperature of surface at inlet
);
gradientExpression "(Toutlet > 1680) ? ((-(h*A*(Toutlet-
T_inf)+esp*A*sig*(pow(Toutlet,4)-pow(T_surr,4))))/kl) : ((-(h*A*(Toutlet-
T_inf)+esp*A*sig*(pow(Toutlet,4)-pow(T_surr,4))))/ks) "; //heat loss formula
fractionExpression "0";
value uniform %s;
}

I had my wires crossed before, and the lookup tables are actually only in the thingtop section, and the heat loss through the walls is defined by the equation.

I can't actually see much difference in you code and this, and so possible this is already calculating it on a cell-by-cell basis and I have simply been misinformed?

Nicole August 21, 2015 04:10

Hi Mick,

The difference that I can see is when you say "Toutlet{leftWall1}=oldTime(T);" and then use Toutlet, whereas I simply used T directly in the gradient expression. I'm afraid I'm not sure what your extra step is doing, whether Toutlet will be a field of an averaged value on the patch?

So, see if my logic is right: You are using Toutlet which is at the previous time step, therefore an actual value for the gradient is calculated, whereas my code used T directly, therefore I used the gradient as a function of T (at the current time step).

Perhaps you can use Toutlet at the old time for the if statement condition (if this will introduce a small enough error) and then T directly in your gradientExpression equations?

mick223 August 23, 2015 09:14

Hi Nicole,

The reason for the extra expression "Toutlet{leftWall1}=oldTime(T)" is to ensure that oldTime(T) is used rather than just T, the reason being that when the solver uses multiple iterations, it will by default use the result of the last iteration rather than the values at the last time step. This is an issue, as meltFoam iterates several times for each time step.

So to you, does it appear that it already does calculate the heat loss on a cell by cell basis? And so each cell has it's boundary condition calculated using it's own average temperature. To me it seems that it should function the same as your code does already.


All times are GMT -4. The time now is 00:44.