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

Accessing a vector in a volVectorField by cell label

Register Blogs Community New Posts Updated Threads Search

Like Tree15Likes
  • 14 Post By ngj
  • 1 Post By ICL

Reply
 
LinkBack Thread Tools Search this Thread Display Modes
Old   March 12, 2011, 15:50
Default Accessing a vector in a volVectorField by cell label
  #1
Member
 
Andrew Ryan
Join Date: Mar 2009
Posts: 47
Rep Power: 17
andrewryan is on a distinguished road
Given a volVectorField how can I access the vector corresponding to a given cell label? Simple question, but I couldn't figure it out so far. For example I want to access the value of U at a boundary as defined in 0/U how can I do that?

Also as far as I can see the underlying data structure of volVectorField is a linked list, is that correct? I don't understand how the mapping of the cell labels to the physical data such as U and V works.

thx for any help!
andrewryan is offline   Reply With Quote

Old   March 12, 2011, 16:43
Default
  #2
ngj
Senior Member
 
Niels Gjoel Jacobsen
Join Date: Mar 2009
Location: Copenhagen, Denmark
Posts: 1,900
Rep Power: 37
ngj will become famous soon enoughngj will become famous soon enough
Good evening

Let me try answering you questions, as I understand them. Accessing an internal value is done as:

Code:
label celli(100);
vector uCell = U[celli];
This is the easy part. Knowing the cell label you can directly get the data, as it is always internal.

To access the values on a boundary, you need to get a reference to the boundary field. This is done in the following way:

Code:
label patchID = mesh.boundaryMesh().whichPatchID("myBoundaryName");
vectorField & Uw = U.boundaryField()[patchID];
In the above, Uw is a list of velocities which has the same length as the number of faces on that specific boundary. To access the velocity component you can do it in two ways. The first only works on cell level:

Code:
scalar u = U[celli].x();
scalar v = U[celli].y();
scalar w = U[celli].z();
and the other method allows you to access the entire field

Code:
scalarField u = U.component(0);
scalarField v = U.component(1);
scalarField w = U.component(2);
The latter method does only return the velocity components of the internal values, thus if you need the boundary values merely replace U with Uw in the last expression.

Best regards

Niels
ngj is offline   Reply With Quote

Old   March 13, 2011, 04:53
Default
  #3
Member
 
Andrew Ryan
Join Date: Mar 2009
Posts: 47
Rep Power: 17
andrewryan is on a distinguished road
thx a lot for you quick answer
andrewryan is offline   Reply With Quote

Old   January 15, 2012, 05:48
Default Accessing vector components
  #4
ICL
New Member
 
Ali Sh
Join Date: Jun 2009
Location: London
Posts: 28
Rep Power: 16
ICL is on a distinguished road
Hi guys,

I am wondering if you can help me on the following problem:

The velocity vector components can be accessed using U.componet(0), U.componet(1), U.componet(2). I intend to add a constant to velocity Y component during the iteration. Initially I tried:

U.component(1) += constant;

The outcome shows that (Obviously) U has not been changed. Is it possible to define constant as a vector and add it to the velocity vector? how should it be written?
codder likes this.
ICL is offline   Reply With Quote

Old   April 18, 2016, 11:45
Default
  #5
Member
 
Ali
Join Date: Oct 2013
Location: Scotland
Posts: 66
Rep Power: 12
ali.m.1 is on a distinguished road
Hi All

Thanks for the tips. Is there any way to call the cell normal component? My cells lie in the x-y-z plane at the moment, but I want my code to work with any angled cells too. I want to extract the velocity component through a boundary face normal.
Any help is appreciated.

regards

Ali
ali.m.1 is offline   Reply With Quote

Old   April 19, 2016, 08:32
Default
  #6
Member
 
Ali
Join Date: Oct 2013
Location: Scotland
Posts: 66
Rep Power: 12
ali.m.1 is on a distinguished road
I solved my problem. I used the dot product on the velocity vector and the direction vector.
Quote:
vectorField normalSlaveVector = mesh.Sf().boundaryField()[slave];
Where slave is the patch name. Hope this helps anyone else.
ali.m.1 is offline   Reply With Quote

Old   April 21, 2016, 06:51
Default
  #7
New Member
 
Pavlos Alexias
Join Date: Apr 2016
Posts: 1
Rep Power: 0
PavlosAlx is on a distinguished road
Quote:
Originally Posted by ICL View Post
Hi guys,

I am wondering if you can help me on the following problem:

The velocity vector components can be accessed using U.componet(0), U.componet(1), U.componet(2). I intend to add a constant to velocity Y component during the iteration. Initially I tried:

U.component(1) += constant;

The outcome shows that (Obviously) U has not been changed. Is it possible to define constant as a vector and add it to the velocity vector? how should it be written?
You can simply do

scalar constValue = ... ;

vector const(constValue, constValue, constValue);

U[cellLabel] += const;
PavlosAlx is offline   Reply With Quote

Old   June 8, 2018, 04:48
Default
  #8
Senior Member
 
Elham
Join Date: Oct 2009
Posts: 184
Rep Power: 16
Elham is on a distinguished road
Quote:
Originally Posted by PavlosAlx View Post
You can simply do

scalar constValue = ... ;

vector const(constValue, constValue, constValue);

U[cellLabel] += const;

Hello everyone,

My question is vice versa. How can I create volVectorField from a vector?
I have tried the follwong:

Code:
//  
    //volVectorField gradAlpha(fvc::grad(alpha1));
    volVectorField gradAlpha(pos(alpha1)*fvc::grad(alpha1));

    const dimensionedScalar deltaN = 1e-8/pow(average(mixture.U().mesh().V()), 1.0/3.0);

    // Face unit interface normal
    volVectorField nHatfv(gradAlpha/(mag(gradAlpha) + deltaN));

    volVectorField Vr(mDotU / rho * nHatfv) ;

label celli;
const cellList& Cells = mesh.cells(); //list of all cell IDs
const faceList& faces = mesh.faces(); //list of all face IDs
for(celli = 0; celli < mesh.nCells(); celli++)
{
    if(alpha1[celli] > 0 && alpha1[celli] < 1)
    {    
        vector um[celli]=U[celli]+Vr[celli];
    }
    else
    {
        vector um[celli]=U[celli];
    }
}

  volVectorField U1
    (
        IOobject
        (
            "U1",
            runTime.timeName(),
            mesh,
            IOobject::MUST_READ,
            IOobject::AUTO_WRITE
        ),
        mesh,
        dimensionedScalar ("U1",dimVelocity,1)
    );


    volVectorField Um = um * U1 ;
But the following error comes up:

Code:
UEqn.H:49:5: error: no matching function for call to ‘Foam::GeometricField<Foam::Vector<double>, Foam::fvPatchField, Foam::volMesh>::GeometricField(Foam::IOobject, Foam::dynamicFvMesh&, Foam::dimensionedScalar)’
Cheers,

Elham
Elham is offline   Reply With Quote

Reply

Tags
datastructures, fields


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
FvMatrix coefficients shrina OpenFOAM Running, Solving & CFD 10 October 3, 2013 14:38
Cells with t below lower limit Purushothama Siemens 2 May 31, 2010 21:58
accessing upstream cell - UDF bohis FLUENT 0 April 7, 2008 05:12
[Commercial meshers] Trimmed cell and embedded refinement mesh conversion issues michele OpenFOAM Meshing & Mesh Conversion 2 July 15, 2005 04:15
Warning 097- AB Siemens 6 November 15, 2004 04:41


All times are GMT -4. The time now is 22:04.