Skip to content
Snippets Groups Projects
model_base.cpp 4.97 KiB
Newer Older
数学の武士's avatar
数学の武士 committed
#include "model_base.h"
数学の武士's avatar
数学の武士 committed

#ifdef INCLUDE_CUDA
数学の武士's avatar
数学の武士 committed
    #include "sfx_memory_processing.cuh"
数学の武士's avatar
数学の武士 committed
#endif
数学の武士's avatar
数学の武士 committed
#include "sfx_memory_processing.h"
数学の武士's avatar
数学の武士 committed

template<typename T, MemType memIn, MemType memOut, MemType RunMem >
ModelBase<T, memIn, memOut, RunMem>::ModelBase(sfxDataVecTypeC* sfx_in,
                meteoDataVecTypeC* meteo_in,
                const int grid_size_in)
{
    ifAllocated = false;
    grid_size = grid_size_in;

    if(RunMem != memOut)
        res_sfx = sfx_in;
    else
        res_sfx = nullptr;
    
    if(RunMem != memIn)
    {
        const size_t new_size = grid_size * sizeof(T);

        allocated_size = 0;
        memproc::realloc<RunMem>((void *&)(meteo.U), allocated_size, new_size);
        memproc::memcopy<RunMem, memIn>(meteo.U, meteo_in->U, new_size);
        allocated_size = 0;
        memproc::realloc<RunMem>((void *&)(meteo.dT), allocated_size, new_size);
        memproc::memcopy<RunMem, memIn>(meteo.dT, meteo_in->dT, new_size);
        allocated_size = 0;
        memproc::realloc<RunMem>((void *&)(meteo.Tsemi), allocated_size, new_size);
        memproc::memcopy<RunMem, memIn>(meteo.Tsemi, meteo_in->Tsemi, new_size);
        allocated_size = 0;
        memproc::realloc<RunMem>((void *&)(meteo.dQ), allocated_size, new_size);
        memproc::memcopy<RunMem, memIn>(meteo.dQ, meteo_in->dQ, new_size);
        allocated_size = 0;
        memproc::realloc<RunMem>((void *&)(meteo.h), allocated_size, new_size);
        memproc::memcopy<RunMem, memIn>(meteo.h, meteo_in->h, new_size);
        allocated_size = 0;
        memproc::realloc<RunMem>((void *&)(meteo.z0_m), allocated_size, new_size);
        memproc::memcopy<RunMem, memIn>(meteo.z0_m, meteo_in->z0_m, new_size);

        ifAllocated = true;
    }
    else
    {
        meteo = *meteo_in;
    }

    if(RunMem != memOut)
    {
        const size_t new_size = grid_size * sizeof(T);
        allocated_size = 0;
        memproc::realloc<RunMem>((void *&)(sfx.zeta), allocated_size, new_size);
        allocated_size = 0;
        memproc::realloc<RunMem>((void *&)(sfx.Rib), allocated_size, new_size);
        allocated_size = 0;
        memproc::realloc<RunMem>((void *&)(sfx.Re), allocated_size, new_size);
        allocated_size = 0;
        memproc::realloc<RunMem>((void *&)(sfx.Rib_conv_lim), allocated_size, new_size);
        allocated_size = 0;
        memproc::realloc<RunMem>((void *&)(sfx.z0_m), allocated_size, new_size);
        allocated_size = 0;
        memproc::realloc<RunMem>((void *&)(sfx.z0_t), allocated_size, new_size);
        allocated_size = 0;
        memproc::realloc<RunMem>((void *&)(sfx.B), allocated_size, new_size);
        allocated_size = 0;
        memproc::realloc<RunMem>((void *&)(sfx.Cm), allocated_size, new_size);
        allocated_size = 0;
        memproc::realloc<RunMem>((void *&)(sfx.Ct), allocated_size, new_size);
        allocated_size = 0;
        memproc::realloc<RunMem>((void *&)(sfx.Km), allocated_size, new_size);
        allocated_size = 0;
        memproc::realloc<RunMem>((void *&)(sfx.Pr_t_inv), allocated_size, new_size);

        ifAllocated = true;
    }
    else
    {
        sfx = *sfx_in;
    }
}

template<typename T, MemType memIn, MemType memOut, MemType RunMem >
ModelBase<T, memIn, memOut, RunMem>::~ModelBase()
{
    if(ifAllocated == true)
    {
        if(RunMem != memIn)
        {    
            memproc::dealloc<RunMem>((void*&)meteo.U);
            memproc::dealloc<RunMem>((void*&)meteo.dT);
            memproc::dealloc<RunMem>((void*&)meteo.Tsemi);
            memproc::dealloc<RunMem>((void*&)meteo.dQ);
            memproc::dealloc<RunMem>((void*&)meteo.h);
            memproc::dealloc<RunMem>((void*&)meteo.z0_m);
        }
        if(RunMem != memOut)
        {
            memproc::dealloc<RunMem>((void*&)sfx.zeta);
            memproc::dealloc<RunMem>((void*&)sfx.Rib);
            memproc::dealloc<RunMem>((void*&)sfx.Re);
            memproc::dealloc<RunMem>((void*&)sfx.Rib_conv_lim);
            memproc::dealloc<RunMem>((void*&)sfx.z0_m);
            memproc::dealloc<RunMem>((void*&)sfx.z0_t);
            memproc::dealloc<RunMem>((void*&)sfx.B);
            memproc::dealloc<RunMem>((void*&)sfx.Cm);
            memproc::dealloc<RunMem>((void*&)sfx.Ct);
            memproc::dealloc<RunMem>((void*&)sfx.Km);
            memproc::dealloc<RunMem>((void*&)sfx.Pr_t_inv);
        }

        ifAllocated = false;
        allocated_size = 0;
    }
}

template class ModelBase<float, MemType::CPU, MemType::CPU, MemType::CPU>;
#ifdef INCLUDE_CUDA
    template class ModelBase<float, MemType::GPU, MemType::GPU, MemType::GPU>;
    template class ModelBase<float, MemType::GPU, MemType::GPU, MemType::CPU>;
    template class ModelBase<float, MemType::GPU, MemType::CPU, MemType::GPU>;
    template class ModelBase<float, MemType::CPU, MemType::GPU, MemType::GPU>;
    template class ModelBase<float, MemType::CPU, MemType::CPU, MemType::GPU>;
    template class ModelBase<float, MemType::CPU, MemType::GPU, MemType::CPU>;
    template class ModelBase<float, MemType::GPU, MemType::CPU, MemType::CPU>;
#endif