CFD Online Logo CFD Online URL
www.cfd-online.com
[Sponsors]
Home > Forums > Software User Forums > OpenFOAM

need help about double pipe heat exchanger with chtMultiRegionSimpleFoam

Register Blogs Community New Posts Updated Threads Search

Like Tree5Likes
  • 1 Post By wuyangzhen
  • 3 Post By Bloerb
  • 1 Post By wuyangzhen

Reply
 
LinkBack Thread Tools Search this Thread Display Modes
Old   December 6, 2017, 19:09
Default need help about double pipe heat exchanger with chtMultiRegionSimpleFoam
  #1
New Member
 
Yangzhen Wu
Join Date: Sep 2017
Posts: 8
Rep Power: 9
wuyangzhen is on a distinguished road
hello everyone,

im a beginner of openfoam. I have already made a case about double pipe heat exchanger with chtMultiRegionSimpleFoam. my case can run, but the result looks not good. i know there must be some mistakes in my case and the simulation time is also particularly short, but i cant find it, can someone help me to check it. so many thanks.

My case:

inner pipe
(bottomWater): inner diameter 0.01m, the hot water flows through the inner pipe from pipe right to pipe left, the inlet temperature of hot water is 333K, velosity of hot water is 0.177m/s, it is transitional flow in inner pipe.
outer pipe (topWater): outer diameter 0.03m, the cold water flows through the outer pipe from pipe left to pipe right, the inlet temperature of cold water is 288K, velosity of cold water is 0.035m/s, it is laminar flow in outer pipe. the outer face of the outer pipe is insulated.
copper (midCopper): copper is the material of the inner pipe that used as a wall separating hot water and cold water. thermal conductivity of copper is 380 w/mk, copper thickness of inner pipe is 0.002m.

Length of pipe is 4.5m

i have updated my case file. no matter what the problem of this case have, please tell me, i will be very grateful.
Attached Files
File Type: gz double_pipe_heat_exchanger.tar.gz (7.0 KB, 75 views)
samuel0032 likes this.
wuyangzhen is offline   Reply With Quote

Old   December 7, 2017, 01:25
Default
  #2
Senior Member
 
piu58's Avatar
 
Uwe Pilz
Join Date: Feb 2017
Location: Leipzig, Germany
Posts: 744
Rep Power: 15
piu58 is on a distinguished road
What solver did you use? What happens if you run the simulation?
__________________
Uwe Pilz
--
Die der Hauptbewegung überlagerte Schwankungsbewegung ist in ihren Einzelheiten so hoffnungslos kompliziert, daß ihre theoretische Berechnung aussichtslos erscheint. (Hermann Schlichting, 1950)
piu58 is offline   Reply With Quote

Old   December 7, 2017, 08:23
Default
  #3
New Member
 
Yangzhen Wu
Join Date: Sep 2017
Posts: 8
Rep Power: 9
wuyangzhen is on a distinguished road
i use chtMultiRegionSimpleFoam. when i run the simulation, it goes well. but the simulation time is too short and the outlet temperature of hot water from the simulation is big difference with experimental data.

experimental data:
inlet temperature of hot water: 333K, outlet temperature of hot water is 318K
inlet temperature of cold water: 288K, outlet temperature of hot water is 298K

simulation result:
inlet temperature of hot water: 333K, outlet temperature of hot water is 299K
inlet temperature of cold water: 288K, outlet temperature of hot water is 298K
wuyangzhen is offline   Reply With Quote

Old   December 9, 2017, 05:49
Default
  #4
Senior Member
 
Join Date: Sep 2013
Posts: 353
Rep Power: 21
Bloerb will become famous soon enough
Attached is a cleaned up version of you case. I'll help you through this, since this is a good example case for heat transfer for many on here. The main things to do are:

Open the blockMesh file and edit the radii and length to your values. Play around with the mesh resolution. Afterwards set the T and U inlet conditions.

