alchemyst/engine/matertals/properties.go
2024-04-22 13:52:17 +03:00

83 lines
2.8 KiB
Go

package matertals
import "github.com/rs/zerolog/log"
type MaterialProperties struct {
Density float64 //Плотность (кг / м3)
Tougnness float64 //Ударная вязкость, мера скорости поглощения энергии без деформаций, джоули на квадратный метр в секунду
Brittleness float64 //Хрупкость - обратная пластичности (в основном за счет внешних эффектов), джоули на квадртаный метр, после которых раскол
MeltingPoint float64 //точка перехода из твердого в жидкое, градусы Цельсия при нормальном давлении
BoilingPoint float64 //точка кипения - из жидкого в газ, градусы Цельсия при нормальном давлении
Conductivity bool //проводимость эл. тока
}
//агрегатное состояние
type MatterState int
const (
Solid MatterState = iota //кристаллическая решетка
Liquid
Gas
Plasma
Glass //нет кристаллической решетки, аморфный
)
var transitions = map[MatterState][]MatterState{
Solid: {Liquid, Gas},
Liquid: {Solid, Gas, Glass},
Gas: {Solid, Plasma},
Plasma: {Gas},
Glass: {Liquid},
}
func (ms MatterState) Change(from MatterState, to MatterState) bool {
if from == to {
return true
}
_, ok := transitions[from]
if ok {
newStateFound := func(lst []MatterState, to MatterState) bool {
for _, b := range lst {
if b == to {
return true
}
}
return false
}(transitions[from], to)
if !newStateFound {
log.Warn().Msgf(`Transition %d -> %d is impossible`, from, to)
return false
}
// check temperatures/conditions, see template
/*
Solid -> Gas Sublimation
Solid -> Liquid Melting
Liquid -> Gas Boiling
Liquid -> Solid Freezing
Gas -> Solid Deposition
Gas -> Liquid Condensation
Gas -> Plasma Ionization
Plasma -> Gas Recombination
*/
}
//При фазовом переходе первого рода скачкообразно изменяются самые главные, первичные экстенсивные параметры:
// удельный объём,
// количество запасённой внутренней энергии,
// концентрация компонентов и т. п.
//
// Фазовые переходы второго рода происходят в тех случаях, когда меняется симметрия строения вещества
// (симметрия может полностью исчезнуть или понизиться).
return true
}