Question #657790 on Yade changed:
https://answers.launchpad.net/yade/+question/657790

    Status: Open => Answered

Chevremont William proposed the following answer:
Hi,

This material has been created to create a potential between two spheres
(only work on spheres for instance). It's already usable as is, but to
enable long range interaction between particles, you have to increase
aabbEnlargeFactor and interactionDetectionFactor.

It implements the DLVO potential.

Here is a test file that plot the potential between the two spheres:

#!/usr/local/bin/yade-trunk -x
# -*- coding: utf-8 -*-
# encoding: utf-8


from yade import plot
import math

# ElectrostaticMat
mat = O.materials.append(ElectrostaticMat(density=1000,young=1e7,poisson=0.3))

# add two spheres
O.bodies.append([
        sphere(center=(0,0,0),radius=6e-6,material=mat,fixed=True),
        sphere(center=(1.3e-5,0,0),radius=6e-6,material=mat, fixed=True)]);

electro_interaction = Law2_ScGeom_ElectrostaticPhys();
#[Bo1_Box_Aabb(),Bo1_Sphere_Aabb(),Bo1_Facet_Aabb(),Bo1_Wall_Aabb()]
# Set engines
O.engines=[ForceResetter(),
           InsertionSortCollider([Bo1_Sphere_Aabb(aabbEnlargeFactor=10)]),
           
InteractionLoop([Ig2_Sphere_Sphere_ScGeom(interactionDetectionFactor=10)],
                           
[Ip2_ElectrostaticMat_ElectrostaticMat_ElectrostaticPhys(DebyeLength=1e-7,Z=5e-12,A=1e-19)],
                           [electro_interaction]),
           NewtonIntegrator(damping=0.2, gravity=(0,0,0)),
           PyRunner(command='upGraph()',iterPeriod=1000)]


O.dt=1e-5;

O.saveTmp();

O.bodies[1].state.vel = (-1e-7,0,0);

#plot.plots={'d':('F0','F1','F2'), 't': ('d')}
plot.plots={'d':('F0')}
plot.plot();

def upGraph():
        p1 = O.bodies[0].state.pos
        p2 = O.bodies[1].state.pos
        
        dist = math.sqrt((p1[0]-p2[0])**2 + (p1[1]-p2[1])**2 + 
(p1[2]-p2[2])**2) - O.bodies[0].shape.radius - O.bodies[1].shape.radius
        
        plot.addData(
                d=dist/6e-6,
                F0=O.forces.f(1)[0],
                F1=O.forces.f(1)[1],
                F2=O.forces.f(1)[2],
                t=O.time);
        
        if O.forces.f(1)[0] < -1.e-10:
                O.bodies[1].state.pos = (1.2e-5,0,0);
                
        if O.forces.f(1)[0] > 0.:
                O.dt = 5e-7;
        
        if dist/6e-6 < -0.01:
               O.stopAtIter = O.iter +1

-- 
You received this question notification because your team yade-users is
an answer contact for Yade.

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

Reply via email to