#!/usr/bin/perl #//////////////////////////////////////////////////////////// # v2j - vensim2java conversion script # very minor modifications by Brian Block (2006) # # original source: # stella2java conversion script - Copyright 2000, # David Joiner and The Shodor Education Foundation, Inc. #//////////////////////////////////////////////////////////// sub strip { my ($line) = @_; chomp $line; $line =~ s/\A\s+//g; $line =~ s/\s+\Z//g; return $line; } $tpnumber = $ARGV[1]; $tmp = "/tmp"; $tmp_dir = "v2j$tpnumber"; open (INPUTFILE,"< $tmp/$tmp_dir/inf") || die "can't open \n"; # start off with something that will read the input file # go ahead and use INPUTFILE $ivar=0; $irate=0; $iflow=0; $iconv=0; $ivarf=0; while($line=) { chomp $line; ($first_word,$name,$default,$min,$max,$style,$display,@rest)=split(/\s+/,$line); if($first_word eq 'VAR') { $var[$ivar]=strip($name); $varmin[$ivar]=strip($min); $varmax[$ivar]=strip($max); $vardef[$ivar]=strip($default); $vardeffunc[$ivar]=""; $varstyle[$ivar]=strip($style); $vardisplay[$ivar]=strip($display); if ($vardef[$ivar] eq "VARDFUNC") { $line4=; chomp $line4; $vardfflag=0; while($vardfflag==0) { $vardeffunc[$ivar]=$vardeffunc[$ivar].strip($line4)."@@@"; $line4=; chomp $line4; if($line4 =~ /ENDVARDFUNC/) {$vardfflag=1;} } #put in something here to JAVAIZE math functions $vardeffunc[$ivar] = javaize($vardeffunc[$ivar]); } $ivar++; } if($first_word eq 'RATE') { $rate[$irate]=strip($name); $ratemin[$irate]=strip($min); $ratemax[$irate]=strip($max); $ratedef[$irate]=strip($default); $ratedeffunc[$irate]=""; $ratestyle[$irate]=strip($style); $ratedisplay[$irate]=strip($display); if ($ratedef[$irate] eq "RATEDFUNC") { $line4=; chomp $line4; $ratedfflag=0; while($ratedfflag==0) { $ratedeffunc[$irate]=$ratedeffunc[$irate].strip($line4)."@@@"; $line4=; chomp $line4; if($line4 =~ /ENDRATEDFUNC/) {$ratedfflag=1;} } #put in something here to JAVAIZE math functions $ratedeffunc[$irate] = javaize($ratedeffunc[$irate]); } $irate++; } if($first_word eq 'VARFUNC') { $varfname[$ivarf]=strip($name); $varfdisplay[$ivarf]=strip($default); $line4=; chomp $line4; $varf[$ivarf]=""; $varfflag=0; while($varfflag==0) { $varf[$ivarf]=$varf[$ivarf].strip($line4)."@@@"; $line4=; chomp $line4; if($line4 =~ /ENDVARFUNC/) {$varfflag=1;} } #put in something here to JAVAIZE math functions $varf[$ivarf] = javaize($varf[$ivarf]); $ivarf++; } if($first_word eq 'CONVERTER') { $convname[$iconv]=strip($name); $convdisplay[$iconv]=strip($default); $line4=; chomp $line4; $conv[$iconv]=""; $convflag=0; while($convflag==0) { $conv[$iconv]=$conv[$iconv].strip($line4)."@@@"; $line4=; chomp $line4; if($line4 =~ /ENDCONVERTER/) {$convflag=1;} } #put in something here to JAVAIZE math functions $conv[$iconv] = javaize($conv[$iconv]); $iconv++; } if($first_word eq 'FLOW') { $flowname[$iflow]=strip($name); $flowdisplay[$iflow]=strip($default); $line2=; chomp $line2; ($flowfrom[$iflow],$rest)=split(/\s+/,$line2); $line3=; chomp $line3; ($flowto[$iflow],$rest)=split(/\s+/,$line3); $line4=; chomp $line4; $flow[$iflow]=""; $flowflag=0; while($flowflag==0) { $flow[$iflow]=$flow[$iflow].strip($line4)."@@@"; $line4=; chomp $line4; if($line4 =~ /ENDFLOW/) {$flowflag=1;} } #put in something here to JAVAIZE math functions $flow[$iflow] = javaize($flow[$iflow]); $iflow++; } if($first_word =~ /TSTEP/) { $tstep=strip($name); } if($first_word =~ /INITTIME/) { $itime=strip($name); } if($first_word =~ /ENDTIME/) { $etime=strip($name); } if($first_word =~ /YMIN/) { $ymin=strip($name); } if($first_word =~ /YMAX/) { $ymax=strip($name); } if($first_word =~ /TITLE/) { $title=strip($name); } if($first_word =~ /DEPLABEL/) { $depLabel=strip($name); } } $nvar=$ivar; $nrate=$irate; $nflow=$iflow; $nconv=$iconv; $nvarf=$ivarf; $nvartot=$nvar+$nvarf; # for each flow, search and replace for each var and rate with # variable names. $derivlines=""; $ideriv=0; print "Checking VARS\n"; for ($i=0; $i<$nvar; $i++) { if($vardef[$i] ne "VARDFUNC") { $dtname[$ideriv]=$var[$i]; $dtline[$ideriv]="$var[$i]=$vardef[$i];\n"; } else { $vardeffunc[$i] =~ s/@@@/\n/g; $vardeffunc[$i]=$var[$i]." = ".$vardeffunc[$i]; chomp $vardeffunc[$i]; $vardeffunc[$i]=$vardeffunc[$i].";\n"; $dtline[$ideriv]=$vardeffunc[$i]; $dtname[$ideriv]=$var[$i]; } $ideriv++; } print "Checking RATES\n"; for ($i=0; $i<$nrate; $i++) { if($ratedef[$i] ne "RATEDFUNC") { $dtname[$ideriv]=$rate[$i]; $dtline[$ideriv]="$rate[$i]=$ratedef[$i];\n"; } else { $ratedeffunc[$i] =~ s/@@@/\n/g; $ratedeffunc[$i]=$rate[$i]." = ".$ratedeffunc[$i]; chomp $ratedeffunc[$i]; $ratedeffunc[$i]=$ratedeffunc[$i].";\n"; $dtline[$ideriv]=$ratedeffunc[$i]; $dtname[$ideriv]=$rate[$i]; } $ideriv++; } print "Checking VARFUNCS\n"; for ($i=0; $i<$nvarf; $i++) { $varf[$i] =~ s/@@@/\n/g; $varf[$i]=$varfname[$i]." = ".$varf[$i]; chomp $varf[$i]; $varf[$i]=$varf[$i].";\n"; $dtline[$ideriv]=$varf[$i]; $dtname[$ideriv]=$varfname[$i]; $ideriv++; } print "Checking FLOWS\n"; $igraph=0; for ($i=0; $i<$nflow; $i++) { $flow[$i] =~ s/@@@/\n/g; #check for graphs $graphline=$flow[$i]; $graphline =~ s/\(/ /g; $graphline =~ s/\)/ /g; $graphline =~ s/,/ /g; $graphline=strip($graphline); ($word1,$word2,$word3,@rest) = split(/\s+/,$graphline); print "GRAPHS --- $word1 | $word2 | $word3 | $graphline \n"; if($word1 =~ /\bgraph\b/i) { $graphname[$igraph]=$flowname[$i]; $graphtype[$igraph]=$word2; $graphdep[$igraph]=$word3; #ok, this handles the lines to call the graph, but what about setting #up the graph? $graphline=join(" ",@rest); $graphline =~ s/\(/ /g; $graphline =~ s/\)/ /g; $graphline =~ s/,/ /g; $graphline = strip($graphline); @grapharray=split(/\s+/,$graphline); $graphnum=@grapharray/2; $graphx[$igraph]=""; $graphy[$igraph]=""; for ($j=0;$j<$graphnum;$j++) { $tj=2*$j; $tj1=2*$j+1; $graphx[$igraph]=$graphx[$igraph]."$grapharray[2*$j] "; $graphy[$igraph]=$graphy[$igraph]."$grapharray[2*$j+1] "; } $flow[$i]=$flowname[$i]."= graph($igraph,$graphdep[$igraph]);\n"; $igraph++; } else { $flow[$i]=$flowname[$i]." = ".$flow[$i]; chomp $flow[$i]; $flow[$i]=$flow[$i].";\n"; } $derivlines=$derivlines." double ".$flowname[$i].";\n"; $dtline[$ideriv]=$flow[$i]; $dtname[$ideriv]=$flowname[$i]; $ideriv++; } print "Checking CONVERTERS\n"; for ($i=0;$i<$iconv;$i++) { $conv[$i] =~ s/@@@/\n/g; #check for graphs $graphline=$conv[$i]; $graphline =~ s/\(/ /g; $graphline =~ s/\)/ /g; $graphline =~ s/,/ /g; $graphline=strip($graphline); ($word1,$word2,$word3,@rest) = split(/\s+/,$graphline); print "GRAPHS --- $word1 | $word2 | $word3 | $graphline \n"; if($word1 =~ /\bgraph\b/i) { $graphname[$igraph]=$convname[$i]; $graphtype[$igraph]=$word2; $graphdep[$igraph]=$word3; #ok, this handles the lines to call the graph, but what about setting #up the graph? $graphline=join(" ",@rest); $graphline =~ s/\(/ /g; $graphline =~ s/\)/ /g; $graphline =~ s/,/ /g; $graphline = strip($graphline); @grapharray=split(/\s+/,$graphline); $graphnum=@grapharray/2; $graphx[$igraph]=""; $graphy[$igraph]=""; for ($j=0;$j<$graphnum;$j++) { $tj=2*$j; $tj1=2*$j+1; $graphx[$igraph]=$graphx[$igraph]."$grapharray[2*$j] "; $graphy[$igraph]=$graphy[$igraph]."$grapharray[2*$j+1] "; } $conv[$i]="conv[$i]= graph($igraph,$graphdep[$igraph]);\n"; $igraph++; } else { $conv[$i]="conv[$i] = $conv[$i]"; chomp $conv[$i]; $conv[$i]=$conv[$i].";\n"; } #$derivlines=$derivlines." ".$conv[$i]; $dtline[$ideriv]=$conv[$i]; $dtname[$ideriv]=$convname[$i]; $ideriv++; } $nderiv=$ideriv; $ngraphs=$igraph; #set up graph lines $graphlines=" n_graphs=$ngraphs;\n n_graph=new int[n_graphs];\n"; $graphlines=$graphlines." type_graph=new int[n_graphs];\n"; $graphlines2=""; for($i=0;$i<$ngraphs;$i++) { @graphxa=split(/\s+/,$graphx[$i]); @graphya=split(/\s+/,$graphy[$i]); $graphnum=@graphxa; $graphlines=$graphlines." n_graph[$i]=$graphnum;\n"; $graphlines=$graphlines." type_graph[$i]=$graphtype[$i]_GRAPH;\n"; if($i==0) { $graphlines2=$graphlines2." x_graph=new double[n_graphs][max_graph];\n"; $graphlines2=$graphlines2." y_graph=new double[n_graphs][max_graph];\n"; } for($j=0;$j<$graphnum;$j++) { $graphlines2=$graphlines2." x_graph[$i][$j]=$graphxa[$j];\n"; $graphlines2=$graphlines2." y_graph[$i][$j]=$graphya[$j];\n"; } } #set up displaylines print "CHECKING ITEMS TO BE DISPLAYED\n"; $displaylines=" allow_display = new boolean[n_tot];\n"; $displaylines=$displaylines." default_display = new boolean[n_tot];\n"; $count=0; for($i=0;$i<$nvar;$i=$i+1) { $displaylines=$displaylines." allow_display[$count]=$vardisplay[$i]; //$var[$i]\n"; $displaylines=$displaylines." default_display[$count]=$vardisplay[$i];\n"; $count++; } for($i=0;$i<$nvarf;$i=$i+1) { $displaylines=$displaylines." allow_display[$count]=$varfdisplay[$i]; //$varfname[$i]\n"; $displaylines=$displaylines." default_display[$count]=$varfdisplay[$i];\n"; $count++; } for($i=0;$i<$nrate;$i=$i+1) { $displaylines=$displaylines." allow_display[$count]=$ratedisplay[$i]; //$convname[$i]\n"; $displaylines=$displaylines." default_display[$count]=$ratedisplay[$i];\n"; $count++; } for($i=0;$i<$nconv;$i=$i+1) { $displaylines=$displaylines." allow_display[$count]=$convdisplay[$i]; //$convname[$i]\n"; $displaylines=$displaylines." default_display[$count]=$convdisplay[$i];\n"; $count++; } for($i=0;$i<$nflow;$i=$i+1) { $displaylines=$displaylines." allow_display[$count]=$flowdisplay[$i]; //$convname[$i]\n"; $displaylines=$displaylines." default_display[$count]=$flowdisplay[$i];\n"; $count++; } $tcount=0; while ($displaylines =~ s/DISP_TRUE/true/) {$tcount++;} $displaylines =~ s/DISP_FALSE/false/g; if($tcount>9) { print "---- WARNING ---- $tcount items selected for display.\n"; print " Stella2Java allows a maximum of 9.\n"; } #check for conditional statements for($i=0;$i<$nderiv;$i=$i+1) { $dtline[$i]=condition($dtline[$i]); #$dtline[$i]=javaize($dtline[$i]); } print "ABOUT TO SORT AND CHECK FOR CIRCULAR REFERENCES\n"; $sortdone=0; $sortcount=0; while($sortdone==0) { #sort lines to be written in deriv routine. for($i=0;$i<$nderiv;$i++) { for($j=$i+1;$j<$nderiv;$j++) { #if line i contains name j, name j should be computed #first, so swap. if($dtline[$i] =~ /\b$dtname[$j]\b/) { $tname=$dtname[$i]; $tline=$dtline[$i]; $dtname[$i]=$dtname[$j]; $dtline[$i]=$dtline[$j]; $dtname[$j]=$tname; $dtline[$j]=$tline; } } } #after sorintg, check for circular references $sortdone=1; for($i=0;$i<$nderiv;$i++) { $lflag=0; for($j=$i+1;$j<$nderiv;$j++) { #if line i containsany of the names from j or greater, #fail circular reference check. if($dtline[$i] =~ /\b$dtname[$j]\b/) { if($sortcount>100) { print "FAILED CIRCULAR RERERENCE CHECK\n"; exit; } $sortdone=0; print "CIRCULAR REFERENCE CHECK, PASS $sortcount\n"; } } } $sortcount++; } $incondlines=$derivlines; $initlines=$derivlines; #replace actual names with variable names for($i=0;$i<$nderiv;$i++) { $varfflag=0; $varflag=0; $rateflag=0; for ($j=0;$j<$nvar;$j++ ) { $dtline[$i] =~ s/\b$var[$j]\b/x[$j]/g; if($dtname[$i]=~/\b$var[$j]\b/) {$varflag=1;} } for ($j=0;$j<$nvarf;$j++ ) { $dtline[$i] =~ s/\b$varfname[$j]\b/x[$j+n_vars]/g; if ($dtname[$i] =~ /\b$varfname[$j]\b/) {$varfflag=1;} } for ($j=0;$j<$nrate;$j++ ) { $dtline[$i] =~ s/\b$rate[$j]\b/rate[$j]/g; if($dtname[$i]=~/\b$rate[$j]\b/) {$rateflag=1;} } for ($j=0;$j<$nconv;$j++) { $dtline[$i] =~ s/\b$convname[$j]\b/conv[$j]/g; } for ($j=0;$j<$nflow;$j++) { $dtline[$i] =~ s/\b$flowname[$j]\b/flow[$j]/g; } $incondlines=$incondlines." ".$dtline[$i]; if ($varflag==0&&$rateflag==0) { $initlines=$initlines." ".$dtline[$i]; } if ($varfflag==0&&$varflag==0&&$rateflag==0) { $derivlines=$derivlines." ".$dtline[$i]; } } for($i=0;$i<$nvar;$i++) { $prime[$i]="xprime[$i]="; $ientered=0; for($j=0;$j<$nflow;$j++) { if($flowfrom[$j] eq $var[$i]) { $prime[$i]=$prime[$i]."-flow[$j]"; $ientered++; } if($flowto[$j] eq $var[$i]) { if($ientered==0){ $prime[$i]=$prime[$i]."flow[$j]"; $ientered++; } else { $prime[$i]=$prime[$i]."+flow[$j]"; $ientered++; } } } if($ientered==0) {$prime[$i]=$prime[$i]."0.0";} $derivlines=$derivlines." ".$prime[$i].";\n"; } for($i=0;$i<$nvarf;$i++) { $prime[$i]="xprime[$i+n_vars]="; $ientered=0; for($j=0;$j<$nflow;$j++) { if($flowfrom[$j] eq $varfname[$i]) { $prime[$i]=$prime[$i]."-flow[$j]"; $ientered++; } if($flowto[$j] eq $varfname[$i]) { if($ientered==0){ $prime[$i]=$prime[$i]."flow[$j]"; $ientered++; } else { $prime[$i]=$prime[$i]."+flow[$j]"; $ientered++; } } } $derivlines=$derivlines." ".$prime[$i].";\n"; } # need to create strings of the following, as one string. $labelstring=""; for($i=0;$i<$nvar;$i++) { $labelstring=$labelstring." var_label[$i]=\"".$var[$i]."\";\n"; } for($i=0;$i<$nvarf;$i++) { $labelstring=$labelstring." varf_label[$i]=\"".$varfname[$i]."\";\n"; } for($i=0;$i<$nrate;$i++) { $labelstring=$labelstring." rate_label[$i]=\"".$rate[$i]."\";\n"; } for($i=0;$i<$nconv;$i++) { $labelstring=$labelstring." conv_label[$i]=\"".$convname[$i]."\";\n"; } for($i=0;$i<$nflow;$i++) { $labelstring=$labelstring." flow_label[$i]=\"".$flowname[$i]."\";\n"; } $defstrings=""; for($i=0;$i<$nvar;$i++) { $defstrings=$defstrings." var_minsb[$i]=$varmin[$i];\n"; } for($i=0;$i<$nrate;$i++) { $defstrings=$defstrings." rate_minsb[$i]=$ratemin[$i];\n"; } for($i=0;$i<$nvar;$i++) { $defstrings=$defstrings." var_maxsb[$i]=$varmax[$i];\n"; } for($i=0;$i<$nrate;$i++) { $defstrings=$defstrings." rate_maxsb[$i]=$ratemax[$i];\n"; } for($i=0;$i<$nvar;$i++) { $defstrings=$defstrings." var_defaultsb[$i]=x[$i];\n"; } for($i=0;$i<$nrate;$i++) { $defstrings=$defstrings." rate_defaultsb[$i]=rate[$i];\n"; } for($i=0;$i<$nvar;$i++) { $defstrings=$defstrings." var_stylesb[$i]=$varstyle[$i];\n"; } for($i=0;$i<$nrate;$i++) { $defstrings=$defstrings." rate_stylesb[$i]=$ratestyle[$i];\n"; } #checking for graph labels if ($title eq '') { $titleString = ""; } else { $titleString = " gr_title = new String(\"$title\");"; } if ($depLabel eq '') { $depLabelString = ""; } else { $depLabelString = " gr_depLabel = new String(\"$depLabel\");"; } open (MODELFILE,">$tmp/$tmp_dir/Model.java")|| die "can't create" ; write (MODELFILE); close (MODELFILE); print "SCRIPT COMPLETED\n"; sub condition { my($teststring)=@_; my(@testa,$count,$fullline,$elsecount,$parenth,$line,$junk,@lastif); my(@firstif,$levelstring,$parenthcount,$i); my($arg,@rest); $teststring = strip($teststring); $teststring =~ s/\bif\b/ IF /gi; $teststring =~ s/\bthen\b/ THEN /gi; $teststring =~ s/\belse\b/ ELSE /gi; $teststring =~ s/\bor\b/||/gi; $teststring =~ s/\bnot\b/!/gi; $teststring =~ s/\band\b/&&/gi; @testa=split(/\bIF\b/,$teststring); $count=0; $fullline=""; $elsecount=0; $parenth=0; foreach $line (@testa) { chomp($line); $line = strip($line); if ($count>0) { $fullline = $fullline."\n if ( "; $junk = $line; $junk =~ s/\=/\=\=/g; $junk =~ s/([>$toplevel) {$toplevel = $level+1} "___LPARENTH".$level++."___";} else {"___RPARENTH".--$level."___";}/ge; $localstring =~ s/\=/___EQUALS___/g; @contain_check = qw {time if ___EQUALS____ then graph else or and not}; #add extra parentheses around function calls for($i=1;$i<=$toplevel;$i=$i+1) { $localstring =~ s/\b(\w+)(\s*)___LPARENTH($i)___(.*?)___RPARENTH($i)___/if (contain($1,@contain_check)==1) { sprintf("$1($4)"); } else { print "FOUND A FUNCTION $1 | $4 \n";sprintf("($1($4))"); }/ge; } $localstring =~ s/___POINT___/\./g; $localstring =~ s/___EQUALS___/\=/g; #strip parenthese $localstring =~ s/___LPARENTH(\d+)___/\(/g; $localstring =~ s/___RPARENTH(\d+)___/\)/g; #refigure parentheses including functions $level=1;$toplevel=1; $localstring =~ s/(\(|\))/ if ($1 eq "(") {$toplevel++; "___LPARENTH".$level++."___ ";} else {" ___RPARENTH".--$level."___";}/ge; #check for exponential notation, decimal points $localstring =~ s/(\d+)E\-/$1___EXPONMINUS\./gi; $localstring =~ s/(\.)E\-/$1___EXPONMINUS\./gi; $localstring =~ s/(\d*)\.(\d*)/$1___POINT___$2/g; $localstring =~ s/\-/___MINUS___/g; #look for exponentiation operator (^), replace with POW function for ($i=$toplevel;$i>=0;$i=$i-1) { for($j=$toplevel;$j>=0;$j=$j-1) { if($i==1&&$j==0) { $localstring =~ s/(\w+)\^(\w+)/Math.pow\($1,$2\)/gx; print "POW 1 $1 $2\n"; } elsif ($i==0) { $localstring =~ s/(\w+)\^___LPARENTH($j)___(.*?)___RPARENTH($j)___/Math.pow\($1,$3\)/gx; print "POW 2 $1 $3\n"; } elsif ($j==0) { $localstring =~ s/___LPARENTH($i)___(.*?)___RPARENTH($i)___\^(\w+)/Math.pow\($2,$4\)/gx; print "POW 3 $2 $4 \n"; } else { $localstring =~ s/___LPARENTH($i)___(.*?)___RPARENTH($i)___\^___LPARENTH($j)___(.*?)___RPARENTH($j)___/Math.pow\($2,$5\)/gx; print "POW 4 $2 $5\n"; } } } #remove decimal point and exponential notation markers $localstring =~ s/___POINT___/\./g; $localstring =~ s/___EXPONMINUS\./E\-/g; $localstring =~ s/___MINUS___/\-/g; $localstring =~ s/___LPARENTH(\d+)___ /\(/g; $localstring =~ s/ ___RPARENTH(\d+)___/\)/g; # $localstring =~ s/\//sprintf(" ___DIVIDED_BY ")/ge; # $localstring =~ s/\*/sprintf(" ___TIMES ")/ge; # $localstring =~ s/\+/sprintf(" ___PLUS ")/ge; # $localstring =~ s/\-/sprintf(" ___MINUS ")/ge; # $localstring =~ s/\(/sprintf(" ___LEFT_PARENTH ")/ge; # $localstring =~ s/\)/sprintf(" ___RIGHT_PARENTH ")/ge; # $localstring =~ s/\>/sprintf(" ___GREATER_THAN ")/ge; # $localstring =~ s/\/g; # $localstring =~ s/___LESS_THAN/\max_graph) max_graph=n_graph[i]; } @* $graphlines2 // --------------------------------------------- // init(n_vartot); rate = new double[n_rates]; conv = new double[n_convs]; flow = new double[n_flows]; ntime=100; xtime = new double[ntime*(1+n_tot)]; var_label=new String[n_vars]; varf_label=new String[n_varfs]; rate_label=new String[n_rates]; conv_label=new String[n_convs]; flow_label=new String[n_flows]; var_minsb=new double[n_vars]; rate_minsb=new double[n_rates]; var_maxsb=new double[n_vars]; rate_maxsb=new double[n_rates]; var_defaultsb=new double[n_vars]; rate_defaultsb=new double[n_rates]; var_stylesb=new int[n_vars]; rate_stylesb=new int[n_rates]; // --- Set default size and value for model ---- // @* $incondlines @* $defstrings @* $titleString @* $depLabelString // --------------------------------------------- // // ------- Label variables and rates ----------- // @* $labelstring output_header=new String(); // --- Set the header line for text output ----- // output_header= "\tTime\tvar1\tvar2\tvar3 \n"; output_header+="---------------------------------------------------"; // --------------------------------------------- // method=EULER; } public void reset_xtime(int newn) { if(newn==ntime) return; ntime=newn; xtime = new double[ntime*(1+n_tot)]; } public void solve(double [] x_var, double [] x_rate, double it, double ft,double st, boolean adaptive){ tinitial=it; tfinal=ft; time=tinitial; tstep=st; int newn=(int)((tfinal-tinitial)/st)+1; reset_xtime(newn); for(int i=0;i= (vpulse_start) && (time - vpulse_start) < (vpulse_interval)){ return 1.0; } else { return 0.0; } } public double pulse(double x) { return (x/tstep); } public double pulse(double x, double first_t, double interval_t) { if (time>first_t && remainder(time,interval_t)>0.0 && remainder(time,interval_t)<=tstep) return (x/tstep); else return 0.0; } public double ramp(double slope) { return time*slope; } public double ramp(double slope,double ramp_start) { if (time>ramp_start) { return (time-ramp_start)*slope; } else { return 0; } } public double step(double height,double step_time) { if(time>=step_time) { return height; } else { return 0; } } public double graph(int index,double dep_var) { //access xgraph_i,j, ygraph_i,j, ngraph_i, n_graphs. if(dep_varx_graph[index][n_graph[index]-1]) { //take upper boundary value return y_graph[index][n_graph[index]-1]; } else { //find which element to use, linear intepolation for(int i=0;i=x_graph[index][i]&&dep_vartest) { retval++; product*=Math.random(); } return (double)retval; } } .