Inlet velocity profile
use flowRateInletVelocity and the extrapolatedProfile option or a fixedMean / fixedProfile option. fixedValue sets one constant value over the entire channel. The entry length will falsify your results. In reality the water will enter the heat exchanger with a velocity profile not a constant value. Again set up in the case attached. This is known as the Graetz Problem, make sure to read up on it.

turbulence model
Change your turbulence model to kOmegaSST. IMO this should give you better results for transitional flows. Calculate the inlet values of k and omega and set them accordingly.

mesh
to make sure your results are in good agreement with experimental data you need a resolved boundary layer. The attached blockMesh allows for this kind of refinement via grading. Eyeball the yPlus value and set your values accordingly. You can check with the yPlus function object if you are in the ballpark. For a well resolved boundary yPlus < 1 is a necessity. With values ~30 you should be able to reproduce the experiments.

residuals and convergence
check the residuals and outlet temperature for convergence. Additional function objects are attached. Use foamMonitor to check during run time if these are falling.
Code:
 
foamMonitor -l residuals.dat

Change to non constant thermal Properties.
Values for water can be found in the NIST webbook. Change your thermoPhysicalProperties files to polynomials once you were able to create a good solution with constant ones

Check back if there are other questions
Attached Files
File Type: zip double_pipe_heat_exchanger.zip (38.0 KB, 113 views)
Ramzy1990, saidc. and samuel0032 like this.
Bloerb is offline   Reply With Quote

Old   December 10, 2017, 10:20
Default
  #5
New Member
 
Yangzhen Wu
Join Date: Sep 2017
Posts: 8
Rep Power: 9
wuyangzhen is on a distinguished road
Quote:
Originally Posted by Bloerb View Post
Attached is a cleaned up version of you case. I'll help you through this, since this is a good example case for heat transfer for many on here. The main things to do are:

Open the blockMesh file and edit the radii and length to your values. Play around with the mesh resolution. Afterwards set the T and U inlet conditions.

Inlet velocity profile
use flowRateInletVelocity and the extrapolatedProfile option or a fixedMean / fixedProfile option. fixedValue sets one constant value over the entire channel. The entry length will falsify your results. In reality the water will enter the heat exchanger with a velocity profile not a constant value. Again set up in the case attached. This is known as the Graetz Problem, make sure to read up on it.

turbulence model
Change your turbulence model to kOmegaSST. IMO this should give you better results for transitional flows. Calculate the inlet values of k and omega and set them accordingly.

mesh
to make sure your results are in good agreement with experimental data you need a resolved boundary layer. The attached blockMesh allows for this kind of refinement via grading. Eyeball the yPlus value and set your values accordingly. You can check with the yPlus function object if you are in the ballpark. For a well resolved boundary yPlus < 1 is a necessity. With values ~30 you should be able to reproduce the experiments.

residuals and convergence
check the residuals and outlet temperature for convergence. Additional function objects are attached. Use foamMonitor to check during run time if these are falling.
Code:
 
foamMonitor -l residuals.dat

Change to non constant thermal Properties.
Values for water can be found in the NIST webbook. Change your thermoPhysicalProperties files to polynomials once you were able to create a good solution with constant ones

Check back if there are other questions
Thank you very very much for your time and help.

1. first i edit the radius and length with my value but i cant understand the blockMeshdict that you have made.
Code:
convertToMeters 0.001;


// necessary variables
radiusI 5; // inner solid radius in mm
radiusM 7; // outer solid radius in mm
radiusA 15;   // outer fluid radius in mm
length -4500;  //mm
xa 5;   // Netzfeinheit radiale Richtung
ya 10;  // Netzfeinheit Umfangsrichtung
za 100; // Netzfeinheit in Rohrrichtung

// automatically calculated values (i cant understand this part, like 0.30*$radiusI*sin(degToRad(45.0)), what does it mean?)

