rnatm

Load and structure data describing an atmosphere
git clone git://git.meso-star.fr/rnatm.git
Log | Files | Refs | README | LICENSE

commit 287a8e698759a1289fa6362deb31b8e4e5947f62
parent d027c2ef0473a7a7dbd7e5a3fc8d918ea395b66a
Author: Vincent Forest <vincent.forest@meso-star.com>
Date:   Wed,  8 Mar 2023 22:06:54 +0100

Fix voxel accumulation

Once voxelized, the aerosol voxels are accumulated with those of the gas
(and already accumulated aerosols). However, until now, these voxels
were always accumulated, without checking if they were empty (i.e. kmin
> kmax), which resulted in "emptying" the current voxel.

Diffstat:
Msrc/rnatm_voxel.h | 23++++++++++++-----------
1 file changed, 12 insertions(+), 11 deletions(-)

diff --git a/src/rnatm_voxel.h b/src/rnatm_voxel.h @@ -63,18 +63,19 @@ voxel_clear(float* voxel) static FINLINE void voxel_accum(float* dst, const float* src) { - #define ACCUM(K, Op) \ - dst[voxel_idata((K), (Op))] += src[voxel_idata((K), (Op))] - ACCUM(RNATM_RADCOEF_Ka, RNATM_SVX_OP_MAX); - ACCUM(RNATM_RADCOEF_Ks, RNATM_SVX_OP_MAX); - #undef ACCUM + const size_t ka_min = voxel_idata(RNATM_RADCOEF_Ka, RNATM_SVX_OP_MIN); + const size_t ka_max = voxel_idata(RNATM_RADCOEF_Ka, RNATM_SVX_OP_MAX); + const size_t ks_min = voxel_idata(RNATM_RADCOEF_Ks, RNATM_SVX_OP_MIN); + const size_t ks_max = voxel_idata(RNATM_RADCOEF_Ks, RNATM_SVX_OP_MAX); + ASSERT(dst && src); - #define ACCUM(K, Op) \ - dst[voxel_idata((K), (Op))] = MMIN \ - (src[voxel_idata((K), (Op))], dst[voxel_idata((K), (Op))]) - ACCUM(RNATM_RADCOEF_Ka, RNATM_SVX_OP_MIN); - ACCUM(RNATM_RADCOEF_Ks, RNATM_SVX_OP_MIN); - #undef ACCUM + if(src[ka_max] < src[ka_min]) return; /* Discard empty voxel */ + ASSERT(src[ks_max] >= src[ks_min]); + + dst[ka_max] += src[ka_max]; + dst[ks_max] += src[ks_max]; + dst[ka_min] = MMIN(dst[ka_min], src[ka_min]); + dst[ks_min] = MMIN(dst[ks_min], src[ks_min]); } #endif /* RNATM_VOXEL_H */