|
[Sponsors] |
March 13, 2011, 11:53 |
transient source term
|
#1 |
New Member
Klaus
Join Date: Jul 2010
Location: Linz / Austria
Posts: 20
Rep Power: 16 |
hi foamers,
I wonder how to set a transient source term. I want to simulate an electric heater band around a metal cylinder. Therefor i added a heat source to the chtMultiRegion solver and, in the first step, initalized it with a constant value. Results seems to be ok. In the next step i want to use transient values for the heat source because I got set values for the heater band from an experiment which i want to use with the heat source term. But i don't know how to write them on the field of the heat source. I tried to modify one of the timeVarying BCs in a way, that they also modify the internal field in the heater and not only the boundary field. By now, i had no sucess . I'm also not sure if this is the best way to do this. Does anyone know how to impement this kind of transient source term? Cheers, Klaus |
|
October 23, 2011, 23:47 |
|
#2 |
Member
Robin Gilbert
Join Date: Jan 2010
Posts: 66
Rep Power: 16 |
does anybody know how to do this?? transient source term?
|
|
October 24, 2011, 03:40 |
|
#3 |
Senior Member
Kathrin Kissling
Join Date: Mar 2009
Location: Besigheim, Germany
Posts: 134
Rep Power: 17 |
Hi guys,
what are your exact plans? Can you post an equation? Do you want to have a real source term or a specific boundary condition? Best Kathrin |
|
October 24, 2011, 17:42 |
|
#4 |
Member
Robin Gilbert
Join Date: Jan 2010
Posts: 66
Rep Power: 16 |
Hi,
Thank you for your reply. This is what I want: Code:
fvm::div(phi, T) - fvm::Sp(fvc::div(phi), T) - fvm::laplacian(kappaEff, T) == Q/(rho0*Cp0) Code:
if (T at (x1,y1,z1) > Tref) { Q=Qref1; } else { Q= Qref2 } I have been trying to figure that out from the forum. It would be great help if you can answer this question or just give me some hints. Thank you, Robin |
|
October 25, 2011, 03:50 |
|
#5 |
Senior Member
Kathrin Kissling
Join Date: Mar 2009
Location: Besigheim, Germany
Posts: 134
Rep Power: 17 |
Hi Robin,
so you're searching for a spatial dependent source term. To get you values: The easiest way is to grap them at the cell center: Something like Code:
dimensionedScalar Tref("Tref", dimensionSet(0,0,0,1,0,0,0), 350.); dimensionedScalar Qref1("Qref1", dimensionSet(yourDimensionsHere), scalarValue1); dimensionedScalar Qref2("Qref2", dimensionSet(yourDimensionsHere), scalarValue2); forAll(T, cellI) //This loops over all cell centers { if(T[cellI]>Tref) { Q = Qref1; } else { Q = Qref2; } } Be aware that the convergence can be poor! Best Kathrin |
|
October 25, 2011, 11:10 |
|
#6 |
Senior Member
David Boger
Join Date: Mar 2009
Location: Penn State Applied Research Laboratory
Posts: 146
Rep Power: 17 |
Actually, I think this earlier post by Kathrin is the one that Robin needs, or the post from Su Junwei that immediately precedes it. Both show methods for returning the cell index for a specified (x,y,z) location. Otherwise, I think Robin's coding was essentially correct, where "T at (x1,y1,z1)" would become T[labelOfClosestCell] or T[nearestCellIndex] according to the referenced links.
__________________
David A. Boger |
|
October 25, 2011, 11:20 |
|
#7 |
Senior Member
Kathrin Kissling
Join Date: Mar 2009
Location: Besigheim, Germany
Posts: 134
Rep Power: 17 |
Oh maybe I got something wrong. I thought that he would like to chance the complete Q field!
Robin: Do you want only one single position to determine you Q value, and that this Q value is then constant for the whole domain or do you want to have a field of different Q values each depending on the actual cell value? Best Kathrin |
|
October 25, 2011, 16:06 |
|
#8 | |
Assistant Moderator
Bernhard Gschaider
Join Date: Mar 2009
Posts: 4,225
Rep Power: 51 |
May I add a bit more entropy to the discussion? Yes? Thanks
Quote:
For your first implementation I wouldn't bother with that too much but be warned that parallel runs will most likely produce "funny" (depends on your sense of humor) results |
||
October 25, 2011, 17:18 |
|
#9 | ||
Member
Robin Gilbert
Join Date: Jan 2010
Posts: 66
Rep Power: 16 |
Quote:
Code:
LHS= Q/(rho*Cp0)*N I will go through the threads suggested by Boger and get back with results. Quote:
Thank you all for your replies. |
|||
October 26, 2011, 15:34 |
|
#10 |
Senior Member
|
I do not know if it works, but an approach MIGHT be to use abovementioned forAll()-function first to know if it should switch any value. Then you could implement this either by way of changing the N or by adding another source term, again via the forAll() method.
I did something like that recently for testing something and will document this still this week, so look into this thread by the end of the week and you should find the link to some documentation. ;-) |
|
October 26, 2011, 16:00 |
|
#11 |
Member
Robin Gilbert
Join Date: Jan 2010
Posts: 66
Rep Power: 16 |
Hi Bernard,
Thank you so much. I will look into it when you post the documentation. |
|
October 27, 2011, 05:01 |
|
#12 |
Senior Member
Kathrin Kissling
Join Date: Mar 2009
Location: Besigheim, Germany
Posts: 134
Rep Power: 17 |
Hi Robin,
I thought about a little more Foam like solution and I came up with this. Why just don't use the setFields functionality within your executable. The following piece of code is an example on how this could be done. It uses cellSets to define your desired box/circle or whatever Code:
IOdictionary defineQPositionDict ( IOobject ( "defineQPositionDict", runTime.constant(), mesh, IOobject::MUST_READ, IOobject::NO_WRITE ) ); PtrList<entry> regions(defineQPositionDict.lookup("regions")); Info << regions << endl; forAll(regions, regionI) { const entry& region = regions[regionI]; autoPtr<topoSetSource> source = topoSetSource::New(region.keyword(), mesh, region.dict()); cellSet selectedCellsSet ( mesh, "cellSet", mesh.nCells()/10+1 //size estimate ); source->applyToSet ( topoSetSource::NEW, selectedCellsSet ); labelList selection = selectedCellsSet.toc(); forAll(selection, cellI) { alpha1[selection[cellI]] = 1.; //Replace this with your source term calculation } } Code:
MUST_READ_IF_MODIFIED Code:
defineQPositionDict Code:
regions ( boxToCell { box (0.1 0.1 -1) (0.5 0.5 1); } ); @ Bernhard can you take some entropy out here? It would be so great, to know if this is a safer way to programm this! Best Kathrin |
|
October 27, 2011, 08:20 |
|
#13 | |
Assistant Moderator
Bernhard Gschaider
Join Date: Mar 2009
Posts: 4,225
Rep Power: 51 |
Quote:
If I had to do such a thing (mesh region heated depending on a sensor) I'd do the following: Add something like this to createFields.H (or some other appropriate location) Code:
expressionSource<scalar> heaterSource ( IOdictionary ( IOobject ( "heaterSourceDict", runTime.constant(), mesh, IOobject::MUST_READ, IOobject::NO_WRITE ) ), mesh ); Code:
fvm::div(phi, T) - fvm::Sp(fvc::div(phi), T) - fvm::laplacian(kappaEff, T) == heaterSource() The heaterSourceDict would look something like this (all of this may contain syntax-errors. I'm doing it from memory) Code:
variables ( "TThres=666;" // here comes Aleister "TProbes{set'TSensor}=average(T);" "QHeat=42;" "cp0=1;" ); dimensions [0 0 0 0 0 0 0]; // This will have to fit the equation expression "(zone(heaterZone) && ? TProbes<TThres) ? QHeat/rho : 0"; Code:
functions { theSensor { type createSampledSet; outputControl timeStep; outputInterval 1; setName TSensor; setName { type cloud; axis x; points ( (0 0 0) // core center ); } } } libs ( "libswakFunctionObjects.so" ); - C++-coding is kept to a minimum - it works in parallel (not swaks doing: sampledSets in OF) - further case-specific modifications go where the ought to be: into the case - you can do all kinds of cool stuff without modifying the solver: make the heater depend on the state of a patch, a sampled surface. Using storedVariables you can do state-based heating (once we're heating: keep heating. Hysterese-like switching. Time-dependence ....). Propagate the switching informations to boundary conditions via global variables and groovyBC Bernhard PS: Kathrins method of generating a cellSet looks fine to me and is quite flexible. Of course it depends on your application whether you want to keep the cellSet for later computations. BTW: even there you can sneak swak in through the back-door via the expressionToCell-topoSource (am I getting obnoxious?) |
||
October 27, 2011, 10:56 |
|
#14 |
Senior Member
Kathrin Kissling
Join Date: Mar 2009
Location: Besigheim, Germany
Posts: 134
Rep Power: 17 |
Sorry for provoking you...
and for getting Aleister in the game... Thank you very much Bernhard. I should use swak4Foam a lot more often though. If swak4Foam would not exist and neither cellSet nor sampledSet and I would like to have a cell based solution (in fact I don't want to but maybe sometimes for something else) I would need Pstream functionality, wouldn't I? Best Kathrin |
|
October 27, 2011, 15:52 |
|
#15 | |
Assistant Moderator
Bernhard Gschaider
Join Date: Mar 2009
Posts: 4,225
Rep Power: 51 |
You're forgiven
That was me. Quote:
I THINK (untested and doing the API-calls from memory) this would do the trick: Code:
scalar Tprobe=-1; label cellID=mesh.findCell(coordinatesOfTheProbe_PickYourOwnName); if(cellID>=0) { // is -1 if the point is not in the mesh == all other processors Tprobe=T[cellID]; } reduce(Tprobe,maxOp<scalar>()); // now all the processors are on the same page Bernhard |
||
October 27, 2011, 17:08 |
|
#16 | |
Member
Robin Gilbert
Join Date: Jan 2010
Posts: 66
Rep Power: 16 |
Quote:
I have one more question: Do you think there is a way I can fix the temperature at a faceZone by removing heat from the room using the "heaterZone" as shown in the figure? Basically what I want is that the air flowing out through the faceZone should be at a fixed temperature. Please forgive me if you think that I am asking way too many questions. Last edited by robingilbert; October 27, 2011 at 17:26. Reason: edit question |
||
October 28, 2011, 03:06 |
|
#17 | |
Senior Member
Bernhard
Join Date: Sep 2009
Location: Delft
Posts: 790
Rep Power: 22 |
Quote:
|
||
October 28, 2011, 03:19 |
|
#18 |
Senior Member
Kathrin Kissling
Join Date: Mar 2009
Location: Besigheim, Germany
Posts: 134
Rep Power: 17 |
Hello Bernhard,
thanks again very very much. Now I have something to dig into! Fun stuff for the weekend! Maybe I find out how to send a negative temperature if desired ! Best Kathrin |
|
October 28, 2011, 04:40 |
|
#19 | |
Member
Robin Gilbert
Join Date: Jan 2010
Posts: 66
Rep Power: 16 |
Quote:
Code:
LHS = - (flowDirection & U)*Area*(T-Treq) (something like this. the actual setup is in my lab computer) |
||
October 28, 2011, 07:16 |
HowTos online
|
#20 |
Senior Member
|
I guess some people were quicker than me. Fine as well! :-)
Just for the sake of completeness: The HowTo mentioned above in http://www.cfd-online.com/Forums/ope...tml#post329593 Post #10 and some commented code snippets now are online in the OpenFOAM-Section of http://cern.ch/blinseis . Got something wrong there, will have to reedit the documents I linked... Last edited by Linse; November 3, 2011 at 18:42. Reason: Links changed... |
|
|
|
Similar Threads | ||||
Thread | Thread Starter | Forum | Replies | Last Post |
Problem of SOURCE term gradient in UDS | wind | Fluent UDF and Scheme Programming | 6 | December 1, 2022 15:21 |
UDF source term | Rajani Kanth.B | Fluent UDF and Scheme Programming | 4 | May 1, 2013 10:31 |
[Gmsh] Compiling gmshFoam with OpenFOAM-1.5 | BlGene | OpenFOAM Meshing & Mesh Conversion | 10 | August 6, 2009 05:26 |
Adding a momentum source term | segersson | OpenFOAM Running, Solving & CFD | 5 | March 3, 2006 00:06 |
UDF Source Term Units? | Brian | FLUENT | 1 | October 24, 2005 10:15 |