本文整理汇总了C++中ginac::ex::real_part方法的典型用法代码示例。如果您正苦于以下问题:C++ ex::real_part方法的具体用法?C++ ex::real_part怎么用?C++ ex::real_part使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类ginac::ex
的用法示例。
在下文中一共展示了ex::real_part方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: EvalCompiledExpression
double Attribute::EvalCompiledExpression (double const val, std::string const attrib ) {
//cout << GetPrototype()->GetName() << " ?? at pointer num " << m_cur_fp << " -> compiled = " << m_compiled.at(m_cur_fp) << endl;
if (!m_compiled.at(m_cur_fp)) {
//substitute all attributes with numbers in GiNaC expression, except the attribute
//which serves as the free parameter for runtime compilation
GiNaC::lst symlist;
GiNaC::lst numlist;
for (unsigned int i=0; i<m_subjects.size() ; i++) {
Attribute* a = m_subjects.at(i);
if (a->GetName() == attrib) continue;
symlist.append( get_symbol(a->GetSymbol()) );
if (a->GetTypeID()==typeid( double*).name()) { numlist.append(a->GetMember <double>() ); continue; }
if (a->GetTypeID()==typeid( int*).name()) { numlist.append(a->GetMember <int>() ); continue; }
if (a->GetTypeID()==typeid( long*).name()) { numlist.append(a->GetMember <long>() ); continue; }
if (a->GetTypeID()==typeid(unsigned*).name()) { numlist.append(a->GetMember<unsigned>() ); continue; }
if (a->GetTypeID()==typeid( bool*).name()) { numlist.append(a->GetMember <bool>() ); continue; }
}
GiNaC::ex e = GiNaC::evalf((symlist.nops()==0)?m_expression:m_expression.subs(symlist,numlist));
//add function pointers
m_fp.push_back(NULL);
m_fpi.push_back(NULL);
//compile the GiNaC expression
try {
//fairly easy for real valued expressions
if (!m_complex) {
compile_ex(e, get_symbol(GetPrototype()->GetAttribute(attrib)->GetSymbol()), m_fp.at(m_num_fp));
}
//more work to do, since GiNaC::realsymbol does not behave as expected (and it is therefore not used at all)
else {
stringstream se; se << e; std::string formula = se.str();
std::string sym = GetPrototype()->GetAttribute(attrib)->GetSymbol();
std::string asym = "abs(VarForEvalCompiledExpression)";
Prototype::ReplaceString(formula,sym,asym);
GiNaC::lst symlist;
symlist.append( get_symbol("VarForEvalCompiledExpression") );
GiNaC::ex ea = GiNaC::ex(formula,symlist);
symlist.remove_all();
symlist.append( get_symbol(sym) );
GiNaC::ex ear = ea.real_part();
stringstream ser; ser << ear; formula = ser.str();
if ( Prototype::ReplaceString(formula,asym,sym) ) {
ear = GiNaC::ex(formula,symlist);
compile_ex(ear, get_symbol(GetPrototype()->GetAttribute(attrib)->GetSymbol()), m_fp.at(m_num_fp));
}
GiNaC::ex eai = ea.imag_part();
stringstream sei; sei << eai; formula = sei.str();
if ( Prototype::ReplaceString(formula,asym,sym) ) {
eai = GiNaC::ex(formula,symlist);
compile_ex(eai, get_symbol(GetPrototype()->GetAttribute(attrib)->GetSymbol()), m_fpi.at(m_num_fp));
}
}
//cout << " compiling expression " << e << " of attribute " << GetName() << " in module " << GetPrototype()->GetName() << endl;
m_num_fp++;
}
catch (exception &p) {
cout << " Warning: attribute " << GetName() << " of module " << GetPrototype()->GetName() << endl << endl
<< " function Attribute::EvalCompiledExpression" << endl
<< " No external runtime compiler available: " << p.what() << endl
<< " Falling back to (slow) analytic evaluation!" << endl << endl
<< " Hint: if you have a shell and gcc on your system, create the one-liner " << endl << endl
<< " #!/bin/sh" << endl
<< " gcc -x c -fPIC -shared -o $1.so $1" << endl << endl
<< " name it \"ginac-excompiler\", and put it somewhere in your search path." << endl << endl;
m_ginac_excomp = false;
}
m_compiled.at(m_cur_fp) = true; //even if compilation failed, as we don't have to try a second time!
}
//if compilation failed, invoke slow analytic evaluation
if (!m_ginac_excomp ) {
*((double*) GetPrototype()->GetAttribute(attrib)-> GetAddress()) = val;
EvalExpression();
return *((double*) GetAddress());
}
//invoke fast runtime compiled routines
if (m_fpi.at(m_cur_fp) != NULL ) m_imaginary = m_fpi.at(m_cur_fp)(val);
if ( m_fp.at(m_cur_fp) != NULL ) return m_fp.at(m_cur_fp)(val);
return 0.0;
}