c1p #calc "0.30*$radiusI*sin(degToRad(45.0))"; 
c2p #calc "0.70*$radiusI*sin(degToRad(45.0))";
c3p #calc "1.00*$radiusI*sin(degToRad(45.0))";
c4p #calc "1.00*$radiusM*sin(degToRad(45.0))";
c5p #calc "1.00*$radiusA*sin(degToRad(45.0))";
c1n #calc "-1.0*$c1p";
c2n #calc "-1.0*$c2p";
c3n #calc "-1.0*$c3p";
c4n #calc "-1.0*$c4p";
c5n #calc "-1.0*$c5p";

PRI #calc "0.25*$radiusI";
NRI #calc "-1.0*$PRI";

PRM #calc "0.70*$radiusI";
NRM #calc "-1.0*$PRM";

PRA #calc "1.00*$radiusI";
NRA #calc "-1.0*$PRA"; 

PRS #calc "1.00*$radiusM";
NRS #calc "-1.0*$PRS"; 

PRB #calc "1.00*$radiusA";
NRB #calc "-1.0*$PRB"; 

   vertices
   (
    // fluidA 
    ($c1n $c1n $length) // 0 
    ($c1p $c1n $length) // 1 
    ($c1p $c1p $length) // 2 
    ($c1n $c1p $length) // 3 

    ($c2n $c2n $length) // 4 
    ($c2p $c2n $length) // 5    
    ($c2p $c2p $length) // 6 
    ($c2n $c2p $length) // 7 

    ($c3n $c3n $length) // 8 
    ($c3p $c3n $length) // 9    
    ($c3p $c3p $length) // 10 
    ($c3n $c3p $length) // 11
     
    ($c1n $c1n 0) // 12       
    ($c1p $c1n 0) // 13
    ($c1p $c1p 0) // 14 
    ($c1n $c1p 0) // 15 
 
    ($c2n $c2n 0) // 16
    ($c2p $c2n 0) // 17    
    ($c2p $c2p 0) // 18
    ($c2n $c2p 0) // 19

    ($c3n $c3n 0) // 20
    ($c3p $c3n 0) // 21     
    ($c3p $c3p 0) // 22
    ($c3n $c3p 0) // 23   
    //solid
    ($c4n $c4n $length) // 24
    ($c4p $c4n $length) // 25   
    ($c4p $c4p $length) // 26 
    ($c4n $c4p $length) // 27  
    
    ($c4n $c4n 0) // 28
    ($c4p $c4n 0) // 29     
    ($c4p $c4p 0) // 30
    ($c4n $c4p 0) // 31    
    // fluidB
    ($c5n $c5n $length) // 32 
    ($c5p $c5n $length) // 33   
    ($c5p $c5p $length) // 34 
    ($c5n $c5p $length) // 35  
    
    ($c5n $c5n 0) // 36
    ($c5p $c5n 0) // 37     
    ($c5p $c5p 0) // 38
    ($c5n $c5p 0) // 39     
   );                

   blocks
   (
    //fluidA Inner 
    hex (0  1  2  3 12 13 14 15) fluidA  ($ya $ya $za) simpleGrading (1 1 1)
    hex (0  4  5  1 12 16 17 13) fluidA  ($xa $ya $za) simpleGrading (1 1 1)
    hex (2  6  7  3 14 18 19 15) fluidA  ($xa $ya $za) simpleGrading (1 1 1)
    hex (1  5  6  2 13 17 18 14) fluidA  ($xa $ya $za) simpleGrading (1 1 1)
    hex (3  7  4  0 15 19 16 12) fluidA  ($xa $ya $za) simpleGrading (1 1 1)    
    // fluidA Boundary Layer
    hex (9  5  4  8 21 17 16 20) fluidA  ($xa $ya $za) simpleGrading (1 1 1)    
    hex (11 7  6 10 23 19 18 22) fluidA  ($xa $ya $za) simpleGrading (1 1 1)    
    hex (10 6  5  9 22 18 17 21) fluidA  ($xa $ya $za) simpleGrading (1 1 1) 
    hex (8  4  7 11 20 16 19 23) fluidA  ($xa $ya $za) simpleGrading (1 1 1)     
    // solid
    hex (25 9  8  24 29 21 20 28) solid  ($xa $ya $za) simpleGrading (1 1 1)    
    hex (26 10 9  25 30 22 21 29) solid  ($xa $ya $za) simpleGrading (1 1 1)    
    hex (27 11 10 26 31 23 22 30) solid  ($xa $ya $za) simpleGrading (1 1 1) 
    hex (24 8  11 27 28 20 23 31) solid  ($xa $ya $za) simpleGrading (1 1 1)  
    // fluidB
    hex (33 25 24 32 37 29 28 36) fluidB ($ya $ya $za) simpleGrading (1 1 1)    
    hex (34 26 25 33 38 30 29 37) fluidB ($ya $ya $za) simpleGrading (1 1 1)    
    hex (35 27 26 34 39 31 30 38) fluidB ($ya $ya $za) simpleGrading (1 1 1) 
    hex (32 24 27 35 36 28 31 39) fluidB ($ya $ya $za) simpleGrading (1 1 1)    
   );

   edges
   ( 
    // fluidA
    arc 0 1     (0    $NRI $length)
    arc 1 2     ($PRI 0    $length)
    arc 2 3     (0    $PRI $length)
    arc 3 0     ($NRI 0    $length) 

    arc 4 5     (0    $NRM $length)
    arc 5 6     ($PRM 0    $length) 
    arc 6 7     (0    $PRM $length)
    arc 7 4     ($NRM 0    $length)
    
    arc 8 9     (0    $NRA $length)
    arc 9 10     ($PRA 0    $length)
    arc 10 11     (0    $PRA $length)
    arc 11 8     ($NRA 0    $length)   
   
    arc 12 13     (0    $NRI 0)
    arc 13 14     ($PRI 0    0)
    arc 14 15     (0    $PRI 0)
    arc 15 12     ($NRI 0    0)

    arc 16 17     (0    $NRM 0)
    arc 17 18     ($PRM 0    0)
    arc 18 19     (0    $PRM 0)
    arc 19 16     ($NRM 0    0)
    
    arc 20 21     (0    $NRA 0)
    arc 21 22     ($PRA 0    0)
    arc 22 23     (0    $PRA 0)
    arc 23 20     ($NRA 0    0)
    // solid
    arc 28 29     (0    $NRS 0)
    arc 29 30     ($PRS 0    0)
    arc 30 31     (0    $PRS 0)
    arc 31 28     ($NRS 0    0)    
    
    arc 24 25     (0    $NRS $length)
    arc 25 26     ($PRS 0    $length)
    arc 26 27     (0    $PRS $length)
    arc 27 24     ($NRS 0    $length)     
    // fluidB
    arc 36 37     (0    $NRB 0)
    arc 37 38     ($PRB 0    0)
    arc 38 39     (0    $PRB 0)
    arc 39 36     ($NRB 0    0)    
    
    arc 32 33     (0    $NRB $length)
    arc 33 34     ($PRB 0    $length)
    arc 34 35     (0    $PRB $length)
    arc 35 32     ($NRB 0    $length)     
   );
   
