Anuncio

Colapsar
No hay ningún anuncio todavía.

Software para choque de cuerpos y particulas

Colapsar
X
 
  • Filtro
  • Hora
  • Mostrar
Borrar todo
nuevos mensajes

  • Programación Software para choque de cuerpos y particulas

    Alguien me puede recomendar que software utilizar para realizar algunas simulaciones de choque de esferas y partículas.
    Podría ser para simular teoría cinética de los gases, choque de muchas esferas en movimiento etc.
    No soy un programador avanzado pero he realizado programas básicos en Fortran, Basic, C++ etc.
    Busco simular por ejemplo que tipo de fuerzas se producen en dos esferas que se encuentran en un entorno donde existe un bombardeo de particulas desde todas direcciones, algo parecido a si estuvieran en un recipiente con un gas.

  • #2
    Re: Software para choque de cuerpos y particulas

    Hola,

    ¿Cuál es el propósito? Es decir, si lo que quieres es obtener las propiedades físicas macroscópicas (presión, temperatura, calor específico, etc) a partir de seguir la evolución de las partículas entonces tienes dos métodos modernos: dinámica molecular y montecarlo.
    El primero se basa en seguir posiciones y velocidades de las partículas, que interaccionan usualmente bajo el potencial de Lennard-Jones (hasta un cierto radio de corte, por temas de tiempo). El segundo consiste sólo en seguir las posiciones y luego hacer una estadística; simplemente se mueven las partículas aleatoriamente y se acepta o se rechaza el estado según si un número aleatorio es mayor o menor que la exponencial de Boltzmann.

    Puedes encontrar más información de ambos métodos por internet. Yo te recomendaría empezar por dinámica molecular, aunque creo recordar que el montecarlo me iba bastante rápido (2h y algo para 250 millones de pasos). Respecto al lenguaje de programación, yo lo hice en Fortran; va muy bien y muy rápido.

    Saludos
    Las bolsas de patatas fritas de hoy en día son como los átomos, el 99'99% es espacio vacío.

    Comentario


    • #3
      Re: Software para choque de cuerpos y particulas

      Alguien me puede recomendar que software utilizar para realizar algunas simulaciones de choque de esferas y partículas.
      Podría ser para simular teoría cinética de los gases, choque de muchas esferas en movimiento etc.
      No soy un programador avanzado pero he realizado programas básicos en Fortran, Basic, C++ etc.
      Eso puedes programarlo mediante la aplicación del método de monte carlo. Por ejemplo, siguiendo el método de monte carlo se programan software de transporte de radiación utilizados en física médica, como penelope o en física de alta energía como el fluka.
      Deberás considerar la probabilidad de los choques de las esferas o partículas siguiendo una función de distribución, dependiente de la energía, momento y el espacio, cuyos valores medios estarán a su vez en función del tipo de material, el medio y energías, momentos iniciales.

      PD: para este tipo de simulaciones, olvidate de C, C++, Basic, etc. Te recomiendo un lengaje de alto nivel como python o matlab (así te olvidas de si un dato debe ser de 1, 2, 4 bytes, etc.. y codificarse como caracter, entero, real). Pero si sabes o has visto fortran, como dices, hechale un vistaso a penelope o fluka.
      Por más bella o elegante que sea la teoría, si los resultados no la acompañan, está mal.

      Comentario


      • #4
        Re: Software para choque de cuerpos y particulas

        Gracias Mossy y Julian.
        Aún no sé como empezar y si debo hacer una simulación o empezar con cálculos mas teóricos.
        Imaginar que tengo tres cuerpos esféricos y que estos se bombardean desde todas direcciones del espacio por unas supuestas partículas de masa m y velocidad v,
        podemos suponer que estas supuestas partículas son todas iguales en masa y velocidad pero provenientes de multitud de direcciones.
        Al chocar estas partículas con nuestras tres esferas se producen choques con una componente elástica y otra plástica. Debido al efecto de sombra o apantallamiento
        que ejercen nuestras tres esferas entre si, deberían producirse una fuerzas interactivas entre las tres esferas, algo parecido a lo que "Lesage" consideraba en su modelo.
        No se si se entiende lo que acabo de explicar, pero si consideramos una de las tres esferas, a esta le chocan partículas desde todas las direcciones excepto desde las otras
        dos esferas ya que le hacen de pantalla y esto se traduce en una fuerza de atracción entre esta esfera y las otras dos.
        Este tipo de situaciones e interacciones son las que pretendo analizar. He empezado con dos esferas con algunos cálculos previos pero se me complica demasiado al pasar a tres esferas y por eso estoy pensando en simularlo con un modelo.

        Gracias por vuestra ayuda.

        Comentario


        • #5
          Re: Software para choque de cuerpos y particulas

          Hola aqui expongo un código sencillo que permite visualizar choques bidimensionales en un simple formulario de visual basic

          el programa usa un formulario con los siguientes controles
          Haz clic en la imagen para ampliar

