Skip to content

Operate the whole vector field

OpenLB – Open Source Lattice Boltzmann Code Forums on OpenLB General Topics Operate the whole vector field

Viewing 15 posts - 1 through 15 (of 15 total)
  • Author
    Posts
  • #1915
    steed188
    Participant

    Hi,
    I’d like to operate the whole vector field after every collision step. I wish to know:
    1. How should I get the whole vector field such as velocity after collision step?
    2. How are linear operations defined in OpenLB? For example this time’s velocity plus last time’s velocity.

    best wishes,

    #2626
    albert.mink
    Moderator

    Dear steed188,

    please have a look to our examples and user guide.We provide easy generation of velocity field, linear functions and many more.

    Best regards,
    Albert

    #2628
    steed188
    Participant

    Dear Albert,
    After I used SuperLatticePhysVelocity3D to get the whole field vectors, I wanted to do some operation to it. For example

    SuperLatticePhysVelocity3D<T, DESCRIPTOR> velocity( sLattice, converter );
    velocity = velocity / 2;

    and it went wrong. I thought that the velocity is the data structure that created by SuperLatticePhysVelocity3D to store whole field vectors. Am I wrong?
    So how should I define a structure to store data after using SuperLatticePhysVelocity3D to get it?

    Thank you so much.

    yours sincerely
    steed188

    #2631
    albert.mink
    Moderator

    Hi steed188,

    there are several ways to get your velocity data modified.
    Fist, velocity as you put it in your post has x,z,y component. Perhaps you prefer to compute the magnitude (l^2 norm, see SuperEuklidNorm3D<T,DESCRIPTOR> http://optilb.com/DoxyGen/html/d6/d91/classolb_1_1SuperEuklidNorm3D.html ) first and then divide it by two.

    These is one way how OpenLB may help you, more details can be found in your documentation, Chapter Functors.

    Operations such as multiplication (pointwise) with a constant, or linear function, … are usually done via Analytical Functors. Now, in order to manipulate a lattice Functor, you have to transform it first to an analytical functor and then apply the algebraic operations. Afterwards transform the functor back to a lattice functor, see interpolationF.h

    Regards,
    Albert

    #2632
    steed188
    Participant

    Dear Albert,
    Thank you a lot for keeping going my problems.

    I’ve tried the AnalticalF functors. I do not use the L2 norm velocities. Adversely, I tried to operate with the x,y,z components. I tried like below:

    //


    SuperLatticePhysVelocity3D<T, DESCRIPTOR> Velocity1( sLattice1, converter );
    SuperLatticePhysVelocity3D<T, DESCRIPTOR> Velocity2( sLattice2, converter );

    AnalyticalFfromSuperF3D<T> AnalVel1( Velocity1, true, 1 );
    AnalyticalFfromSuperF3D<T> AnalVel2( Velocity2, true, 1 );
    AnalyticalConst3D<T,T> Number1( T( 1.- 1./5. ) );
    AnalyticalConst3D<T,T> Number2( T( 1. / 5.) );

    AnalyticalIdentity3D<T,T> Calc_Temp1( AnalVel1 * Number1);
    AnalyticalIdentity3D<T,T> Calc_Temp2( AnalVel2 * Number1);
    AnalyticPlus3D<T,T> NewVel( Calc_Temp1 , Calc_Temp2);

    SuperLatticeFfromAnalyticalF3D< T, DESCRIPTOR> NewVelToLattice(NewVel, lattice3);

    SuperLatticePhysVelocity3D<T, DESCRIPTOR> velocity( lattice3, converter );
    //


    I hope I can create a new velocity field by doing some algebraic calulation with two velocities from two lattice by x,y,z components separately and store it to new lattice3 . But AnalyticalF didn’t works. There are no velocity values in lattice3.

    In addition, as you mentioned that “transform it first to an analytical functor and then apply the algebraic operations. Afterwards transform the functor back to a lattice functor” so that I can write it with VTK. Do I have to translate a analytical functor into lattice before I write it to VTK? Because I may have some field results calcuated by analytical functors and then write to VTK files. If that , I need a lattice for every analytical result? That will be a lot of lattices. lol

    Thank you again for your patience.

    yours sincerely
    steed188

    #2633
    albert.mink
    Moderator

    Hi steed188,

    respect for digging in OpenLB. So far you got realy deep 😉
    I would like to see much more people doing so.

    First, pay attention to the dimensions.
    SuperLatticePhysVelocity3D maps from R^3 -> R^3
    AnalyticalConst3D maps from R^3 -> R^1

    However, to get a three dimensional Image, OpenLB overloads the constructor by:
    —-
    AnalyticalConst3D<T,T> Number2( T( 1. ),T( 1. ),T( 1. ) ); // will map from R^3 -> R^3
    —-

    Second, I think OpenLB does not offer a functor to only manipulate a single component of a vector. We are not aware of any application for this operation. Fortunately, it is more of less easy to implement such a functor.

    Third, OpenLB requires a lattice functor for writing simulation data to VTK format. You definitely can not store analytical functors. Usually, those mulitplication or other arithmetic operations of velocity fields are done by post processing tools, see ParaView filter CALCULATOR. However, if the result is needed at simulation time, there is perhaps no need to write the data to file system.

    Third, I do not get the point of several lattices. I am used to have a lattice for a flow field. So as long as you stay with single phase flows, there is no need to deal with several lattices. What is your point?

    Best regards,
    Albert

    #2634
    steed188
    Participant

    Dear albert.min-k,

    Thank you for your focus.
    I apologized for my poor English. 🙁

    First, do you mean that I should modify the code like below as you mentioned the “dimension”


    AnalyticalFfromSuperF3D<T> AnalVel1( Velocity1, true, 1 );
    AnalyticalConst3D<T,T> Number1( T( 1.- 1./5. ), T ( 1.- 1./5. ), T ( 1.- 1./5. ));
    AnalyticalIdentity3D<T,T> Calc_Temp1( AnalVel1 * Number1);



    Secondly, I mean that after I get a new velocity named NewVel by


    AnalyticalIdentity3D<T,T> Calc_Temp1( AnalVel1 * Number1);
    AnalyticalIdentity3D<T,T> Calc_Temp2( AnalVel2 * Number2);
    AnalyticPlus3D<T, T> NewVel( Calc_Temp1 , Calc_Temp2);



    Did I do get a new kind of velocity named “NewVel” of the whole field?
    Then how should I do to put back it to the lattice so that I can write it to VTK? It seems that I can not write “NewVel” to VTK files just by doing as belows


    SuperLatticeFfromAnalyticalF3D< T, DESCRIPTOR> NewVelToLattice(NewVel, lattice3);
    SuperLatticePhysVelocity3D<T, DESCRIPTOR> New_Velocity( lattice3, converter );
    vtmWriter.addFunctor( New_Velocity );
    ……


    Would you mind giving an example or some codes that can teach me put it back to lattice and write it to VTK? As I could not find a similar example from the official tutorial.

    Thirdly, what I mean by several lattices is like this:
    I’m working on turbulence, in this field, I need to calculate several kinds of velocity indexes to continue my research, for example time average velocity, Reynolds stress velocity and so on. They are different kinds of velocities that calculated based on instantaneous velocity. After I calculated them by AnalyticalF I need to store them every time step and write to VTK. Do I need to store them in different lattice so that they won’t be covered by each other?
    If I calculate them during post processing, I have to store every time steps‘ data, that would be a huge data to process. So I want to calculate them during every collisionAndStream period and just store the very time step that I need.

    Again, thank you for your patience.

    Yours steed188

    #2635
    albert.mink
    Moderator

    I implemented some basic application to cylinder2d from OpenLBv1.1


    if ( iT == 0 ) {
    // Writes the geometry, cuboid no. and rank no. as vti file for visualization
    SuperLatticeGeometry2D<T, DESCRIPTOR> geometry( sLattice, superGeometry );
    SuperLatticeCuboid2D<T, DESCRIPTOR> cuboid( sLattice );
    SuperLatticeRank2D<T, DESCRIPTOR> rank( sLattice );
    vtmWriter.write( geometry );
    vtmWriter.write( cuboid );
    vtmWriter.write( rank );

    vtmWriter.createMasterFile();

    // steed188
    AnalyticalConst2D<double,double> constTwo( 2.0 );
    AnalyticalConst2D<double,double> constOne( 1);
    AnalyticalIdentity2D<double,double> TwoMinusOne(constTwo-constOne);

    SuperLatticeFfromAnalyticalF2D<double,DESCRIPTOR> TwoMinusOne_lattice( TwoMinusOne,sLattice,superGeometry );
    vtmWriter.write( TwoMinusOne_lattice );
    }

    // Writes the vtk files
    if ( iT%vtkIter == 0 && iT > 0 ) {
    vtmWriter.write( iT );

    SuperEuklidNorm2D<T, DESCRIPTOR> normVel( velocity );
    BlockLatticeReduction2D<T, DESCRIPTOR> planeReduction( normVel );
    BlockGifWriter<T> gifWriter;
    //gifWriter.write(planeReduction, 0, 0.7, iT, “vel”); //static scale
    gifWriter.write( planeReduction, iT, “vel” ); // scaled

    // steed188
    SuperLatticePhysVelocity2D<T, DESCRIPTOR> velocity_lattice( sLattice, converter );
    AnalyticalConst2D<double,double> constThree( 3.0 );
    SuperLatticeFfromAnalyticalF2D<double,DESCRIPTOR> constThree_lattice( constThree,sLattice,superGeometry );
    SuperIdentity2D<double,double> velocityTimesConstThree(velocity_lattice*constThree_lattice);
    vtmWriter.write( velocityTimesConstThree, iT );

    }

    —-

    #2636
    steed188
    Participant

    Dear albert.mink,
    Thank you for your example that I learned much from it. But I have still some problems.

    1. how can I assign a AnalyticalF with another? I did like below, but it went wrong.

    Code:
    AnalyticalIdentity3D<T,T> * aMeanVelocity; //define an empty AnalyticalF
    AnalyticalIdentity3D<T,T> Calc_Temp1( ……);
    AnalyticalIdentity3D<T,T> Calc_Temp2( ……);
    aMeanVelocity = new AnalyticPlus3D<T,T>( Calc_Temp1 , Calc_Temp2); //assign the AnalyticalF

    It seems that I could not simply assign it using AnalyticalF_A=AnalyticalF_B

    2. As I calculated a new kind of velocity, how can I write it to the same VTK file that the normal velocity is also written. Because they have the same variation name in VTK files causing error.
    I did like below.

    Code:
    SuperLatticePhysVelocity3D<T, DESCRIPTOR> velocity( sLattice, converter ); //ordinary velocity like other cases
    SuperLatticeFfromAnalyticalF3D<T,DESCRIPTOR> MeanVel( aMeanVelocity,sLattice,superGeometry ); //new kind of mean velocity calculated from AnalyticalF
    vtmWriter.addFunctor( velocity ); //write this time’s instantaneous velocity to VTK
    vtmWriter.addFunctor( MeanVel ); //write mean velocity to VTK
    vtmWriter.write( iT );

    It Seems wrong? how can I write two velocity into one VTK file ? Because they own the same name when written to VTK.

    Thank you

    steed188

    #2637
    mathias
    Keymaster

    Dear steed188,

    You could come to the next spring school in March 2018 and discuss with us about your problems or we start a common project. Please, contact me!

    Best
    Mathias

    #2639
    steed188
    Participant

    Dear mathias,
    Yeah, I’m discussing with my professor to attend next years’s spring school these days for I have a lot of things to learn and discuss.

    But before that , would you mind helping me that how to assign one AnalyticalF or SuperLatticeF with another?
    for example,

    SuperIdentity3D<T,T> * sFunctor1 ;
    SuperIdentity3D<T,T> sFunctor2(……) ;

    How should I operate that can meke sFunctor1=sFunctor2?

    Thank you.

    with best wishes,

    #2684
    steed188
    Participant

    I maybe found the problem.
    It seems that the SuperData3d can store data correctly. And I could catch cell data after I convert it into SuperDataF3D. But if I used vtmWriter.addFunctor to write the SuperDataF3D it went wrong.

    Is wright to write SuperDataF3D to vtk files? Or should I convert it to other functors?

    with best wishes,
    steed188

    #2687
    mathias
    Keymaster

    It should work, if you find where it comes from, please, let us know!

    #2688
    steed188
    Participant

    I got the problem.

    I mistakenly put the indicator Functor to create the whole simulation field “IndicatorCuboid3D<T> extendedDomain” before the main function. It means the IndicatorCuboid3D did not included in any functions but seemed as a global definition.

    The mistake made simulation processed no fault and the results are correct but led to the fault in dealing with superdata3d.

    But in my vtk files written from SuperDataF, the data of borders of Cuboids are missing. Does SuperData will deal with overlap data by itself? Or should I do some operation to catch overlap data myself?

    #2689
    mathias
    Keymaster

    You need to check yourself. This is too detailed know. If you need further support, please contact me by e-mail.

    Best
    Mathias

Viewing 15 posts - 1 through 15 (of 15 total)
  • You must be logged in to reply to this topic.