segunda-feira, 17 de fevereiro de 2014

Jet Nozzle - Not well explained due to confidentiality

Again, it has been a while since my last post. But I reached a point with Openfoam that I don't know if it is confidential or not. Most of my simulations are taking into consideration of what I'm really observing at the field. One of the examples regards the jet impingement. This job is part of a bigger one where we have a jet flow from a bit nozzle hitting a wall.

sexta-feira, 20 de dezembro de 2013

Invest in Openfoam

It has been a while since my last post. This was caused by a project inside Schlumberger that took me away 3 months from Openfoam.

This was good because was a quite challenging job and made me value a lot my field job. In the meantime, I bought 2 Xeon CPU's and some other computer parts. Now ... I have a "biffy" computer to run my simulations 20 threads of processing power. Compared to my previous computer, this is a lot. ahhahaahaha


The only issue regarding these two CPUs is because I had to buy a Supermicro motherboard ... it is an EATX form factor (quite big) and here in Brazil we don't have such type of EATX case ... so ... I need to build one.

Right now my Frankenstein looks like this:


Quite ugly. But it is powerful and well cooled. hahahahahahah

I hope I find a way to build this EATX case.

Cheers!!!

terça-feira, 27 de agosto de 2013

Drill Pipe Rotation Influence

8 1/2" Well with 5 1/2" FH DP and 7" TJ - 60 RPM

8 1/2" Well with 5 1/2" FH DP and 7" TJ - 100 RPM

8 1/2" Well with 5 1/2" FH DP and 7" TJ - 160 RPM


8 1/2" Well with 5 1/2" FH DP and 7" TJ - No RPM

quinta-feira, 22 de agosto de 2013

Merging Meshes from Salomé to be Used on Openfoam

This post took me a while. The main problem in here is due to mesh conversion between Salomé and Openfoam. Depending on your geometry, when you convert Salomé's unv file to Openfoam it appear some inner parts that are pretty annoying to get rid off.

If the mesh is pure unstructured you can do it easily. Just create and export. But if you have some structured mesh within a mesh, these inner parts come to play. One of my goals is to observe the velocity profile behavior and if you have an unstructured grid this won't be good, mainly because you won't have an even spaced velocity vector.

So, because of this issue, I had to redesign my straight stabilizer in order to have a hybrid grid. I had divided him into three main meshes and he is going to follow basically the same divisions stated at http://chasingaftermystuff.blogspot.com/2013/04/creating-spiral-drilling-stabilizer_12.html.
Follows the mesh from inner wall:
Zooming close to SmSpa we can see that this part is made with triangles and tetrahedrons. This is the only part on this straight stabilizer that is unstructured.
I won't publish the script capable of doing this because, by now, you should be able to do the same, but if you want the full script I can send you with no charge. : ) . Just leave a comment.

Ok.

As we saw we have mainly 3 parts (Slick, SmSpa and Stb) to complete the the whole we must mirror SmSpa and Slick. So, in the end we have 5 parts in total. It is easier to merge them with Openfoam. For each part we need to create an Openfoam case.

It is going to be like this:




As you can see, we have the all 5 parts, 3 original and 2 mirrored (MSlick and MSmSpa). Every part has an interface. The Slick part has one entrance, the Inlet, and two interfaces between Slick and SmSpa, the interface that belongs to Slick and one that belongs to SmSpa,

Showing the interface.


After exporting all your meshes to unv format and putting everything on the respective cases we must merge and stitch them.

Let us take the case where we must connect the Slick part to SmSpa. Go to the Slick folder and type:

    $ mergeMeshes ../Slick/ ../SmSpa/
    $ stitchMesh Slick_Interface_SmSpa SmSpa_Interface_Slick

On the mergeMeshes you need to input the case folders. Mines are /Slick/ and /SmSpa/. On stitchMesh is going to be the name of your interfaces. I named mine as Slick_Interface_SmSpa (belongs to Slick) SmSpa_Interface_Slick (belongs to SmSpa). You will see you had created two new folders inside of the case. These folders are going to be created according to you controlDict write Interval. If you write interval is 0.001, your first folder is going to be 0.001 and the second, 0.002. Go to the second folder and check your boundary file. If your stitchMesh went smooth you are supposed to have 6 patches but 2 of them with 0 faces. If this is the fact. Perfect. Erase these patches and correct the first number that begins the ( ). It should be 6. Now, type 4. Like this:


Copy the content of the second folder into the folder constant/polyMesh. The idea is to substitute the previous content.

By now you merged the Slick and SmSpa. Erase the folders created through stitchMesh and mergMeshes. Now we need to merge the rest. 

