I’m currently learning Python, but in the meantime I still want to try a simple simulation of my ideas. I just need a program that lets me create particles and forces with whatever properties and interactions I want that I can then simulate. For example, I might make a particle that attracts certain particles and repels others according to some equation. I already tried asking in softwareoptions, by the way

  • potatoguy@lemmy.eco.br
    link
    fedilink
    English
    arrow-up
    16
    ·
    2 days ago

    Oh yeah, someone finally asked something about my field.

    So, maybe COMSOL is what you’re looking for, but if you want the cool, smooth and amazing stuff of the pros:

    Time to learn numerical calculus, like verlet integration, maybe some calculus for turning potential fields into force (maybe some forward differentiation with dual numbers, just like sympy does hahaha, you can use that too). If it’s a hairy equation, that takes some hypergeometric, bessel, etc, scipy has all the special equations.

    I think verlet + sympy for turning the potential fields into the force fields at the particle spots will do amazing, if you don’t want paper ready simulations. Like, pos[n, 3], v[n, 3], a[n, 3] (maybe some torque if you want) would be almost all you need.

    For visualization, matplotlib has a lot of stuff, you can make animations and videos.

    If you want to simulate the fields itself, you can use finite differences or finite element methods.

    If you need a lot of performance, I recommend learning Julia or the GODLY Fortran 2008 (fprettify, fortls, gfortran will help to build a modern Fortran program that you can call from python using cdll and ctypes with the ieee c libs for fortran).

  • Danitos@reddthat.com
    link
    fedilink
    English
    arrow-up
    4
    ·
    2 days ago

    For advanced stuff, you have Geant4. Fully open source software developed by the CERN and collaborators. It has a steep learning curve, but the feeling of simulating advanced physics (and somewhat underestading them) is amazing.

  • HootinNHollerin@lemmy.dbzer0.com
    link
    fedilink
    English
    arrow-up
    4
    ·
    edit-2
    2 days ago

    At a past job a physicist on my team used a free code that was developed at CERN for radiation simulations. Can’t recall what it was called but look into open stuff they’ve developed

  • nooneescapesthelaw@mander.xyz
    link
    fedilink
    English
    arrow-up
    2
    ·
    2 days ago

    Could you elaborate on what you want to make? If it’s lots of particles (thousands) then look into DEM software like ansys rocky or LIGGGHTS

    • fourhazzy@lemmy.worldOP
      link
      fedilink
      English
      arrow-up
      1
      ·
      24 hours ago

      I basically just want to use some point particles that I already have equations for interaction for. They’re kind of like the elemental particles of our universe, just with different properties. I’d also want to have more general forces like, for example, an equivalent to gravity. What I want to do is just start a “universe” with these particles and forces and some starting conditions and see what emerges.

  • Gust@piefed.social
    link
    fedilink
    English
    arrow-up
    2
    ·
    2 days ago

    A lot of people already mentioned it but geant4 is the gold standard for that kind of simulation. It could also be worth looking into pythia if you’re interested in simulating high energy events with geant4

  • potatoguy@lemmy.eco.br
    link
    fedilink
    English
    arrow-up
    3
    arrow-down
    1
    ·
    edit-2
    2 days ago

    Edit: Corrected the integration

    This is a simulation I made for a ball falling (the principles can be used everywhere):

    import numpy as np
    import matplotlib.pyplot as plt
    
    
    def calc_acceleration(pos, v):
        return np.array([0, 0, -9.8])
    
    
    def integrate(pos, v, a_old, delta_t):
        pos_new = pos + v * delta_t + 0.5 * a_old * delta_t * delta_t
    
        a_new = calc_acceleration(pos_new, v)
    
        v_new = v + 0.5 * (a_old + a_new) * delta_t
    
        if pos_new[2] < 0.0:
            v_new[2] = -v_new[2]
    
        return pos_new, v_new, a_new
    
    
    # Constants
    delta_t = 0.01
    t_max = 10
    
    # Time evolution
    times: np.ndarray = np.arange(0, t_max, delta_t)
    
    # Initial state
    v = np.array([15.0, -3.0, 15.0])
    pos = np.array([0.0, 0.0, 7.0])
    positions = np.zeros([times.size, 3])
    a_old = calc_acceleration(pos, v)
    
    # Simulating
    for i in range(times.size):
        pos, v, a_old = integrate(pos, v, a_old, delta_t)
        positions[i, :] = pos
    
    # Plotting
    fig = plt.figure()
    ax = fig.add_subplot(projection="3d")
    ax.scatter(positions[:, 0], positions[:, 1], positions[:, 2])
    plt.show()
    

    Very simple, you can see a ball falling and getting up again from that starting point, so you just see at least some starting point on how to do this stuff, the basics are not that difficult. But every simulation is like this, just more complicated hahaha.