/* Copyright (C) 2024 INAF - Osservatorio Astronomico di Cagliari This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. A copy of the GNU General Public License is distributed along with this program in the COPYING file. If not, see: . */ /*! \file outputs.cpp * * \brief Implementation of the code output format system. */ #include #include #include #include #include #ifdef USE_MPI #ifndef MPI_VERSION #include #endif #endif #ifndef INCLUDE_ERRORS_H_ #include "../include/errors.h" #endif #ifndef INCLUDE_LIST_H_ #include "../include/List.h" #endif #ifndef INCLUDE_TYPES_H_ #include "../include/types.h" #endif #ifndef INCLUDE_CONFIGURATION_H_ #include "../include/Configuration.h" #endif #ifndef INCLUDE_FILE_IO_H_ #include "../include/file_io.h" #endif #ifndef INCLUDE_OUTPUTS_H_ #include "../include/outputs.h" #endif using namespace std; // >>> ClusterOutputInfo CLASS IMPLEMENTATION <<< ClusterOutputInfo::ClusterOutputInfo( ScattererConfiguration *sc, GeometryConfiguration *gc, const mixMPI *mpidata, int first_xi, int xi_length ) { nsph = gc->number_of_spheres; li = gc->li; le = gc->le; lm = gc->l_max; mxndm = gc->mxndm; inpol = gc->in_pol; npnt = gc->npnt; npntts = gc->npntts; iavm = gc->iavm; isam = gc->isam; jwtm = gc->jwtm; // Get spherical constituent coordinates vec_x_coords = new double[nsph]; vec_y_coords = new double[nsph]; vec_z_coords = new double[nsph]; for (int nsi = 0; nsi < nsph; nsi++) { vec_x_coords[nsi] = gc->get_sph_x(nsi); vec_y_coords[nsi] = gc->get_sph_y(nsi); vec_z_coords[nsi] = gc->get_sph_z(nsi); } // Get directional information th = gc->in_theta_start; thstp = gc->in_theta_step; thlst = gc->in_theta_end; ths = gc->sc_theta_start; thsstp = gc->sc_theta_step; thslst = gc->sc_theta_end; _num_theta = (thstp == 0.0) ? 1 : 1 + int((thlst - th) / thstp); _num_thetas = (thsstp == 0.0) ? 1 : 1 + int((thslst - ths) / thsstp); ph = gc->in_phi_start; phstp = gc->in_phi_step; phlst = gc->in_phi_end; phs = gc->sc_phi_start; phsstp = gc->sc_phi_step; phslst = gc->sc_phi_end; _num_phi = (phstp == 0.0) ? 1 : 1 + int((phlst - ph) / phstp); _num_phis = (phsstp == 0.0) ? 1 : 1 + int((phslst - phs) / phsstp); ndirs = _num_theta * _num_thetas * _num_phi * _num_phis; // Get scattering problem configuration double exdc = sc->exdc; exri = sqrt(exdc); idfc = sc->idfc; nxi = sc->number_of_scales; _first_xi = first_xi; xi_block_size = (xi_length == 0) ? nxi - (_first_xi - 1) : xi_length; vec_jxi = new int[xi_block_size](); vec_ier = new short[xi_block_size](); vec_vk = new double[xi_block_size](); vec_xi = new double[xi_block_size](); configurations = sc->configurations; vec_sphere_sizes = new double[xi_block_size * configurations](); vec_sphere_ref_indices = new dcomplex[xi_block_size * configurations](); vec_sphere_scs = new double[xi_block_size * configurations](); vec_sphere_abs = new double[xi_block_size * configurations](); vec_sphere_exs = new double[xi_block_size * configurations](); vec_sphere_albs = new double[xi_block_size * configurations](); vec_sphere_sqscs = new double[xi_block_size * configurations](); vec_sphere_sqabs = new double[xi_block_size * configurations](); vec_sphere_sqexs = new double[xi_block_size * configurations](); vec_fsas = new dcomplex[xi_block_size * configurations](); vec_qschus = new double[xi_block_size * configurations](); vec_pschus = new double[xi_block_size * configurations](); vec_s0mags = new double[xi_block_size * configurations](); vec_cosavs = new double[xi_block_size * configurations](); vec_raprs = new double[xi_block_size * configurations](); vec_tqek1 = new double[xi_block_size * configurations](); vec_tqsk1 = new double[xi_block_size * configurations](); vec_tqek2 = new double[xi_block_size * configurations](); vec_tqsk2 = new double[xi_block_size * configurations](); vec_fsat = new dcomplex[xi_block_size](); vec_qschut = new double[xi_block_size](); vec_pschut = new double[xi_block_size](); vec_s0magt = new double[xi_block_size](); tgs = 0.0; vec_scc1 = new double[xi_block_size](); vec_scc2 = new double[xi_block_size](); vec_abc1 = new double[xi_block_size](); vec_abc2 = new double[xi_block_size](); vec_exc1 = new double[xi_block_size](); vec_exc2 = new double[xi_block_size](); vec_albedc1 = new double[xi_block_size](); vec_albedc2 = new double[xi_block_size](); vec_qscamc1 = new double[xi_block_size](); vec_qscamc2 = new double[xi_block_size](); vec_qabsmc1 = new double[xi_block_size](); vec_qabsmc2 = new double[xi_block_size](); vec_qextmc1 = new double[xi_block_size](); vec_qextmc2 = new double[xi_block_size](); vec_sccrt1 = new double[xi_block_size](); vec_sccrt2 = new double[xi_block_size](); vec_abcrt1 = new double[xi_block_size](); vec_abcrt2 = new double[xi_block_size](); vec_excrt1 = new double[xi_block_size](); vec_excrt2 = new double[xi_block_size](); vec_fsac11 = new dcomplex[xi_block_size](); vec_fsac21 = new dcomplex[xi_block_size](); vec_fsac22 = new dcomplex[xi_block_size](); vec_fsac12 = new dcomplex[xi_block_size](); vec_qschuc1 = new double[xi_block_size](); vec_qschuc2 = new double[xi_block_size](); vec_pschuc1 = new double[xi_block_size](); vec_pschuc2 = new double[xi_block_size](); vec_s0magc1 = new double[xi_block_size](); vec_s0magc2 = new double[xi_block_size](); vec_cosavc1 = new double[xi_block_size](); vec_cosavc2 = new double[xi_block_size](); vec_raprc1 = new double[xi_block_size](); vec_raprc2 = new double[xi_block_size](); vec_fkc1 = new double[xi_block_size](); vec_fkc2 = new double[xi_block_size](); vec_dir_tidg = new double[_num_theta]; vec_dir_pidg = new double[_num_phi]; vec_dir_tsdg = new double[_num_thetas]; vec_dir_psdg = new double[_num_phis]; // Initialize directions (they are scale-independent) double cti = th, cpi = ph, cts = ths, cps = phs; for (int di = 0; di < _num_theta; di++) { vec_dir_tidg[di] = cti; cti += thstp; } for (int di = 0; di < _num_thetas; di++) { vec_dir_tsdg[di] = cts; cts += thsstp; } for (int di = 0; di < _num_phi; di++) { vec_dir_pidg[di] = cpi; cpi += phstp; } for (int di = 0; di < _num_phis; di++) { vec_dir_psdg[di] = cps; cps += phsstp; } vec_dir_scand = new double[ndirs](); vec_dir_cfmp = new double[ndirs](); vec_dir_sfmp = new double[ndirs](); vec_dir_cfsp = new double[ndirs](); vec_dir_sfsp = new double[ndirs](); vec_dir_un = new double[3 * ndirs](); vec_dir_uns = new double[3 * ndirs](); vec_dir_sas11 = new dcomplex[ndirs * configurations * xi_block_size](); vec_dir_sas21 = new dcomplex[ndirs * configurations * xi_block_size](); vec_dir_sas12 = new dcomplex[ndirs * configurations * xi_block_size](); vec_dir_sas22 = new dcomplex[ndirs * configurations * xi_block_size](); vec_dir_muls = new double[16 * ndirs * configurations * xi_block_size](); vec_dir_mulslr = new double[16 * ndirs * configurations * xi_block_size](); vec_dir_sat11 = new dcomplex[ndirs * xi_block_size](); vec_dir_sat21 = new dcomplex[ndirs * xi_block_size](); vec_dir_sat12 = new dcomplex[ndirs * xi_block_size](); vec_dir_sat22 = new dcomplex[ndirs * xi_block_size](); vec_dir_scc1 = new double[ndirs * xi_block_size](); vec_dir_scc2 = new double[ndirs * xi_block_size](); vec_dir_abc1 = new double[ndirs * xi_block_size](); vec_dir_abc2 = new double[ndirs * xi_block_size](); vec_dir_exc1 = new double[ndirs * xi_block_size](); vec_dir_exc2 = new double[ndirs * xi_block_size](); vec_dir_albedc1 = new double[ndirs * xi_block_size](); vec_dir_albedc2 = new double[ndirs * xi_block_size](); vec_dir_qscc1 = new double[ndirs * xi_block_size](); vec_dir_qscc2 = new double[ndirs * xi_block_size](); vec_dir_qabc1 = new double[ndirs * xi_block_size](); vec_dir_qabc2 = new double[ndirs * xi_block_size](); vec_dir_qexc1 = new double[ndirs * xi_block_size](); vec_dir_qexc2 = new double[ndirs * xi_block_size](); vec_dir_sccrt1 = new double[ndirs * xi_block_size](); vec_dir_sccrt2 = new double[ndirs * xi_block_size](); vec_dir_abcrt1 = new double[ndirs * xi_block_size](); vec_dir_abcrt2 = new double[ndirs * xi_block_size](); vec_dir_excrt1 = new double[ndirs * xi_block_size](); vec_dir_excrt2 = new double[ndirs * xi_block_size](); vec_dir_fsac11 = new dcomplex[ndirs * xi_block_size](); vec_dir_fsac21 = new dcomplex[ndirs * xi_block_size](); vec_dir_fsac12 = new dcomplex[ndirs * xi_block_size](); vec_dir_fsac22 = new dcomplex[ndirs * xi_block_size](); vec_dir_sac11 = new dcomplex[ndirs * xi_block_size](); vec_dir_sac21 = new dcomplex[ndirs * xi_block_size](); vec_dir_sac12 = new dcomplex[ndirs * xi_block_size](); vec_dir_sac22 = new dcomplex[ndirs * xi_block_size](); vec_dir_qschuc1 = new double[ndirs * xi_block_size](); vec_dir_qschuc2 = new double[ndirs * xi_block_size](); vec_dir_pschuc1 = new double[ndirs * xi_block_size](); vec_dir_pschuc2 = new double[ndirs * xi_block_size](); vec_dir_s0magc1 = new double[ndirs * xi_block_size](); vec_dir_s0magc2 = new double[ndirs * xi_block_size](); vec_dir_cosavc1 = new double[ndirs * xi_block_size](); vec_dir_cosavc2 = new double[ndirs * xi_block_size](); vec_dir_raprc1 = new double[ndirs * xi_block_size](); vec_dir_raprc2 = new double[ndirs * xi_block_size](); vec_dir_flc1 = new double[ndirs * xi_block_size](); vec_dir_flc2 = new double[ndirs * xi_block_size](); vec_dir_frc1 = new double[ndirs * xi_block_size](); vec_dir_frc2 = new double[ndirs * xi_block_size](); vec_dir_fkc1 = new double[ndirs * xi_block_size](); vec_dir_fkc2 = new double[ndirs * xi_block_size](); vec_dir_fxc1 = new double[ndirs * xi_block_size](); vec_dir_fxc2 = new double[ndirs * xi_block_size](); vec_dir_fyc1 = new double[ndirs * xi_block_size](); vec_dir_fyc2 = new double[ndirs * xi_block_size](); vec_dir_fzc1 = new double[ndirs * xi_block_size](); vec_dir_fzc2 = new double[ndirs * xi_block_size](); vec_dir_tqelc1 = new double[ndirs * xi_block_size](); vec_dir_tqelc2 = new double[ndirs * xi_block_size](); vec_dir_tqerc1 = new double[ndirs * xi_block_size](); vec_dir_tqerc2 = new double[ndirs * xi_block_size](); vec_dir_tqekc1 = new double[ndirs * xi_block_size](); vec_dir_tqekc2 = new double[ndirs * xi_block_size](); vec_dir_tqexc1 = new double[ndirs * xi_block_size](); vec_dir_tqexc2 = new double[ndirs * xi_block_size](); vec_dir_tqeyc1 = new double[ndirs * xi_block_size](); vec_dir_tqeyc2 = new double[ndirs * xi_block_size](); vec_dir_tqezc1 = new double[ndirs * xi_block_size](); vec_dir_tqezc2 = new double[ndirs * xi_block_size](); vec_dir_tqslc1 = new double[ndirs * xi_block_size](); vec_dir_tqslc2 = new double[ndirs * xi_block_size](); vec_dir_tqsrc1 = new double[ndirs * xi_block_size](); vec_dir_tqsrc2 = new double[ndirs * xi_block_size](); vec_dir_tqskc1 = new double[ndirs * xi_block_size](); vec_dir_tqskc2 = new double[ndirs * xi_block_size](); vec_dir_tqsxc1 = new double[ndirs * xi_block_size](); vec_dir_tqsxc2 = new double[ndirs * xi_block_size](); vec_dir_tqsyc1 = new double[ndirs * xi_block_size](); vec_dir_tqsyc2 = new double[ndirs * xi_block_size](); vec_dir_tqszc1 = new double[ndirs * xi_block_size](); vec_dir_tqszc2 = new double[ndirs * xi_block_size](); vec_dir_mulc = new double[16 * ndirs * xi_block_size](); vec_dir_mulclr = new double[16 * ndirs * xi_block_size](); } ClusterOutputInfo::ClusterOutputInfo(const std::string &hdf5_name) { unsigned int flags = H5F_ACC_RDONLY; HDFFile *hdf_file = new HDFFile(hdf5_name, flags); herr_t status = hdf_file->get_status(); string str_name, str_type; if (status == 0) { status = hdf_file->read("NSPH", "INT32_(1)", &nsph); status = hdf_file->read("LI", "INT32_(1)", &li); status = hdf_file->read("LE", "INT32_(1)", &le); status = hdf_file->read("LM", "INT32_(1)", &lm); long tmp; status = hdf_file->read("MXNDM", "INT64_(1)", &tmp); mxndm = (np_int)tmp; status = hdf_file->read("INPOL", "INT32_(1)", &inpol); status = hdf_file->read("NPNT", "INT32_(1)", &npnt); status = hdf_file->read("NPNTTS", "INT32_(1)", &npntts); status = hdf_file->read("IAVM", "INT32_(1)", &iavm); status = hdf_file->read("ISAM", "INT32_(1)", &isam); status = hdf_file->read("JWTM", "INT32_(1)", &jwtm); str_type = "FLOAT64_(" + to_string(nsph) + ")"; vec_x_coords = new double[nsph]; vec_y_coords = new double[nsph]; vec_z_coords = new double[nsph]; status = hdf_file->read("VEC_SPH_X", str_type, vec_x_coords); status = hdf_file->read("VEC_SPH_Y", str_type, vec_y_coords); status = hdf_file->read("VEC_SPH_Z", str_type, vec_z_coords); status = hdf_file->read("TH_START", "FLOAT64_(1)", &th); status = hdf_file->read("TH_STEP", "FLOAT64_(1)", &thstp); status = hdf_file->read("TH_END", "FLOAT64_(1)", &thlst); _num_theta = (thstp == 0.0) ? 1 : 1 + int((thlst - th) / thstp); status = hdf_file->read("THS_START", "FLOAT64_(1)", &ths); status = hdf_file->read("THS_STEP", "FLOAT64_(1)", &thsstp); status = hdf_file->read("THS_END", "FLOAT64_(1)", &thslst); _num_thetas = (thsstp == 0.0) ? 1 : 1 + int((thslst - ths) / thsstp); status = hdf_file->read("PH_START", "FLOAT64_(1)", &ph); status = hdf_file->read("PH_STEP", "FLOAT64_(1)", &phstp); status = hdf_file->read("PH_END", "FLOAT64_(1)", &phlst); _num_phi = (phstp == 0.0) ? 1 : 1 + int((phlst - ph) / phstp); status = hdf_file->read("PHS_START", "FLOAT64_(1)", &phs); status = hdf_file->read("PHS_STEP", "FLOAT64_(1)", &phsstp); status = hdf_file->read("PHS_END", "FLOAT64_(1)", &phslst); _num_phis = (phsstp == 0.0) ? 1 : 1 + int((phslst - phs) / phsstp); ndirs = _num_theta * _num_thetas * _num_phi * _num_phis; status = hdf_file->read("EXRI", "FLOAT64_(1)", &exri); status = hdf_file->read("IDFC", "INT32_(1)", &idfc); status = hdf_file->read("XI1", "INT32_(1)", &_first_xi); status = hdf_file->read("NXI", "INT32_(1)", &xi_block_size); nxi = (_first_xi == 1) ? xi_block_size : xi_block_size + _first_xi; str_type = "INT32_(" + to_string(xi_block_size) + ")"; vec_jxi = new int[xi_block_size]; status = hdf_file->read("VEC_JXI", str_type, vec_jxi); str_type = "INT16_(" + to_string(xi_block_size) + ")"; vec_ier = new short[xi_block_size]; status = hdf_file->read("VEC_IER", str_type, vec_ier); str_type = "FLOAT64_(" + to_string(xi_block_size) + ")"; vec_vk = new double[xi_block_size]; status = hdf_file->read("VEC_VK", str_type, vec_vk); vec_xi = new double[xi_block_size]; status = hdf_file->read("VEC_VK", str_type, vec_xi); status = hdf_file->read("NCONF", "INT32_(1)", &configurations); str_type = "FLOAT64_(" + to_string(xi_block_size * configurations) + ")"; vec_sphere_sizes = new double[xi_block_size * configurations]; status = hdf_file->read("VEC_SPH_SIZES", str_type, vec_sphere_sizes); str_type = "FLOAT64_(" + to_string(2 * xi_block_size * configurations) + ")"; vec_sphere_ref_indices = new dcomplex[xi_block_size * configurations]; status = hdf_file->read("VEC_SPH_REFRI", str_type, vec_sphere_ref_indices); str_type = "FLOAT64_(" + to_string(xi_block_size * configurations) + ")"; vec_sphere_scs = new double[xi_block_size * configurations]; status = hdf_file->read("VEC_SPH_SCS", str_type, vec_sphere_scs); vec_sphere_abs = new double[xi_block_size * configurations]; status = hdf_file->read("VEC_SPH_ABS", str_type, vec_sphere_abs); vec_sphere_exs = new double[xi_block_size * configurations]; status = hdf_file->read("VEC_SPH_EXS", str_type, vec_sphere_exs); vec_sphere_albs = new double[xi_block_size * configurations]; status = hdf_file->read("VEC_SPH_ALBS", str_type, vec_sphere_albs); vec_sphere_sqscs = new double[xi_block_size * configurations]; status = hdf_file->read("VEC_SPH_SQSCS", str_type, vec_sphere_sqscs); vec_sphere_sqabs = new double[xi_block_size * configurations]; status = hdf_file->read("VEC_SPH_SQABS", str_type, vec_sphere_sqabs); vec_sphere_sqexs = new double[xi_block_size * configurations]; status = hdf_file->read("VEC_SPH_SQEXS", str_type, vec_sphere_sqexs); str_type = "FLOAT64_(" + to_string(2 * xi_block_size * configurations) + ")"; vec_fsas = new dcomplex[xi_block_size * configurations]; status = hdf_file->read("VEC_FSAS", str_type, vec_fsas); str_type = "FLOAT64_(" + to_string(xi_block_size * configurations) + ")"; vec_qschus = new double[xi_block_size * configurations]; status = hdf_file->read("VEC_QSCHUS", str_type, vec_qschus); vec_pschus = new double[xi_block_size * configurations]; status = hdf_file->read("VEC_PSCHUS", str_type, vec_pschus); vec_s0mags = new double[xi_block_size * configurations]; status = hdf_file->read("VEC_S0MAGS", str_type, vec_s0mags); vec_cosavs = new double[xi_block_size * configurations]; status = hdf_file->read("VEC_COSAVS", str_type, vec_cosavs); vec_raprs = new double[xi_block_size * configurations]; status = hdf_file->read("VEC_RAPRS", str_type, vec_raprs); vec_tqek1 = new double[xi_block_size * configurations]; status = hdf_file->read("VEC_TQEK1", str_type, vec_tqek1); vec_tqsk1 = new double[xi_block_size * configurations]; status = hdf_file->read("VEC_TQSK1", str_type, vec_tqsk1); vec_tqek2 = new double[xi_block_size * configurations]; status = hdf_file->read("VEC_TQEK2", str_type, vec_tqek2); vec_tqsk2 = new double[xi_block_size * configurations]; status = hdf_file->read("VEC_TQSK2", str_type, vec_tqsk2); str_type = "FLOAT64_(" + to_string(2 * xi_block_size) + ")"; vec_fsat = new dcomplex[xi_block_size]; status = hdf_file->read("VEC_FSAT", str_type, vec_fsat); str_type = "FLOAT64_(" + to_string(xi_block_size) + ")"; vec_qschut = new double[xi_block_size]; status = hdf_file->read("VEC_QSCHUT", str_type, vec_qschut); vec_pschut = new double[xi_block_size]; status = hdf_file->read("VEC_PSCHUT", str_type, vec_pschut); vec_s0magt = new double[xi_block_size]; status = hdf_file->read("VEC_S0MAGT", str_type, vec_s0magt); vec_scc1 = new double[xi_block_size]; status = hdf_file->read("VEC_SCC1", str_type, vec_scc1); vec_scc2 = new double[xi_block_size]; status = hdf_file->read("VEC_SCC2", str_type, vec_scc2); vec_abc1 = new double[xi_block_size]; status = hdf_file->read("VEC_ABC1", str_type, vec_abc1); vec_abc2 = new double[xi_block_size]; status = hdf_file->read("VEC_ABC2", str_type, vec_abc2); vec_exc1 = new double[xi_block_size]; status = hdf_file->read("VEC_EXC1", str_type, vec_exc1); vec_exc2 = new double[xi_block_size]; status = hdf_file->read("VEC_EXC2", str_type, vec_exc2); vec_albedc1 = new double[xi_block_size]; status = hdf_file->read("VEC_ALBEDC1", str_type, vec_albedc1); vec_albedc2 = new double[xi_block_size]; status = hdf_file->read("VEC_ALBEDC2", str_type, vec_albedc2); vec_qscamc1 = new double[xi_block_size]; status = hdf_file->read("VEC_QSCAMC1", str_type, vec_qscamc1); vec_qscamc2 = new double[xi_block_size]; status = hdf_file->read("VEC_QSCAMC2", str_type, vec_qscamc2); vec_qabsmc1 = new double[xi_block_size]; status = hdf_file->read("VEC_QABSMC1", str_type, vec_qabsmc1); vec_qabsmc2 = new double[xi_block_size]; status = hdf_file->read("VEC_QABSMC2", str_type, vec_qabsmc2); vec_qextmc1 = new double[xi_block_size]; status = hdf_file->read("VEC_QEXTMC1", str_type, vec_qextmc1); vec_qextmc2 = new double[xi_block_size]; status = hdf_file->read("VEC_QEXTMC2", str_type, vec_qextmc2); vec_sccrt1 = new double[xi_block_size]; status = hdf_file->read("VEC_SCCRT1", str_type, vec_sccrt1); vec_sccrt2 = new double[xi_block_size]; status = hdf_file->read("VEC_SCCRT2", str_type, vec_sccrt2); vec_abcrt1 = new double[xi_block_size]; status = hdf_file->read("VEC_ABCRT1", str_type, vec_abcrt1); vec_abcrt2 = new double[xi_block_size]; status = hdf_file->read("VEC_ABCRT2", str_type, vec_abcrt2); vec_excrt1 = new double[xi_block_size]; status = hdf_file->read("VEC_EXCRT1", str_type, vec_excrt1); vec_excrt2 = new double[xi_block_size]; status = hdf_file->read("VEC_EXCRT2", str_type, vec_excrt2); str_type = "FLOAT64_(" + to_string(2 * xi_block_size) + ")"; vec_fsac11 = new dcomplex[xi_block_size]; status = hdf_file->read("VEC_FSAC11", str_type, vec_fsac11); vec_fsac21 = new dcomplex[xi_block_size]; status = hdf_file->read("VEC_FSAC21", str_type, vec_fsac21); vec_fsac22 = new dcomplex[xi_block_size]; status = hdf_file->read("VEC_FSAC22", str_type, vec_fsac22); vec_fsac12 = new dcomplex[xi_block_size]; status = hdf_file->read("VEC_FSAC12", str_type, vec_fsac12); str_type = "FLOAT64_(" + to_string(xi_block_size) + ")"; vec_qschuc1 = new double[xi_block_size]; status = hdf_file->read("VEC_QSCHUC1", str_type, vec_qschuc1); vec_qschuc2 = new double[xi_block_size]; status = hdf_file->read("VEC_QSCHUC2", str_type, vec_qschuc2); vec_pschuc1 = new double[xi_block_size]; status = hdf_file->read("VEC_PSCHUC1", str_type, vec_pschuc1); vec_pschuc2 = new double[xi_block_size]; status = hdf_file->read("VEC_PSCHUC2", str_type, vec_pschuc2); vec_s0magc1 = new double[xi_block_size]; status = hdf_file->read("VEC_S0MAGC1", str_type, vec_s0magc1); vec_s0magc2 = new double[xi_block_size]; status = hdf_file->read("VEC_S0MAGC2", str_type, vec_s0magc2); vec_cosavc1 = new double[xi_block_size]; status = hdf_file->read("VEC_COSAVC1", str_type, vec_cosavc1); vec_cosavc2 = new double[xi_block_size]; status = hdf_file->read("VEC_COSAVC2", str_type, vec_cosavc2); vec_raprc1 = new double[xi_block_size]; status = hdf_file->read("VEC_RAPRC1", str_type, vec_raprc1); vec_raprc2 = new double[xi_block_size]; status = hdf_file->read("VEC_RAPRC2", str_type, vec_raprc2); vec_fkc1 = new double[xi_block_size]; status = hdf_file->read("VEC_FKC1", str_type, vec_fkc1); vec_fkc2 = new double[xi_block_size]; status = hdf_file->read("VEC_FKC2", str_type, vec_fkc2); vec_dir_tidg = new double[_num_theta]; vec_dir_pidg = new double[_num_phi]; vec_dir_tsdg = new double[_num_thetas]; vec_dir_psdg = new double[_num_phis]; // Initialize directions (they are scale-independent) double cti = th, cpi = ph, cts = ths, cps = phs; for (int di = 0; di < _num_theta; di++) { vec_dir_tidg[di] = cti; cti += thstp; } for (int di = 0; di < _num_thetas; di++) { vec_dir_tsdg[di] = cts; cts += thsstp; } for (int di = 0; di < _num_phi; di++) { vec_dir_pidg[di] = cpi; cpi += phstp; } for (int di = 0; di < _num_phis; di++) { vec_dir_psdg[di] = cps; cps += phsstp; } str_type = "FLOAT64_(" + to_string(ndirs) + ")"; vec_dir_scand = new double[ndirs]; status = hdf_file->read("VEC_DIR_SCAN", str_type, vec_dir_scand); vec_dir_cfmp = new double[ndirs]; status = hdf_file->read("VEC_DIR_CFMP", str_type, vec_dir_cfmp); vec_dir_cfsp = new double[ndirs]; status = hdf_file->read("VEC_DIR_CFSP", str_type, vec_dir_cfsp); vec_dir_sfmp = new double[ndirs]; status = hdf_file->read("VEC_DIR_SFMP", str_type, vec_dir_sfmp); vec_dir_sfsp = new double[ndirs]; status = hdf_file->read("VEC_DIR_SFSP", str_type, vec_dir_sfsp); str_type = "FLOAT64_(" + to_string(3 * ndirs) + ")"; vec_dir_un = new double[3 * ndirs]; status = hdf_file->read("VEC_DIR_UN", str_type, vec_dir_un); vec_dir_uns = new double[3 * ndirs]; status = hdf_file->read("VEC_DIR_UNS", str_type, vec_dir_uns); str_type = "FLOAT64_(" + to_string(2 * ndirs * configurations * xi_block_size) + ")"; vec_dir_sas11 = new dcomplex[ndirs * configurations * xi_block_size]; status = hdf_file->read("VEC_DIR_SAS11", str_type, vec_dir_sas11); vec_dir_sas21 = new dcomplex[ndirs * configurations * xi_block_size]; status = hdf_file->read("VEC_DIR_SAS21", str_type, vec_dir_sas21); vec_dir_sas12 = new dcomplex[ndirs * configurations * xi_block_size]; status = hdf_file->read("VEC_DIR_SAS12", str_type, vec_dir_sas12); vec_dir_sas22 = new dcomplex[ndirs * configurations * xi_block_size]; status = hdf_file->read("VEC_DIR_SAS22", str_type, vec_dir_sas22); str_type = "FLOAT64_(" + to_string(16 * ndirs * configurations * xi_block_size) + ")"; vec_dir_muls = new double[16 * ndirs *configurations * xi_block_size]; status = hdf_file->read("VEC_DIR_MULS", str_type, vec_dir_muls); vec_dir_mulslr = new double[16 * ndirs *configurations * xi_block_size]; status = hdf_file->read("VEC_DIR_MULSLR", str_type, vec_dir_mulslr); str_type = "FLOAT64_(" + to_string(2 * ndirs * xi_block_size) + ")"; vec_dir_sat11 = new dcomplex[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_SAT11", str_type, vec_dir_sat11); vec_dir_sat21 = new dcomplex[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_SAT21", str_type, vec_dir_sat21); vec_dir_sat12 = new dcomplex[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_SAT12", str_type, vec_dir_sat12); vec_dir_sat22 = new dcomplex[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_SAT22", str_type, vec_dir_sat22); str_type = "FLOAT64_(" + to_string(ndirs * xi_block_size) + ")"; vec_dir_scc1 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_SCC1", str_type, vec_dir_scc1); vec_dir_scc2 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_SCC2", str_type, vec_dir_scc2); vec_dir_abc1 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_ABC1", str_type, vec_dir_abc1); vec_dir_abc2 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_ABC2", str_type, vec_dir_abc2); vec_dir_exc1 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_EXC1", str_type, vec_dir_exc1); vec_dir_exc2 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_EXC2", str_type, vec_dir_exc2); vec_dir_albedc1 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_ALBEDC1", str_type, vec_dir_albedc1); vec_dir_albedc2 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_ALBEDC2", str_type, vec_dir_albedc2); vec_dir_qscc1 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_QSCC1", str_type, vec_dir_qscc1); vec_dir_qscc2 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_QSCC2", str_type, vec_dir_qscc2); vec_dir_qabc1 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_QABC1", str_type, vec_dir_qabc1); vec_dir_qabc2 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_QABC2", str_type, vec_dir_qabc2); vec_dir_qexc1 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_QEXC1", str_type, vec_dir_qexc1); vec_dir_qexc2 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_QEXC2", str_type, vec_dir_qexc2); vec_dir_sccrt1 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_SCCRT1", str_type, vec_dir_sccrt1); vec_dir_sccrt2 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_SCCRT2", str_type, vec_dir_sccrt2); vec_dir_abcrt1 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_ABCRT1", str_type, vec_dir_abcrt1); vec_dir_abcrt2 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_ABCRT2", str_type, vec_dir_abcrt2); vec_dir_excrt1 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_EXCRT1", str_type, vec_dir_excrt1); vec_dir_excrt2 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_EXCRT2", str_type, vec_dir_excrt2); str_type = "FLOAT64_(" + to_string(2 * ndirs * xi_block_size) + ")"; vec_dir_fsac11 = new dcomplex[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_FSAC11", str_type, vec_dir_fsac11); vec_dir_fsac21 = new dcomplex[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_FSAC21", str_type, vec_dir_fsac21); vec_dir_fsac12 = new dcomplex[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_FSAC12", str_type, vec_dir_fsac12); vec_dir_fsac22 = new dcomplex[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_FSAC22", str_type, vec_dir_fsac22); vec_dir_sac11 = new dcomplex[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_SAC11", str_type, vec_dir_sac11); vec_dir_sac21 = new dcomplex[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_SAC21", str_type, vec_dir_sac21); vec_dir_sac12 = new dcomplex[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_SAC12", str_type, vec_dir_sac12); vec_dir_sac22 = new dcomplex[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_SAC22", str_type, vec_dir_sac22); str_type = "FLOAT64_(" + to_string(ndirs * xi_block_size) + ")"; vec_dir_qschuc1 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_QSCHUC1", str_type, vec_dir_qschuc1); vec_dir_qschuc2 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_QSCHUC2", str_type, vec_dir_qschuc2); vec_dir_pschuc1 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_PSCHUC1", str_type, vec_dir_pschuc1); vec_dir_pschuc2 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_PSCHUC2", str_type, vec_dir_pschuc2); vec_dir_s0magc1 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_S0MAGC1", str_type, vec_dir_s0magc1); vec_dir_s0magc2 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_S0MAGC2", str_type, vec_dir_s0magc2); vec_dir_cosavc1 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_COSAVC1", str_type, vec_dir_cosavc1); vec_dir_cosavc2 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_COSAVC2", str_type, vec_dir_cosavc2); vec_dir_raprc1 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_RAPRC1", str_type, vec_dir_raprc1); vec_dir_raprc2 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_RAPRC2", str_type, vec_dir_raprc2); vec_dir_flc1 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_FLC1", str_type, vec_dir_flc1); vec_dir_flc2 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_FLC2", str_type, vec_dir_flc2); vec_dir_frc1 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_FRC1", str_type, vec_dir_frc1); vec_dir_frc2 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_FRC2", str_type, vec_dir_frc2); vec_dir_fkc1 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_FKC1", str_type, vec_dir_fkc1); vec_dir_fkc2 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_FKC2", str_type, vec_dir_fkc2); vec_dir_fxc1 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_FXC1", str_type, vec_dir_fxc1); vec_dir_fxc2 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_FXC2", str_type, vec_dir_fxc2); vec_dir_fyc1 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_FYC1", str_type, vec_dir_fyc1); vec_dir_fyc2 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_FYC2", str_type, vec_dir_fyc2); vec_dir_fzc1 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_FZC1", str_type, vec_dir_fzc1); vec_dir_fzc2 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_FZC2", str_type, vec_dir_fzc2); vec_dir_tqelc1 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_TQELC1", str_type, vec_dir_tqelc1); vec_dir_tqelc2 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_TQELC2", str_type, vec_dir_tqelc2); vec_dir_tqerc1 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_TQERC1", str_type, vec_dir_tqerc1); vec_dir_tqerc2 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_TQERC2", str_type, vec_dir_tqerc2); vec_dir_tqekc1 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_TQEKC1", str_type, vec_dir_tqekc1); vec_dir_tqekc2 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_TQEKC2", str_type, vec_dir_tqekc2); vec_dir_tqexc1 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_TQEXC1", str_type, vec_dir_tqexc1); vec_dir_tqexc2 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_TQEXC2", str_type, vec_dir_tqexc2); vec_dir_tqeyc1 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_TQEYC1", str_type, vec_dir_tqeyc1); vec_dir_tqeyc2 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_TQEYC2", str_type, vec_dir_tqeyc2); vec_dir_tqezc1 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_TQEZC1", str_type, vec_dir_tqezc1); vec_dir_tqezc2 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_TQEZC2", str_type, vec_dir_tqezc2); vec_dir_tqslc1 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_TQSLC1", str_type, vec_dir_tqslc1); vec_dir_tqslc2 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_TQSLC2", str_type, vec_dir_tqslc2); vec_dir_tqsrc1 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_TQSRC1", str_type, vec_dir_tqsrc1); vec_dir_tqsrc2 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_TQSRC2", str_type, vec_dir_tqsrc2); vec_dir_tqskc1 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_TQSKC1", str_type, vec_dir_tqskc1); vec_dir_tqskc2 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_TQSKC2", str_type, vec_dir_tqskc2); vec_dir_tqsxc1 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_TQSXC1", str_type, vec_dir_tqsxc1); vec_dir_tqsxc2 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_TQSXC2", str_type, vec_dir_tqsxc2); vec_dir_tqsyc1 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_TQSYC1", str_type, vec_dir_tqsyc1); vec_dir_tqsyc2 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_TQSYC2", str_type, vec_dir_tqsyc2); vec_dir_tqszc1 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_TQSZC1", str_type, vec_dir_tqszc1); vec_dir_tqszc2 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_TQSZC2", str_type, vec_dir_tqszc2); str_type = "FLOAT64_(" + to_string(16 * ndirs * xi_block_size) + ")"; vec_dir_mulc = new double[16 * ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_MULC", str_type, vec_dir_mulc); vec_dir_mulclr = new double[16 * ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_MULCLR", str_type, vec_dir_mulclr); status = hdf_file->close(); delete hdf_file; } else { if (hdf_file != NULL) delete hdf_file; UnrecognizedFormatException ex("Error: " + hdf5_name + " not recognized as a valid HDF5 file!"); throw ex; } } ClusterOutputInfo::~ClusterOutputInfo() { delete[] vec_x_coords; delete[] vec_y_coords; delete[] vec_z_coords; delete[] vec_jxi; delete[] vec_ier; delete[] vec_vk; delete[] vec_xi; delete[] vec_sphere_sizes; delete[] vec_sphere_ref_indices; delete[] vec_sphere_scs; delete[] vec_sphere_abs; delete[] vec_sphere_exs; delete[] vec_sphere_albs; delete[] vec_sphere_sqscs; delete[] vec_sphere_sqabs; delete[] vec_sphere_sqexs; delete[] vec_fsas; delete[] vec_qschus; delete[] vec_pschus; delete[] vec_s0mags; delete[] vec_cosavs; delete[] vec_raprs; delete[] vec_tqek1; delete[] vec_tqsk1; delete[] vec_tqek2; delete[] vec_tqsk2; delete[] vec_fsat; delete[] vec_qschut; delete[] vec_pschut; delete[] vec_s0magt; delete[] vec_scc1; delete[] vec_scc2; delete[] vec_abc1; delete[] vec_abc2; delete[] vec_exc1; delete[] vec_exc2; delete[] vec_albedc1; delete[] vec_albedc2; delete[] vec_sccrt1; delete[] vec_sccrt2; delete[] vec_abcrt1; delete[] vec_abcrt2; delete[] vec_excrt1; delete[] vec_excrt2; delete[] vec_fsac11; delete[] vec_fsac21; delete[] vec_fsac22; delete[] vec_fsac12; delete[] vec_qschuc1; delete[] vec_qschuc2; delete[] vec_pschuc1; delete[] vec_pschuc2; delete[] vec_s0magc1; delete[] vec_s0magc2; delete[] vec_cosavc1; delete[] vec_cosavc2; delete[] vec_raprc1; delete[] vec_raprc2; delete[] vec_fkc1; delete[] vec_fkc2; delete[] vec_dir_tidg; delete[] vec_dir_pidg; delete[] vec_dir_tsdg; delete[] vec_dir_psdg; delete[] vec_dir_scand; delete[] vec_dir_cfmp; delete[] vec_dir_sfmp; delete[] vec_dir_cfsp; delete[] vec_dir_sfsp; delete[] vec_dir_un; delete[] vec_dir_uns; delete[] vec_dir_sas11; delete[] vec_dir_sas21; delete[] vec_dir_sas12; delete[] vec_dir_sas22; delete[] vec_dir_muls; delete[] vec_dir_mulslr; delete[] vec_dir_sat11; delete[] vec_dir_sat21; delete[] vec_dir_sat12; delete[] vec_dir_sat22; delete[] vec_dir_scc1; delete[] vec_dir_scc2; delete[] vec_dir_abc1; delete[] vec_dir_abc2; delete[] vec_dir_exc1; delete[] vec_dir_exc2; delete[] vec_dir_albedc1; delete[] vec_dir_albedc2; delete[] vec_dir_qscc1; delete[] vec_dir_qscc2; delete[] vec_dir_qabc1; delete[] vec_dir_qabc2; delete[] vec_dir_qexc1; delete[] vec_dir_qexc2; delete[] vec_qscamc1; delete[] vec_qscamc2; delete[] vec_qabsmc1; delete[] vec_qabsmc2; delete[] vec_qextmc1; delete[] vec_qextmc2; delete[] vec_dir_sccrt1; delete[] vec_dir_sccrt2; delete[] vec_dir_abcrt1; delete[] vec_dir_abcrt2; delete[] vec_dir_excrt1; delete[] vec_dir_excrt2; delete[] vec_dir_fsac11; delete[] vec_dir_fsac21; delete[] vec_dir_fsac12; delete[] vec_dir_fsac22; delete[] vec_dir_sac11; delete[] vec_dir_sac21; delete[] vec_dir_sac12; delete[] vec_dir_sac22; delete[] vec_dir_qschuc1; delete[] vec_dir_qschuc2; delete[] vec_dir_pschuc1; delete[] vec_dir_pschuc2; delete[] vec_dir_s0magc1; delete[] vec_dir_s0magc2; delete[] vec_dir_cosavc1; delete[] vec_dir_cosavc2; delete[] vec_dir_raprc1; delete[] vec_dir_raprc2; delete[] vec_dir_flc1; delete[] vec_dir_flc2; delete[] vec_dir_frc1; delete[] vec_dir_frc2; delete[] vec_dir_fkc1; delete[] vec_dir_fkc2; delete[] vec_dir_fxc1; delete[] vec_dir_fxc2; delete[] vec_dir_fyc1; delete[] vec_dir_fyc2; delete[] vec_dir_fzc1; delete[] vec_dir_fzc2; delete[] vec_dir_tqelc1; delete[] vec_dir_tqelc2; delete[] vec_dir_tqerc1; delete[] vec_dir_tqerc2; delete[] vec_dir_tqekc1; delete[] vec_dir_tqekc2; delete[] vec_dir_tqexc1; delete[] vec_dir_tqexc2; delete[] vec_dir_tqeyc1; delete[] vec_dir_tqeyc2; delete[] vec_dir_tqezc1; delete[] vec_dir_tqezc2; delete[] vec_dir_tqslc1; delete[] vec_dir_tqslc2; delete[] vec_dir_tqsrc1; delete[] vec_dir_tqsrc2; delete[] vec_dir_tqskc1; delete[] vec_dir_tqskc2; delete[] vec_dir_tqsxc1; delete[] vec_dir_tqsxc2; delete[] vec_dir_tqsyc1; delete[] vec_dir_tqsyc2; delete[] vec_dir_tqszc1; delete[] vec_dir_tqszc2; delete[] vec_dir_mulc; delete[] vec_dir_mulclr; } long ClusterOutputInfo::compute_size( ScattererConfiguration *sc, GeometryConfiguration *gc, int first_xi, int xi_length ) { long result = sizeof(np_int); result += 21 * sizeof(int); result += 14 * sizeof(double); result += 121 * sizeof(long); int _nsph = gc->number_of_spheres; double _th = gc->in_theta_start; double _thstp = gc->in_theta_step; double _thlst = gc->in_theta_end; double _ths = gc->sc_theta_start; double _thsstp = gc->sc_theta_step; double _thslst = gc->sc_theta_end; int num_theta = 1 + int((_thlst - _th) / _thstp); int num_thetas = 1 + int((_thslst - _ths) / _thsstp); double _ph = gc->in_phi_start; double _phstp = gc->in_phi_step; double _phlst = gc->in_phi_end; double _phs = gc->sc_phi_start; double _phsstp = gc->sc_phi_step; double _phslst = gc->sc_phi_end; int num_phi = 1 + int((_phlst - _ph) / _phstp); int num_phis = 1 + int((_phslst - _phs) / _phsstp); int _ndirs = num_theta * num_thetas * num_phi * num_phis; int _nxi = sc->number_of_scales; int _xi_block_size = (xi_length == 0) ? _nxi : xi_length; int _configurations = sc->configurations; result += 3 * _nsph * sizeof(double); // sphere coordinate vectors result += _xi_block_size * sizeof(int); // scale index vector result += _xi_block_size * sizeof(short); // error code vector result += 2 * _xi_block_size * sizeof(double); // scale vectors result += _xi_block_size * _configurations * sizeof(dcomplex); // refraction indices vector result += 5 * _xi_block_size * _configurations * sizeof(double); // sphere sizes, albedos and cross-sections result += 3 * _xi_block_size * _configurations * sizeof(double); // cross-section to geometric section ratios result += _xi_block_size * _configurations * sizeof(dcomplex); // fsas vector result += 9 * _xi_block_size * _configurations * sizeof(double); // up to tqsk2 vector result += _xi_block_size * sizeof(dcomplex); // fsat vector result += 3 * _xi_block_size * sizeof(double); // up to s0magt vector result += 20 * _xi_block_size * sizeof(double); // up to excrtt vector result += 4 * _xi_block_size * sizeof(dcomplex); // up to fsac12 vector result += 12 * _xi_block_size * sizeof(double); // up to fkc vector result += num_theta * sizeof(double); // vec_dir_tidg; result += num_thetas * sizeof(double); // vec_dir_tsdg; result += num_phi * sizeof(double); // vec_dir_pidg; result += num_phis * sizeof(double); // vec_dir_psdg; result += 11 * _ndirs * sizeof(double); // up to dir_uns vector result += 4 * _ndirs * _configurations * _xi_block_size * sizeof(dcomplex); // up to dir_sas22 vector result += 32 * _ndirs * _configurations * _xi_block_size * sizeof(double); // up to dir_mulslr vector result += 4 * _ndirs * _xi_block_size * sizeof(dcomplex); // up to dir_sat22 vector result += 20 * _ndirs * _xi_block_size * sizeof(double); // up to dir_excrt vector result += 8 * _ndirs * _xi_block_size * sizeof(dcomplex); // up to dir_sac22 vector result += 80 * _ndirs * _xi_block_size * sizeof(double); // up to dir_mulclr vector return result; } long ClusterOutputInfo::compute_size() { long result = sizeof(np_int); result += 21 * sizeof(int); result += 14 * sizeof(double); result += 121 * sizeof(long); result += 3 * nsph * sizeof(double); // sphere coordinate vectors result += xi_block_size * sizeof(int); // scale index vector result += xi_block_size * sizeof(short); // error code vector result += 2 * xi_block_size * sizeof(double); // scale vectors result += xi_block_size * configurations * sizeof(dcomplex); // refraction indices vector result += 5 * xi_block_size * configurations * sizeof(double); // sphere sizes, albedos and cross-sections result += 3 * xi_block_size * configurations * sizeof(double); // cross-sections to geometric section ratios result += configurations * sizeof(double); // sphere geometric sections result += xi_block_size * configurations * sizeof(dcomplex); // fsas vector result += 9 * xi_block_size * configurations * sizeof(double); // up to tqsk2 vector result += xi_block_size * sizeof(dcomplex); // fsat vector result += 3 * xi_block_size * sizeof(double); // up to s0magt vector result += 20 * xi_block_size * sizeof(double); // up to excrtt vector result += 4 * xi_block_size * sizeof(dcomplex); // up to fsac12 vector result += 12 * xi_block_size * sizeof(double); // up to fkc vector result += _num_theta * sizeof(double); // vec_dir_tidg; result += _num_thetas * sizeof(double); // vec_dir_tsdg; result += _num_phi * sizeof(double); // vec_dir_pidg; result += _num_phis * sizeof(double); // vec_dir_psdg; result += 11 * ndirs * sizeof(double); // up to dir_uns vector result += 4 * ndirs * configurations * xi_block_size * sizeof(dcomplex); // up to dir_sas22 vector result += 32 * ndirs * configurations * xi_block_size * sizeof(double); // up to dir_mulslr vector result += 4 * ndirs * xi_block_size * sizeof(dcomplex); // up to dir_sat22 vector result += 20 * ndirs * xi_block_size * sizeof(double); // up to dir_excrt vector result += 8 * ndirs * xi_block_size * sizeof(dcomplex); // up to dir_sac22 vector result += 80 * ndirs * xi_block_size * sizeof(double); // up to dir_mulclr vector return result; } int ClusterOutputInfo::insert(const ClusterOutputInfo &rhs) { int result = 0; result += (rhs.nsph == nsph) ? 0 : 1; result += (rhs.inpol == inpol) ? 0 : 1; result += (rhs.iavm == iavm) ? 0 : 1; result += (rhs.isam == isam) ? 0 : 1; result += (rhs._num_theta == _num_theta) ? 0 : 1; result += (rhs._num_thetas == _num_thetas) ? 0 : 1; result += (rhs._num_phi == _num_phi) ? 0 : 1; result += (rhs._num_phis == _num_phis) ? 0 : 1; result += (rhs.ndirs == ndirs) ? 0 : 1; result += (rhs.exri == exri) ? 0 : 1; result += (rhs.idfc == idfc) ? 0 : 1; result += (rhs.configurations == configurations) ? 0 : 1; if (result == 0) { int offset, chunk_size, xi1; xi1 = rhs._first_xi; // Insert vectors whose size depends on wavelengths offset = xi1 - _first_xi; chunk_size = rhs.xi_block_size; memcpy(vec_jxi + offset, rhs.vec_jxi, chunk_size * sizeof(int)); memcpy(vec_ier + offset, rhs.vec_ier, chunk_size * sizeof(short)); memcpy(vec_vk + offset, rhs.vec_vk, chunk_size * sizeof(double)); memcpy(vec_xi + offset, rhs.vec_xi, chunk_size * sizeof(double)); memcpy(vec_fsat + offset, rhs.vec_fsat, chunk_size * sizeof(dcomplex)); memcpy(vec_qschut + offset, rhs.vec_qschut, chunk_size * sizeof(double)); memcpy(vec_pschut + offset, rhs.vec_pschut, chunk_size * sizeof(double)); memcpy(vec_s0magt + offset, rhs.vec_s0magt, chunk_size * sizeof(double)); memcpy(vec_scc1 + offset, rhs.vec_scc1, chunk_size * sizeof(double)); memcpy(vec_scc2 + offset, rhs.vec_scc2, chunk_size * sizeof(double)); memcpy(vec_abc1 + offset, rhs.vec_abc1, chunk_size * sizeof(double)); memcpy(vec_abc2 + offset, rhs.vec_abc2, chunk_size * sizeof(double)); memcpy(vec_exc1 + offset, rhs.vec_exc1, chunk_size * sizeof(double)); memcpy(vec_exc2 + offset, rhs.vec_exc2, chunk_size * sizeof(double)); memcpy(vec_albedc1 + offset, rhs.vec_albedc1, chunk_size * sizeof(double)); memcpy(vec_albedc2 + offset, rhs.vec_albedc2, chunk_size * sizeof(double)); memcpy(vec_qscamc1 + offset, rhs.vec_qscamc1, chunk_size * sizeof(double)); memcpy(vec_qscamc2 + offset, rhs.vec_qscamc2, chunk_size * sizeof(double)); memcpy(vec_qabsmc1 + offset, rhs.vec_qabsmc1, chunk_size * sizeof(double)); memcpy(vec_qabsmc2 + offset, rhs.vec_qabsmc2, chunk_size * sizeof(double)); memcpy(vec_qextmc1 + offset, rhs.vec_qextmc1, chunk_size * sizeof(double)); memcpy(vec_qextmc2 + offset, rhs.vec_qextmc2, chunk_size * sizeof(double)); memcpy(vec_sccrt1 + offset, rhs.vec_sccrt1, chunk_size * sizeof(double)); memcpy(vec_sccrt2 + offset, rhs.vec_sccrt2, chunk_size * sizeof(double)); memcpy(vec_abcrt1 + offset, rhs.vec_abcrt1, chunk_size * sizeof(double)); memcpy(vec_abcrt2 + offset, rhs.vec_abcrt2, chunk_size * sizeof(double)); memcpy(vec_excrt1 + offset, rhs.vec_excrt1, chunk_size * sizeof(double)); memcpy(vec_excrt2 + offset, rhs.vec_excrt2, chunk_size * sizeof(double)); memcpy(vec_fsac11 + offset, rhs.vec_fsac11, chunk_size * sizeof(dcomplex)); memcpy(vec_fsac21 + offset, rhs.vec_fsac21, chunk_size * sizeof(dcomplex)); memcpy(vec_fsac22 + offset, rhs.vec_fsac22, chunk_size * sizeof(dcomplex)); memcpy(vec_fsac12 + offset, rhs.vec_fsac12, chunk_size * sizeof(dcomplex)); memcpy(vec_qschuc1 + offset, rhs.vec_qschuc1, chunk_size * sizeof(double)); memcpy(vec_qschuc2 + offset, rhs.vec_qschuc2, chunk_size * sizeof(double)); memcpy(vec_pschuc1 + offset, rhs.vec_pschuc1, chunk_size * sizeof(double)); memcpy(vec_pschuc2 + offset, rhs.vec_pschuc2, chunk_size * sizeof(double)); memcpy(vec_s0magc1 + offset, rhs.vec_s0magc1, chunk_size * sizeof(double)); memcpy(vec_s0magc2 + offset, rhs.vec_s0magc2, chunk_size * sizeof(double)); memcpy(vec_cosavc1 + offset, rhs.vec_cosavc1, chunk_size * sizeof(double)); memcpy(vec_cosavc2 + offset, rhs.vec_cosavc2, chunk_size * sizeof(double)); memcpy(vec_raprc1 + offset, rhs.vec_raprc1, chunk_size * sizeof(double)); memcpy(vec_raprc2 + offset, rhs.vec_raprc2, chunk_size * sizeof(double)); memcpy(vec_fkc1 + offset, rhs.vec_fkc1, chunk_size * sizeof(double)); memcpy(vec_fkc2 + offset, rhs.vec_fkc2, chunk_size * sizeof(double)); // Insert vectors of multiple configuration values per scale offset = (xi1 - _first_xi) * configurations; chunk_size = rhs.xi_block_size * configurations; memcpy(vec_sphere_sizes + offset, rhs.vec_sphere_sizes, chunk_size * sizeof(double)); memcpy(vec_sphere_ref_indices + offset, rhs.vec_sphere_ref_indices, chunk_size * sizeof(dcomplex)); memcpy(vec_sphere_scs + offset, rhs.vec_sphere_scs, chunk_size * sizeof(double)); memcpy(vec_sphere_abs + offset, rhs.vec_sphere_abs, chunk_size * sizeof(double)); memcpy(vec_sphere_exs + offset, rhs.vec_sphere_exs, chunk_size * sizeof(double)); memcpy(vec_sphere_albs + offset, rhs.vec_sphere_albs, chunk_size * sizeof(double)); memcpy(vec_sphere_sqscs + offset, rhs.vec_sphere_sqscs, chunk_size * sizeof(double)); memcpy(vec_sphere_sqabs + offset, rhs.vec_sphere_sqabs, chunk_size * sizeof(double)); memcpy(vec_sphere_sqexs + offset, rhs.vec_sphere_sqexs, chunk_size * sizeof(double)); memcpy(vec_fsas + offset, rhs.vec_fsas, chunk_size * sizeof(dcomplex)); memcpy(vec_qschus + offset, rhs.vec_qschus, chunk_size * sizeof(double)); memcpy(vec_pschus + offset, rhs.vec_pschus, chunk_size * sizeof(double)); memcpy(vec_s0mags + offset, rhs.vec_s0mags, chunk_size * sizeof(double)); memcpy(vec_cosavs + offset, rhs.vec_cosavs, chunk_size * sizeof(double)); memcpy(vec_raprs + offset, rhs.vec_raprs, chunk_size * sizeof(double)); memcpy(vec_tqek1 + offset, rhs.vec_tqek1, chunk_size * sizeof(double)); memcpy(vec_tqsk1 + offset, rhs.vec_tqsk1, chunk_size * sizeof(double)); memcpy(vec_tqek2 + offset, rhs.vec_tqek2, chunk_size * sizeof(double)); memcpy(vec_tqsk2 + offset, rhs.vec_tqsk2, chunk_size * sizeof(double)); // Insert vectors of multiple directions per configuration offset = (xi1 - _first_xi) * configurations * ndirs; chunk_size = rhs.xi_block_size * configurations * ndirs; memcpy(vec_dir_sas11 + offset, rhs.vec_dir_sas11, chunk_size * sizeof(dcomplex)); memcpy(vec_dir_sas21 + offset, rhs.vec_dir_sas21, chunk_size * sizeof(dcomplex)); memcpy(vec_dir_sas12 + offset, rhs.vec_dir_sas12, chunk_size * sizeof(dcomplex)); memcpy(vec_dir_sas22 + offset, rhs.vec_dir_sas22, chunk_size * sizeof(dcomplex)); memcpy(vec_dir_muls + 16 * offset, rhs.vec_dir_muls, 16 * chunk_size * sizeof(double)); memcpy(vec_dir_mulslr + 16 * offset, rhs.vec_dir_mulslr, 16 * chunk_size * sizeof(double)); // Insert vectors whose sizes depend on wavelengths and directions offset = (xi1 - _first_xi) * ndirs; chunk_size = rhs.xi_block_size * ndirs; memcpy(vec_dir_sat11 + offset, rhs.vec_dir_sat11, chunk_size * sizeof(dcomplex)); memcpy(vec_dir_sat21 + offset, rhs.vec_dir_sat21, chunk_size * sizeof(dcomplex)); memcpy(vec_dir_sat12 + offset, rhs.vec_dir_sat12, chunk_size * sizeof(dcomplex)); memcpy(vec_dir_sat22 + offset, rhs.vec_dir_sat22, chunk_size * sizeof(dcomplex)); memcpy(vec_dir_scc1 + offset, rhs.vec_dir_scc1, chunk_size * sizeof(double)); memcpy(vec_dir_scc2 + offset, rhs.vec_dir_scc2, chunk_size * sizeof(double)); memcpy(vec_dir_abc1 + offset, rhs.vec_dir_abc1, chunk_size * sizeof(double)); memcpy(vec_dir_abc2 + offset, rhs.vec_dir_abc2, chunk_size * sizeof(double)); memcpy(vec_dir_exc1 + offset, rhs.vec_dir_exc1, chunk_size * sizeof(double)); memcpy(vec_dir_exc2 + offset, rhs.vec_dir_exc2, chunk_size * sizeof(double)); memcpy(vec_dir_albedc1 + offset, rhs.vec_dir_albedc1, chunk_size * sizeof(double)); memcpy(vec_dir_albedc2 + offset, rhs.vec_dir_albedc2, chunk_size * sizeof(double)); memcpy(vec_dir_qscc1 + offset, rhs.vec_dir_qscc1, chunk_size * sizeof(double)); memcpy(vec_dir_qscc2 + offset, rhs.vec_dir_qscc2, chunk_size * sizeof(double)); memcpy(vec_dir_qabc1 + offset, rhs.vec_dir_qabc1, chunk_size * sizeof(double)); memcpy(vec_dir_qabc2 + offset, rhs.vec_dir_qabc2, chunk_size * sizeof(double)); memcpy(vec_dir_qexc1 + offset, rhs.vec_dir_qexc1, chunk_size * sizeof(double)); memcpy(vec_dir_qexc2 + offset, rhs.vec_dir_qexc2, chunk_size * sizeof(double)); memcpy(vec_dir_sccrt1 + offset, rhs.vec_dir_sccrt1, chunk_size * sizeof(double)); memcpy(vec_dir_sccrt2 + offset, rhs.vec_dir_sccrt2, chunk_size * sizeof(double)); memcpy(vec_dir_abcrt1 + offset, rhs.vec_dir_abcrt1, chunk_size * sizeof(double)); memcpy(vec_dir_abcrt2 + offset, rhs.vec_dir_abcrt2, chunk_size * sizeof(double)); memcpy(vec_dir_excrt1 + offset, rhs.vec_dir_excrt1, chunk_size * sizeof(double)); memcpy(vec_dir_excrt2 + offset, rhs.vec_dir_excrt2, chunk_size * sizeof(double)); memcpy(vec_dir_fsac11 + offset, rhs.vec_dir_fsac11, chunk_size * sizeof(dcomplex)); memcpy(vec_dir_fsac21 + offset, rhs.vec_dir_fsac21, chunk_size * sizeof(dcomplex)); memcpy(vec_dir_fsac12 + offset, rhs.vec_dir_fsac12, chunk_size * sizeof(dcomplex)); memcpy(vec_dir_fsac22 + offset, rhs.vec_dir_fsac22, chunk_size * sizeof(dcomplex)); memcpy(vec_dir_sac11 + offset, rhs.vec_dir_sac11, chunk_size * sizeof(dcomplex)); memcpy(vec_dir_sac21 + offset, rhs.vec_dir_sac21, chunk_size * sizeof(dcomplex)); memcpy(vec_dir_sac12 + offset, rhs.vec_dir_sac12, chunk_size * sizeof(dcomplex)); memcpy(vec_dir_sac22 + offset, rhs.vec_dir_sac22, chunk_size * sizeof(dcomplex)); memcpy(vec_dir_qschuc1 + offset, rhs.vec_dir_qschuc1, chunk_size * sizeof(double)); memcpy(vec_dir_qschuc2 + offset, rhs.vec_dir_qschuc2, chunk_size * sizeof(double)); memcpy(vec_dir_pschuc1 + offset, rhs.vec_dir_pschuc1, chunk_size * sizeof(double)); memcpy(vec_dir_pschuc2 + offset, rhs.vec_dir_pschuc2, chunk_size * sizeof(double)); memcpy(vec_dir_s0magc1 + offset, rhs.vec_dir_s0magc1, chunk_size * sizeof(double)); memcpy(vec_dir_s0magc2 + offset, rhs.vec_dir_s0magc2, chunk_size * sizeof(double)); memcpy(vec_dir_cosavc1 + offset, rhs.vec_dir_cosavc1, chunk_size * sizeof(double)); memcpy(vec_dir_cosavc2 + offset, rhs.vec_dir_cosavc2, chunk_size * sizeof(double)); memcpy(vec_dir_raprc1 + offset, rhs.vec_dir_raprc1, chunk_size * sizeof(double)); memcpy(vec_dir_raprc2 + offset, rhs.vec_dir_raprc2, chunk_size * sizeof(double)); memcpy(vec_dir_flc1 + offset, rhs.vec_dir_flc1, chunk_size * sizeof(double)); memcpy(vec_dir_flc2 + offset, rhs.vec_dir_flc2, chunk_size * sizeof(double)); memcpy(vec_dir_frc1 + offset, rhs.vec_dir_frc1, chunk_size * sizeof(double)); memcpy(vec_dir_frc2 + offset, rhs.vec_dir_frc2, chunk_size * sizeof(double)); memcpy(vec_dir_fkc1 + offset, rhs.vec_dir_fkc1, chunk_size * sizeof(double)); memcpy(vec_dir_fkc2 + offset, rhs.vec_dir_fkc2, chunk_size * sizeof(double)); memcpy(vec_dir_fxc1 + offset, rhs.vec_dir_fxc1, chunk_size * sizeof(double)); memcpy(vec_dir_fxc2 + offset, rhs.vec_dir_fxc2, chunk_size * sizeof(double)); memcpy(vec_dir_fyc1 + offset, rhs.vec_dir_fyc1, chunk_size * sizeof(double)); memcpy(vec_dir_fyc2 + offset, rhs.vec_dir_fyc2, chunk_size * sizeof(double)); memcpy(vec_dir_fzc1 + offset, rhs.vec_dir_fzc1, chunk_size * sizeof(double)); memcpy(vec_dir_fzc2 + offset, rhs.vec_dir_fzc2, chunk_size * sizeof(double)); memcpy(vec_dir_tqelc1 + offset, rhs.vec_dir_tqelc1, chunk_size * sizeof(double)); memcpy(vec_dir_tqelc2 + offset, rhs.vec_dir_tqelc2, chunk_size * sizeof(double)); memcpy(vec_dir_tqerc1 + offset, rhs.vec_dir_tqerc1, chunk_size * sizeof(double)); memcpy(vec_dir_tqerc2 + offset, rhs.vec_dir_tqerc2, chunk_size * sizeof(double)); memcpy(vec_dir_tqekc1 + offset, rhs.vec_dir_tqekc1, chunk_size * sizeof(double)); memcpy(vec_dir_tqekc2 + offset, rhs.vec_dir_tqekc2, chunk_size * sizeof(double)); memcpy(vec_dir_tqexc1 + offset, rhs.vec_dir_tqexc1, chunk_size * sizeof(double)); memcpy(vec_dir_tqexc2 + offset, rhs.vec_dir_tqexc2, chunk_size * sizeof(double)); memcpy(vec_dir_tqeyc1 + offset, rhs.vec_dir_tqeyc1, chunk_size * sizeof(double)); memcpy(vec_dir_tqeyc2 + offset, rhs.vec_dir_tqeyc2, chunk_size * sizeof(double)); memcpy(vec_dir_tqezc1 + offset, rhs.vec_dir_tqezc1, chunk_size * sizeof(double)); memcpy(vec_dir_tqezc2 + offset, rhs.vec_dir_tqezc2, chunk_size * sizeof(double)); memcpy(vec_dir_tqslc1 + offset, rhs.vec_dir_tqslc1, chunk_size * sizeof(double)); memcpy(vec_dir_tqslc2 + offset, rhs.vec_dir_tqslc2, chunk_size * sizeof(double)); memcpy(vec_dir_tqsrc1 + offset, rhs.vec_dir_tqsrc1, chunk_size * sizeof(double)); memcpy(vec_dir_tqsrc2 + offset, rhs.vec_dir_tqsrc2, chunk_size * sizeof(double)); memcpy(vec_dir_tqskc1 + offset, rhs.vec_dir_tqskc1, chunk_size * sizeof(double)); memcpy(vec_dir_tqskc2 + offset, rhs.vec_dir_tqskc2, chunk_size * sizeof(double)); memcpy(vec_dir_tqsxc1 + offset, rhs.vec_dir_tqsxc1, chunk_size * sizeof(double)); memcpy(vec_dir_tqsxc2 + offset, rhs.vec_dir_tqsxc2, chunk_size * sizeof(double)); memcpy(vec_dir_tqsyc1 + offset, rhs.vec_dir_tqsyc1, chunk_size * sizeof(double)); memcpy(vec_dir_tqsyc2 + offset, rhs.vec_dir_tqsyc2, chunk_size * sizeof(double)); memcpy(vec_dir_tqszc1 + offset, rhs.vec_dir_tqszc1, chunk_size * sizeof(double)); memcpy(vec_dir_tqszc2 + offset, rhs.vec_dir_tqszc2, chunk_size * sizeof(double)); memcpy(vec_dir_mulc + 16 * offset, rhs.vec_dir_mulc, 16 * chunk_size * sizeof(double)); memcpy(vec_dir_mulclr + 16 * offset, rhs.vec_dir_mulclr, 16 * chunk_size * sizeof(double)); } return result; } int ClusterOutputInfo::write(const std::string &output, const std::string &format) { int result = 0; if (format.compare("LEGACY") == 0) { result = write_legacy(output); } else if (format.compare("HDF5") == 0) { result = write_hdf5(output); } else { string message = "Unknown format mode: \"" + format + "\""; throw UnrecognizedConfigurationException(message); } return result; } int ClusterOutputInfo::write_hdf5(const std::string &file_name) { List *rec_name_list = new List(1); List *rec_type_list = new List(1); List *rec_ptr_list = new List(1); string str_type, str_name; rec_name_list->set(0, "NSPH"); rec_type_list->set(0, "INT32_(1)"); rec_ptr_list->set(0, &nsph); rec_name_list->append("LI"); rec_type_list->append("INT32_(1)"); rec_ptr_list->append(&li); rec_name_list->append("LE"); rec_type_list->append("INT32_(1)"); rec_ptr_list->append(&le); rec_name_list->append("LM"); rec_type_list->append("INT32_(1)"); rec_ptr_list->append(&lm); rec_name_list->append("MXNDM"); rec_type_list->append("INT64_(1)"); rec_ptr_list->append(&mxndm); rec_name_list->append("INPOL"); rec_type_list->append("INT32_(1)"); rec_ptr_list->append(&inpol); rec_name_list->append("NPNT"); rec_type_list->append("INT32_(1)"); rec_ptr_list->append(&npnt); rec_name_list->append("NPNTTS"); rec_type_list->append("INT32_(1)"); rec_ptr_list->append(&npntts); rec_name_list->append("IAVM"); rec_type_list->append("INT32_(1)"); rec_ptr_list->append(&iavm); rec_name_list->append("ISAM"); rec_type_list->append("INT32_(1)"); rec_ptr_list->append(&isam); rec_name_list->append("JWTM"); rec_type_list->append("INT32_(1)"); rec_ptr_list->append(&jwtm); rec_name_list->append("VEC_SPH_X"); rec_type_list->append("FLOAT64_(" + to_string(nsph) + ")"); rec_ptr_list->append(vec_x_coords); rec_name_list->append("VEC_SPH_Y"); rec_type_list->append("FLOAT64_(" + to_string(nsph) + ")"); rec_ptr_list->append(vec_y_coords); rec_name_list->append("VEC_SPH_Z"); rec_type_list->append("FLOAT64_(" + to_string(nsph) + ")"); rec_ptr_list->append(vec_z_coords); rec_name_list->append("TH_START"); rec_type_list->append("FLOAT64_(1)"); rec_ptr_list->append(&th); rec_name_list->append("TH_STEP"); rec_type_list->append("FLOAT64_(1)"); rec_ptr_list->append(&thstp); rec_name_list->append("TH_END"); rec_type_list->append("FLOAT64_(1)"); rec_ptr_list->append(&thlst); rec_name_list->append("THS_START"); rec_type_list->append("FLOAT64_(1)"); rec_ptr_list->append(&ths); rec_name_list->append("THS_STEP"); rec_type_list->append("FLOAT64_(1)"); rec_ptr_list->append(&thsstp); rec_name_list->append("THS_END"); rec_type_list->append("FLOAT64_(1)"); rec_ptr_list->append(&thslst); rec_name_list->append("PH_START"); rec_type_list->append("FLOAT64_(1)"); rec_ptr_list->append(&ph); rec_name_list->append("PH_STEP"); rec_type_list->append("FLOAT64_(1)"); rec_ptr_list->append(&phstp); rec_name_list->append("PH_END"); rec_type_list->append("FLOAT64_(1)"); rec_ptr_list->append(&phlst); rec_name_list->append("PHS_START"); rec_type_list->append("FLOAT64_(1)"); rec_ptr_list->append(&phs); rec_name_list->append("PHS_STEP"); rec_type_list->append("FLOAT64_(1)"); rec_ptr_list->append(&phsstp); rec_name_list->append("PHS_END"); rec_type_list->append("FLOAT64_(1)"); rec_ptr_list->append(&phslst); rec_name_list->append("EXRI"); rec_type_list->append("FLOAT64_(1)"); rec_ptr_list->append(&exri); rec_name_list->append("IDFC"); rec_type_list->append("INT32_(1)"); rec_ptr_list->append(&idfc); rec_name_list->append("XI1"); rec_type_list->append("INT32_(1)"); rec_ptr_list->append(&_first_xi); rec_name_list->append("NXI"); rec_type_list->append("INT32_(1)"); rec_ptr_list->append(&xi_block_size); rec_name_list->append("VEC_JXI"); rec_type_list->append("INT32_(" + to_string(xi_block_size) + ")"); rec_ptr_list->append(vec_jxi); rec_name_list->append("VEC_IER"); rec_type_list->append("INT16_(" + to_string(xi_block_size) + ")"); rec_ptr_list->append(vec_ier); rec_name_list->append("VEC_VK"); rec_type_list->append("FLOAT64_(" + to_string(xi_block_size) + ")"); rec_ptr_list->append(vec_vk); rec_name_list->append("VEC_XI"); rec_type_list->append("FLOAT64_(" + to_string(xi_block_size) + ")"); rec_ptr_list->append(vec_xi); rec_name_list->append("NCONF"); rec_type_list->append("INT32_(1)"); rec_ptr_list->append(&configurations); rec_name_list->append("VEC_SPH_SIZES"); rec_type_list->append("FLOAT64_(" + to_string(xi_block_size * configurations) + ")"); rec_ptr_list->append(vec_sphere_sizes); rec_name_list->append("VEC_SPH_REFRI"); rec_type_list->append("FLOAT64_(" + to_string(2 * xi_block_size * configurations) + ")"); rec_ptr_list->append(vec_sphere_ref_indices); rec_name_list->append("VEC_SPH_SCS"); rec_type_list->append("FLOAT64_(" + to_string(xi_block_size * configurations) + ")"); rec_ptr_list->append(vec_sphere_scs); rec_name_list->append("VEC_SPH_ABS"); rec_type_list->append("FLOAT64_(" + to_string(xi_block_size * configurations) + ")"); rec_ptr_list->append(vec_sphere_abs); rec_name_list->append("VEC_SPH_EXS"); rec_type_list->append("FLOAT64_(" + to_string(xi_block_size * configurations) + ")"); rec_ptr_list->append(vec_sphere_exs); rec_name_list->append("VEC_SPH_ALBS"); rec_type_list->append("FLOAT64_(" + to_string(xi_block_size * configurations) + ")"); rec_ptr_list->append(vec_sphere_albs); rec_name_list->append("VEC_SPH_SQSCS"); rec_type_list->append("FLOAT64_(" + to_string(xi_block_size * configurations) + ")"); rec_ptr_list->append(vec_sphere_sqscs); rec_name_list->append("VEC_SPH_SQABS"); rec_type_list->append("FLOAT64_(" + to_string(xi_block_size * configurations) + ")"); rec_ptr_list->append(vec_sphere_sqabs); rec_name_list->append("VEC_SPH_SQEXS"); rec_type_list->append("FLOAT64_(" + to_string(xi_block_size * configurations) + ")"); rec_ptr_list->append(vec_sphere_sqexs); rec_name_list->append("VEC_FSAS"); rec_type_list->append("FLOAT64_(" + to_string(2 * xi_block_size * configurations) + ")"); rec_ptr_list->append(vec_fsas); rec_name_list->append("VEC_QSCHUS"); rec_type_list->append("FLOAT64_(" + to_string(xi_block_size * configurations) + ")"); rec_ptr_list->append(vec_qschus); rec_name_list->append("VEC_PSCHUS"); rec_type_list->append("FLOAT64_(" + to_string(xi_block_size * configurations) + ")"); rec_ptr_list->append(vec_pschus); rec_name_list->append("VEC_S0MAGS"); rec_type_list->append("FLOAT64_(" + to_string(xi_block_size * configurations) + ")"); rec_ptr_list->append(vec_s0mags); rec_name_list->append("VEC_COSAVS"); rec_type_list->append("FLOAT64_(" + to_string(xi_block_size * configurations) + ")"); rec_ptr_list->append(vec_cosavs); rec_name_list->append("VEC_RAPRS"); rec_type_list->append("FLOAT64_(" + to_string(xi_block_size * configurations) + ")"); rec_ptr_list->append(vec_raprs); rec_name_list->append("VEC_TQEK1"); rec_type_list->append("FLOAT64_(" + to_string(xi_block_size * configurations) + ")"); rec_ptr_list->append(vec_tqek1); rec_name_list->append("VEC_TQSK1"); rec_type_list->append("FLOAT64_(" + to_string(xi_block_size * configurations) + ")"); rec_ptr_list->append(vec_tqsk1); rec_name_list->append("VEC_TQEK2"); rec_type_list->append("FLOAT64_(" + to_string(xi_block_size * configurations) + ")"); rec_ptr_list->append(vec_tqek2); rec_name_list->append("VEC_TQSK2"); rec_type_list->append("FLOAT64_(" + to_string(xi_block_size * configurations) + ")"); rec_ptr_list->append(vec_tqsk2); rec_name_list->append("VEC_FSAT"); rec_type_list->append("FLOAT64_(" + to_string(2 * xi_block_size) + ")"); rec_ptr_list->append(vec_fsat); rec_name_list->append("VEC_QSCHUT"); rec_type_list->append("FLOAT64_(" + to_string(xi_block_size) + ")"); rec_ptr_list->append(vec_qschut); rec_name_list->append("VEC_PSCHUT"); rec_type_list->append("FLOAT64_(" + to_string(xi_block_size) + ")"); rec_ptr_list->append(vec_pschut); rec_name_list->append("VEC_S0MAGT"); rec_type_list->append("FLOAT64_(" + to_string(xi_block_size) + ")"); rec_ptr_list->append(vec_s0magt); rec_name_list->append("VEC_SCC1"); rec_type_list->append("FLOAT64_(" + to_string(xi_block_size) + ")"); rec_ptr_list->append(vec_scc1); rec_name_list->append("VEC_SCC2"); rec_type_list->append("FLOAT64_(" + to_string(xi_block_size) + ")"); rec_ptr_list->append(vec_scc2); rec_name_list->append("VEC_ABC1"); rec_type_list->append("FLOAT64_(" + to_string(xi_block_size) + ")"); rec_ptr_list->append(vec_abc1); rec_name_list->append("VEC_ABC2"); rec_type_list->append("FLOAT64_(" + to_string(xi_block_size) + ")"); rec_ptr_list->append(vec_abc2); rec_name_list->append("VEC_EXC1"); rec_type_list->append("FLOAT64_(" + to_string(xi_block_size) + ")"); rec_ptr_list->append(vec_exc1); rec_name_list->append("VEC_EXC2"); rec_type_list->append("FLOAT64_(" + to_string(xi_block_size) + ")"); rec_ptr_list->append(vec_exc2); rec_name_list->append("VEC_ALBEDC1"); rec_type_list->append("FLOAT64_(" + to_string(xi_block_size) + ")"); rec_ptr_list->append(vec_albedc1); rec_name_list->append("VEC_ALBEDC2"); rec_type_list->append("FLOAT64_(" + to_string(xi_block_size) + ")"); rec_ptr_list->append(vec_albedc2); rec_name_list->append("VEC_QSCAMC1"); rec_type_list->append("FLOAT64_(" + to_string(xi_block_size) + ")"); rec_ptr_list->append(vec_qscamc1); rec_name_list->append("VEC_QSCAMC2"); rec_type_list->append("FLOAT64_(" + to_string(xi_block_size) + ")"); rec_ptr_list->append(vec_qscamc2); rec_name_list->append("VEC_QABSMC1"); rec_type_list->append("FLOAT64_(" + to_string(xi_block_size) + ")"); rec_ptr_list->append(vec_qabsmc1); rec_name_list->append("VEC_QABSMC2"); rec_type_list->append("FLOAT64_(" + to_string(xi_block_size) + ")"); rec_ptr_list->append(vec_qabsmc2); rec_name_list->append("VEC_QEXTMC1"); rec_type_list->append("FLOAT64_(" + to_string(xi_block_size) + ")"); rec_ptr_list->append(vec_qextmc1); rec_name_list->append("VEC_QEXTMC2"); rec_type_list->append("FLOAT64_(" + to_string(xi_block_size) + ")"); rec_ptr_list->append(vec_qextmc2); rec_name_list->append("VEC_SCCRT1"); rec_type_list->append("FLOAT64_(" + to_string(xi_block_size) + ")"); rec_ptr_list->append(vec_sccrt1); rec_name_list->append("VEC_SCCRT2"); rec_type_list->append("FLOAT64_(" + to_string(xi_block_size) + ")"); rec_ptr_list->append(vec_sccrt2); rec_name_list->append("VEC_ABCRT1"); rec_type_list->append("FLOAT64_(" + to_string(xi_block_size) + ")"); rec_ptr_list->append(vec_abcrt1); rec_name_list->append("VEC_ABCRT2"); rec_type_list->append("FLOAT64_(" + to_string(xi_block_size) + ")"); rec_ptr_list->append(vec_abcrt2); rec_name_list->append("VEC_EXCRT1"); rec_type_list->append("FLOAT64_(" + to_string(xi_block_size) + ")"); rec_ptr_list->append(vec_excrt1); rec_name_list->append("VEC_EXCRT2"); rec_type_list->append("FLOAT64_(" + to_string(xi_block_size) + ")"); rec_ptr_list->append(vec_excrt2); rec_name_list->append("VEC_FSAC11"); rec_type_list->append("FLOAT64_(" + to_string(2 * xi_block_size) + ")"); rec_ptr_list->append(vec_fsac11); rec_name_list->append("VEC_FSAC21"); rec_type_list->append("FLOAT64_(" + to_string(2 * xi_block_size) + ")"); rec_ptr_list->append(vec_fsac21); rec_name_list->append("VEC_FSAC22"); rec_type_list->append("FLOAT64_(" + to_string(2 * xi_block_size) + ")"); rec_ptr_list->append(vec_fsac22); rec_name_list->append("VEC_FSAC12"); rec_type_list->append("FLOAT64_(" + to_string(2 * xi_block_size) + ")"); rec_ptr_list->append(vec_fsac12); rec_name_list->append("VEC_QSCHUC1"); rec_type_list->append("FLOAT64_(" + to_string(xi_block_size) + ")"); rec_ptr_list->append(vec_qschuc1); rec_name_list->append("VEC_QSCHUC2"); rec_type_list->append("FLOAT64_(" + to_string(xi_block_size) + ")"); rec_ptr_list->append(vec_qschuc2); rec_name_list->append("VEC_PSCHUC1"); rec_type_list->append("FLOAT64_(" + to_string(xi_block_size) + ")"); rec_ptr_list->append(vec_pschuc1); rec_name_list->append("VEC_PSCHUC2"); rec_type_list->append("FLOAT64_(" + to_string(xi_block_size) + ")"); rec_ptr_list->append(vec_pschuc2); rec_name_list->append("VEC_S0MAGC1"); rec_type_list->append("FLOAT64_(" + to_string(xi_block_size) + ")"); rec_ptr_list->append(vec_s0magc1); rec_name_list->append("VEC_S0MAGC2"); rec_type_list->append("FLOAT64_(" + to_string(xi_block_size) + ")"); rec_ptr_list->append(vec_s0magc2); rec_name_list->append("VEC_COSAVC1"); rec_type_list->append("FLOAT64_(" + to_string(xi_block_size) + ")"); rec_ptr_list->append(vec_cosavc1); rec_name_list->append("VEC_COSAVC2"); rec_type_list->append("FLOAT64_(" + to_string(xi_block_size) + ")"); rec_ptr_list->append(vec_cosavc2); rec_name_list->append("VEC_RAPRC1"); rec_type_list->append("FLOAT64_(" + to_string(xi_block_size) + ")"); rec_ptr_list->append(vec_raprc1); rec_name_list->append("VEC_RAPRC2"); rec_type_list->append("FLOAT64_(" + to_string(xi_block_size) + ")"); rec_ptr_list->append(vec_raprc2); rec_name_list->append("VEC_FKC1"); rec_type_list->append("FLOAT64_(" + to_string(xi_block_size) + ")"); rec_ptr_list->append(vec_fkc1); rec_name_list->append("VEC_FKC2"); rec_type_list->append("FLOAT64_(" + to_string(xi_block_size) + ")"); rec_ptr_list->append(vec_fkc2); rec_name_list->append("VEC_DIR_SCAN"); rec_type_list->append("FLOAT64_(" + to_string(ndirs) + ")"); rec_ptr_list->append(vec_dir_scand); rec_name_list->append("VEC_DIR_CFMP"); rec_type_list->append("FLOAT64_(" + to_string(ndirs) + ")"); rec_ptr_list->append(vec_dir_cfmp); rec_name_list->append("VEC_DIR_SFMP"); rec_type_list->append("FLOAT64_(" + to_string(ndirs) + ")"); rec_ptr_list->append(vec_dir_sfmp); rec_name_list->append("VEC_DIR_CFSP"); rec_type_list->append("FLOAT64_(" + to_string(ndirs) + ")"); rec_ptr_list->append(vec_dir_cfsp); rec_name_list->append("VEC_DIR_SFSP"); rec_type_list->append("FLOAT64_(" + to_string(ndirs) + ")"); rec_ptr_list->append(vec_dir_sfsp); rec_name_list->append("VEC_DIR_UN"); rec_type_list->append("FLOAT64_(" + to_string(3 * ndirs) + ")"); rec_ptr_list->append(vec_dir_un); rec_name_list->append("VEC_DIR_UNS"); rec_type_list->append("FLOAT64_(" + to_string(3 * ndirs) + ")"); rec_ptr_list->append(vec_dir_uns); rec_name_list->append("VEC_DIR_SAS11"); rec_type_list->append("FLOAT64_(" + to_string(2 * ndirs * configurations * xi_block_size) + ")"); rec_ptr_list->append(vec_dir_sas11); rec_name_list->append("VEC_DIR_SAS21"); rec_type_list->append("FLOAT64_(" + to_string(2 * ndirs * configurations * xi_block_size) + ")"); rec_ptr_list->append(vec_dir_sas21); rec_name_list->append("VEC_DIR_SAS12"); rec_type_list->append("FLOAT64_(" + to_string(2 * ndirs * configurations * xi_block_size) + ")"); rec_ptr_list->append(vec_dir_sas12); rec_name_list->append("VEC_DIR_SAS22"); rec_type_list->append("FLOAT64_(" + to_string(2 * ndirs * configurations * xi_block_size) + ")"); rec_ptr_list->append(vec_dir_sas22); rec_name_list->append("VEC_DIR_MULS"); rec_type_list->append("FLOAT64_(" + to_string(16 * ndirs * configurations * xi_block_size) + ")"); rec_ptr_list->append(vec_dir_muls); rec_name_list->append("VEC_DIR_MULSLR"); rec_type_list->append("FLOAT64_(" + to_string(16 * ndirs * configurations * xi_block_size) + ")"); rec_ptr_list->append(vec_dir_mulslr); rec_name_list->append("VEC_DIR_SAT11"); rec_type_list->append("FLOAT64_(" + to_string(2 * ndirs * xi_block_size) + ")"); rec_ptr_list->append(vec_dir_sat11); rec_name_list->append("VEC_DIR_SAT21"); rec_type_list->append("FLOAT64_(" + to_string(2 * ndirs * xi_block_size) + ")"); rec_ptr_list->append(vec_dir_sat21); rec_name_list->append("VEC_DIR_SAT12"); rec_type_list->append("FLOAT64_(" + to_string(2 * ndirs * xi_block_size) + ")"); rec_ptr_list->append(vec_dir_sat12); rec_name_list->append("VEC_DIR_SAT22"); rec_type_list->append("FLOAT64_(" + to_string(2 * ndirs * xi_block_size) + ")"); rec_ptr_list->append(vec_dir_sat22); rec_name_list->append("VEC_DIR_SCC1"); rec_type_list->append("FLOAT64_(" + to_string(ndirs * xi_block_size) + ")"); rec_ptr_list->append(vec_dir_scc1); rec_name_list->append("VEC_DIR_SCC2"); rec_type_list->append("FLOAT64_(" + to_string(ndirs * xi_block_size) + ")"); rec_ptr_list->append(vec_dir_scc2); rec_name_list->append("VEC_DIR_ABC1"); rec_type_list->append("FLOAT64_(" + to_string(ndirs * xi_block_size) + ")"); rec_ptr_list->append(vec_dir_abc1); rec_name_list->append("VEC_DIR_ABC2"); rec_type_list->append("FLOAT64_(" + to_string(ndirs * xi_block_size) + ")"); rec_ptr_list->append(vec_dir_abc2); rec_name_list->append("VEC_DIR_EXC1"); rec_type_list->append("FLOAT64_(" + to_string(ndirs * xi_block_size) + ")"); rec_ptr_list->append(vec_dir_exc1); rec_name_list->append("VEC_DIR_EXC2"); rec_type_list->append("FLOAT64_(" + to_string(ndirs * xi_block_size) + ")"); rec_ptr_list->append(vec_dir_exc2); rec_name_list->append("VEC_DIR_ALBEDC1"); rec_type_list->append("FLOAT64_(" + to_string(ndirs * xi_block_size) + ")"); rec_ptr_list->append(vec_dir_albedc1); rec_name_list->append("VEC_DIR_ALBEDC2"); rec_type_list->append("FLOAT64_(" + to_string(ndirs * xi_block_size) + ")"); rec_ptr_list->append(vec_dir_albedc2); rec_name_list->append("VEC_DIR_QSCC1"); rec_type_list->append("FLOAT64_(" + to_string(ndirs * xi_block_size) + ")"); rec_ptr_list->append(vec_dir_qscc1); rec_name_list->append("VEC_DIR_QSCC2"); rec_type_list->append("FLOAT64_(" + to_string(ndirs * xi_block_size) + ")"); rec_ptr_list->append(vec_dir_qscc2); rec_name_list->append("VEC_DIR_QABC1"); rec_type_list->append("FLOAT64_(" + to_string(ndirs * xi_block_size) + ")"); rec_ptr_list->append(vec_dir_qabc1); rec_name_list->append("VEC_DIR_QABC2"); rec_type_list->append("FLOAT64_(" + to_string(ndirs * xi_block_size) + ")"); rec_ptr_list->append(vec_dir_qabc2); rec_name_list->append("VEC_DIR_QEXC1"); rec_type_list->append("FLOAT64_(" + to_string(ndirs * xi_block_size) + ")"); rec_ptr_list->append(vec_dir_qexc1); rec_name_list->append("VEC_DIR_QEXC2"); rec_type_list->append("FLOAT64_(" + to_string(ndirs * xi_block_size) + ")"); rec_ptr_list->append(vec_dir_qexc2); rec_name_list->append("VEC_DIR_SCCRT1"); rec_type_list->append("FLOAT64_(" + to_string(ndirs * xi_block_size) + ")"); rec_ptr_list->append(vec_dir_sccrt1); rec_name_list->append("VEC_DIR_SCCRT2"); rec_type_list->append("FLOAT64_(" + to_string(ndirs * xi_block_size) + ")"); rec_ptr_list->append(vec_dir_sccrt2); rec_name_list->append("VEC_DIR_ABCRT1"); rec_type_list->append("FLOAT64_(" + to_string(ndirs * xi_block_size) + ")"); rec_ptr_list->append(vec_dir_abcrt1); rec_name_list->append("VEC_DIR_ABCRT2"); rec_type_list->append("FLOAT64_(" + to_string(ndirs * xi_block_size) + ")"); rec_ptr_list->append(vec_dir_abcrt2); rec_name_list->append("VEC_DIR_EXCRT1"); rec_type_list->append("FLOAT64_(" + to_string(ndirs * xi_block_size) + ")"); rec_ptr_list->append(vec_dir_excrt1); rec_name_list->append("VEC_DIR_EXCRT2"); rec_type_list->append("FLOAT64_(" + to_string(ndirs * xi_block_size) + ")"); rec_ptr_list->append(vec_dir_excrt2); rec_name_list->append("VEC_DIR_FSAC11"); rec_type_list->append("FLOAT64_(" + to_string(2 * ndirs * xi_block_size) + ")"); rec_ptr_list->append(vec_dir_fsac11); rec_name_list->append("VEC_DIR_FSAC21"); rec_type_list->append("FLOAT64_(" + to_string(2 * ndirs * xi_block_size) + ")"); rec_ptr_list->append(vec_dir_fsac21); rec_name_list->append("VEC_DIR_FSAC12"); rec_type_list->append("FLOAT64_(" + to_string(2 * ndirs * xi_block_size) + ")"); rec_ptr_list->append(vec_dir_fsac12); rec_name_list->append("VEC_DIR_FSAC22"); rec_type_list->append("FLOAT64_(" + to_string(2 * ndirs * xi_block_size) + ")"); rec_ptr_list->append(vec_dir_fsac22); rec_name_list->append("VEC_DIR_SAC11"); rec_type_list->append("FLOAT64_(" + to_string(2 * ndirs * xi_block_size) + ")"); rec_ptr_list->append(vec_dir_sac11); rec_name_list->append("VEC_DIR_SAC21"); rec_type_list->append("FLOAT64_(" + to_string(2 * ndirs * xi_block_size) + ")"); rec_ptr_list->append(vec_dir_sac21); rec_name_list->append("VEC_DIR_SAC12"); rec_type_list->append("FLOAT64_(" + to_string(2 * ndirs * xi_block_size) + ")"); rec_ptr_list->append(vec_dir_sac12); rec_name_list->append("VEC_DIR_SAC22"); rec_type_list->append("FLOAT64_(" + to_string(2 * ndirs * xi_block_size) + ")"); rec_ptr_list->append(vec_dir_sac22); rec_name_list->append("VEC_DIR_QSCHUC1"); rec_type_list->append("FLOAT64_(" + to_string(ndirs * xi_block_size) + ")"); rec_ptr_list->append(vec_dir_qschuc1); rec_name_list->append("VEC_DIR_QSCHUC2"); rec_type_list->append("FLOAT64_(" + to_string(ndirs * xi_block_size) + ")"); rec_ptr_list->append(vec_dir_qschuc2); rec_name_list->append("VEC_DIR_PSCHUC1"); rec_type_list->append("FLOAT64_(" + to_string(ndirs * xi_block_size) + ")"); rec_ptr_list->append(vec_dir_pschuc1); rec_name_list->append("VEC_DIR_PSCHUC2"); rec_type_list->append("FLOAT64_(" + to_string(ndirs * xi_block_size) + ")"); rec_ptr_list->append(vec_dir_pschuc2); rec_name_list->append("VEC_DIR_S0MAGC1"); rec_type_list->append("FLOAT64_(" + to_string(ndirs * xi_block_size) + ")"); rec_ptr_list->append(vec_dir_s0magc1); rec_name_list->append("VEC_DIR_S0MAGC2"); rec_type_list->append("FLOAT64_(" + to_string(ndirs * xi_block_size) + ")"); rec_ptr_list->append(vec_dir_s0magc2); rec_name_list->append("VEC_DIR_COSAVC1"); rec_type_list->append("FLOAT64_(" + to_string(ndirs * xi_block_size) + ")"); rec_ptr_list->append(vec_dir_cosavc1); rec_name_list->append("VEC_DIR_COSAVC2"); rec_type_list->append("FLOAT64_(" + to_string(ndirs * xi_block_size) + ")"); rec_ptr_list->append(vec_dir_cosavc2); rec_name_list->append("VEC_DIR_RAPRC1"); rec_type_list->append("FLOAT64_(" + to_string(ndirs * xi_block_size) + ")"); rec_ptr_list->append(vec_dir_raprc1); rec_name_list->append("VEC_DIR_RAPRC2"); rec_type_list->append("FLOAT64_(" + to_string(ndirs * xi_block_size) + ")"); rec_ptr_list->append(vec_dir_raprc2); rec_name_list->append("VEC_DIR_FLC1"); rec_type_list->append("FLOAT64_(" + to_string(ndirs * xi_block_size) + ")"); rec_ptr_list->append(vec_dir_flc1); rec_name_list->append("VEC_DIR_FLC2"); rec_type_list->append("FLOAT64_(" + to_string(ndirs * xi_block_size) + ")"); rec_ptr_list->append(vec_dir_flc2); rec_name_list->append("VEC_DIR_FRC1"); rec_type_list->append("FLOAT64_(" + to_string(ndirs * xi_block_size) + ")"); rec_ptr_list->append(vec_dir_frc1); rec_name_list->append("VEC_DIR_FRC2"); rec_type_list->append("FLOAT64_(" + to_string(ndirs * xi_block_size) + ")"); rec_ptr_list->append(vec_dir_frc2); rec_name_list->append("VEC_DIR_FKC1"); rec_type_list->append("FLOAT64_(" + to_string(ndirs * xi_block_size) + ")"); rec_ptr_list->append(vec_dir_fkc1); rec_name_list->append("VEC_DIR_FKC2"); rec_type_list->append("FLOAT64_(" + to_string(ndirs * xi_block_size) + ")"); rec_ptr_list->append(vec_dir_fkc2); rec_name_list->append("VEC_DIR_FXC1"); rec_type_list->append("FLOAT64_(" + to_string(ndirs * xi_block_size) + ")"); rec_ptr_list->append(vec_dir_fxc1); rec_name_list->append("VEC_DIR_FXC2"); rec_type_list->append("FLOAT64_(" + to_string(ndirs * xi_block_size) + ")"); rec_ptr_list->append(vec_dir_fxc2); rec_name_list->append("VEC_DIR_FYC1"); rec_type_list->append("FLOAT64_(" + to_string(ndirs * xi_block_size) + ")"); rec_ptr_list->append(vec_dir_fyc1); rec_name_list->append("VEC_DIR_FYC2"); rec_type_list->append("FLOAT64_(" + to_string(ndirs * xi_block_size) + ")"); rec_ptr_list->append(vec_dir_fyc2); rec_name_list->append("VEC_DIR_FZC1"); rec_type_list->append("FLOAT64_(" + to_string(ndirs * xi_block_size) + ")"); rec_ptr_list->append(vec_dir_fzc1); rec_name_list->append("VEC_DIR_FZC2"); rec_type_list->append("FLOAT64_(" + to_string(ndirs * xi_block_size) + ")"); rec_ptr_list->append(vec_dir_fzc2); rec_name_list->append("VEC_DIR_TQELC1"); rec_type_list->append("FLOAT64_(" + to_string(ndirs * xi_block_size) + ")"); rec_ptr_list->append(vec_dir_tqelc1); rec_name_list->append("VEC_DIR_TQELC2"); rec_type_list->append("FLOAT64_(" + to_string(ndirs * xi_block_size) + ")"); rec_ptr_list->append(vec_dir_tqelc2); rec_name_list->append("VEC_DIR_TQERC1"); rec_type_list->append("FLOAT64_(" + to_string(ndirs * xi_block_size) + ")"); rec_ptr_list->append(vec_dir_tqerc1); rec_name_list->append("VEC_DIR_TQERC2"); rec_type_list->append("FLOAT64_(" + to_string(ndirs * xi_block_size) + ")"); rec_ptr_list->append(vec_dir_tqerc2); rec_name_list->append("VEC_DIR_TQEKC1"); rec_type_list->append("FLOAT64_(" + to_string(ndirs * xi_block_size) + ")"); rec_ptr_list->append(vec_dir_tqekc1); rec_name_list->append("VEC_DIR_TQEKC2"); rec_type_list->append("FLOAT64_(" + to_string(ndirs * xi_block_size) + ")"); rec_ptr_list->append(vec_dir_tqekc2); rec_name_list->append("VEC_DIR_TQEXC1"); rec_type_list->append("FLOAT64_(" + to_string(ndirs * xi_block_size) + ")"); rec_ptr_list->append(vec_dir_tqexc1); rec_name_list->append("VEC_DIR_TQEXC2"); rec_type_list->append("FLOAT64_(" + to_string(ndirs * xi_block_size) + ")"); rec_ptr_list->append(vec_dir_tqexc2); rec_name_list->append("VEC_DIR_TQEYC1"); rec_type_list->append("FLOAT64_(" + to_string(ndirs * xi_block_size) + ")"); rec_ptr_list->append(vec_dir_tqeyc1); rec_name_list->append("VEC_DIR_TQEYC2"); rec_type_list->append("FLOAT64_(" + to_string(ndirs * xi_block_size) + ")"); rec_ptr_list->append(vec_dir_tqeyc2); rec_name_list->append("VEC_DIR_TQEZC1"); rec_type_list->append("FLOAT64_(" + to_string(ndirs * xi_block_size) + ")"); rec_ptr_list->append(vec_dir_tqezc1); rec_name_list->append("VEC_DIR_TQEZC2"); rec_type_list->append("FLOAT64_(" + to_string(ndirs * xi_block_size) + ")"); rec_ptr_list->append(vec_dir_tqezc2); rec_name_list->append("VEC_DIR_TQSLC1"); rec_type_list->append("FLOAT64_(" + to_string(ndirs * xi_block_size) + ")"); rec_ptr_list->append(vec_dir_tqslc1); rec_name_list->append("VEC_DIR_TQSLC2"); rec_type_list->append("FLOAT64_(" + to_string(ndirs * xi_block_size) + ")"); rec_ptr_list->append(vec_dir_tqslc2); rec_name_list->append("VEC_DIR_TQSRC1"); rec_type_list->append("FLOAT64_(" + to_string(ndirs * xi_block_size) + ")"); rec_ptr_list->append(vec_dir_tqsrc1); rec_name_list->append("VEC_DIR_TQSRC2"); rec_type_list->append("FLOAT64_(" + to_string(ndirs * xi_block_size) + ")"); rec_ptr_list->append(vec_dir_tqsrc2); rec_name_list->append("VEC_DIR_TQSKC1"); rec_type_list->append("FLOAT64_(" + to_string(ndirs * xi_block_size) + ")"); rec_ptr_list->append(vec_dir_tqskc1); rec_name_list->append("VEC_DIR_TQSKC2"); rec_type_list->append("FLOAT64_(" + to_string(ndirs * xi_block_size) + ")"); rec_ptr_list->append(vec_dir_tqskc2); rec_name_list->append("VEC_DIR_TQSXC1"); rec_type_list->append("FLOAT64_(" + to_string(ndirs * xi_block_size) + ")"); rec_ptr_list->append(vec_dir_tqsxc1); rec_name_list->append("VEC_DIR_TQSXC2"); rec_type_list->append("FLOAT64_(" + to_string(ndirs * xi_block_size) + ")"); rec_ptr_list->append(vec_dir_tqsxc2); rec_name_list->append("VEC_DIR_TQSYC1"); rec_type_list->append("FLOAT64_(" + to_string(ndirs * xi_block_size) + ")"); rec_ptr_list->append(vec_dir_tqsyc1); rec_name_list->append("VEC_DIR_TQSYC2"); rec_type_list->append("FLOAT64_(" + to_string(ndirs * xi_block_size) + ")"); rec_ptr_list->append(vec_dir_tqsyc2); rec_name_list->append("VEC_DIR_TQSZC1"); rec_type_list->append("FLOAT64_(" + to_string(ndirs * xi_block_size) + ")"); rec_ptr_list->append(vec_dir_tqszc1); rec_name_list->append("VEC_DIR_TQSZC2"); rec_type_list->append("FLOAT64_(" + to_string(ndirs * xi_block_size) + ")"); rec_ptr_list->append(vec_dir_tqszc2); rec_name_list->append("VEC_DIR_MULC"); rec_type_list->append("FLOAT64_(" + to_string(16 * ndirs * xi_block_size) + ")"); rec_ptr_list->append(vec_dir_mulc); rec_name_list->append("VEC_DIR_MULCLR"); rec_type_list->append("FLOAT64_(" + to_string(16 * ndirs * xi_block_size) + ")"); rec_ptr_list->append(vec_dir_mulclr); // Convert the lists to arrays and write them to HDF5 string *rec_names = rec_name_list->to_array(); string *rec_types = rec_type_list->to_array(); void **rec_pointers = rec_ptr_list->to_array(); const int rec_num = rec_name_list->length(); FileSchema *schema = new FileSchema(rec_num, rec_types, rec_names); HDFFile *hdf_file = HDFFile::from_schema(*schema, file_name, H5F_ACC_TRUNC); for (int ri = 0; ri < rec_num; ri++) hdf_file->write(rec_names[ri], rec_types[ri], rec_pointers[ri]); hdf_file->close(); // Clean memory delete rec_name_list; delete rec_type_list; delete rec_ptr_list; delete[] rec_names; delete[] rec_types; delete[] rec_pointers; delete schema; delete hdf_file; return 0; } int ClusterOutputInfo::write_legacy(const std::string &output) { const dcomplex cc0 = 0.0 + I * 0.0; int result = 0; FILE *p_outfile = fopen(output.c_str(), "w"); if (p_outfile != NULL) { if (vec_jxi[0] == 1) { // Write the preamble of c_OCLU. fprintf(p_outfile, " READ(IR,*)NSPH,LI,LE,MXNDM,INPOL,NPNT,NPNTTS,IAVM,ISAM\n"); #ifdef USE_ILP64 fprintf( p_outfile, " %5d%5d%5d%5ld%5d%5d%5d%5d%5d\n", nsph, li, le, mxndm, inpol, npnt, npntts, iavm, isam ); #else fprintf( p_outfile, " %5d%5d%5d%5d%5d%5d%5d%5d%5d\n", nsph, li, le, mxndm, inpol, npnt, npntts, iavm, isam ); #endif // USE_ILP64 fprintf(p_outfile, " READ(IR,*)RXX(I),RYY(I),RZZ(I)\n"); for (int ri = 0; ri < nsph; ri++) { fprintf( p_outfile, "%17.8lE%17.8lE%17.8lE\n", vec_x_coords[ri], vec_y_coords[ri], vec_z_coords[ri] ); } fprintf(p_outfile, " READ(IR,*)TH,THSTP,THLST,THS,THSSTP,THSLST\n"); fprintf( p_outfile, " %10.3lE%10.3lE%10.3lE%10.3lE%10.3lE%10.3lE\n", th, thstp, thlst, ths, thsstp, thslst ); fprintf(p_outfile, " READ(IR,*)PH,PHSTP,PHLST,PHS,PHSSTP,PHSLST\n"); fprintf( p_outfile, " %10.3lE%10.3lE%10.3lE%10.3lE%10.3lE%10.3lE\n", ph, phstp, phlst, phs, phsstp, phslst ); fprintf(p_outfile, " READ(IR,*)JWTM\n"); fprintf(p_outfile, " %5d\n", jwtm); fprintf(p_outfile, " READ(ITIN)NSPHT\n"); fprintf(p_outfile, " READ(ITIN)(IOG(I),I=1,NSPH)\n"); fprintf(p_outfile, " READ(ITIN)EXDC,WP,XIP,IDFC,NXI\n"); fprintf(p_outfile, " READ(ITIN)(XIV(I),I=1,NXI)\n"); fprintf(p_outfile, " READ(ITIN)NSHL(I),ROS(I)\n"); fprintf(p_outfile, " READ(ITIN)(RCF(I,NS),NS=1,NSH)\n \n"); fprintf(p_outfile, " REFR. INDEX OF EXTERNAL MEDIUM=%15.7lE\n", exri); if (idfc < 0) { fprintf(p_outfile, " VK=%15.7lE, XI IS SCALE FACTOR FOR LENGTHS\n \n", vec_vk[0]); } } // Write the wavelength loop data. for (int jxi = 0; jxi < xi_block_size; jxi++) { fprintf(p_outfile, "========== JXI =%3d ====================\n", vec_jxi[jxi]); if (idfc >= 0) { fprintf(p_outfile, " VK=%15.7lE, XI=%15.7lE\n", vec_vk[jxi], vec_xi[jxi]); } else { fprintf(p_outfile, " XI=%15.7lE\n", vec_xi[jxi]); } if (vec_ier[jxi] == 1) { fprintf(p_outfile, " STOP IN HJV\n"); result = 1; break; // jxi loop } if (vec_ier[jxi] == 2) { fprintf(p_outfile, " STOP IN DME\n"); result = 2; break; // jxi loop } double alamb = 2.0 * 3.141592653589793 / vec_vk[jxi]; if (inpol == 0) fprintf(p_outfile, " LIN\n"); else fprintf(p_outfile, " CIRC\n"); if (li != le) fprintf(p_outfile, " SPHERES; LMX=LI\n"); for (int si = 0; si < configurations; si++) { fprintf(p_outfile, " SPHERE %2d\n", si + 1); if (vec_sphere_ref_indices[jxi * configurations + si] == cc0) fprintf(p_outfile, " SIZE=%15.7lE\n", vec_sphere_sizes[jxi * configurations + si]); else fprintf( p_outfile, " SIZE=%15.7lE, REFRACTIVE INDEX=%15.7lE%15.7lE\n", vec_sphere_sizes[jxi * configurations + si], real(vec_sphere_ref_indices[jxi * configurations + si]), imag(vec_sphere_ref_indices[jxi * configurations + si]) ); fprintf(p_outfile, " ----- SCS ----- ABS ----- EXS ----- ALBEDS --\n"); fprintf( p_outfile, " %14.7lE%15.7lE%15.7lE%15.7lE\n", vec_sphere_scs[jxi * configurations + si], vec_sphere_abs[jxi * configurations + si], vec_sphere_exs[jxi * configurations + si], vec_sphere_albs[jxi * configurations + si] ); fprintf(p_outfile, " ---- SCS/GS -- ABS/GS -- EXS/GS ---\n"); fprintf( p_outfile, " %14.7lE%15.7lE%15.7lE\n", vec_sphere_sqscs[jxi * configurations + si], vec_sphere_sqabs[jxi * configurations + si], vec_sphere_sqexs[jxi * configurations + si] ); fprintf( p_outfile, " FSAS=%15.7lE%15.7lE\n", real(vec_fsas[jxi * configurations + si]), imag(vec_fsas[jxi * configurations + si]) ); fprintf( p_outfile, "INSERTION: CS_SPHERE %15.7lE%15.7lE%15.7lE%15.7lE\n", alamb, vec_sphere_scs[jxi * configurations + si], vec_sphere_abs[jxi * configurations + si], vec_sphere_exs[jxi * configurations + si] ); fprintf( p_outfile, " QSCHU=%15.7lE, PSCHU=%15.7lE, S0MAG=%15.7lE\n", vec_qschus[jxi * configurations + si], vec_pschus[jxi * configurations + si], vec_s0mags[jxi * configurations + si] ); fprintf( p_outfile, " COSAV=%15.7lE, RAPRS=%15.7lE\n", vec_cosavs[jxi * configurations + si], vec_raprs[jxi * configurations + si] ); fprintf( p_outfile, " IPO= 1, TQEk=%15.7lE, TQSk=%15.7lE\n", vec_tqek1[jxi * configurations + si], vec_tqsk1[jxi * configurations + si] ); fprintf( p_outfile, " IPO= 2, TQEk=%15.7lE, TQSk=%15.7lE\n", vec_tqek2[jxi * configurations + si], vec_tqsk2[jxi * configurations + si] ); } // si configuration loop fprintf( p_outfile, " FSAT=%15.7lE%15.7lE\n", real(vec_fsat[jxi]), imag(vec_fsat[jxi]) ); fprintf( p_outfile, " QSCHU=%15.7lE, PSCHU=%15.7lE, S0MAG=%15.7lE\n", vec_qschut[jxi], vec_pschut[jxi], vec_s0magt[jxi] ); fprintf(p_outfile, " CLUSTER (ENSEMBLE AVERAGE, MODE%2d)\n", iavm); // Parallel polarization cluster average section if (inpol == 0) fprintf(p_outfile, " LIN -1\n"); else fprintf(p_outfile, " CIRC -1\n"); fprintf(p_outfile, " ----- SCC ----- ABC ----- EXC ----- ALBEDC --\n"); fprintf( p_outfile, " %14.7lE%15.7lE%15.7lE%15.7lE\n", vec_scc1[jxi], vec_abc1[jxi], vec_exc1[jxi], vec_albedc1[jxi] ); fprintf(p_outfile, " --- SCC/TGS - ABC/TGS - EXC/TGS ---\n"); fprintf( p_outfile, " %14.7lE%15.7lE%15.7lE\n", vec_qscamc1[jxi], vec_qabsmc1[jxi], vec_qextmc1[jxi] ); fprintf(p_outfile, " ---- SCCRT --- ABCRT --- EXCRT ----\n"); fprintf( p_outfile, " %14.7lE%15.7lE%15.7lE\n", vec_sccrt1[jxi], vec_abcrt1[jxi], vec_excrt1[jxi] ); fprintf( p_outfile, " FSAC(1,1)=%15.7lE%15.7lE FSAC(2,1)=%15.7lE%15.7lE\n", real(vec_fsac11[jxi]), imag(vec_fsac11[jxi]), real(vec_fsac21[jxi]), imag(vec_fsac21[jxi]) ); fprintf( p_outfile, " RE(FSAC(1,1))/RE(TFSAS)=%15.7lE, IM(FSAC(1,1))/IM(TFSAS)=%15.7lE\n", real(vec_fsac11[jxi]) / real(vec_fsat[jxi]), imag(vec_fsac11[jxi]) / imag(vec_fsat[jxi]) ); fprintf( p_outfile, " QSCHU=%15.7lE, PSCHU=%15.7lE, S0MAG=%15.7lE\n", vec_qschuc1[jxi], vec_pschuc1[jxi], vec_s0magc1[jxi] ); fprintf( p_outfile, " COSAV=%15.7lE, RAPRS=%15.7lE\n", vec_cosavc1[jxi], vec_raprc1[jxi] ); fprintf(p_outfile, " Fk=%15.7lE\n", vec_fkc1[jxi]); fprintf( p_outfile, "INSERTION: CSM_CLUSTER %15.7lE%15.7lE%15.7lE%15.7lE\n", alamb, vec_scc1[jxi], vec_abc1[jxi], vec_exc1[jxi] ); // Perpendicular polarization cluster average section if (inpol == 0) fprintf(p_outfile, " LIN 1\n"); else fprintf(p_outfile, " CIRC 1\n"); fprintf(p_outfile, " ----- SCC ----- ABC ----- EXC ----- ALBEDC --\n"); fprintf( p_outfile, " %14.7lE%15.7lE%15.7lE%15.7lE\n", vec_scc2[jxi], vec_abc2[jxi], vec_exc2[jxi], vec_albedc2[jxi] ); fprintf(p_outfile, " --- SCC/TGS - ABC/TGS - EXC/TGS ---\n"); fprintf( p_outfile, " %14.7lE%15.7lE%15.7lE\n", vec_qscamc2[jxi], vec_qabsmc2[jxi], vec_qextmc2[jxi] ); fprintf(p_outfile, " ---- SCCRT --- ABCRT --- EXCRT ----\n"); fprintf( p_outfile, " %14.7lE%15.7lE%15.7lE\n", vec_sccrt2[jxi], vec_abcrt2[jxi], vec_excrt2[jxi] ); fprintf( p_outfile, " FSAC(2,2)=%15.7lE%15.7lE FSAC(1,2)=%15.7lE%15.7lE\n", real(vec_fsac22[jxi]), imag(vec_fsac22[jxi]), real(vec_fsac12[jxi]), imag(vec_fsac12[jxi]) ); fprintf( p_outfile, " RE(FSAC(2,2))/RE(TFSAS)=%15.7lE, IM(FSAC(2,2))/IM(TFSAS)=%15.7lE\n", real(vec_fsac22[jxi]) / real(vec_fsat[jxi]), imag(vec_fsac22[jxi]) / imag(vec_fsat[jxi]) ); fprintf( p_outfile, " QSCHU=%15.7lE, PSCHU=%15.7lE, S0MAG=%15.7lE\n", vec_qschuc2[jxi], vec_pschuc2[jxi], vec_s0magc2[jxi] ); fprintf( p_outfile, " COSAV=%15.7lE, RAPRS=%15.7lE\n", vec_cosavc2[jxi], vec_raprc2[jxi] ); fprintf(p_outfile, " Fk=%15.7lE\n", vec_fkc2[jxi]); fprintf( p_outfile, " (RE(FSAC(1,1))-RE(FSAC(2,2)))/RE(FSAC(1,1))=%15.7lE\n", (real(vec_fsac11[jxi]) - real(vec_fsac22[jxi])) / real(vec_fsac11[jxi]) ); fprintf( p_outfile, " (IM(FSAC(1,1))-IM(FSAC(2,2)))/IM(FSAC(1,1))=%15.7lE\n", (imag(vec_fsac11[jxi]) - imag(vec_fsac22[jxi])) / imag(vec_fsac11[jxi]) ); // Differential directional loop // Loop sorting (outer to inner) is: // THETA_INC - PHI_INC - THETA_SCAT - PHI_SCAT int dir_index = 0; for (int jth = 0; jth < _num_theta; jth++) { for (int jph = 0; jph < _num_phi; jph++) { for (int jths = 0; jths < _num_thetas; jths++) { for (int jphs = 0; jphs < _num_phis; jphs++) { fprintf( p_outfile, "********** JTH =%3d, JPH =%3d, JTHS =%3d, JPHS =%3d ********************\n", jth + 1, jph + 1, jths + 1, jphs + 1 ); fprintf( p_outfile, " TIDG=%10.3lE, PIDG=%10.3lE, TSDG=%10.3lE, PSDG=%10.3lE\n", th + jth * thstp, ph + jph * phstp, ths + jths * thsstp, phs + jphs * phsstp ); fprintf(p_outfile, " SCAND=%10.3lE\n", vec_dir_scand[dir_index]); fprintf( p_outfile, " CFMP=%15.7lE, SFMP=%15.7lE\n", vec_dir_cfmp[dir_index], vec_dir_sfmp[dir_index] ); fprintf( p_outfile, " CFSP=%15.7lE, SFSP=%15.7lE\n", vec_dir_cfsp[dir_index], vec_dir_sfsp[dir_index] ); if (isam >= 0) { fprintf( p_outfile, " UNI=(%12.5lE,%12.5lE,%12.5lE)\n", vec_dir_un[3 * dir_index], vec_dir_un[3 * dir_index + 1], vec_dir_un[3 * dir_index + 2] ); fprintf( p_outfile, " UNS=(%12.5lE,%12.5lE,%12.5lE)\n", vec_dir_uns[3 * dir_index], vec_dir_uns[3 * dir_index + 1], vec_dir_uns[3 * dir_index + 2] ); } else fprintf( p_outfile, " UN=(%12.5lE,%12.5lE,%12.5lE)\n\n", vec_dir_un[3 * dir_index], vec_dir_un[3 * dir_index + 1], vec_dir_un[3 * dir_index + 2] ); if (inpol == 0) fprintf(p_outfile, " LIN\n"); else fprintf(p_outfile, " CIRC\n"); if (li != le) fprintf(p_outfile, " SPHERES; LMX=MIN0(LI,LE)\n"); for (int si = 0; si < configurations; si++) { int sas_dir_index = jxi * configurations * ndirs + configurations * dir_index + si; fprintf(p_outfile, " SPHERE %2d\n", si + 1); fprintf( p_outfile, " SAS(1,1)=%15.7lE%15.7lE, SAS(2,1)=%15.7lE%15.7lE\n", real(vec_dir_sas11[sas_dir_index]), imag(vec_dir_sas11[sas_dir_index]), real(vec_dir_sas21[sas_dir_index]), imag(vec_dir_sas21[sas_dir_index]) ); fprintf( p_outfile, " SAS(1,2)=%15.7lE%15.7lE, SAS(2,2)=%15.7lE%15.7lE\n", real(vec_dir_sas12[sas_dir_index]), imag(vec_dir_sas12[sas_dir_index]), real(vec_dir_sas22[sas_dir_index]), imag(vec_dir_sas22[sas_dir_index]) ); fprintf(p_outfile, " MULS\n"); for (int i1 = 0; i1 < 4; i1++) { int muls_dir_index = 16 * jxi * ndirs * configurations + 16 * configurations * dir_index + 16 * si + 4 * i1; fprintf( p_outfile, " %15.7lE%15.7lE%15.7lE%15.7lE\n", vec_dir_muls[muls_dir_index], vec_dir_muls[muls_dir_index + 1], vec_dir_muls[muls_dir_index + 2], vec_dir_muls[muls_dir_index + 3] ); } // i1 loop fprintf(p_outfile, " MULSLR\n"); for (int i1 = 0; i1 < 4; i1++) { int muls_dir_index = 16 * jxi * ndirs * configurations + 16 * configurations * dir_index + 16 * si + 4 * i1; fprintf( p_outfile, " %15.7lE%15.7lE%15.7lE%15.7lE\n", vec_dir_mulslr[muls_dir_index], vec_dir_mulslr[muls_dir_index + 1], vec_dir_mulslr[muls_dir_index + 2], vec_dir_mulslr[muls_dir_index + 3] ); } // i1 loop } // si loop int sat_dir_index = jxi * ndirs + dir_index; fprintf( p_outfile, " SAT(1,1)=%15.7lE%15.7lE, SAT(2,1)=%15.7lE%15.7lE\n", real(vec_dir_sat11[sat_dir_index]), imag(vec_dir_sat11[sat_dir_index]), real(vec_dir_sat21[sat_dir_index]), imag(vec_dir_sat21[sat_dir_index]) ); fprintf( p_outfile, " SAT(1,2)=%15.7lE%15.7lE, SAT(2,2)=%15.7lE%15.7lE\n", real(vec_dir_sat12[sat_dir_index]), imag(vec_dir_sat12[sat_dir_index]), real(vec_dir_sat22[sat_dir_index]), imag(vec_dir_sat22[sat_dir_index]) ); bool goto190 = isam >= 0 && (jths > 0 || jphs > 0); fprintf(p_outfile, " CLUSTER\n"); // Parallel polarization cluster section if (inpol == 0) fprintf(p_outfile, " LIN -1\n"); else fprintf(p_outfile, " CIRC -1\n"); fprintf(p_outfile, " ----- SCC ----- ABC ----- EXC ----- ALBEDC --\n"); fprintf( p_outfile, " %14.7lE%15.7lE%15.7lE%15.7lE\n", vec_dir_scc1[sat_dir_index], vec_dir_abc1[sat_dir_index], vec_dir_exc1[sat_dir_index], vec_dir_albedc1[sat_dir_index] ); fprintf(p_outfile, " --- SCC/TGS - ABC/TGS - EXC/TGS ---\n"); fprintf( p_outfile, " %14.7lE%15.7lE%15.7lE\n", vec_dir_qscc1[sat_dir_index], vec_dir_qabc1[sat_dir_index], vec_dir_qexc1[sat_dir_index] ); fprintf(p_outfile, " ---- SCCRT --- ABCRT --- EXCRT ----\n"); fprintf( p_outfile, " %14.7lE%15.7lE%15.7lE\n", vec_dir_sccrt1[sat_dir_index], vec_dir_abcrt1[sat_dir_index], vec_dir_excrt1[sat_dir_index] ); fprintf( p_outfile, " FSAC(1,1)=%15.7lE%15.7lE FSAC(2,1)=%15.7lE%15.7lE\n", real(vec_dir_fsac11[sat_dir_index]), imag(vec_dir_fsac11[sat_dir_index]), real(vec_dir_fsac21[sat_dir_index]), imag(vec_dir_fsac21[sat_dir_index]) ); fprintf( p_outfile, " SAC(1,1)=%15.7lE%15.7lE SAC(2,1)=%15.7lE%15.7lE\n", real(vec_dir_sac11[sat_dir_index]), imag(vec_dir_sac11[sat_dir_index]), real(vec_dir_sac21[sat_dir_index]), imag(vec_dir_sac21[sat_dir_index]) ); fprintf( p_outfile, " RE(FSAC(1,1))/RE(TFSAS)=%15.7lE, IM(FSAC(1,1))/IM(TFSAS)=%15.7lE\n", real(vec_dir_fsac11[sat_dir_index]) / real(vec_fsat[jxi]), imag(vec_dir_fsac11[sat_dir_index]) / imag(vec_fsat[jxi]) ); fprintf( p_outfile, " QSCHU=%15.7lE, PSCHU=%15.7lE, S0MAG=%15.7lE\n", vec_dir_qschuc1[sat_dir_index], vec_dir_pschuc1[sat_dir_index], vec_dir_s0magc1[sat_dir_index] ); fprintf( p_outfile, "INSERTION: CS1_CLUSTER %13.5le%10.3le%10.3le%15.7le%15.7le%15.7le\n", alamb, th + jth * thstp, ths + jths * thsstp, vec_dir_scc1[sat_dir_index], vec_dir_abc1[sat_dir_index], vec_dir_exc1[sat_dir_index] ); if (!goto190) { fprintf( p_outfile, " COSAV=%15.7lE, RAPRS=%15.7lE\n", vec_dir_cosavc1[sat_dir_index], vec_dir_raprc1[sat_dir_index] ); fprintf( p_outfile, " Fl=%15.7lE, Fr=%15.7lE, Fk=%15.7lE\n", vec_dir_flc1[sat_dir_index], vec_dir_frc1[sat_dir_index], vec_dir_fkc1[sat_dir_index] ); fprintf( p_outfile, " Fx=%15.7lE, Fy=%15.7lE, Fz=%15.7lE\n", vec_dir_fxc1[sat_dir_index], vec_dir_fyc1[sat_dir_index], vec_dir_fzc1[sat_dir_index] ); fprintf( p_outfile, " TQEl=%15.7lE, TQEr=%15.7lE, TQEk=%15.7lE\n", vec_dir_tqelc1[sat_dir_index], vec_dir_tqerc1[sat_dir_index], vec_dir_tqekc1[sat_dir_index] ); fprintf( p_outfile, " TQSl=%15.7lE, TQSr=%15.7lE, TQSk=%15.7lE\n", vec_dir_tqslc1[sat_dir_index], vec_dir_tqsrc1[sat_dir_index], vec_dir_tqskc1[sat_dir_index] ); fprintf( p_outfile, " TQEx=%15.7lE, TQEy=%15.7lE, TQEz=%15.7lE\n", vec_dir_tqexc1[sat_dir_index], vec_dir_tqeyc1[sat_dir_index], vec_dir_tqezc1[sat_dir_index] ); fprintf( p_outfile, " TQSx=%15.7lE, TQSy=%15.7lE, TQSz=%15.7lE\n", vec_dir_tqsxc1[sat_dir_index], vec_dir_tqsyc1[sat_dir_index], vec_dir_tqszc1[sat_dir_index] ); } // end goto190 switch // Perpendicular polarization cluster section if (inpol == 0) fprintf(p_outfile, " LIN 1\n"); else fprintf(p_outfile, " CIRC 1\n"); fprintf(p_outfile, " ----- SCC ----- ABC ----- EXC ----- ALBEDC --\n"); fprintf( p_outfile, " %14.7lE%15.7lE%15.7lE%15.7lE\n", vec_dir_scc2[sat_dir_index], vec_dir_abc2[sat_dir_index], vec_dir_exc2[sat_dir_index], vec_dir_albedc2[sat_dir_index] ); fprintf(p_outfile, " --- SCC/TGS - ABC/TGS - EXC/TGS ---\n"); fprintf( p_outfile, " %14.7lE%15.7lE%15.7lE\n", vec_dir_qscc2[sat_dir_index], vec_dir_qabc2[sat_dir_index], vec_dir_qexc2[sat_dir_index] ); fprintf(p_outfile, " ---- SCCRT --- ABCRT --- EXCRT ----\n"); fprintf( p_outfile, " %14.7lE%15.7lE%15.7lE\n", vec_dir_sccrt2[sat_dir_index], vec_dir_abcrt2[sat_dir_index], vec_dir_excrt2[sat_dir_index] ); fprintf( p_outfile, " FSAC(2,2)=%15.7lE%15.7lE FSAC(1,2)=%15.7lE%15.7lE\n", real(vec_dir_fsac22[sat_dir_index]), imag(vec_dir_fsac22[sat_dir_index]), real(vec_dir_fsac12[sat_dir_index]), imag(vec_dir_fsac12[sat_dir_index]) ); fprintf( p_outfile, " SAC(2,2)=%15.7lE%15.7lE SAC(1,2)=%15.7lE%15.7lE\n", real(vec_dir_sac22[sat_dir_index]), imag(vec_dir_sac22[sat_dir_index]), real(vec_dir_sac12[sat_dir_index]), imag(vec_dir_sac12[sat_dir_index]) ); fprintf( p_outfile, " RE(FSAC(2,2))/RE(TFSAS)=%15.7lE, IM(FSAC(2,2))/IM(TFSAS)=%15.7lE\n", real(vec_dir_fsac22[sat_dir_index]) / real(vec_fsat[jxi]), imag(vec_dir_fsac22[sat_dir_index]) / imag(vec_fsat[jxi]) ); fprintf( p_outfile, " QSCHU=%15.7lE, PSCHU=%15.7lE, S0MAG=%15.7lE\n", vec_dir_qschuc2[sat_dir_index], vec_dir_pschuc2[sat_dir_index], vec_dir_s0magc2[sat_dir_index] ); fprintf( p_outfile, "INSERTION: CS2_CLUSTER %13.5le%10.3le%10.3le%15.7le%15.7le%15.7le\n", alamb, th + jth * thstp, ths + jths * thsstp, vec_dir_scc2[sat_dir_index], vec_dir_abc2[sat_dir_index], vec_dir_exc2[sat_dir_index] ); if (!goto190) { fprintf( p_outfile, " COSAV=%15.7lE, RAPRS=%15.7lE\n", vec_dir_cosavc2[sat_dir_index], vec_dir_raprc2[sat_dir_index] ); fprintf( p_outfile, " Fl=%15.7lE, Fr=%15.7lE, Fk=%15.7lE\n", vec_dir_flc2[sat_dir_index], vec_dir_frc2[sat_dir_index], vec_dir_fkc2[sat_dir_index] ); fprintf( p_outfile, " Fx=%15.7lE, Fy=%15.7lE, Fz=%15.7lE\n", vec_dir_fxc2[sat_dir_index], vec_dir_fyc2[sat_dir_index], vec_dir_fzc2[sat_dir_index] ); fprintf( p_outfile, " TQEl=%15.7lE, TQEr=%15.7lE, TQEk=%15.7lE\n", vec_dir_tqelc2[sat_dir_index], vec_dir_tqerc2[sat_dir_index], vec_dir_tqekc2[sat_dir_index] ); fprintf( p_outfile, " TQSl=%15.7lE, TQSr=%15.7lE, TQSk=%15.7lE\n", vec_dir_tqslc2[sat_dir_index], vec_dir_tqsrc2[sat_dir_index], vec_dir_tqskc2[sat_dir_index] ); fprintf( p_outfile, " TQEx=%15.7lE, TQEy=%15.7lE, TQEz=%15.7lE\n", vec_dir_tqexc2[sat_dir_index], vec_dir_tqeyc2[sat_dir_index], vec_dir_tqezc2[sat_dir_index] ); fprintf( p_outfile, " TQSx=%15.7lE, TQSy=%15.7lE, TQSz=%15.7lE\n", vec_dir_tqsxc2[sat_dir_index], vec_dir_tqsyc2[sat_dir_index], vec_dir_tqszc2[sat_dir_index] ); } // end goto190 switch fprintf( p_outfile, " (RE(FSAC(1,1))-RE(FSAC(2,2)))/RE(FSAC(1,1))=%15.7lE\n", (real(vec_dir_fsac11[sat_dir_index]) - real(vec_dir_fsac22[sat_dir_index])) / real(vec_dir_fsac11[sat_dir_index]) ); fprintf( p_outfile, " (IM(FSAC(1,1))-IM(FSAC(2,2)))/IM(FSAC(1,1))=%15.7lE\n", (imag(vec_dir_fsac11[sat_dir_index]) - imag(vec_dir_fsac22[sat_dir_index])) / imag(vec_dir_fsac11[sat_dir_index]) ); fprintf(p_outfile, " MULC\n"); for (int i = 0; i < 4; i++) { int mulc_dir_index = 16 * jxi * ndirs + 16 * dir_index + 4 * i; fprintf( p_outfile, " %15.7lE%15.7lE%15.7lE%15.7lE\n", vec_dir_mulc[mulc_dir_index], vec_dir_mulc[mulc_dir_index + 1], vec_dir_mulc[mulc_dir_index + 2], vec_dir_mulc[mulc_dir_index + 3] ); } // i mulc loop fprintf(p_outfile, " MULCLR\n"); for (int i = 0; i < 4; i++) { int mulc_dir_index = 16 * jxi * ndirs + 16 * dir_index + 4 * i; fprintf( p_outfile, " %15.7lE%15.7lE%15.7lE%15.7lE\n", vec_dir_mulclr[mulc_dir_index], vec_dir_mulclr[mulc_dir_index + 1], vec_dir_mulclr[mulc_dir_index + 2], vec_dir_mulclr[mulc_dir_index + 3] ); } // i mulclr loop if (iavm != 0) { fprintf(p_outfile, " CLUSTER (ENSEMBLE AVERAGE, MODE%2d)\n", iavm); if (inpol == 0) fprintf(p_outfile, " LIN\n"); else fprintf(p_outfile, " CIRC\n"); fprintf(p_outfile, " MULC\n"); for (int i = 0; i < 4; i++) { int mulc_dir_index = 16 * jxi + 4 * i; fprintf( p_outfile, " %15.7lE%15.7lE%15.7lE%15.7lE\n", vec_dir_mulc[mulc_dir_index], vec_dir_mulc[mulc_dir_index + 1], vec_dir_mulc[mulc_dir_index + 2], vec_dir_mulc[mulc_dir_index + 3] ); } // i mulc loop fprintf(p_outfile, " MULCLR\n"); for (int i = 0; i < 4; i++) { int mulc_dir_index = 16 * jxi + 4 * i; fprintf( p_outfile, " %15.7lE%15.7lE%15.7lE%15.7lE\n", vec_dir_mulclr[mulc_dir_index], vec_dir_mulclr[mulc_dir_index + 1], vec_dir_mulclr[mulc_dir_index + 2], vec_dir_mulclr[mulc_dir_index + 3] ); } } // end of if (iavm != 0) switch dir_index++; } // jphs loop } // jths loop } // jph loop } // jth loop } // jxi wavelength loop fclose(p_outfile); } else { result = -1; } return result; } #ifdef MPI_VERSION int ClusterOutputInfo::mpireceive(const mixMPI *mpidata, int pid) { int result = 0; int chk_nsph, chk_inpol, chk_iavm, chk_isam, chk_num_theta, chk_num_thetas; int chk_num_phi, chk_num_phis, chk_ndirs, chk_idfc, chk_configs; double chk_exri; MPI_Recv(&chk_nsph, 1, MPI_INT32_T, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(&chk_inpol, 1, MPI_INT32_T, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(&chk_iavm, 1, MPI_INT32_T, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(&chk_isam, 1, MPI_INT32_T, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(&chk_num_theta, 1, MPI_INT32_T, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(&chk_num_thetas, 1, MPI_INT32_T, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(&chk_num_phi, 1, MPI_INT32_T, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(&chk_num_phis, 1, MPI_INT32_T, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(&chk_ndirs, 1, MPI_INT32_T, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(&chk_exri, 1, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(&chk_idfc, 1, MPI_INT32_T, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(&chk_configs, 1, MPI_INT32_T, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); result += (chk_nsph == nsph) ? 0 : 1; result += (chk_inpol == inpol) ? 0 : 1; result += (chk_iavm == iavm) ? 0 : 1; result += (chk_isam == isam) ? 0 : 1; result += (chk_num_theta == _num_theta) ? 0 : 1; result += (chk_num_thetas == _num_thetas) ? 0 : 1; result += (chk_num_phi == _num_phi) ? 0 : 1; result += (chk_num_phis == _num_phis) ? 0 : 1; result += (chk_ndirs == ndirs) ? 0 : 1; result += (chk_exri == exri) ? 0 : 1; result += (chk_idfc == idfc) ? 0 : 1; result += (chk_configs == configurations) ? 0 : 1; if (result == 0) { int xi1, offset, chunk_size; MPI_Send(&result, 1, MPI_INT32_T, pid, 10, MPI_COMM_WORLD); MPI_Recv(&xi1, 1, MPI_INT32_T, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(&chunk_size, 1, MPI_INT32_T, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); // Receive vectors of single values per scale offset = xi1 - _first_xi; MPI_Recv(vec_jxi + offset, chunk_size, MPI_INT32_T, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_ier + offset, chunk_size, MPI_SHORT, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_vk + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_xi + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_fsat + offset, chunk_size, MPI_C_DOUBLE_COMPLEX, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_qschut + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_pschut + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_s0magt + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_scc1 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_scc2 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_abc1 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_abc2 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_exc1 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_exc2 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_albedc1 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_albedc2 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_qscamc1 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_qscamc2 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_qabsmc1 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_qabsmc2 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_qextmc1 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_qextmc2 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_sccrt1 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_sccrt2 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_abcrt1 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_abcrt2 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_excrt1 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_excrt2 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_fsac11 + offset, chunk_size, MPI_C_DOUBLE_COMPLEX, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_fsac21 + offset, chunk_size, MPI_C_DOUBLE_COMPLEX, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_fsac22 + offset, chunk_size, MPI_C_DOUBLE_COMPLEX, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_fsac12 + offset, chunk_size, MPI_C_DOUBLE_COMPLEX, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_qschuc1 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_qschuc2 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_pschuc1 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_pschuc2 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_s0magc1 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_s0magc2 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_cosavc1 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_cosavc2 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_raprc1 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_raprc2 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_fkc1 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_fkc2 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); // Receive vectors of multiple configuration values per scale MPI_Recv(&chunk_size, 1, MPI_INT32_T, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); offset = (xi1 - _first_xi) * configurations; MPI_Recv(vec_sphere_sizes + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_sphere_ref_indices + offset, chunk_size, MPI_C_DOUBLE_COMPLEX, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_sphere_scs + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_sphere_abs + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_sphere_exs + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_sphere_albs + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_sphere_sqscs + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_sphere_sqabs + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_sphere_sqexs + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_fsas + offset, chunk_size, MPI_C_DOUBLE_COMPLEX, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_qschus + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_pschus + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_s0mags + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_cosavs + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_raprs + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_tqek1 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_tqsk1 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_tqek2 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_tqsk2 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); // Receive vectors whose sizes depend on directions and configurations. MPI_Recv(&chunk_size, 1, MPI_INT32_T, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); offset = (xi1 - _first_xi) * ndirs * configurations; MPI_Recv(vec_dir_sas11 + offset, chunk_size, MPI_C_DOUBLE_COMPLEX, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_sas21 + offset, chunk_size, MPI_C_DOUBLE_COMPLEX, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_sas12 + offset, chunk_size, MPI_C_DOUBLE_COMPLEX, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_sas22 + offset, chunk_size, MPI_C_DOUBLE_COMPLEX, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_muls + 16 * offset, 16 * chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_mulslr + 16 * offset, 16 * chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); // Receive vectors whose sizes depend on directions and scales. MPI_Recv(&chunk_size, 1, MPI_INT32_T, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); offset = (xi1 - _first_xi) * ndirs; MPI_Recv(vec_dir_sat11 + offset, chunk_size, MPI_C_DOUBLE_COMPLEX, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_sat21 + offset, chunk_size, MPI_C_DOUBLE_COMPLEX, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_sat12 + offset, chunk_size, MPI_C_DOUBLE_COMPLEX, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_sat22 + offset, chunk_size, MPI_C_DOUBLE_COMPLEX, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_scc1 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_scc2 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_abc1 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_abc2 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_exc1 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_exc2 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_albedc1 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_albedc2 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_qscc1 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_qscc2 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_qabc1 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_qabc2 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_qexc1 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_qexc2 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_sccrt1 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_sccrt2 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_abcrt1 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_abcrt2 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_excrt1 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_excrt2 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_fsac11 + offset, chunk_size, MPI_C_DOUBLE_COMPLEX, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_fsac21 + offset, chunk_size, MPI_C_DOUBLE_COMPLEX, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_fsac12 + offset, chunk_size, MPI_C_DOUBLE_COMPLEX, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_fsac22 + offset, chunk_size, MPI_C_DOUBLE_COMPLEX, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_sac11 + offset, chunk_size, MPI_C_DOUBLE_COMPLEX, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_sac21 + offset, chunk_size, MPI_C_DOUBLE_COMPLEX, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_sac12 + offset, chunk_size, MPI_C_DOUBLE_COMPLEX, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_sac22 + offset, chunk_size, MPI_C_DOUBLE_COMPLEX, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_qschuc1 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_qschuc2 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_pschuc1 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_pschuc2 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_s0magc1 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_s0magc2 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_cosavc1 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_cosavc2 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_raprc1 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_raprc2 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_flc1 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_flc2 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_frc1 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_frc2 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_fkc1 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_fkc2 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_fxc1 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_fxc2 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_fyc1 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_fyc2 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_fzc1 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_fzc2 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_tqelc1 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_tqelc2 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_tqerc1 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_tqerc2 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_tqekc1 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_tqekc2 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_tqexc1 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_tqexc2 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_tqeyc1 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_tqeyc2 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_tqezc1 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_tqezc2 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_tqslc1 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_tqslc2 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_tqsrc1 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_tqsrc2 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_tqskc1 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_tqskc2 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_tqsxc1 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_tqsxc2 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_tqsyc1 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_tqsyc2 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_tqszc1 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_tqszc2 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_mulc + 16 * offset, 16 * chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_mulclr + 16 * offset, 16 * chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); } else { MPI_Send(&result, 1, MPI_INT32_T, pid, 10, MPI_COMM_WORLD); } return result; } int ClusterOutputInfo::mpisend(const mixMPI *mpidata) { int result = 0; int chunk_size; // Send output metadata for configuration cross-check MPI_Send(&nsph, 1, MPI_INT32_T, 0, 10, MPI_COMM_WORLD); MPI_Send(&inpol, 1, MPI_INT32_T, 0, 10, MPI_COMM_WORLD); MPI_Send(&iavm, 1, MPI_INT32_T, 0, 10, MPI_COMM_WORLD); MPI_Send(&isam, 1, MPI_INT32_T, 0, 10, MPI_COMM_WORLD); MPI_Send(&_num_theta, 1, MPI_INT32_T, 0, 10, MPI_COMM_WORLD); MPI_Send(&_num_thetas, 1, MPI_INT32_T, 0, 10, MPI_COMM_WORLD); MPI_Send(&_num_phi, 1, MPI_INT32_T, 0, 10, MPI_COMM_WORLD); MPI_Send(&_num_phis, 1, MPI_INT32_T, 0, 10, MPI_COMM_WORLD); MPI_Send(&ndirs, 1, MPI_INT32_T, 0, 10, MPI_COMM_WORLD); MPI_Send(&exri, 1, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(&idfc, 1, MPI_INT32_T, 0, 10, MPI_COMM_WORLD); MPI_Send(&configurations, 1, MPI_INT32_T, 0, 10, MPI_COMM_WORLD); // Wait for process 0 to cross-check the configuration MPI_Recv(&result, 1, MPI_INT32_T, 0, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); if (result == 0) { // Process 0 confirmed the consistency of configuration. Send the data. // Send vectors of single values per scale MPI_Send(&_first_xi, 1, MPI_INT32_T, 0, 10, MPI_COMM_WORLD); MPI_Send(&xi_block_size, 1, MPI_INT32_T, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_jxi, xi_block_size, MPI_INT32_T, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_ier, xi_block_size, MPI_SHORT, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_vk, xi_block_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_xi, xi_block_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_fsat, xi_block_size, MPI_C_DOUBLE_COMPLEX, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_qschut, xi_block_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_pschut, xi_block_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_s0magt, xi_block_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_scc1, xi_block_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_scc2, xi_block_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_abc1, xi_block_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_abc2, xi_block_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_exc1, xi_block_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_exc2, xi_block_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_albedc1, xi_block_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_albedc2, xi_block_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_qscamc1, xi_block_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_qscamc2, xi_block_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_qabsmc1, xi_block_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_qabsmc2, xi_block_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_qextmc1, xi_block_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_qextmc2, xi_block_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_sccrt1, xi_block_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_sccrt2, xi_block_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_abcrt1, xi_block_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_abcrt2, xi_block_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_excrt1, xi_block_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_excrt2, xi_block_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_fsac11, xi_block_size, MPI_C_DOUBLE_COMPLEX, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_fsac21, xi_block_size, MPI_C_DOUBLE_COMPLEX, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_fsac22, xi_block_size, MPI_C_DOUBLE_COMPLEX, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_fsac12, xi_block_size, MPI_C_DOUBLE_COMPLEX, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_qschuc1, xi_block_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_qschuc2, xi_block_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_pschuc1, xi_block_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_pschuc2, xi_block_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_s0magc1, xi_block_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_s0magc2, xi_block_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_cosavc1, xi_block_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_cosavc2, xi_block_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_raprc1, xi_block_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_raprc2, xi_block_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_fkc1, xi_block_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_fkc2, xi_block_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); // Send vectors of multiple configuration values per scale chunk_size = xi_block_size * configurations; MPI_Send(&chunk_size, 1, MPI_INT32_T, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_sphere_sizes, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_sphere_ref_indices, chunk_size, MPI_C_DOUBLE_COMPLEX, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_sphere_scs, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_sphere_abs, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_sphere_exs, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_sphere_albs, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_sphere_sqscs, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_sphere_sqabs, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_sphere_sqexs, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_fsas, chunk_size, MPI_C_DOUBLE_COMPLEX, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_qschus, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_pschus, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_s0mags, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_cosavs, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_raprs, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_tqek1, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_tqsk1, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_tqek2, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_tqsk2, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); // Send vectors whose sizes depend on directions and configurations. chunk_size = ndirs * configurations * xi_block_size; MPI_Send(&chunk_size, 1, MPI_INT32_T, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_sas11, chunk_size, MPI_C_DOUBLE_COMPLEX, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_sas21, chunk_size, MPI_C_DOUBLE_COMPLEX, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_sas12, chunk_size, MPI_C_DOUBLE_COMPLEX, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_sas22, chunk_size, MPI_C_DOUBLE_COMPLEX, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_muls, 16 * chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_mulslr, 16 * chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); // Send vectors whose sizes depend on directions and scales. chunk_size = xi_block_size * ndirs; MPI_Send(&chunk_size, 1, MPI_INT32_T, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_sat11, chunk_size, MPI_C_DOUBLE_COMPLEX, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_sat21, chunk_size, MPI_C_DOUBLE_COMPLEX, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_sat12, chunk_size, MPI_C_DOUBLE_COMPLEX, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_sat22, chunk_size, MPI_C_DOUBLE_COMPLEX, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_scc1, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_scc2, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_abc1, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_abc2, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_exc1, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_exc2, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_albedc1, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_albedc2, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_qscc1, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_qscc2, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_qabc1, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_qabc2, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_qexc1, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_qexc2, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_sccrt1, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_sccrt2, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_abcrt1, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_abcrt2, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_excrt1, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_excrt2, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_fsac11, chunk_size, MPI_C_DOUBLE_COMPLEX, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_fsac21, chunk_size, MPI_C_DOUBLE_COMPLEX, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_fsac12, chunk_size, MPI_C_DOUBLE_COMPLEX, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_fsac22, chunk_size, MPI_C_DOUBLE_COMPLEX, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_sac11, chunk_size, MPI_C_DOUBLE_COMPLEX, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_sac21, chunk_size, MPI_C_DOUBLE_COMPLEX, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_sac12, chunk_size, MPI_C_DOUBLE_COMPLEX, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_sac22, chunk_size, MPI_C_DOUBLE_COMPLEX, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_qschuc1, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_qschuc2, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_pschuc1, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_pschuc2, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_s0magc1, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_s0magc2, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_cosavc1, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_cosavc2, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_raprc1, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_raprc2, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_flc1, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_flc2, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_frc1, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_frc2, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_fkc1, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_fkc2, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_fxc1, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_fxc2, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_fyc1, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_fyc2, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_fzc1, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_fzc2, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_tqelc1, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_tqelc2, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_tqerc1, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_tqerc2, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_tqekc1, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_tqekc2, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_tqexc1, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_tqexc2, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_tqeyc1, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_tqeyc2, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_tqezc1, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_tqezc2, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_tqslc1, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_tqslc2, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_tqsrc1, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_tqsrc2, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_tqskc1, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_tqskc2, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_tqsxc1, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_tqsxc2, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_tqsyc1, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_tqsyc2, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_tqszc1, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_tqszc2, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_mulc, 16 * chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_mulclr, 16 * chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); } return result; } #endif //MPI_VERSION // >>> END OF ClusterOutputInfo CLASS IMPLEMENTATION <<< // >>> InclusionOutputInfo CLASS IMPLEMENTATION <<< InclusionOutputInfo::InclusionOutputInfo( ScattererConfiguration *sc, GeometryConfiguration *gc, const mixMPI *mpidata, int first_xi, int xi_length ) { nsph = gc->number_of_spheres; li = gc->li; le = gc->le; lm = gc->l_max; mxndm = gc->mxndm; inpol = gc->in_pol; npnt = gc->npnt; npntts = gc->npntts; iavm = gc->iavm; isam = gc->isam; jwtm = gc->jwtm; // Get spherical constituent coordinates vec_x_coords = new double[nsph]; vec_y_coords = new double[nsph]; vec_z_coords = new double[nsph]; for (int nsi = 0; nsi < nsph; nsi++) { vec_x_coords[nsi] = gc->get_sph_x(nsi); vec_y_coords[nsi] = gc->get_sph_y(nsi); vec_z_coords[nsi] = gc->get_sph_z(nsi); } // Get directional information th = gc->in_theta_start; thstp = gc->in_theta_step; thlst = gc->in_theta_end; ths = gc->sc_theta_start; thsstp = gc->sc_theta_step; thslst = gc->sc_theta_end; _num_theta = (thstp == 0.0) ? 1 : 1 + int((thlst - th) / thstp); _num_thetas = (thsstp == 0.0) ? 1 : 1 + int((thslst - ths) / thsstp); ph = gc->in_phi_start; phstp = gc->in_phi_step; phlst = gc->in_phi_end; phs = gc->sc_phi_start; phsstp = gc->sc_phi_step; phslst = gc->sc_phi_end; _num_phi = (phstp == 0.0) ? 1 : 1 + int((phlst - ph) / phstp); _num_phis = (phsstp == 0.0) ? 1 : 1 + int((phslst - phs) / phsstp); ndirs = _num_theta * _num_thetas * _num_phi * _num_phis; // Get scattering problem configuration double exdc = sc->exdc; exri = sqrt(exdc); idfc = sc->idfc; nxi = sc->number_of_scales; _first_xi = first_xi; xi_block_size = (xi_length == 0) ? nxi - (_first_xi - 1) : xi_length; vec_jxi = new int[xi_block_size](); vec_ier = new short[xi_block_size](); vec_vk = new double[xi_block_size](); vec_xi = new double[xi_block_size](); configurations = sc->configurations; vec_sphere_sizes = new double[xi_block_size * (configurations + 1)](); vec_sphere_ref_indices = new dcomplex[xi_block_size * (configurations + 1)](); vec_scs1 = new double[xi_block_size](); vec_scs2 = new double[xi_block_size](); vec_abs1 = new double[xi_block_size](); vec_abs2 = new double[xi_block_size](); vec_exs1 = new double[xi_block_size](); vec_exs2 = new double[xi_block_size](); vec_albeds1 = new double[xi_block_size](); vec_albeds2 = new double[xi_block_size](); vec_scsrt1 = new double[xi_block_size](); vec_scsrt2 = new double[xi_block_size](); vec_absrt1 = new double[xi_block_size](); vec_absrt2 = new double[xi_block_size](); vec_exsrt1 = new double[xi_block_size](); vec_exsrt2 = new double[xi_block_size](); vec_qschu1 = new double[xi_block_size](); vec_qschu2 = new double[xi_block_size](); vec_pschu1 = new double[xi_block_size](); vec_pschu2 = new double[xi_block_size](); vec_s0mag1 = new double[xi_block_size](); vec_s0mag2 = new double[xi_block_size](); vec_cosav1 = new double[xi_block_size](); vec_cosav2 = new double[xi_block_size](); vec_raprs1 = new double[xi_block_size](); vec_raprs2 = new double[xi_block_size](); vec_fk1 = new double[xi_block_size](); vec_fk2 = new double[xi_block_size](); vec_fsas11 = new dcomplex[xi_block_size](); vec_fsas21 = new dcomplex[xi_block_size](); vec_fsas22 = new dcomplex[xi_block_size](); vec_fsas12 = new dcomplex[xi_block_size](); vec_dir_tidg = new double[_num_theta]; vec_dir_pidg = new double[_num_phi]; vec_dir_tsdg = new double[_num_thetas]; vec_dir_psdg = new double[_num_phis]; // Initialize directions (they are scale-independent) double cti = th, cpi = ph, cts = ths, cps = phs; for (int di = 0; di < _num_theta; di++) { vec_dir_tidg[di] = cti; cti += thstp; } for (int di = 0; di < _num_thetas; di++) { vec_dir_tsdg[di] = cts; cts += thsstp; } for (int di = 0; di < _num_phi; di++) { vec_dir_pidg[di] = cpi; cpi += phstp; } for (int di = 0; di < _num_phis; di++) { vec_dir_psdg[di] = cps; cps += phsstp; } vec_dir_scand = new double[ndirs](); vec_dir_cfmp = new double[ndirs](); vec_dir_sfmp = new double[ndirs](); vec_dir_cfsp = new double[ndirs](); vec_dir_sfsp = new double[ndirs](); vec_dir_un = new double[3 * ndirs](); vec_dir_uns = new double[3 * ndirs](); vec_dir_scs1 = new double[ndirs * xi_block_size](); vec_dir_scs2 = new double[ndirs * xi_block_size](); vec_dir_abs1 = new double[ndirs * xi_block_size](); vec_dir_abs2 = new double[ndirs * xi_block_size](); vec_dir_exs1 = new double[ndirs * xi_block_size](); vec_dir_exs2 = new double[ndirs * xi_block_size](); vec_dir_albeds1 = new double[ndirs * xi_block_size](); vec_dir_albeds2 = new double[ndirs * xi_block_size](); vec_dir_scsrt1 = new double[ndirs * xi_block_size](); vec_dir_scsrt2 = new double[ndirs * xi_block_size](); vec_dir_absrt1 = new double[ndirs * xi_block_size](); vec_dir_absrt2 = new double[ndirs * xi_block_size](); vec_dir_exsrt1 = new double[ndirs * xi_block_size](); vec_dir_exsrt2 = new double[ndirs * xi_block_size](); vec_dir_fsas11 = new dcomplex[ndirs * xi_block_size](); vec_dir_fsas21 = new dcomplex[ndirs * xi_block_size](); vec_dir_fsas12 = new dcomplex[ndirs * xi_block_size](); vec_dir_fsas22 = new dcomplex[ndirs * xi_block_size](); vec_dir_sas11 = new dcomplex[ndirs * xi_block_size](); vec_dir_sas21 = new dcomplex[ndirs * xi_block_size](); vec_dir_sas12 = new dcomplex[ndirs * xi_block_size](); vec_dir_sas22 = new dcomplex[ndirs * xi_block_size](); vec_dir_qschu1 = new double[ndirs * xi_block_size](); vec_dir_qschu2 = new double[ndirs * xi_block_size](); vec_dir_pschu1 = new double[ndirs * xi_block_size](); vec_dir_pschu2 = new double[ndirs * xi_block_size](); vec_dir_s0mag1 = new double[ndirs * xi_block_size](); vec_dir_s0mag2 = new double[ndirs * xi_block_size](); vec_dir_cosav1 = new double[ndirs * xi_block_size](); vec_dir_cosav2 = new double[ndirs * xi_block_size](); vec_dir_rapr1 = new double[ndirs * xi_block_size](); vec_dir_rapr2 = new double[ndirs * xi_block_size](); vec_dir_fl1 = new double[ndirs * xi_block_size](); vec_dir_fl2 = new double[ndirs * xi_block_size](); vec_dir_fr1 = new double[ndirs * xi_block_size](); vec_dir_fr2 = new double[ndirs * xi_block_size](); vec_dir_fk1 = new double[ndirs * xi_block_size](); vec_dir_fk2 = new double[ndirs * xi_block_size](); vec_dir_fx1 = new double[ndirs * xi_block_size](); vec_dir_fx2 = new double[ndirs * xi_block_size](); vec_dir_fy1 = new double[ndirs * xi_block_size](); vec_dir_fy2 = new double[ndirs * xi_block_size](); vec_dir_fz1 = new double[ndirs * xi_block_size](); vec_dir_fz2 = new double[ndirs * xi_block_size](); vec_dir_tqel1 = new double[ndirs * xi_block_size](); vec_dir_tqel2 = new double[ndirs * xi_block_size](); vec_dir_tqer1 = new double[ndirs * xi_block_size](); vec_dir_tqer2 = new double[ndirs * xi_block_size](); vec_dir_tqek1 = new double[ndirs * xi_block_size](); vec_dir_tqek2 = new double[ndirs * xi_block_size](); vec_dir_tqex1 = new double[ndirs * xi_block_size](); vec_dir_tqex2 = new double[ndirs * xi_block_size](); vec_dir_tqey1 = new double[ndirs * xi_block_size](); vec_dir_tqey2 = new double[ndirs * xi_block_size](); vec_dir_tqez1 = new double[ndirs * xi_block_size](); vec_dir_tqez2 = new double[ndirs * xi_block_size](); vec_dir_tqsl1 = new double[ndirs * xi_block_size](); vec_dir_tqsl2 = new double[ndirs * xi_block_size](); vec_dir_tqsr1 = new double[ndirs * xi_block_size](); vec_dir_tqsr2 = new double[ndirs * xi_block_size](); vec_dir_tqsk1 = new double[ndirs * xi_block_size](); vec_dir_tqsk2 = new double[ndirs * xi_block_size](); vec_dir_tqsx1 = new double[ndirs * xi_block_size](); vec_dir_tqsx2 = new double[ndirs * xi_block_size](); vec_dir_tqsy1 = new double[ndirs * xi_block_size](); vec_dir_tqsy2 = new double[ndirs * xi_block_size](); vec_dir_tqsz1 = new double[ndirs * xi_block_size](); vec_dir_tqsz2 = new double[ndirs * xi_block_size](); vec_dir_mull = new double[16 * ndirs * xi_block_size](); vec_dir_mulllr = new double[16 * ndirs * xi_block_size](); } InclusionOutputInfo::InclusionOutputInfo(const std::string &hdf5_name) { unsigned int flags = H5F_ACC_RDONLY; HDFFile *hdf_file = new HDFFile(hdf5_name, flags); herr_t status = hdf_file->get_status(); string str_name, str_type; if (status == 0) { status = hdf_file->read("NSPH", "INT32_(1)", &nsph); status = hdf_file->read("LI", "INT32_(1)", &li); status = hdf_file->read("LE", "INT32_(1)", &le); status = hdf_file->read("LM", "INT32_(1)", &lm); long tmp; status = hdf_file->read("MXNDM", "INT64_(1)", &tmp); mxndm = (np_int)tmp; status = hdf_file->read("INPOL", "INT32_(1)", &inpol); status = hdf_file->read("NPNT", "INT32_(1)", &npnt); status = hdf_file->read("NPNTTS", "INT32_(1)", &npntts); status = hdf_file->read("IAVM", "INT32_(1)", &iavm); status = hdf_file->read("ISAM", "INT32_(1)", &isam); status = hdf_file->read("JWTM", "INT32_(1)", &jwtm); str_type = "FLOAT64_(" + to_string(nsph) + ")"; vec_x_coords = new double[nsph]; vec_y_coords = new double[nsph]; vec_z_coords = new double[nsph]; status = hdf_file->read("VEC_SPH_X", str_type, vec_x_coords); status = hdf_file->read("VEC_SPH_Y", str_type, vec_y_coords); status = hdf_file->read("VEC_SPH_Z", str_type, vec_z_coords); status = hdf_file->read("TH_START", "FLOAT64_(1)", &th); status = hdf_file->read("TH_STEP", "FLOAT64_(1)", &thstp); status = hdf_file->read("TH_END", "FLOAT64_(1)", &thlst); _num_theta = (thstp == 0.0) ? 1 : 1 + int((thlst - th) / thstp); status = hdf_file->read("THS_START", "FLOAT64_(1)", &ths); status = hdf_file->read("THS_STEP", "FLOAT64_(1)", &thsstp); status = hdf_file->read("THS_END", "FLOAT64_(1)", &thslst); _num_thetas = (thsstp == 0.0) ? 1 : 1 + int((thslst - ths) / thsstp); status = hdf_file->read("PH_START", "FLOAT64_(1)", &ph); status = hdf_file->read("PH_STEP", "FLOAT64_(1)", &phstp); status = hdf_file->read("PH_END", "FLOAT64_(1)", &phlst); _num_phi = (phstp == 0.0) ? 1 : 1 + int((phlst - ph) / phstp); status = hdf_file->read("PHS_START", "FLOAT64_(1)", &phs); status = hdf_file->read("PHS_STEP", "FLOAT64_(1)", &phsstp); status = hdf_file->read("PHS_END", "FLOAT64_(1)", &phslst); _num_phis = (phsstp == 0.0) ? 1 : 1 + int((phslst - phs) / phsstp); ndirs = _num_theta * _num_thetas * _num_phi * _num_phis; status = hdf_file->read("EXRI", "FLOAT64_(1)", &exri); status = hdf_file->read("IDFC", "INT32_(1)", &idfc); status = hdf_file->read("XI1", "INT32_(1)", &_first_xi); status = hdf_file->read("NXI", "INT32_(1)", &xi_block_size); nxi = (_first_xi == 1) ? xi_block_size : xi_block_size + _first_xi; str_type = "INT32_(" + to_string(xi_block_size) + ")"; vec_jxi = new int[xi_block_size]; status = hdf_file->read("VEC_JXI", str_type, vec_jxi); str_type = "INT16_(" + to_string(xi_block_size) + ")"; vec_ier = new short[xi_block_size]; status = hdf_file->read("VEC_IER", str_type, vec_ier); str_type = "FLOAT64_(" + to_string(xi_block_size) + ")"; vec_vk = new double[xi_block_size]; status = hdf_file->read("VEC_VK", str_type, vec_vk); vec_xi = new double[xi_block_size]; status = hdf_file->read("VEC_VK", str_type, vec_xi); status = hdf_file->read("NCONF", "INT32_(1)", &configurations); str_type = "FLOAT64_(" + to_string(xi_block_size * (configurations + 1)) + ")"; vec_sphere_sizes = new double[xi_block_size * (configurations + 1)]; status = hdf_file->read("VEC_SPH_SIZES", str_type, vec_sphere_sizes); str_type = "FLOAT64_(" + to_string(2 * xi_block_size * (configurations + 1)) + ")"; vec_sphere_ref_indices = new dcomplex[xi_block_size * (configurations + 1)]; status = hdf_file->read("VEC_SPH_REFRI", str_type, vec_sphere_ref_indices); str_type = "FLOAT64_(" + to_string(xi_block_size) + ")"; vec_scs1 = new double[xi_block_size]; status = hdf_file->read("VEC_SCS1", str_type, vec_scs1); vec_scs2 = new double[xi_block_size]; status = hdf_file->read("VEC_SCS2", str_type, vec_scs2); vec_abs1 = new double[xi_block_size]; status = hdf_file->read("VEC_ABS1", str_type, vec_abs1); vec_abs2 = new double[xi_block_size]; status = hdf_file->read("VEC_ABS2", str_type, vec_abs2); vec_exs1 = new double[xi_block_size]; status = hdf_file->read("VEC_EXS1", str_type, vec_exs1); vec_exs2 = new double[xi_block_size]; status = hdf_file->read("VEC_EXS2", str_type, vec_exs2); vec_albeds1 = new double[xi_block_size]; status = hdf_file->read("VEC_ALBEDS1", str_type, vec_albeds1); vec_albeds2 = new double[xi_block_size]; status = hdf_file->read("VEC_ALBEDS2", str_type, vec_albeds2); vec_scsrt1 = new double[xi_block_size]; status = hdf_file->read("VEC_SCSRT1", str_type, vec_scsrt1); vec_scsrt2 = new double[xi_block_size]; status = hdf_file->read("VEC_SCSRT2", str_type, vec_scsrt2); vec_absrt1 = new double[xi_block_size]; status = hdf_file->read("VEC_ABSRT1", str_type, vec_absrt1); vec_absrt2 = new double[xi_block_size]; status = hdf_file->read("VEC_ABSRT2", str_type, vec_absrt2); vec_exsrt1 = new double[xi_block_size]; status = hdf_file->read("VEC_EXSRT1", str_type, vec_exsrt1); vec_exsrt2 = new double[xi_block_size]; status = hdf_file->read("VEC_EXSRT2", str_type, vec_exsrt2); vec_qschu1 = new double[xi_block_size]; status = hdf_file->read("VEC_QSCHU1", str_type, vec_qschu1); vec_qschu2 = new double[xi_block_size]; status = hdf_file->read("VEC_QSCHU2", str_type, vec_qschu2); vec_pschu1 = new double[xi_block_size]; status = hdf_file->read("VEC_PSCHU1", str_type, vec_pschu1); vec_pschu2 = new double[xi_block_size]; status = hdf_file->read("VEC_PSCHU2", str_type, vec_pschu2); vec_s0mag1 = new double[xi_block_size]; status = hdf_file->read("VEC_S0MAG1", str_type, vec_s0mag1); vec_s0mag2 = new double[xi_block_size]; status = hdf_file->read("VEC_S0MAG2", str_type, vec_s0mag2); vec_cosav1 = new double[xi_block_size]; status = hdf_file->read("VEC_COSAV1", str_type, vec_cosav1); vec_cosav2 = new double[xi_block_size]; status = hdf_file->read("VEC_COSAV2", str_type, vec_cosav2); vec_raprs1 = new double[xi_block_size]; status = hdf_file->read("VEC_RAPRS1", str_type, vec_raprs1); vec_raprs2 = new double[xi_block_size]; status = hdf_file->read("VEC_RAPRS2", str_type, vec_raprs2); vec_fk1 = new double[xi_block_size]; status = hdf_file->read("VEC_FK1", str_type, vec_fk1); vec_fk2 = new double[xi_block_size]; status = hdf_file->read("VEC_FK2", str_type, vec_fk2); str_type = "FLOAT64_(" + to_string(2 * xi_block_size) + ")"; vec_fsas11 = new dcomplex[xi_block_size]; status = hdf_file->read("VEC_FSAS11", str_type, vec_fsas11); vec_fsas21 = new dcomplex[xi_block_size]; status = hdf_file->read("VEC_FSAS21", str_type, vec_fsas21); vec_fsas22 = new dcomplex[xi_block_size]; status = hdf_file->read("VEC_FSAS22", str_type, vec_fsas22); vec_fsas12 = new dcomplex[xi_block_size]; status = hdf_file->read("VEC_FSAS12", str_type, vec_fsas12); // Initialize directions (they are scale-independent) double cti = th, cpi = ph, cts = ths, cps = phs; for (int di = 0; di < _num_theta; di++) { vec_dir_tidg[di] = cti; cti += thstp; } for (int di = 0; di < _num_thetas; di++) { vec_dir_tsdg[di] = cts; cts += thsstp; } for (int di = 0; di < _num_phi; di++) { vec_dir_pidg[di] = cpi; cpi += phstp; } for (int di = 0; di < _num_phis; di++) { vec_dir_psdg[di] = cps; cps += phsstp; } str_type = "FLOAT64_(" + to_string(ndirs) + ")"; vec_dir_scand = new double[ndirs]; status = hdf_file->read("VEC_DIR_SCAND", str_type, vec_dir_scand); vec_dir_cfmp = new double[ndirs]; status = hdf_file->read("VEC_DIR_CFMP", str_type, vec_dir_cfmp); vec_dir_sfmp = new double[ndirs]; status = hdf_file->read("VEC_DIR_SFMP", str_type, vec_dir_sfmp); vec_dir_cfsp = new double[ndirs]; status = hdf_file->read("VEC_DIR_CFSP", str_type, vec_dir_cfsp); vec_dir_sfsp = new double[ndirs]; status = hdf_file->read("VEC_DIR_SFSP", str_type, vec_dir_sfsp); str_type = "FLOAT64_(" + to_string(3 * ndirs) + ")"; vec_dir_un = new double[3 * ndirs]; status = hdf_file->read("VEC_DIR_UN", str_type, vec_dir_un); vec_dir_uns = new double[3 * ndirs]; status = hdf_file->read("VEC_DIR_UNS", str_type, vec_dir_uns); str_type = "FLOAT64_(" + to_string(ndirs * xi_block_size) + ")"; vec_dir_scs1 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_SCS1", str_type, vec_dir_scs1); vec_dir_scs2 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_SCS2", str_type, vec_dir_scs2); vec_dir_abs1 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_ABS1", str_type, vec_dir_abs1); vec_dir_abs2 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_ABS2", str_type, vec_dir_abs2); vec_dir_exs1 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_EXS1", str_type, vec_dir_exs1); vec_dir_exs2 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_EXS2", str_type, vec_dir_exs2); vec_dir_albeds1 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_ALBEDS1", str_type, vec_dir_albeds1); vec_dir_albeds2 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_ALBEDS2", str_type, vec_dir_albeds2); vec_dir_scsrt1 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_SCSRT1", str_type, vec_dir_scsrt1); vec_dir_scsrt2 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_SCSRT2", str_type, vec_dir_scsrt2); vec_dir_absrt1 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_ABSRT1", str_type, vec_dir_absrt1); vec_dir_absrt2 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_ABSRT2", str_type, vec_dir_absrt2); vec_dir_exsrt1 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_EXSRT1", str_type, vec_dir_exsrt1); vec_dir_exsrt2 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_EXSRT2", str_type, vec_dir_exsrt2); str_type = "FLOAT64_(" + to_string(2 * ndirs * xi_block_size) + ")"; vec_dir_fsas11 = new dcomplex[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_FSAS11", str_type, vec_dir_fsas11); vec_dir_fsas21 = new dcomplex[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_FSAS21", str_type, vec_dir_fsas21); vec_dir_fsas12 = new dcomplex[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_FSAS12", str_type, vec_dir_fsas12); vec_dir_fsas22 = new dcomplex[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_FSAS22", str_type, vec_dir_fsas22); vec_dir_sas11 = new dcomplex[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_SAS11", str_type, vec_dir_sas11); vec_dir_sas21 = new dcomplex[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_SAS21", str_type, vec_dir_sas21); vec_dir_sas12 = new dcomplex[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_SAS12", str_type, vec_dir_sas12); vec_dir_sas22 = new dcomplex[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_SAS22", str_type, vec_dir_sas22); str_type = "FLOAT64_(" + to_string(ndirs * xi_block_size) + ")"; vec_dir_qschu1 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_QSCHU1", str_type, vec_dir_qschu1); vec_dir_qschu2 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_QSCHU2", str_type, vec_dir_qschu2); vec_dir_pschu1 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_PSCHU1", str_type, vec_dir_pschu1); vec_dir_pschu2 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_PSCHU2", str_type, vec_dir_pschu2); vec_dir_s0mag1 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_S0MAG1", str_type, vec_dir_s0mag1); vec_dir_s0mag2 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_S0MAG2", str_type, vec_dir_s0mag2); vec_dir_cosav1 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_COSAV1", str_type, vec_dir_cosav1); vec_dir_cosav2 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_COSAV2", str_type, vec_dir_cosav2); vec_dir_rapr1 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_RAPR1", str_type, vec_dir_rapr1); vec_dir_rapr2 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_RAPR2", str_type, vec_dir_rapr2); vec_dir_fl1 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_FL1", str_type, vec_dir_fl1); vec_dir_fl2 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_FL2", str_type, vec_dir_fl2); vec_dir_fr1 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_FR1", str_type, vec_dir_fr1); vec_dir_fr2 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_FR2", str_type, vec_dir_fr2); vec_dir_fk1 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_FK1", str_type, vec_dir_fk1); vec_dir_fk2 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_FK2", str_type, vec_dir_fk2); vec_dir_fx1 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_FX1", str_type, vec_dir_fx1); vec_dir_fx2 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_FX2", str_type, vec_dir_fx2); vec_dir_fy1 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_FY1", str_type, vec_dir_fy1); vec_dir_fy2 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_FY2", str_type, vec_dir_fy2); vec_dir_fz1 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_FZ1", str_type, vec_dir_fz1); vec_dir_fz2 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_FZ2", str_type, vec_dir_fz2); vec_dir_tqel1 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_TQEL1", str_type, vec_dir_tqel1); vec_dir_tqel2 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_TQEL2", str_type, vec_dir_tqel2); vec_dir_tqer1 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_TQER1", str_type, vec_dir_tqer1); vec_dir_tqer2 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_TQER2", str_type, vec_dir_tqer2); vec_dir_tqek1 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_TQEK1", str_type, vec_dir_tqek1); vec_dir_tqek2 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_TQEK2", str_type, vec_dir_tqek2); vec_dir_tqex1 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_TQEX1", str_type, vec_dir_tqex1); vec_dir_tqex2 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_TQEX2", str_type, vec_dir_tqex2); vec_dir_tqey1 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_TQEY1", str_type, vec_dir_tqey1); vec_dir_tqey2 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_TQEY2", str_type, vec_dir_tqey2); vec_dir_tqez1 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_TQEZ1", str_type, vec_dir_tqez1); vec_dir_tqez2 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_TQEZ2", str_type, vec_dir_tqez2); vec_dir_tqsl1 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_TQSL1", str_type, vec_dir_tqsl1); vec_dir_tqsl2 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_TQSL2", str_type, vec_dir_tqsl2); vec_dir_tqsr1 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_TQSR1", str_type, vec_dir_tqsr1); vec_dir_tqsr2 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_TQSR2", str_type, vec_dir_tqsr2); vec_dir_tqsk1 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_TQSK1", str_type, vec_dir_tqsk1); vec_dir_tqsk2 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_TQSK2", str_type, vec_dir_tqsk2); vec_dir_tqsx1 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_TQSX1", str_type, vec_dir_tqsx1); vec_dir_tqsx2 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_TQSX2", str_type, vec_dir_tqsx2); vec_dir_tqsy1 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_TQSY1", str_type, vec_dir_tqsy1); vec_dir_tqsy2 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_TQSY2", str_type, vec_dir_tqsy2); vec_dir_tqsz1 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_TQSZ1", str_type, vec_dir_tqsz1); vec_dir_tqsz2 = new double[ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_TQSZ2", str_type, vec_dir_tqsz2); str_type = "FLOAT64_(" + to_string(16 * ndirs * xi_block_size) + ")"; vec_dir_mull = new double[16 * ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_MULL", str_type, vec_dir_mull); vec_dir_mulllr = new double[16 * ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_MULLLR", str_type, vec_dir_mulllr); status = hdf_file->close(); delete hdf_file; } else { if (hdf_file != NULL) delete hdf_file; UnrecognizedFormatException ex("Error: " + hdf5_name + " not recognized as a valid HDF5 file!"); throw ex; } } InclusionOutputInfo::~InclusionOutputInfo() { delete[] vec_x_coords; delete[] vec_y_coords; delete[] vec_z_coords; delete[] vec_jxi; delete[] vec_ier; delete[] vec_vk; delete[] vec_xi; delete[] vec_sphere_sizes; delete[] vec_sphere_ref_indices; delete[] vec_scs1; delete[] vec_scs2; delete[] vec_abs1; delete[] vec_abs2; delete[] vec_exs1; delete[] vec_exs2; delete[] vec_albeds1; delete[] vec_albeds2; delete[] vec_scsrt1; delete[] vec_scsrt2; delete[] vec_absrt1; delete[] vec_absrt2; delete[] vec_exsrt1; delete[] vec_exsrt2; delete[] vec_qschu1; delete[] vec_qschu2; delete[] vec_pschu1; delete[] vec_pschu2; delete[] vec_s0mag1; delete[] vec_s0mag2; delete[] vec_cosav1; delete[] vec_cosav2; delete[] vec_raprs1; delete[] vec_raprs2; delete[] vec_fk1; delete[] vec_fk2; delete[] vec_fsas11; delete[] vec_fsas21; delete[] vec_fsas22; delete[] vec_fsas12; delete[] vec_dir_tidg; delete[] vec_dir_pidg; delete[] vec_dir_tsdg; delete[] vec_dir_psdg; delete[] vec_dir_scand; delete[] vec_dir_cfmp; delete[] vec_dir_sfmp; delete[] vec_dir_cfsp; delete[] vec_dir_sfsp; delete[] vec_dir_un; delete[] vec_dir_uns; delete[] vec_dir_scs1; delete[] vec_dir_scs2; delete[] vec_dir_abs1; delete[] vec_dir_abs2; delete[] vec_dir_exs1; delete[] vec_dir_exs2; delete[] vec_dir_albeds1; delete[] vec_dir_albeds2; delete[] vec_dir_scsrt1; delete[] vec_dir_scsrt2; delete[] vec_dir_absrt1; delete[] vec_dir_absrt2; delete[] vec_dir_exsrt1; delete[] vec_dir_exsrt2; delete[] vec_dir_fsas11; delete[] vec_dir_fsas21; delete[] vec_dir_fsas12; delete[] vec_dir_fsas22; delete[] vec_dir_sas11; delete[] vec_dir_sas21; delete[] vec_dir_sas12; delete[] vec_dir_sas22; delete[] vec_dir_qschu1; delete[] vec_dir_qschu2; delete[] vec_dir_pschu1; delete[] vec_dir_pschu2; delete[] vec_dir_s0mag1; delete[] vec_dir_s0mag2; delete[] vec_dir_cosav1; delete[] vec_dir_cosav2; delete[] vec_dir_rapr1; delete[] vec_dir_rapr2; delete[] vec_dir_fl1; delete[] vec_dir_fl2; delete[] vec_dir_fr1; delete[] vec_dir_fr2; delete[] vec_dir_fk1; delete[] vec_dir_fk2; delete[] vec_dir_fx1; delete[] vec_dir_fx2; delete[] vec_dir_fy1; delete[] vec_dir_fy2; delete[] vec_dir_fz1; delete[] vec_dir_fz2; delete[] vec_dir_tqel1; delete[] vec_dir_tqel2; delete[] vec_dir_tqer1; delete[] vec_dir_tqer2; delete[] vec_dir_tqek1; delete[] vec_dir_tqek2; delete[] vec_dir_tqex1; delete[] vec_dir_tqex2; delete[] vec_dir_tqey1; delete[] vec_dir_tqey2; delete[] vec_dir_tqez1; delete[] vec_dir_tqez2; delete[] vec_dir_tqsl1; delete[] vec_dir_tqsl2; delete[] vec_dir_tqsr1; delete[] vec_dir_tqsr2; delete[] vec_dir_tqsk1; delete[] vec_dir_tqsk2; delete[] vec_dir_tqsx1; delete[] vec_dir_tqsx2; delete[] vec_dir_tqsy1; delete[] vec_dir_tqsy2; delete[] vec_dir_tqsz1; delete[] vec_dir_tqsz2; delete[] vec_dir_mull; delete[] vec_dir_mulllr; } long InclusionOutputInfo::compute_size() { long result = sizeof(np_int); result += 21 * sizeof(int); result += 13 * sizeof(double); result += 120 * sizeof(long); // vector pointers result += xi_block_size * (sizeof(int) + sizeof(short)); // vec_jxi, vec_ier result += 3 * nsph * sizeof(double); // coordinate vectors result += 29 * xi_block_size * sizeof(double); // wavelength dependent real values result += 5 * xi_block_size * sizeof(dcomplex); // wavelength dependent complex values result += 15 * ndirs * sizeof(double); // values depending only on directions result += 92 * ndirs * xi_block_size * sizeof(double); // values depending on directions and wavelengths result += 8 * ndirs * xi_block_size * sizeof(dcomplex); // values depending on directions and wavelengths return result; } long InclusionOutputInfo::compute_size( ScattererConfiguration *sc, GeometryConfiguration *gc, int first_xi, int xi_length ) { long result = sizeof(np_int); result += 21 * sizeof(int); result += 13 * sizeof(double); result += 120 * sizeof(long); // vector pointers int _nsph = gc->number_of_spheres; double _th = gc->in_theta_start; double _thstp = gc->in_theta_step; double _thlst = gc->in_theta_end; double _ths = gc->sc_theta_start; double _thsstp = gc->sc_theta_step; double _thslst = gc->sc_theta_end; int num_theta = 1 + int((_thlst - _th) / _thstp); int num_thetas = 1 + int((_thslst - _ths) / _thsstp); double _ph = gc->in_phi_start; double _phstp = gc->in_phi_step; double _phlst = gc->in_phi_end; double _phs = gc->sc_phi_start; double _phsstp = gc->sc_phi_step; double _phslst = gc->sc_phi_end; int num_phi = 1 + int((_phlst - _ph) / _phstp); int num_phis = 1 + int((_phslst - _phs) / _phsstp); int _ndirs = num_theta * num_thetas * num_phi * num_phis; int _nxi = sc->number_of_scales; int _xi_block_size = (xi_length == 0) ? _nxi : xi_length; int _configurations = sc->configurations; result += _xi_block_size * (sizeof(int) + sizeof(short)); // vec_jxi, vec_ier result += 3 * _nsph * sizeof(double); // coordinate vectors result += 29 * _xi_block_size * sizeof(double); // wavelength dependent real values result += 5 * _xi_block_size * sizeof(dcomplex); // wavelength dependent complex values result += 15 * _ndirs * sizeof(double); // values depending only on directions result += 92 * _ndirs * _xi_block_size * sizeof(double); // values depending on directions and wavelengths result += 8 * _ndirs * _xi_block_size * sizeof(dcomplex); // values depending on directions and wavelengths return result; } int InclusionOutputInfo::insert(const InclusionOutputInfo &rhs) { int result = 0; result += (rhs.nsph == nsph) ? 0 : 1; result += (rhs.inpol == inpol) ? 0 : 1; result += (rhs.iavm == iavm) ? 0 : 1; result += (rhs.isam == isam) ? 0 : 1; result += (rhs._num_theta == _num_theta) ? 0 : 1; result += (rhs._num_thetas == _num_thetas) ? 0 : 1; result += (rhs._num_phi == _num_phi) ? 0 : 1; result += (rhs._num_phis == _num_phis) ? 0 : 1; result += (rhs.ndirs == ndirs) ? 0 : 1; result += (rhs.exri == exri) ? 0 : 1; result += (rhs.idfc == idfc) ? 0 : 1; result += (rhs.configurations == configurations) ? 0 : 1; if (result == 0) { int offset, chunk_size, xi1; xi1 = rhs._first_xi; // Insert vectors whose size depends on wavelengths offset = xi1 - _first_xi; chunk_size = rhs.xi_block_size; memcpy(vec_jxi + offset, rhs.vec_jxi, chunk_size * sizeof(int)); memcpy(vec_ier + offset, rhs.vec_ier, chunk_size * sizeof(short)); memcpy(vec_vk + offset, rhs.vec_vk, chunk_size * sizeof(double)); memcpy(vec_xi + offset, rhs.vec_xi, chunk_size * sizeof(double)); memcpy(vec_scs1 + offset, rhs.vec_scs1, chunk_size * sizeof(double)); memcpy(vec_scs2 + offset, rhs.vec_scs2, chunk_size * sizeof(double)); memcpy(vec_abs1 + offset, rhs.vec_abs1, chunk_size * sizeof(double)); memcpy(vec_abs2 + offset, rhs.vec_abs2, chunk_size * sizeof(double)); memcpy(vec_exs1 + offset, rhs.vec_exs1, chunk_size * sizeof(double)); memcpy(vec_exs2 + offset, rhs.vec_exs2, chunk_size * sizeof(double)); memcpy(vec_albeds1 + offset, rhs.vec_albeds1, chunk_size * sizeof(double)); memcpy(vec_albeds2 + offset, rhs.vec_albeds2, chunk_size * sizeof(double)); memcpy(vec_scsrt1 + offset, rhs.vec_scsrt1, chunk_size * sizeof(double)); memcpy(vec_scsrt2 + offset, rhs.vec_scsrt2, chunk_size * sizeof(double)); memcpy(vec_absrt1 + offset, rhs.vec_absrt1, chunk_size * sizeof(double)); memcpy(vec_absrt2 + offset, rhs.vec_absrt2, chunk_size * sizeof(double)); memcpy(vec_exsrt1 + offset, rhs.vec_exsrt1, chunk_size * sizeof(double)); memcpy(vec_exsrt2 + offset, rhs.vec_exsrt2, chunk_size * sizeof(double)); memcpy(vec_qschu1 + offset, rhs.vec_qschu1, chunk_size * sizeof(double)); memcpy(vec_qschu2 + offset, rhs.vec_qschu2, chunk_size * sizeof(double)); memcpy(vec_pschu1 + offset, rhs.vec_pschu1, chunk_size * sizeof(double)); memcpy(vec_pschu2 + offset, rhs.vec_pschu2, chunk_size * sizeof(double)); memcpy(vec_s0mag1 + offset, rhs.vec_s0mag1, chunk_size * sizeof(double)); memcpy(vec_s0mag2 + offset, rhs.vec_s0mag2, chunk_size * sizeof(double)); memcpy(vec_cosav1 + offset, rhs.vec_cosav1, chunk_size * sizeof(double)); memcpy(vec_cosav2 + offset, rhs.vec_cosav2, chunk_size * sizeof(double)); memcpy(vec_raprs1 + offset, rhs.vec_raprs1, chunk_size * sizeof(double)); memcpy(vec_raprs2 + offset, rhs.vec_raprs2, chunk_size * sizeof(double)); memcpy(vec_fk1 + offset, rhs.vec_fk1, chunk_size * sizeof(double)); memcpy(vec_fk2 + offset, rhs.vec_fk2, chunk_size * sizeof(double)); memcpy(vec_fsas11 + offset, rhs.vec_fsas11, chunk_size * sizeof(dcomplex)); memcpy(vec_fsas21 + offset, rhs.vec_fsas21, chunk_size * sizeof(dcomplex)); memcpy(vec_fsas22 + offset, rhs.vec_fsas22, chunk_size * sizeof(dcomplex)); memcpy(vec_fsas12 + offset, rhs.vec_fsas12, chunk_size * sizeof(dcomplex)); // Insert vectors whose sizes depend on configurations offset = (xi1 - _first_xi) * (configurations + 1); chunk_size = rhs.xi_block_size * (configurations + 1); memcpy(vec_sphere_sizes + offset, rhs.vec_sphere_sizes, chunk_size * sizeof(double)); memcpy(vec_sphere_ref_indices + offset, rhs.vec_sphere_ref_indices, chunk_size * sizeof(dcomplex)); // Insert vectors whose sizes depend on directions and wavelengths offset = (xi1 - _first_xi) * ndirs; chunk_size = rhs.xi_block_size * ndirs; memcpy(vec_dir_scs1 + offset, rhs.vec_dir_scs1, chunk_size * sizeof(double)); memcpy(vec_dir_scs2 + offset, rhs.vec_dir_scs2, chunk_size * sizeof(double)); memcpy(vec_dir_abs1 + offset, rhs.vec_dir_abs1, chunk_size * sizeof(double)); memcpy(vec_dir_abs2 + offset, rhs.vec_dir_abs2, chunk_size * sizeof(double)); memcpy(vec_dir_exs1 + offset, rhs.vec_dir_exs1, chunk_size * sizeof(double)); memcpy(vec_dir_exs2 + offset, rhs.vec_dir_exs2, chunk_size * sizeof(double)); memcpy(vec_dir_albeds1 + offset, rhs.vec_dir_albeds1, chunk_size * sizeof(double)); memcpy(vec_dir_albeds2 + offset, rhs.vec_dir_albeds2, chunk_size * sizeof(double)); memcpy(vec_dir_scsrt1 + offset, rhs.vec_dir_scsrt1, chunk_size * sizeof(double)); memcpy(vec_dir_scsrt2 + offset, rhs.vec_dir_scsrt2, chunk_size * sizeof(double)); memcpy(vec_dir_absrt1 + offset, rhs.vec_dir_absrt1, chunk_size * sizeof(double)); memcpy(vec_dir_absrt2 + offset, rhs.vec_dir_absrt2, chunk_size * sizeof(double)); memcpy(vec_dir_exsrt1 + offset, rhs.vec_dir_exsrt1, chunk_size * sizeof(double)); memcpy(vec_dir_exsrt2 + offset, rhs.vec_dir_exsrt2, chunk_size * sizeof(double)); memcpy(vec_dir_fsas11 + offset, rhs.vec_dir_fsas11, chunk_size * sizeof(dcomplex)); memcpy(vec_dir_fsas21 + offset, rhs.vec_dir_fsas21, chunk_size * sizeof(dcomplex)); memcpy(vec_dir_fsas12 + offset, rhs.vec_dir_fsas12, chunk_size * sizeof(dcomplex)); memcpy(vec_dir_fsas22 + offset, rhs.vec_dir_fsas22, chunk_size * sizeof(dcomplex)); memcpy(vec_dir_sas11 + offset, rhs.vec_dir_sas11, chunk_size * sizeof(dcomplex)); memcpy(vec_dir_sas21 + offset, rhs.vec_dir_sas21, chunk_size * sizeof(dcomplex)); memcpy(vec_dir_sas12 + offset, rhs.vec_dir_sas12, chunk_size * sizeof(dcomplex)); memcpy(vec_dir_sas22 + offset, rhs.vec_dir_sas22, chunk_size * sizeof(dcomplex)); memcpy(vec_dir_qschu1 + offset, rhs.vec_dir_qschu1, chunk_size * sizeof(double)); memcpy(vec_dir_qschu2 + offset, rhs.vec_dir_qschu2, chunk_size * sizeof(double)); memcpy(vec_dir_pschu1 + offset, rhs.vec_dir_pschu1, chunk_size * sizeof(double)); memcpy(vec_dir_pschu2 + offset, rhs.vec_dir_pschu2, chunk_size * sizeof(double)); memcpy(vec_dir_s0mag1 + offset, rhs.vec_dir_s0mag1, chunk_size * sizeof(double)); memcpy(vec_dir_s0mag2 + offset, rhs.vec_dir_s0mag2, chunk_size * sizeof(double)); memcpy(vec_dir_cosav1 + offset, rhs.vec_dir_cosav1, chunk_size * sizeof(double)); memcpy(vec_dir_cosav2 + offset, rhs.vec_dir_cosav2, chunk_size * sizeof(double)); memcpy(vec_dir_rapr1 + offset, rhs.vec_dir_rapr1, chunk_size * sizeof(double)); memcpy(vec_dir_rapr2 + offset, rhs.vec_dir_rapr2, chunk_size * sizeof(double)); memcpy(vec_dir_fl1 + offset, rhs.vec_dir_fl1, chunk_size * sizeof(double)); memcpy(vec_dir_fl2 + offset, rhs.vec_dir_fl2, chunk_size * sizeof(double)); memcpy(vec_dir_fr1 + offset, rhs.vec_dir_fr1, chunk_size * sizeof(double)); memcpy(vec_dir_fr2 + offset, rhs.vec_dir_fr2, chunk_size * sizeof(double)); memcpy(vec_dir_fk1 + offset, rhs.vec_dir_fk1, chunk_size * sizeof(double)); memcpy(vec_dir_fk2 + offset, rhs.vec_dir_fk2, chunk_size * sizeof(double)); memcpy(vec_dir_fx1 + offset, rhs.vec_dir_fx1, chunk_size * sizeof(double)); memcpy(vec_dir_fx2 + offset, rhs.vec_dir_fx2, chunk_size * sizeof(double)); memcpy(vec_dir_fy1 + offset, rhs.vec_dir_fy1, chunk_size * sizeof(double)); memcpy(vec_dir_fy2 + offset, rhs.vec_dir_fy2, chunk_size * sizeof(double)); memcpy(vec_dir_fz1 + offset, rhs.vec_dir_fz1, chunk_size * sizeof(double)); memcpy(vec_dir_fz2 + offset, rhs.vec_dir_fz2, chunk_size * sizeof(double)); memcpy(vec_dir_tqel1 + offset, rhs.vec_dir_tqel1, chunk_size * sizeof(double)); memcpy(vec_dir_tqel2 + offset, rhs.vec_dir_tqel2, chunk_size * sizeof(double)); memcpy(vec_dir_tqer1 + offset, rhs.vec_dir_tqer1, chunk_size * sizeof(double)); memcpy(vec_dir_tqer2 + offset, rhs.vec_dir_tqer2, chunk_size * sizeof(double)); memcpy(vec_dir_tqek1 + offset, rhs.vec_dir_tqek1, chunk_size * sizeof(double)); memcpy(vec_dir_tqek2 + offset, rhs.vec_dir_tqek2, chunk_size * sizeof(double)); memcpy(vec_dir_tqex1 + offset, rhs.vec_dir_tqex1, chunk_size * sizeof(double)); memcpy(vec_dir_tqex2 + offset, rhs.vec_dir_tqex2, chunk_size * sizeof(double)); memcpy(vec_dir_tqey1 + offset, rhs.vec_dir_tqey1, chunk_size * sizeof(double)); memcpy(vec_dir_tqey2 + offset, rhs.vec_dir_tqey2, chunk_size * sizeof(double)); memcpy(vec_dir_tqez1 + offset, rhs.vec_dir_tqez1, chunk_size * sizeof(double)); memcpy(vec_dir_tqez2 + offset, rhs.vec_dir_tqez2, chunk_size * sizeof(double)); memcpy(vec_dir_tqsl1 + offset, rhs.vec_dir_tqsl1, chunk_size * sizeof(double)); memcpy(vec_dir_tqsl2 + offset, rhs.vec_dir_tqsl2, chunk_size * sizeof(double)); memcpy(vec_dir_tqsr1 + offset, rhs.vec_dir_tqsr1, chunk_size * sizeof(double)); memcpy(vec_dir_tqsr2 + offset, rhs.vec_dir_tqsr2, chunk_size * sizeof(double)); memcpy(vec_dir_tqsk1 + offset, rhs.vec_dir_tqsk1, chunk_size * sizeof(double)); memcpy(vec_dir_tqsk2 + offset, rhs.vec_dir_tqsk2, chunk_size * sizeof(double)); memcpy(vec_dir_tqsx1 + offset, rhs.vec_dir_tqsx1, chunk_size * sizeof(double)); memcpy(vec_dir_tqsx2 + offset, rhs.vec_dir_tqsx2, chunk_size * sizeof(double)); memcpy(vec_dir_tqsy1 + offset, rhs.vec_dir_tqsy1, chunk_size * sizeof(double)); memcpy(vec_dir_tqsy2 + offset, rhs.vec_dir_tqsy2, chunk_size * sizeof(double)); memcpy(vec_dir_tqsz1 + offset, rhs.vec_dir_tqsz1, chunk_size * sizeof(double)); memcpy(vec_dir_tqsz2 + offset, rhs.vec_dir_tqsz2, chunk_size * sizeof(double)); memcpy(vec_dir_mull + 16 * offset, rhs.vec_dir_mull, 16 * chunk_size * sizeof(double)); memcpy(vec_dir_mulllr + 16 * offset, rhs.vec_dir_mulllr, 16 * chunk_size * sizeof(double)); } return result; } int InclusionOutputInfo::write(const std::string &output, const std::string &format) { int result = 0; if (format.compare("LEGACY") == 0) { result = write_legacy(output); } else if (format.compare("HDF5") == 0) { result = write_hdf5(output); } else { string message = "Unknown format mode: \"" + format + "\""; throw UnrecognizedConfigurationException(message); } return result; } int InclusionOutputInfo::write_hdf5(const std::string &file_name) { List *rec_name_list = new List(1); List *rec_type_list = new List(1); List *rec_ptr_list = new List(1); string str_type, str_name; rec_name_list->set(0, "NSPH"); rec_type_list->set(0, "INT32_(1)"); rec_ptr_list->set(0, &nsph); rec_name_list->append("LI"); rec_type_list->append("INT32_(1)"); rec_ptr_list->append(&li); rec_name_list->append("LE"); rec_type_list->append("INT32_(1)"); rec_ptr_list->append(&le); rec_name_list->append("LM"); rec_type_list->append("INT32_(1)"); rec_ptr_list->append(&lm); rec_name_list->append("MXNDM"); rec_type_list->append("INT64_(1)"); rec_ptr_list->append(&mxndm); rec_name_list->append("INPOL"); rec_type_list->append("INT32_(1)"); rec_ptr_list->append(&inpol); rec_name_list->append("NPNT"); rec_type_list->append("INT32_(1)"); rec_ptr_list->append(&npnt); rec_name_list->append("NPNTTS"); rec_type_list->append("INT32_(1)"); rec_ptr_list->append(&npntts); rec_name_list->append("IAVM"); rec_type_list->append("INT32_(1)"); rec_ptr_list->append(&iavm); rec_name_list->append("ISAM"); rec_type_list->append("INT32_(1)"); rec_ptr_list->append(&isam); rec_name_list->append("JWTM"); rec_type_list->append("INT32_(1)"); rec_ptr_list->append(&jwtm); rec_name_list->append("VEC_SPH_X"); rec_type_list->append("FLOAT64_(" + to_string(nsph) + ")"); rec_ptr_list->append(vec_x_coords); rec_name_list->append("VEC_SPH_Y"); rec_type_list->append("FLOAT64_(" + to_string(nsph) + ")"); rec_ptr_list->append(vec_y_coords); rec_name_list->append("VEC_SPH_Z"); rec_type_list->append("FLOAT64_(" + to_string(nsph) + ")"); rec_ptr_list->append(vec_z_coords); rec_name_list->append("TH_START"); rec_type_list->append("FLOAT64_(1)"); rec_ptr_list->append(&th); rec_name_list->append("TH_STEP"); rec_type_list->append("FLOAT64_(1)"); rec_ptr_list->append(&thstp); rec_name_list->append("TH_END"); rec_type_list->append("FLOAT64_(1)"); rec_ptr_list->append(&thlst); rec_name_list->append("THS_START"); rec_type_list->append("FLOAT64_(1)"); rec_ptr_list->append(&ths); rec_name_list->append("THS_STEP"); rec_type_list->append("FLOAT64_(1)"); rec_ptr_list->append(&thsstp); rec_name_list->append("THS_END"); rec_type_list->append("FLOAT64_(1)"); rec_ptr_list->append(&thslst); rec_name_list->append("PH_START"); rec_type_list->append("FLOAT64_(1)"); rec_ptr_list->append(&ph); rec_name_list->append("PH_STEP"); rec_type_list->append("FLOAT64_(1)"); rec_ptr_list->append(&phstp); rec_name_list->append("PH_END"); rec_type_list->append("FLOAT64_(1)"); rec_ptr_list->append(&phlst); rec_name_list->append("PHS_START"); rec_type_list->append("FLOAT64_(1)"); rec_ptr_list->append(&phs); rec_name_list->append("PHS_STEP"); rec_type_list->append("FLOAT64_(1)"); rec_ptr_list->append(&phsstp); rec_name_list->append("PHS_END"); rec_type_list->append("FLOAT64_(1)"); rec_ptr_list->append(&phslst); rec_name_list->append("EXRI"); rec_type_list->append("FLOAT64_(1)"); rec_ptr_list->append(&exri); rec_name_list->append("IDFC"); rec_type_list->append("INT32_(1)"); rec_ptr_list->append(&idfc); rec_name_list->append("XI1"); rec_type_list->append("INT32_(1)"); rec_ptr_list->append(&_first_xi); rec_name_list->append("NXI"); rec_type_list->append("INT32_(1)"); rec_ptr_list->append(&xi_block_size); rec_name_list->append("VEC_JXI"); rec_type_list->append("INT32_(" + to_string(xi_block_size) + ")"); rec_ptr_list->append(vec_jxi); rec_name_list->append("VEC_IER"); rec_type_list->append("INT16_(" + to_string(xi_block_size) + ")"); rec_ptr_list->append(vec_ier); rec_name_list->append("VEC_VK"); rec_type_list->append("FLOAT64_(" + to_string(xi_block_size) + ")"); rec_ptr_list->append(vec_vk); rec_name_list->append("VEC_XI"); rec_type_list->append("FLOAT64_(" + to_string(xi_block_size) + ")"); rec_ptr_list->append(vec_xi); rec_name_list->append("NCONF"); rec_type_list->append("INT32_(1)"); rec_ptr_list->append(&configurations); rec_name_list->append("VEC_SPH_SIZES"); rec_type_list->append("FLOAT64_(" + to_string(xi_block_size * (configurations + 1)) + ")"); rec_ptr_list->append(vec_sphere_sizes); rec_name_list->append("VEC_SPH_REFRI"); rec_type_list->append("FLOAT64_(" + to_string(2 * xi_block_size * (configurations+ 1)) + ")"); rec_ptr_list->append(vec_sphere_ref_indices); str_type = "FLOAT64_(" + to_string(xi_block_size) + ")"; rec_name_list->append("VEC_SCS1"); rec_type_list->append(str_type); rec_ptr_list->append(vec_scs1); rec_name_list->append("VEC_SCS2"); rec_type_list->append(str_type); rec_ptr_list->append(vec_scs2); rec_name_list->append("VEC_ABS1"); rec_type_list->append(str_type); rec_ptr_list->append(vec_abs1); rec_name_list->append("VEC_ABS2"); rec_type_list->append(str_type); rec_ptr_list->append(vec_abs2); rec_name_list->append("VEC_EXS1"); rec_type_list->append(str_type); rec_ptr_list->append(vec_exs1); rec_name_list->append("VEC_EXS2"); rec_type_list->append(str_type); rec_ptr_list->append(vec_exs2); rec_name_list->append("VEC_ALBEDS1"); rec_type_list->append(str_type); rec_ptr_list->append(vec_albeds1); rec_name_list->append("VEC_ALBEDS2"); rec_type_list->append(str_type); rec_ptr_list->append(vec_albeds2); rec_name_list->append("VEC_SCSRT1"); rec_type_list->append(str_type); rec_ptr_list->append(vec_scsrt1); rec_name_list->append("VEC_SCSRT2"); rec_type_list->append(str_type); rec_ptr_list->append(vec_scsrt2); rec_name_list->append("VEC_ABSRT1"); rec_type_list->append(str_type); rec_ptr_list->append(vec_absrt1); rec_name_list->append("VEC_ABSRT2"); rec_type_list->append(str_type); rec_ptr_list->append(vec_absrt2); rec_name_list->append("VEC_EXSRT1"); rec_type_list->append(str_type); rec_ptr_list->append(vec_exsrt1); rec_name_list->append("VEC_EXSRT2"); rec_type_list->append(str_type); rec_ptr_list->append(vec_exsrt2); rec_name_list->append("VEC_QSCHU1"); rec_type_list->append(str_type); rec_ptr_list->append(vec_qschu1); rec_name_list->append("VEC_QSCHU2"); rec_type_list->append(str_type); rec_ptr_list->append(vec_qschu2); rec_name_list->append("VEC_PSCHU1"); rec_type_list->append(str_type); rec_ptr_list->append(vec_pschu1); rec_name_list->append("VEC_PSCHU2"); rec_type_list->append(str_type); rec_ptr_list->append(vec_pschu2); rec_name_list->append("VEC_S0MAG1"); rec_type_list->append(str_type); rec_ptr_list->append(vec_s0mag1); rec_name_list->append("VEC_S0MAG2"); rec_type_list->append(str_type); rec_ptr_list->append(vec_s0mag2); rec_name_list->append("VEC_COSAV1"); rec_type_list->append(str_type); rec_ptr_list->append(vec_cosav1); rec_name_list->append("VEC_COSAV2"); rec_type_list->append(str_type); rec_ptr_list->append(vec_cosav2); rec_name_list->append("VEC_RAPRS1"); rec_type_list->append(str_type); rec_ptr_list->append(vec_raprs1); rec_name_list->append("VEC_RAPRS2"); rec_type_list->append(str_type); rec_ptr_list->append(vec_raprs2); rec_name_list->append("VEC_FK1"); rec_type_list->append(str_type); rec_ptr_list->append(vec_fk1); rec_name_list->append("VEC_FK2"); rec_type_list->append(str_type); rec_ptr_list->append(vec_fk2); str_type = "FLOAT64_(" + to_string(2 * xi_block_size) + ")"; rec_name_list->append("VEC_FSAS11"); rec_type_list->append(str_type); rec_ptr_list->append(vec_fsas11); rec_name_list->append("VEC_FSAS21"); rec_type_list->append(str_type); rec_ptr_list->append(vec_fsas21); rec_name_list->append("VEC_FSAS12"); rec_type_list->append(str_type); rec_ptr_list->append(vec_fsas12); rec_name_list->append("VEC_FSAS22"); rec_type_list->append(str_type); rec_ptr_list->append(vec_fsas22); str_type = "FLOAT64_(" + to_string(ndirs) + ")"; rec_name_list->append("VEC_DIR_SCAND"); rec_type_list->append(str_type); rec_ptr_list->append(vec_dir_scand); rec_name_list->append("VEC_DIR_CFMP"); rec_type_list->append(str_type); rec_ptr_list->append(vec_dir_cfmp); rec_name_list->append("VEC_DIR_CFSP"); rec_type_list->append(str_type); rec_ptr_list->append(vec_dir_cfsp); rec_name_list->append("VEC_DIR_SFMP"); rec_type_list->append(str_type); rec_ptr_list->append(vec_dir_sfmp); rec_name_list->append("VEC_DIR_SFSP"); rec_type_list->append(str_type); rec_ptr_list->append(vec_dir_sfsp); str_type = "FLOAT64_(" + to_string(3 * ndirs) + ")"; rec_name_list->append("VEC_DIR_UN"); rec_type_list->append(str_type); rec_ptr_list->append(vec_dir_un); rec_name_list->append("VEC_DIR_UNS"); rec_type_list->append(str_type); rec_ptr_list->append(vec_dir_uns); str_type = "FLOAT64_(" + to_string(ndirs * xi_block_size) + ")"; rec_name_list->append("VEC_DIR_SCS1"); rec_type_list->append(str_type); rec_ptr_list->append(vec_dir_scs1); rec_name_list->append("VEC_DIR_SCS2"); rec_type_list->append(str_type); rec_ptr_list->append(vec_dir_scs2); rec_name_list->append("VEC_DIR_ABS1"); rec_type_list->append(str_type); rec_ptr_list->append(vec_dir_abs1); rec_name_list->append("VEC_DIR_ABS2"); rec_type_list->append(str_type); rec_ptr_list->append(vec_dir_abs2); rec_name_list->append("VEC_DIR_EXS1"); rec_type_list->append(str_type); rec_ptr_list->append(vec_dir_exs1); rec_name_list->append("VEC_DIR_EXS2"); rec_type_list->append(str_type); rec_ptr_list->append(vec_dir_exs2); rec_name_list->append("VEC_DIR_ALBEDS1"); rec_type_list->append(str_type); rec_ptr_list->append(vec_dir_albeds1); rec_name_list->append("VEC_DIR_ALBEDS2"); rec_type_list->append(str_type); rec_ptr_list->append(vec_dir_albeds2); rec_name_list->append("VEC_DIR_SCSRT1"); rec_type_list->append(str_type); rec_ptr_list->append(vec_dir_scsrt1); rec_name_list->append("VEC_DIR_SCSRT2"); rec_type_list->append(str_type); rec_ptr_list->append(vec_dir_scsrt2); rec_name_list->append("VEC_DIR_ABSRT1"); rec_type_list->append(str_type); rec_ptr_list->append(vec_dir_absrt1); rec_name_list->append("VEC_DIR_ABSRT2"); rec_type_list->append(str_type); rec_ptr_list->append(vec_dir_absrt2); rec_name_list->append("VEC_DIR_EXSRT1"); rec_type_list->append(str_type); rec_ptr_list->append(vec_dir_exsrt1); rec_name_list->append("VEC_DIR_EXSRT2"); rec_type_list->append(str_type); rec_ptr_list->append(vec_dir_exsrt2); str_type = "FLOAT64_(" + to_string(2 * ndirs * xi_block_size) + ")"; rec_name_list->append("VEC_DIR_FSAS11"); rec_type_list->append(str_type); rec_ptr_list->append(vec_dir_fsas11); rec_name_list->append("VEC_DIR_FSAS21"); rec_type_list->append(str_type); rec_ptr_list->append(vec_dir_fsas21); rec_name_list->append("VEC_DIR_FSAS12"); rec_type_list->append(str_type); rec_ptr_list->append(vec_dir_fsas12); rec_name_list->append("VEC_DIR_FSAS22"); rec_type_list->append(str_type); rec_ptr_list->append(vec_dir_fsas22); rec_name_list->append("VEC_DIR_SAS11"); rec_type_list->append(str_type); rec_ptr_list->append(vec_dir_sas11); rec_name_list->append("VEC_DIR_SAS21"); rec_type_list->append(str_type); rec_ptr_list->append(vec_dir_sas21); rec_name_list->append("VEC_DIR_SAS12"); rec_type_list->append(str_type); rec_ptr_list->append(vec_dir_sas12); rec_name_list->append("VEC_DIR_SAS22"); rec_type_list->append(str_type); rec_ptr_list->append(vec_dir_sas22); str_type = "FLOAT64_(" + to_string(ndirs * xi_block_size) + ")"; rec_name_list->append("VEC_DIR_QSCHU1"); rec_type_list->append(str_type); rec_ptr_list->append(vec_dir_qschu1); rec_name_list->append("VEC_DIR_QSCHU2"); rec_type_list->append(str_type); rec_ptr_list->append(vec_dir_qschu2); rec_name_list->append("VEC_DIR_PSCHU1"); rec_type_list->append(str_type); rec_ptr_list->append(vec_dir_pschu1); rec_name_list->append("VEC_DIR_PSCHU2"); rec_type_list->append(str_type); rec_ptr_list->append(vec_dir_pschu2); rec_name_list->append("VEC_DIR_S0MAG1"); rec_type_list->append(str_type); rec_ptr_list->append(vec_dir_s0mag1); rec_name_list->append("VEC_DIR_S0MAG2"); rec_type_list->append(str_type); rec_ptr_list->append(vec_dir_s0mag2); rec_name_list->append("VEC_DIR_COSAV1"); rec_type_list->append(str_type); rec_ptr_list->append(vec_dir_cosav1); rec_name_list->append("VEC_DIR_COSAV2"); rec_type_list->append(str_type); rec_ptr_list->append(vec_dir_cosav2); rec_name_list->append("VEC_DIR_RAPR1"); rec_type_list->append(str_type); rec_ptr_list->append(vec_dir_rapr1); rec_name_list->append("VEC_DIR_RAPR2"); rec_type_list->append(str_type); rec_ptr_list->append(vec_dir_rapr2); rec_name_list->append("VEC_DIR_FL1"); rec_type_list->append(str_type); rec_ptr_list->append(vec_dir_fl1); rec_name_list->append("VEC_DIR_FL2"); rec_type_list->append(str_type); rec_ptr_list->append(vec_dir_fl2); rec_name_list->append("VEC_DIR_FR1"); rec_type_list->append(str_type); rec_ptr_list->append(vec_dir_fr1); rec_name_list->append("VEC_DIR_FR2"); rec_type_list->append(str_type); rec_ptr_list->append(vec_dir_fr2); rec_name_list->append("VEC_DIR_FK1"); rec_type_list->append(str_type); rec_ptr_list->append(vec_dir_fk1); rec_name_list->append("VEC_DIR_FK2"); rec_type_list->append(str_type); rec_ptr_list->append(vec_dir_fk2); rec_name_list->append("VEC_DIR_FX1"); rec_type_list->append(str_type); rec_ptr_list->append(vec_dir_fx1); rec_name_list->append("VEC_DIR_FX2"); rec_type_list->append(str_type); rec_ptr_list->append(vec_dir_fx2); rec_name_list->append("VEC_DIR_FY1"); rec_type_list->append(str_type); rec_ptr_list->append(vec_dir_fy1); rec_name_list->append("VEC_DIR_FY2"); rec_type_list->append(str_type); rec_ptr_list->append(vec_dir_fy2); rec_name_list->append("VEC_DIR_FZ1"); rec_type_list->append(str_type); rec_ptr_list->append(vec_dir_fz1); rec_name_list->append("VEC_DIR_FZ2"); rec_type_list->append(str_type); rec_ptr_list->append(vec_dir_fz2); rec_name_list->append("VEC_DIR_TQEL1"); rec_type_list->append(str_type); rec_ptr_list->append(vec_dir_tqel1); rec_name_list->append("VEC_DIR_TQEL2"); rec_type_list->append(str_type); rec_ptr_list->append(vec_dir_tqel2); rec_name_list->append("VEC_DIR_TQER1"); rec_type_list->append(str_type); rec_ptr_list->append(vec_dir_tqer1); rec_name_list->append("VEC_DIR_TQER2"); rec_type_list->append(str_type); rec_ptr_list->append(vec_dir_tqer2); rec_name_list->append("VEC_DIR_TQEK1"); rec_type_list->append(str_type); rec_ptr_list->append(vec_dir_tqek1); rec_name_list->append("VEC_DIR_TQEK2"); rec_type_list->append(str_type); rec_ptr_list->append(vec_dir_tqek2); rec_name_list->append("VEC_DIR_TQEX1"); rec_type_list->append(str_type); rec_ptr_list->append(vec_dir_tqex1); rec_name_list->append("VEC_DIR_TQEX2"); rec_type_list->append(str_type); rec_ptr_list->append(vec_dir_tqex2); rec_name_list->append("VEC_DIR_TQEY1"); rec_type_list->append(str_type); rec_ptr_list->append(vec_dir_tqey1); rec_name_list->append("VEC_DIR_TQEY2"); rec_type_list->append(str_type); rec_ptr_list->append(vec_dir_tqey2); rec_name_list->append("VEC_DIR_TQEZ1"); rec_type_list->append(str_type); rec_ptr_list->append(vec_dir_tqez1); rec_name_list->append("VEC_DIR_TQEZ2"); rec_type_list->append(str_type); rec_ptr_list->append(vec_dir_tqez2); rec_name_list->append("VEC_DIR_TQSL1"); rec_type_list->append(str_type); rec_ptr_list->append(vec_dir_tqsl1); rec_name_list->append("VEC_DIR_TQSL2"); rec_type_list->append(str_type); rec_ptr_list->append(vec_dir_tqsl2); rec_name_list->append("VEC_DIR_TQSR1"); rec_type_list->append(str_type); rec_ptr_list->append(vec_dir_tqsr1); rec_name_list->append("VEC_DIR_TQSR2"); rec_type_list->append(str_type); rec_ptr_list->append(vec_dir_tqsr2); rec_name_list->append("VEC_DIR_TQSK1"); rec_type_list->append(str_type); rec_ptr_list->append(vec_dir_tqsk1); rec_name_list->append("VEC_DIR_TQSK2"); rec_type_list->append(str_type); rec_ptr_list->append(vec_dir_tqsk2); rec_name_list->append("VEC_DIR_TQSX1"); rec_type_list->append(str_type); rec_ptr_list->append(vec_dir_tqsx1); rec_name_list->append("VEC_DIR_TQSX2"); rec_type_list->append(str_type); rec_ptr_list->append(vec_dir_tqsx2); rec_name_list->append("VEC_DIR_TQSY1"); rec_type_list->append(str_type); rec_ptr_list->append(vec_dir_tqsy1); rec_name_list->append("VEC_DIR_TQSY2"); rec_type_list->append(str_type); rec_ptr_list->append(vec_dir_tqsy2); rec_name_list->append("VEC_DIR_TQSZ1"); rec_type_list->append(str_type); rec_ptr_list->append(vec_dir_tqsz1); rec_name_list->append("VEC_DIR_TQSZ2"); rec_type_list->append(str_type); rec_ptr_list->append(vec_dir_tqsz2); str_type = "FLOAT64_(" + to_string(16 * ndirs * xi_block_size) + ")"; rec_name_list->append("VEC_DIR_MULL"); rec_type_list->append(str_type); rec_ptr_list->append(vec_dir_mull); rec_name_list->append("VEC_DIR_MULLLR"); rec_type_list->append(str_type); rec_ptr_list->append(vec_dir_mulllr); // Convert the lists to arrays and write them to HDF5 string *rec_names = rec_name_list->to_array(); string *rec_types = rec_type_list->to_array(); void **rec_pointers = rec_ptr_list->to_array(); const int rec_num = rec_name_list->length(); FileSchema *schema = new FileSchema(rec_num, rec_types, rec_names); HDFFile *hdf_file = HDFFile::from_schema(*schema, file_name, H5F_ACC_TRUNC); for (int ri = 0; ri < rec_num; ri++) hdf_file->write(rec_names[ri], rec_types[ri], rec_pointers[ri]); hdf_file->close(); // Clean memory delete rec_name_list; delete rec_type_list; delete rec_ptr_list; delete[] rec_names; delete[] rec_types; delete[] rec_pointers; delete schema; delete hdf_file; return 0; } int InclusionOutputInfo::write_legacy(const std::string &output) { const dcomplex cc0 = 0.0 + I * 0.0; int result = 0; FILE *p_outfile = fopen(output.c_str(), "w"); if (p_outfile != NULL) { if (vec_jxi[0] == 1) { fprintf(p_outfile, " READ(IR,*)NSPH,LI,LE,MXNDM,INPOL,NPNT,NPNTTS,IAVM,ISAM\n"); #ifdef USE_ILP64 fprintf( p_outfile, " %5d%5d%5d%5ld%5d%5d%5d%5d%5d\n", nsph, li, le, mxndm, inpol, npnt, npntts, iavm, iavm ); #else fprintf( p_outfile, " %5d%5d%5d%5d%5d%5d%5d%5d%5d\n", nsph, li, le, mxndm, inpol, npnt, npntts, iavm, iavm ); #endif // USE_ILP64 fprintf(p_outfile, " READ(IR,*)RXX(I),RYY(I),RZZ(I)\n"); for (int ri = 0; ri < nsph; ri++) { fprintf( p_outfile, "%17.8lE%17.8lE%17.8lE\n", vec_x_coords[ri], vec_y_coords[ri], vec_z_coords[ri] ); } fprintf(p_outfile, " READ(IR,*)TH,THSTP,THLST,THS,THSSTP,THSLST\n"); fprintf( p_outfile, " %10.3lE%10.3lE%10.3lE%10.3lE%10.3lE%10.3lE\n", th, thstp, thlst, ths, thsstp, thslst ); fprintf(p_outfile, " READ(IR,*)PH,PHSTP,PHLST,PHS,PHSSTP,PHSLST\n"); fprintf( p_outfile, " %10.3lE%10.3lE%10.3lE%10.3lE%10.3lE%10.3lE\n", ph, phstp, phlst, phs, phsstp, phslst ); fprintf(p_outfile, " READ(IR,*)JWTM\n"); fprintf(p_outfile, " %5d\n", jwtm); fprintf(p_outfile, " READ(ITIN)NSPHT\n"); fprintf(p_outfile, " READ(ITIN)(IOG(I),I=1,NSPH)\n"); fprintf(p_outfile, " READ(ITIN)EXDC,WP,XIP,IDFC,NXI\n"); fprintf(p_outfile, " READ(ITIN)(XIV(I),I=1,NXI)\n"); fprintf(p_outfile, " READ(ITIN)NSHL(I),ROS(I)\n"); fprintf(p_outfile, " READ(ITIN)(RCF(I,NS),NS=1,NSH)\n \n"); fprintf(p_outfile, " REFR. INDEX OF EXTERNAL MEDIUM=%15.7lE\n", exri); if (idfc < 0) { fprintf( p_outfile, " VK=%15.7lE, XI IS SCALE FACTOR FOR LENGTHS\n \n", vec_vk[0]); } // End preamble writing } // Wavelength loop for (int jxi = 0; jxi < xi_block_size; jxi++) { int done_dirs = 0; double alamb = 2.0 * 3.141592653589793238 / vec_vk[jxi]; fprintf(p_outfile, "========== JXI =%3d ====================\n", vec_jxi[jxi]); if (idfc >= 0) { fprintf(p_outfile, " VK=%15.7lE, XI=%15.7lE\n", vec_vk[jxi], vec_xi[jxi]); } else { fprintf(p_outfile, " XI=%15.7lE\n", vec_xi[jxi]); } if (vec_ier[jxi] == 1) { fprintf(p_outfile, " STOP IN INDME\n"); break; } else if (vec_ier[jxi] == 2) { fprintf(p_outfile, " STOP IN OSPV\n"); break; } for (int i168 = 1; i168 <= configurations; i168++) { int cindex = jxi * (configurations + 1) + i168 - 1; if (vec_sphere_ref_indices[cindex] == cc0) { fprintf(p_outfile, " SPHERE N.%2d: SIZE=%15.7lE\n", i168, vec_sphere_sizes[cindex]); } else { fprintf( p_outfile, " SPHERE N.%2d: SIZE=%15.7lE, REFRACTIVE INDEX=%15.7lE%15.7lE\n", i168, vec_sphere_sizes[cindex], real(vec_sphere_ref_indices[cindex]), imag(vec_sphere_ref_indices[cindex]) ); } } // i168 configuration loop int cindex = jxi * (configurations + 1) + configurations; fprintf( p_outfile, " EXT. SPHERE: SIZE=%15.7lE, REFRACTIVE INDEX=%15.7lE%15.7lE\n", vec_sphere_sizes[cindex], real(vec_sphere_ref_indices[cindex]), imag(vec_sphere_ref_indices[cindex]) ); fprintf(p_outfile, " ENSEMBLE AVERAGE, MODE%2d\n", iavm); if (inpol == 0) fprintf(p_outfile, " LIN -1\n"); else fprintf(p_outfile, " CIRC -1\n"); fprintf(p_outfile, " ----- SCS ----- ABS ----- EXS ----- ALBEDS --\n"); fprintf( p_outfile, " %14.7lE%15.7lE%15.7lE%15.7lE\n", vec_scs1[jxi], vec_abs1[jxi], vec_exs1[jxi], vec_albeds1[jxi] ); fprintf(p_outfile, "INSERTION: SCASECM %5d%15.7E%15.7E%15.7E%15.7E\n", -1, alamb, vec_scs1[jxi], vec_abs1[jxi], vec_exs1[jxi] ); fprintf(p_outfile, " ---- SCS/GS -- ABC/GS -- EXS/GS ---\n"); fprintf( p_outfile, " %14.7lE%15.7lE%15.7lE\n", vec_scsrt1[jxi], vec_absrt1[jxi], vec_exsrt1[jxi] ); fprintf( p_outfile, " FSAS(1,1)=%15.7lE%15.7lE FSAS(2,1)=%15.7lE%15.7lE\n", real(vec_fsas11[jxi]), imag(vec_fsas11[jxi]), real(vec_fsas21[jxi]), imag(vec_fsas21[jxi]) ); fprintf( p_outfile, " QSCHU=%15.7lE, PSCHU=%15.7lE, S0MAG=%15.7lE\n", vec_qschu1[jxi], vec_pschu1[jxi], vec_s0mag1[jxi] ); fprintf( p_outfile, " COSAV=%15.7lE, RAPRS=%15.7lE\n", vec_cosav1[jxi], vec_raprs1[jxi] ); fprintf(p_outfile, " Fk=%15.7lE\n", vec_fk1[jxi]); if (inpol == 0) fprintf(p_outfile, " LIN 1\n"); else fprintf(p_outfile, " CIRC 1\n"); fprintf(p_outfile, " ----- SCS ----- ABS ----- EXS ----- ALBEDS --\n"); fprintf( p_outfile, " %14.7lE%15.7lE%15.7lE%15.7lE\n", vec_scs2[jxi], vec_abs2[jxi], vec_exs2[jxi], vec_albeds2[jxi] ); fprintf(p_outfile, "INSERTION: SCASECM %5d%15.7E%15.7E%15.7E%15.7E\n", 1, alamb, vec_scs2[jxi], vec_abs2[jxi], vec_exs2[jxi] ); fprintf(p_outfile, " ---- SCS/GS -- ABC/GS -- EXS/GS ---\n"); fprintf( p_outfile, " %14.7lE%15.7lE%15.7lE\n", vec_scsrt2[jxi], vec_absrt2[jxi], vec_exsrt2[jxi] ); fprintf( p_outfile, " FSAS(2,2)=%15.7lE%15.7lE FSAS(1,2)=%15.7lE%15.7lE\n", real(vec_fsas22[jxi]), imag(vec_fsas22[jxi]), real(vec_fsas12[jxi]), imag(vec_fsas12[jxi]) ); fprintf( p_outfile, " QSCHU=%15.7lE, PSCHU=%15.7lE, S0MAG=%15.7lE\n", vec_qschu2[jxi], vec_pschu2[jxi], vec_s0mag2[jxi] ); fprintf( p_outfile, " COSAV=%15.7lE, RAPRS=%15.7lE\n", vec_cosav2[jxi], vec_raprs2[jxi] ); fprintf(p_outfile, " Fk=%15.7lE\n", vec_fk2[jxi]); fprintf( p_outfile, " (RE(FSAS(1,1))-RE(FSAS(2,2)))/RE(FSAS(1,1))=%15.7lE\n", (real(vec_fsas11[jxi]) - real(vec_fsas22[jxi])) / real(vec_fsas11[jxi]) ); fprintf( p_outfile, " (IM(FSAS(1,1))-IM(FSAS(2,2)))/IM(FSAS(1,1))=%15.7lE\n", (imag(vec_fsas11[jxi]) - imag(vec_fsas22[jxi])) / imag(vec_fsas11[jxi]) ); for (int jth = 0; jth < _num_theta; jth++) { for (int jph = 0; jph < _num_phi; jph++) { for (int jths = 0; jths < _num_thetas; jths++) { for (int jphs = 0; jphs < _num_phis; jphs++) { bool goto290 = isam >= 0 && (jths > 0 || jphs > 0); int dir_index = ndirs * jxi + done_dirs; fprintf( p_outfile, "********** JTH =%3d, JPH =%3d, JTHS =%3d, JPHS =%3d ********************\n", jth + 1, jph + 1, jths + 1, jphs +1 ); fprintf( p_outfile, " TIDG=%10.3lE, PIDG=%10.3lE, TSDG=%10.3lE, PSDG=%10.3lE\n", th + jth * thstp, ph + jph * phstp, ths + jths * thsstp, phs + jphs * phsstp ); fprintf(p_outfile, " SCAND=%10.3lE\n", vec_dir_scand[done_dirs]); fprintf( p_outfile, " CFMP=%15.7lE, SFMP=%15.7lE\n", vec_dir_cfmp[done_dirs], vec_dir_sfmp[done_dirs] ); fprintf( p_outfile, " CFSP=%15.7lE, SFSP=%15.7lE\n", vec_dir_cfsp[done_dirs], vec_dir_sfsp[done_dirs] ); if (isam >= 0) { fprintf( p_outfile, " UNI=(%12.5lE,%12.5lE,%12.5lE)\n", vec_dir_un[done_dirs], vec_dir_un[done_dirs + 1], vec_dir_un[done_dirs + 2] ); fprintf( p_outfile, " UNS=(%12.5lE,%12.5lE,%12.5lE)\n", vec_dir_uns[done_dirs], vec_dir_uns[done_dirs + 1], vec_dir_uns[done_dirs + 2] ); } else { // label 214 fprintf( p_outfile, " UN=(%12.5lE,%12.5lE,%12.5lE)\n\n", vec_dir_un[done_dirs], vec_dir_un[done_dirs + 1], vec_dir_un[done_dirs + 2] ); } fprintf(p_outfile, " SINGLE SCATTERER\n"); if (inpol == 0) { fprintf(p_outfile, " LIN -1\n"); } else { fprintf(p_outfile, " CIRC -1\n"); } // label 275 fprintf(p_outfile, " ----- SCS ----- ABS ----- EXS ----- ALBEDS --\n"); fprintf( p_outfile, " %14.7lE%15.7lE%15.7lE%15.7lE\n", vec_dir_scs1[dir_index], vec_dir_abs1[dir_index], vec_dir_exs1[dir_index], vec_dir_albeds1[dir_index] ); fprintf( p_outfile, "INSERTION: SCASEC %5d%14.7lE%14.7lE%14.7lE%14.7lE\n", -1, alamb, vec_dir_scs1[dir_index], vec_dir_abs1[dir_index], vec_dir_exs1[dir_index] ); fprintf(p_outfile, " ---- SCS/GS -- ABS/GS -- EXS/GS ---\n"); fprintf( p_outfile, " %14.7lE%15.7lE%15.7lE\n", vec_dir_scsrt1[dir_index], vec_dir_absrt1[dir_index], vec_dir_exsrt1[dir_index] ); fprintf( p_outfile, " FSAS(1,1)=%15.7lE%15.7lE FSAS(2,1)=%15.7lE%15.7lE\n", real(vec_dir_fsas11[dir_index]), imag(vec_dir_fsas11[dir_index]), real(vec_dir_fsas21[dir_index]), imag(vec_dir_fsas21[dir_index]) ); fprintf( p_outfile, " SAS(1,1)=%15.7lE%15.7lE SAS(2,1)=%15.7lE%15.7lE\n", real(vec_dir_sas11[dir_index]), imag(vec_dir_sas11[dir_index]), real(vec_dir_sas21[dir_index]), imag(vec_dir_sas21[dir_index]) ); fprintf( p_outfile, " QSCHU=%15.7lE, PSCHU=%15.7lE, S0MAG=%15.7lE\n", vec_dir_qschu1[dir_index], vec_dir_pschu1[dir_index], vec_dir_s0mag1[dir_index] ); if (!goto290) { fprintf( p_outfile, " COSAV=%15.7lE, RAPRS=%15.7lE\n", vec_dir_cosav1[dir_index], vec_dir_rapr1[dir_index] ); fprintf( p_outfile, " Fl=%15.7lE, Fr=%15.7lE, Fk=%15.7lE\n", vec_dir_fl1[dir_index], vec_dir_fr1[dir_index], vec_dir_fk1[dir_index] ); fprintf( p_outfile, " Fx=%15.7lE, Fy=%15.7lE, Fz=%15.7lE\n", vec_dir_fx1[dir_index], vec_dir_fy1[dir_index], vec_dir_fz1[dir_index] ); fprintf( p_outfile, " TQEl=%15.7lE, TQEr=%15.7lE, TQEk=%15.7lE\n", vec_dir_tqel1[dir_index], vec_dir_tqer1[dir_index], vec_dir_tqek1[dir_index] ); fprintf( p_outfile, " TQSl=%15.7lE, TQSr=%15.7lE, TQSk=%15.7lE\n", vec_dir_tqsl1[dir_index], vec_dir_tqsr1[dir_index], vec_dir_tqsk1[dir_index] ); fprintf( p_outfile, " TQEx=%15.7lE, TQEy=%15.7lE, TQEz=%15.7lE\n", vec_dir_tqex1[dir_index], vec_dir_tqey1[dir_index], vec_dir_tqez1[dir_index] ); fprintf( p_outfile, " TQSx=%15.7lE, TQSy=%15.7lE, TQSz=%15.7lE\n", vec_dir_tqsx1[dir_index], vec_dir_tqsy1[dir_index], vec_dir_tqsz1[dir_index] ); } // goto290 switch if (inpol == 0) { fprintf(p_outfile, " LIN 1\n"); } else { fprintf(p_outfile, " CIRC 1\n"); } // label 275 fprintf(p_outfile, " ----- SCS ----- ABS ----- EXS ----- ALBEDS --\n"); fprintf( p_outfile, " %14.7lE%15.7lE%15.7lE%15.7lE\n", vec_dir_scs2[dir_index], vec_dir_abs2[dir_index], vec_dir_exs2[dir_index], vec_dir_albeds2[dir_index] ); fprintf( p_outfile, "INSERTION: SCASEC %5d%14.7lE%14.7lE%14.7lE%14.7lE\n", 1, alamb, vec_dir_scs2[dir_index], vec_dir_abs2[dir_index], vec_dir_exs2[dir_index] ); fprintf(p_outfile, " ---- SCS/GS -- ABS/GS -- EXS/GS ---\n"); fprintf( p_outfile, " %14.7lE%15.7lE%15.7lE\n", vec_dir_scsrt2[dir_index], vec_dir_absrt2[dir_index], vec_dir_exsrt2[dir_index] ); fprintf( p_outfile, " FSAS(2,2)=%15.7lE%15.7lE FSAS(1,2)=%15.7lE%15.7lE\n", real(vec_dir_fsas22[dir_index]), imag(vec_dir_fsas22[dir_index]), real(vec_dir_fsas12[dir_index]), imag(vec_dir_fsas12[dir_index]) ); fprintf( p_outfile, " SAS(2,2)=%15.7lE%15.7lE SAS(1,2)=%15.7lE%15.7lE\n", real(vec_dir_sas22[dir_index]), imag(vec_dir_sas22[dir_index]), real(vec_dir_sas12[dir_index]), imag(vec_dir_sas12[dir_index]) ); fprintf( p_outfile, " QSCHU=%15.7lE, PSCHU=%15.7lE, S0MAG=%15.7lE\n", vec_dir_qschu2[dir_index], vec_dir_pschu2[dir_index], vec_dir_s0mag2[dir_index] ); if (!goto290) { fprintf( p_outfile, " COSAV=%15.7lE, RAPRS=%15.7lE\n", vec_dir_cosav2[dir_index], vec_dir_rapr2[dir_index] ); fprintf( p_outfile, " Fl=%15.7lE, Fr=%15.7lE, Fk=%15.7lE\n", vec_dir_fl2[dir_index], vec_dir_fr2[dir_index], vec_dir_fk2[dir_index] ); fprintf( p_outfile, " Fx=%15.7lE, Fy=%15.7lE, Fz=%15.7lE\n", vec_dir_fx2[dir_index], vec_dir_fy2[dir_index], vec_dir_fz2[dir_index] ); fprintf( p_outfile, " TQEl=%15.7lE, TQEr=%15.7lE, TQEk=%15.7lE\n", vec_dir_tqel2[dir_index], vec_dir_tqer2[dir_index], vec_dir_tqek2[dir_index] ); fprintf( p_outfile, " TQSl=%15.7lE, TQSr=%15.7lE, TQSk=%15.7lE\n", vec_dir_tqsl2[dir_index], vec_dir_tqsr2[dir_index], vec_dir_tqsk2[dir_index] ); fprintf( p_outfile, " TQEx=%15.7lE, TQEy=%15.7lE, TQEz=%15.7lE\n", vec_dir_tqex2[dir_index], vec_dir_tqey2[dir_index], vec_dir_tqez2[dir_index] ); fprintf( p_outfile, " TQSx=%15.7lE, TQSy=%15.7lE, TQSz=%15.7lE\n", vec_dir_tqsx2[dir_index], vec_dir_tqsy2[dir_index], vec_dir_tqsz2[dir_index] ); } // goto290 switch fprintf( p_outfile, " (RE(FSAS(1,1))-RE(FSAS(2,2)))/RE(FSAS(1,1))=%15.7lE\n", (real(vec_dir_fsas11[dir_index]) - real(vec_dir_fsas22[dir_index])) / real(vec_dir_fsas11[dir_index]) ); fprintf( p_outfile, " (IM(FSAS(1,1))-IM(FSAS(2,2)))/IM(FSAS(1,1))=%15.7lE\n", (imag(vec_dir_fsas11[dir_index]) - imag(vec_dir_fsas22[dir_index])) / imag(vec_dir_fsas11[dir_index]) ); fprintf(p_outfile, " MULL\n"); for (int i = 0; i < 4; i++) { int mull_index = 16 * dir_index + 4 * i; fprintf( p_outfile, " %15.7lE%15.7lE%15.7lE%15.7lE\n", vec_dir_mull[mull_index], vec_dir_mull[mull_index + 1], vec_dir_mull[mull_index + 2], vec_dir_mull[mull_index + 3] ); } // i MULL loop fprintf(p_outfile, " MULLLR\n"); for (int i = 0; i < 4; i++) { int mull_index = 16 * dir_index + 4 * i; fprintf( p_outfile, " %15.7lE%15.7lE%15.7lE%15.7lE\n", vec_dir_mulllr[mull_index], vec_dir_mulllr[mull_index + 1], vec_dir_mulllr[mull_index + 2], vec_dir_mulllr[mull_index + 3] ); } // i MULLR loop if (iavm != 0) { fprintf(p_outfile, " ENSEMBLE AVERAGE, MODE%2d\n", iavm); if (inpol == 0) fprintf(p_outfile, " LIN\n"); else fprintf(p_outfile, " CIRC\n"); // label 318 fprintf(p_outfile, " MULL\n"); for (int i = 0; i < 4; i++) { int mul_dir_index = 16 * dir_index + 4 * i; fprintf( p_outfile, " %15.7lE%15.7lE%15.7lE%15.7lE\n", vec_dir_mull[mul_dir_index], vec_dir_mull[mul_dir_index + 1], vec_dir_mull[mul_dir_index + 2], vec_dir_mull[mul_dir_index + 3] ); } // i MULL loop fprintf(p_outfile, " MULLLR\n"); for (int i = 0; i < 4; i++) { int mul_dir_index = 16 * dir_index + 4 * i; fprintf( p_outfile, " %15.7lE%15.7lE%15.7lE%15.7lE\n", vec_dir_mulllr[mul_dir_index], vec_dir_mulllr[mul_dir_index + 1], vec_dir_mulllr[mul_dir_index + 2], vec_dir_mulllr[mul_dir_index + 3] ); } // i MULLR loop } // iavm != 0 block done_dirs++; } // jphs loop } // jths loop } // jph loop } // jth loop } // jxi wavelength loop fclose(p_outfile); } else { result = -1; } return result; } #ifdef MPI_VERSION int InclusionOutputInfo::mpireceive(const mixMPI* mpidata, int pid) { int result = 0; int chk_nsph, chk_inpol, chk_iavm, chk_isam, chk_num_theta, chk_num_thetas; int chk_num_phi, chk_num_phis, chk_ndirs, chk_idfc, chk_configs; double chk_exri; MPI_Recv(&chk_nsph, 1, MPI_INT32_T, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(&chk_inpol, 1, MPI_INT32_T, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(&chk_iavm, 1, MPI_INT32_T, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(&chk_isam, 1, MPI_INT32_T, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(&chk_num_theta, 1, MPI_INT32_T, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(&chk_num_thetas, 1, MPI_INT32_T, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(&chk_num_phi, 1, MPI_INT32_T, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(&chk_num_phis, 1, MPI_INT32_T, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(&chk_ndirs, 1, MPI_INT32_T, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(&chk_exri, 1, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(&chk_idfc, 1, MPI_INT32_T, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(&chk_configs, 1, MPI_INT32_T, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); result += (chk_nsph == nsph) ? 0 : 1; result += (chk_inpol == inpol) ? 0 : 1; result += (chk_iavm == iavm) ? 0 : 1; result += (chk_isam == isam) ? 0 : 1; result += (chk_num_theta == _num_theta) ? 0 : 1; result += (chk_num_thetas == _num_thetas) ? 0 : 1; result += (chk_num_phi == _num_phi) ? 0 : 1; result += (chk_num_phis == _num_phis) ? 0 : 1; result += (chk_ndirs == ndirs) ? 0 : 1; result += (chk_exri == exri) ? 0 : 1; result += (chk_idfc == idfc) ? 0 : 1; result += (chk_configs == configurations) ? 0 : 1; if (result == 0) { int xi1, offset, chunk_size; MPI_Send(&result, 1, MPI_INT32_T, pid, 10, MPI_COMM_WORLD); MPI_Recv(&xi1, 1, MPI_INT32_T, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); // Receive vectors of single values per scale MPI_Recv(&chunk_size, 1, MPI_INT32_T, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); offset = xi1 - _first_xi; MPI_Recv(vec_jxi + offset, chunk_size, MPI_INT32_T, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_ier + offset, chunk_size, MPI_SHORT, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_vk + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_xi + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_scs1 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_scs2 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_abs1 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_abs2 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_exs1 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_exs2 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_albeds1 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_albeds2 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_scsrt1 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_scsrt2 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_absrt1 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_absrt2 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_exsrt1 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_exsrt2 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_qschu1 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_qschu2 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_pschu1 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_pschu2 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_s0mag1 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_s0mag2 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_cosav1 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_cosav2 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_raprs1 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_raprs2 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_fk1 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_fk2 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_fsas11 + offset, chunk_size, MPI_C_DOUBLE_COMPLEX, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_fsas21 + offset, chunk_size, MPI_C_DOUBLE_COMPLEX, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_fsas22 + offset, chunk_size, MPI_C_DOUBLE_COMPLEX, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_fsas12 + offset, chunk_size, MPI_C_DOUBLE_COMPLEX, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); // Receive vectors whose sizes depend on configurations MPI_Recv(&chunk_size, 1, MPI_INT32_T, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); offset = (xi1 - _first_xi) * (configurations + 1); MPI_Recv(vec_sphere_sizes + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_sphere_ref_indices + offset, chunk_size, MPI_C_DOUBLE_COMPLEX, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); // Receive vectors whose sizes depend on directions and wavelengths MPI_Recv(&chunk_size, 1, MPI_INT32_T, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); offset = (xi1 - _first_xi) * ndirs; MPI_Recv(vec_dir_scs1 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_scs2 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_abs1 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_abs2 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_exs1 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_exs2 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_albeds1 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_albeds2 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_scsrt1 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_scsrt2 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_absrt1 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_absrt2 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_exsrt1 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_exsrt2 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_fsas11 + offset, chunk_size, MPI_C_DOUBLE_COMPLEX, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_fsas21 + offset, chunk_size, MPI_C_DOUBLE_COMPLEX, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_fsas12 + offset, chunk_size, MPI_C_DOUBLE_COMPLEX, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_fsas22 + offset, chunk_size, MPI_C_DOUBLE_COMPLEX, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_sas11 + offset, chunk_size, MPI_C_DOUBLE_COMPLEX, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_sas21 + offset, chunk_size, MPI_C_DOUBLE_COMPLEX, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_sas12 + offset, chunk_size, MPI_C_DOUBLE_COMPLEX, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_sas22 + offset, chunk_size, MPI_C_DOUBLE_COMPLEX, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_qschu1 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_qschu2 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_pschu1 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_pschu2 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_s0mag1 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_s0mag2 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_cosav1 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_cosav2 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_rapr1 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_rapr2 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_fl1 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_fl2 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_fr1 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_fr2 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_fk1 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_fk2 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_fx1 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_fx2 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_fy1 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_fy2 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_fz1 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_fz2 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_tqel1 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_tqel2 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_tqer1 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_tqer2 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_tqek1 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_tqek2 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_tqex1 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_tqex2 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_tqey1 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_tqey2 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_tqez1 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_tqez2 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_tqsl1 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_tqsl2 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_tqsr1 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_tqsr2 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_tqsk1 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_tqsk2 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_tqsx1 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_tqsx2 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_tqsy1 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_tqsy2 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_tqsz1 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_tqsz2 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_mull + 16 * offset, 16 * chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_mulllr + 16 * offset, 16 * chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); } else { MPI_Send(&result, 1, MPI_INT32_T, pid, 10, MPI_COMM_WORLD); } return result; } int InclusionOutputInfo::mpisend(const mixMPI *mpidata) { int result = 0; int chunk_size; // Send output metadata for configuration cross-check MPI_Send(&nsph, 1, MPI_INT32_T, 0, 10, MPI_COMM_WORLD); MPI_Send(&inpol, 1, MPI_INT32_T, 0, 10, MPI_COMM_WORLD); MPI_Send(&iavm, 1, MPI_INT32_T, 0, 10, MPI_COMM_WORLD); MPI_Send(&isam, 1, MPI_INT32_T, 0, 10, MPI_COMM_WORLD); MPI_Send(&_num_theta, 1, MPI_INT32_T, 0, 10, MPI_COMM_WORLD); MPI_Send(&_num_thetas, 1, MPI_INT32_T, 0, 10, MPI_COMM_WORLD); MPI_Send(&_num_phi, 1, MPI_INT32_T, 0, 10, MPI_COMM_WORLD); MPI_Send(&_num_phis, 1, MPI_INT32_T, 0, 10, MPI_COMM_WORLD); MPI_Send(&ndirs, 1, MPI_INT32_T, 0, 10, MPI_COMM_WORLD); MPI_Send(&exri, 1, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(&idfc, 1, MPI_INT32_T, 0, 10, MPI_COMM_WORLD); MPI_Send(&configurations, 1, MPI_INT32_T, 0, 10, MPI_COMM_WORLD); // Wait for process 0 to cross-check the configuration MPI_Recv(&result, 1, MPI_INT32_T, 0, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); if (result == 0) { // Process 0 confirmed the consistency of configuration. Send the data. // Send vectors of single values per scale MPI_Send(&_first_xi, 1, MPI_INT32_T, 0, 10, MPI_COMM_WORLD); MPI_Send(&xi_block_size, 1, MPI_INT32_T, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_jxi, xi_block_size, MPI_INT32_T, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_ier, xi_block_size, MPI_SHORT, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_vk, xi_block_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_xi, xi_block_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_scs1, xi_block_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_scs2, xi_block_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_abs1, xi_block_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_abs2, xi_block_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_exs1, xi_block_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_exs2, xi_block_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_albeds1, xi_block_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_albeds2, xi_block_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_scsrt1, xi_block_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_scsrt2, xi_block_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_absrt1, xi_block_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_absrt2, xi_block_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_exsrt1, xi_block_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_exsrt2, xi_block_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_qschu1, xi_block_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_qschu2, xi_block_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_pschu1, xi_block_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_pschu2, xi_block_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_s0mag1, xi_block_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_s0mag2, xi_block_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_cosav1, xi_block_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_cosav2, xi_block_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_raprs1, xi_block_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_raprs2, xi_block_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_fk1, xi_block_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_fk2, xi_block_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_fsas11, xi_block_size, MPI_C_DOUBLE_COMPLEX, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_fsas21, xi_block_size, MPI_C_DOUBLE_COMPLEX, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_fsas22, xi_block_size, MPI_C_DOUBLE_COMPLEX, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_fsas12, xi_block_size, MPI_C_DOUBLE_COMPLEX, 0, 10, MPI_COMM_WORLD); // Send vectors whose sizes depend on configurations chunk_size = xi_block_size * (configurations + 1); MPI_Send(&chunk_size, 1, MPI_INT32_T, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_sphere_sizes, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_sphere_ref_indices, chunk_size, MPI_C_DOUBLE_COMPLEX, 0, 10, MPI_COMM_WORLD); // Send vectors whose sizes depend on directions and wavelengths chunk_size = xi_block_size * ndirs; MPI_Send(&chunk_size, 1, MPI_INT32_T, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_scs1, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_scs2, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_abs1, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_abs2, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_exs1, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_exs2, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_albeds1, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_albeds2, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_scsrt1, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_scsrt2, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_absrt1, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_absrt2, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_exsrt1, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_exsrt2, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_fsas11, chunk_size, MPI_C_DOUBLE_COMPLEX, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_fsas21, chunk_size, MPI_C_DOUBLE_COMPLEX, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_fsas12, chunk_size, MPI_C_DOUBLE_COMPLEX, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_fsas22, chunk_size, MPI_C_DOUBLE_COMPLEX, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_sas11, chunk_size, MPI_C_DOUBLE_COMPLEX, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_sas21, chunk_size, MPI_C_DOUBLE_COMPLEX, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_sas12, chunk_size, MPI_C_DOUBLE_COMPLEX, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_sas22, chunk_size, MPI_C_DOUBLE_COMPLEX, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_qschu1, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_qschu2, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_pschu1, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_pschu2, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_s0mag1, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_s0mag2, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_cosav1, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_cosav2, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_rapr1, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_rapr2, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_fl1, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_fl2, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_fr1, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_fr2, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_fk1, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_fk2, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_fx1, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_fx2, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_fy1, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_fy2, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_fz1, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_fz2, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_tqel1, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_tqel2, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_tqer1, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_tqer2, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_tqek1, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_tqek2, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_tqex1, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_tqex2, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_tqey1, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_tqey2, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_tqez1, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_tqez2, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_tqsl1, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_tqsl2, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_tqsr1, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_tqsr2, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_tqsk1, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_tqsk2, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_tqsx1, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_tqsx2, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_tqsy1, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_tqsy2, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_tqsz1, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_tqsz2, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_mull, 16 * chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_mulllr, 16 * chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); } return result; } #endif // MPI_VERSION // >>> END OF InclusionOutputInfo CLASS IMPLEMENTATION <<< // >>> SphereOutputInfo CLASS IMPLEMENTATION <<< SphereOutputInfo::SphereOutputInfo( ScattererConfiguration *sc, GeometryConfiguration *gc, const mixMPI *mpidata, int first_xi, int xi_length ) { _first_xi = first_xi; nsph = gc->number_of_spheres; lm = gc->l_max; inpol = gc->in_pol; npnt = gc->npnt; npntts = gc->npntts; isam = gc->isam; idfc = sc->idfc; th = gc->in_theta_start; thstp = gc->in_theta_step; thlst = gc->in_theta_end; _num_theta = (thstp == 0.0) ? 1 : 1 + (int)((thlst - th) / thstp); ths = gc->sc_theta_start; thsstp = gc->sc_theta_step; thslst = gc->sc_theta_end; _num_thetas = (thsstp == 0.0) ? 1 : 1 + (int)((thslst - ths) / thsstp); ph = gc->in_phi_start; phstp = gc->in_phi_step; phlst = gc->in_phi_end; _num_phi = (phstp == 0.0) ? 1 : 1 + (int)((phlst - ph) / phstp); phs = gc->sc_phi_start; phsstp = gc->sc_phi_step; phslst = gc->sc_phi_end; _num_phis = (phsstp == 0.0) ? 1 : 1 + (int)((phslst - phs) / phsstp); ndirs = _num_theta * _num_thetas * _num_phi * _num_phis; configurations = sc->configurations; double exdc = sc->exdc; exri = sqrt(exdc); nxi = sc->number_of_scales; xi_block_size = (xi_length == 0) ? nxi : xi_length; jwtm = gc->jwtm; lcalc = 0; arg = 0.0 + I * 0.0; vec_jxi = new int[xi_block_size](); vec_ier = new short[xi_block_size](); vec_vk = new double[xi_block_size](); vec_xi = new double[xi_block_size](); vec_sphere_sizes = new double[configurations * xi_block_size](); vec_sphere_ref_indices = new dcomplex[configurations * xi_block_size](); vec_scs = new double[configurations * xi_block_size](); vec_abs = new double[configurations * xi_block_size](); vec_exs = new double[configurations * xi_block_size](); vec_albeds = new double[configurations * xi_block_size](); vec_scsrt = new double[configurations * xi_block_size](); vec_absrt = new double[configurations * xi_block_size](); vec_exsrt = new double[configurations * xi_block_size](); vec_fsas = new dcomplex[configurations * xi_block_size](); vec_qschu = new double[configurations * xi_block_size](); vec_pschu = new double[configurations * xi_block_size](); vec_s0mag = new double[configurations * xi_block_size](); vec_cosav = new double[configurations * xi_block_size](); vec_raprs = new double[configurations * xi_block_size](); vec_tqek1 = new double[configurations * xi_block_size](); vec_tqek2 = new double[configurations * xi_block_size](); vec_tqsk1 = new double[configurations * xi_block_size](); vec_tqsk2 = new double[configurations * xi_block_size](); if (nsph == 1) { vec_fsat = NULL; vec_qschut = NULL; vec_pschut = NULL; vec_s0magt = NULL; } else { vec_fsat = new dcomplex[xi_block_size](); vec_qschut = new double[xi_block_size](); vec_pschut = new double[xi_block_size](); vec_s0magt = new double[xi_block_size](); } vec_dir_tidg = new double[_num_theta](); vec_dir_pidg = new double[_num_phi](); vec_dir_tsdg = new double[_num_thetas](); vec_dir_psdg = new double[_num_phis](); vec_dir_scand = new double[ndirs](); vec_dir_cfmp = new double[ndirs](); vec_dir_cfsp = new double[ndirs](); vec_dir_sfmp = new double[ndirs](); vec_dir_sfsp = new double[ndirs](); vec_dir_un = new double[3 * ndirs](); vec_dir_uns = new double[3 * ndirs](); vec_dir_sas11 = new dcomplex[nsph * ndirs * xi_block_size](); vec_dir_sas21 = new dcomplex[nsph * ndirs * xi_block_size](); vec_dir_sas12 = new dcomplex[nsph * ndirs * xi_block_size](); vec_dir_sas22 = new dcomplex[nsph * ndirs * xi_block_size](); vec_dir_fx = new double[nsph * _num_theta * _num_phi * xi_block_size](); vec_dir_fy = new double[nsph * _num_theta * _num_phi * xi_block_size](); vec_dir_fz = new double[nsph * _num_theta * _num_phi * xi_block_size](); vec_dir_muls = new double[16 * nsph * ndirs * xi_block_size](); vec_dir_mulslr = new double[16 * nsph * ndirs * xi_block_size](); // Initialize directions (they are scale-independent) double cti = th, cpi = ph, cts = ths, cps = phs; for (int di = 0; di < _num_theta; di++) { vec_dir_tidg[di] = cti; cti += thstp; } for (int di = 0; di < _num_thetas; di++) { vec_dir_tsdg[di] = cts; cts += thsstp; } for (int di = 0; di < _num_phi; di++) { vec_dir_pidg[di] = cpi; cpi += phstp; } for (int di = 0; di < _num_phis; di++) { vec_dir_psdg[di] = cps; cps += phsstp; } } SphereOutputInfo::SphereOutputInfo(const std::string &hdf5_name) { // DA QUI ; TODO: AGGIUSTARE TUTTE LE DIMENSIONI LEGATE A configurations unsigned int flags = H5F_ACC_RDONLY; HDFFile *hdf_file = new HDFFile(hdf5_name, flags); herr_t status = hdf_file->get_status(); string str_name, str_type; if (status == 0) { status = hdf_file->read("NSPH", "INT32_(1)", &nsph); status = hdf_file->read("LM", "INT32_(1)", &lm); status = hdf_file->read("INPOL", "INT32_(1)", &inpol); status = hdf_file->read("NPNT", "INT32_(1)", &npnt); status = hdf_file->read("NPNTTS", "INT32_(1)", &npntts); status = hdf_file->read("ISAM", "INT32_(1)", &isam); status = hdf_file->read("JWTM", "INT32_(1)", &jwtm); status = hdf_file->read("TH_START", "FLOAT64_(1)", &th); status = hdf_file->read("TH_STEP", "FLOAT64_(1)", &thstp); status = hdf_file->read("TH_END", "FLOAT64_(1)", &thlst); _num_theta = (thstp == 0.0) ? 1 : 1 + int((thlst - th) / thstp); status = hdf_file->read("THS_START", "FLOAT64_(1)", &ths); status = hdf_file->read("THS_STEP", "FLOAT64_(1)", &thsstp); status = hdf_file->read("THS_END", "FLOAT64_(1)", &thslst); _num_thetas = (thsstp == 0.0) ? 1 : 1 + int((thslst - ths) / thsstp); status = hdf_file->read("PH_START", "FLOAT64_(1)", &ph); status = hdf_file->read("PH_STEP", "FLOAT64_(1)", &phstp); status = hdf_file->read("PH_END", "FLOAT64_(1)", &phlst); _num_phi = (phstp == 0.0) ? 1 : 1 + int((phlst - ph) / phstp); status = hdf_file->read("PHS_START", "FLOAT64_(1)", &phs); status = hdf_file->read("PHS_STEP", "FLOAT64_(1)", &phsstp); status = hdf_file->read("PHS_END", "FLOAT64_(1)", &phslst); _num_phis = (phsstp == 0.0) ? 1 : 1 + int((phslst - phs) / phsstp); ndirs = _num_theta * _num_thetas * _num_phi * _num_phis; status = hdf_file->read("EXRI", "FLOAT64_(1)", &exri); status = hdf_file->read("NUM_CONF", "FLOAT64_(1)", &configurations); status = hdf_file->read("IDFC", "INT32_(1)", &idfc); status = hdf_file->read("XI1", "INT32_(1)", &_first_xi); status = hdf_file->read("NXI", "INT32_(1)", &xi_block_size); nxi = (_first_xi == 1) ? xi_block_size : xi_block_size + _first_xi; lcalc = 0; arg = 0.0 + I * 0.0; str_type = "INT32_(" + to_string(xi_block_size) + ")"; vec_jxi = new int[xi_block_size]; status = hdf_file->read("VEC_JXI", str_type, vec_jxi); str_type = "INT16_(" + to_string(xi_block_size) + ")"; vec_ier = new short[xi_block_size]; status = hdf_file->read("VEC_IER", str_type, vec_ier); str_type = "FLOAT64_(" + to_string(xi_block_size) + ")"; vec_vk = new double[xi_block_size]; status = hdf_file->read("VEC_VK", str_type, vec_vk); vec_xi = new double[xi_block_size]; status = hdf_file->read("VEC_VK", str_type, vec_xi); str_type = "FLOAT64_(" + to_string(configurations * xi_block_size) + ")"; vec_sphere_sizes = new double[xi_block_size]; status = hdf_file->read("VEC_SPH_SIZES", str_type, vec_sphere_sizes); str_type = "FLOAT64_(" + to_string(2 * configurations * xi_block_size) + ")"; vec_sphere_ref_indices = new dcomplex[xi_block_size]; status = hdf_file->read("VEC_SPH_REFRI", str_type, vec_sphere_ref_indices); str_type = "FLOAT64_(" + to_string(configurations * xi_block_size) + ")"; vec_scs = new double[xi_block_size]; status = hdf_file->read("VEC_SCS", str_type, vec_scs); vec_abs = new double[xi_block_size]; status = hdf_file->read("VEC_ABS", str_type, vec_abs); vec_exs = new double[xi_block_size]; status = hdf_file->read("VEC_EXS", str_type, vec_exs); vec_albeds = new double[xi_block_size]; status = hdf_file->read("VEC_ALBEDS", str_type, vec_albeds); vec_scsrt = new double[xi_block_size]; status = hdf_file->read("VEC_SCSRT", str_type, vec_scsrt); vec_absrt = new double[xi_block_size]; status = hdf_file->read("VEC_ABSRT", str_type, vec_absrt); vec_exsrt = new double[xi_block_size]; status = hdf_file->read("VEC_EXSRT", str_type, vec_exsrt); str_type = "FLOAT64_(" + to_string(2 * configurations * xi_block_size) + ")"; vec_fsas = new dcomplex[xi_block_size]; status = hdf_file->read("VEC_FSAS", str_type, vec_fsas); str_type = "FLOAT64_(" + to_string(configurations * xi_block_size) + ")"; vec_qschu = new double[xi_block_size]; status = hdf_file->read("VEC_QSCHU", str_type, vec_qschu); vec_pschu = new double[xi_block_size]; status = hdf_file->read("VEC_PSCHU", str_type, vec_pschu); vec_s0mag = new double[xi_block_size]; status = hdf_file->read("VEC_S0MAG", str_type, vec_s0mag); vec_cosav = new double[xi_block_size]; status = hdf_file->read("VEC_COSAV", str_type, vec_cosav); vec_raprs = new double[xi_block_size]; status = hdf_file->read("VEC_RAPRS", str_type, vec_raprs); vec_tqek1 = new double[xi_block_size]; status = hdf_file->read("VEC_TQEK1", str_type, vec_tqek1); vec_tqek2 = new double[xi_block_size]; status = hdf_file->read("VEC_TQEK2", str_type, vec_tqek2); vec_tqsk1 = new double[xi_block_size]; status = hdf_file->read("VEC_TQSK1", str_type, vec_tqsk1); vec_tqsk2 = new double[xi_block_size]; status = hdf_file->read("VEC_TQSK2", str_type, vec_tqsk2); if (nsph != 1) { str_type = "FLOAT64_(" + to_string(2 * xi_block_size) + ")"; vec_fsat = new dcomplex[xi_block_size]; status = hdf_file->read("VEC_FSAT", str_type, vec_fsat); str_type = "FLOAT64_(" + to_string(xi_block_size) + ")"; vec_qschut = new double[xi_block_size]; status = hdf_file->read("VEC_QSCHUT", str_type, vec_qschut); vec_pschut = new double[xi_block_size]; status = hdf_file->read("VEC_PSCHUT", str_type, vec_pschut); vec_s0magt = new double[xi_block_size]; status = hdf_file->read("VEC_S0MAGT", str_type, vec_s0magt); } else { vec_fsat = NULL; vec_qschut = NULL; vec_pschut = NULL; vec_s0magt = NULL; } // Initialize directions (they are scale-independent) _num_theta = (thstp == 0.0) ? 1 : 1 + (int)((thlst - th) / thstp); _num_thetas = (thsstp == 0.0) ? 1 : 1 + (int)((thslst - ths) / thsstp); _num_phi = (phstp == 0.0) ? 1 : 1 + (int)((phlst - ph) / phstp); _num_phis = (phsstp == 0.0) ? 1 : 1 + (int)((phslst - phs) / phsstp); vec_dir_tidg = new double[_num_theta]; vec_dir_tsdg = new double[_num_thetas]; vec_dir_pidg = new double[_num_phi]; vec_dir_psdg = new double[_num_phis]; double cti = th, cpi = ph, cts = ths, cps = phs; for (int di = 0; di < _num_theta; di++) { vec_dir_tidg[di] = cti; cti += thstp; } for (int di = 0; di < _num_thetas; di++) { vec_dir_tsdg[di] = cts; cts += thsstp; } for (int di = 0; di < _num_phi; di++) { vec_dir_pidg[di] = cpi; cpi += phstp; } for (int di = 0; di < _num_phis; di++) { vec_dir_psdg[di] = cps; cps += phsstp; } str_type = "FLOAT64_(" + to_string(ndirs) + ")"; vec_dir_scand = new double[ndirs]; status = hdf_file->read("VEC_DIR_SCAND", str_type, vec_dir_scand); vec_dir_cfmp = new double[ndirs]; status = hdf_file->read("VEC_DIR_CFMP", str_type, vec_dir_cfmp); vec_dir_sfmp = new double[ndirs]; status = hdf_file->read("VEC_DIR_SFMP", str_type, vec_dir_sfmp); vec_dir_cfsp = new double[ndirs]; status = hdf_file->read("VEC_DIR_CFSP", str_type, vec_dir_cfsp); vec_dir_sfsp = new double[ndirs]; status = hdf_file->read("VEC_DIR_SFSP", str_type, vec_dir_sfsp); str_type = "FLOAT64_(" + to_string(3 * ndirs) + ")"; vec_dir_un = new double[3 * ndirs]; status = hdf_file->read("VEC_DIR_UN", str_type, vec_dir_un); vec_dir_uns = new double[3 * ndirs]; status = hdf_file->read("VEC_DIR_UNS", str_type, vec_dir_uns); str_type = "FLOAT64_(" + to_string(2 * nsph * ndirs * xi_block_size) + ")"; vec_dir_sas11 = new dcomplex[nsph * ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_SAS11", str_type, vec_dir_sas11); vec_dir_sas21 = new dcomplex[nsph * ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_SAS21", str_type, vec_dir_sas21); vec_dir_sas12 = new dcomplex[nsph * ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_SAS12", str_type, vec_dir_sas12); vec_dir_sas22 = new dcomplex[nsph * ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_SAS22", str_type, vec_dir_sas22); str_type = "FLOAT64_(" + to_string(nsph * _num_theta * _num_phi * xi_block_size) + ")"; vec_dir_fx = new double[nsph * _num_theta * _num_phi * xi_block_size]; status = hdf_file->read("VEC_DIR_FX", str_type, vec_dir_fx); vec_dir_fy = new double[nsph * _num_theta * _num_phi * xi_block_size]; status = hdf_file->read("VEC_DIR_FY", str_type, vec_dir_fy); vec_dir_fz = new double[nsph * _num_theta * _num_phi * xi_block_size]; status = hdf_file->read("VEC_DIR_FZ", str_type, vec_dir_fz); str_type = "FLOAT64_(" + to_string(16 * nsph * ndirs * xi_block_size) + ")"; vec_dir_muls = new double[16 * nsph * ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_MULS", str_type, vec_dir_muls); vec_dir_mulslr = new double[16 * nsph * ndirs * xi_block_size]; status = hdf_file->read("VEC_DIR_MULSLR", str_type, vec_dir_mulslr); status = hdf_file->close(); delete hdf_file; } else { if (hdf_file != NULL) delete hdf_file; UnrecognizedFormatException ex("Error: " + hdf5_name + " not recognized as a valid HDF5 file!"); throw ex; } } SphereOutputInfo::~SphereOutputInfo() { delete[] vec_jxi; delete[] vec_ier; delete[] vec_vk; delete[] vec_xi; delete[] vec_sphere_sizes; delete[] vec_sphere_ref_indices; delete[] vec_scs; delete[] vec_abs; delete[] vec_exs; delete[] vec_albeds; delete[] vec_scsrt; delete[] vec_absrt; delete[] vec_exsrt; delete[] vec_fsas; delete[] vec_qschu; delete[] vec_pschu; delete[] vec_s0mag; delete[] vec_cosav; delete[] vec_raprs; delete[] vec_tqek1; delete[] vec_tqek2; delete[] vec_tqsk1; delete[] vec_tqsk2; if (nsph != 1) { delete[] vec_fsat; delete[] vec_qschut; delete[] vec_pschut; delete[] vec_s0magt; } delete[] vec_dir_tidg; delete[] vec_dir_pidg; delete[] vec_dir_tsdg; delete[] vec_dir_psdg; delete[] vec_dir_scand; delete[] vec_dir_cfmp; delete[] vec_dir_cfsp; delete[] vec_dir_sfmp; delete[] vec_dir_sfsp; delete[] vec_dir_un; delete[] vec_dir_uns; delete[] vec_dir_sas11; delete[] vec_dir_sas21; delete[] vec_dir_sas12; delete[] vec_dir_sas22; delete[] vec_dir_fx; delete[] vec_dir_fy; delete[] vec_dir_fz; delete[] vec_dir_muls; delete[] vec_dir_mulslr; } long SphereOutputInfo::compute_size( ScattererConfiguration *sc, GeometryConfiguration *gc, int first_xi, int xi_length ) { // Size of the configuration set long result = 18 * sizeof(int); result += 12 * sizeof(double); result += 47 * sizeof(long); result += sizeof(dcomplex); // Get configuration parameters int _nsph = gc->number_of_spheres; double _th = gc->in_theta_start; double _thstp = gc->in_theta_step; double _thlst = gc->in_theta_end; int num_theta = (_thstp == 0.0) ? 1 : 1 + (int)((_thlst - _th) / _thstp); double _ths = gc->sc_theta_start; double _thsstp = gc->sc_theta_step; double _thslst = gc->sc_theta_end; int num_thetas = (_thsstp == 0.0) ? 1 : 1 + (int)((_thslst - _ths) / _thsstp); double _ph = gc->in_phi_start; double _phstp = gc->in_phi_step; double _phlst = gc->in_phi_end; int num_phi = (_phstp == 0.0) ? 1 : 1 + (int)((_phlst - _ph) / _phstp); double _phs = gc->sc_phi_start; double _phsstp = gc->sc_phi_step; double _phslst = gc->sc_phi_end; int num_phis = (_phsstp == 0.0) ? 1 : 1 + (int)((_phslst - _phs) / _phsstp); int _ndirs = num_theta * num_thetas * num_phi * num_phis; int _nxi = sc->number_of_scales; int _xi_block_size = (xi_length == 0) ? _nxi : xi_length; int _nconf = sc->configurations; // Size of the data set result += _xi_block_size * (sizeof(short) + sizeof(int)); result += 2 * _xi_block_size * sizeof(double); result += 16 * _nconf * _xi_block_size * sizeof(double); result += 2 * _nconf * _xi_block_size * sizeof(dcomplex); result += (num_theta + num_thetas + num_phi + num_phis) * sizeof(double); result += 11 * _ndirs * sizeof(double); result += 4 * _nsph * _ndirs * _xi_block_size * sizeof(dcomplex); result += 3 * _nsph * num_theta * num_phi * sizeof(double); result += 32 * _nsph * _ndirs * _xi_block_size * sizeof(double); if (_nsph != 1) { result += _xi_block_size * sizeof(dcomplex); result += 3 * _xi_block_size * sizeof(double); } return result; } long SphereOutputInfo::compute_size() { // Size of the configuration set long result = 18 * sizeof(int); result += 12 * sizeof(double); result += 47 * sizeof(long); result += sizeof(dcomplex); // Size of the data set result += xi_block_size * (sizeof(short) + sizeof(int)); result += 2 * xi_block_size * sizeof(double); result += 16 * configurations * xi_block_size * sizeof(double); result += 2 * configurations * xi_block_size * sizeof(dcomplex); result += (_num_theta + _num_thetas + _num_phi + _num_phis) * sizeof(double); result += 11 * ndirs * sizeof(double); result += 4 * nsph * ndirs * xi_block_size * sizeof(dcomplex); result += 3 * nsph * _num_theta * _num_phi * sizeof(double); result += 32 * nsph * ndirs * xi_block_size * sizeof(double); if (nsph != 1) { result += xi_block_size * sizeof(dcomplex); result += 3 * xi_block_size * sizeof(double); } return result; } int SphereOutputInfo::insert(const SphereOutputInfo &rhs) { int result = 0; result += (rhs.nsph == nsph) ? 0 : 1; result += (rhs.inpol == inpol) ? 0 : 1; result += (rhs.isam == isam) ? 0 : 1; result += (rhs._num_theta == _num_theta) ? 0 : 1; result += (rhs._num_thetas == _num_thetas) ? 0 : 1; result += (rhs._num_phi == _num_phi) ? 0 : 1; result += (rhs._num_phis == _num_phis) ? 0 : 1; result += (rhs.ndirs == ndirs) ? 0 : 1; result += (rhs.exri == exri) ? 0 : 1; result += (rhs.idfc == idfc) ? 0 : 1; result += (rhs.configurations == configurations) ? 0 : 1; if (result == 0) { int offset, chunk_size, xi1; xi1 = rhs._first_xi; // Insert vectors whose sizes depend on wavelengths offset = xi1 - _first_xi; chunk_size = rhs.xi_block_size; memcpy(vec_jxi + offset, rhs.vec_jxi, chunk_size * sizeof(int)); memcpy(vec_ier + offset, rhs.vec_ier, chunk_size * sizeof(short)); memcpy(vec_vk + offset, rhs.vec_vk, chunk_size * sizeof(double)); memcpy(vec_xi + offset, rhs.vec_xi, chunk_size * sizeof(double)); if (nsph != 1) { memcpy(vec_fsat + offset, rhs.vec_fsat, chunk_size * sizeof(dcomplex)); memcpy(vec_qschut + offset, rhs.vec_qschut, chunk_size * sizeof(double)); memcpy(vec_pschut + offset, rhs.vec_pschut, chunk_size * sizeof(double)); memcpy(vec_s0magt + offset, rhs.vec_s0magt, chunk_size * sizeof(double)); } // Insert vectors whose sizes depend on configurations and wavelengths offset = (xi1 - _first_xi) * configurations; chunk_size = rhs.xi_block_size * configurations; memcpy(vec_sphere_sizes + offset, rhs.vec_sphere_sizes, chunk_size * sizeof(double)); memcpy(vec_sphere_ref_indices + offset, rhs.vec_sphere_ref_indices, chunk_size * sizeof(dcomplex)); memcpy(vec_scs + offset, rhs.vec_scs, chunk_size * sizeof(double)); memcpy(vec_abs + offset, rhs.vec_abs, chunk_size * sizeof(double)); memcpy(vec_exs + offset, rhs.vec_exs, chunk_size * sizeof(double)); memcpy(vec_albeds + offset, rhs.vec_albeds, chunk_size * sizeof(double)); memcpy(vec_scsrt + offset, rhs.vec_scsrt, chunk_size * sizeof(double)); memcpy(vec_absrt + offset, rhs.vec_absrt, chunk_size * sizeof(double)); memcpy(vec_exsrt + offset, rhs.vec_exsrt, chunk_size * sizeof(double)); memcpy(vec_fsas + offset, rhs.vec_fsas, chunk_size * sizeof(dcomplex)); memcpy(vec_qschu + offset, rhs.vec_qschu, chunk_size * sizeof(double)); memcpy(vec_pschu + offset, rhs.vec_pschu, chunk_size * sizeof(double)); memcpy(vec_s0mag + offset, rhs.vec_s0mag, chunk_size * sizeof(double)); memcpy(vec_cosav + offset, rhs.vec_cosav, chunk_size * sizeof(double)); memcpy(vec_raprs + offset, rhs.vec_raprs, chunk_size * sizeof(double)); memcpy(vec_tqek1 + offset, rhs.vec_tqek1, chunk_size * sizeof(double)); memcpy(vec_tqek2 + offset, rhs.vec_tqek2, chunk_size * sizeof(double)); memcpy(vec_tqsk1 + offset, rhs.vec_tqsk1, chunk_size * sizeof(double)); memcpy(vec_tqsk2 + offset, rhs.vec_tqsk2, chunk_size * sizeof(double)); // Insert vectors whose sizes depend on NSPH, directions and wavelengths offset = (xi1 - _first_xi) * nsph * ndirs; chunk_size = rhs.xi_block_size * nsph * ndirs; memcpy(vec_dir_sas11 + offset, rhs.vec_dir_sas11, chunk_size * sizeof(dcomplex)); memcpy(vec_dir_sas21 + offset, rhs.vec_dir_sas21, chunk_size * sizeof(dcomplex)); memcpy(vec_dir_sas12 + offset, rhs.vec_dir_sas12, chunk_size * sizeof(dcomplex)); memcpy(vec_dir_sas22 + offset, rhs.vec_dir_sas22, chunk_size * sizeof(dcomplex)); memcpy(vec_dir_muls + 16 * offset, rhs.vec_dir_muls, 16 * chunk_size * sizeof(double)); memcpy(vec_dir_mulslr + 16 * offset, rhs.vec_dir_mulslr, 16 * chunk_size * sizeof(double)); // Insert vectors whose sizes depend on NSPH, incidence directions and wavelengths offset = (xi1 - _first_xi) * nsph * _num_theta * _num_phi; chunk_size = rhs.xi_block_size * nsph * _num_theta * _num_phi; memcpy(vec_dir_fx + offset, rhs.vec_dir_fx, chunk_size * sizeof(double)); memcpy(vec_dir_fy + offset, rhs.vec_dir_fy, chunk_size * sizeof(double)); memcpy(vec_dir_fz + offset, rhs.vec_dir_fz, chunk_size * sizeof(double)); // TODO: fix the vector sizes in HDF5 writer and MPI communicators } return result; } int SphereOutputInfo::write(const std::string &output, const std::string &format) { int result = 0; if (format.compare("LEGACY") == 0) { result = write_legacy(output); } else if (format.compare("HDF5") == 0) { result = write_hdf5(output); } else { string message = "Unknown format mode: \"" + format + "\""; throw UnrecognizedConfigurationException(message); } return result; } int SphereOutputInfo::write_hdf5(const std::string &file_name) { List *rec_name_list = new List(1); List *rec_type_list = new List(1); List *rec_ptr_list = new List(1); string str_type, str_name; rec_name_list->set(0, "NSPH"); rec_type_list->set(0, "INT32_(1)"); rec_ptr_list->set(0, &nsph); rec_name_list->append("LM"); rec_type_list->append("INT32_(1)"); rec_ptr_list->append(&lm); rec_name_list->append("INPOL"); rec_type_list->append("INT32_(1)"); rec_ptr_list->append(&inpol); rec_name_list->append("NPNT"); rec_type_list->append("INT32_(1)"); rec_ptr_list->append(&npnt); rec_name_list->append("NPNTTS"); rec_type_list->append("INT32_(1)"); rec_ptr_list->append(&npntts); rec_name_list->append("ISAM"); rec_type_list->append("INT32_(1)"); rec_ptr_list->append(&isam); rec_name_list->append("JWTM"); rec_type_list->append("INT32_(1)"); rec_ptr_list->append(&jwtm); rec_name_list->append("TH_START"); rec_type_list->append("FLOAT64_(1)"); rec_ptr_list->append(&th); rec_name_list->append("TH_STEP"); rec_type_list->append("FLOAT64_(1)"); rec_ptr_list->append(&thstp); rec_name_list->append("TH_END"); rec_type_list->append("FLOAT64_(1)"); rec_ptr_list->append(&thlst); rec_name_list->append("THS_START"); rec_type_list->append("FLOAT64_(1)"); rec_ptr_list->append(&ths); rec_name_list->append("THS_STEP"); rec_type_list->append("FLOAT64_(1)"); rec_ptr_list->append(&thsstp); rec_name_list->append("THS_END"); rec_type_list->append("FLOAT64_(1)"); rec_ptr_list->append(&thslst); rec_name_list->append("PH_START"); rec_type_list->append("FLOAT64_(1)"); rec_ptr_list->append(&ph); rec_name_list->append("PH_STEP"); rec_type_list->append("FLOAT64_(1)"); rec_ptr_list->append(&phstp); rec_name_list->append("PH_END"); rec_type_list->append("FLOAT64_(1)"); rec_ptr_list->append(&phlst); rec_name_list->append("PHS_START"); rec_type_list->append("FLOAT64_(1)"); rec_ptr_list->append(&phs); rec_name_list->append("PHS_STEP"); rec_type_list->append("FLOAT64_(1)"); rec_ptr_list->append(&phsstp); rec_name_list->append("PHS_END"); rec_type_list->append("FLOAT64_(1)"); rec_ptr_list->append(&phslst); rec_name_list->append("EXRI"); rec_type_list->append("FLOAT64_(1)"); rec_ptr_list->append(&exri); rec_name_list->append("IDFC"); rec_type_list->append("INT32_(1)"); rec_ptr_list->append(&idfc); rec_name_list->set(0, "NUM_CONF"); rec_type_list->set(0, "INT32_(1)"); rec_ptr_list->set(0, &configurations); rec_name_list->append("XI1"); rec_type_list->append("INT32_(1)"); rec_ptr_list->append(&_first_xi); rec_name_list->append("NXI"); rec_type_list->append("INT32_(1)"); rec_ptr_list->append(&xi_block_size); rec_name_list->append("VEC_JXI"); rec_type_list->append("INT32_(" + to_string(xi_block_size) + ")"); rec_ptr_list->append(vec_jxi); rec_name_list->append("VEC_IER"); rec_type_list->append("INT16_(" + to_string(xi_block_size) + ")"); rec_ptr_list->append(vec_ier); rec_name_list->append("VEC_VK"); rec_type_list->append("FLOAT64_(" + to_string(xi_block_size) + ")"); rec_ptr_list->append(vec_vk); rec_name_list->append("VEC_XI"); rec_type_list->append("FLOAT64_(" + to_string(xi_block_size) + ")"); rec_ptr_list->append(vec_xi); rec_name_list->append("VEC_SPH_SIZES"); rec_type_list->append("FLOAT64_(" + to_string(configurations * xi_block_size) + ")"); rec_ptr_list->append(vec_sphere_sizes); rec_name_list->append("VEC_SPH_REFRI"); rec_type_list->append("FLOAT64_(" + to_string(2 * configurations * xi_block_size) + ")"); rec_ptr_list->append(vec_sphere_ref_indices); str_type = "FLOAT64_(" + to_string(configurations * xi_block_size) + ")"; rec_name_list->append("VEC_SCS"); rec_type_list->append(str_type); rec_ptr_list->append(vec_scs); rec_name_list->append("VEC_ABS"); rec_type_list->append(str_type); rec_ptr_list->append(vec_abs); rec_name_list->append("VEC_EXS"); rec_type_list->append(str_type); rec_ptr_list->append(vec_exs); rec_name_list->append("VEC_ALBEDS"); rec_type_list->append(str_type); rec_ptr_list->append(vec_albeds); rec_name_list->append("VEC_SCSRT"); rec_type_list->append(str_type); rec_ptr_list->append(vec_scsrt); rec_name_list->append("VEC_ABSRT"); rec_type_list->append(str_type); rec_ptr_list->append(vec_absrt); rec_name_list->append("VEC_EXSRT"); rec_type_list->append(str_type); rec_ptr_list->append(vec_exsrt); str_type = "FLOAT64_(" + to_string(2 * configurations * xi_block_size) + ")"; rec_name_list->append("VEC_FSAS"); rec_type_list->append(str_type); rec_ptr_list->append(vec_fsas); str_type = "FLOAT64_(" + to_string(configurations * xi_block_size) + ")"; rec_name_list->append("VEC_QSCHU"); rec_type_list->append(str_type); rec_ptr_list->append(vec_qschu); rec_name_list->append("VEC_PSCHU"); rec_type_list->append(str_type); rec_ptr_list->append(vec_pschu); rec_name_list->append("VEC_S0MAG"); rec_type_list->append(str_type); rec_ptr_list->append(vec_s0mag); rec_name_list->append("VEC_COSAV"); rec_type_list->append(str_type); rec_ptr_list->append(vec_cosav); rec_name_list->append("VEC_RAPRS"); rec_type_list->append(str_type); rec_ptr_list->append(vec_raprs); rec_name_list->append("VEC_TQEK1"); rec_type_list->append(str_type); rec_ptr_list->append(vec_tqek1); rec_name_list->append("VEC_TQEK2"); rec_type_list->append(str_type); rec_ptr_list->append(vec_tqek2); rec_name_list->append("VEC_TQSK1"); rec_type_list->append(str_type); rec_ptr_list->append(vec_tqsk1); rec_name_list->append("VEC_TQSK2"); rec_type_list->append(str_type); rec_ptr_list->append(vec_tqsk2); if (nsph != 1) { str_type = "FLOAT64_(" + to_string(2 * xi_block_size) + ")"; rec_name_list->append("VEC_FSAT"); rec_type_list->append(str_type); rec_ptr_list->append(vec_fsat); str_type = "FLOAT64_(" + to_string(xi_block_size) + ")"; rec_name_list->append("VEC_QSCHUT"); rec_type_list->append(str_type); rec_ptr_list->append(vec_qschut); rec_name_list->append("VEC_PSCHUT"); rec_type_list->append(str_type); rec_ptr_list->append(vec_pschut); rec_name_list->append("VEC_S0MAGT"); rec_type_list->append(str_type); rec_ptr_list->append(vec_s0magt); } str_type = "FLOAT64_(" + to_string(ndirs) + ")"; rec_name_list->append("VEC_DIR_SCAND"); rec_type_list->append(str_type); rec_ptr_list->append(vec_dir_scand); rec_name_list->append("VEC_DIR_CFMP"); rec_type_list->append(str_type); rec_ptr_list->append(vec_dir_cfmp); rec_name_list->append("VEC_DIR_CFSP"); rec_type_list->append(str_type); rec_ptr_list->append(vec_dir_cfsp); rec_name_list->append("VEC_DIR_SFMP"); rec_type_list->append(str_type); rec_ptr_list->append(vec_dir_sfmp); rec_name_list->append("VEC_DIR_SFSP"); rec_type_list->append(str_type); rec_ptr_list->append(vec_dir_sfsp); str_type = "FLOAT64_(" + to_string(3 * ndirs) + ")"; rec_name_list->append("VEC_DIR_UN"); rec_type_list->append(str_type); rec_ptr_list->append(vec_dir_un); rec_name_list->append("VEC_DIR_UNS"); rec_type_list->append(str_type); rec_ptr_list->append(vec_dir_uns); str_type = "FLOAT64_(" + to_string(2 * nsph * ndirs * xi_block_size) + ")"; rec_name_list->append("VEC_DIR_SAS11"); rec_type_list->append(str_type); rec_ptr_list->append(vec_dir_sas11); rec_name_list->append("VEC_DIR_SAS21"); rec_type_list->append(str_type); rec_ptr_list->append(vec_dir_sas21); rec_name_list->append("VEC_DIR_SAS12"); rec_type_list->append(str_type); rec_ptr_list->append(vec_dir_sas12); rec_name_list->append("VEC_DIR_SAS22"); rec_type_list->append(str_type); rec_ptr_list->append(vec_dir_sas22); str_type = "FLOAT64_(" + to_string(nsph * _num_theta * _num_phi * xi_block_size) + ")"; rec_name_list->append("VEC_DIR_FX"); rec_type_list->append(str_type); rec_ptr_list->append(vec_dir_fx); rec_name_list->append("VEC_DIR_FY"); rec_type_list->append(str_type); rec_ptr_list->append(vec_dir_fy); rec_name_list->append("VEC_DIR_FZ"); rec_type_list->append(str_type); rec_ptr_list->append(vec_dir_fz); str_type = "FLOAT64_(" + to_string(16 * nsph * ndirs * xi_block_size) + ")"; rec_name_list->append("VEC_DIR_MULS"); rec_type_list->append(str_type); rec_ptr_list->append(vec_dir_muls); rec_name_list->append("VEC_DIR_MULSLR"); rec_type_list->append(str_type); rec_ptr_list->append(vec_dir_mulslr); // Convert the lists to arrays and write them to HDF5 string *rec_names = rec_name_list->to_array(); string *rec_types = rec_type_list->to_array(); void **rec_pointers = rec_ptr_list->to_array(); const int rec_num = rec_name_list->length(); FileSchema *schema = new FileSchema(rec_num, rec_types, rec_names); HDFFile *hdf_file = HDFFile::from_schema(*schema, file_name, H5F_ACC_TRUNC); for (int ri = 0; ri < rec_num; ri++) hdf_file->write(rec_names[ri], rec_types[ri], rec_pointers[ri]); hdf_file->close(); // Clean memory delete rec_name_list; delete rec_type_list; delete rec_ptr_list; delete[] rec_names; delete[] rec_types; delete[] rec_pointers; delete schema; delete hdf_file; return 0; } int SphereOutputInfo::write_legacy(const std::string &file_name) { const dcomplex cc0 = 0.0 + I * 0.0; int result = 0; FILE *p_outfile = fopen(file_name.c_str(), "w"); if (p_outfile != NULL) { if (vec_jxi[0] == 1) { fprintf(p_outfile, " READ(IR,*)NSPH,LM,INPOL,NPNT,NPNTTS,ISAM\n"); fprintf( p_outfile, " %5d%5d%5d%5d%5d%5d\n", nsph, lm, inpol, npnt, npntts, isam ); fprintf(p_outfile, " READ(IR,*)TH,THSTP,THLST,THS,THSSTP,THSLST\n"); fprintf( p_outfile, " %9.3lE %9.3lE %9.3lE %9.3lE %9.3lE %9.3lE\n", th, thstp, thlst, ths, thsstp, thslst ); fprintf(p_outfile, " READ(IR,*)PH,PHSTP,PHLST,PHS,PHSSTP,PHSLST\n"); fprintf( p_outfile, " %9.3lE %9.3lE %9.3lE %9.3lE %9.3lE %9.3lE\n", ph, phstp, phlst, phs, phsstp, phslst ); fprintf(p_outfile, " READ(IR,*)JWTM\n"); fprintf(p_outfile, " %5d\n", jwtm); fprintf(p_outfile, " READ(ITIN)NSPHT\n"); fprintf(p_outfile, " READ(ITIN)(IOG(I),I=1,NSPH)\n"); fprintf(p_outfile, " READ(ITIN)EXDC,WP,XIP,IDFC,NXI\n"); fprintf(p_outfile, " READ(ITIN)(XIV(I),I=1,NXI)\n"); fprintf(p_outfile, " READ(ITIN)NSHL(I),ROS(I)\n"); fprintf(p_outfile, " READ(ITIN)(RCF(I,NS),NS=1,NSH)\n \n"); fprintf(p_outfile, " REFR. INDEX OF EXTERNAL MEDIUM=%15.7lE\n", exri); if (inpol == 0) fprintf(p_outfile, " LIN\n \n"); else fprintf(p_outfile, " CIRC\n \n"); if (idfc < 0) { fprintf(p_outfile, " VK=%15.7lE, XI IS SCALE FACTOR FOR LENGTHS\n \n", vec_vk[0]); } } // End preamble writing // Wavelength loop for (int jxi = 0; jxi < xi_block_size; jxi++) { int done_dirs = 0; fprintf(p_outfile, "========== JXI =%3d ====================\n", jxi + 1); if (idfc >= 0) { fprintf(p_outfile, " VK=%15.7lE, XI=%15.7lE\n", vec_xi[jxi], vec_vk[jxi]); } else { // IDFC < 0 fprintf(p_outfile, " XI=%15.7lE\n", vec_xi[jxi]); } if (vec_ier[jxi] == 1) { fprintf(p_outfile, " STOP IN DME\n"); fprintf( p_outfile, " AT %1d LCALC=%3d TOO SMALL WITH ARG=%15.7lE+i(%15.7lE)\n", (int)vec_ier[jxi], lcalc, real(arg), imag(arg) ); } for (int ci = 0; ci < configurations; ci++) { int cindex = jxi * configurations + ci; fprintf(p_outfile, " SPHERE %2d\n", ci + 1); if (vec_sphere_ref_indices[cindex] == cc0) { fprintf(p_outfile, " SIZE=%15.7lE\n", vec_sphere_sizes[cindex]); } else { fprintf( p_outfile, " SIZE=%15.7lE, REFRACTIVE INDEX=%15.7lE%15.7lE\n", vec_sphere_sizes[cindex], real(vec_sphere_ref_indices[cindex]), imag(vec_sphere_ref_indices[cindex]) ); } fprintf(p_outfile, " ----- SCS ----- ABS ----- EXS ----- ALBEDS --\n"); fprintf( p_outfile, " %14.7lE%15.7lE%15.7lE%15.7lE\n", vec_scs[cindex], vec_abs[cindex], vec_exs[cindex], vec_albeds[cindex] ); fprintf(p_outfile, " ---- SCS/GS -- ABS/GS -- EXS/GS ---\n"); fprintf( p_outfile, " %14.7lE%15.7lE%15.7lE\n", vec_scsrt[cindex], vec_absrt[cindex], vec_exsrt[cindex] ); fprintf( p_outfile, " FSAS=%15.7lE%15.7lE\n", real(vec_fsas[cindex]), imag(vec_fsas[cindex]) ); fprintf( p_outfile, " QSCHU=%15.7lE, PSCHU=%15.7lE, S0MAG=%15.7lE\n", vec_qschu[cindex], vec_pschu[cindex], vec_s0mag[cindex] ); fprintf( p_outfile, " COSAV=%15.7lE, RAPRS=%15.7lE\n", vec_cosav[cindex], vec_raprs[cindex] ); fprintf( p_outfile, " IPO= 1, TQEk=%15.7lE, TQSk=%15.7lE\n", vec_tqek1[cindex], vec_tqsk1[cindex] ); fprintf( p_outfile, " IPO= 2, TQEk=%15.7lE, TQSk=%15.7lE\n", vec_tqek2[cindex], vec_tqsk2[cindex] ); } // ci configuration loop if (nsph != 1) { fprintf( p_outfile, " FSAT=(%15.7lE,%15.7lE)\n", real(vec_fsat[jxi]), imag(vec_fsat[jxi]) ); fprintf( p_outfile, " QSCHU=%15.7lE, PSCHU=%15.7lE, S0MAG=%15.7lE\n", vec_qschut[jxi], vec_pschut[jxi], vec_s0magt[jxi] ); } for (int jth = 0; jth < _num_theta; jth++) { for (int jph = 0; jph < _num_phi; jph++) { for (int jths = 0; jths < _num_thetas; jths++) { for (int jphs = 0; jphs < _num_phis; jphs++) { int dir_index = ndirs * jxi + done_dirs; bool goto190 = (done_dirs == 0) && ((jxi > 0) || (jth > 0) || (jph > 0)); fprintf( p_outfile, "********** JTH =%3d, JPH =%3d, JTHS =%3d, JPHS =%3d ********************\n", jth + 1, jph + 1, jths + 1, jphs + 1 ); fprintf( p_outfile, " TIDG=%10.3lE, PIDG=%10.3lE, TSDG=%10.3lE, PSDG=%10.3lE\n", th + jth * thstp, ph + jph * phstp, ths + jths * thsstp, phs + jphs * phsstp ); fprintf(p_outfile, " SCAND=%10.3lE\n", vec_dir_scand[done_dirs]); fprintf( p_outfile, " CFMP=%15.7lE, SFMP=%15.7lE\n", vec_dir_cfmp[done_dirs], vec_dir_sfmp[done_dirs] ); fprintf( p_outfile, " CFSP=%15.7lE, SFSP=%15.7lE\n", vec_dir_cfsp[done_dirs], vec_dir_sfsp[done_dirs] ); if (isam >= 0) { fprintf( p_outfile, " UNI=(%12.5lE,%12.5lE,%12.5lE)\n", vec_dir_un[3 * done_dirs], vec_dir_un[3 * done_dirs + 1], vec_dir_un[3 * done_dirs + 2] ); fprintf( p_outfile, " UNS=(%12.5lE,%12.5lE,%12.5lE)\n", vec_dir_uns[3 * done_dirs], vec_dir_uns[3 * done_dirs + 1], vec_dir_uns[3 * done_dirs + 2] ); } else { fprintf( p_outfile, " UN=(%12.5lE,%12.5lE,%12.5lE)\n", vec_dir_un[3 * done_dirs], vec_dir_un[3 * done_dirs + 1], vec_dir_un[3 * done_dirs + 2] ); } for (int i = 0; i < nsph; i++) { int cindex = jxi * nsph * ndirs + nsph * done_dirs + i; fprintf(p_outfile, " SPHERE %2d\n", i + 1); fprintf( p_outfile, " SAS(1,1)=%15.7lE%15.7lE, SAS(2,1)=%15.7lE%15.7lE\n", real(vec_dir_sas11[cindex]), imag(vec_dir_sas11[cindex]), real(vec_dir_sas21[cindex]), imag(vec_dir_sas21[cindex]) ); fprintf( p_outfile, " SAS(1,2)=%15.7lE%15.7lE, SAS(2,2)=%15.7lE%15.7lE\n", real(vec_dir_sas12[cindex]), imag(vec_dir_sas12[cindex]), real(vec_dir_sas22[cindex]), imag(vec_dir_sas22[cindex]) ); if (jths == 0 && jphs == 0) { fprintf( p_outfile, " Fx=%15.7lE, Fy=%15.7lE, Fz=%15.7lE\n", vec_dir_fx[jxi * nsph * _num_theta * _num_phi + jth * nsph * _num_phi + jph * nsph + i], vec_dir_fy[jxi * nsph * _num_theta * _num_phi + jth * nsph * _num_phi + jph * nsph + i], vec_dir_fz[jxi * nsph * _num_theta * _num_phi + jth * nsph * _num_phi + jph * nsph + i] ); } fprintf(p_outfile, " MULS\n"); for (int j = 0; j < 4; j++) { int muls_index = 16 * cindex + 4 * j; fprintf( p_outfile, " %15.7lE%15.7lE%15.7lE%15.7lE\n", vec_dir_muls[muls_index], vec_dir_muls[muls_index + 1], vec_dir_muls[muls_index + 2], vec_dir_muls[muls_index + 3] ); } // j muls loop fprintf(p_outfile, " MULSLR\n"); for (int j = 0; j < 4; j++) { int muls_index = 16 * cindex + 4 * j; fprintf( p_outfile, " %15.7lE%15.7lE%15.7lE%15.7lE\n", vec_dir_mulslr[muls_index], vec_dir_mulslr[muls_index + 1], vec_dir_mulslr[muls_index + 2], vec_dir_mulslr[muls_index + 3] ); } // j mulslr loop } // i sphere loop done_dirs++; } // jphs loop } // jths loop } // jph loop } // jth loop } // jxi wavelength loop fclose(p_outfile); } else { result = -1; } return result; } #ifdef MPI_VERSION int SphereOutputInfo::mpireceive(const mixMPI *mpidata, int pid) { int result = 0; int chk_nsph, chk_inpol, chk_isam, chk_num_theta, chk_num_thetas; int chk_num_phi, chk_num_phis, chk_ndirs, chk_idfc, chk_configs; double chk_exri; MPI_Recv(&chk_nsph, 1, MPI_INT32_T, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(&chk_inpol, 1, MPI_INT32_T, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(&chk_isam, 1, MPI_INT32_T, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(&chk_num_theta, 1, MPI_INT32_T, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(&chk_num_thetas, 1, MPI_INT32_T, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(&chk_num_phi, 1, MPI_INT32_T, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(&chk_num_phis, 1, MPI_INT32_T, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(&chk_ndirs, 1, MPI_INT32_T, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(&chk_exri, 1, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(&chk_idfc, 1, MPI_INT32_T, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(&chk_configs, 1, MPI_INT32_T, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); result += (chk_nsph == nsph) ? 0 : 1; result += (chk_inpol == inpol) ? 0 : 1; result += (chk_isam == isam) ? 0 : 1; result += (chk_num_theta == _num_theta) ? 0 : 1; result += (chk_num_thetas == _num_thetas) ? 0 : 1; result += (chk_num_phi == _num_phi) ? 0 : 1; result += (chk_num_phis == _num_phis) ? 0 : 1; result += (chk_ndirs == ndirs) ? 0 : 1; result += (chk_exri == exri) ? 0 : 1; result += (chk_idfc == idfc) ? 0 : 1; result += (chk_configs == configurations) ? 0 : 1; if (result == 0) { int xi1, offset, chunk_size; MPI_Send(&result, 1, MPI_INT32_T, pid, 10, MPI_COMM_WORLD); MPI_Recv(&xi1, 1, MPI_INT32_T, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); // Receive vectors of single values per scale MPI_Recv(&chunk_size, 1, MPI_INT32_T, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); offset = xi1 - _first_xi; MPI_Recv(vec_jxi + offset, chunk_size, MPI_INT32_T, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_ier + offset, chunk_size, MPI_SHORT, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_vk + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_xi + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); if (nsph != 1) { MPI_Recv(vec_fsat + offset, chunk_size, MPI_C_DOUBLE_COMPLEX, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_qschut + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_pschut + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_s0magt + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); } // Receive vectors whose sizes depend on configurations and wavelengths MPI_Recv(&chunk_size, 1, MPI_INT32_T, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); offset = (xi1 - _first_xi) * configurations; MPI_Recv(vec_sphere_sizes + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_sphere_ref_indices + offset, chunk_size, MPI_C_DOUBLE_COMPLEX, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_scs + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_abs + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_exs + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_albeds + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_scsrt + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_absrt + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_exsrt + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_fsas + offset, chunk_size, MPI_C_DOUBLE_COMPLEX, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_qschu + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_pschu + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_s0mag + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_cosav + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_raprs + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_tqek1 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_tqek2 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_tqsk1 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_tqsk2 + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); // Receive vectors whose sizes depend on NSPH, directions and wavelengths MPI_Recv(&chunk_size, 1, MPI_INT32_T, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); offset = (xi1 - _first_xi) * nsph * ndirs; MPI_Recv(vec_dir_sas11 + offset, chunk_size, MPI_C_DOUBLE_COMPLEX, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_sas21 + offset, chunk_size, MPI_C_DOUBLE_COMPLEX, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_sas12 + offset, chunk_size, MPI_C_DOUBLE_COMPLEX, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_sas22 + offset, chunk_size, MPI_C_DOUBLE_COMPLEX, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_muls + 16 * offset, 16 * chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_mulslr + 16 * offset, 16 * chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); // Receive vectors whose sizes depend on NSPH, incidence directions and wavelengths MPI_Recv(&chunk_size, 1, MPI_INT32_T, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); offset = (xi1 - _first_xi) * nsph * _num_theta * _num_phi; MPI_Recv(vec_dir_fx + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_fy + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(vec_dir_fz + offset, chunk_size, MPI_DOUBLE, pid, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); } else { MPI_Send(&result, 1, MPI_INT32_T, pid, 10, MPI_COMM_WORLD); } return result; } int SphereOutputInfo::mpisend(const mixMPI *mpidata) { int result = 0; int chunk_size; // Send output metadata for configuration cross-check MPI_Send(&nsph, 1, MPI_INT32_T, 0, 10, MPI_COMM_WORLD); MPI_Send(&inpol, 1, MPI_INT32_T, 0, 10, MPI_COMM_WORLD); MPI_Send(&isam, 1, MPI_INT32_T, 0, 10, MPI_COMM_WORLD); MPI_Send(&_num_theta, 1, MPI_INT32_T, 0, 10, MPI_COMM_WORLD); MPI_Send(&_num_thetas, 1, MPI_INT32_T, 0, 10, MPI_COMM_WORLD); MPI_Send(&_num_phi, 1, MPI_INT32_T, 0, 10, MPI_COMM_WORLD); MPI_Send(&_num_phis, 1, MPI_INT32_T, 0, 10, MPI_COMM_WORLD); MPI_Send(&ndirs, 1, MPI_INT32_T, 0, 10, MPI_COMM_WORLD); MPI_Send(&exri, 1, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(&idfc, 1, MPI_INT32_T, 0, 10, MPI_COMM_WORLD); MPI_Send(&configurations, 1, MPI_INT32_T, 0, 10, MPI_COMM_WORLD); // Wait for process 0 to cross-check the configuration MPI_Recv(&result, 1, MPI_INT32_T, 0, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); if (result == 0) { // Process 0 confirmed the consistency of configuration. Send the data. // Send vectors of single values per scale MPI_Send(&_first_xi, 1, MPI_INT32_T, 0, 10, MPI_COMM_WORLD); MPI_Send(&xi_block_size, 1, MPI_INT32_T, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_jxi, xi_block_size, MPI_INT32_T, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_ier, xi_block_size, MPI_SHORT, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_vk, xi_block_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_xi, xi_block_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); if (nsph != 1) { MPI_Send(vec_fsat, xi_block_size, MPI_C_DOUBLE_COMPLEX, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_qschut, xi_block_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_pschut, xi_block_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_s0magt, xi_block_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); } // Send vectors whose sizes depend on configurations and scales chunk_size = xi_block_size * configurations; MPI_Send(&chunk_size, 1, MPI_INT32_T, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_sphere_sizes, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_sphere_ref_indices, chunk_size, MPI_C_DOUBLE_COMPLEX, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_scs, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_abs, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_exs, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_albeds, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_scsrt, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_absrt, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_exsrt, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_fsas, chunk_size, MPI_C_DOUBLE_COMPLEX, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_qschu, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_pschu, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_s0mag, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_cosav, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_raprs, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_tqek1, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_tqek2, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_tqsk1, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_tqsk2, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); // Send vectors whose sizes depend on NSPH, directions and wavelengths chunk_size = xi_block_size * nsph * ndirs; MPI_Send(&chunk_size, 1, MPI_INT32_T, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_sas11, chunk_size, MPI_C_DOUBLE_COMPLEX, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_sas21, chunk_size, MPI_C_DOUBLE_COMPLEX, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_sas12, chunk_size, MPI_C_DOUBLE_COMPLEX, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_sas22, chunk_size, MPI_C_DOUBLE_COMPLEX, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_muls, 16 * chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_mulslr, 16 * chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); // Send vectors whose sizes depend on NSPH, incidence directions and wavelengths chunk_size = xi_block_size * nsph * _num_theta * _num_phi; MPI_Send(vec_dir_fx, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_fy, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); MPI_Send(vec_dir_fz, chunk_size, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD); } return result; } #endif // MPI_VERSION // >>> END OF SphereOutputInfo CLASS IMPLEMENTATION <<<