def run(nranks):
    u = mir.Mirheo(nranks,
                   snapshot='snapshot',
                   debug_level=3,
                   log_filename='log',
                   no_splash=True)
    u.run(402)
Exemple #2
0
def run(args):
    """The `mirheo run` command.

    Usage:
        run [--ranks NX NY NZ]
            ([--num-timesteps NUM]|[--num-timesteps-attr ATTR_NAME])
            snapshot_path
    """
    if bool(args.num_timesteps is not None) == bool(args.num_timesteps_attr):
        raise ValueError(
            "Exactly one of --num-timesteps and --num-timesteps-attr must be set."
        )

    u = mirheo.Mirheo(args.ranks,
                      snapshot=args.snapshot,
                      debug_level=3,
                      log_filename='log')
    if args.num_timesteps_attr:
        num_timesteps = int(u.getAttribute(args.num_timesteps_attr))
    else:
        num_timesteps = args.num_timesteps

    u.run(num_timesteps)

    if args.final_snapshot:
        u.saveSnapshot(args.final_snapshot)
Exemple #3
0
def run(niter, statsFname, comm_address):
    dt = 0.001

    ranks = (2, 1, 1)
    domain = (12, 8, 10)

    u = mir.Mirheo(ranks,
                   domain,
                   debug_level=8,
                   log_filename='log',
                   comm_ptr=comm_address)

    pv = mir.ParticleVectors.ParticleVector('pv', mass=1)
    ic = mir.InitialConditions.Uniform(number_density=2)
    u.registerParticleVector(pv=pv, ic=ic)

    dpd = mir.Interactions.Pairwise('dpd',
                                    rc=1.0,
                                    kind="DPD",
                                    a=10.0,
                                    gamma=10.0,
                                    kBT=1.0,
                                    power=0.5)
    u.registerInteraction(dpd)
    u.setInteraction(dpd, pv, pv)

    vv = mir.Integrators.VelocityVerlet('vv')
    u.registerIntegrator(vv)
    u.setIntegrator(vv, pv)

    u.registerPlugins(mir.Plugins.createStats('stats', statsFname, 1000))

    u.run(niter, dt=dt)
Exemple #4
0
def create_ellipsoid(density, axes, niter):
    import mirheo as mir

    def recenter(coords, com):
        coords = [[r[0] - com[0], r[1] - com[1], r[2] - com[2]]
                  for r in coords]
        return coords

    dt = 0.001
    axes = tuple(axes)

    ranks = (1, 1, 1)
    fact = 3
    domain = (fact * axes[0], fact * axes[1], fact * axes[2])

    u = mir.Mirheo(ranks,
                   domain,
                   debug_level=3,
                   log_filename='log',
                   no_splash=True)

    dpd = mir.Interactions.Pairwise('dpd',
                                    rc=1.0,
                                    kind="DPD",
                                    a=10.0,
                                    gamma=10.0,
                                    kBT=0.5,
                                    power=0.5)
    vv = mir.Integrators.VelocityVerlet('vv')

    coords = [[-axes[0], -axes[1], -axes[2]], [axes[0], axes[1], axes[2]]]
    com_q = [[0.5 * domain[0], 0.5 * domain[1], 0.5 * domain[2], 1., 0, 0, 0]]

    fake_oV = mir.ParticleVectors.RigidEllipsoidVector('OV',
                                                       mass=1,
                                                       object_size=len(coords),
                                                       semi_axes=axes)
    fake_ic = mir.InitialConditions.Rigid(com_q=com_q, coords=coords)
    belonging_checker = mir.BelongingCheckers.Ellipsoid("ellipsoidChecker")

    pv_ell = u.makeFrozenRigidParticles(belonging_checker,
                                        fake_oV,
                                        fake_ic, [dpd],
                                        vv,
                                        density,
                                        1.0,
                                        dt=dt,
                                        nsteps=niter)

    if pv_ell:
        frozen_coords = pv_ell.getCoordinates()
        frozen_coords = recenter(frozen_coords, com_q[0])
    else:
        frozen_coords = [[]]

    if u.isMasterTask():
        return frozen_coords
    else:
        return None
Exemple #5
0
def create_cylinder(density, R, L, niter):
    import mirheo as mir

    def recenter(coords, com):
        coords = [[r[0] - com[0], r[1] - com[1], r[2] - com[2]]
                  for r in coords]
        return coords

    dt = 0.001

    ranks = (1, 1, 1)
    fact = 3
    domain = (fact * R, fact * R, fact * L / 2)

    u = mir.Mirheo(ranks,
                   domain,
                   debug_level=3,
                   log_filename='log',
                   no_splash=True)

    dpd = mir.Interactions.Pairwise('dpd',
                                    rc=1.0,
                                    kind="DPD",
                                    a=10.0,
                                    gamma=10.0,
                                    kBT=0.5,
                                    power=0.5)
    vv = mir.Integrators.VelocityVerlet('vv')

    coords = [[-R, -R, -L / 2], [R, R, L / 2]]
    com_q = [[0.5 * domain[0], 0.5 * domain[1], 0.5 * domain[2], 1., 0, 0, 0]]

    fake_oV = mir.ParticleVectors.RigidCylinderVector('OV',
                                                      mass=1,
                                                      object_size=len(coords),
                                                      radius=R,
                                                      length=L)
    fake_ic = mir.InitialConditions.Rigid(com_q, coords)
    belonging_checker = mir.BelongingCheckers.Cylinder("checker")

    pv_cyl = u.makeFrozenRigidParticles(belonging_checker,
                                        fake_oV,
                                        fake_ic, [dpd],
                                        vv,
                                        density,
                                        1.0,
                                        dt=dt,
                                        nsteps=niter)

    if pv_cyl:
        frozen_coords = pv_cyl.getCoordinates()
        frozen_coords = recenter(frozen_coords, com_q[0])
    else:
        frozen_coords = [[]]

    if u.isMasterTask():
        return frozen_coords
    else:
        return None
