{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-mpm-debugging/src/mpm-debugger/src/floom/simplesimulation.js"],"names":["System","Material","Particle","Node","Grid","Obstacle","Integrator","Vector2","prototype","simpleSimulation","__calculateParticleKernels","__sumParticleDensityFromGridAndAddPressureansElasticForcesToGrid","__divideGridAccelerationByMass","__accelerateParticlesAndInterpolateVelocityBackToGrid","__divideGridVelocityByMass","__advanceParticles","_","each","particles","p","pIndex","integrator","updateStateAndGradientOf","prepareParticle","integrate","particle","node","phi","gxpy","pxgy","mass","density","restDensity","material","pressure","f","Zero","copy","position","x","wall","Min","velocity","Max","y","acceleration","grid","iterate","n","divFloatSelf","addSelf","gravity","weightedAddSelf","gridVelocity","clear","sub","smoothing"],"mappings":"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","file":"simplesimulation.js","sourcesContent":["import System from \"./system.js\";\nimport Material from \"./material.js\";\nimport Particle from \"./particle.js\";\nimport Node from \"./node.js\";\nimport Grid from \"./grid.js\";\nimport Obstacle from \"./obstacle.js\";\nimport Integrator from \"./integrator.js\";\nimport Vector2 from \"./../external/vector2.js\";\n\n\t/*\n\t * Early simple implementation of the material point method\n\t */\n\tSystem.prototype.simpleSimulation = function() {\n\t\tthis.__calculateParticleKernels();\n\t\tthis.__sumParticleDensityFromGridAndAddPressureansElasticForcesToGrid();\n\t\tthis.__divideGridAccelerationByMass();\n\t\tthis.__accelerateParticlesAndInterpolateVelocityBackToGrid();\n\t\tthis.__divideGridVelocityByMass();\n\t\tthis.__advanceParticles();\n\t};\n\n\tSystem.prototype.__calculateParticleKernels = function() {\n\t\t// calculate particle kernels, and add density and density gradients to the grid\n\t\t_.each(this.particles, (p, pIndex) => {\n\t\t\tthis.integrator.updateStateAndGradientOf(p);\n\t\t\tthis.integrator.prepareParticle(p);\n\t\t\t\n\t\t\tthis.integrator.integrate(p, function(particle, node, phi, gxpy, pxgy) {\n\t\t\t\tnode.mass += phi;\n\t\t\t});\n\t\t});\n\t};\n\t\n\tSystem.prototype.__sumParticleDensityFromGridAndAddPressureansElasticForcesToGrid = function() {\n\t\t// Sum particle density from grid, and add pressure and elastic forces to grid\n\t\t_.each(this.particles, (p, pIndex) => {\n\t        var density = 0;\n\t\t\tthis.integrator.integrate(p, function(particle, node, phi, gxpy, pxgy) {\n\t\t\t\tdensity += phi*node.mass;\n\t\t\t});\n\n\t\t\tvar restDensity = p.material.restDensity;\n\t\t\tvar pressure = (density-restDensity)/restDensity;\n\t\t\tif (pressure > 4.0)\n\t\t\t\tpressure = 4.0;\n\n\t\t\tvar f = Vector2.Zero.copy();\n\t\t\tif (p.position.x < this.wall.Min.x) {\n\t\t\t\tf.x += this.wall.Min.x - p.position.x;\n\t            p.velocity.x *= 0.1;\n\t\t\t}\n\t\t\tif (p.position.x > this.wall.Max.x) {\n\t\t\t\tf.x += this.wall.Max.x - p.position.x;\n\t            p.velocity.x *= 0.1;\n\t\t\t}\n\t\t\tif (p.position.y < this.wall.Min.y) {\n\t\t\t\tf.y += this.wall.Min.y - p.position.y;\n\t            p.velocity.y *= 0.1;\n\t\t\t}\n\t\t\tif (p.position.y > this.wall.Max.y) {\n\t\t\t\tf.y += this.wall.Max.y - p.position.y;\n\t            p.velocity.y *= 0.1;\n\t\t\t}\n\t\t\t\n\t\t\tthis.integrator.integrate(p, function(particle, node, phi, gxpy, pxgy) {\n\t\t\t\tnode.acceleration.x += -(gxpy * pressure) + f.x * phi;\n\t\t\t\tnode.acceleration.y += -(pxgy * pressure) + f.y * phi;\n\t\t\t});\n\t\t});\n\t};\n\n\t// divide grid acceleration by mass\n\tSystem.prototype.__divideGridAccelerationByMass = function() {\n\t\tthis.grid.iterate(function(n) {\n\t\t\tif (n.mass > 0.0) {\n\t\t\t\tn.acceleration.divFloatSelf(n.mass);\n\t\t\t\tn.acceleration.addSelf(this.gravity);\n\t\t\t}\n\t\t}, this);\n\t};\n\t\n\t// accelerate particles and interpolate velocity back to grid\n\tSystem.prototype.__accelerateParticlesAndInterpolateVelocityBackToGrid = function() {\n\t\t_.each(this.particles, (p, pIndex) => {\n\t\t\tthis.integrator.integrate(p, function(particle, node, phi, gxpy, pxgy) {\n\t\t\t\tparticle.velocity.weightedAddSelf(node.acceleration, phi);\n\t\t\t});\n\t\t\tthis.integrator.integrate(p, function(particle, node, phi, gxpy, pxgy) {\n\t\t\t\tnode.velocity.weightedAddSelf(particle.velocity, phi);\n\t\t\t});\n\t\t});\n\t};\n\t\n\t// divide grid velocity by mass\n\tSystem.prototype.__divideGridVelocityByMass = function() {\n\t\tthis.grid.iterate(function(n) {\n\t\t\tif (n.mass > 0.0) {\n\t\t\t\tn.velocity.divFloatSelf(n.mass);\n\t\t\t}\n\t\t}, this);\n\t};\n\t\n\tSystem.prototype.__advanceParticles = function() {\n\t\t// advance particles\n\t\t_.each(this.particles, (p, pIndex) => {\n\t        p.gridVelocity.clear();\n\t\t\tthis.integrator.integrate(p, function(particle, node, phi, gxpy, pxgy) {\n\t\t\t\tparticle.gridVelocity.weightedAddSelf(node.velocity, phi);\n\t\t\t});\n\t\t\tp.position.addSelf(p.gridVelocity);\n\t\t\tp.velocity.weightedAddSelf(p.gridVelocity.sub(p.velocity), p.material.smoothing);\n\t\t});\n\t};\n"]}