From 5d75069a6a0dca37ad037ad9fc15de2b7efd35e0 Mon Sep 17 00:00:00 2001 From: Weina Ji Date: Wed, 27 Sep 2023 18:07:58 +0200 Subject: [PATCH 01/31] dat3 --- src/coreneuron/io/nrn2core_direct.h | 6 +++ src/coreneuron/io/nrn_setup.cpp | 49 ++++++++++++++++++- .../callbacks/nrncore_callbacks.cpp | 31 ++++++++++++ .../callbacks/nrncore_callbacks.h | 8 +++ 4 files changed, 92 insertions(+), 2 deletions(-) diff --git a/src/coreneuron/io/nrn2core_direct.h b/src/coreneuron/io/nrn2core_direct.h index 5790f2197d..c50892a682 100644 --- a/src/coreneuron/io/nrn2core_direct.h +++ b/src/coreneuron/io/nrn2core_direct.h @@ -96,6 +96,12 @@ extern int (*nrn2core_get_dat2_vecplay_inst_)(int tid, extern void (*nrn2core_part2_clean_)(); +extern void (*nrn2core_get_dat3_cell_count)(int&cell_count); +extern void (*nrn2core_get_dat3_cellmapping)(int i, int& gid, int& nsec, int& nseg, int& n_seclist); +extern void (*nrn2core_get_dat3_secmapping)(int i_c, int i_sec, std::string& segname, + int& nsec, int& nseg, size_t& total_lfp_factors, int& n_electrode, + std::vector& data_sec, std::vector& data_seg, std::vector& data_lfp); + /* what variables to send back to NEURON on each time step */ extern void (*nrn2core_get_trajectory_requests_)(int tid, int& bsize, diff --git a/src/coreneuron/io/nrn_setup.cpp b/src/coreneuron/io/nrn_setup.cpp index 0a3dc11e87..86701e1410 100644 --- a/src/coreneuron/io/nrn_setup.cpp +++ b/src/coreneuron/io/nrn_setup.cpp @@ -73,6 +73,11 @@ int (*nrn2core_all_spike_vectors_return_)(std::vector& spikevec, std::ve void (*nrn2core_all_weights_return_)(std::vector& weights); +void (*nrn2core_get_dat3_cell_count)(int& cell_count); +void (*nrn2core_get_dat3_cellmapping)(int i, int& gid, int& nsec, int& nseg, int& n_seclist); +void (*nrn2core_get_dat3_secmapping)(int i_c, int i_sec, std::string& segname, + int& nsec, int& nseg, size_t& total_lfp_factors, int& n_electrode, + std::vector& data_sec, std::vector& data_seg, std::vector& data_lfp); // file format defined in cooperation with nrncore/src/nrniv/nrnbbcore_write.cpp // single integers are ascii one per line. arrays are binary int or double // Note that regardless of the gid contents of a group, since all gids are @@ -516,7 +521,7 @@ void nrn_setup(const char* filesdat, } if (is_mapping_needed) - coreneuron::phase_wrapper(userParams); + coreneuron::phase_wrapper(userParams, corenrn_embedded); *mindelay = set_mindelay(*mindelay); @@ -934,6 +939,46 @@ void read_phase3(NrnThread& nt, UserParams& userParams) { /** mapping information for all neurons in single NrnThread */ NrnThreadMappingInfo* ntmapping = new NrnThreadMappingInfo(); + if (corenrn_embedded) { + int count; + nrn2core_get_dat3_cell_count(count); + /** for every neuron */ + for (int i = 0; i < count; i++) { + int gid, nsec, nseg, nseclist; + nrn2core_get_dat3_cellmapping(i, gid, nsec, nseg, nseclist); + CellMapping* cmap = new CellMapping(gid); + for (int j=0; j data_sec; + std::vector data_seg; + std::vector data_lfp; + nrn2core_get_dat3_secmapping(i, j, segname, n_secsec, n_secseg, total_lfp_factors, n_electrodes, data_sec, data_seg, data_lfp); + SecMapping* smap = new SecMapping(); + smap->name = segname; + int factor_offset = 0; + for (int i_seg = 0; i_seg < n_secseg; i_seg++) { + smap->add_segment(data_sec[i_seg], data_seg[i_seg]); + ntmapping->add_segment_id(data_seg[i_seg]); + int factor_offset = i_seg * n_electrodes; + if (total_lfp_factors > 0) { + // Abort if the factors contains a NaN + nrn_assert(count_if(data_lfp.begin(), data_lfp.end(), [](double d) { + return std::isnan(d); + }) == 0); + std::vector segment_factors(data_lfp.begin() + factor_offset, + data_lfp.begin() + factor_offset + n_electrodes); + cmap->add_segment_lfp_factor(data_seg[i], segment_factors); + } + } + cmap->add_sec_map(smap); + + } + ntmapping->add_cell_mapping(cmap); + + } + } else { int count = 0; @@ -960,7 +1005,7 @@ void read_phase3(NrnThread& nt, UserParams& userParams) { ntmapping->add_cell_mapping(cmap); } - + } // make number #cells match with mapping size nrn_assert((int) ntmapping->size() == nt.ncell); diff --git a/src/nrniv/nrncore_write/callbacks/nrncore_callbacks.cpp b/src/nrniv/nrncore_write/callbacks/nrncore_callbacks.cpp index ec88e782a7..e92cc872cf 100644 --- a/src/nrniv/nrncore_write/callbacks/nrncore_callbacks.cpp +++ b/src/nrniv/nrncore_write/callbacks/nrncore_callbacks.cpp @@ -18,6 +18,7 @@ extern TQueue* net_cvode_instance_event_queue(NrnThread*); #include "vrecitem.h" // for nrnbbcore_vecplay_write #include "nrnwrap_dlfcn.h" +#include "nrnsection_mapping.h" extern bbcore_write_t* nrn_bbcore_write_; extern bbcore_write_t* nrn_bbcore_read_; @@ -26,6 +27,7 @@ extern bool corenrn_direct; extern int* bbcore_dparam_size; extern double nrn_ion_charge(Symbol*); extern CellGroup* cellgroups_; +extern NrnMappingInfo mapinfo; extern NetCvode* net_cvode_instance; extern char* pnt_map; extern void* nrn_interthread_enqueue(NrnThread*); @@ -219,6 +221,35 @@ int nrnthread_dat1(int tid, return 1; } +void nrnthread_dat3_cell_count(int& cell_count) { + cell_count = mapinfo.size(); +} + +void nrnthread_dat3_cellmapping(int i, int& gid, + int& nsec, int& nseg, int& n_seclist) { + CellMapping* c = mapinfo.mapping[i]; + gid = c->gid; + nsec = c->num_sections(); + nseg = c->num_segments(); + n_seclist = c->size(); +} + +void nrnthread_dat3_secmapping(int i_c, int i_sec, std::string& segname, + int& nsec, int& nseg, size_t& total_lfp_factors, int& n_electrodes, + std::vector& data_sec, std::vector& data_seg, std::vector& data_lfp) { + CellMapping* c = mapinfo.mapping[i_c]; + SecMapping* s = c->secmapping[i_sec]; + segname=s->name.c_str(); + nsec = s->nsec; + nseg = s->size(); + total_lfp_factors = s->seglfp_factors.size(); + n_electrodes = s->num_electrodes; + data_sec = s->sections; + data_seg = s->segments; + data_lfp = s->seglfp_factors; + +} + // sizes and total data count int nrnthread_dat2_1(int tid, int& ncell, diff --git a/src/nrniv/nrncore_write/callbacks/nrncore_callbacks.h b/src/nrniv/nrncore_write/callbacks/nrncore_callbacks.h index efce1359fb..086da11fc4 100644 --- a/src/nrniv/nrncore_write/callbacks/nrncore_callbacks.h +++ b/src/nrniv/nrncore_write/callbacks/nrncore_callbacks.h @@ -97,6 +97,11 @@ int nrnthread_dat2_vecplay_inst(int tid, int& last_index, int& discon_index, int& ubound_index); +void nrnthread_dat3_cell_count(int& cell_count); +void nrnthread_dat3_cellmapping(int i, int& gid, int& nsec, int& nseg, int& n_seclist); +void nrnthread_dat3_secmapping(int i_c, int i_sec, std::string& segname, + int& nsec, int& nseg, size_t& total_lfp_factors, int& n_electrode, + std::vector& data_sec, std::vector& data_seg, std::vector& data_lfp); int* datum2int(int type, Memb_list* ml, @@ -215,6 +220,9 @@ static core2nrn_callback_t cnbs[] = { {"nrn2core_get_dat2_vecplay_", (CNB) nrnthread_dat2_vecplay}, {"nrn2core_get_dat2_vecplay_inst_", (CNB) nrnthread_dat2_vecplay_inst}, {"nrn2core_part2_clean_", (CNB) part2_clean}, + {"nrn2core_get_dat3_cell_count", (CNB) nrnthread_dat3_cell_count}, + {"nrn2core_get_dat3_cellmapping", (CNB) nrnthread_dat3_cellmapping}, + {"nrn2core_get_dat3_secmapping", (CNB) nrnthread_dat3_secmapping}, {"nrn2core_get_trajectory_requests_", (CNB) nrnthread_get_trajectory_requests}, {"nrn2core_trajectory_values_", (CNB) nrnthread_trajectory_values}, From 727acffc6ca2a34e22bb18867e3e4989006a88e6 Mon Sep 17 00:00:00 2001 From: Weina Ji Date: Wed, 27 Sep 2023 21:47:09 +0200 Subject: [PATCH 02/31] format --- src/coreneuron/io/nrn2core_direct.h | 15 +++- src/coreneuron/io/nrn_setup.cpp | 76 +++++++++++-------- .../callbacks/nrncore_callbacks.cpp | 19 +++-- .../callbacks/nrncore_callbacks.h | 13 +++- 4 files changed, 78 insertions(+), 45 deletions(-) diff --git a/src/coreneuron/io/nrn2core_direct.h b/src/coreneuron/io/nrn2core_direct.h index c50892a682..fc89c15ce5 100644 --- a/src/coreneuron/io/nrn2core_direct.h +++ b/src/coreneuron/io/nrn2core_direct.h @@ -96,11 +96,18 @@ extern int (*nrn2core_get_dat2_vecplay_inst_)(int tid, extern void (*nrn2core_part2_clean_)(); -extern void (*nrn2core_get_dat3_cell_count)(int&cell_count); +extern void (*nrn2core_get_dat3_cell_count)(int& cell_count); extern void (*nrn2core_get_dat3_cellmapping)(int i, int& gid, int& nsec, int& nseg, int& n_seclist); -extern void (*nrn2core_get_dat3_secmapping)(int i_c, int i_sec, std::string& segname, - int& nsec, int& nseg, size_t& total_lfp_factors, int& n_electrode, - std::vector& data_sec, std::vector& data_seg, std::vector& data_lfp); +extern void (*nrn2core_get_dat3_secmapping)(int i_c, + int i_sec, + std::string& segname, + int& nsec, + int& nseg, + size_t& total_lfp_factors, + int& n_electrode, + std::vector& data_sec, + std::vector& data_seg, + std::vector& data_lfp); /* what variables to send back to NEURON on each time step */ extern void (*nrn2core_get_trajectory_requests_)(int tid, diff --git a/src/coreneuron/io/nrn_setup.cpp b/src/coreneuron/io/nrn_setup.cpp index 86701e1410..5ff5256c10 100644 --- a/src/coreneuron/io/nrn_setup.cpp +++ b/src/coreneuron/io/nrn_setup.cpp @@ -75,9 +75,16 @@ void (*nrn2core_all_weights_return_)(std::vector& weights); void (*nrn2core_get_dat3_cell_count)(int& cell_count); void (*nrn2core_get_dat3_cellmapping)(int i, int& gid, int& nsec, int& nseg, int& n_seclist); -void (*nrn2core_get_dat3_secmapping)(int i_c, int i_sec, std::string& segname, - int& nsec, int& nseg, size_t& total_lfp_factors, int& n_electrode, - std::vector& data_sec, std::vector& data_seg, std::vector& data_lfp); +void (*nrn2core_get_dat3_secmapping)(int i_c, + int i_sec, + std::string& segname, + int& nsec, + int& nseg, + size_t& total_lfp_factors, + int& n_electrode, + std::vector& data_sec, + std::vector& data_seg, + std::vector& data_lfp); // file format defined in cooperation with nrncore/src/nrniv/nrnbbcore_write.cpp // single integers are ascii one per line. arrays are binary int or double // Note that regardless of the gid contents of a group, since all gids are @@ -947,14 +954,23 @@ void read_phase3(NrnThread& nt, UserParams& userParams) { int gid, nsec, nseg, nseclist; nrn2core_get_dat3_cellmapping(i, gid, nsec, nseg, nseclist); CellMapping* cmap = new CellMapping(gid); - for (int j=0; j data_sec; std::vector data_seg; std::vector data_lfp; - nrn2core_get_dat3_secmapping(i, j, segname, n_secsec, n_secseg, total_lfp_factors, n_electrodes, data_sec, data_seg, data_lfp); + nrn2core_get_dat3_secmapping(i, + j, + segname, + n_secsec, + n_secseg, + total_lfp_factors, + n_electrodes, + data_sec, + data_seg, + data_lfp); SecMapping* smap = new SecMapping(); smap->name = segname; int factor_offset = 0; @@ -965,46 +981,44 @@ void read_phase3(NrnThread& nt, UserParams& userParams) { if (total_lfp_factors > 0) { // Abort if the factors contains a NaN nrn_assert(count_if(data_lfp.begin(), data_lfp.end(), [](double d) { - return std::isnan(d); - }) == 0); + return std::isnan(d); + }) == 0); std::vector segment_factors(data_lfp.begin() + factor_offset, - data_lfp.begin() + factor_offset + n_electrodes); + data_lfp.begin() + factor_offset + + n_electrodes); cmap->add_segment_lfp_factor(data_seg[i], segment_factors); + } } + cmap->add_sec_map(smap); } - cmap->add_sec_map(smap); - - } ntmapping->add_cell_mapping(cmap); - - } + } } else { + int count = 0; - int count = 0; + F.read_mapping_cell_count(&count); - F.read_mapping_cell_count(&count); + /** number of cells in mapping file should equal to cells in NrnThread */ + nrn_assert(count == nt.ncell); - /** number of cells in mapping file should equal to cells in NrnThread */ - nrn_assert(count == nt.ncell); + /** for every neuron */ + for (int i = 0; i < nt.ncell; i++) { + int gid, nsec, nseg, nseclist; - /** for every neuron */ - for (int i = 0; i < nt.ncell; i++) { - int gid, nsec, nseg, nseclist; + // read counts + F.read_mapping_count(&gid, &nsec, &nseg, &nseclist); - // read counts - F.read_mapping_count(&gid, &nsec, &nseg, &nseclist); + CellMapping* cmap = new CellMapping(gid); - CellMapping* cmap = new CellMapping(gid); + // read section-segment mapping for every section list + for (int j = 0; j < nseclist; j++) { + SecMapping* smap = new SecMapping(); + F.read_mapping_info(smap, ntmapping, cmap); + cmap->add_sec_map(smap); + } - // read section-segment mapping for every section list - for (int j = 0; j < nseclist; j++) { - SecMapping* smap = new SecMapping(); - F.read_mapping_info(smap, ntmapping, cmap); - cmap->add_sec_map(smap); + ntmapping->add_cell_mapping(cmap); } - - ntmapping->add_cell_mapping(cmap); - } } // make number #cells match with mapping size nrn_assert((int) ntmapping->size() == nt.ncell); diff --git a/src/nrniv/nrncore_write/callbacks/nrncore_callbacks.cpp b/src/nrniv/nrncore_write/callbacks/nrncore_callbacks.cpp index e92cc872cf..bf50dae981 100644 --- a/src/nrniv/nrncore_write/callbacks/nrncore_callbacks.cpp +++ b/src/nrniv/nrncore_write/callbacks/nrncore_callbacks.cpp @@ -225,8 +225,7 @@ void nrnthread_dat3_cell_count(int& cell_count) { cell_count = mapinfo.size(); } -void nrnthread_dat3_cellmapping(int i, int& gid, - int& nsec, int& nseg, int& n_seclist) { +void nrnthread_dat3_cellmapping(int i, int& gid, int& nsec, int& nseg, int& n_seclist) { CellMapping* c = mapinfo.mapping[i]; gid = c->gid; nsec = c->num_sections(); @@ -234,12 +233,19 @@ void nrnthread_dat3_cellmapping(int i, int& gid, n_seclist = c->size(); } -void nrnthread_dat3_secmapping(int i_c, int i_sec, std::string& segname, - int& nsec, int& nseg, size_t& total_lfp_factors, int& n_electrodes, - std::vector& data_sec, std::vector& data_seg, std::vector& data_lfp) { +void nrnthread_dat3_secmapping(int i_c, + int i_sec, + std::string& segname, + int& nsec, + int& nseg, + size_t& total_lfp_factors, + int& n_electrodes, + std::vector& data_sec, + std::vector& data_seg, + std::vector& data_lfp) { CellMapping* c = mapinfo.mapping[i_c]; SecMapping* s = c->secmapping[i_sec]; - segname=s->name.c_str(); + segname = s->name.c_str(); nsec = s->nsec; nseg = s->size(); total_lfp_factors = s->seglfp_factors.size(); @@ -247,7 +253,6 @@ void nrnthread_dat3_secmapping(int i_c, int i_sec, std::string& segname, data_sec = s->sections; data_seg = s->segments; data_lfp = s->seglfp_factors; - } // sizes and total data count diff --git a/src/nrniv/nrncore_write/callbacks/nrncore_callbacks.h b/src/nrniv/nrncore_write/callbacks/nrncore_callbacks.h index 086da11fc4..2e8b4f2607 100644 --- a/src/nrniv/nrncore_write/callbacks/nrncore_callbacks.h +++ b/src/nrniv/nrncore_write/callbacks/nrncore_callbacks.h @@ -99,9 +99,16 @@ int nrnthread_dat2_vecplay_inst(int tid, int& ubound_index); void nrnthread_dat3_cell_count(int& cell_count); void nrnthread_dat3_cellmapping(int i, int& gid, int& nsec, int& nseg, int& n_seclist); -void nrnthread_dat3_secmapping(int i_c, int i_sec, std::string& segname, - int& nsec, int& nseg, size_t& total_lfp_factors, int& n_electrode, - std::vector& data_sec, std::vector& data_seg, std::vector& data_lfp); +void nrnthread_dat3_secmapping(int i_c, + int i_sec, + std::string& segname, + int& nsec, + int& nseg, + size_t& total_lfp_factors, + int& n_electrode, + std::vector& data_sec, + std::vector& data_seg, + std::vector& data_lfp); int* datum2int(int type, Memb_list* ml, From a640c65722a87a74d42f67991b1247f230ba3875 Mon Sep 17 00:00:00 2001 From: Weina Ji Date: Thu, 28 Sep 2023 16:06:35 +0200 Subject: [PATCH 03/31] no need to send ReportEvent back to nrn --- src/coreneuron/io/core2nrn_data_return.cpp | 4 ++++ src/coreneuron/io/reports/report_event.hpp | 3 +++ src/coreneuron/network/netcon.hpp | 1 + 3 files changed, 8 insertions(+) diff --git a/src/coreneuron/io/core2nrn_data_return.cpp b/src/coreneuron/io/core2nrn_data_return.cpp index 5b13d4880d..3aa230911a 100644 --- a/src/coreneuron/io/core2nrn_data_return.cpp +++ b/src/coreneuron/io/core2nrn_data_return.cpp @@ -572,6 +572,10 @@ static bool core2nrn_tqueue_item(TQItem* q, SelfEventWeightMap& sewm, NrnThread& // nothing to transfer break; } + case ReportEventType: { + // no need to transfer ReportEvent + break; + } default: { // In particular, InputPreSyn does not appear in tqueue as it // immediately fans out to NetCon. diff --git a/src/coreneuron/io/reports/report_event.hpp b/src/coreneuron/io/reports/report_event.hpp index 0bb9a922b2..acabe2606c 100644 --- a/src/coreneuron/io/reports/report_event.hpp +++ b/src/coreneuron/io/reports/report_event.hpp @@ -44,6 +44,9 @@ class ReportEvent: public DiscreteEvent { bool require_checkpoint() override; void summation_alu(NrnThread* nt); void lfp_calc(NrnThread* nt); + virtual int type() const override { + return ReportEventType; + } private: double dt; diff --git a/src/coreneuron/network/netcon.hpp b/src/coreneuron/network/netcon.hpp index 613a454f43..fc1ee75aab 100644 --- a/src/coreneuron/network/netcon.hpp +++ b/src/coreneuron/network/netcon.hpp @@ -26,6 +26,7 @@ class NetCvode; #define PreSynType 4 #define NetParEventType 7 #define InputPreSynType 20 +#define ReportEventType 8 struct DiscreteEvent { DiscreteEvent() = default; From e3d02c56f911a8684e12ec81501bee9296e33ddb Mon Sep 17 00:00:00 2001 From: Weina Ji Date: Mon, 4 Dec 2023 15:23:23 +0100 Subject: [PATCH 04/31] call nrnthread_dat3_secmapping during writing files --- src/coreneuron/io/nrn_setup.cpp | 18 +++---- .../callbacks/nrncore_callbacks.cpp | 4 +- .../callbacks/nrncore_callbacks.h | 2 +- src/nrniv/nrncore_write/io/nrncore_io.cpp | 49 ++++++++++++------- 4 files changed, 44 insertions(+), 29 deletions(-) diff --git a/src/coreneuron/io/nrn_setup.cpp b/src/coreneuron/io/nrn_setup.cpp index 5ff5256c10..232af55788 100644 --- a/src/coreneuron/io/nrn_setup.cpp +++ b/src/coreneuron/io/nrn_setup.cpp @@ -951,30 +951,30 @@ void read_phase3(NrnThread& nt, UserParams& userParams) { nrn2core_get_dat3_cell_count(count); /** for every neuron */ for (int i = 0; i < count; i++) { - int gid, nsec, nseg, nseclist; - nrn2core_get_dat3_cellmapping(i, gid, nsec, nseg, nseclist); + int gid, t_sec, t_seg, nseclist; + nrn2core_get_dat3_cellmapping(i, gid, t_sec, t_seg, nseclist); CellMapping* cmap = new CellMapping(gid); for (int j = 0; j < nseclist; j++) { - std::string segname; - int n_secsec, n_secseg, n_electrodes; + std::string sclname; + int n_sec, n_seg, n_electrodes; size_t total_lfp_factors; std::vector data_sec; std::vector data_seg; std::vector data_lfp; nrn2core_get_dat3_secmapping(i, j, - segname, - n_secsec, - n_secseg, + sclname, + n_sec, + n_seg, total_lfp_factors, n_electrodes, data_sec, data_seg, data_lfp); SecMapping* smap = new SecMapping(); - smap->name = segname; + smap->name = sclname; int factor_offset = 0; - for (int i_seg = 0; i_seg < n_secseg; i_seg++) { + for (int i_seg = 0; i_seg < n_seg; i_seg++) { smap->add_segment(data_sec[i_seg], data_seg[i_seg]); ntmapping->add_segment_id(data_seg[i_seg]); int factor_offset = i_seg * n_electrodes; diff --git a/src/nrniv/nrncore_write/callbacks/nrncore_callbacks.cpp b/src/nrniv/nrncore_write/callbacks/nrncore_callbacks.cpp index bf50dae981..124e2d071d 100644 --- a/src/nrniv/nrncore_write/callbacks/nrncore_callbacks.cpp +++ b/src/nrniv/nrncore_write/callbacks/nrncore_callbacks.cpp @@ -235,7 +235,7 @@ void nrnthread_dat3_cellmapping(int i, int& gid, int& nsec, int& nseg, int& n_se void nrnthread_dat3_secmapping(int i_c, int i_sec, - std::string& segname, + std::string& sclname, int& nsec, int& nseg, size_t& total_lfp_factors, @@ -245,7 +245,7 @@ void nrnthread_dat3_secmapping(int i_c, std::vector& data_lfp) { CellMapping* c = mapinfo.mapping[i_c]; SecMapping* s = c->secmapping[i_sec]; - segname = s->name.c_str(); + sclname = s->name; nsec = s->nsec; nseg = s->size(); total_lfp_factors = s->seglfp_factors.size(); diff --git a/src/nrniv/nrncore_write/callbacks/nrncore_callbacks.h b/src/nrniv/nrncore_write/callbacks/nrncore_callbacks.h index 2e8b4f2607..46007da83c 100644 --- a/src/nrniv/nrncore_write/callbacks/nrncore_callbacks.h +++ b/src/nrniv/nrncore_write/callbacks/nrncore_callbacks.h @@ -101,7 +101,7 @@ void nrnthread_dat3_cell_count(int& cell_count); void nrnthread_dat3_cellmapping(int i, int& gid, int& nsec, int& nseg, int& n_seclist); void nrnthread_dat3_secmapping(int i_c, int i_sec, - std::string& segname, + std::string& sclname, int& nsec, int& nseg, size_t& total_lfp_factors, diff --git a/src/nrniv/nrncore_write/io/nrncore_io.cpp b/src/nrniv/nrncore_write/io/nrncore_io.cpp index 4b3fa7f709..ed0dd2d9b5 100644 --- a/src/nrniv/nrncore_write/io/nrncore_io.cpp +++ b/src/nrniv/nrncore_write/io/nrncore_io.cpp @@ -543,33 +543,48 @@ void nrn_write_mapping_info(const char* path, int gid, NrnMappingInfo& minfo) { fprintf(f, "%s\n", bbcore_write_version); /** number of gids in NrnThread */ - fprintf(f, "%zd\n", minfo.size()); + int count; + nrnthread_dat3_cell_count(count); + fprintf(f, "%zd\n", count); /** all cells mapping information in NrnThread */ - for (size_t i = 0; i < minfo.size(); i++) { - CellMapping* c = minfo.mapping[i]; - + for (size_t i = 0; i < count; i++) { + int gid, t_sec, t_seg, n_seclist; + nrnthread_dat3_cellmapping(i, gid, t_sec, t_seg, n_seclist); /** gid, #section, #compartments, #sectionlists */ - fprintf(f, "%d %d %d %zd\n", c->gid, c->num_sections(), c->num_segments(), c->size()); - - for (size_t j = 0; j < c->size(); j++) { - SecMapping* s = c->secmapping[j]; - size_t total_lfp_factors = s->seglfp_factors.size(); + fprintf(f, "%d %d %d %zd\n", gid, t_sec, t_seg, n_seclist); + + for (size_t j = 0; j < n_seclist; j++) { + std::string sclname; + int nsec, nseg, n_electrodes; + size_t total_lfp_factors; + std::vector data_sec, data_seg; + std::vector data_lfp; + nrnthread_dat3_secmapping(i, + j, + sclname, + nsec, + nseg, + total_lfp_factors, + n_electrodes, + data_sec, + data_seg, + data_lfp); /** section list name, number of sections, number of segments */ fprintf(f, "%s %d %zd %zd %d\n", - s->name.c_str(), - s->nsec, - s->size(), + sclname.c_str(), + nsec, + nseg, total_lfp_factors, - s->num_electrodes); + n_electrodes); /** section - segment mapping */ - if (s->size()) { - writeint(&(s->sections.front()), s->size()); - writeint(&(s->segments.front()), s->size()); + if (nseg) { + writeint(&(data_sec.front()), nseg); + writeint(&(data_seg.front()), nseg); if (total_lfp_factors) { - writedbl(&(s->seglfp_factors.front()), total_lfp_factors); + writedbl(&(data_lfp.front()), total_lfp_factors); } } } From 3b7da293fa8bdd99631458c52c91285675bd291c Mon Sep 17 00:00:00 2001 From: Weina Ji Date: Tue, 12 Dec 2023 13:59:59 +0100 Subject: [PATCH 05/31] fix Sonar code analysis --- src/coreneuron/io/nrn2core_direct.h | 25 +++++++------- src/coreneuron/io/nrn_setup.cpp | 38 ++++++++++++---------- src/coreneuron/io/reports/report_event.hpp | 2 +- src/nrniv/nrncore_write/io/nrncore_io.cpp | 18 ++++++---- 4 files changed, 47 insertions(+), 36 deletions(-) diff --git a/src/coreneuron/io/nrn2core_direct.h b/src/coreneuron/io/nrn2core_direct.h index fc89c15ce5..b39865cdf4 100644 --- a/src/coreneuron/io/nrn2core_direct.h +++ b/src/coreneuron/io/nrn2core_direct.h @@ -96,18 +96,19 @@ extern int (*nrn2core_get_dat2_vecplay_inst_)(int tid, extern void (*nrn2core_part2_clean_)(); -extern void (*nrn2core_get_dat3_cell_count)(int& cell_count); -extern void (*nrn2core_get_dat3_cellmapping)(int i, int& gid, int& nsec, int& nseg, int& n_seclist); -extern void (*nrn2core_get_dat3_secmapping)(int i_c, - int i_sec, - std::string& segname, - int& nsec, - int& nseg, - size_t& total_lfp_factors, - int& n_electrode, - std::vector& data_sec, - std::vector& data_seg, - std::vector& data_lfp); +extern const void (*nrn2core_get_dat3_cell_count)(int& cell_count); +extern const void ( + *nrn2core_get_dat3_cellmapping)(int i, int& gid, int& nsec, int& nseg, int& n_seclist); +extern const void (*nrn2core_get_dat3_secmapping)(int i_c, + int i_sec, + std::string& segname, + int& nsec, + int& nseg, + size_t& total_lfp_factors, + int& n_electrode, + std::vector& data_sec, + std::vector& data_seg, + std::vector& data_lfp); /* what variables to send back to NEURON on each time step */ extern void (*nrn2core_get_trajectory_requests_)(int tid, diff --git a/src/coreneuron/io/nrn_setup.cpp b/src/coreneuron/io/nrn_setup.cpp index 232af55788..eb56e9cee3 100644 --- a/src/coreneuron/io/nrn_setup.cpp +++ b/src/coreneuron/io/nrn_setup.cpp @@ -73,18 +73,18 @@ int (*nrn2core_all_spike_vectors_return_)(std::vector& spikevec, std::ve void (*nrn2core_all_weights_return_)(std::vector& weights); -void (*nrn2core_get_dat3_cell_count)(int& cell_count); -void (*nrn2core_get_dat3_cellmapping)(int i, int& gid, int& nsec, int& nseg, int& n_seclist); -void (*nrn2core_get_dat3_secmapping)(int i_c, - int i_sec, - std::string& segname, - int& nsec, - int& nseg, - size_t& total_lfp_factors, - int& n_electrode, - std::vector& data_sec, - std::vector& data_seg, - std::vector& data_lfp); +const void (*nrn2core_get_dat3_cell_count)(int& cell_count); +const void (*nrn2core_get_dat3_cellmapping)(int i, int& gid, int& nsec, int& nseg, int& n_seclist); +const void (*nrn2core_get_dat3_secmapping)(int i_c, + int i_sec, + std::string& segname, + int& nsec, + int& nseg, + size_t& total_lfp_factors, + int& n_electrode, + std::vector& data_sec, + std::vector& data_seg, + std::vector& data_lfp); // file format defined in cooperation with nrncore/src/nrniv/nrnbbcore_write.cpp // single integers are ascii one per line. arrays are binary int or double // Note that regardless of the gid contents of a group, since all gids are @@ -951,12 +951,17 @@ void read_phase3(NrnThread& nt, UserParams& userParams) { nrn2core_get_dat3_cell_count(count); /** for every neuron */ for (int i = 0; i < count; i++) { - int gid, t_sec, t_seg, nseclist; + int gid; + int t_sec; + int t_seg; + int nseclist; nrn2core_get_dat3_cellmapping(i, gid, t_sec, t_seg, nseclist); - CellMapping* cmap = new CellMapping(gid); + auto cmap = new CellMapping(gid); for (int j = 0; j < nseclist; j++) { std::string sclname; - int n_sec, n_seg, n_electrodes; + int n_sec; + int n_seg; + int n_electrodes; size_t total_lfp_factors; std::vector data_sec; std::vector data_seg; @@ -971,9 +976,8 @@ void read_phase3(NrnThread& nt, UserParams& userParams) { data_sec, data_seg, data_lfp); - SecMapping* smap = new SecMapping(); + auto smap = new SecMapping(); smap->name = sclname; - int factor_offset = 0; for (int i_seg = 0; i_seg < n_seg; i_seg++) { smap->add_segment(data_sec[i_seg], data_seg[i_seg]); ntmapping->add_segment_id(data_seg[i_seg]); diff --git a/src/coreneuron/io/reports/report_event.hpp b/src/coreneuron/io/reports/report_event.hpp index acabe2606c..e019fe6582 100644 --- a/src/coreneuron/io/reports/report_event.hpp +++ b/src/coreneuron/io/reports/report_event.hpp @@ -44,7 +44,7 @@ class ReportEvent: public DiscreteEvent { bool require_checkpoint() override; void summation_alu(NrnThread* nt); void lfp_calc(NrnThread* nt); - virtual int type() const override { + int type() const override { return ReportEventType; } diff --git a/src/nrniv/nrncore_write/io/nrncore_io.cpp b/src/nrniv/nrncore_write/io/nrncore_io.cpp index ed0dd2d9b5..88cd9fee72 100644 --- a/src/nrniv/nrncore_write/io/nrncore_io.cpp +++ b/src/nrniv/nrncore_write/io/nrncore_io.cpp @@ -528,7 +528,7 @@ void write_nrnthread_task(const char* path, CellGroup* cgs, bool append) { } /** @brief dump mapping information to gid_3.dat file */ -void nrn_write_mapping_info(const char* path, int gid, NrnMappingInfo& minfo) { +void nrn_write_mapping_info(const char* path, int gid, NrnMappingInfo& /* minfo */) { /** full path of mapping file */ std::stringstream ss; ss << path << "/" << gid << "_3.dat"; @@ -549,16 +549,22 @@ void nrn_write_mapping_info(const char* path, int gid, NrnMappingInfo& minfo) { /** all cells mapping information in NrnThread */ for (size_t i = 0; i < count; i++) { - int gid, t_sec, t_seg, n_seclist; - nrnthread_dat3_cellmapping(i, gid, t_sec, t_seg, n_seclist); + int cgid; + int t_sec; + int t_seg; + int n_seclist; + nrnthread_dat3_cellmapping(i, cgid, t_sec, t_seg, n_seclist); /** gid, #section, #compartments, #sectionlists */ - fprintf(f, "%d %d %d %zd\n", gid, t_sec, t_seg, n_seclist); + fprintf(f, "%d %d %d %zd\n", cgid, t_sec, t_seg, n_seclist); for (size_t j = 0; j < n_seclist; j++) { std::string sclname; - int nsec, nseg, n_electrodes; + int nsec; + int nseg; + int n_electrodes; size_t total_lfp_factors; - std::vector data_sec, data_seg; + std::vector data_sec; + std::vector data_seg; std::vector data_lfp; nrnthread_dat3_secmapping(i, j, From 2bead03f826f3eb1765d8dd62468615e711c3352 Mon Sep 17 00:00:00 2001 From: Weina Ji Date: Tue, 12 Dec 2023 14:45:31 +0100 Subject: [PATCH 06/31] fix sonar check --- src/nrniv/nrncore_write/io/nrncore_io.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/nrniv/nrncore_write/io/nrncore_io.cpp b/src/nrniv/nrncore_write/io/nrncore_io.cpp index 88cd9fee72..46e0913ce5 100644 --- a/src/nrniv/nrncore_write/io/nrncore_io.cpp +++ b/src/nrniv/nrncore_write/io/nrncore_io.cpp @@ -528,7 +528,11 @@ void write_nrnthread_task(const char* path, CellGroup* cgs, bool append) { } /** @brief dump mapping information to gid_3.dat file */ -void nrn_write_mapping_info(const char* path, int gid, NrnMappingInfo& /* minfo */) { +void nrn_write_mapping_info(const char* path, int gid, NrnMappingInfo& minfo) { + if (minfo.size() <= 0) { + return; + } + /** full path of mapping file */ std::stringstream ss; ss << path << "/" << gid << "_3.dat"; From 9d824371490f52efd8a7ed92d3ad29de2ea569e6 Mon Sep 17 00:00:00 2001 From: Weina Ji Date: Tue, 12 Dec 2023 15:06:04 +0100 Subject: [PATCH 07/31] fix sonar check again --- src/coreneuron/io/nrn2core_direct.h | 25 ++++++++++++------------- src/coreneuron/io/nrn_setup.cpp | 24 ++++++++++++------------ 2 files changed, 24 insertions(+), 25 deletions(-) diff --git a/src/coreneuron/io/nrn2core_direct.h b/src/coreneuron/io/nrn2core_direct.h index b39865cdf4..fc89c15ce5 100644 --- a/src/coreneuron/io/nrn2core_direct.h +++ b/src/coreneuron/io/nrn2core_direct.h @@ -96,19 +96,18 @@ extern int (*nrn2core_get_dat2_vecplay_inst_)(int tid, extern void (*nrn2core_part2_clean_)(); -extern const void (*nrn2core_get_dat3_cell_count)(int& cell_count); -extern const void ( - *nrn2core_get_dat3_cellmapping)(int i, int& gid, int& nsec, int& nseg, int& n_seclist); -extern const void (*nrn2core_get_dat3_secmapping)(int i_c, - int i_sec, - std::string& segname, - int& nsec, - int& nseg, - size_t& total_lfp_factors, - int& n_electrode, - std::vector& data_sec, - std::vector& data_seg, - std::vector& data_lfp); +extern void (*nrn2core_get_dat3_cell_count)(int& cell_count); +extern void (*nrn2core_get_dat3_cellmapping)(int i, int& gid, int& nsec, int& nseg, int& n_seclist); +extern void (*nrn2core_get_dat3_secmapping)(int i_c, + int i_sec, + std::string& segname, + int& nsec, + int& nseg, + size_t& total_lfp_factors, + int& n_electrode, + std::vector& data_sec, + std::vector& data_seg, + std::vector& data_lfp); /* what variables to send back to NEURON on each time step */ extern void (*nrn2core_get_trajectory_requests_)(int tid, diff --git a/src/coreneuron/io/nrn_setup.cpp b/src/coreneuron/io/nrn_setup.cpp index eb56e9cee3..7b79fe87b7 100644 --- a/src/coreneuron/io/nrn_setup.cpp +++ b/src/coreneuron/io/nrn_setup.cpp @@ -73,18 +73,18 @@ int (*nrn2core_all_spike_vectors_return_)(std::vector& spikevec, std::ve void (*nrn2core_all_weights_return_)(std::vector& weights); -const void (*nrn2core_get_dat3_cell_count)(int& cell_count); -const void (*nrn2core_get_dat3_cellmapping)(int i, int& gid, int& nsec, int& nseg, int& n_seclist); -const void (*nrn2core_get_dat3_secmapping)(int i_c, - int i_sec, - std::string& segname, - int& nsec, - int& nseg, - size_t& total_lfp_factors, - int& n_electrode, - std::vector& data_sec, - std::vector& data_seg, - std::vector& data_lfp); +void (*nrn2core_get_dat3_cell_count)(int& cell_count); +void (*nrn2core_get_dat3_cellmapping)(int i, int& gid, int& nsec, int& nseg, int& n_seclist); +void (*nrn2core_get_dat3_secmapping)(int i_c, + int i_sec, + std::string& segname, + int& nsec, + int& nseg, + size_t& total_lfp_factors, + int& n_electrode, + std::vector& data_sec, + std::vector& data_seg, + std::vector& data_lfp); // file format defined in cooperation with nrncore/src/nrniv/nrnbbcore_write.cpp // single integers are ascii one per line. arrays are binary int or double // Note that regardless of the gid contents of a group, since all gids are From 1c198c5c8b79e869ddc6e2afb4c49a3e11b10d7a Mon Sep 17 00:00:00 2001 From: Weina Ji Date: Fri, 12 Jan 2024 16:24:53 +0100 Subject: [PATCH 08/31] review comment, split read_phase3 --- src/coreneuron/io/nrn_setup.cpp | 99 +++------------------------------ src/coreneuron/io/phase3.cpp | 98 ++++++++++++++++++++++++++++++++ src/coreneuron/io/phase3.hpp | 22 ++++++++ 3 files changed, 128 insertions(+), 91 deletions(-) create mode 100644 src/coreneuron/io/phase3.cpp create mode 100644 src/coreneuron/io/phase3.hpp diff --git a/src/coreneuron/io/nrn_setup.cpp b/src/coreneuron/io/nrn_setup.cpp index 7b79fe87b7..7e82ae18d0 100644 --- a/src/coreneuron/io/nrn_setup.cpp +++ b/src/coreneuron/io/nrn_setup.cpp @@ -34,6 +34,7 @@ #include "coreneuron/utils/nrnoc_aux.hpp" #include "coreneuron/io/phase1.hpp" #include "coreneuron/io/phase2.hpp" +#include "coreneuron/io/phase3.hpp" #include "coreneuron/io/mech_report.h" #include "coreneuron/io/reports/nrnreport.hpp" @@ -73,18 +74,6 @@ int (*nrn2core_all_spike_vectors_return_)(std::vector& spikevec, std::ve void (*nrn2core_all_weights_return_)(std::vector& weights); -void (*nrn2core_get_dat3_cell_count)(int& cell_count); -void (*nrn2core_get_dat3_cellmapping)(int i, int& gid, int& nsec, int& nseg, int& n_seclist); -void (*nrn2core_get_dat3_secmapping)(int i_c, - int i_sec, - std::string& segname, - int& nsec, - int& nseg, - size_t& total_lfp_factors, - int& n_electrode, - std::vector& data_sec, - std::vector& data_seg, - std::vector& data_lfp); // file format defined in cooperation with nrncore/src/nrniv/nrnbbcore_write.cpp // single integers are ascii one per line. arrays are binary int or double // Note that regardless of the gid contents of a group, since all gids are @@ -940,90 +929,18 @@ void read_phase2(NrnThread& nt, UserParams& userParams) { /** read mapping information for neurons */ void read_phase3(NrnThread& nt, UserParams& userParams) { - /** restore checkpoint state (before restoring queue items */ - auto& F = userParams.file_reader[nt.id]; - F.restore_checkpoint(); - /** mapping information for all neurons in single NrnThread */ NrnThreadMappingInfo* ntmapping = new NrnThreadMappingInfo(); + + Phase3 p3; if (corenrn_embedded) { - int count; - nrn2core_get_dat3_cell_count(count); - /** for every neuron */ - for (int i = 0; i < count; i++) { - int gid; - int t_sec; - int t_seg; - int nseclist; - nrn2core_get_dat3_cellmapping(i, gid, t_sec, t_seg, nseclist); - auto cmap = new CellMapping(gid); - for (int j = 0; j < nseclist; j++) { - std::string sclname; - int n_sec; - int n_seg; - int n_electrodes; - size_t total_lfp_factors; - std::vector data_sec; - std::vector data_seg; - std::vector data_lfp; - nrn2core_get_dat3_secmapping(i, - j, - sclname, - n_sec, - n_seg, - total_lfp_factors, - n_electrodes, - data_sec, - data_seg, - data_lfp); - auto smap = new SecMapping(); - smap->name = sclname; - for (int i_seg = 0; i_seg < n_seg; i_seg++) { - smap->add_segment(data_sec[i_seg], data_seg[i_seg]); - ntmapping->add_segment_id(data_seg[i_seg]); - int factor_offset = i_seg * n_electrodes; - if (total_lfp_factors > 0) { - // Abort if the factors contains a NaN - nrn_assert(count_if(data_lfp.begin(), data_lfp.end(), [](double d) { - return std::isnan(d); - }) == 0); - std::vector segment_factors(data_lfp.begin() + factor_offset, - data_lfp.begin() + factor_offset + - n_electrodes); - cmap->add_segment_lfp_factor(data_seg[i], segment_factors); - } - } - cmap->add_sec_map(smap); - } - ntmapping->add_cell_mapping(cmap); - } + p3.read_direct(ntmapping); } else { - int count = 0; - - F.read_mapping_cell_count(&count); - - /** number of cells in mapping file should equal to cells in NrnThread */ - nrn_assert(count == nt.ncell); - - /** for every neuron */ - for (int i = 0; i < nt.ncell; i++) { - int gid, nsec, nseg, nseclist; - - // read counts - F.read_mapping_count(&gid, &nsec, &nseg, &nseclist); - - CellMapping* cmap = new CellMapping(gid); - - // read section-segment mapping for every section list - for (int j = 0; j < nseclist; j++) { - SecMapping* smap = new SecMapping(); - F.read_mapping_info(smap, ntmapping, cmap); - cmap->add_sec_map(smap); - } - - ntmapping->add_cell_mapping(cmap); - } + auto& F = userParams.file_reader[nt.id]; + F.restore_checkpoint(); + p3.read_file(F, ntmapping); } + // make number #cells match with mapping size nrn_assert((int) ntmapping->size() == nt.ncell); diff --git a/src/coreneuron/io/phase3.cpp b/src/coreneuron/io/phase3.cpp new file mode 100644 index 0000000000..1ef10a4ba9 --- /dev/null +++ b/src/coreneuron/io/phase3.cpp @@ -0,0 +1,98 @@ +/* +# ============================================================================= +# Copyright (c) 2016 - 2024 Blue Brain Project/EPFL +# +# See top-level LICENSE file for details. +# ============================================================================= +*/ +#include + +#include "coreneuron/io/phase3.hpp" + +void (*nrn2core_get_dat3_cell_count)(int& cell_count); +void (*nrn2core_get_dat3_cellmapping)(int i, int& gid, int& nsec, int& nseg, int& n_seclist); +void (*nrn2core_get_dat3_secmapping)(int i_c, + int i_sec, + std::string& segname, + int& nsec, + int& nseg, + size_t& total_lfp_factors, + int& n_electrode, + std::vector& data_sec, + std::vector& data_seg, + std::vector& data_lfp); + +namespace coreneuron { +void Phase3::read_file(FileHandler& F, NrnThreadMappingInfo* ntmapping) { + int count = 0; + F.read_mapping_cell_count(&count); + /** for every neuron */ + for (int i = 0; i < count; i++) { + int gid, nsec, nseg, nseclist; + // read counts + F.read_mapping_count(&gid, &nsec, &nseg, &nseclist); + CellMapping* cmap = new CellMapping(gid); + // read section-segment mapping for every section list + for (int j = 0; j < nseclist; j++) { + SecMapping* smap = new SecMapping(); + F.read_mapping_info(smap, ntmapping, cmap); + cmap->add_sec_map(smap); + } + ntmapping->add_cell_mapping(cmap); + } +} + +void Phase3::read_direct(NrnThreadMappingInfo* ntmapping) { + int count; + nrn2core_get_dat3_cell_count(count); + /** for every neuron */ + for (int i = 0; i < count; i++) { + int gid; + int t_sec; + int t_seg; + int nseclist; + nrn2core_get_dat3_cellmapping(i, gid, t_sec, t_seg, nseclist); + auto cmap = new CellMapping(gid); + for (int j = 0; j < nseclist; j++) { + std::string sclname; + int n_sec; + int n_seg; + int n_electrodes; + size_t total_lfp_factors; + std::vector data_sec; + std::vector data_seg; + std::vector data_lfp; + nrn2core_get_dat3_secmapping(i, + j, + sclname, + n_sec, + n_seg, + total_lfp_factors, + n_electrodes, + data_sec, + data_seg, + data_lfp); + auto smap = new SecMapping(); + smap->name = sclname; + for (int i_seg = 0; i_seg < n_seg; i_seg++) { + smap->add_segment(data_sec[i_seg], data_seg[i_seg]); + ntmapping->add_segment_id(data_seg[i_seg]); + int factor_offset = i_seg * n_electrodes; + if (total_lfp_factors > 0) { + // Abort if the factors contains a NaN + nrn_assert(count_if(data_lfp.begin(), data_lfp.end(), [](double d) { + return std::isnan(d); + }) == 0); + std::vector segment_factors(data_lfp.begin() + factor_offset, + data_lfp.begin() + factor_offset + + n_electrodes); + cmap->add_segment_lfp_factor(data_seg[i], segment_factors); + } + } + cmap->add_sec_map(smap); + } + ntmapping->add_cell_mapping(cmap); + } +} + +} // namespace coreneuron diff --git a/src/coreneuron/io/phase3.hpp b/src/coreneuron/io/phase3.hpp new file mode 100644 index 0000000000..7ead8c497e --- /dev/null +++ b/src/coreneuron/io/phase3.hpp @@ -0,0 +1,22 @@ +/* +# ============================================================================= +# Copyright (c) 2016 - 2024 Blue Brain Project/EPFL +# +# See top-level LICENSE file for details. +# ============================================================================= +*/ + +#pragma once + +#include "coreneuron/io/nrn_filehandler.hpp" +#include "coreneuron/io/user_params.hpp" + +namespace coreneuron { +struct NrnThread; + +class Phase3 { + public: + void read_file(FileHandler& F, NrnThreadMappingInfo* ntmapping); + void read_direct(NrnThreadMappingInfo* ntmapping); +}; +} // namespace coreneuron From f6181be5c1a978e61885875d5bf3d55854660ef8 Mon Sep 17 00:00:00 2001 From: Weina Ji Date: Sat, 13 Jan 2024 17:42:20 +0100 Subject: [PATCH 09/31] fix symbol name mangling for nrn2core_get_dat3_secmapping_ --- src/coreneuron/io/nrn2core_direct.h | 25 ++++----- src/coreneuron/io/phase3.cpp | 51 ++++++++++--------- src/coreneuron/io/phase3.hpp | 3 +- .../callbacks/nrncore_callbacks.h | 8 +-- 4 files changed, 45 insertions(+), 42 deletions(-) diff --git a/src/coreneuron/io/nrn2core_direct.h b/src/coreneuron/io/nrn2core_direct.h index fc89c15ce5..7c693260af 100644 --- a/src/coreneuron/io/nrn2core_direct.h +++ b/src/coreneuron/io/nrn2core_direct.h @@ -96,18 +96,19 @@ extern int (*nrn2core_get_dat2_vecplay_inst_)(int tid, extern void (*nrn2core_part2_clean_)(); -extern void (*nrn2core_get_dat3_cell_count)(int& cell_count); -extern void (*nrn2core_get_dat3_cellmapping)(int i, int& gid, int& nsec, int& nseg, int& n_seclist); -extern void (*nrn2core_get_dat3_secmapping)(int i_c, - int i_sec, - std::string& segname, - int& nsec, - int& nseg, - size_t& total_lfp_factors, - int& n_electrode, - std::vector& data_sec, - std::vector& data_seg, - std::vector& data_lfp); +extern void (*nrn2core_get_dat3_cell_count_)(int& cell_count); +extern void ( + *nrn2core_get_dat3_cellmapping_)(int i, int& gid, int& nsec, int& nseg, int& n_seclist); +extern void (*nrn2core_get_dat3_secmapping_)(int i_c, + int i_sec, + std::string& sclname, + int& nsec, + int& nseg, + size_t& total_lfp_factors, + int& n_electrodes, + std::vector& data_sec, + std::vector& data_seg, + std::vector& data_lfp); /* what variables to send back to NEURON on each time step */ extern void (*nrn2core_get_trajectory_requests_)(int tid, diff --git a/src/coreneuron/io/phase3.cpp b/src/coreneuron/io/phase3.cpp index 1ef10a4ba9..2dde22ad00 100644 --- a/src/coreneuron/io/phase3.cpp +++ b/src/coreneuron/io/phase3.cpp @@ -9,18 +9,21 @@ #include "coreneuron/io/phase3.hpp" -void (*nrn2core_get_dat3_cell_count)(int& cell_count); -void (*nrn2core_get_dat3_cellmapping)(int i, int& gid, int& nsec, int& nseg, int& n_seclist); -void (*nrn2core_get_dat3_secmapping)(int i_c, - int i_sec, - std::string& segname, - int& nsec, - int& nseg, - size_t& total_lfp_factors, - int& n_electrode, - std::vector& data_sec, - std::vector& data_seg, - std::vector& data_lfp); +extern "C" { // avoid symbol name mangling for nrn2core_get_dat3_secmapping_ + // caused by dual ABI for std::string +void (*nrn2core_get_dat3_cell_count_)(int& cell_count); +void (*nrn2core_get_dat3_cellmapping_)(int i, int& gid, int& nsec, int& nseg, int& n_seclist); +void (*nrn2core_get_dat3_secmapping_)(int i_c, + int i_sec, + std::string& sclname, + int& nsec, + int& nseg, + size_t& total_lfp_factors, + int& n_electrodes, + std::vector& data_sec, + std::vector& data_seg, + std::vector& data_lfp); +} namespace coreneuron { void Phase3::read_file(FileHandler& F, NrnThreadMappingInfo* ntmapping) { @@ -44,14 +47,14 @@ void Phase3::read_file(FileHandler& F, NrnThreadMappingInfo* ntmapping) { void Phase3::read_direct(NrnThreadMappingInfo* ntmapping) { int count; - nrn2core_get_dat3_cell_count(count); + nrn2core_get_dat3_cell_count_(count); /** for every neuron */ for (int i = 0; i < count; i++) { int gid; int t_sec; int t_seg; int nseclist; - nrn2core_get_dat3_cellmapping(i, gid, t_sec, t_seg, nseclist); + nrn2core_get_dat3_cellmapping_(i, gid, t_sec, t_seg, nseclist); auto cmap = new CellMapping(gid); for (int j = 0; j < nseclist; j++) { std::string sclname; @@ -62,16 +65,16 @@ void Phase3::read_direct(NrnThreadMappingInfo* ntmapping) { std::vector data_sec; std::vector data_seg; std::vector data_lfp; - nrn2core_get_dat3_secmapping(i, - j, - sclname, - n_sec, - n_seg, - total_lfp_factors, - n_electrodes, - data_sec, - data_seg, - data_lfp); + nrn2core_get_dat3_secmapping_(i, + j, + sclname, + n_sec, + n_seg, + total_lfp_factors, + n_electrodes, + data_sec, + data_seg, + data_lfp); auto smap = new SecMapping(); smap->name = sclname; for (int i_seg = 0; i_seg < n_seg; i_seg++) { diff --git a/src/coreneuron/io/phase3.hpp b/src/coreneuron/io/phase3.hpp index 7ead8c497e..eae88a437a 100644 --- a/src/coreneuron/io/phase3.hpp +++ b/src/coreneuron/io/phase3.hpp @@ -9,10 +9,9 @@ #pragma once #include "coreneuron/io/nrn_filehandler.hpp" -#include "coreneuron/io/user_params.hpp" namespace coreneuron { -struct NrnThread; +struct NrnThreadMappingInfo; class Phase3 { public: diff --git a/src/nrniv/nrncore_write/callbacks/nrncore_callbacks.h b/src/nrniv/nrncore_write/callbacks/nrncore_callbacks.h index 46007da83c..b93b0cd53f 100644 --- a/src/nrniv/nrncore_write/callbacks/nrncore_callbacks.h +++ b/src/nrniv/nrncore_write/callbacks/nrncore_callbacks.h @@ -105,7 +105,7 @@ void nrnthread_dat3_secmapping(int i_c, int& nsec, int& nseg, size_t& total_lfp_factors, - int& n_electrode, + int& n_electrodes, std::vector& data_sec, std::vector& data_seg, std::vector& data_lfp); @@ -227,9 +227,9 @@ static core2nrn_callback_t cnbs[] = { {"nrn2core_get_dat2_vecplay_", (CNB) nrnthread_dat2_vecplay}, {"nrn2core_get_dat2_vecplay_inst_", (CNB) nrnthread_dat2_vecplay_inst}, {"nrn2core_part2_clean_", (CNB) part2_clean}, - {"nrn2core_get_dat3_cell_count", (CNB) nrnthread_dat3_cell_count}, - {"nrn2core_get_dat3_cellmapping", (CNB) nrnthread_dat3_cellmapping}, - {"nrn2core_get_dat3_secmapping", (CNB) nrnthread_dat3_secmapping}, + {"nrn2core_get_dat3_cell_count_", (CNB) nrnthread_dat3_cell_count}, + {"nrn2core_get_dat3_cellmapping_", (CNB) nrnthread_dat3_cellmapping}, + {"nrn2core_get_dat3_secmapping_", (CNB) nrnthread_dat3_secmapping}, {"nrn2core_get_trajectory_requests_", (CNB) nrnthread_get_trajectory_requests}, {"nrn2core_trajectory_values_", (CNB) nrnthread_trajectory_values}, From 2b3c285ef313266a505d076bfdcc93139108b1a0 Mon Sep 17 00:00:00 2001 From: Weina Ji Date: Sun, 14 Jan 2024 19:07:15 +0100 Subject: [PATCH 10/31] small improvement --- src/coreneuron/io/phase3.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/coreneuron/io/phase3.cpp b/src/coreneuron/io/phase3.cpp index 2dde22ad00..ca73ac829c 100644 --- a/src/coreneuron/io/phase3.cpp +++ b/src/coreneuron/io/phase3.cpp @@ -8,9 +8,10 @@ #include #include "coreneuron/io/phase3.hpp" +// Where nrn2core_get_dat3_secmapping_ is declared with extern "C" to avoid symbol name mangling +// caused by dual ABI for std::string +#include "coreneuron/io/nrn2core_direct.h" -extern "C" { // avoid symbol name mangling for nrn2core_get_dat3_secmapping_ - // caused by dual ABI for std::string void (*nrn2core_get_dat3_cell_count_)(int& cell_count); void (*nrn2core_get_dat3_cellmapping_)(int i, int& gid, int& nsec, int& nseg, int& n_seclist); void (*nrn2core_get_dat3_secmapping_)(int i_c, @@ -23,7 +24,6 @@ void (*nrn2core_get_dat3_secmapping_)(int i_c, std::vector& data_sec, std::vector& data_seg, std::vector& data_lfp); -} namespace coreneuron { void Phase3::read_file(FileHandler& F, NrnThreadMappingInfo* ntmapping) { From 0eddb74c665d60ff6e4f45f6b8c17a640dc16391 Mon Sep 17 00:00:00 2001 From: Weina Ji Date: Mon, 4 Mar 2024 16:54:44 +0100 Subject: [PATCH 11/31] add ringtests --- test/external/CMakeLists.txt | 2 +- test/external/ringtest/CMakeLists.txt | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/test/external/CMakeLists.txt b/test/external/CMakeLists.txt index 7a9c8f3e63..7910aa7509 100644 --- a/test/external/CMakeLists.txt +++ b/test/external/CMakeLists.txt @@ -6,7 +6,7 @@ include(FetchContent) FetchContent_Declare( ringtest - GIT_REPOSITORY https://github.com/neuronsimulator/ringtest + GIT_REPOSITORY https://github.com/neuronsimulator/ringtest.git GIT_TAG ee24c8 SOURCE_DIR ${PROJECT_SOURCE_DIR}/external/tests/ringtest) diff --git a/test/external/ringtest/CMakeLists.txt b/test/external/ringtest/CMakeLists.txt index d082f1fd99..45425a6dea 100644 --- a/test/external/ringtest/CMakeLists.txt +++ b/test/external/ringtest/CMakeLists.txt @@ -46,6 +46,24 @@ nrn_add_test( ENVIRONMENT NEURON_INIT_MPI=1 COMMAND ${ringtest_python} -tstop 100) +nrn_add_test( + GROUP external_ringtest + NAME coreneuron_mpi_reportmapping_directmode + PRELOAD_SANITIZER + REQUIRES mod_compatibility mpi python + PROCESSORS ${ringtest_mpi_ranks} + ENVIRONMENT NEURON_INIT_MPI=1 LIBSONATA_ZERO_BASED_GIDS=1 + COMMAND ${ringtest_python} -tstop 100 -coreneuron -reportmapping) + +nrn_add_test( + GROUP external_ringtest + NAME coreneuron_mpi_reportmapping_filemode + PRELOAD_SANITIZER + REQUIRES mod_compatibility mpi python + PROCESSORS ${ringtest_mpi_ranks} + ENVIRONMENT NEURON_INIT_MPI=1 LIBSONATA_ZERO_BASED_GIDS=1 + COMMAND ${ringtest_python} -tstop 100 -coreneuron -reportmapping -filemode) + foreach(processor cpu gpu) if("${processor}" STREQUAL "gpu") set(gpu_arg -gpu) From a99de7f187d2f842fe8225324d0085593715eca5 Mon Sep 17 00:00:00 2001 From: Weina Ji Date: Tue, 5 Mar 2024 18:29:28 +0100 Subject: [PATCH 12/31] add ringtest --- src/coreneuron/io/nrn_setup.cpp | 4 ++-- test/external/CMakeLists.txt | 4 ++-- test/external/ringtest/CMakeLists.txt | 24 ++++++++++++++++++++++++ 3 files changed, 28 insertions(+), 4 deletions(-) diff --git a/src/coreneuron/io/nrn_setup.cpp b/src/coreneuron/io/nrn_setup.cpp index 7e82ae18d0..888f07949a 100644 --- a/src/coreneuron/io/nrn_setup.cpp +++ b/src/coreneuron/io/nrn_setup.cpp @@ -517,7 +517,7 @@ void nrn_setup(const char* filesdat, } if (is_mapping_needed) - coreneuron::phase_wrapper(userParams, corenrn_embedded); + coreneuron::phase_wrapper(userParams, !corenrn_file_mode); *mindelay = set_mindelay(*mindelay); @@ -933,7 +933,7 @@ void read_phase3(NrnThread& nt, UserParams& userParams) { NrnThreadMappingInfo* ntmapping = new NrnThreadMappingInfo(); Phase3 p3; - if (corenrn_embedded) { + if (corenrn_embedded && !corenrn_file_mode) { p3.read_direct(ntmapping); } else { auto& F = userParams.file_reader[nt.id]; diff --git a/test/external/CMakeLists.txt b/test/external/CMakeLists.txt index 7910aa7509..892286d66b 100644 --- a/test/external/CMakeLists.txt +++ b/test/external/CMakeLists.txt @@ -6,8 +6,8 @@ include(FetchContent) FetchContent_Declare( ringtest - GIT_REPOSITORY https://github.com/neuronsimulator/ringtest.git - GIT_TAG ee24c8 + GIT_REPOSITORY https://github.com/neuronsimulator/ringtest + GIT_TAG 9ab24ab5fb9d93b9ca8626ac2dafc514e142b9d6 SOURCE_DIR ${PROJECT_SOURCE_DIR}/external/tests/ringtest) FetchContent_Declare( diff --git a/test/external/ringtest/CMakeLists.txt b/test/external/ringtest/CMakeLists.txt index 45425a6dea..fbc9c2fc39 100644 --- a/test/external/ringtest/CMakeLists.txt +++ b/test/external/ringtest/CMakeLists.txt @@ -148,3 +148,27 @@ endforeach() nrn_add_test_group_comparison( GROUP external_ringtest REFERENCE_OUTPUT asciispikes::external/tests/ringtest/reference_data/spk1.100ms.std.ref) + +if(CORENRN_ENABLE_REPORTING) + find_program(H5DIFF_EXECUTABLE "h5diff") + set(reference_path "${PROJECT_BINARY_DIR}/test/external/tests/ringtest/reference_data/soma.ref.h5") + cpp_cc_build_time_copy(INPUT "${PROJECT_SOURCE_DIR}/external/tests/ringtest/reference_data/soma.ref.h5" + OUTPUT "${reference_path}") + foreach(testfolder coreneuron_mpi_reportmapping_directmode coreneuron_mpi_reportmapping_filemode) + if(H5DIFF_EXECUTABLE) + add_test( + NAME external_ringtest::compare_soma_report_${testfolder} + COMMAND "h5diff" ${PROJECT_BINARY_DIR}/test/external_ringtest/${testfolder}/soma.h5 + ${reference_path}) + else() + add_test( + NAME external_ringtest::compare_soma_report_${testfolder} + COMMAND python -c "import h5py; \ + file = h5py.File(\"${PROJECT_BINARY_DIR}/test/external_ringtest/${testfolder}/soma.h5\"); \ + ref_file = h5py.File(\"${reference_path}\"); \ + data = set(file[\"/report/default/mapping/node_ids\"]); \ + ref_data = set(ref_file[\"/report/default/mapping/node_ids\"]); \ + assert data == ref_data;") + endif() + endforeach() +endif() From 7f5b26adc4b4f0538185e7431bb9909db666903f Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 5 Mar 2024 17:31:39 +0000 Subject: [PATCH 13/31] Fix formatting --- test/external/ringtest/CMakeLists.txt | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/test/external/ringtest/CMakeLists.txt b/test/external/ringtest/CMakeLists.txt index fbc9c2fc39..5237321713 100644 --- a/test/external/ringtest/CMakeLists.txt +++ b/test/external/ringtest/CMakeLists.txt @@ -151,19 +151,22 @@ nrn_add_test_group_comparison( if(CORENRN_ENABLE_REPORTING) find_program(H5DIFF_EXECUTABLE "h5diff") - set(reference_path "${PROJECT_BINARY_DIR}/test/external/tests/ringtest/reference_data/soma.ref.h5") - cpp_cc_build_time_copy(INPUT "${PROJECT_SOURCE_DIR}/external/tests/ringtest/reference_data/soma.ref.h5" - OUTPUT "${reference_path}") + set(reference_path + "${PROJECT_BINARY_DIR}/test/external/tests/ringtest/reference_data/soma.ref.h5") + cpp_cc_build_time_copy( + INPUT "${PROJECT_SOURCE_DIR}/external/tests/ringtest/reference_data/soma.ref.h5" + OUTPUT "${reference_path}") foreach(testfolder coreneuron_mpi_reportmapping_directmode coreneuron_mpi_reportmapping_filemode) if(H5DIFF_EXECUTABLE) + add_test(NAME external_ringtest::compare_soma_report_${testfolder} + COMMAND "h5diff" ${PROJECT_BINARY_DIR}/test/external_ringtest/${testfolder}/soma.h5 + ${reference_path}) + else() add_test( NAME external_ringtest::compare_soma_report_${testfolder} - COMMAND "h5diff" ${PROJECT_BINARY_DIR}/test/external_ringtest/${testfolder}/soma.h5 - ${reference_path}) - else() - add_test( - NAME external_ringtest::compare_soma_report_${testfolder} - COMMAND python -c "import h5py; \ + COMMAND + python -c + "import h5py; \ file = h5py.File(\"${PROJECT_BINARY_DIR}/test/external_ringtest/${testfolder}/soma.h5\"); \ ref_file = h5py.File(\"${reference_path}\"); \ data = set(file[\"/report/default/mapping/node_ids\"]); \ From 97d3669542af48249db4b5b9bef02787b7203381 Mon Sep 17 00:00:00 2001 From: Weina Ji Date: Wed, 6 Mar 2024 10:12:49 +0100 Subject: [PATCH 14/31] include cstdint for uint32_t --- src/coreneuron/io/nrn2core_direct.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/coreneuron/io/nrn2core_direct.h b/src/coreneuron/io/nrn2core_direct.h index 7c693260af..2c81fda5a7 100644 --- a/src/coreneuron/io/nrn2core_direct.h +++ b/src/coreneuron/io/nrn2core_direct.h @@ -10,6 +10,7 @@ #include #include +#include extern "C" { // The callbacks into nrn/src/nrniv/nrnbbcore_write.cpp to get From ab2a7d4c736e6a3ebd982ea1b0d3b6e7fb6bb202 Mon Sep 17 00:00:00 2001 From: Weina Ji Date: Thu, 7 Mar 2024 10:47:50 +0100 Subject: [PATCH 15/31] REQUIRES coreneuron for the new ringtests --- test/external/ringtest/CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/external/ringtest/CMakeLists.txt b/test/external/ringtest/CMakeLists.txt index 5237321713..3d7fac1cc0 100644 --- a/test/external/ringtest/CMakeLists.txt +++ b/test/external/ringtest/CMakeLists.txt @@ -50,7 +50,7 @@ nrn_add_test( GROUP external_ringtest NAME coreneuron_mpi_reportmapping_directmode PRELOAD_SANITIZER - REQUIRES mod_compatibility mpi python + REQUIRES coreneuron mpi python PROCESSORS ${ringtest_mpi_ranks} ENVIRONMENT NEURON_INIT_MPI=1 LIBSONATA_ZERO_BASED_GIDS=1 COMMAND ${ringtest_python} -tstop 100 -coreneuron -reportmapping) @@ -59,7 +59,7 @@ nrn_add_test( GROUP external_ringtest NAME coreneuron_mpi_reportmapping_filemode PRELOAD_SANITIZER - REQUIRES mod_compatibility mpi python + REQUIRES coreneuron mpi python PROCESSORS ${ringtest_mpi_ranks} ENVIRONMENT NEURON_INIT_MPI=1 LIBSONATA_ZERO_BASED_GIDS=1 COMMAND ${ringtest_python} -tstop 100 -coreneuron -reportmapping -filemode) From 792385a839c936fb939b4f86e137662368251b3a Mon Sep 17 00:00:00 2001 From: Weina Ji Date: Thu, 7 Mar 2024 13:02:19 +0100 Subject: [PATCH 16/31] cmake tests for comparing soma reports after the relevant tests --- test/external/ringtest/CMakeLists.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/external/ringtest/CMakeLists.txt b/test/external/ringtest/CMakeLists.txt index 3d7fac1cc0..202b25d592 100644 --- a/test/external/ringtest/CMakeLists.txt +++ b/test/external/ringtest/CMakeLists.txt @@ -173,5 +173,7 @@ if(CORENRN_ENABLE_REPORTING) ref_data = set(ref_file[\"/report/default/mapping/node_ids\"]); \ assert data == ref_data;") endif() + set_tests_properties(external_ringtest::compare_soma_report_${testfolder} PROPERTIES + DEPENDS "external_ringtest::${testfolder}") endforeach() endif() From 9f76eea2574f0d2d4d2c260c6a98d45764a9471a Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 7 Mar 2024 12:03:59 +0000 Subject: [PATCH 17/31] Fix formatting --- test/external/ringtest/CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/external/ringtest/CMakeLists.txt b/test/external/ringtest/CMakeLists.txt index 202b25d592..152057f3d9 100644 --- a/test/external/ringtest/CMakeLists.txt +++ b/test/external/ringtest/CMakeLists.txt @@ -173,7 +173,7 @@ if(CORENRN_ENABLE_REPORTING) ref_data = set(ref_file[\"/report/default/mapping/node_ids\"]); \ assert data == ref_data;") endif() - set_tests_properties(external_ringtest::compare_soma_report_${testfolder} PROPERTIES - DEPENDS "external_ringtest::${testfolder}") + set_tests_properties(external_ringtest::compare_soma_report_${testfolder} + PROPERTIES DEPENDS "external_ringtest::${testfolder}") endforeach() endif() From 1f9bf811acac9366831d0bf072cc706c0131a1cf Mon Sep 17 00:00:00 2001 From: Weina Ji Date: Thu, 7 Mar 2024 13:10:33 +0100 Subject: [PATCH 18/31] small formatting --- test/external/ringtest/CMakeLists.txt | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/test/external/ringtest/CMakeLists.txt b/test/external/ringtest/CMakeLists.txt index 152057f3d9..9a41540a0d 100644 --- a/test/external/ringtest/CMakeLists.txt +++ b/test/external/ringtest/CMakeLists.txt @@ -167,11 +167,11 @@ if(CORENRN_ENABLE_REPORTING) COMMAND python -c "import h5py; \ - file = h5py.File(\"${PROJECT_BINARY_DIR}/test/external_ringtest/${testfolder}/soma.h5\"); \ - ref_file = h5py.File(\"${reference_path}\"); \ - data = set(file[\"/report/default/mapping/node_ids\"]); \ - ref_data = set(ref_file[\"/report/default/mapping/node_ids\"]); \ - assert data == ref_data;") + file = h5py.File(\"${PROJECT_BINARY_DIR}/test/external_ringtest/${testfolder}/soma.h5\"); \ + ref_file = h5py.File(\"${reference_path}\"); \ + data = set(file[\"/report/default/mapping/node_ids\"]); \ + ref_data = set(ref_file[\"/report/default/mapping/node_ids\"]); \ + assert data == ref_data;") endif() set_tests_properties(external_ringtest::compare_soma_report_${testfolder} PROPERTIES DEPENDS "external_ringtest::${testfolder}") From 5c7f3530e8507097d57b072971c6a685edc43c98 Mon Sep 17 00:00:00 2001 From: Weina Ji Date: Fri, 8 Mar 2024 17:15:22 +0100 Subject: [PATCH 19/31] fix tests for corneuron shared lib --- test/external/ringtest/CMakeLists.txt | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/test/external/ringtest/CMakeLists.txt b/test/external/ringtest/CMakeLists.txt index 9a41540a0d..fa4f0213cc 100644 --- a/test/external/ringtest/CMakeLists.txt +++ b/test/external/ringtest/CMakeLists.txt @@ -49,20 +49,18 @@ nrn_add_test( nrn_add_test( GROUP external_ringtest NAME coreneuron_mpi_reportmapping_directmode - PRELOAD_SANITIZER REQUIRES coreneuron mpi python PROCESSORS ${ringtest_mpi_ranks} ENVIRONMENT NEURON_INIT_MPI=1 LIBSONATA_ZERO_BASED_GIDS=1 - COMMAND ${ringtest_python} -tstop 100 -coreneuron -reportmapping) + COMMAND ${ringtest_special} -tstop 100 -coreneuron -reportmapping) nrn_add_test( GROUP external_ringtest NAME coreneuron_mpi_reportmapping_filemode - PRELOAD_SANITIZER REQUIRES coreneuron mpi python PROCESSORS ${ringtest_mpi_ranks} ENVIRONMENT NEURON_INIT_MPI=1 LIBSONATA_ZERO_BASED_GIDS=1 - COMMAND ${ringtest_python} -tstop 100 -coreneuron -reportmapping -filemode) + COMMAND ${ringtest_special} -tstop 100 -coreneuron -reportmapping -filemode) foreach(processor cpu gpu) if("${processor}" STREQUAL "gpu") From 59d9e2c79fe8e1f51bf71d3ae27c3f1c0a38942a Mon Sep 17 00:00:00 2001 From: Weina Ji Date: Sun, 10 Mar 2024 12:10:51 +0100 Subject: [PATCH 20/31] enable tests when reporting is ON --- test/external/ringtest/CMakeLists.txt | 34 ++++++++++++++------------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/test/external/ringtest/CMakeLists.txt b/test/external/ringtest/CMakeLists.txt index fa4f0213cc..bea35ce214 100644 --- a/test/external/ringtest/CMakeLists.txt +++ b/test/external/ringtest/CMakeLists.txt @@ -46,22 +46,6 @@ nrn_add_test( ENVIRONMENT NEURON_INIT_MPI=1 COMMAND ${ringtest_python} -tstop 100) -nrn_add_test( - GROUP external_ringtest - NAME coreneuron_mpi_reportmapping_directmode - REQUIRES coreneuron mpi python - PROCESSORS ${ringtest_mpi_ranks} - ENVIRONMENT NEURON_INIT_MPI=1 LIBSONATA_ZERO_BASED_GIDS=1 - COMMAND ${ringtest_special} -tstop 100 -coreneuron -reportmapping) - -nrn_add_test( - GROUP external_ringtest - NAME coreneuron_mpi_reportmapping_filemode - REQUIRES coreneuron mpi python - PROCESSORS ${ringtest_mpi_ranks} - ENVIRONMENT NEURON_INIT_MPI=1 LIBSONATA_ZERO_BASED_GIDS=1 - COMMAND ${ringtest_special} -tstop 100 -coreneuron -reportmapping -filemode) - foreach(processor cpu gpu) if("${processor}" STREQUAL "gpu") set(gpu_arg -gpu) @@ -147,7 +131,25 @@ nrn_add_test_group_comparison( GROUP external_ringtest REFERENCE_OUTPUT asciispikes::external/tests/ringtest/reference_data/spk1.100ms.std.ref) +# Add tests for read coreneuron mapping info in memory and file mode +# Due to ASAN error in read_mapping_info, currectly run tests only when reporting is ON if(CORENRN_ENABLE_REPORTING) + nrn_add_test( + GROUP external_ringtest + NAME coreneuron_mpi_reportmapping_directmode + REQUIRES coreneuron mpi python + PROCESSORS ${ringtest_mpi_ranks} + ENVIRONMENT NEURON_INIT_MPI=1 LIBSONATA_ZERO_BASED_GIDS=1 + COMMAND ${ringtest_special} -tstop 100 -coreneuron -reportmapping) + + nrn_add_test( + GROUP external_ringtest + NAME coreneuron_mpi_reportmapping_filemode + REQUIRES coreneuron mpi python + PROCESSORS ${ringtest_mpi_ranks} + ENVIRONMENT NEURON_INIT_MPI=1 LIBSONATA_ZERO_BASED_GIDS=1 + COMMAND ${ringtest_special} -tstop 100 -coreneuron -reportmapping -filemode) + find_program(H5DIFF_EXECUTABLE "h5diff") set(reference_path "${PROJECT_BINARY_DIR}/test/external/tests/ringtest/reference_data/soma.ref.h5") From 61ae60c01121beb2516c4c5b45d300e95a6dea44 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 10 Mar 2024 11:13:04 +0000 Subject: [PATCH 21/31] Fix formatting --- test/external/ringtest/CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/external/ringtest/CMakeLists.txt b/test/external/ringtest/CMakeLists.txt index bea35ce214..0c67ce713e 100644 --- a/test/external/ringtest/CMakeLists.txt +++ b/test/external/ringtest/CMakeLists.txt @@ -131,8 +131,8 @@ nrn_add_test_group_comparison( GROUP external_ringtest REFERENCE_OUTPUT asciispikes::external/tests/ringtest/reference_data/spk1.100ms.std.ref) -# Add tests for read coreneuron mapping info in memory and file mode -# Due to ASAN error in read_mapping_info, currectly run tests only when reporting is ON +# Add tests for read coreneuron mapping info in memory and file mode Due to ASAN error in +# read_mapping_info, currectly run tests only when reporting is ON if(CORENRN_ENABLE_REPORTING) nrn_add_test( GROUP external_ringtest From 0a1558dff568aef55e9935107136795ca36e335b Mon Sep 17 00:00:00 2001 From: Weina Ji Date: Sun, 10 Mar 2024 19:07:33 +0100 Subject: [PATCH 22/31] improve comment --- test/external/ringtest/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/external/ringtest/CMakeLists.txt b/test/external/ringtest/CMakeLists.txt index 0c67ce713e..e192be9889 100644 --- a/test/external/ringtest/CMakeLists.txt +++ b/test/external/ringtest/CMakeLists.txt @@ -131,7 +131,7 @@ nrn_add_test_group_comparison( GROUP external_ringtest REFERENCE_OUTPUT asciispikes::external/tests/ringtest/reference_data/spk1.100ms.std.ref) -# Add tests for read coreneuron mapping info in memory and file mode Due to ASAN error in +# Add tests for read coreneuron mapping info in memory and file mode. Because of asan error in # read_mapping_info, currectly run tests only when reporting is ON if(CORENRN_ENABLE_REPORTING) nrn_add_test( From 0bf480274f30d6b313e61965a6557589ac3f4618 Mon Sep 17 00:00:00 2001 From: Weina Ji Date: Sun, 10 Mar 2024 21:39:02 +0100 Subject: [PATCH 23/31] solve asan container overflow, bring back the tests --- src/coreneuron/io/nrn_filehandler.hpp | 13 +++++------ test/external/ringtest/CMakeLists.txt | 32 +++++++++++++-------------- 2 files changed, 20 insertions(+), 25 deletions(-) diff --git a/src/coreneuron/io/nrn_filehandler.hpp b/src/coreneuron/io/nrn_filehandler.hpp index 9ac7f048e8..1709667978 100644 --- a/src/coreneuron/io/nrn_filehandler.hpp +++ b/src/coreneuron/io/nrn_filehandler.hpp @@ -127,16 +127,13 @@ class FileHandler { mapinfo->name = std::string(name); if (nseg) { - std::vector sec, seg; - std::vector lfp_factors; - - sec.reserve(nseg); - seg.reserve(nseg); - lfp_factors.reserve(total_lfp_factors); + auto sec = read_vector(nseg); + auto seg = read_vector(nseg); - read_array(&sec[0], nseg); - read_array(&seg[0], nseg); + std::vector lfp_factors; if (total_lfp_factors > 0) { + // ASan reports container overflow with vec.reserve in this case, resize does work + lfp_factors.resize(nseg); read_array(&lfp_factors[0], total_lfp_factors); } diff --git a/test/external/ringtest/CMakeLists.txt b/test/external/ringtest/CMakeLists.txt index e192be9889..cfcda01cd1 100644 --- a/test/external/ringtest/CMakeLists.txt +++ b/test/external/ringtest/CMakeLists.txt @@ -131,25 +131,23 @@ nrn_add_test_group_comparison( GROUP external_ringtest REFERENCE_OUTPUT asciispikes::external/tests/ringtest/reference_data/spk1.100ms.std.ref) -# Add tests for read coreneuron mapping info in memory and file mode. Because of asan error in -# read_mapping_info, currectly run tests only when reporting is ON -if(CORENRN_ENABLE_REPORTING) - nrn_add_test( - GROUP external_ringtest - NAME coreneuron_mpi_reportmapping_directmode - REQUIRES coreneuron mpi python - PROCESSORS ${ringtest_mpi_ranks} - ENVIRONMENT NEURON_INIT_MPI=1 LIBSONATA_ZERO_BASED_GIDS=1 - COMMAND ${ringtest_special} -tstop 100 -coreneuron -reportmapping) +nrn_add_test( + GROUP external_ringtest + NAME coreneuron_mpi_reportmapping_directmode + REQUIRES coreneuron mpi python + PROCESSORS ${ringtest_mpi_ranks} + ENVIRONMENT NEURON_INIT_MPI=1 LIBSONATA_ZERO_BASED_GIDS=1 + COMMAND ${ringtest_special} -tstop 100 -coreneuron -reportmapping) - nrn_add_test( - GROUP external_ringtest - NAME coreneuron_mpi_reportmapping_filemode - REQUIRES coreneuron mpi python - PROCESSORS ${ringtest_mpi_ranks} - ENVIRONMENT NEURON_INIT_MPI=1 LIBSONATA_ZERO_BASED_GIDS=1 - COMMAND ${ringtest_special} -tstop 100 -coreneuron -reportmapping -filemode) +nrn_add_test( + GROUP external_ringtest + NAME coreneuron_mpi_reportmapping_filemode + REQUIRES coreneuron mpi python + PROCESSORS ${ringtest_mpi_ranks} + ENVIRONMENT NEURON_INIT_MPI=1 LIBSONATA_ZERO_BASED_GIDS=1 + COMMAND ${ringtest_special} -tstop 100 -coreneuron -reportmapping -filemode) +if(CORENRN_ENABLE_REPORTING) find_program(H5DIFF_EXECUTABLE "h5diff") set(reference_path "${PROJECT_BINARY_DIR}/test/external/tests/ringtest/reference_data/soma.ref.h5") From 63fbdad8fa3e65c3ef218a838897e4fae6f9c94d Mon Sep 17 00:00:00 2001 From: Weina Ji Date: Sun, 10 Mar 2024 21:53:34 +0100 Subject: [PATCH 24/31] reorder ringtests --- test/external/ringtest/CMakeLists.txt | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/test/external/ringtest/CMakeLists.txt b/test/external/ringtest/CMakeLists.txt index cfcda01cd1..959963ff32 100644 --- a/test/external/ringtest/CMakeLists.txt +++ b/test/external/ringtest/CMakeLists.txt @@ -126,10 +126,6 @@ foreach(processor cpu gpu) ENVIRONMENT OMP_NUM_THREADS=${ringtest_num_threads} NEURON_INIT_MPI=1 COMMAND ${ringtest_python} -tstop 100 -coreneuron -nt ${ringtest_num_datasets} ${gpu_arg}) endforeach() -# Step 3 -- add a job that compares the outputs of all the tests added in Step 2 -nrn_add_test_group_comparison( - GROUP external_ringtest - REFERENCE_OUTPUT asciispikes::external/tests/ringtest/reference_data/spk1.100ms.std.ref) nrn_add_test( GROUP external_ringtest @@ -138,7 +134,6 @@ nrn_add_test( PROCESSORS ${ringtest_mpi_ranks} ENVIRONMENT NEURON_INIT_MPI=1 LIBSONATA_ZERO_BASED_GIDS=1 COMMAND ${ringtest_special} -tstop 100 -coreneuron -reportmapping) - nrn_add_test( GROUP external_ringtest NAME coreneuron_mpi_reportmapping_filemode @@ -147,6 +142,11 @@ nrn_add_test( ENVIRONMENT NEURON_INIT_MPI=1 LIBSONATA_ZERO_BASED_GIDS=1 COMMAND ${ringtest_special} -tstop 100 -coreneuron -reportmapping -filemode) +# Step 3 -- add a job that compares the outputs of all the tests added in Step 2 +nrn_add_test_group_comparison( + GROUP external_ringtest + REFERENCE_OUTPUT asciispikes::external/tests/ringtest/reference_data/spk1.100ms.std.ref) + if(CORENRN_ENABLE_REPORTING) find_program(H5DIFF_EXECUTABLE "h5diff") set(reference_path From b2e80585e54d636b1a4b59634da57d597d27e807 Mon Sep 17 00:00:00 2001 From: Weina Ji Date: Mon, 11 Mar 2024 08:12:27 +0100 Subject: [PATCH 25/31] improve comment --- src/coreneuron/io/nrn_filehandler.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/coreneuron/io/nrn_filehandler.hpp b/src/coreneuron/io/nrn_filehandler.hpp index 1709667978..3241fd3506 100644 --- a/src/coreneuron/io/nrn_filehandler.hpp +++ b/src/coreneuron/io/nrn_filehandler.hpp @@ -132,7 +132,7 @@ class FileHandler { std::vector lfp_factors; if (total_lfp_factors > 0) { - // ASan reports container overflow with vec.reserve in this case, resize does work + // ASan reports container overflow on read_array with vec.reserve, resize does work lfp_factors.resize(nseg); read_array(&lfp_factors[0], total_lfp_factors); } From 6b4aebe1b5da880c890f95f1fd60ff617c4d1ebe Mon Sep 17 00:00:00 2001 From: Weina Ji Date: Mon, 11 Mar 2024 08:33:02 +0100 Subject: [PATCH 26/31] rename ringtest option --- test/external/CMakeLists.txt | 2 +- test/external/ringtest/CMakeLists.txt | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/test/external/CMakeLists.txt b/test/external/CMakeLists.txt index 892286d66b..86e938aeae 100644 --- a/test/external/CMakeLists.txt +++ b/test/external/CMakeLists.txt @@ -7,7 +7,7 @@ include(FetchContent) FetchContent_Declare( ringtest GIT_REPOSITORY https://github.com/neuronsimulator/ringtest - GIT_TAG 9ab24ab5fb9d93b9ca8626ac2dafc514e142b9d6 + GIT_TAG 60680e3e1516ac23949cd744a12064687d46b332 SOURCE_DIR ${PROJECT_SOURCE_DIR}/external/tests/ringtest) FetchContent_Declare( diff --git a/test/external/ringtest/CMakeLists.txt b/test/external/ringtest/CMakeLists.txt index 959963ff32..19afcc19a4 100644 --- a/test/external/ringtest/CMakeLists.txt +++ b/test/external/ringtest/CMakeLists.txt @@ -129,18 +129,18 @@ endforeach() nrn_add_test( GROUP external_ringtest - NAME coreneuron_mpi_reportmapping_directmode + NAME coreneuron_mpi_registermapping_directmode REQUIRES coreneuron mpi python PROCESSORS ${ringtest_mpi_ranks} ENVIRONMENT NEURON_INIT_MPI=1 LIBSONATA_ZERO_BASED_GIDS=1 - COMMAND ${ringtest_special} -tstop 100 -coreneuron -reportmapping) + COMMAND ${ringtest_special} -tstop 100 -coreneuron -registermapping) nrn_add_test( GROUP external_ringtest - NAME coreneuron_mpi_reportmapping_filemode + NAME coreneuron_mpi_registermapping_filemode REQUIRES coreneuron mpi python PROCESSORS ${ringtest_mpi_ranks} ENVIRONMENT NEURON_INIT_MPI=1 LIBSONATA_ZERO_BASED_GIDS=1 - COMMAND ${ringtest_special} -tstop 100 -coreneuron -reportmapping -filemode) + COMMAND ${ringtest_special} -tstop 100 -coreneuron -registermapping -filemode) # Step 3 -- add a job that compares the outputs of all the tests added in Step 2 nrn_add_test_group_comparison( @@ -154,7 +154,7 @@ if(CORENRN_ENABLE_REPORTING) cpp_cc_build_time_copy( INPUT "${PROJECT_SOURCE_DIR}/external/tests/ringtest/reference_data/soma.ref.h5" OUTPUT "${reference_path}") - foreach(testfolder coreneuron_mpi_reportmapping_directmode coreneuron_mpi_reportmapping_filemode) + foreach(testfolder coreneuron_mpi_registermapping_directmode coreneuron_mpi_registermapping_filemode) if(H5DIFF_EXECUTABLE) add_test(NAME external_ringtest::compare_soma_report_${testfolder} COMMAND "h5diff" ${PROJECT_BINARY_DIR}/test/external_ringtest/${testfolder}/soma.h5 From 83d83041e66635e1be867bb9894bc7aae0470591 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 11 Mar 2024 08:25:24 +0000 Subject: [PATCH 27/31] Fix formatting --- test/external/ringtest/CMakeLists.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/external/ringtest/CMakeLists.txt b/test/external/ringtest/CMakeLists.txt index 19afcc19a4..59a550dee4 100644 --- a/test/external/ringtest/CMakeLists.txt +++ b/test/external/ringtest/CMakeLists.txt @@ -154,7 +154,8 @@ if(CORENRN_ENABLE_REPORTING) cpp_cc_build_time_copy( INPUT "${PROJECT_SOURCE_DIR}/external/tests/ringtest/reference_data/soma.ref.h5" OUTPUT "${reference_path}") - foreach(testfolder coreneuron_mpi_registermapping_directmode coreneuron_mpi_registermapping_filemode) + foreach(testfolder coreneuron_mpi_registermapping_directmode + coreneuron_mpi_registermapping_filemode) if(H5DIFF_EXECUTABLE) add_test(NAME external_ringtest::compare_soma_report_${testfolder} COMMAND "h5diff" ${PROJECT_BINARY_DIR}/test/external_ringtest/${testfolder}/soma.h5 From c699a545ce13d5f45b7a62d37b6ee4e7b58ce89d Mon Sep 17 00:00:00 2001 From: Weina Ji Date: Mon, 11 Mar 2024 12:48:44 +0100 Subject: [PATCH 28/31] Update ringtest version --- test/external/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/external/CMakeLists.txt b/test/external/CMakeLists.txt index 86e938aeae..a2ba1ce9c0 100644 --- a/test/external/CMakeLists.txt +++ b/test/external/CMakeLists.txt @@ -7,7 +7,7 @@ include(FetchContent) FetchContent_Declare( ringtest GIT_REPOSITORY https://github.com/neuronsimulator/ringtest - GIT_TAG 60680e3e1516ac23949cd744a12064687d46b332 + GIT_TAG 30cd087a8563532482815a8260a2f93a4ae9899b SOURCE_DIR ${PROJECT_SOURCE_DIR}/external/tests/ringtest) FetchContent_Declare( From 75793e8b97ee1c15f401521684b216b149508e72 Mon Sep 17 00:00:00 2001 From: Weina Ji Date: Mon, 11 Mar 2024 14:15:18 +0100 Subject: [PATCH 29/31] update ringtest version to the latest commit in master --- test/external/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/external/CMakeLists.txt b/test/external/CMakeLists.txt index a2ba1ce9c0..c4dfafe589 100644 --- a/test/external/CMakeLists.txt +++ b/test/external/CMakeLists.txt @@ -7,7 +7,7 @@ include(FetchContent) FetchContent_Declare( ringtest GIT_REPOSITORY https://github.com/neuronsimulator/ringtest - GIT_TAG 30cd087a8563532482815a8260a2f93a4ae9899b + GIT_TAG d40caf64ac24c6ddcf2c082f4b0b7f7ca50657c9 SOURCE_DIR ${PROJECT_SOURCE_DIR}/external/tests/ringtest) FetchContent_Declare( From 8e7333fad36b0b41060eb3c137a32f7158daaad3 Mon Sep 17 00:00:00 2001 From: Weina Ji Date: Tue, 12 Mar 2024 10:54:48 +0100 Subject: [PATCH 30/31] remove comparing soma reports when h5diff is not in the system --- test/external/ringtest/CMakeLists.txt | 39 +++++++++++---------------- 1 file changed, 16 insertions(+), 23 deletions(-) diff --git a/test/external/ringtest/CMakeLists.txt b/test/external/ringtest/CMakeLists.txt index 59a550dee4..9d1ef0c355 100644 --- a/test/external/ringtest/CMakeLists.txt +++ b/test/external/ringtest/CMakeLists.txt @@ -149,30 +149,23 @@ nrn_add_test_group_comparison( if(CORENRN_ENABLE_REPORTING) find_program(H5DIFF_EXECUTABLE "h5diff") - set(reference_path - "${PROJECT_BINARY_DIR}/test/external/tests/ringtest/reference_data/soma.ref.h5") - cpp_cc_build_time_copy( - INPUT "${PROJECT_SOURCE_DIR}/external/tests/ringtest/reference_data/soma.ref.h5" - OUTPUT "${reference_path}") - foreach(testfolder coreneuron_mpi_registermapping_directmode - coreneuron_mpi_registermapping_filemode) - if(H5DIFF_EXECUTABLE) + if(H5DIFF_EXECUTABLE) + set(reference_path + "${PROJECT_BINARY_DIR}/test/external/tests/ringtest/reference_data/soma.ref.h5") + cpp_cc_build_time_copy( + INPUT "${PROJECT_SOURCE_DIR}/external/tests/ringtest/reference_data/soma.ref.h5" + OUTPUT "${reference_path}") + foreach(testfolder coreneuron_mpi_registermapping_directmode + coreneuron_mpi_registermapping_filemode) add_test(NAME external_ringtest::compare_soma_report_${testfolder} COMMAND "h5diff" ${PROJECT_BINARY_DIR}/test/external_ringtest/${testfolder}/soma.h5 ${reference_path}) - else() - add_test( - NAME external_ringtest::compare_soma_report_${testfolder} - COMMAND - python -c - "import h5py; \ - file = h5py.File(\"${PROJECT_BINARY_DIR}/test/external_ringtest/${testfolder}/soma.h5\"); \ - ref_file = h5py.File(\"${reference_path}\"); \ - data = set(file[\"/report/default/mapping/node_ids\"]); \ - ref_data = set(ref_file[\"/report/default/mapping/node_ids\"]); \ - assert data == ref_data;") - endif() - set_tests_properties(external_ringtest::compare_soma_report_${testfolder} - PROPERTIES DEPENDS "external_ringtest::${testfolder}") - endforeach() + set_tests_properties(external_ringtest::compare_soma_report_${testfolder} + PROPERTIES DEPENDS "external_ringtest::${testfolder}") + endforeach() + else() + message(WARNING "Can not find h5diff, skip comparing the soma report for " + "external_ringtest::coreneuron_mpi_registermapping_directmode " + "external_ringtest::coreneuron_mpi_registermapping_filemode") + endif() endif() From a3b93c226e339dbf55037b0e375e43f2f9c7c9d7 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 12 Mar 2024 10:00:36 +0000 Subject: [PATCH 31/31] Fix formatting --- test/external/ringtest/CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/external/ringtest/CMakeLists.txt b/test/external/ringtest/CMakeLists.txt index 9d1ef0c355..22edacc360 100644 --- a/test/external/ringtest/CMakeLists.txt +++ b/test/external/ringtest/CMakeLists.txt @@ -165,7 +165,7 @@ if(CORENRN_ENABLE_REPORTING) endforeach() else() message(WARNING "Can not find h5diff, skip comparing the soma report for " - "external_ringtest::coreneuron_mpi_registermapping_directmode " - "external_ringtest::coreneuron_mpi_registermapping_filemode") + "external_ringtest::coreneuron_mpi_registermapping_directmode " + "external_ringtest::coreneuron_mpi_registermapping_filemode") endif() endif()