Nombre:	formulario.png
Vitas:	1
Tamaño:	5,3 KB
ID:	304229

          el gráfico aparece dibujado en el mismo formulario el cual debe ser extenso, con los controles sobre la esquina superior derecha

          el código para el formulario es

          Código:
          Private Sub cls_Click()
          Me.cls
          End Sub
          
          
          Public Sub Command1_Click()
          
          
          Dim g As Integer
          Dim h As Integer
          n = CInt(Text1(0).Text)
          v = CSng(Text1(1).Text)
          R = CInt(Text1(2).Text)
          s = CInt(Text1(7).Text)
          deltat = CInt(Text1(8).Text)
          h = 0
          tpo = CSng(Text1(3).Text)
          pi = 3.14159265
          'cargar datos
          a = 1
          Do Until a = n + 1
          x = Int(R + Rnd() * (10000 - 2 * R))
          y = Int(R + Rnd() * (10000 - 2 * R))
          ang = Rnd() * 2 * pi
          If a > 1 Then
          1     c = 1
              
              x = Int(R + Rnd() * (10000 - 2 * R))
              y = Int(R + Rnd() * (10000 - 2 * R))
              w = 0
              Do While c < a
                  If ((x - B(c, 1)) ^ 2 + (y - B(c, 2)) ^ 2) ^ 0.5 < R Then
                  w = 1
                  End If
                  c = c + 1
              Loop
              If w = 1 Then
              w = 0
              GoTo 1
              End If
          End If
          B(a, 1) = x
          B(a, 2) = y
          B(a, 3) = v * Cos(ang)
          B(a, 4) = v * Sin(ang)
          a = a + 1
          Loop
          
          
          t = 1
          np = 0
          nt = 0
          dt = 1
          
          
          
          
          'calcular paso
          Do Until t = tpo + 1
              a = 1
              Do Until a = n + 1
              
              Circle (B(a, 5), B(a, 6)), R + 2, RGB(255, 255, 255)
              B(a, 1) = B(a, 1) + B(a, 3) * dt
              B(a, 2) = B(a, 2) + B(a, 4) * dt
              Circle (B(a, 1), B(a, 2)), R
              B(a, 5) = B(a, 1)
              B(a, 6) = B(a, 2)
              a = a + 1
              Loop
              
              ' choque pared
              a = 1
              Do Until a = n + 1
              
              If B(a, 1) < R Then
              B(a, 3) = -B(a, 3)
              B(a, 1) = R
              np = np + 1
              End If
              
              If B(a, 1) > 10000 - R Then
              B(a, 3) = -B(a, 3)
              B(a, 1) = 10000 - R
              np = np + 1
              End If
              
              If B(a, 2) < R Then
              B(a, 4) = -B(a, 4)
              B(a, 2) = R
              np = np + 1
              End If
              
               If B(a, 2) > 10000 - R Then
              B(a, 4) = -B(a, 4)
              B(a, 2) = 10000 - R
              np = np + 1
              End If
              
              a = a + 1
              Loop
              ' choque bolas
              a = 1
              Do Until a = n
                  c = a + 1
                  Do While c < n + 1
                      If a <> c Then
                          If ((B(a, 1) - B(c, 1)) ^ 2 + (B(a, 2) - B(c, 2)) ^ 2) ^ 0.5 < 2 * R Then
                              If B(a, 1) <= B(c, 1) And B(a, 2) <= B(c, 2) Then d = 3
                              If B(a, 1) > B(c, 1) And B(a, 2) <= B(c, 2) Then d = 4
                              If B(a, 1) > B(c, 1) And B(a, 2) > B(c, 2) Then d = 1
                              If B(a, 1) <= B(c, 1) And B(a, 2) > B(c, 2) Then d = 2
                              If B(a, 1) - B(c, 1) = 0 Then
                              If B(a, 2) - B(c, 2) > 0 Then
                              dalfa = pi / 2
                              d = 1
                              Else
                              dalfa = pi / 2
                              d = 3
                              End If
                              Else
                              dalfa = Abs(Atn((B(a, 2) - B(c, 2)) / (B(a, 1) - B(c, 1))))
                              End If
                              If d = 1 Then alfa = dalfa
                              If d = 2 Then alfa = pi - dalfa
                              If d = 3 Then alfa = pi + dalfa
                              If d = 4 Then alfa = 2 * pi - dalfa
                                                 
                              vrelx = B(a, 3) - B(c, 3)
                              vxv = B(c, 3)
                              vrely = B(a, 4) - B(c, 4)
                              vyv = B(c, 4)
                              If vrelx >= 0 And vrely >= 0 Then d = 1
                              If vrelx < 0 And vrely >= 0 Then d = 2
                              If vrelx < 0 And vrely < 0 Then d = 3
                              If vrelx >= 0 And vrely < 0 Then d = 4
                              If vrelx = 0 Then
                              If vrely > 0 Then
                              dphi = pi / 2
                              d = 1
                              Else
                              dphi = pi / 2
                              d = 1
                              End If
                              Else
                              dphi = Abs(Atn(vrely / vrelx))
                              End If
                              If d = 1 Then phi = dphi
                              If d = 2 Then phi = pi - dphi
                              If d = 3 Then phi = pi + dphi
                              If d = 4 Then phi = 2 * pi - dphi
                              signo = (alfa - phi) / Abs(alfa - phi)
                              theta = ((phi - alfa) ^ 2) ^ 0.5
                              mvrel = (vrelx ^ 2 + vrely ^ 2) ^ 0.5
                              
                              v2h = mvrel * (Cos(theta)) ^ 2
                              v2v = mvrel * Sin(theta) * Cos(theta) * signo
                              v1h = mvrel * (Sin(theta)) ^ 2
                              v1v = -mvrel * Sin(theta) * Cos(theta) * signo
                              
                              v2xr = v2h * Cos(phi) - v2v * Sin(phi)
                              v2yr = v2h * Sin(phi) + v2v * Cos(phi)
                              v1xr = v1h * Cos(phi) - v1v * Sin(phi)
                              v1yr = v1h * Sin(phi) + v1v * Cos(phi)
                              
                              B(c, 3) = vxv + v2xr
                              B(c, 4) = vyv + v2yr
                              B(a, 3) = vxv + v1xr
                              B(a, 4) = vyv + v1yr
                              
                              Do While ((B(a, 1) - B(c, 1)) ^ 2 + (B(a, 2) - B(c, 2)) ^ 2) ^ 0.5 < 2 * R
                                  B(a, 1) = B(a, 1) + B(a, 3) * dt
                                  B(a, 2) = B(a, 2) + B(a, 4) * dt
                                  B(c, 1) = B(c, 1) + B(c, 3) * dt
                                  B(c, 2) = B(c, 2) + B(c, 4) * dt
                              Loop
                              nt = nt + 1
                           End If
                      End If
                      c = c + 1
                  Loop
                  a = a + 1
              Loop
              a = 1
              Do Until a = n + 1
              If B(a, 1) < R Then
              B(a, 1) = R - 1
              End If
              If B(a, 1) > 10000 - R Then
              B(a, 1) = 10001 - R
              End If
              
              If B(a, 2) < R Then
              B(a, 2) = R
              End If
              If B(a, 2) > 10000 - R Then
              B(a, 2) = 10001 - R
          
          
              End If
              If CInt(t / 1000) = t / 100 Then dibujo.Refresh
              a = a + 1
              Loop
          Text1(5) = np / t
          Text1(5).Refresh
          
          
          Text1(6) = nt / t
          Text1(6).Refresh
          
          
          Text1(4) = t
          Text1(4).Refresh
          t = t + 1
          
          
          If t / 100 = Int(t / 100) Then
          Me.Refresh
          End If
          
          
          
          
          
          
          If t / deltat = Int(t / deltat) Then
           Call grafica
           End If
          Loop
          
          
          End Sub
          
          
          Public Sub grafica()
          n = CInt(Text1(0).Text)
          v = CSng(Text1(1).Text)
          R = CInt(Text1(2).Text)
          s = CInt(Text1(7).Text)
          deltat = CInt(Text1(8).Text)
          a = 1
          Maxv = 0
          
          
          Do Until a = n + 1
          w = (B(a, 3) ^ 2 + B(a, 4) ^ 2) ^ 0.5
          If w > Maxv Then Maxv = w
          a = a + 1
          Loop
          a = 1
          q = v / s
          Do Until a = 10001
          E(a, 1) = 0
          a = a + 1
          Loop
          a = 1
          Do Until a = n + 1
          w = (B(a, 3) ^ 2 + B(a, 4) ^ 2) ^ 0.5
          f = Int(w / q) + 1
          If f > 1000 Then
          MsgBox "mas de 50 v", vbExclamation, "Atencion"
          Else
          E(f, 1) = E(f, 1) + 1
          End If
          a = a + 1
          Loop
          a = 1
          maxE = 0
          Do Until a = 10001
          If E(f, 1) > maxE Then maxE = E(f, 1)
          a = a + 1
          Loop
          salto = 5000 / maxE
          
          
          a = 1
          inix = 11000
          iniy = 12000
          Do Until a = Int(Maxv * s / 10) + 1
          Line (inix + (a - 1) * 100000 / Maxv / s, iniy - salto * E(a, 1))-(inix + a * 100000 / Maxv / s, iniy - salto * E(a + 1, 1)), &H0&
          a = a + 1
          Loop
          
          
          End Sub
          ademas se tienen que declarar variables globales en un modulo extra

          Código:
          Public B(10001, 9) As Double
          Public E(10001, 3) As Double
          Public Maxv As Double
          una vista

          Haz clic en la imagen para ampliar

