void Cvode::nocap_v_part1(NrnThread* _nt){ int i; CvodeThreadData& z = ctd_[_nt->id]; for (i = 0; i < z.no_cap_count_; ++i) { // initialize storage Node* nd = z.no_cap_node_[i]; NODED(nd) = 0; NODERHS(nd) = 0; } // compute the i(vmold) and di/dv rhs_memb(z.no_cap_memb_, _nt); lhs_memb(z.no_cap_memb_, _nt); for (i = 0; i < z.no_cap_count_; ++i) {// parent axial current Node* nd = z.no_cap_node_[i]; // following from global v_parent NODERHS(nd) += NODED(nd) * NODEV(nd); Node* pnd = _nt->_v_parent[nd->v_node_index]; if (pnd) { NODERHS(nd) -= NODEB(nd) * NODEV(pnd); NODED(nd) -= NODEB(nd); } } for (i = 0; i < z.no_cap_child_count_; ++i) {// child axial current Node* nd = z.no_cap_child_[i]; // following from global v_parent Node* pnd = _nt->_v_parent[nd->v_node_index]; NODERHS(pnd) -= NODEA(nd) * NODEV(nd); NODED(pnd) -= NODEA(nd); } nrn_multisplit_nocap_v_part1(_nt); }
void Cvode::nocap_v(NrnThread* _nt){ int i; CvodeThreadData& z = CTD(_nt->id); for (i = 0; i < z.no_cap_count_; ++i) { // initialize storage Node* nd = z.no_cap_node_[i]; NODED(nd) = 0; NODERHS(nd) = 0; } // compute the i(vmold) and di/dv rhs_memb(z.no_cap_memb_, _nt); lhs_memb(z.no_cap_memb_, _nt); for (i = 0; i < z.no_cap_count_; ++i) {// parent axial current Node* nd = z.no_cap_node_[i]; // following from global v_parent NODERHS(nd) += NODED(nd) * NODEV(nd); Node* pnd = _nt->_v_parent[nd->v_node_index]; if (pnd) { NODERHS(nd) -= NODEB(nd) * NODEV(pnd); NODED(nd) -= NODEB(nd); } } for (i = 0; i < z.no_cap_child_count_; ++i) {// child axial current Node* nd = z.no_cap_child_[i]; // following from global v_parent Node* pnd = _nt->_v_parent[nd->v_node_index]; NODERHS(pnd) -= NODEA(nd) * NODEV(nd); NODED(pnd) -= NODEA(nd); } #if PARANEURON if (nrn_multisplit_solve_) { // add up the multisplit equations nrn_multisplit_nocap_v(); } #endif for (i = 0; i < z.no_cap_count_; ++i) { Node* nd = z.no_cap_node_[i]; NODEV(nd) = NODERHS(nd) / NODED(nd); // printf("%d %d %g v=%g\n", nrnmpi_myid, i, _nt->_t, NODEV(nd)); } // no_cap v's are now consistent with adjacent v's }
void Cvode::lhs(NrnThread* _nt) { int i; CvodeThreadData& z = CTD(_nt->id); if (z.v_node_count_ == 0) { return; } for (i = 0; i < z.v_node_count_; ++i) { NODED(z.v_node_[i]) = 0.; } lhs_memb(z.cv_memb_list_, _nt); nrn_nonvint_block_conductance(_nt->end, _nt->_actual_rhs, _nt->id); nrn_cap_jacob(_nt, z.cmlcap_->ml); // _nrn_fast_imem not needed since exact icap added in nrn_div_capacity /* now add the axial currents */ for (i = 0; i < z.v_node_count_; ++i) { NODED(z.v_node_[i]) -= NODEB(z.v_node_[i]); } for (i=z.rootnodecount_; i < z.v_node_count_; ++i) { NODED(z.v_parent_[i]) -= NODEA(z.v_node_[i]); } }