Previous 199869 Revisions Next

r30605 Thursday 22nd May, 2014 at 20:06:49 UTC by Couriersud
Some improvements to the solver code.
[src/emu/netlist]nl_base.h
[src/emu/netlist/analog]nld_solver.c

trunk/src/emu/netlist/analog/nld_solver.c
r30604r30605
367367         //m_A[t.net_other][t.net_this] += -t.term->m_otherterm->m_go;
368368      }
369369      else
370         RHS[t.net_this] += t.term->m_go * t.term->m_otherterm->net().Q_Analog();
370         RHS[t.net_this] += t.term->m_go * t.term->m_otherterm->net().as_analog().Q_Analog();
371371   }
372372#else
373373   for (int i = 0; i < m_rail_start; i++)
r30604r30605
443443            const double f1 = A[j][i] * f;
444444         if (f1 != 0.0)
445445         {
446               for (int k = i; k < kN; k++)
447               A[j][k] -= A[i][k] * f1;
448
446               int k = i;
447                for (; k < kN - 7 ; k+=8)
448                {
449                    double * RESTRICT d = &A[j][k];
450                    double * RESTRICT s = &A[i][k];
451                    d[0] -= f1 * s[0];
452                    d[1] -= f1 * s[1];
453                    d[2] -= f1 * s[2];
454                    d[3] -= f1 * s[3];
455                    d[4] -= f1 * s[4];
456                    d[5] -= f1 * s[5];
457                    d[6] -= f1 * s[6];
458                    d[7] -= f1 * s[7];
459                }
460                for (; k < kN; k++)
461                    A[j][k] -= A[i][k] * f1;
449462               RHS[j] -= RHS[i] * f1;
450463         }
451464      }
r30604r30605
583596   const double d = A[1][1];
584597
585598   double new_val[2];
586   new_val[1] = a / (a*d - b*c) * (RHS[1] - c / a * RHS[0]);
599   new_val[1] = a / (a * d - b * c) * (RHS[1] - c / a * RHS[0]);
587600   new_val[0] = (RHS[0] - b * new_val[1]) / a;
588601
589602   if (is_dynamic())
r30604r30605
625638      double gabs_t = 0.0;
626639      double RHS_t = 0.0;
627640
628      netlist_analog_net_t *net = this->m_nets[k];
629      const netlist_terminal_t::list_t &terms = net->m_terms;
630      const netlist_terminal_t::list_t &rails = net->m_rails;
641      const netlist_analog_net_t &net = *this->m_nets[k];
642      const netlist_terminal_t::list_t &terms = net.m_terms;
643      const netlist_terminal_t::list_t &rails = net.m_rails;
631644      const int term_count = terms.count();
632645      const int rail_count = rails.count();
633646
r30604r30605
644657         gtot_t += terms[i]->m_gt;
645658         gabs_t += fabs(terms[i]->m_go);
646659         RHS_t += terms[i]->m_Idr;
660         terms[i]->m_otherterm_ptr = &terms[i]->m_otherterm->net().as_analog().m_new_Analog;
647661      }
648662
649663      gabs_t *= this->m_params.m_convergence_factor;
r30604r30605
662676      RHS[k] = RHS_t;
663677   }
664678    for (int k = 0; k < this->N(); k++)
679    {
665680        this->m_nets[k]->m_new_Analog = this->m_nets[k]->m_cur_Analog;
681    }
666682
667683   do {
668684      resched = false;
r30604r30605
670686
671687      for (int k = 0; k < this->N(); k++)
672688      {
673         netlist_analog_net_t *net = this->m_nets[k];
674         const netlist_terminal_t::list_t &terms = net->m_terms;
689         netlist_analog_net_t &net = *this->m_nets[k];
690         const netlist_terminal_t::list_t &terms = net.m_terms;
675691         const int term_count = terms.count();
676692
677         double iIdr = RHS[k];
693         double Idrive = RHS[k];
678694
679695         for (int i = 0; i < term_count; i++)
680         {
681                iIdr += terms[i]->m_go * terms[i]->m_otherterm->net().as_analog().m_new_Analog;
682         }
696                Idrive += terms[i]->m_go * *(terms[i]->m_otherterm_ptr);
683697
684698         //double new_val = (net->m_cur_Analog * gabs[k] + iIdr) / (gtot[k]);
685         const double new_val = net->m_new_Analog * one_m_w[k] + iIdr * w[k];
699         const double new_val = net.m_new_Analog * one_m_w[k] + Idrive * w[k];
686700
687         const double e = (new_val - net->m_new_Analog);
701         const double e = (new_val - net.m_new_Analog);
688702         cerr += e * e;
689703
690         net->m_new_Analog = new_val;
704         net.m_new_Analog = new_val;
691705      }
692706      if (cerr > this->m_params.m_accuracy * this->m_params.m_accuracy)
693707      {
r30604r30605
729743
730744   register_param("ACCURACY", m_accuracy, 1e-7);
731745   register_param("CONVERG", m_convergence, 0.3);
732   register_param("GS_LOOPS", m_gs_loops, 7);              // Gauss-Seidel loops
746   register_param("GS_LOOPS", m_gs_loops, 5);              // Gauss-Seidel loops
733747    register_param("NR_LOOPS", m_nr_loops, 25);             // Newton-Raphson loops
734748   register_param("PARALLEL", m_parallel, 0);
735749    register_param("GMIN", m_gmin, NETLIST_GMIN_DEFAULT);
trunk/src/emu/netlist/nl_base.h
r30604r30605
460460
461461   netlist_terminal_t *m_otherterm;
462462
463   // used by gauss-seidel-solver
464
465   double *m_otherterm_ptr;
466
463467protected:
464468   ATTR_COLD virtual void save_register();
465469

Previous 199869 Revisions Next


© 1997-2024 The MAME Team