Nombre:	salida.png
Vitas:	1
Tamaño:	33,6 KB
ID:	304230

          es una base para los millones de mejoras posibles...

          Visualiza el movimiento de los círculos de 2 dimensiones, menor cantidad mejor calidad,

          para una cantidad de datos estimada, visualiza la frecuencia de distribución de velocidades de los círculos,

          Y para mi satisfacción se parece a una distribución de Boltzman....

          Calcula la cantidad de choques por unidad de tiempo como, una medida de presión y la cantidad de choques entre círculos como una medida de la temperatura


          Estaria bueno poderlo colgar en la web , bajo un formato .asp con muy pequeñas modificaciones al código.

          hasta ahor nunca subi un archivo que no fuera una imagen espero que lo puedan abrir y jugar un poco.boltzman.rar

          Comentario


          • #6
            Re: Software para choque de cuerpos y particulas

            Muy interesante Richard gracias, aunque a mí no me funciona, los controles "Limpiar", "Dibujar" me quedan fuera de la pantalla y no tengo acceso a ellos. Sí justo arriba a la derecha, veo y puedo acceder a "Nº de bolas", "Velocidad",... y cambiar los valores.

            Estaría bien que además del código, pusieses las ecuaciones que utilizas, haría más útil el hilo.

            Gracias de nuevo y saludos.
            "Das ist nicht nur nicht richtig, es ist nicht einmal falsch! "

            Comentario


            • #7
              Re: Software para choque de cuerpos y particulas

              Hola alriga, quizá puedas ver todos los controles si tienes la posibilidad de ajustar el tamaño de la pantalla del pc a la máxima resolución... Por otro lado creo que puedo hacer cambios y que se pueda cambiar el tamaño del formulario modificando alguna de sus propiedades...cuando me siente en ese pc con VisualBasic, paso la versión 2.0



              Paso las características principales del programa como para que lo puedan, hacer correr en otros lenguajes de programación

              • Crear las matrices de datos para que siempre estén disponibles desde cualquier procedimiento o función.
              • Poner los datos a 0 para vaciar ejecuciones anteriores.
              • Elegir una escala en la que el resultado de las operaciones sean directamente pixeles.
              • Yo elegí tener una velocidad con módulo constante y dirección y posición aleatoria, con el fin de demostrar la tendencia hacia la distribución de boltzman, pero puede usarse cualquiera que se prefiera.
              • Si es el tamaño del recipiente y el tamaño de las bolas, ninguna de estas debería posicionarse en coordenadas o por debajo de o por encima de
              • Una vez calculada la posición de una bola, chequeo que no se superponga con otra bola
              • Para ello se debe evitar que , en caso de superponerse se calcula la posición nuevamente, los valores se guardan en la matriz.
              • Escojer una velocidad tal que al multiplicarla por tiempo unitario de desplazamientos bien por debajo de los lados del recipiente.
              • Inicializar un contador de tiempo
              • Calcular la posición de cada bola con y
              • Se dibuja un círculo de radio R color blanco en la posición anterior, y uno negro en la posición actual.
              • Calcular si la bola ha tocado un pared, consiste en chequear que tanto la coordenada x o y estén dentro del rango
              • Si las se exceden entonces se invierte su velocidad
              • Si las se exceden entonces se invierte su velocidad
              • Y llevamos la cuenta de las veces que esto sucede para todas las bolas.
              • Luego chequeamos si hay choques entre bolas nuevamente con
              • Para cada choque hay calcular la velocidad relativa del alcance, y su modulo y dirección (ángulo en radianes) ,también el ángulo entre las posiciones al momento del choque es importante que los ángulos queden calculados perfectamente en su cuadrante , ya que el uso de arcosenos, arcocosenos y arcotangentes, puede ubicarlos en diferentes cuadrantes al que se necesita.
              • Lo que se hace es reducir el problema de dos bolas en movimiento a uno con tiro unidimensional, a una bola detenida , como, trabajando con velocidad y ángulos relativos,
              • Donde
              • El modulo de la velocidad que estaba quieta luego del choque pasa a ser y el de la que impacta

              Haz clic en la imagen para ampliar

