/* ri_default () deals with Special RASL instruction for the Tracer only. May 9 1988. D.T. */ int ri_default (int ins, int * error) { short n; long jk; char *arg; switch (ins) { case EQS: ASGN_LONG (++p, jk); p += sizeof (long); eqs (jk); break; case CHACT: ASGN_CHARP(++p, arg); p += sizeof (char *); chact (arg); break; case GT: ASGN_LONG (++p, jk); p += sizeof (long); gt (jk); break; case LT: ASGN_LONG (++p, jk); p += sizeof (long); lt (jk); break; case EBR: n = (short) (* ++p); ebr (n); break; case CURK: ASGN_LONG (++p, jk); p += sizeof (long); if (jk < curk) {rimp;} else rd_endcom (); break; case NO_BREAK: /* nobreak: debugging. */ nobreak; break; default: *error = 2; break; } restart: return 0; }
int main() { try { // Specify a problem on (0,10), with an initial uniform grid of // 6 points. Blasius eqs(6, 10.0); // Solve the equations, refining the grid as needed, and print lots of diagnostic output (loglevel = 4) eqs.solve(4); // write the solution to a CSV file. eqs.writeCSV(); return 0; } catch (Cantera::CanteraError& err) { std::cerr << err.what() << std::endl; return -1; } }
bool mk_array_blast::ackermanize(rule const& r, expr_ref& body, expr_ref& head) { expr_ref_vector conjs(m), trail(m); flatten_and(body, conjs); m_defs.reset(); m_next_var = 0; ptr_vector<expr> todo; obj_map<expr, expr*> cache; ptr_vector<expr> args; app_ref e1(m); app* s; var* v; for (unsigned i = 0; i < conjs.size(); ++i) { expr* e = conjs[i].get(); if (is_select_eq_var(e, s, v)) { todo.append(s->get_num_args(), s->get_args()); } else { todo.push_back(e); } } while (!todo.empty()) { expr* e = todo.back(); if (cache.contains(e)) { todo.pop_back(); continue; } if (is_var(e)) { cache.insert(e, e); todo.pop_back(); continue; } if (!is_app(e)) { return false; } app* ap = to_app(e); bool valid = true; args.reset(); for (unsigned i = 0; i < ap->get_num_args(); ++i) { expr* arg; if (cache.find(ap->get_arg(i), arg)) { args.push_back(arg); } else { todo.push_back(ap->get_arg(i)); valid = false; } } if (valid) { todo.pop_back(); e1 = m.mk_app(ap->get_decl(), args.size(), args.c_ptr()); trail.push_back(e1); if (a.is_select(ap)) { if (m_defs.find(e1, v)) { cache.insert(e, v); } else if (!insert_def(r, e1, 0)) { return false; } else { cache.insert(e, m_defs.find(e1)); } } else { cache.insert(e, e1); } } } for (unsigned i = 0; i < conjs.size(); ++i) { expr* e = conjs[i].get(); if (is_select_eq_var(e, s, v)) { args.reset(); for (unsigned j = 0; j < s->get_num_args(); ++j) { args.push_back(cache.find(s->get_arg(j))); } e1 = m.mk_app(s->get_decl(), args.size(), args.c_ptr()); if (!m_defs.contains(e1) && !insert_def(r, e1, v)) { return false; } conjs[i] = m.mk_eq(v, m_defs.find(e1)); } else { conjs[i] = cache.find(e); } } // perform the Ackermann reduction by creating implications // i1 = i2 => val1 = val2 for each equality pair: // (= val1 (select a_i i1)) // (= val2 (select a_i i2)) defs_t::iterator it1 = m_defs.begin(), end = m_defs.end(); for (; it1 != end; ++it1) { app* a1 = it1->m_key; var* v1 = it1->m_value; defs_t::iterator it2 = it1; ++it2; for (; it2 != end; ++it2) { app* a2 = it2->m_key; var* v2 = it2->m_value; TRACE("dl", tout << mk_pp(a1, m) << " " << mk_pp(a2, m) << "\n";); if (get_select(a1) != get_select(a2)) { continue; } expr_ref_vector eqs(m); ptr_vector<expr> args1, args2; get_select_args(a1, args1); get_select_args(a2, args2); for (unsigned j = 0; j < args1.size(); ++j) { eqs.push_back(m.mk_eq(args1[j], args2[j])); } conjs.push_back(m.mk_implies(m.mk_and(eqs.size(), eqs.c_ptr()), m.mk_eq(v1, v2))); } }