#include "../includeCXX/model_base.h" #ifdef INCLUDE_CUDA #include "../includeCU/sfx_memory_processing.cuh" #endif #include "../includeCXX/sfx_memory_processing.h" 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