I've found that Openfoam has some problems to stitch more meshes ... I like to be practical, so, a workaround for this is just change to another folder. We need to merge the mesh that we just created into Stb. Go to Stb/ folder and repeat the same process.

Cheers!!!



segunda-feira, 12 de agosto de 2013

Getting back to business!!

Hi ...

It has been a while since my last post.

As you know, Brazil has been passing trough several "small" revolutions. People's minds are changing ... politicians are afraid of that ... well ... they were.

Due to this I couldn't avoid going to the streets also. I was part ... I am part of this ... Just got tired of been robbed by these guys. Brazil is a so good country, but unfortunately we have a very bad cast of people leading us.

Between these protests I had to work in a very demanding well, with a very demanding client.

Let's see what we must do.


  1. We must create a good mesh for our stabilizer. I would like to create a structured mesh because we know we can create an unstructured one.
  2. Attach this mesh to a simple BHA and run OF simulations.
Cheers!

segunda-feira, 10 de junho de 2013

How to set Icofoam to solve the Annular Flow problem

As you observed, I solved the problem already. This post is a step-by-step to help you to solve the same problem.

What do we need?

  1. Prepare a set of folders to run Openfoam;
  2. Export the created mesh to unv;
  3. Convert the unv to Openfoam;
  4. Prepare Icofoam to run.

1 - Prepare a set of folders to run Openfoam

I'm here not to reinvent the wheel. You can see a good Openfoam introduction in http://www.openfoam.org/docs/user/cavity.php

At this type of annular incompressible flow I choose to use Icofoam ... it is not the closest flow model to the problem ... it is the flow model. So, pick the cavity problem itself and copy to where you are going to run your simulation.

2 - Export the created mesh to unv

The best way, to me, is to export to a unv file. 
Right click over the mesh and choose to export to UNV file
When you export the file, please, export to the root folder of your problem. For example, if you copied "cavity" folder, this mesh should be on "cavity".

3 - Convert unv file to Openfoam

If you read some of my reports, you will see, we set the environment to succeed on this process. We have the Inlet, Outlet, Inner Wall and Outer Wall boundaries. So, this process should be straight forward. If you don't succeed you are maybe facing issues in your mesh or in your Salomé (6.5!) version (Take a look at http://openfoamwiki.net/index.php/IdeasUnvToFoam).

Is your unv file in the correct folder? If yes, just type:

  ideasUnvToFoam Annular.unv

My file is called "Annular.unv"

Ok. Type:
  
  checkMesh

And in your output you should be looking for this:

Checking patch topology for multiply connected surfaces ...
    Patch                      Faces    Points   Surface topology                  
    Inlet                       1296      1368     ok (non-closed singly connected)  
    Outlet                    1296      1368     ok (non-closed singly connected)  
    Outer_Wall           14400    14472    ok (non-closed singly connected)  
    Inner_Wall            14400    14472    ok (non-closed singly connected)  

As you can see, we have everything. Inlet, Outlet, Outer_Wall and Inner_Wall.

4 - Prepare Icofoam to run

Now comes the part that took me a while to understand. Take a look on the following link http://www.openfoam.org/docs/user/boundaries.php

Let's take care of the boundary conditions. Open the "p" file on the subfolder "0" (zero) and substitute for this one:


