public void CalculateMass()
        {
            if (tankList == null || !massDirty)
            {
                return;
            }
            massDirty = false;

            double basemass = basemassConst + basemassPV * volume;

            if (basemass >= 0)
            {
                double tankDryMass = tankList
                                     .Where(fuel => fuel.maxAmount > 0 && fuel.utilization > 0)
                                     .Sum(fuel => (float)fuel.maxAmount * fuel.mass / fuel.utilization);

                mass = (float)(basemass + tankDryMass) * MassMult;

                if (part.mass != mass)
                {
                    part.mass = mass;
                    MassChanged(mass);
                    // compute massDelta based on prefab, if available.
                    if ((object)(part.partInfo) != null)
                    {
                        if ((object)(part.partInfo.partPrefab) != null)
                        {
                            massDelta = part.mass - part.partInfo.partPrefab.mass;
                        }
                    }
                }
            }
            else
            {
                mass = part.mass;                 // display dry mass even in this case.
            }

            if (isEditor)
            {
                UsedVolume = tankList
                             .Where(fuel => fuel.maxAmount > 0 && fuel.utilization > 0)
                             .Sum(fuel => fuel.maxAmount / fuel.utilization);

                SIPrefix pfx = volume.GetSIPrefix();
                Func <double, string> formatter = pfx.GetFormatter(volume);
                volumeDisplay = "Avail: " + formatter(AvailableVolume) + pfx.PrefixString() + MFSSettings.unitLabel + " / Tot: " + formatter(volume) + pfx.PrefixString() + MFSSettings.unitLabel;

                double resourceMass = part.Resources.Cast <PartResource> ().Sum(r => r.maxAmount * r.info.density);

                double wetMass = mass + resourceMass;
                massDisplay = "Dry: " + FormatMass(mass) + " / Wet: " + FormatMass((float)wetMass);

                UpdateTweakableMenu();
            }
        }
        public void CalculateMass()
        {
            if (tankList == null || !massDirty)
            {
                return;
            }
            massDirty = false;

            double basemass = basemassConst + basemassPV * (MFSSettings.basemassUseTotalVolume ? totalVolume : volume);

            if (basemass >= 0)
            {
                double tankDryMass = 0;
                for (int i = 0; i < tankList.Count; i++)
                {
                    var tank = tankList[i];
                    tankDryMass += tank.maxAmount * tank.mass / tank.utilization;
                }
                mass = (float)((basemass + tankDryMass) * MassMult);

                // compute massDelta based on prefab, if available.
                if (part.partInfo == null || part.partInfo.partPrefab == null)
                {
                    part.mass = mass;
                    massDelta = 0;
                }
                else
                {
                    massDelta = mass - part.partInfo.partPrefab.mass;
                }
            }
            else
            {
                mass      = part.mass;            // display dry mass even in this case.
                massDelta = 0f;
            }

            if (isEditor)
            {
                UsedVolume = tankList
                             .Where(fuel => fuel.maxAmount > 0 && fuel.utilization > 0)
                             .Sum(fuel => fuel.maxAmount / fuel.utilization);

                double availRounded = AvailableVolume;
                if (Math.Abs(availRounded) < 0.001d)
                {
                    availRounded = 0d;
                }
                string availVolStr = KSPUtil.PrintSI(availRounded, MFSSettings.unitLabel);
                string volStr      = KSPUtil.PrintSI(volume, MFSSettings.unitLabel);
                volumeDisplay = "Avail: " + availVolStr + " / Tot: " + volStr;

                double resourceMass = part.Resources.Cast <PartResource> ().Sum(r => r.maxAmount * r.info.density);

                double wetMass = mass + resourceMass;
                massDisplay = "Dry: " + FormatMass(mass) + " / Wet: " + FormatMass((float)wetMass);

                UpdateTweakableMenu();
            }
        }