Nombre:	choque.png
Vitas:	1
Tamaño:	11,8 KB
ID:	304232


              • es importante el signo del ángulo pues la orientación del angulo de salida depende de el
              • Luego se hallan las componentes de estas velocidades en la dirección paralela y perpendicular a la velocidad relativa,
              • Para cada bola uso una matriz de rotación de coordenadas con ángulo para calcular las componentes en dirección x e y



              • Sumo a esta la velocidad de la bola que tome de referencia para calcular la velocidad relativa y ya tenemos las nuevas velocidades de las bolas luego del impacto.
              • Cuento el número de impactos.
              • Tomo la precaución de adelantar los pasos necesarios la posición de las bolas luego del choque, para que en un nuevo paso no se calcule nuevamente el mismo choque.
              • Se inicia el ciclo nuevamente actualizando la posición.
              • Cada cierto intervalo de tiempo , se gráfica la distribución de velocidades, se toma un rango de velocidad y se cuentan cuantas bolas tienen el módulo de la velocidad dentro del rango, se guardan la suma en una matriz, y luego se gráfica en orden rango vs cuenta, y aparece la famosa curva de maxwell- boltzman


              cuando pueda escribo mas látex con fórmulas.

              aver si va la version 2.0 Boltzmann v2.0.rar


              Lo interesante sería extenderlo ,

              • Aplicando la pérdida de calor por las paredes, poniendo un coeficiente de restitución variable en función de la temperatura absoluta(que hay que modelizar).
              • Aplicar dos o más tamaños y masas variables.
              • Aplicar química.... que si se produce un choque de una partícula A con una B a una velocidad relativa por encima de un limite V aparezca una bola C , D etc de mayores y menores masas, consumiendo o liberando energía cinética, o radiación al resto en función de la distancia de separación.
              • Aplicación del modelo a 3d


              Todo fácil de escribir , pero para modelizar, para otros fines de semana...
              Última edición por Richard R Richard; 09/09/2018, 19:06:16.

              Comentario


              • #8
                Re: Software para choque de cuerpos y particulas

                Por lo general este tipo de simulaciones tiene un mejor rendimiento si lo haces desde el paradigma de la Programación Orientada a Objetos (POO), ya que puedes crear una clase de objeto "pelotas o bolas", al que le cambies algunas de sus propiedades, como posición, velocidad, masa, tamaño, etc... Y al mismo tiempo puedes creear un vector o una matriz de objetos similares, que controle su existencia e interacciones.

                Te recomiendo ver como se programaban los juegos en C++ bajo este paradigma de POO, para que puedas ver como controlar una gran cantidad de objetos del mismo tipo y que se mueven individualmente.

                Saludos.

                Comentario


                • #9
                  Re: Software para choque de cuerpos y particulas

                  Si no quieres programar mucho puedes usar un programa 3d como blender o similares, vienen ya con un sistema de particulas y colisiones incorporado. Depende de lo quieras simular puede que te valga sólo tocando algunos parametros, aunque en blender en concreto puedes modificar parte del código (al ser open source) en lenguaje phyton si no recuerdo mal.

                  Salu2

                  Comentario

                  Contenido relacionado

                  Colapsar

                  Trabajando...
                  X