{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-mpm-debugging/src/mpm-debugger/src/floom/system.js"],"names":["Vector2","AABB","Material","Particle","Node","Grid","Obstacle","Integrator","System","wall","gravity","materials","particles","springs","grid","integrator","useSurfaceTensionImplementation","drawGrid","doObstacles","obstacles","doSprings","drawSprings","prototype","getNumberOfParticles","length","getNumberOfMaterials","createNewMaterial","newMaterial","push","addParticle","particle","update","surfaceTensionImplementation","simpleSimulation","mapPropertiesToGrid","sumUpPerMaterialGradients","_","each","p","pIndex","material","dudx","dudy","dvdx","dvdy","sx","sy","integrate","node","phi","gxpy","pxgy","cgx","materialIndex","cgy","velocity","x","y","linearCellX","Math","floor","position","boundaries","Min","linearCellY","n1","getOrCreateAt","n2","n3","n4","density","uscip","particleDensity","gx","gy","restDensity","pressure","stiffness","w1","wT0","T01","wT1","T00","T11","D00","D01","D11","trace","meltRate","norm","maxDeformation","particleMass","elasticity","viscosity","bulkViscosity","lenSq","len","sqrt","a","surfaceTension","f","Zero","copy","Max","obstacle","obstacleRadius","radius","obstacleRadiusSquared","particleDistanceToMiddlePoint","sub","distanceSquared","lengthSquared","distance","dR","subSelf","mulFloat","acceleration","iterate","mass","divFloatSelf","weightedAddSelf","addSelf","mulFloatSelf","damping","velocity2","advanceParticles","springDisplacement","boundaryCorrection","updateStateAndGradientOf","prepareParticle","numMaterials","clear","i","p00","x00","y00","p01","x01","y01","p10","x10","y10","p11","x11","y11","u","v","dx","dy","b","c","d","gVelocity","prevPosition","set","gridVelocity","smoothing","s","sIndex","solve","random"],"mappings":"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","file":"system.js","sourcesContent":["import Vector2 from \"./../external/vector2.js\";\nimport AABB from \"./../external/aabb.js\";\n\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\";\n\n\tvar System = function() {\n\t\tthis.wall = new AABB(\n\t\t\tnew Vector2(-50, 2),\n\t\t\tnew Vector2(50, 100)\n\t\t);\n\t\tthis.gravity = new Vector2(0,-0.05);// 0.004, 0.02\n\t\tthis.materials = [];\n\t\tthis.particles = [];\n\t\tthis.springs = [];\n\t\tthis.grid = new Grid();\n\t\tthis.integrator = new Integrator(this.grid);\n\t\t\n\t\tthis.useSurfaceTensionImplementation = true;\n\t\tthis.drawGrid = false;\n\t\t\n\t\tthis.doObstacles = false;\n\t\tthis.obstacles = [];\n\n\t\tthis.doSprings = false;\n\t\tthis.drawSprings = false;\n\t};\n\n\tSystem.prototype.getNumberOfParticles = function() {\n\t\treturn this.particles.length;\n\t};\n\n\tSystem.prototype.getNumberOfMaterials = function() {\n\t\treturn this.materials.length;\n\t};\n\n\tSystem.prototype.createNewMaterial = function() {\n\t\tvar newMaterial = new Material(this.materials.length);\n\t\tthis.materials.push(newMaterial);\n\t\t\n\t\treturn newMaterial;\n\t};\n\n\tSystem.prototype.addParticle = function(particle) {\n    \tthis.particles.push(particle);\n\t};\n\n\t/*\n\t * UPDATE\n\t */\n\tSystem.prototype.update = function() {\n\t\tthis.grid.update(this);\n\n\t\tif(this.useSurfaceTensionImplementation) {\n\t\t\tthis.surfaceTensionImplementation();\n\t\t} else {\n\t\t\tthis.simpleSimulation();\n\t\t}\n\t};\n\n\t\n\t/*\n\t * surface tension implementation\n\t */\n\tSystem.prototype.surfaceTensionImplementation = function() {\n\t\tthis.mapPropertiesToGrid();\n\t\tthis.sumUpPerMaterialGradients();\n\t\t\n\t\t// Calculate pressure and add forces to grid\n\t\t_.each(this.particles, (p, pIndex) => {\n\t\t\tvar material = p.material;\n\t\t\tvar dudx = 0, dudy = 0,\n\t\t\t\tdvdx = 0, dvdy = 0,\n\t\t\t\tsx = 0, sy = 0;\n\t\t\t\n\t\t\tthis.integrator.integrate(p, function(particle, node, phi, gxpy, pxgy) {\n\t\t\t\t// Surface tension\n\t\t\t\tsx += phi * node.cgx[material.materialIndex];\n\t\t\t\tsy += phi * node.cgy[material.materialIndex];\n\n\t\t\t\t// Velocity gradient\n\t\t\t\tdudx += node.velocity.x * gxpy;\n\t\t\t\tdudy += node.velocity.x * pxgy;\n\t\t\t\tdvdx += node.velocity.y * gxpy;\n\t\t\t\tdvdy += node.velocity.y * pxgy;\n\t\t\t});\n\t\t\t\n\t\t\t// determine cell index for mesh\n\t\t\tvar linearCellX = Math.floor(p.position.x - this.grid.boundaries.Min.x); // get cell x\n\t\t\tvar linearCellY = Math.floor(p.position.y - this.grid.boundaries.Min.y); // get cell y\n\t\t\t\n\t\t\t// linear 2x2 kernel\n\t\t\t// y  +-+-+\n\t\t\t//  1 |2|4|\n\t\t\t//    +-+-+\n\t\t\t//  0 |1|3|\n\t\t\t//    +-+-+\n\t\t\t//   /\n\t\t\t//  /  0 1 x\n\t\t\tvar n1 = this.grid.getOrCreateAt(linearCellX  , linearCellY  );\n\t\t\tvar n2 = this.grid.getOrCreateAt(linearCellX  , linearCellY+1);\n\t\t\tvar n3 = this.grid.getOrCreateAt(linearCellX+1, linearCellY  );\n\t\t\tvar n4 = this.grid.getOrCreateAt(linearCellX+1, linearCellY+1);\n\t\t\t\n\t\t\tvar density = this.uscip(\n\t\t\t\tn1.particleDensity, n1.gx, n1.gy,\n\t\t\t\tn2.particleDensity, n2.gx, n2.gy,\n\t\t\t\tn3.particleDensity, n3.gx, n3.gy,\n\t\t\t\tn4.particleDensity, n4.gx, n4.gy,\n\t\t\t\tp.position.x - this.grid.boundaries.Min.x - linearCellX, p.position.y - this.grid.boundaries.Min.y - linearCellY); // r and s\n\n\t\t\tvar restDensity = material.restDensity;\n\t\t\tvar pressure = material.stiffness*(density-restDensity)/restDensity;\n\t\t\tif (pressure > 2.0)\n\t\t\t\tpressure = 2.0;\n\n\t\t\t// Update stress tensor\n\t\t\tvar w1 = dudy - dvdx;\n\t\t\tvar wT0 = .5 * w1 * (p.T01 + p.T01);\n\t\t\tvar wT1 = .5 * w1 * (p.T00 - p.T11);\n\t\t\tvar D00 = dudx;\n\t\t\tvar D01 = .5 * (dudy + dvdx);\n\t\t\tvar D11 = dvdy;\n\t\t\tvar trace = .5 * (D00 + D11);\n\t\t\tp.T00 += .5 * (-wT0 + (D00 - trace) - material.meltRate * p.T00);\n\t\t\tp.T01 += .5 * (wT1 + D01 - material.meltRate * p.T01);\n\t\t\tp.T11 += .5 * (wT0 + (D11 - trace) - material.meltRate * p.T11);\n\t\t\t\n\t\t\t// Stress tensor fracture\n\t\t\tvar norm = p.T00 * p.T00 + 2 * p.T01 * p.T01 + p.T11 * p.T11;\n\t\t\t\n\t\t\tif (norm > material.maxDeformation)\n\t\t\t{\n\t\t\t\tp.T00 = p.T01 = p.T11 = 0;\n\t\t\t}\n\t\t\t\n\t\t\tvar T00 = material.particleMass * (material.elasticity * p.T00 + material.viscosity * D00 + pressure + trace * material.bulkViscosity);\n\t\t\tvar T01 = material.particleMass * (material.elasticity * p.T01 + material.viscosity * D01);\n\t\t\tvar T11 = material.particleMass * (material.elasticity * p.T11 + material.viscosity * D11 + pressure + trace * material.bulkViscosity);\n\t\t\t\n\t\t\t// Surface tension\n\t\t\tvar lenSq = sx * sx + sy * sy;\n\t\t\tif (lenSq > 0)\n\t\t\t{\n\t\t\t\tvar len = Math.sqrt(lenSq);\n\t\t\t\tvar a = material.particleMass * material.surfaceTension / len;\n\t\t\t\tT00 -= a * (.5 * lenSq - sx * sx);\n\t\t\t\tT01 -= a * (-sx * sy);\n\t\t\t\tT11 -= a * (.5 * lenSq - sy * sy);\n\t\t\t}\n\t\t\t\n\t\t\t// Wall force\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\t// test obstacle collision\n\t\t\tif (this.doObstacles){\n\t\t\t\t\n\t\t\t\t// circular obstacles\n\t\t\t\t_.each(this.obstacles, (obstacle) => {\n\t\t\t\t\tvar obstacleRadius  = obstacle.radius;\n\t\t\t\t\tvar obstacleRadiusSquared = obstacleRadius * obstacleRadius;\n\t\t\t\t\tvar particleDistanceToMiddlePoint = obstacle.position.sub(p.position);\n\t\t\t\t\tvar distanceSquared = particleDistanceToMiddlePoint.lengthSquared();\n\t\t\t\t\tif (distanceSquared < obstacleRadiusSquared){\n\t\t\t\t\t\tvar distance = Math.sqrt(distanceSquared);\n\t\t\t\t\t\tvar dR = obstacleRadius-distance;\n\t\t\t\t\t\tf.subSelf(particleDistanceToMiddlePoint.mulFloat(dR/distance));\n\t\t\t\t\t}\n\t\t\t\t});\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 * T00 + pxgy * T01) + f.x * phi;\n\t\t\t\tnode.acceleration.y += -(gxpy * T01 + pxgy * T11) + f.y * phi;\n\t\t\t});\n\t\t});\n\n\t\t// Update acceleration of nodes\n\t\tthis.grid.iterate(function(node) {\n\t\t\tif (node.mass > 0.0) {\n\t\t\t\tnode.acceleration.divFloatSelf(node.mass);\n\t\t\t}\n\t\t}, this);\n\n\t\t_.each(this.particles, (p, pIndex) => {\n\t\t\tvar material = p.material;\n\n\t\t\t// Update particle velocities\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\t\n\t\t\tp.velocity.addSelf(this.gravity);\n\t\t\tp.velocity.mulFloatSelf(1 - material.damping);\n\n\t\t\t// Add particle velocities back to the grid\n\t\t\tthis.integrator.integrate(p, function(particle, node, phi, gxpy, pxgy) {\n\t\t\t\tnode.velocity2.weightedAddSelf(particle.velocity, material.particleMass * phi);\n\t\t\t});\n\t\t});\n\n\t\t// Update node velocities\n\t\tthis.grid.iterate(function(node) {\n\t\t\tif (node.mass > 0.0) {\n\t\t\t\tnode.velocity2.divFloatSelf(node.mass);\n\t\t\t}\n\t\t}, this);\n\t\t\n\t\tthis.advanceParticles();\n\t\tthis.springDisplacement();\n\t\tthis.boundaryCorrection();\n\t};\n\n\tSystem.prototype.mapPropertiesToGrid = function() {\n\t\t_.each(this.particles, (p, pIndex) => {\n\t\t\tvar material = p.material;\n\n\t\t\t// Update grid cell index and kernel weights\n\t\t\tthis.integrator.updateStateAndGradientOf(p);\n\t\t\tthis.integrator.prepareParticle(p);\n\n\t\t\t// Add particle mass, velocity and density gradient to grid\n\t\t\tthis.integrator.integrate(p, function(particle, node, phi, gxpy, pxgy) {\n\t\t\t\tnode.mass += phi * material.particleMass;\n\t\t\t\tnode.particleDensity += phi;\n\t\t\t\tnode.velocity.weightedAddSelf(particle.velocity, material.particleMass * phi);\n\t\t\t\tnode.cgx[material.materialIndex] += gxpy;\n\t\t\t\tnode.cgy[material.materialIndex] += pxgy;\n\t\t\t});\n\t\t});\n\t};\n\t\n\tSystem.prototype.sumUpPerMaterialGradients = function() {\n\t\tvar numMaterials = this.getNumberOfMaterials();\n\t\tthis.grid.iterate(function(node) {\n\t\t\tif (node.mass > 0.0) {\n\t\t\t\tnode.acceleration.clear();\n\t\t\t\tnode.gx = 0;\n\t\t\t\tnode.gy = 0;\n\t\t\t\tnode.velocity.divFloatSelf(node.mass);\n\t\t\t\t// sum up gradients of all materials\n\t\t\t\tfor(var i = 0; i < numMaterials; i++) {\n\t\t\t\t\tnode.gx += node.cgx[i];\n\t\t\t\t\tnode.gy += node.cgy[i];\n\t\t\t\t}\n\t\t\t\tfor(var i = 0; i < numMaterials; i++) {\n\t\t\t\t\tnode.cgx[i] -= node.gx - node.cgx[i];\n\t\t\t\t\tnode.cgy[i] -= node.gy - node.cgy[i];\n\t\t\t\t}\n\t\t\t}\n\t\t}, this);\n\t};\n\t\n\tSystem.prototype.uscip = function(\n\t\tp00, x00, y00,\n\t\tp01, x01, y01,\n\t\tp10, x10, y10,\n\t\tp11, x11, y11,\n\t\tu, v\n\t) {\n\t\tvar dx = x00 - x01;\n\t\tvar dy = y00 - y10;\n\t\tvar a = p01 - p00;\n\t\tvar b = p11 - p10 - a;\n\t\tvar c = p10 - p00;\n\t\tvar d = y11 - y01;\n\t\treturn ((((d - 2 * b - dy) * u - 2 * a + y00 + y01) * v +\n\t\t\t\t ((3 * b + 2 * dy - d) * u + 3 * a - 2 * y00 - y01)) * v +\n\t\t\t\t((((2 * c - x00 - x10) * u + (3 * b + 2 * dx + x10 - x11)) * u - b - dy - dx) * u + y00)) * v +\n\t\t(((x11 - 2 * (p11 - p01 + c) + x10 + x00 + x01) * u +\n\t\t  (3 * c - 2 * x00 - x10)) * u +\n\t\t x00) * u + p00;\n\t};\n\n\tSystem.prototype.advanceParticles = function() {\n\t\t_.each(this.particles, (p, pIndex) => {\n\t\t\tvar material = p.material;\n\t\t\t\n\t\t\tvar gVelocity = Vector2.Zero.copy();\n\t\t\tvar dudx = 0, dudy = 0, dvdx = 0, dvdy = 0;\n\t\t\t\n\t\t\tthis.integrator.integrate(p, function(particle, node, phi, gxpy, pxgy) {\n\t\t\t\tgVelocity.weightedAddSelf(node.velocity2, phi);\n\t\t\t\t\n\t\t\t\t// Velocity gradient\n\t\t\t\tdudx += node.velocity2.x * gxpy;\n\t\t\t\tdudy += node.velocity2.x * pxgy;\n\t\t\t\tdvdx += node.velocity2.y * gxpy;\n\t\t\t\tdvdy += node.velocity2.y * pxgy;\n\t\t\t});\n\t\t\t\n\t\t\t// Update stress tensor\n\t\t\tvar w1 = dudy - dvdx;\n\t\t\tvar wT0 = .5 * w1 * (p.T01 + p.T01);\n\t\t\tvar wT1 = .5 * w1 * (p.T00 - p.T11);\n\t\t\tvar D00 = dudx;\n\t\t\tvar D01 = .5 * (dudy + dvdx);\n\t\t\tvar D11 = dvdy;\n\t\t\tvar trace = .5 * (D00 + D11);\n\t\t\tp.T00 += .5 * (-wT0 + (D00 - trace) - material.meltRate * p.T00);\n\t\t\tp.T01 += .5 * (wT1 + D01 - material.meltRate * p.T01);\n\t\t\tp.T11 += .5 * (wT0 + (D11 - trace) - material.meltRate * p.T11);\n\t\t\t\n\t\t\t// Stress tensor fracture\n\t\t\tvar norm = p.T00 * p.T00 + 2 * p.T01 * p.T01 + p.T11 * p.T11;\n\t\t\t\n\t\t\tif (norm > material.maxDeformation)\n\t\t\t{\n\t\t\t\tp.T00 = p.T01 = p.T11 = 0;\n\t\t\t}\n\t\t\t\n\t\t\t// advance particle\n\t\t\tp.prevPosition.set(p.position);\n\t\t\tp.position.addSelf(gVelocity);\n\t\t\tp.gridVelocity.set(gVelocity);\n\t\t\tp.velocity.weightedAddSelf(gVelocity.sub(p.velocity), material.smoothing);\n\t\t});\n\t};\n\n\tSystem.prototype.springDisplacement = function() {\n\t\tif(this.doSprings) {\n\t\t\t_.each(this.springs, (s, sIndex) => {\n\t\t\t\ts.update();\n\t\t\t\ts.solve();\n\t\t\t});\n\t\t}\n\t};\n\t\n\t// hard boundary correction\n\tSystem.prototype.boundaryCorrection = function() {\n\t\t_.each(this.particles, (p, pIndex) => {\n\t\t\tif (p.position.x < this.wall.Min.x - 4)\n\t\t\t\tp.position.x = this.wall.Min.x - 4 + .01 * Math.random();\n\t\t\telse if (p.position.x > this.wall.Max.x + 4)\n\t\t\t\tp.position.x = this.wall.Max.x + 4 - .01 * Math.random();\n\t\t\tif (p.position.y < this.wall.Min.y - 4)\n\t\t\t\tp.position.y = this.wall.Min.y - 4 + .01 * Math.random();\n\t\t\telse if (p.position.y > this.wall.Max.y + 4)\n\t\t\t\tp.position.y = this.wall.Max.y + 4 - .01 * Math.random();\n\t\t});\n\t};\n\n\texport default System;\n"]}