Skip to content
Snippets Groups Projects
sfx_esm.h 3.9 KiB
Newer Older
数学の武士's avatar
数学の武士 committed
#pragma once
数学の武士's avatar
数学の武士 committed
#include "sfx_template_parameters.h"
数学の武士's avatar
数学の武士 committed
#include "../includeC/sfx_data.h"
// #include <cstddef>
数学の武士's avatar
数学の武士 committed

数学の武士's avatar
数学の武士 committed
template<typename T, MemType memIn, MemType memOut, MemType RunMem >
数学の武士's avatar
数学の武士 committed
class FluxEsmBase
数学の武士's avatar
数学の武士 committed
{
数学の武士's avatar
数学の武士 committed
protected:
    struct sfxDataVecTypeC sfx;
    struct meteoDataVecTypeC meteo;
    struct sfx_esm_param model_param;
    struct sfx_surface_param surface_param;
    struct sfx_esm_numericsTypeC numerics;
    struct sfx_phys_constants phys_constants;
数学の武士's avatar
数学の武士 committed

数学の武士's avatar
数学の武士 committed
    struct sfxDataVecTypeC* res_sfx;
数学の武士's avatar
数学の武士 committed

    int grid_size;
    bool ifAllocated;
    size_t allocated_size;
public:
数学の武士's avatar
数学の武士 committed
    FluxEsmBase() = default;
    FluxEsmBase(struct sfxDataVecTypeC* sfx,
                struct meteoDataVecTypeC* meteo,
                const struct sfx_esm_param model_param, 
                const struct sfx_surface_param surface_param,
                const struct sfx_esm_numericsTypeC numerics,
                const struct sfx_phys_constants phys_constants,
                const int grid_size);
    ~FluxEsmBase();
};
数学の武士's avatar
数学の武士 committed

数学の武士's avatar
数学の武士 committed
template<typename T, MemType memIn, MemType memOut, MemType RunMem >
class FluxEsm : public FluxEsmBase<T, memIn, memOut, RunMem>
{};

template<typename T, MemType memIn, MemType memOut >
class FluxEsm<T, memIn, memOut, MemType::CPU> : public FluxEsmBase<T, memIn, memOut, MemType::CPU>
{
    using FluxEsmBase<T, memIn, memOut, MemType::CPU>::res_sfx;
    using FluxEsmBase<T, memIn, memOut, MemType::CPU>::sfx;
    using FluxEsmBase<T, memIn, memOut, MemType::CPU>::meteo;
    using FluxEsmBase<T, memIn, memOut, MemType::CPU>::model_param;
    using FluxEsmBase<T, memIn, memOut, MemType::CPU>::surface_param;
    using FluxEsmBase<T, memIn, memOut, MemType::CPU>::numerics;
    using FluxEsmBase<T, memIn, memOut, MemType::CPU>::phys_constants;
    using FluxEsmBase<T, memIn, memOut, MemType::CPU>::grid_size;
    using FluxEsmBase<T, memIn, memOut, MemType::CPU>::ifAllocated;
    using FluxEsmBase<T, memIn, memOut, MemType::CPU>::allocated_size;
public:
    FluxEsm() = default;
    FluxEsm(struct sfxDataVecTypeC* sfx,
                struct meteoDataVecTypeC* meteo,
                const struct sfx_esm_param model_param, 
                const struct sfx_surface_param surface_param,
                const struct sfx_esm_numericsTypeC numerics,
                const struct sfx_phys_constants phys_constants,
                const int grid_size) : FluxEsmBase<T, memIn, memOut, MemType::CPU>(sfx, meteo, 
                model_param, surface_param, numerics, phys_constants, grid_size) {};
    ~FluxEsm() = default;
    void compute_flux();
};
数学の武士's avatar
数学の武士 committed

数学の武士's avatar
数学の武士 committed
#ifdef INCLUDE_CUDA
template<typename T, MemType memIn, MemType memOut >
class FluxEsm<T, memIn, memOut, MemType::GPU> : public FluxEsmBase<T, memIn, memOut, MemType::GPU>
{
    using FluxEsmBase<T, memIn, memOut, MemType::GPU>::res_sfx;
    using FluxEsmBase<T, memIn, memOut, MemType::GPU>::sfx;
    using FluxEsmBase<T, memIn, memOut, MemType::GPU>::meteo;
    using FluxEsmBase<T, memIn, memOut, MemType::GPU>::model_param;
    using FluxEsmBase<T, memIn, memOut, MemType::GPU>::surface_param;
    using FluxEsmBase<T, memIn, memOut, MemType::GPU>::numerics;
    using FluxEsmBase<T, memIn, memOut, MemType::GPU>::phys_constants;
    using FluxEsmBase<T, memIn, memOut, MemType::GPU>::grid_size;
    using FluxEsmBase<T, memIn, memOut, MemType::GPU>::ifAllocated;
    using FluxEsmBase<T, memIn, memOut, MemType::GPU>::allocated_size;
public:
    FluxEsm() = default;
    FluxEsm(struct sfxDataVecTypeC* sfx,
                struct meteoDataVecTypeC* meteo,
                const struct sfx_esm_param model_param, 
                const struct sfx_surface_param surface_param,
                const struct sfx_esm_numericsTypeC numerics,
                const struct sfx_phys_constants phys_constants,
                const int grid_size) : FluxEsmBase<T, memIn, memOut, MemType::GPU>(sfx, meteo, 
                model_param, surface_param, numerics, phys_constants, grid_size) {};
    ~FluxEsm() = default;
    void compute_flux();
};
#endif