Hi John, I am also confused by the need to declare a function which is explicitly named "c_test". A few years ago when I wrote a wrapper function to make a C interface for a C++ style XSPEC model, this wasn't the case - if I had written a C style XSPEC model called "test", then it would work with no further modification in isis. Did you change the way isis interfaces with XSPEC local models? Maurice On 11/19/13 11:06 AM, Thomas Dauser wrote: > Hi John, > > thanks for your reply. Still, I'm confused. I'm trying to understand > why local models in C are so much more complicated for isis than in > xspec. > > I got the C++ model running, exactly as you described. Is there a > reason why one has to write a wrapper for isis, which is done by xspec > automatically. But not the way I understood it from Maurice, although > this approach made much more sense in my opinion. Now I have to define > a C++ model with > > extern "C" test void( ... ) > > and a wrapper converting this to C with > > extern "C" C_test void( ... ) > > Note the C_test. Any other function name else won't work. Why do I > have to create a wrapper manually in isis, while xspec automatically > does it perfectly fine? > > > While I more or less understand the issue with C++ above, I'm totally > confused with the C case (so, from here on, I'm only talking about a C > model). Following the heasoft guide for local models > (http://heasarc.gsfc.nasa.gov/xanadu/xspec/manual/XSappendixLocal.html), > it should be possible to just define a local model in C, when > referring to it in the lmodel.dat with "c_test" (not the small "c"). . > This is basically the test case described in my previous email. There > I simply create a C function called > > extern "C" test void( ... ) > > (following the manual). This, again, works nicely in xspec, but isis > complains that the function "c_test" is not defined. If I provide this > function (simply a C-Wrapper for the C-Function), it works. Why do I > have to provide two identical functions with different names for one > actual model? (using C_test or c_test as function name also fails. > Then isis is looking for a function called "test", which clearly does > not exist) > > > Please tell me, if I'm completely missing something or just completely > underestimate the complexity of importing local xspec models into > isis. Thanks! > > > Cheers, > Thomas > > On 11/19/2013 05:44 AM, John Houck wrote: >> I think it's just a matter of providing an additional >> subroutine for a C interface. >> >> For example, have a look at how xspec provides C and Fortran >> interfaces for the xspec internal models. See, e.g. >> heasoft-6.14/Xspec/src/XSFunctions/funcWrappers.cxx >> >> For a C++ local model that provides a symbol 'test': >> >> extern "C" >> void test(const RealArray& energy, >> const RealArray& parameter, >> int spectrum, >> RealArray& flux, >> RealArray& fluxError, >> const string& init) >> >> the lmodel.dat file should, by convention, refer to subroutine >> C_test. >> >> The notation "C_test" means that a C++ interface is provided >> through the symbol "test", while a C interface (if it exists) >> should appear under the name "C_test". >> >> Following the examples in funcWrappers.cxx, a C-linkage symbol >> C_test can be defined as in the appended code segment. >> >> Once this C-linkage symbol is provided, libxspeclocal.so will >> contain two symbols through which the local model can be >> evaluated. C++ programs can call 'test' and C programs can call >> 'C_test'. >> >> If you also want to provide a Fortran linkage symbol, then >> funcWrappers.cxx shows one way to do that via cfortran.h. One >> could also use the iso_c_binding module with "modern" Fortran. >> >> Thanks, >> -John >> >> // Here's an example C-linkage wrapper definition for 'test'. >> // An implementation of cppModelWrapper is in funcWrappers.cxx >> // mentioned above. >> >> extern "C" >> void C_test (const double* energy, int nFlux, const double* params, >> int spectrumNumber, double* flux, double* fluxError, const >> char* initStr) >> { >> const size_t nPar = 3; >> cppModelWrapper(energy, nFlux, params, spectrumNumber, flux, >> fluxError, >> initStr, nPar, test); >> } >> >> ---- >> You received this message because you are >> subscribed to the isis-users list. >> To unsubscribe, send a message to >> isis-users-request_at_email.domain.hidden>> with the first line of the message as: >> unsubscribe >> > ---- > You received this message because you are > subscribed to the isis-users list. > To unsubscribe, send a message to > isis-users-request_at_email.domain.hidden> with the first line of the message as: > unsubscribe > ---- You received this message because you are subscribed to the isis-users list. To unsubscribe, send a message to isis-users-request_at_email.domain.hiddenwith the first line of the message as: unsubscribeReceived on Tue Nov 19 2013 - 11:34:10 EST
This archive was generated by hypermail 2.2.0 : Thu Nov 21 2013 - 09:44:46 EST