LINUX.ORG.RU

История изменений

Исправление Obey-Kun, (текущая версия) :

То бишь примерно вот так это сейчас:

void HeatSurface::moveInTime()
{
    // Рассчитываем плотность теплопотока.
    if (mHasBoundaryCondition) {
        switch (mBoundaryCondition->type()) {
        case BoundaryCondition::FirstType:
            mH = (mBoundaryCondition->temperature() - mSoilBlock1->temperature())
                / (mR * mSoilBlock1->invertedEffectiveConductivity());
            break;
        case BoundaryCondition::SecondType:
            mH = mBoundaryCondition->heatFlowDensity();
            break;
        case BoundaryCondition::ThirdType:
            mH = (mBoundaryCondition->temperature() - mSoilBlock1->temperature())
                / (mR * mSoilBlock1->invertedEffectiveConductivity()
                   + mBoundaryCondition->resistivity());
            break;
        default:
            // не должны сюда попасть
            assert(false);
            mH = 0.0; // а это чтоб компилятор не ругался
        }
    } else {
        mH = (mSoilBlock2->temperature() - mSoilBlock1->temperature())
            / (mR1 * mSoilBlock1->invertedEffectiveConductivity()
               + mR2 * mSoilBlock2->invertedEffectiveConductivity());
    }

    // Переводим плотность теплопотока в теплопоток
    mH *= mSquare;
}

void SoilBlock::moveInTime()
{
    for (std::vector<HeatSurfaceContact>::const_iterator it = mHeatSurfaces.begin(); it != mHeatSurfaces.end(); ++it) {
        mEnthalpy += it->h() * mTimeStepPerVolume;
    }
    mEnthalpy += mInternalHeatSourcePowerDensity * mTimeStepPerVolume;
    calcCondition();
    calcIEConductivity();
}

При этом HeatSurfaceContact содержит указатель на HeatSurface (и знак, с которым теплопоток должен добавляться к блоку).

Соответственно, HeatSurface::mSoilBlock1, HeatSurface::mSoilBlock2 и HeatSurface::mBoundaryCondition, а также всё содержимое SoilBlock::mHeatSurfaces должно будет указывать на нечто новое, как это осуществить?

Исходная версия Obey-Kun, :

То бишь примерно вот так это сейчас:

void HeatSurface::moveInTime()
{
    // Рассчитываем плотность теплопотока.
    if (mHasBoundaryCondition) {
        switch (mBoundaryCondition->type()) {
        case BoundaryCondition::FirstType:
            mH = (mBoundaryCondition->temperature() - mSoilBlock1->temperature())
                / (mR * mSoilBlock1->invertedEffectiveConductivity());
            break;
        case BoundaryCondition::SecondType:
            mH = mBoundaryCondition->heatFlowDensity();
            break;
        case BoundaryCondition::ThirdType:
            mH = (mBoundaryCondition->temperature() - mSoilBlock1->temperature())
                / (mR * mSoilBlock1->invertedEffectiveConductivity()
                   + mBoundaryCondition->resistivity());
            break;
        default:
            // не должны сюда попасть
            assert(false);
            h = 0.0; // а это чтоб компилятор не ругался
        }
    } else {
        mH = (mSoilBlock2->temperature() - mSoilBlock1->temperature())
            / (mR1 * mSoilBlock1->invertedEffectiveConductivity()
               + mR2 * mSoilBlock2->invertedEffectiveConductivity());
    }

    // Переводим плотность теплопотока в теплопоток
    mH *= mSquare;
}

void SoilBlock::moveInTime()
{
    for (std::vector<const HeatSurface*>::const_iterator it = mHeatSurfaces.begin(); it != mHeatSurfaces.end(); ++it) {
        mEnthalpy += it->h() * mTimeStepPerVolume;
    }
    mEnthalpy += mInternalHeatSourcePowerDensity * mTimeStepPerVolume;
    calcCondition();
    calcIEConductivity();
}

Соответственно, HeatSurface::mSoilBlock1, HeatSurface::mSoilBlock2 и HeatSurface::mBoundaryCondition, а также всё содержимое SoilBlock::mHeatSurfaces должно будет указывать на нечто новое, как это осуществить?