atrstm

Load and structure a combustion gas mixture
git clone git://git.meso-star.fr/atrstm.git
Log | Files | Refs | README | LICENSE

test_atrstm_radcoefs_simd.c (5483B)


      1 /* Copyright (C) 2022, 2023 |Méso|Star> (contact@meso-star.com)
      2  * Copyright (C) 2020, 2021 Centre National de la Recherche Scientifique
      3  *
      4  * This program is free software: you can redistribute it and/or modify
      5  * it under the terms of the GNU General Public License as published by
      6  * the Free Software Foundation, either version 3 of the License, or
      7  * (at your option) any later version.
      8  *
      9  * This program is distributed in the hope that it will be useful,
     10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
     11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
     12  * GNU General Public License for more details.
     13  *
     14  * You should have received a copy of the GNU General Public License
     15  * along with this program. If not, see <http://www.gnu.org/licenses/>. */
     16 
     17 #include "atrstm_radcoefs_simd4.h"
     18 
     19 int
     20 main(int argc, char** argv)
     21 {
     22   const double ka_ref = 5.7382401729092799E-1;
     23   const double ks_ref = 7.2169062018378995E-6;
     24 
     25   const double ka_ref2[4] = {
     26     0.52178067472799794,
     27     0.52178067472799794,
     28     1.0435613494559959,
     29     0.52178067472799794
     30   };
     31   const double ks_ref2[4] = {
     32     9.6010140939975883e-002,
     33     3.3272961678492224e-002,
     34     0.19202028187995177,
     35     9.9964602374815484e-002
     36   };
     37   struct radcoefs_simd4 radcoefs = RADCOEFS_SIMD4_NULL;
     38   struct radcoefs_compute_simd4_args args = RADCOEFS_COMPUTE_SIMD4_ARGS_NULL;
     39   float ALIGN(16) ka[4], ks[4], kext[4];
     40   (void)argc, (void)argv;
     41 
     42   args.lambda = v4f_set1(633.f);
     43   args.n = v4f_set1(1.90f);
     44   args.kappa = v4f_set1(0.55f);
     45   args.fractal_prefactor = v4f_set1(1.70f);
     46   args.fractal_dimension = v4f_set1(1.75f);
     47   args.soot_volumic_fraction = v4f_set(1e-7f, 0.f, 1e-7f, 1e-7f);
     48   args.soot_primary_particles_count = v4f_set(100.f, 100.f, 0.f, 100.f);
     49   args.soot_primary_particles_diameter = v4f_set1(1.f);
     50   args.radcoefs_mask = ATRSTM_RADCOEFS_MASK_ALL;
     51 
     52   radcoefs_compute_simd4(&radcoefs, &args);
     53 
     54   v4f_store(ka, radcoefs.ka);
     55   v4f_store(ks, radcoefs.ks);
     56   v4f_store(kext, radcoefs.kext);
     57   printf("ka = {%g, %g, %g, %g}; ks = {%g, %g, %g, %g}\n",
     58     SPLIT4(ka), SPLIT4(ks));
     59 
     60   CHK(eq_eps(ka[0], ka_ref, ka_ref*1.e-6));
     61   CHK(eq_eps(ka[3], ka_ref, ka_ref*1.e-6));
     62   CHK(ka[1] == 0);
     63   CHK(ka[2] == 0);
     64 
     65   CHK(eq_eps(ks[0], ks_ref, ks_ref*1.e-6));
     66   CHK(eq_eps(ks[3], ks_ref, ks_ref*1.e-6));
     67   CHK(ks[1] == 0);
     68   CHK(ks[2] == 0);
     69 
     70   CHK(eq_eps(kext[0], ka_ref+ks_ref, (ka_ref+ks_ref)*1e-6));
     71   CHK(eq_eps(kext[3], ka_ref+ks_ref, (ka_ref+ks_ref)*1e-6));
     72   CHK(kext[1] == 0);
     73   CHK(kext[2] == 0);
     74 
     75   args.radcoefs_mask = ATRSTM_RADCOEF_FLAG_Ka;
     76   radcoefs_compute_simd4(&radcoefs, &args);
     77   v4f_store(ka, radcoefs.ka);
     78   v4f_store(ks, radcoefs.ks);
     79   v4f_store(kext, radcoefs.kext);
     80   CHK(eq_eps(ka[0], ka_ref, ka_ref*1.e-6));
     81   CHK(eq_eps(ka[3], ka_ref, ka_ref*1.e-6));
     82   CHK(ka[1] == 0);
     83   CHK(ka[2] == 0);
     84   CHK(ks[0] == 0 && ks[1] == 0 && ks[2] == 0 && ks[0] == 0);
     85   CHK(kext[0] == 0 && kext[1] == 0 && kext[2] == 0 && kext[0] == 0);
     86 
     87   args.radcoefs_mask = ATRSTM_RADCOEF_FLAG_Ks;
     88   radcoefs_compute_simd4(&radcoefs, &args);
     89   v4f_store(ka, radcoefs.ka);
     90   v4f_store(ks, radcoefs.ks);
     91   v4f_store(kext, radcoefs.kext);
     92   CHK(eq_eps(ks[0], ks_ref, ks_ref*1.e-6));
     93   CHK(eq_eps(ks[3], ks_ref, ks_ref*1.e-6));
     94   CHK(ks[1] == 0);
     95   CHK(ks[2] == 0);
     96   CHK(ka[0] == 0 && ka[1] == 0 && ka[2] == 0 && ka[0] == 0);
     97   CHK(kext[0] == 0 && kext[1] == 0 && kext[2] == 0 && kext[0] == 0);
     98 
     99   /* Note that actually even though Ka and Ks are note required they are
    100    * internally computed to evaluate kext and are returned to the caller. Their
    101    * value are thus not null */
    102   args.radcoefs_mask = ATRSTM_RADCOEF_FLAG_Kext;
    103   radcoefs_compute_simd4(&radcoefs, &args);
    104   v4f_store(kext, radcoefs.kext);
    105   CHK(eq_eps(kext[0], ka_ref+ks_ref, (ka_ref+ks_ref)*1e-6));
    106   CHK(eq_eps(kext[3], ka_ref+ks_ref, (ka_ref+ks_ref)*1e-6));
    107   CHK(kext[1] == 0);
    108   CHK(kext[2] == 0);
    109 
    110   args.lambda = v4f_set1(633.f);
    111   args.n = v4f_set1(1.75f);
    112   args.kappa = v4f_set1(0.435f);
    113   args.fractal_prefactor = v4f_set1(1.70f);
    114   args.fractal_dimension = v4f_set1(1.75f);
    115   args.soot_volumic_fraction = v4f_set
    116     (9.9999999999999995e-008f,
    117      9.9999999999999995e-008f,
    118      1.9999999999999999e-007f,
    119      9.9999999999999995e-008f);
    120   args.soot_primary_particles_count = v4f_set
    121     (400.f,
    122      400.f,
    123      400.f,
    124      800.f);
    125   args.soot_primary_particles_diameter = v4f_set
    126     (34.000000006413003f,
    127      17.000000003206502f,
    128      34.000000006413003f,
    129      34.000000006413003f);
    130   args.radcoefs_mask = ATRSTM_RADCOEFS_MASK_ALL;
    131   radcoefs_compute_simd4(&radcoefs, &args);
    132   v4f_store(ka, radcoefs.ka);
    133   v4f_store(ks, radcoefs.ks);
    134   v4f_store(kext, radcoefs.kext);
    135   printf("ka = {%g, %g, %g, %g}; ks = {%g, %g, %g, %g}\n",
    136     SPLIT4(ka), SPLIT4(ks));
    137   CHK(eq_eps(ka[0], ka_ref2[0], ka_ref2[0]*1.e-6));
    138   CHK(eq_eps(ka[1], ka_ref2[1], ka_ref2[1]*1.e-6));
    139   CHK(eq_eps(ka[2], ka_ref2[2], ka_ref2[2]*1.e-6));
    140   CHK(eq_eps(ka[3], ka_ref2[3], ka_ref2[3]*1.e-6));
    141   CHK(eq_eps(ks[0], ks_ref2[0], ks_ref2[0]*1.e-6));
    142   CHK(eq_eps(ks[1], ks_ref2[1], ks_ref2[1]*1.e-6));
    143   CHK(eq_eps(ks[2], ks_ref2[2], ks_ref2[2]*1.e-6));
    144   CHK(eq_eps(ks[3], ks_ref2[3], ks_ref2[3]*1.e-6));
    145   CHK(eq_eps(kext[0], ka_ref2[0]+ks_ref2[0], (ka_ref2[0]+ks_ref2[0])*1.e-6));
    146   CHK(eq_eps(kext[1], ka_ref2[1]+ks_ref2[1], (ka_ref2[1]+ks_ref2[1])*1.e-6));
    147   CHK(eq_eps(kext[2], ka_ref2[2]+ks_ref2[2], (ka_ref2[2]+ks_ref2[2])*1.e-6));
    148   CHK(eq_eps(kext[3], ka_ref2[3]+ks_ref2[3], (ka_ref2[3]+ks_ref2[3])*1.e-6));
    149 
    150   return 0;
    151 }
    152