help-mcsim
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Help-mcsim] #include directives in Inline() code


From: fredomatic
Subject: [Help-mcsim] #include directives in Inline() code
Date: Wed, 22 Aug 2018 21:18:05 +0200
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.9.1

This is probably the most sophisticated question on MCSim I got
asked in the past 25 years.
The disappointing answer is: I don't know why the #include get stripped
out. Inline "should" copy verbatim. I will check.
Meanwhile, you can either live with manual C model editing (bad). The
alternative (which I may use myself to fix your problem) is to add the
#include somewhere (not exactly sure where now) in the distributed C
code so that it's always available. You could try it yourself: you just
add it to the distributed code and re-install.
The model.c file always have
#include "modelu.h"
#include "random.h"
#include "yourcode.h"
so it would make sense to add it in modelu.h or further up in modiface.h.
I could add all the GSL headers in the world there for people to use as
they wish. That would be nice. I'll put it in the to-do list.
Best regards and thanks for the input.
Frederic Bois




On 22/08/2018 17:27, Caroline Ring wrote:
> I would like to use interpolation methods from GSL (GNU Scientific Library) 
> (version 2.5) in MCSim (version 6.0.1). I have GSL installed, and MCSim knows 
> how to link against it (the “makemcsim” shell script includes flag -lgsl in 
> the gcc command). However, I still need to put the appropriate #include 
> directive into the model code, to include the appropriate GSL header file(s). 
> It does not seem that this can be done as part of an Inline() statement; the 
> #include directive appears to get stripped out during the process of 
> generating the model.c file. What is the correct way to do this? I can 
> accomplish it by manually editing the model.c file generated by “mod” to add 
> the #include directive, then by manually compiling and linking the model. Is 
> there any better way?
> 
> Here is a simple reproducible example. (I’m setting off code blocks with 
> “--------“; the dashes aren’t included in the actual code.) (For background, 
> I am on Mac OS High Sierra version 10.13.6.)
> 
> File interp_test.model contains the following:
> 
> --------
> States = {y};
> Outputs = {rate};
> 
> rate_tmp = 0.5;
> 
> Dynamics{
> Inline(#include <gsl/gsl_interp.h>);
> Inline(unsigned n = 4;); #number of points in interpolation table
> Inline(double x[4] = {0.0, 3.1, 10.1, 50};); #time-values for interpolation
> Inline(double y[4] = {2.0, 5.0, 0.5, 0.1};); #response-values for 
> interpolation
> #set up GSL linear interpolation, following example at 
> https://lists.gnu.org/archive/html/help-gsl/2007-06/msg00019.html
> Inline(gsl_interp *interpolation = gsl_interp_alloc (gsl_interp_linear,n););
> Inline(gsl_interp_init(interpolation, x, y, n););
> Inline(gsl_interp_accel * accelerator =  gsl_interp_accel_alloc(););
> Inline(rate_tmp = gsl_interp_eval(interpolation, x, y, *pdTime, 
> accelerator);); #perform interpolation at current simulation time
> rate = rate_tmp; #assign interpolated rate value
> dt(y) = rate;
> }
> 
> End.
> ---------
> 
> If I try to compile this using
> 
> $ makemcsim interp_test.model
> 
> I receive a bunch of errors about “undeclared identifiers” for all of the 
> gsl_interp items. When I examine the model.c file, I do not see “#include 
> <gsl/gsl_interp.h>” anywhere within it. The rest of the inline code is in the 
> CalcDeriv() function block as expected.
> 
> However, if I remove the following line in the interp_test.model file:
> 
> ----
> Inline(#include <gsl/gsl_interp.h>);
> -----
> 
> And then create the C code using
> 
> $ mod interp_test.model
> 
> and then manually edit the resulting model.c file to add the directive
> 
> ---------
> #include <gsl/gsl_interp.h>
> ---------
> 
> And then compile and link with the statement
> 
> $ gcc -O3 -I/usr/local/include -L/usr/local/lib  -g -O2  model.c -lmcsim -o 
> interp_test.mcsim -lm -lgsl -lgslcblas -llapack  -Wall;
> 
> (i.e. the same command included in the “makemcsim” shell script), then the 
> model compiles without errors, and I can run it using the following input 
> file:
> 
> --------
> OutputFile("interp_test.out");
> Integrate(Lsodes, 1e-6, 20, 1);
> 
> Simulation{
> PrintStep(rate, y, 0, 20, 1)
> }
> 
> END.
> --------
> 
> And I get the following output:
> 
> ---------
> Results of Simulation 1
> 
> Time  rate    y
> 0     2.73171 0
> 1     3.46341 3.09756
> 2     4.19512 6.92683
> 3     4.92683 11.4878
> 4     4.42143 16.0464
> 5     3.77857 19.976
> 6     3.13571 23.4331
> 7     2.49286 26.2474
> 8     1.85    28.4189
> 9     1.20714 29.9474
> 10    0.564286        30.8331
> 11    0.490977        31.3928
> 12    0.480952        31.8809
> 13    0.470927        32.3564
> 14    0.460902        32.8223
> 15    0.450877        33.2782
> 16    0.440852        33.724
> 17    0.430827        34.1599
> 18    0.420802        34.5857
> 19    0.410777        35.0015
> 20    0.400752        35.4072
> --------
> 
> So it seems to work as expected if I manually edit and then manually compile 
> and link the model, but it does not work if I use “makemcsim” to automate the 
> process.
> 
> I have tried placing the line
> 
> --------
> Inline(#include <gsl/gsl_interp.h>);
> --------
> 
> outside the Dynamics block, but it still does not appear in the resulting 
> model.c file. It really seems like that line is getting stripped out, 
> although I can't identify where it is happening in the code for "mod". Am I 
> missing something, or is the manual-edit process really the correct way to do 
> this?
> 
> Thank you,
> 
> Caroline Ring
> 
> 
> _______________________________________________
> Help-mcsim mailing list
> address@hidden
> https://lists.gnu.org/mailman/listinfo/help-mcsim
> 



reply via email to

[Prev in Thread] Current Thread [Next in Thread]