Big push to implement 10mp fluid simulations.
This commit is contained in:
74
fluid/field.go
Normal file
74
fluid/field.go
Normal file
@@ -0,0 +1,74 @@
|
||||
package fluid
|
||||
|
||||
import "math"
|
||||
|
||||
type CellType int
|
||||
|
||||
const (
|
||||
CellTypeFluid = iota
|
||||
CellTypeAir
|
||||
CellTypeSolid
|
||||
CellTypeMax
|
||||
)
|
||||
|
||||
type VelocityField struct {
|
||||
Dimensions FieldVector //in meters
|
||||
Numcells int
|
||||
Nx, Ny int //number of cells in x, y
|
||||
H float32 //field spacing, in meters
|
||||
InvH float32
|
||||
U, V []float32 //field components < u(x,y), v(x,y) >
|
||||
PrevU, PrevV []float32 //previous field components < u(x,y), v(x,y) >
|
||||
DU, DV []float32 //weighted sums for components < u(x,y), v(x,y) >
|
||||
S []float32 //fluid cell scales
|
||||
CellType []float32 //type of cell
|
||||
}
|
||||
|
||||
func NewVelocityField(dimensions FieldVector, spacing float32) *VelocityField {
|
||||
vf := &VelocityField{
|
||||
Dimensions: dimensions,
|
||||
H: spacing,
|
||||
InvH: 1 / spacing,
|
||||
}
|
||||
|
||||
vf.Initialize()
|
||||
return vf
|
||||
}
|
||||
|
||||
func (vf *VelocityField) Initialize() {
|
||||
|
||||
vf.Nx = int(math.Floor(float64(vf.Dimensions.X/vf.H))) + 1
|
||||
vf.Ny = int(math.Floor(float64(vf.Dimensions.Y/vf.H))) + 1
|
||||
|
||||
cellcount := vf.Nx * vf.Ny
|
||||
|
||||
vf.Numcells = cellcount
|
||||
|
||||
vf.U = make([]float32, cellcount)
|
||||
vf.V = make([]float32, cellcount)
|
||||
vf.PrevU = make([]float32, cellcount)
|
||||
vf.PrevV = make([]float32, cellcount)
|
||||
vf.DU = make([]float32, cellcount)
|
||||
vf.DV = make([]float32, cellcount)
|
||||
vf.S = make([]float32, cellcount)
|
||||
vf.CellType = make([]float32, cellcount)
|
||||
|
||||
for i := 0; i < vf.Nx; i++ {
|
||||
for j := 0; j < vf.Ny; j++ {
|
||||
var stype float32 = CellTypeAir //port, code corrected
|
||||
//var stype float32 = 1 //10mp value, claims fluid but isn't
|
||||
//var stype float32 = CellTypeSolid //port, with 10mp intent
|
||||
if i == 0 || i == vf.Nx-1 || j == 0 {
|
||||
stype = CellTypeFluid //port, code corrected
|
||||
//stype = 0 //10mp value, claims solid but isn't
|
||||
//stype = CellTypeFluid //port, with 10mp intent
|
||||
}
|
||||
vf.S[i*vf.Ny+j] = stype
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
func (vf *VelocityField) GetIndex(i, j int) int {
|
||||
return i*vf.Ny + j
|
||||
}
|
||||
Reference in New Issue
Block a user