近日,在玩某整合包的时,强迫症犯了,盐水的产量和锂的产量没有办法做到一个较好的配比。mcmod,ftbwiki什么都看了一圈也没个公式。由于整合包发电、合成等套娃很多,也无法通过直接拉满产量的方式以绝后患,遂出此篇文章。

【拯救强迫症】Mek热力蒸馏塔产量&热量计算-第1张图片

【拯救强迫症】Mek热力蒸馏塔产量&热量计算-第2张图片


幸好,Mek是开源的,我们在源码中找到了这样一行:

MekanismLang.FLUID_PRODUCTION.translate(Math.round(multiblock.lastGain * 100D) / 100D));

产出由lastGain获取,进而发现

if (tempMultiplier > 0 && tempMultiplier < 1) {
                          lastGain = 1F / (int) Math.ceil(1 / tempMultiplier);
                      } else {
                          lastGain = tempMultiplier;
                      }

好家伙你也套娃

 tempMultiplier = (Math.min(MAX_MULTIPLIER_TEMP, getTemperature()) - HeatAPI.AMBIENT_TEMP) * MekanismConfig.general.evaporationTempMultiplier.get() *
                         ((double) height() / MAX_HEIGHT);

在Mek的配置文件(Config)中可以找到

    # Temperature to amount produced ratio for Thermal Evaporation Tower.
    D:EvaporationTempMultiplier=0.1
    
    # Max Temperature of the Thermal Evaporation Tower.
    D:EvaporationMaxTemp=3000.0

此外一个常量的定义是

public static final double AMBIENT_TEMP = 300;

以上均为源码,翻译一下,产量的计算公式为:

产量=(温度-300)*0.1*(蒸馏塔高度/18) 结果四舍五入保留两位小数

温度单位为K,最大高度为18,温度最高可以达到3300K,所以最高产量是3000*0.1*1=300mB/t

将上方两张图数据代入:

(336.85-300)*0.1*(5/18)=1.02361,四舍五入后就是1.02

(925.1-300)*0.1*(3/18)=10.4183,四舍五入后就是10.42

与图上结果是相符的

配置文件中的EvaporationTempMultiplier即为算式中的0.1倍率项,修改此项可以直接提高产量,并等倍放大产量的最大量

配置文件中的EvaporationMaxTemp是算式中 温度可以达到的最高值-300 ,将温度上限提高可以提高产量的最大量


但我光知道产量没用啊,温度怎么控制?有电阻加热/太阳能加热/热力加热等多种方式(注意后面两个均是MekG这个附属加的)

public double getTemperature() {
        return getHeat() / getHeatCapacity();
    }

public double getHeat() {
        initStoredHeat();
        return storedHeat;
    }
 
private void initStoredHeat() {
        if (storedHeat == -1) {
            //If the stored heat hasn't been initialized yet, update the stored heat based on initial capacity
            storedHeat = heatCapacity * getAmbientTemperature();
        }
    }

protected double getAmbientTemperature() {
        return ambientTempSupplier == null ? HeatAPI.AMBIENT_TEMP : ambientTempSupplier.getAsDouble();
    }

public static final double AMBIENT_TEMP = 300;

public double getAsDouble() {
        return getTemperature(null);
    }

public double getTemperature(@Nullable Direction side) {
        int index = side == null ? EnumUtils.DIRECTIONS.length : side.ordinal();
        double biomeAmbientTemp = ambientTemperature[index];
        if (biomeAmbientTemp == -1) {
            World world = worldSupplier.get();
            if (world == null) {
                return HeatAPI.AMBIENT_TEMP;
            }
            BlockPos pos = positionSupplier.get();
            if (side != null) {
                pos = pos.relative(side);
            }
            return ambientTemperature[index] = HeatAPI.getAmbientTemp(world, pos);
        }
        return biomeAmbientTemp;
    }

public static double getAmbientTemp(@Nullable IWorldReader world, BlockPos pos) {
        if (world == null) {
            return AMBIENT_TEMP;
        }
        return getAmbientTemp(world.getBiome(pos).getTemperature(pos));
    }
    
public static double getAmbientTemp(double biomeTemp) {
        //See implementation note about this range. If any other mods do have valid more extreme temperatures,
        // we may want to consider expanding this range to [-10, 10]
        biomeTemp = Math.max(Math.min(biomeTemp, 5), -5);
        return AMBIENT_TEMP + 25 * (biomeTemp - 0.8);
    }

到这里的话才一半,仅能看到群系温度计算,而另一半是HeatCapacity

看了一圈,我没找到具体的代码...


我知道,没人喜欢看源码,但源码是必须的,但以下内容不全部是通过源码获得的(因为存疑)

关于温度,其中一个重要的数值便是群系的温度,这个可以直接通过查询wiki的方式知晓,例如沙漠是2.0

这会直接影响你摆出来的热力蒸馏塔的初始温度,初始温度=300 + 25 * (群系温度 - 0.8)

在沙漠中是330K;平原温度是0.8,但结果是306K;森林里换个位置温度就不一样,这具体是什么原因我暂且蒙在鼓里,为什么不符合公式我也没明白

具体产热:

电阻加热装置在1000RF/t的情况下,温度平衡时的温度流失为2.49K/t,此时电阻空转温度为4585.4K+300K=488.5K

1个电阻加热装置与热力蒸馏塔相连的情况下,设置为10RF/t,热力蒸馏塔的流失为8.31mK/t,电阻加热装置流失为67.96uK/t,蒸馏塔的温度为307.54K;100RF/T,热力蒸馏塔流失为83.09mK/t,电阻加热装置流失为679.65uK/t,蒸馏塔温度为461.26K

3*83.09+0.67965=24.91965 这样计算的话流失与空转时的流失较为符合

10RF/t的耗电会提高1.54K的温度,每多加一台10RF/的电阻加热装置提高1.54K的温度,100RF/T的耗电提高155.26K的温度


果然还只是半人半灵的半吊子吗?哎