def init():
    # Units. 1 == Mirheo unit.
    nm = 1
    fs = 1
    kg = 1e27
    K = 1

    m = 1e9
    s = 1e15
    J = kg * m**2 / s**2

    # Argon model and system properties.
    epsilon = 996. * J / 6.022e23
    sigma = 0.340 * nm
    mass = 39.948 * 1.66053906660e-27 * kg

    number_density = 0.6 / sigma**3
    domain = (10 * nm, 8 * nm, 6 * nm)

    u = mir.Mirheo((1, 1, 1),
                   domain,
                   dt=1.0 * fs,
                   debug_level=3,
                   log_filename='log',
                   no_splash=True,
                   units=mir.UnitConversion(1 / m, 1 / s, 1 / kg))

    pv = mir.ParticleVectors.ParticleVector('pv', mass=mass)
    ic = mir.InitialConditions.Uniform(number_density=number_density)
    u.registerParticleVector(pv, ic)

    # With the ordinary LJ the simulation would immediately blow up.
    # lj = mir.Interactions.Pairwise('lj', rc=1 * nm, kind='LJ', epsilon=epsilon, sigma=sigma)
    lj = mir.Interactions.Pairwise('lj',
                                   rc=1 * nm,
                                   kind='RepulsiveLJ',
                                   epsilon=epsilon,
                                   sigma=sigma,
                                   max_force=1e-4)
    u.registerInteraction(lj)
    u.setInteraction(lj, pv, pv)

    vv = mir.Integrators.VelocityVerlet('vv')
    u.registerIntegrator(vv)
    u.setIntegrator(vv, pv)

    u.registerPlugins(
        mir.Plugins.createBerendsenThermostat('thermostat', [pv],
                                              T=215 * K,
                                              tau=50.0 * fs))
    u.registerPlugins(mir.Plugins.createStats('stats', every=50))

    u.run(0)
    u.saveSnapshot('snapshot')
Exemple #7
0
def create_from_mesh(density, vertices, triangles, inertia, niter):

    import mirheo as mir

    def recenter(coords, com):
        coords = [[r[0]-com[0], r[1]-com[1], r[2]-com[2]] for r in coords]
        return coords

    dt = 0.001

    # bounding box
    bb_hi = np.array(vertices).max(axis=0).tolist()
    bb_lo = np.array(vertices).min(axis=0).tolist()

    mesh_size = [hi-lo for lo, hi in zip(bb_lo, bb_hi)]

    fact = 2.0
    domain = (float (int (fact * mesh_size[0] + 1) ),
              float (int (fact * mesh_size[1] + 1) ),
              float (int (fact * mesh_size[2] + 1) ))

    ranks  = (1, 1, 1)
    
    u = mir.Mirheo(ranks, domain, debug_level=3, log_filename='log', no_splash=True)
    
    dpd = mir.Interactions.Pairwise('dpd', rc=1.0, kind="DPD", a=10.0, gamma=10.0, kBT=0.5, power=0.5)
    vv = mir.Integrators.VelocityVerlet('vv')
    
    coords = [bb_lo, bb_hi]
    com_q  = [[0.5 * domain[0], 0.5 * domain[1], 0.5 * domain[2],   1., 0, 0, 0]]

    mesh = mir.ParticleVectors.Mesh(vertices, triangles)

    fake_ov = mir.ParticleVectors.RigidObjectVector('OV', mass=1, inertia=inertia, object_size=len(coords), mesh=mesh)
    fake_ic = mir.InitialConditions.Rigid(com_q=com_q, coords=coords)
    belonging_checker = mir.BelongingCheckers.Mesh("meshChecker")
    
    pvMesh = u.makeFrozenRigidParticles(belonging_checker, fake_ov, fake_ic, [dpd], vv, density, 1.0, dt=dt, nsteps=niter)

    if pvMesh:
        frozen_coords = pvMesh.getCoordinates()
        frozen_coords = recenter(frozen_coords, com_q[0])
    else:
        frozen_coords = [[]]

    if u.isMasterTask():
        return frozen_coords
    else:
        return None
Exemple #8
0
def run(args):
    """The `mirheo run` command.

    Usage:
        run [--ranks NX NY NZ]
            [--num-timesteps NUM]
            [--final-snapshot PATH]
            snapshot_path
    """
    u = mirheo.Mirheo(args.ranks, snapshot=args.snapshot, debug_level=3, log_filename='log')

    u.run(args.num_timesteps)

    if args.final_snapshot:
        u.saveSnapshot(args.final_snapshot)
Exemple #9
0
#!/usr/bin/env python

import mirheo as mir
import argparse

parser = argparse.ArgumentParser()
parser.add_argument('--ranks', type=int, nargs=3, required=True)
parser.add_argument('--save-to', type=str, required=True)
parser.add_argument('--load-from', type=str)
args = parser.parse_args()

