← Back to team overview

yade-dev team mailing list archive

Re: (moved to yade-dev) Interaction of FrictMat and a new class of material

 

Hi,

I did not read the whole thread, but in general, one has to use DECLARE_FUNCTOR_ORDER so that goReverse is ever used.

Ig2_ functors never call goReverse, since the contact is reordered (swapped) in InteractionLoop so that it has geometries in the order handled by the functor; but DECLARE_FUNCTOR_ORDER is precisely needed so that the order can be queried.

IIRC Ip2_ functors with DECLARE_FUNCTOR_ORDER will call goReverse if needed, and goReverse would usually just call go(...) with swapped arguments.

Dispatching (both the implementation, and the logic as such) has its flaws (as I discovered recently in some corner cases), and one of my long-term ideas for Woo is to re-write it from scratch (using also c++11 templates, which may make it much shorter), but that is a different story which might as well never materialize. OTOH it works quite reliably and efficiently in usual cases, which is excellent.

Cheers, Václav


Hi Bruno,

I expected that materials in Ip2_... would be already ordered, but they are not. I didn't have time to study why. Most likely there is some better way to do it, I just gave a working solution for Behzad's urgent question..

I checked goReverse some days ago and if I remember correctly, it is used only in Ig2 functors.

Behzad's situation (combining two different materials) is not very common in Yade. I used something for combining FrictMat and CpmMat into FrictPhys, but CpmMat is considered there as its base, FrictMat, so as a result two FrictMats are combined. Maybe it would be good to investigate the problem more in detail and at least for future occurrences propose more clean way.

cheers
Jan



2015-02-21 14:15 GMT+01:00 Bruno Chareyre <bruno.chareyre@xxxxxxxxxxxxxxx <mailto:bruno.chareyre@xxxxxxxxxxxxxxx>>:

    Hi Jan,
    Do you think that goReverse cannot solve the problem? I would
    expect that your typechecking is already done by dispatcher. Is
    goReverse called in one of the cases?
    I'm asking that because I'm not really sure if goReverse works as
    expected. If not we better remove it.
    Cheers.
    Bruno

    On Saturday, February 21, 2015 00:21 CET, Jan Stránský
    <question261724@xxxxxxxxxxxxxxxxxxxxx
    <mailto:question261724@xxxxxxxxxxxxxxxxxxxxx>> wrote:

    > Question #261724 on Yade changed:
    > https://answers.launchpad.net/yade/+question/261724
    >
    > Jan Stránský proposed the following answer:
    > >
    > >
    > > Look, I don't get what you're doing by:
    > >
    > >
    > > if 0: # works for both 0 and 1
    > > s1=utils.sphere([0.0,0.0,0.0],0.01,fixed=True,material=Mat2)

    > > s2=utils.sphere([0.0,0.0,2.0e-2],0.01,fixed=False,material=Mat1)
    > > else:
    > > s1=utils.sphere([0.0,0.0,0.0],0.01,fixed=True,material=Mat1)

    > > s2=utils.sphere([0.0,0.0,2.0e-2],0.01,fixed=False,material=Mat2)
    > >
    > >
    > > But if you run the file with
    > >
    > > s1=utils.sphere([0.0,0.0,0.0],0.01,fixed=True,material=Mat2)

    > > s2=utils.sphere([0.0,0.0,2.0e-2],0.01,fixed=False,material=Mat1)
    > >
    > >
    > > it works!
    > > And if you change it to:
    > >
    > > s1=utils.sphere([0.0,0.0,0.0],0.01,fixed=True,material=Mat1)

    > > s2=utils.sphere([0.0,0.0,2.0e-2],0.01,fixed=False,material=Mat2)
    > >
    > > It does not!
    > >
    >
    > my if else is just putting your two version of s1= s2= to one
    file for easy
    > change of them
    >
    > sorry, it does not work for your original files, I tried some
    modifications
    > and it was the effect of undo/redo that I had the impression.
    >
    > I you modify your .cpp file, specifically
    >
    >   FrictMat* mat1 = YADE_CAST<FrictMat*>(b1.get());
    >   CohBurgersMat* mat2 = YADE_CAST<CohBurgersMat*>(b2.get());
    >
    > to
    >
    >   int i1 = b1->getClassIndex(); // get actual material index of b1

    >   int i2 = b2->getClassIndex(); // get actual material index of b2

    >   int cbmi = CohBurgersMat::getClassIndexStatic();  // get index of
    > CohBurgersMat
    >   FrictMat* mat1;
    >   CohBurgersMat* mat2;
    >   if (i2 == cbmi) { // b2 is CohburgersMat and b1 is FrictMat
    >   mat1 = dynamic_cast<FrictMat*>(b1.get());
    >   mat2 = dynamic_cast<CohBurgersMat*>(b2.get());
    >   } else if (i1 == cbmi) { // b1 is CohburgersMat and b2 is FrictMat
    >   mat1 = dynamic_cast<FrictMat*>(b2.get());
    >   mat2 = dynamic_cast<CohBurgersMat*>(b1.get());
    >   } else { // should not happen, but to be sure..
    >   LOG_FATAL("TODO");
    >   }
    >
    > it should work. If not, let me know.
    > Basically you check the types of material instances and switch
    materials if
    > needed
    > Cheers
    > Jan
    >
    > --
    > You received this question notification because you are a member of
    > yade-users, which is an answer contact for Yade.
    >
    > _______________________________________________
    > Mailing list: https://launchpad.net/~yade-users
    <https://launchpad.net/%7Eyade-users>
    > Post to     : yade-users@xxxxxxxxxxxxxxxxxxx
    <mailto:yade-users@xxxxxxxxxxxxxxxxxxx>
    > Unsubscribe : https://launchpad.net/~yade-users
    <https://launchpad.net/%7Eyade-users>
    > More help   : https://help.launchpad.net/ListHelp








    _______________________________________________
    Mailing list: https://launchpad.net/~yade-dev
    <https://launchpad.net/%7Eyade-dev>
    Post to     : yade-dev@xxxxxxxxxxxxxxxxxxx
    <mailto:yade-dev@xxxxxxxxxxxxxxxxxxx>
    Unsubscribe : https://launchpad.net/~yade-dev
    <https://launchpad.net/%7Eyade-dev>
    More help   : https://help.launchpad.net/ListHelp




_______________________________________________
Mailing list: https://launchpad.net/~yade-dev
Post to     : yade-dev@xxxxxxxxxxxxxxxxxxx
Unsubscribe : https://launchpad.net/~yade-dev
More help   : https://help.launchpad.net/ListHelp

References