defaultPatch
{
    name walls; (here walls represent the outer face of pipe)
    type wall;
}   

boundary
(
    inlet
    {
        type patch;
        faces
        (
         (0  1  2  3 )
         (4  5  1  0 )
         (3  2  6  7 )
     (4  0  3  7 )
     (1  5  6  2 )
         (10 6  7  11)
         (9  5  6  10)
         (8  9  5  4 )
         (8  4  7  11)
     (39 31 30 38)    
     (38 30 29 37)    
     (37 29 28 36)    
     (36 28 31 39)         
        );
    } 
    outlet
    {
        type patch;
        faces
        (
     (13 12 15 14)         
     (17 16 12 13)
     (12 16 19 15)
     (17 13 14 18)
     (14 15 19 18)    
     (23 19 18 22)
     (20 16 19 23)
     (21 17 16 20)
     (22 18 17 21)
     (35 27 24 32)    
     (32 24 25 33)    
     (33 25 26 34)    
     (34 35 27 26)    
    );
    }        
);
2. i set up the inlet velosity in 0 file with flowRateInletVelocity and the extrapolatedProfile option as you say
Code:
/*--------------------------------*- C++ -*----------------------------------*\
| =========                 |                                                 |
| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
|  \\    /   O peration     | Version:  v1606+                                |
|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
|    \\/     M anipulation  |                                                 |
\*---------------------------------------------------------------------------*/
FoamFile
{
    version     2.0;
    format      ascii;
    class       volVectorField;
    location    "0/fluidA";
    object      U;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

dimensions      [ 0 1 -1 0 0 0 0 ];

internalField   uniform ( 0 0 0 );

boundaryField
{
    inlet
    {
        type                          flowRateInletVelocity;
        volumetricFlowRate    0.000013889;
        extrapolateProfile        yes;
        value                         $internalField;
    }
    outlet
    {
        type                 inletOutlet;
        inletValue         $internalField;
        value               $internalField;
    }
    wall
    {
        type            fixedValue;
        value           uniform (0 0 0);
    }
}
i dont know about the boundary of outlet with inletOutlet
Code:
outlet
    {
        type                 inletOutlet;
        inletValue         $internalField;
        value               $internalField;
    }
now the simulation are running. after that i will upload the result of simulation
wuyangzhen is offline   Reply With Quote

Old   December 10, 2017, 11:21
Default
  #6
New Member
 
Yangzhen Wu
Join Date: Sep 2017
Posts: 8
Rep Power: 9
wuyangzhen is on a distinguished road
Thank you very much for your time and help. i dont know why i cant reply with code file. the simulation is running., after it is finished, i will upload the result of the simulation.

fluidA: hot water flows through the inner pipe
fluidB: cold water flows through the outer pipe
Attached Images
File Type: png fluidA_residual (1).png (22.4 KB, 88 views)
File Type: png fluidA_residual (2).png (21.3 KB, 63 views)
File Type: png fluidA_yPlus.png (26.2 KB, 58 views)
File Type: png fluidB_yPlus.png (26.6 KB, 50 views)
Ramzy1990 likes this.

Last edited by wuyangzhen; December 10, 2017 at 17:04.
wuyangzhen is offline   Reply With Quote

Old   December 11, 2017, 09:19
Default
  #7
New Member
 
Yangzhen Wu
Join Date: Sep 2017
Posts: 8
Rep Power: 9
wuyangzhen is on a distinguished road
hello Bloerb,

Thank you very much again.

i cant understand what you have said about mesh

mesh
to make sure your results are in good agreement with experimental data you need a resolved boundary layer. The attached blockMesh allows for this kind of refinement via grading. Eyeball the yPlus value and set your values accordingly. You can check with the yPlus function object if you are in the ballpark. For a well resolved boundary yPlus < 1 is a necessity. With values ~30 you should be able to reproduce the experiments.

it means i need change the simpleGrading in blockmeshdict, so that the yPlus can be < 1?
wuyangzhen is offline   Reply With Quote

Old   December 11, 2017, 09:29
Default
  #8
Senior Member
 
piu58's Avatar
 
Uwe Pilz
Join Date: Feb 2017
Location: Leipzig, Germany
Posts: 744
Rep Power: 15
piu58 is on a distinguished road
At which distance of the boundary layer you have to cover by the mesh depends on the model you run. RAND usually models around 30*yPlus. LES models at the space you have covered by the mesh. DNS models nothing, you have to make a very fine mesh until the friction is so large that no smaller vortices can arise.
__________________
Uwe Pilz
--
Die der Hauptbewegung überlagerte Schwankungsbewegung ist in ihren Einzelheiten so hoffnungslos kompliziert, daß ihre theoretische Berechnung aussichtslos erscheint. (Hermann Schlichting, 1950)
piu58 is offline   Reply With Quote

Old   December 11, 2017, 11:11
Default
  #9
New Member
 
Yangzhen Wu
Join Date: Sep 2017
Posts: 8
Rep Power: 9
wuyangzhen is on a distinguished road
Thank you for your help.

From the Simulation i get 2 pictures about yplus

fluidA: 1.5<yPlus <2
fluidB: 2.25 <yPlus <2.3

it means i need to refine the mesh, so that the yPlus < 1?
Attached Images
File Type: png fluidA_yPlus.png (26.2 KB, 41 views)
File Type: png fluidB_yPlus.png (26.6 KB, 25 views)
wuyangzhen is offline   Reply With Quote

Old   December 11, 2017, 13:26
Default
  #10
Senior Member
 
Join Date: Sep 2013
Posts: 353
Rep Power: 21
Bloerb will become famous soon enough
Not necessarily. CHT requires two things:
  1. The temperature on fluid and solid side are identical
  2. heat flux fluid = - heat flux solid
So all the heat that is leaving the solid enters the fluid and vice versa. The amount of heat that goes over the boundary depends on the temperature and velocity gradient in the fluid. All the heat transfer happens inside the boundary layer of the fluid. Those are typically very thin for high Reynolds numbers. Hence you need to refine those. The y+ value tells you how well resolved your boundary layer is. For laminar flow you will get this right with only a few cells, for turbulent flow these boundary layers are however often so small (or to put it more correctly, the sublayers and hence your gradient needed for the correct cht results), that wall functions are needed. These will only function correctly if you are in the right y+ region. Hence you should aim for ~30 or if you can spare the expense fully resolve the boundary layer with y+<1. For a simple heat exchanger with transitional flow this might be overkill though.

What i meant is simpleGrading. Change this in such a way that your fluid boundary layers are resolved without drastically increasing the cell size. The values you have right now are perfectly fine however.

I also mentioned polynomial values for your fluid. After looking at your post again this is also overkill. The temperature range for your problem is simple to small for this to drastically effect your results.

The biggest problem right now is probably that your residuals for h are not falling in one of the regions. Why and which region is that? You might have to check mesh quality and the schemes and solution files.
Bloerb is offline   Reply With Quote

Old   December 12, 2017, 01:19
Default
  #11
Senior Member
 
piu58's Avatar
 
Uwe Pilz
Join Date: Feb 2017
Location: Leipzig, Germany
Posts: 744
Rep Power: 15
piu58 is on a distinguished road
> for turbulent flow these boundary layers are however often so small (or to put it more correctly, the sublayers and hence your gradient needed for the correct cht results)

The thickness of the layer of temperature changes is around 10% of the thickness of the Prandtl layer. To describe the temperature layer you should have a few cells there, for better accuracy around 10. Keep in mind that a refinement to the wall may destabilize your simulation.
__________________
Uwe Pilz
--
Die der Hauptbewegung überlagerte Schwankungsbewegung ist in ihren Einzelheiten so hoffnungslos kompliziert, daß ihre theoretische Berechnung aussichtslos erscheint. (Hermann Schlichting, 1950)
piu58 is offline   Reply With Quote

Reply


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 Off
Trackbacks are Off
Pingbacks are On
Refbacks are On


Similar Threads
Thread Thread Starter Forum Replies Last Post
No Display of Heat Transfer Graphs For Double Pipe Heat Exhanger in CFX Solver Shomaz ul Haq CFX 17 November 25, 2015 23:44
how to analysis double pipe heat exchanger in cfx rammax8 CFX 12 February 14, 2014 17:10
Question about heat transfer coefficient setting for CFX Anna Tian CFX 1 June 16, 2013 07:28
[ANSYS Meshing] double pipe heat exchanger meshing in ICEM CFD chitra ANSYS Meshing & Geometry 0 April 13, 2013 09:36
pipe in pipe heat exchanger JohannV FLUENT 3 December 3, 2009 03:53


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