if not args.load_from:
    u = mir.Mirheo(args.ranks,
                   domain=(4, 6, 8),
                   dt=0.1,
                   debug_level=3,
                   log_filename='log',
                   no_splash=True)

    mesh = mir.ParticleVectors.MembraneMesh('mesh_dummy1.off')
    ov = mir.ParticleVectors.MembraneVector('ov', mesh=mesh, mass=1)
    pv = ov
    ic = mir.InitialConditions.Membrane([])
    u.registerParticleVector(ov, ic)

    wall = mir.Walls.Plane('plane', (0, -1, 0), (1.0, 2.0, 3.0))
    u.registerWall(wall, check_every=123)

    u.registerPlugins(
        mir.Plugins.createStats('stats', every=10, filename='stats'))
    u.registerPlugins(
Exemple #10
0
parser = argparse.ArgumentParser()
parser.add_argument('--vis', action='store_true', default=False)
parser.add_argument('--restart', action='store_true', default=False)
parser.add_argument("--ranks", type=int, nargs=3, default=[1, 1, 1])
args = parser.parse_args()

dt = 0.001
t_end = 2.5 + dt  # time for one restart batch

ranks = args.ranks
domain = (8, 8, 8)

u = mir.Mirheo(ranks,
               domain,
               dt,
               debug_level=3,
               log_filename='log',
               checkpoint_every=int(0.5 / dt),
               no_splash=True)

nparts = 1000
np.random.seed(42)
pos = np.random.normal(loc=[0.5, 0.5 * domain[1] + 1.0, 0.5 * domain[2]],
                       scale=[0.1, 0.3, 0.3],
                       size=(nparts, 3))

vel = np.random.normal(loc=[1.0, 0., 0.],
                       scale=[0.1, 0.01, 0.01],
                       size=(nparts, 3))

pvSolvent = mir.ParticleVectors.ParticleVector('pv', mass=1)
Exemple #11
0
def main():
    # Units. 1 == Mirheo unit.
    nm = 1
    fs = 1
    kg = 1e27
    K = 1

    m = 1e9 * nm
    s = 1e15 * fs
    J = kg * m**2 / s**2

    # Argon and system properties.
    epsilon = 996. * J / 6.022e23
    sigma = 0.340 * nm
    mass = 39.948 * 1.66053906660e-27 * kg
    kB = 1.380649e-23 * J / K

    max_displacement = 0.005 * nm
    number_density = 0.1 / sigma**3  # Use very small density for testing.
    domain = (12 * nm, 10 * nm, 8 * nm)

    u = mir.Mirheo((1, 1, 1),
                   domain,
                   debug_level=3,
                   log_filename='log',
                   no_splash=True)

    pv = mir.ParticleVectors.ParticleVector('pv', mass=mass)
    ic = mir.InitialConditions.Uniform(number_density=number_density)
    u.registerParticleVector(pv, ic)

    lj = mir.Interactions.Pairwise('lj',
                                   rc=1 * nm,
                                   kind='LJ',
                                   epsilon=epsilon,
                                   sigma=sigma)
    u.registerInteraction(lj)
    u.setInteraction(lj, pv, pv)

    ##############################
    # Stage 1.
    ##############################
    int_min = mir.Integrators.Minimize('minimize',
                                       max_displacement=max_displacement)
    u.registerIntegrator(int_min)
    u.setIntegrator(int_min, pv)

    # Measure forces, they should decrease over time.
    plugin_force_saver = mir.Plugins.createForceSaver('forceSaver', pv)
    plugin_dump = mir.Plugins.createDumpParticles('meshdump', pv, 200,
                                                  ['forces'], 'h5/pv-')
    u.registerPlugins(plugin_force_saver)
    u.registerPlugins(plugin_dump)
    u.run(1001, dt=0.01 * fs)

    u.deregisterPlugins(plugin_dump)
    u.deregisterPlugins(plugin_force_saver)
    u.deregisterIntegrator(int_min)
    del plugin_dump
    del plugin_force_saver

    ##############################
    # Stage 2.
    ##############################
    int_vv = mir.Integrators.VelocityVerlet('vv')
    u.registerIntegrator(int_vv)
    u.setIntegrator(int_vv, pv)

    # Measure temperature, it should approach the reference temperature.
    u.registerPlugins(
        mir.Plugins.createBerendsenThermostat('thermostat', [pv],
                                              kBT=215 * K * kB,
                                              tau=50.0 * fs))
    u.registerPlugins(
        mir.Plugins.createStats('stats', every=50, filename='stats.csv'))
    u.run(500, dt=1 * fs)

    ##############################
    # Stage 3.
    ##############################
    u.run(200, dt=5 * fs)

    if MPI.COMM_WORLD.rank == 0:
        print("log(force) during minimization", file=sys.stderr)
        for i in range(5):
            forces = get_h5_forces('h5/pv-{:05}.h5'.format(i))
            forces = np.sqrt(forces[:, 0]**2 + forces[:, 1]**2 +
                             forces[:, 2]**2)
            forces = np.sum(forces)
            # Using log because nTEST has a tolerance of 0.1.
            print(i, np.log(forces + 1e-9) * 100, file=sys.stderr)

        # This could be done with pandas, but better to avoid importing it.
        print("temperature during equilibration and the run", file=sys.stderr)
        with open('stats.csv', 'r') as f:
            header = f.readline().split(',')
            assert header[0:2] == ['time', 'kBT']
            mat = np.loadtxt(f, delimiter=',', usecols=(0, 1))
            mat[:, 1] /= kB
            for row in mat:
                print(*row, file=sys.stderr)
Exemple #12
0
#!/usr/bin/env python

import mirheo as mir

dt = 0.001

ranks  = (1, 1, 1)
domain = (12, 8, 10)

rc = 1.0
density = 8

u = mir.Mirheo(ranks, domain, no_splash=True, debug_level=0, log_filename='stdout')

pv = mir.ParticleVectors.ParticleVector('pv', mass = 1)
ic = mir.InitialConditions.Uniform(density)
u.registerParticleVector(pv, ic)

dpd = mir.Interactions.Pairwise('dpd', rc, kind="DPD", a=10.0, gamma=10.0, kBT=1.0, power=0.5)
u.registerInteraction(dpd)
u.setInteraction(dpd, pv, pv)

vv = mir.Integrators.VelocityVerlet('vv')
u.registerIntegrator(vv)
u.setIntegrator(vv, pv)

u.run(50, dt=dt)

# TEST: log.silent
# cd log
# mir.run --runargs "-n 2" ./silent.py > log.out.txt
Exemple #13
0
parser = argparse.ArgumentParser()
parser.add_argument("--restart", action='store_true', default=False)
parser.add_argument("--ranks", type=int, nargs=3)
args = parser.parse_args()

ranks = args.ranks
domain = (4, 6, 8)
dt = 0

comm = MPI.COMM_WORLD

u = mir.Mirheo(ranks,
               domain,
               comm_ptr=MPI._addressof(comm),
               debug_level=3,
               log_filename='log',
               no_splash=True,
               checkpoint_every=(0 if args.restart else 5))

pv = mir.ParticleVectors.ParticleVector('pv', mass=1)

if args.restart:
    ic = mir.InitialConditions.Restart("restart/")
else:
    ic = mir.InitialConditions.Uniform(number_density=2)

u.registerParticleVector(pv, ic)

u.run(7, dt=dt)
Exemple #14
0
    sys.exit()

ureg = pint.UnitRegistry()
ureg.define('myL = 0.5 um')
ureg.define('myT = 0.25 us')
ureg.define('myM = 0.125 ug')

# Set global unit registry for all Mirheo functions.
mir.set_unit_registry(ureg, 'myL', 'myT', 'myM')

# Test the unit conversion (not all arguments are probably dimensionalized below).
domain = (10 * ureg.um, 15 * ureg.um, 20 * ureg.um)
dt = 123 * ureg.us
u = mir.Mirheo((1, 1, 1),
               domain,
               dt,
               debug_level=3,
               log_filename='log',
               no_splash=True)

pv = mir.ParticleVectors.ParticleVector('pv', mass=1e-9 * ureg.kg)
ic = mir.InitialConditions.Uniform(number_density=2 * ureg.um**-3)
u.registerParticleVector(pv, ic)

kBT = ureg('1.125 um**2 * ug / us**2')
dpd = mir.Interactions.Pairwise('dpd',
                                rc=1.0 * ureg.um,
                                kind='DPD',
                                a=10.0,
                                gamma=10.0,
                                kBT=kBT,
                                power=0.5)
Exemple #15
0
#!/usr/bin/env python

"""Test checkpoint-like periodic snapshots.

We test that there are that many folders and that the currentStep changes.
"""

import mirheo as mir

u = mir.Mirheo(nranks=(1, 1, 1), domain=(4, 6, 8), dt=0.125, debug_level=3,
               log_filename='log', no_splash=True,
               checkpoint_every=10, checkpoint_mode='Incremental',
               checkpoint_folder='periodic_snapshots/snapshot_', checkpoint_mechanism='Snapshot')

pv = mir.ParticleVectors.ParticleVector('pv', mass=1)
ic = mir.InitialConditions.Uniform(number_density=2)
u.registerParticleVector(pv, ic)

dpd = mir.Interactions.Pairwise('dpd', rc=1.0, kind='DPD', a=10.0, gamma=10.0, kBT=1.0, power=0.5)
lj = mir.Interactions.Pairwise('lj', rc=1.0, kind='LJ', epsilon=1.25, sigma=0.75)

u.registerInteraction(dpd)
u.registerInteraction(lj)
u.setInteraction(dpd, pv, pv)

minimize = mir.Integrators.Minimize('minimize', max_displacement=1. / 1024)
u.registerIntegrator(minimize)
u.run(45)

# TEST: snapshot.periodic
# cd snapshot
Exemple #16
0
parser.add_argument('--axes',       type=float, nargs=3)
parser.add_argument('--coords',     type=str)
parser.add_argument("--restart", action='store_true', default=False)
parser.add_argument("--ranks", type=int, nargs=3, default=(1,1,1))
args = parser.parse_args()

dt   = 0.001
axes = tuple(args.axes)
a    = 0.5
density = args.density

domain = (16, 8, 8)

nsteps = 5000

u = mir.Mirheo(args.ranks, domain, debug_level=3, log_filename='log', no_splash=True,
               checkpoint_every = (0 if args.restart else nsteps))

pv_sol = mir.ParticleVectors.ParticleVector('solvent', mass = 1)
ic_sol = mir.InitialConditions.Uniform(density)

dpd = mir.Interactions.Pairwise('dpd', rc=1.0, kind="DPD", a=10.0, gamma=10.0, kBT=0.01, power=0.5)
cnt = mir.Interactions.Pairwise('cnt', rc=1.0, kind="RepulsiveLJ", epsilon=0.28, sigma=0.8, max_force=400.0)
vv = mir.Integrators.VelocityVerlet_withPeriodicForce('vv', force=a, direction="x")

com_q = [[2.0, 5.0, 5.0,   1.0, np.pi/2, np.pi/3, 0.0],
         [4.0, 4.0, 5.0,   1.0, np.pi/2, np.pi/3, 0.0],
         [6.0, 3.0, 5.0,   1.0, np.pi/2, np.pi/3, 0.0]]

coords = np.loadtxt(args.coords).tolist()
pv_ell = mir.ParticleVectors.RigidEllipsoidVector('ellipsoid', mass=1, object_size=len(coords), semi_axes=axes)
ic_ell = mir.InitialConditions.Rigid(com_q=com_q, coords=coords)
Exemple #17
0
parser.add_argument("--ranks", type=int, nargs=3)
args = parser.parse_args()

ranks = args.ranks
domain = (4, 6, 8)
dt = 0

if args.restart:
    restart_folder = "restart2/"
else:
    restart_folder = "restart/"

u = mir.Mirheo(ranks,
               domain,
               dt,
               debug_level=3,
               log_filename='log',
               checkpoint_every=5,
               checkpoint_folder=restart_folder,
               no_splash=True)

pv = mir.ParticleVectors.ParticleVector('pv', mass=1)
ic = mir.InitialConditions.Uniform(number_density=2)
u.registerParticleVector(pv, ic)

dpd = mir.Interactions.Pairwise('dpd',
                                rc=1.0,
                                kind="DPD",
                                a=10.0,
                                gamma=10.0,
                                kBT=1.0,
                                power=0.5)
Exemple #18
0
#!/usr/bin/env python

import mirheo as mir

dt = 0.001

ranks = (1, 1, 1)
domain = (8, 8, 8)

u = mir.Mirheo(ranks, domain, debug_level=3, log_filename='log')

pv = mir.ParticleVectors.ParticleVector('pv', mass=1)
ic = mir.InitialConditions.Uniform(number_density=10)
u.registerParticleVector(pv, ic)

dpd = mir.Interactions.Pairwise('dpd',
                                rc=1.0,
                                kind="DPD",
                                a=10.0,
                                gamma=10.0,
                                kBT=1.0,
                                power=0.5)
u.registerInteraction(dpd)
u.setInteraction(dpd, pv, pv)

vv = mir.Integrators.VelocityVerlet('vv')
u.registerIntegrator(vv)
u.setIntegrator(vv, pv)

u.registerPlugins(mir.Plugins.createStats('stats', "stats", 200))
Exemple #19
0
#!/usr/bin/env python

import mirheo as mir
import numpy as np

density = 4
ranks = (1, 1, 1)

axes = (1.0, 2.0, 3.0)
fact = 3
domain = (fact * axes[0], fact * axes[1], fact * axes[2])

u = mir.Mirheo(ranks,
               domain,
               dt=0,
               debug_level=3,
               log_filename='log',
               no_splash=True)

coords = [[-axes[0], -axes[1], -axes[2]], [axes[0], axes[1], axes[2]]]
com_q = [[0.5 * domain[0], 0.5 * domain[1], 0.5 * domain[2], 1., 0, 0, 0]]

pv_ell = mir.ParticleVectors.RigidEllipsoidVector('ellipsoid',
                                                  mass=1,
                                                  object_size=len(coords),
                                                  semi_axes=axes)
ic_ell = mir.InitialConditions.Rigid(com_q, coords)
u.registerParticleVector(pv_ell, ic_ell)

pv_outer = mir.ParticleVectors.ParticleVector('pv_outer', mass=1.0)
ic_outer = mir.InitialConditions.Uniform(density)
Exemple #20
0
def run_one_force(comm_address, force, x0, ks):

    import mirheo as mir
    import trimesh
    toolsPath = os.path.join(this_dir, "tools")
    #print(toolsPath)
    sys.path.append(toolsPath)
    import stretchForce as stretch
    import diameters
    from rbc_params import set_rbc_params
    from rbc_params import print_rbc_params

    def original_diameter(mesh):
        pos = np.array(mesh.vertices, copy=True)
        (D0, D1) = diameters.computeDiameters(pos)
        return 0.5 * (D0 + D1)

    tend = 50.0
    dt = 0.001

    mesh = trimesh.load_mesh(mesh_fname)

    safety = 3
    box_lo = np.amin(mesh.vertices, axis=0)
    box_hi = np.amax(mesh.vertices, axis=0)

    domain = (box_hi - box_lo) * safety + np.ones(3)
    domain = tuple(np.array(domain, dtype=int))
    ranks = (1, 1, 1)

    u = mir.Mirheo(ranks,
                   domain,
                   dt,
                   debug_level=0,
                   log_filename='stderr',
                   comm_ptr=comm_address,
                   no_splash=True)

    mesh_rbc = mir.ParticleVectors.MembraneMesh(mesh.vertices.tolist(),
                                                mesh.faces.tolist())
    pv_rbc = mir.ParticleVectors.MembraneVector("rbc", mass=1.0, mesh=mesh_rbc)
    ic_rbc = mir.InitialConditions.Membrane([[
        domain[0] * 0.5, domain[1] * 0.5, domain[2] * 0.5, 1.0, 0.0, 0.0, 0.0
    ]])
    u.registerParticleVector(pv_rbc, ic_rbc)

    # mu_ph = 2.5 # [micro N / m]
    force_scale = 0.025  # [pN]
    force = force / force_scale
    D0 = original_diameter(mesh)
    D0_ph = 7.739  # [micro m]

    prms_rbc = set_rbc_params(mesh, x0, ks)
    prms_rbc["gammaT"] = 1.0  # for killing oscillations

    int_rbc = mir.Interactions.MembraneForces("int_rbc",
                                              **prms_rbc,
                                              stress_free=True)
    vv = mir.Integrators.VelocityVerlet('vv')
    u.registerIntegrator(vv)
    u.setIntegrator(vv, pv_rbc)
    u.registerInteraction(int_rbc)
    u.setInteraction(int_rbc, pv_rbc, pv_rbc)

    fraction = 0.05 * 2
    n = int(len(mesh.vertices) * fraction)
    force = force / (0.5 * n)

    forces = stretch.computeForces(mesh.vertices, fraction, force).tolist()

    u.registerPlugins(
        mir.Plugins.createMembraneExtraForce("stretchForce", pv_rbc, forces))
    u.registerPlugins(mir.Plugins.createStats('stats', "stats.txt", 1000))

    u.run(int(tend / dt))

    Dshort = 0
    Dlong = 0

    if u.isMasterTask():
        rbc_pos = pv_rbc.getCoordinates()
        (Dlong, Dshort) = diameters.computeDiameters(rbc_pos)

        # make it dimensional again
        Dlong = (Dlong / D0) * D0_ph
        Dshort = (Dshort / D0) * D0_ph

    del u
    del vv
    del int_rbc
    del prms_rbc
    del mesh_rbc
    del pv_rbc
    del ic_rbc
    return Dshort, Dlong
Exemple #21
0
#!/usr/bin/env python

import mirheo as mir

ranks  = (1, 1, 1)
domain = [4.0, 5.0, 6.0]

dt = 100.0 # large dt to force the particles to go too far

u = mir.Mirheo(ranks, tuple(domain), dt, debug_level=3, log_filename='log', no_splash=True)

pv = mir.ParticleVectors.ParticleVector('pv', mass = 1)

pos = [[a*domain[0], a*domain[1], a*domain[2]] for a in [0.1, 0.5, 0.8]]
v=[1., 2., 3.]
vel = [[a*v[0], a*v[1], a*v[2]] for a in [0.0, 0.0, 1.0]] # only one particle will go out of bounds

ic = mir.InitialConditions.FromArray(pos, vel)
u.registerParticleVector(pv, ic)

vv = mir.Integrators.VelocityVerlet('vv')
u.registerIntegrator(vv)
u.setIntegrator(vv, pv)

check_every = 1
u.registerPlugins(mir.Plugins.createParticleChecker('checker', check_every))

u.run(2)


# TEST: plugins.particle_check.bounds
Exemple #22
0
def run(comm_address,
        gammaC,
        NDATA,
        TEND,
        kT_s,
        T_p,
        etao_p,
        etai_p,
        mu_p,
        Ka_p,
        kb_p,
        area_p,
        volume_p,
        verbose,
        dryrun,
        ini_mesh_fname,
        ref_mesh_fname,
        ply_dir='ply/'):

    import trimesh
    import numpy as np
    from pint import UnitRegistry

    import mirheo as mir
    import dpdParams as D
    import rbcParams as R

    logfile = open(ply_dir + "config.txt", "a")

    ureg = UnitRegistry()

    def effective_radius_from_area(A):
        return np.sqrt(A / (4.0 * np.pi))

    @ureg.wraps(None, ureg.dimensionless)
    def to_sim(a):
        return a

    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    # Physical values (_p), in SI units
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    A_p = area_p * ureg.m**2
    V_p = volume_p * ureg.m**3
    R_p = effective_radius_from_area(A_p)

    mu_p = mu_p * ureg.N / ureg.m
    Ka_p = Ka_p * ureg.N / ureg.m
    kb_p = kb_p * ureg.J

    kB_p = constants.get('kBoltz') * ureg.J / ureg.K
    T_p = T_p * ureg.K
    kT_p = kB_p * T_p

    Gka_p = constants.get('Gka') * ureg.J / ureg.m**2
    Gkv_p = constants.get('Gkv') * ureg.J / ureg.m**3
    a3 = constants.get('a3')
    a4 = constants.get('a4')
    b1 = constants.get('b1')
    b2 = constants.get('b2')

    rho_p = constants.get('rho') * ureg.kg / ureg.m**3
    etai_p = etai_p * ureg.Pa * ureg.s
    etao_p = etao_p * ureg.Pa * ureg.s

    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    # Non-dimensional numbers:
    #
    # FvK_p   : Foeppl-von-Karman number in healthy cells
    # fKa_p   : Ka / mu
    # lm_p    : ratio between inner and outer viscosity
    # FGKa_p  : dimensionless area constraint coefficient
    # FGKv_p  : dimensionless volume constraint coefficient
    # Ftherm  : ratio between bending modulus and thermal energy
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    FvK_p = mu_p * R_p * R_p / kb_p
    fKa_p = Ka_p / mu_p
    FGKa_p = Gka_p * R_p**2 / kb_p
    FGKv_p = Gkv_p * R_p**3 / kb_p
    Ftherm = kb_p / kT_p
    lm_p = etai_p / etao_p

    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    # Simulation (_s)
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    # Simulation length of rbc
    suggested_radius = constants.get('R0')

    # Scale initial mesh to suggested radius
    ini = trimesh.load(ini_mesh_fname, process=False)
    ref = trimesh.load(ref_mesh_fname, process=False)
    original_radius = effective_radius_from_area(ini.area)
    rbc_scaling = suggested_radius / original_radius
    ini.vertices *= rbc_scaling
    ref.vertices *= rbc_scaling

    # set length scale (R_s)
    Nv = len(ini.vertices)
    Nv_ref = len(ref.vertices)
    A_s = ini.area
    V_s = ini.volume
    R_s = suggested_radius

    # set mass scale (mass_s)
    nd = constants.get('nd')
    mass_s = constants.get('mass')
    rho_s = mass_s * nd

    # rbc mass, assume membrane is 2D surface
    M_s = rho_s * A_s
    mmass_s = M_s / Nv

    # set time scale (based on kBT)
    kT_s = kT_s

    # unit scalings
    L_UNIT = R_p / R_s
    M_UNIT = rho_p / rho_s * (L_UNIT**3)
    T_UNIT = np.sqrt(kT_s / kT_p * L_UNIT**2 * M_UNIT)
    F_UNIT = M_UNIT * L_UNIT / T_UNIT**2
    E_UNIT = F_UNIT * L_UNIT
    VISC_UNIT = F_UNIT / L_UNIT**2 * T_UNIT

    # Numerical parameters

    AIJ = constants.get('AIJ')
    rc = constants.get('rc')
    rho0_s = constants.get('rho0')
    aij = AIJ * kT_s / rc
    cs_s = D.get_Cs_(aij, nd, mass_s, kT_s)
    kpow = constants.get('kpow')
    kb_s = to_sim(Ftherm * kT_s)
    mu_s = to_sim(FvK_p * kb_s / (R_s**2))
    Ka_s = to_sim(fKa_p * mu_s)
    kade_s = 0.  # use Minimum rbc model
    DA0D_s = 0.
    C0_s = 0.

    Gka_s = to_sim(FGKa_p * kb_s / (R_s**2))
    Gkv_s = to_sim(FGKv_p * kb_s / (R_s**3))

    kT_rbc = kT_s
    etao_s = to_sim(etao_p / VISC_UNIT)
    etai_s = to_sim(lm_p * etao_s)
    nuo_s = etao_s / rho_s
    nui_s = etai_s / rho_s
    gij = D.get_gij(aij, nuo_s * rho0_s)
    gin = D.get_gij(aij, nui_s * rho0_s)
    gfsi_o = R.get_gammafsiDPD(nuo_s * rho0_s, kpow, A_s, Nv, nd, rc)
    gfsi_i = R.get_gammafsiDPD(nui_s * rho0_s, kpow, A_s, Nv, nd, rc)

    gT = 0.
    gC = gammaC
    etam_s = np.sqrt(3) / 4. * gC  # approximation, Fedosov2010

    FvK_s = mu_s * R_s**2 / kb_s
    Ftherm_s = kb_s / kT_s

    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    # Timestep estimation
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    # ~ Solvent timestep:
    #   computed based on the timesteps
    #   from sonic, viscous and acceleration
    #   constraints as defined in Morris1997
    LX_min = min(ini.vertices[:, 0])
    LX_max = max(ini.vertices[:, 0])
    DX = LX_max - LX_min
    LX_min = min(ref.vertices[:, 0])
    LX_max = max(ref.vertices[:, 0])
    DX0 = LX_max - LX_min
    vcell_s = 0.5 * (DX - DX0) / to_sim(0.2 * ureg.s / T_UNIT)

    h = D.interparticle_distance(nd)
    Cdt = constants.get('Cdt')
    Cdt_visc = constants.get('Cdt_visc')
    dtmax = constants.get('dtmax')

    dt_sonic = D.get_dt_sonic(h, cs_s, C=Cdt)
    dt_visc = D.get_dt_viscous(h, max([etao_s, etai_s]), rho_s, C=Cdt_visc)
    Fdpd = D.get_total_dpd_force(nd, rc, aij, max([gfsi_o, gfsi_i, gij, gin]),
                                 vcell_s, kT_s, min([dt_sonic, dt_visc]))
    dt_acc = D.get_dt_accel_(h, Fdpd, mass_s, C=Cdt)
    dt_fluid = min([dtmax, dt_sonic, dt_visc, dt_acc])
    dt = dt_fluid

    # ~ Membrane substeps:
    #   Computed based on the timesteps
    #   from viscous and acceleration
    #   constraints as defined in Morris1997
    hm = R.intervertex_distance(A_s, Nv)
    Fdpd = D.get_total_dpd_force(nd, rc, aij, max([gfsi_o, gfsi_i]), vcell_s,
                                 kT_s, dt_fluid)
    Fintern = (mu_s + Ka_s) * hm + (kb_s +
                                    kade_s) / hm + Gka_s * hm + Gkv_s * hm**2
    dt_m_acc = D.get_dt_accel_(hm, Fdpd + Fintern, mmass_s, C=Cdt)
    dt_m_visc = D.get_dt_viscous(hm,
                                 max([etao_s, etai_s, etam_s / hm]),
                                 rho_s,
                                 C=Cdt_visc)
    dt_rbc = min([dt_m_visc, dt_m_acc])
    substeps = min(int(dt_fluid / dt_rbc + 0.5), 100)

    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    # Checking/Dumping frequencies
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    tend_p = TEND * ureg.s

    Ndumps = NDATA
    tdump_s = to_sim(tend_p / (Ndumps - 1) / T_UNIT)
    dumpfreq = int(tdump_s / dt + 0.5)
    tdump_s = dumpfreq * dt
    iend = (Ndumps - 1) * dumpfreq + 1

    correctfreq = constants.get('correctfreq')

    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    # Domain, ranks
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    safety = constants.get('safety')

    LX_min = min(ini.vertices[:, 0])
    LX_max = max(ini.vertices[:, 0])
    LX = int(safety * (LX_max - LX_min) + 0.5)

    LY_min = min(ref.vertices[:, 1])
    LY_max = max(ref.vertices[:, 1])
    LY = int(safety * (LY_max - LY_min) + 0.5)

    LZ_min = min(ini.vertices[:, 2])
    LZ_max = max(ini.vertices[:, 2])
    LZ = int(safety * (LZ_max - LZ_min) + 0.5)

    LX = LX + np.mod(LX, 2)
    LY = LY + np.mod(LY, 2)
    LZ = LZ + np.mod(LZ, 2)

    domain = (LX, LY, LZ)
    ranks = (1, 1, 1)

    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    # Group parameters
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    sim = {
        "domain": domain,
        "dumpfreq": dumpfreq,
        "correctfreq": correctfreq,
        "substeps": substeps,
        "iend": iend,
        "gfsi_o": gfsi_o,
        "gfsi_i": gfsi_i,
    }

    plasma = D.set_dpd_params(aij, gij, kT_s, kpow, rc, nd, mass_s)
    hemogl = D.set_dpd_params(aij, gin, kT_s, kpow, rc, nd, mass_s)
    rbc = R.set_rbc_params_ade_lwm(Gka_s, Gkv_s, A_s, V_s, gT, gC, kT_rbc,
                                   Ka_s, a3, a4, mu_s, b1, b2, kb_s, C0_s,
                                   kade_s, DA0D_s)
    mesh = R.set_mesh_params(ini, ref, Nv, mmass_s)

    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    # Start simulation
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    # chech debug_level (DW)
    u = mir.Mirheo(ranks,
                   domain,
                   dt,
                   debug_level=3,
                   log_filename=ply_dir + 'log',
                   comm_ptr=comm_address,
                   no_splash=True)

    if u.isComputeTask() and verbose:
        logfile.write("\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
        logfile.write("\n~~~       Physical Units        ~~~")
        logfile.write("\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
        logfile.write("\n>> Non-dimensional quantities:")
        logfile.write("\nFvK  :" + str(FvK_p))
        logfile.write("\nfKa  :" + str(fKa_p))
        logfile.write("\nFGKa_p :" + str(FGKa_p))
        logfile.write("\nFGKv_p :" + str(FGKv_p))
        logfile.write("\nFtherm :" + str(Ftherm))
        logfile.write("\n>> Dimensional quantities:")
        logfile.write("\nmu_p:" + str(mu_p))
        logfile.write("\nKa_p:" + str(Ka_p))
        logfile.write("\nA_p:" + str(A_p))
        logfile.write("\netao_p:" + str(etao_p))
        logfile.write("\netai_p:" + str(etai_p))
        logfile.write("\nRe_p:" +
                      str(vcell_s * L_UNIT / T_UNIT * R_p * rho_p / etao_p))
        logfile.write("\nMa_p:" + str(vcell_s * L_UNIT / T_UNIT /
                                      (1500. * ureg.m / ureg.s)))
        logfile.write("\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
        logfile.write("\n~~~       Simulation Units      ~~~")
        logfile.write("\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
        logfile.write("\n>> Non-dimensional quantities:")
        logfile.write("\nFvK  :" + str(FvK_s))
        logfile.write("\nFtherm:" + str(Ftherm_s))
        logfile.write("\n>> Dimensional quantities:")
        logfile.write("\nR_s:" + str(R_s))
        logfile.write("\nA_s:" + str(A_s))
        logfile.write("\nV_s:" + str(V_s))
        logfile.write("\nkT_s:" + str(kT_s))
        logfile.write("\nmu_s:" + str(mu_s))
        logfile.write("\nKa_s:" + str(Ka_s))
        logfile.write("\nkb_s:" + str(kb_s))
        logfile.write("\nGkv_s:" + str(Gkv_s))
        logfile.write("\nGka_s:" + str(Gka_s))
        logfile.write("\naij:" + str(aij))
        logfile.write("\ngij:" + str(gij))
        logfile.write("\ngin:" + str(gin))
        logfile.write("\ngC:" + str(gC))
        logfile.write("\ngT:" + str(gT))
        logfile.write("\netao_s:" + str(etao_s))
        logfile.write("\netai_s:" + str(etai_s))
        logfile.write("\netam_s:" + str(etam_s))
        logfile.write("\nmmass_s:" + str(mmass_s))
        logfile.write("\nvcell_s:" + str(vcell_s))
        logfile.write("\nNdumps:" + str(Ndumps))
        logfile.write("\ntend:" + str(TEND))
        logfile.write("\ndt:" + str(dt))
        logfile.write("\ndt_visc:" + str(dt_visc))
        logfile.write("\ndt_acc:" + str(dt_acc))
        logfile.write("\ndt_m_visc:" + str(dt_m_visc))
        logfile.write("\ndt_m_acc:" + str(dt_m_acc))
        logfile.write("\nsubsteps:" + str(substeps))
        logfile.write("\ndumpfreq:" + str(dumpfreq))
        logfile.write("\ndumptime:" + str(tdump_s))
        logfile.write("\niend:" + str(iend))
        logfile.write("\ndomain:" + str(domain))
        logfile.write("\nRe_s:" + str(vcell_s * R_s * rho_s / etao_s))
        logfile.write("\nMa_s:" + str(vcell_s / cs_s))
        logfile.write("\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
        logfile.write("\n~~~       Unit Transforms       ~~~")
        logfile.write("\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
        logfile.write("\nL_UNIT:" + str(L_UNIT.to_base_units()))
        logfile.write("\nT_UNIT:" + str(T_UNIT.to_base_units()))
        logfile.write("\nM_UNIT:" + str(M_UNIT.to_base_units()))
        logfile.write("\nChecks:")
        logfile.write("\nR_s/R_p:       " + str((R_s * L_UNIT / R_p)))
        logfile.write("\nkT_s/kT_p:     " + str((kT_s * E_UNIT / kT_p)))
        logfile.write("\nkb_s/kb_p:     " + str((kb_s * E_UNIT / kb_p)))
        logfile.write("\netao_s/etao_p: " + str((etao_s * VISC_UNIT / etao_p)))

    logfile.close()

    if not dryrun:
        simulation(u, plasma, hemogl, rbc, mesh, sim, ply_dir)

    del u
    del plasma
    del hemogl
    del rbc
    del mesh
    del sim