/*--------------------------------*- 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       volScalarField;
    object      p;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

dimensions      [0 2 -2 0 0 0 0];

internalField   uniform 0;

boundaryField
{
    Inlet
    {
        type            zeroGradient;
    }

    Outlet
    {
        type            fixedValue;
        value           uniform 0;
    }

    Inner_Wall
    {
        type            zeroGradient;
    }

    Outer_Wall
    {
        type            zeroGradient;
    }

}

// ************************************************************************* //

You can find an explanation of this file in here: http://www.openfoam.org/docs/user/basic-file-format.php.

But the there are some few things that I must call your attention.

On the line that says:

   dimensions      [0 2 -2 0 0 0 0];

Is saying that you have a dimension of m²/s². Well, it is a pressure file so, we should be expecting in SI units a dimension of kg/(m.s²). What is the problem? No problem at all. With Icofoam we will use kinematic viscosity and to keep the units coherent on the solver we must divide the pressure by density.

Type zeroGradient:

As you can see, I'm using zeroGradient in every patch except "Outlet". It is only because I'm not using the gravity for this problem and solving the Navier-Stokes Equations for this setting you will find a zero pressure gradient. On the Outlet I'm using fixed value because the flow runs is not constrained anymore and goes to the environment that has zero pressure.

On the same "0" subfolder let us see the "U" file and substitute for the following:

/*--------------------------------*- 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       volVectorField;
    object      U;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

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

internalField   uniform (0 0 0);

boundaryField
{
    Inlet
    {
        type            fixedValue;
        value           uniform (0 0 1.66);
    }

    Outlet
    {
        type            zeroGradient;
    }
 
    Inner_Wall
    {
type            fixedValue;
        value           uniform (0 0 0);
    }

    Outer_Wall
    {
type            fixedValue;
        value           uniform (0 0 0);
    }
}

// ************************************************************************* //


As you can see, is very straightforward. You have the no-slip condition on the walls and the velocity inlet.

Now we should move to the subfolder "constant". In there you should find the polyMesh folder (don't need to touch it. It came from the unv conversion) and "transportProperties" file. Open it and substitute for:

/*--------------------------------*- 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    "constant";
    object      transportProperties;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

nu              nu [ 0 2 -1 0 0 0 0 ] 7.27e-5;


// ************************************************************************* //

As I said, IcoFoam uses the kinematic viscosity. You have the correct dimensions and the attribute value that came from http://chasingaftermystuff.blogspot.com.br/2013/05/using-icofoam-to-solve-annular-flow.html.

To the folder "System" I would advise you to wait a little bit more. I don't understand it as a whole yet and would suggest you to look into Openfoam's website for further information.

But if you have any doubt, just contact me ...




quinta-feira, 6 de junho de 2013

Creating a Structured Annular Grid with Viscous Layers in Salomé

Hi, from the previous posts you should be able to read the following python code to create your structured annular grid.

What is different from previous posts? Right now the code is very simple and we have viscous layers on the walls.

I had learned how to do this by taking a look at Salomé's forums. But, the function that called my attention and made this possible was PROPAGATE (http://docs.salome-platform.org/salome_7_2_0/gui/GEOM/geompy_doc/group__l3__blocks__op.html#ga81185dc6c66632dff79c2f0a19f77537)

With this function I could divide my inlet/outlet in a way that I could use the quadrangle mesh.

Again, if you have any doubt, just send me an email.


Structured Annular Mesh with Viscous Layer


###########
import sys
import salome

salome.salome_init()
theStudy = salome.myStudy

import salome_notebook
notebook = salome_notebook.notebook

###
### GEOM component
###

import GEOM
import geompy
import math
import SALOMEDS

gg = salome.ImportComponentGUI("GEOM")
geompy.init_geom(theStudy)

O = geompy.MakeVertex(0, 0, 0)
OX = geompy.MakeVectorDXDYDZ(1, 0, 0)
OY = geompy.MakeVectorDXDYDZ(0, 1, 0)
OZ = geompy.MakeVectorDXDYDZ(0, 0, 1)

Wellbore = 8.5 # in
OD_Component = 6.5 # in
Length_Component = 10 # m

Wellbore = geompy.MakeCylinder(O, OZ, 0.5*Wellbore, Length_Component)
OD_Component = geompy.MakeCylinder(O, OZ, 0.5*OD_Component, Length_Component)
Annular_1 = geompy.MakeCut(Wellbore, OD_Component)
Annular_2 = geompy.MakeScaleAlongAxes(Annular_1, O, 0.0254, 0.0254, 1) # converting OD to imperial units

# Preparing for mesh
Plane_1 = geompy.MakePlaneLCS(None, 2000, 3)
Annular = geompy.MakeHalfPartition(Annular_2, Plane_1)
[Compound_1, Compound_2, Compound_3, Compound_4] = geompy.Propagate(Annular)
[Face_1,Face_2,Face_3,Face_4,Face_5,Face_6,Face_7,Face_8,Face_9,Face_10] = geompy.ExtractShapes(Annular, geompy.ShapeType["FACE"], True)
listSubShapeIDs = geompy.SubShapeAllIDs(Annular, geompy.ShapeType["FACE"])
Inlet = geompy.CreateGroup(Annular, geompy.ShapeType["FACE"])
geompy.UnionIDs(Inlet, [42, 26])
Outlet = geompy.CreateGroup(Annular, geompy.ShapeType["FACE"])
geompy.UnionIDs(Outlet, [45, 14])
Outer_Wall = geompy.CreateGroup(Annular, geompy.ShapeType["FACE"])
geompy.UnionIDs(Outer_Wall, [4, 38])
Inner_Wall = geompy.CreateGroup(Annular, geompy.ShapeType["FACE"])
geompy.UnionIDs(Inner_Wall, [48, 34])
Inlet_Outlet_Wire = geompy.CreateGroup(Annular, geompy.ShapeType["COMPOUND"])
geompy.UnionList(Inlet_Outlet_Wire, [Compound_3, Compound_4])

geompy.addToStudy( Wellbore, 'Wellbore' )
geompy.addToStudy( OD_Component, 'OD_Component' )
geompy.addToStudy( Annular, 'Annular' )
geompy.addToStudyInFather( Annular, Compound_1, 'Compound_1' )
geompy.addToStudyInFather( Annular, Compound_2, 'Compound_2' )
geompy.addToStudyInFather( Annular, Compound_3, 'Compound_3' )
geompy.addToStudyInFather( Annular, Compound_4, 'Compound_4' )
geompy.addToStudyInFather( Annular, Inlet, 'Inlet' )
geompy.addToStudyInFather( Annular, Outlet, 'Outlet' )
geompy.addToStudyInFather( Annular, Outer_Wall, 'Outer_Wall' )
geompy.addToStudyInFather( Annular, Inner_Wall, 'Inner_Wall' )


###
### SMESH component
###

import smesh, SMESH, SALOMEDS

smesh.SetCurrentStudy(theStudy)
import StdMeshers

Mesh_1 = smesh.Mesh(Annular)

Z_axis_segments = 200
Radius_segments = 10
Radius_divisions = 36 # For each half of inlet/outlet - It is going to divide 180 degrees for Radius_divisions

# Number of segments in z axis
Regular_1D = Mesh_1.Segment()
Nb_Segments_1 = Regular_1D.NumberOfSegments(Z_axis_segments)
Nb_Segments_1.SetDistrType( 0 )

# Number of radius segments
Regular_1D_1 = Mesh_1.Segment(geom=Inlet)
Nb_Segments_2 = Regular_1D_1.NumberOfSegments(Radius_segments)
Nb_Segments_2.SetDistrType( 0 )
Regular_1D_2 = Mesh_1.Segment(geom=Outlet)
status = Mesh_1.AddHypothesis(Nb_Segments_2,Outlet)

# Number of radius divisions
Regular_1D_3 = Mesh_1.Segment(geom=Inlet_Outlet_Wire)
Nb_Segments_3 = Regular_1D_3.NumberOfSegments(Radius_divisions)
Nb_Segments_3.SetDistrType( 0 )

# Type of meshing - Quadrangle for this case
Quadrangle_2D = Mesh_1.Quadrangle(algo=smesh.QUADRANGLE)
Quadrangle_Parameters_1 = Quadrangle_2D.QuadrangleParameters(StdMeshers.QUAD_STANDARD)

Quadrangle_2D_1 = Mesh_1.Quadrangle(algo=smesh.QUADRANGLE,geom=Inlet)
status = Mesh_1.AddHypothesis(Quadrangle_Parameters_1,Inlet)

Quadrangle_2D_2 = Mesh_1.Quadrangle(algo=smesh.QUADRANGLE,geom=Outlet)
status = Mesh_1.AddHypothesis(Quadrangle_Parameters_1,Outlet)

# Creation of a hexahedron meshing - it is going to extrude the base along z axis
Hexa_3D = Mesh_1.Hexahedron(algo=smesh.Hexa)
Viscous_Layers_1 = Hexa_3D.ViscousLayers(0.001,4,1,[ 42, 26, 45, 14 ]) # Viscous layer

isDone = Mesh_1.Compute()
Inlet_1 = Mesh_1.GroupOnGeom(Inlet,'Inlet',SMESH.FACE)
Outlet_1 = Mesh_1.GroupOnGeom(Outlet,'Outlet',SMESH.FACE)
Outer_Wall_1 = Mesh_1.GroupOnGeom(Outer_Wall,'Outer_Wall',SMESH.FACE)
Inner_Wall_1 = Mesh_1.GroupOnGeom(Inner_Wall,'Inner_Wall',SMESH.FACE)

## set object names
smesh.SetName(Mesh_1.GetMesh(), 'Mesh_1')
smesh.SetName(Regular_1D.GetAlgorithm(), 'Regular_1D')
smesh.SetName(Nb_Segments_1, 'Nb. Segments_1')
smesh.SetName(Quadrangle_2D.GetAlgorithm(), 'Quadrangle_2D')
smesh.SetName(Quadrangle_Parameters_1, 'Quadrangle Parameters_1')
smesh.SetName(Hexa_3D.GetAlgorithm(), 'Hexa_3D')
smesh.SetName(Viscous_Layers_1, 'Viscous Layers_1')
smesh.SetName(Nb_Segments_2, 'Nb. Segments_2')
smesh.SetName(Nb_Segments_3, 'Nb. Segments_3')
smesh.SetName(Inlet_1, 'Inlet')
smesh.SetName(Outlet_1, 'Outlet')
smesh.SetName(Outer_Wall_1, 'Outer_Wall')
smesh.SetName(Inner_Wall_1, 'Inner_Wall')

if salome.sg.hasDesktop():
  salome.sg.updateObjBrowser(1)
##############