transient source term
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 :mad:. 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 |
does anybody know how to do this?? transient source term?
|
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 |
Hi,
Thank you for your reply. This is what I want: Code:
fvm::div(phi, T) Code:
if (T at (x1,y1,z1) > Tref) 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 |
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.); Be aware that the convergence can be poor! Best Kathrin |
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.
|
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 |
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 |
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. |
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. ;-) |
Hi Bernard,
Thank you so much. I will look into it when you post the documentation. |
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:
Code:
MUST_READ_IF_MODIFIED Code:
defineQPositionDict Code:
regions @ 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 |
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:
Code:
fvm::div(phi, T) The heaterSourceDict would look something like this (all of this may contain syntax-errors. I'm doing it from memory) Code:
variables ( Code:
functions { - 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?) |
Sorry for provoking you... :rolleyes:
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 |
Quote:
Quote:
Quote:
I THINK (untested and doing the API-calls from memory) this would do the trick: Code:
scalar Tprobe=-1; Bernhard |
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. http://www.flickr.com/photos/67876844@N05/6286568527/#/http://www.flickr.com/photos/67876844@N05/6286568527/http://flic.kr/p/azwiNxhttp://www.cfd-online.com/Forums/%3C...%22%3E%3C/a%3Ehttp://img535.imageshack.us/img535/1...chwithcrac.png http://www.flickr.com/photos/67876844@N05/6286568527 |
Quote:
|
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 |
Quote:
Code:
LHS = - (flowDirection & U)*Area*(T-Treq) |
HowTos online
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... |
Quote:
I am trying to do something similar.. I'd like to know in which file I should add this code. Also, how can I use it, once compiled? I mean: what should I change in the case directory? Just a Q file in the my_case/0 folder? Thanks a lot, Samuele |
Quote:
Do you have any suggestion to define a specified cellZone in a case? Thank you in advance, Hossein. |
Quote:
|
Temporay heat source using swak4Foam
Quote:
Regards, Hossein |
Quote:
Code:
"time()>timeOff ? 0 : heatSource" |
Thanks. It is very powerful.
|
Quote:
Is that condition (time()>timeOff) suitable for a steady state solver? in other word, does time() represent flow time or time name of the results? Thank you in advance, Hossein |
Quote:
|
Quote:
My intention in the previous post was "How can add a source term to a field for some primary iterations in a steady state solver and then turn off it! Thanks again, Hossein |
Hi kathrin kissling,
I am almost new to OpenFoam and I want to add a transient heat source to specified points on the Mesh. Actually, I am working on Ground Source heat pump simulation problem. I want to add a source term representing the U-tube in the ground. In this U-tube water is circulating and this loop extract heat from the soil where the U-tube is buried. So, I want to add a volumetric source term such that, q=UA(Ts-Tf), where, Ts is the temperature at the soil and Tf is fluid temperature. U is the overall heat transfer coefficient. This source term should coincide with the ground loop configurations. That is in the three dimensional computational domain, I have to find a points that is in a U-curve and add the above source term to the points in the U-curve. How could I do that. I saw that Kathrin has gave Robin a somewhat related answer. Could you please help me in this. |
Hi Robin,
I am new to OpenFoam and I want to add a source term into some specified points in the computational domain. I saw, that you have got some help from kathrin_kissling for same type of problem. Can you please tell me how you define this defineQPositionDict other than create.H file. Also how to add this topoSetSource in LaplacianFoam. I think you also used LaplacianFoam for your problem.Please tell me each step to do this. I am really greatfull if you could help me on this. I have copied the answer gave by Kathrin, so that you can remember the steps Best, Kumudu 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 } } |
Adding heat source into speciefied location in Mesh
Hi Bernhar,
I want to add a heat source into specified position in Mesh. I want to add this heat source for time dependent three dimensional diffusion equation. You have defined most of the things as a reply to transient heat source problem of Robin. Can you explain me how to use swak4Foam to define expression source, where I should define. I think heatSourceDict should be defined in system directory. Also I cannot understand how to define CellZones. Please tell me how to add this source term into Diffusion equation. Actually, I want to add this heat source to points in Mesh coinciding ground loop configurations. I am working on ground heat exchanger simulations. This heat exchanger is consist with ground loops buried in ground. I want to simulate ground temperature after installing this loops which extract heat from ground. The heat source should show the loop configuration. Could you please help me in this regard. Kumudu :confused: |
Quote:
http://www.cfd-online.com/Forums/ope...tml#post329700 Quote:
Quote:
So you want to have heat sources which are only on some locations. Specification depends on how the locations are specified. Either by cellZones (which is preferable for a number of reasons) or as coordinates where you'll have to write expressions. I'm sorry, but I don't have the time to answer questions were I have almost no information, especially as I suspect that what you need is already covered in some of the existing information/documentation |
[QUOTE=gschaider;460353]You've got to add it to the solver otherwise it can't be used. But that is already explained in this thread:
http://www.cfd-online.com/Forums/ope...tml#post329700 Hi gschaider, Thank you very much for replying me. I start learning OpenFoam around three four days ago. And I am still reading the basic. However, I was able to define expressionSource using swaks and I did the same as you explained in the transient source term blog. But, I got an error, kumudu21688@kumudu21688-Inspiron-N5040:~/OpenFOAM/kumudu21688-2.1.1/run/myheatsource$ mylaplacianFoam /*---------------------------------------------------------------------------*\ | ========= | | | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | | \\ / O peration | Version: 2.1.1 | | \\ / A nd | Web: www.OpenFOAM.org | | \\/ M anipulation | | \*---------------------------------------------------------------------------*/ Build : 2.1.1-221db2718bbb Exec : mylaplacianFoam Date : Nov 03 2013 Time : 11:01:29 Host : "kumudu21688-Inspiron-N5040" PID : 4536 Case : /home/kumudu21688/OpenFOAM/kumudu21688-2.1.1/run/myheatsource nProcs : 1 sigFpe : Enabling floating point exception trapping (FOAM_SIGFPE). fileModificationChecking : Monitoring run-time modified files using timeStampMaster allowSystemOperations : Disallowing user-supplied system call operations // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // Create time Create mesh for time = 0 Reading field T Reading transportProperties Reading diffusivity DT SIMPLE: no convergence criteria found. Calculations will run for 15 steps. Calculating temperature distribution swak4Foam: Allocating new repository for sampledSets --> FOAM FATAL IO ERROR: Attempt to return dictionary entry as a primitive file: /home/kumudu21688/OpenFOAM/kumudu21688-2.1.1/run/myheatsource/system/controlDict::functions::theSensor::setName from line 59 to line 63. From function ITstream& primitiveEntry::stream() const in file db/dictionary/dictionaryEntry/dictionaryEntry.C at line 82. FOAM aborting #0 Foam::error::printStack(Foam::Ostream&) in "/opt/openfoam211/platforms/linux64GccDPOpt/lib/libOpenFOAM.so" #1 Foam::IOerror::abort() in "/opt/openfoam211/platforms/linux64GccDPOpt/lib/libOpenFOAM.so" #2 Foam::dictionaryEntry::stream() const in "/opt/openfoam211/platforms/linux64GccDPOpt/lib/libOpenFOAM.so" #3 Foam::SetsRepository::getSet(Foam::dictionary const&, Foam::polyMesh const&) in "/home/kumudu21688/OpenFOAM/kumudu21688-2.1.1/platforms/linux64GccDPOpt/lib/libswak4FoamParsers.so" #4 Foam::createSampledSet::createSampledSet(Foam::wor d const&, Foam::objectRegistry const&, Foam::dictionary const&, bool) in "/home/kumudu21688/OpenFOAM/kumudu21688-2.1.1/platforms/linux64GccDPOpt/lib/libswakFunctionObjects.so" #5 Foam::OutputFilterFunctionObject<Foam::createSampl edSet>::allocateFilter() in "/home/kumudu21688/OpenFOAM/kumudu21688-2.1.1/platforms/linux64GccDPOpt/lib/libswakFunctionObjects.so" #6 Foam::OutputFilterFunctionObject<Foam::createSampl edSet>::start() in "/home/kumudu21688/OpenFOAM/kumudu21688-2.1.1/platforms/linux64GccDPOpt/lib/libswakFunctionObjects.so" #7 Foam::functionObjectList::read() in "/opt/openfoam211/platforms/linux64GccDPOpt/lib/libOpenFOAM.so" #8 Foam::Time::run() const in "/opt/openfoam211/platforms/linux64GccDPOpt/lib/libOpenFOAM.so" #9 Foam::Time::loop() in "/opt/openfoam211/platforms/linux64GccDPOpt/lib/libOpenFOAM.so" #10 Foam::simpleControl::loop() in "/opt/openfoam211/platforms/linux64GccDPOpt/lib/libfiniteVolume.so" #11 in "/opt/openfoam211/platforms/linux64GccDPOpt/bin/mylaplacianFoam" #12 __libc_start_main in "/lib/x86_64-linux-gnu/libc.so.6" #13 in "/opt/openfoam211/platforms/linux64GccDPOpt/bin/mylaplacianFoam" Aborted (core dumped) I can't understand how to relate the heaterZone with ControlDict. This is where I defined the posted comment that you explained. /*--------------------------------*- C++ -*----------------------------------*\ | ========= | | | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | | \\ / O peration | Version: 2.1.1 | | \\ / A nd | Web: www.OpenFOAM.org | | \\/ M anipulation | | \*---------------------------------------------------------------------------*/ FoamFile { version 2.0; format ascii; class dictionary; location "system"; object controlDict; } libs ( "libswakFunctionObjects.so" ); // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // application mylaplacianFoam; startFrom latestTime; startTime 0; stopAt endTime; endTime 15; deltaT 0.05; writeControl runTime; writeInterval 1; purgeWrite 0; writeFormat ascii; writePrecision 6; writeCompression off; timeFormat general; timePrecision 6; runTimeModifiable true // ************************************************** *********************** // functions { theSensor { type createSampledSet; outputControl timeStep; outputInterval 1; setName TSensor; setName { type cloud; axis x; points ( (0 0 0) // core center ); } } } libs ( "libswakFunctionObjects.so" ); This is probably wrong. But, my problem is actually not this. I am still trying to undersatnd the addition of heat source into the LaplacianFoam. |
2 Attachment(s)
[QUOTE=gschaider;460353]For instance I don't know what a "ground loop" is.
I am sorry for not mentioning my problem beforehand. Here is my problem definition............. General idea about ground source heat pump..... Ground source heat pumps are used to heat up and cool down a building in summer and winter. They used the utilization of temperature difference between air and ground to transfer heat from ground to buildings or reject heat from buildings to ground. However, ground temperature is usually lower than the building setpoint temperature, therefore, a heat pump is used to transfer heat from low temperature medium ground to building. This heat pumps actually act as a refrigerators. So first heat is extracted from ground through ground heat exchangers and them it is transfered to heat pump. I have attached a schematic of Ground source heat pump. My main target is to simulate the ground temperature after installing this ground heat exchanger and also outlet fluid temperature of the ground heat exchanger. Ground heat exchanger definition roughly.... Ground heat exchanger is consisted with U-pipes, where the water is circulating through it. This U-pipes are installed in a borehole (a hole in ground about 45-150m deep). This borefole is filled with grout (This grout is filled to prevent water draining into borehole and also to enhance heat transfer through U-pipes to soil). Grout has higher thermal conductivity than soil. I have attached the schematic of a borehole with this message. These ground heat exchangers are used to extract or reject the heat into the ground. Simulation targets 1. Simulate ground temperature using 3D diffusion equation. ρc ∂ T/∂t =( ∇ .λ ∇ T)+S ---->(1) So this S is the source term that I want add to the Mesh coinciding with U-pipes location and the configuration. S is the volumetric heat source like this, S=qn dV The source term would be like this, qn=- λ∂ Ts/∂n=U( Ts - Tf) Tf is the fluid temperature Ts is the soil temperature U overall heat transfer coefficient 2. Simulate fluid temperature circulating through ground heat exchanger ρc ∂ Tf/∂t+ hP (Tf- Ts ) = m ( Tf,out- Tf,in) ---->(2) Tf,out is the outlet temperature of the U-pipes Tf,in is the inlet fluid temperature h is the force convection heat transfer coefficient P is the perimeter of pipe m is the mass flow rate of the pipe c is the heat capacity *** Equation (1) and (2) should be solved conjugately. My supervisor told me that, I shouldn't mesh the U-pipes. But represent this U-pipe heat transfer with the term S(heat source) by adding it to the same location as the U-pipes. This S is dependent on location and fluid temperature as well. It is also a transient term. So, could you please tell me how would I do this with OpenFoam. Is this possible to do in OpenFoam?. Thanks. I am sorry for writing long explanation. Kumudu |
[QUOTE=Kumudu;460370]
Quote:
Anyway: if you use this approximation for the average of T_fluid then it is possible with relatively little effort. Otherwise it is not that easy |
Transient heat source
[QUOTE=gschaider;460553]
Quote:
------------------------------------------------------ Hi gschaider, Thanks for the reply. This is the way I have to simulate. 1. Guess minimum outlet fluid temperature(T_f,out,init) that would required to run the heat pump. Then, I can calculate heat extraction rate( There is a second order equation that relate the required heat load, outlet temperature of the ground U-pipe and heat extraction rate (Q_ext). 2. Calculate initial inlet temperature(T_f,in,init) from the following equation, Q_ext=m_dot*cf(T_f,out,init-T_f,in,init) 3. Find initial fluid temperature of circulating fluid =(T_f,out,init +T_f,in,init)/2 4. Solve 3D diffusion equation first taking S=qn* δ(x-x_sf)*dV qn=U*A*(Ts-Tf), Ts is the soil temperature , Tf :fluid temperature δ is a dirac delta function(radial basis function) which use to smear this heat flux through some grid points (actually, will smear the heat flux into some radial distance from the points which coincide with the ground U-loop). Using this delta function, I will be able to make this heat source 3 dimentional and shows the ground loop in the domain, without generating mesh for pipes. x_sf= a point on the pipe ( r distance from points that we place the heat source initially) //.......................................... Do you think this can be done?. If so, what is the solver I should use?. How to modify the existing solvers and .H files?:) //................................................. 5. Soil temperature can be calculated from solving diffusion equation first 6. Solve the convection equation assuming 1D domain with having the same length as U-pipe. ρc (∂T_f)/∂t+ h*P(T_f- T_s@pipe_surface )=m_dot*c_f (T_f,out-T_f,in) Inlet temperature is specified. Initial fluid temperature is given T_s@pipe_surface is known h and P are known T_f,out is the fluid temperature at end point of 1 dimensional domain. 7. So, new fluid temperature is known, solve diffusion equation again. So, this is a conjugate process. //////////////////////////////////// Please suggest me a method or some commands to find specified points which will be coinciding with U-loop Then, how to add this heat source into the transient diffusion equation which will only applicable for specified points. If OpenFoam has some commands to define a radial basis function, to smear this heat source within a r distance from this specified points which will make 3D heat source. Then, how to solve, 1 Dimensional equation for fluid , without generating mesh for pipe. Is it possible?????? Thanks you very much for even replying me. I don't have someone to get some suggestion about this. Please tell me how to do this if you have some idea, about this.:) ////////////////////////////////////////////////////////////////////// based on the required heat extraction rate. Give inlet temperature value to fluid. |
[QUOTE=Kumudu;460572]
Quote:
|
Transient heat source
[QUOTE=gschaider;462458]
Thanks for reply. I give up that idea. These days, I am trying to combine, transient diffusion equation for solid and scalar transport equation for fluid. I have more than one solid regions (pipe, grout and soil). I am hoping to define different cell zones for water, pipe, and grout using topoSet dict. I am following the chtMultiRegionFoam for this. I hope I can do this. The regoins are coupled through boundary conditions. Not through the source terms. It is a difficult task. I saw a tutorial for blockCoupledTransientFoam posted by OpenFoam. This only deal with one fluid and solid region. But it handles the source term via defining alpha value. (0 for fluid , 1 for soild ). So, changing the given code that is applicable for multiple region is somewhat difficult for me. If it is also has been done by the openFoam group, please let me know. But, the regions should be defined by Toposet Dictionary not by patches. Dealing with topoSet is easy. Thanks again:) |
All times are GMT -4. The time now is 15:03. |