/* BEGIN OUTFILE1 */
load("stringproc");
/* Begin Function number 1*/
reached_interval()
:= (
block([ret],
if ((((array_x[1] >= glob_next_display) and not glob_neg_h) or ((array_x[1] <= glob_next_display) and glob_neg_h)) or (glob_next_display = 0.0)) then ( /* if number 1*/
ret : true
) else (
ret : false
)/* end if 1*/
,
return(ret)
)
/* End Function number1*/);
/* Begin Function number 1*/
display_alot(iter)
:= (
block([abserr, analytic_val_y, ind_var, numeric_val, relerr, term_no],
/* TOP DISPLAY ALOT */
if (reached_interval()) then ( /* if number 1*/
if (iter >= 0) then ( /* if number 2*/
ind_var : array_x[1],
omniout_float(ALWAYS,"x[1] ",33,ind_var,20," "),
analytic_val_y : exact_soln_y(ind_var),
omniout_float(ALWAYS,"y[1] (analytic) ",33,analytic_val_y,20," "),
term_no : 1,
numeric_val : array_y[term_no],
abserr : omniabs(numeric_val - analytic_val_y),
omniout_float(ALWAYS,"y[1] (numeric) ",33,numeric_val,20," "),
if (omniabs(analytic_val_y) # 0.0) then ( /* if number 3*/
relerr : abserr*100.0/omniabs(analytic_val_y),
if (relerr # 0.0) then ( /* if number 4*/
glob_good_digits : -floor(log10(relerr/100.0))
) else (
glob_good_digits : 16
)/* end if 4*/
) else (
relerr : -1.0 ,
glob_good_digits : -1
)/* end if 3*/
,
if (glob_iter = 1) then ( /* if number 3*/
array_1st_rel_error[1] : relerr
) else (
array_last_rel_error[1] : relerr
)/* end if 3*/
,
omniout_float(ALWAYS,"absolute error ",4,abserr,20," "),
omniout_float(ALWAYS,"relative error ",4,relerr,20,"%"),
omniout_int(INFO,"Correct digits ",32,glob_good_digits,4," ")
,
omniout_float(ALWAYS,"h ",4,glob_h,20," ")
)/* end if 2*/
/* BOTTOM DISPLAY ALOT */
)/* end if 1*/
)
/* End Function number1*/);
/* Begin Function number 1*/
adjust_for_pole(h_param)
:= (
block([hnew, sz2, tmp],
/* TOP ADJUST FOR POLE */
block(
hnew : h_param,
glob_normmax : glob_small_float,
if (omniabs(array_y_higher[1,1]) > glob_small_float) then ( /* if number 1*/
tmp : omniabs(array_y_higher[1,1]),
if (tmp < glob_normmax) then ( /* if number 2*/
glob_normmax : tmp
)/* end if 2*/
)/* end if 1*/
,
if (glob_look_poles and (omniabs(array_pole[1]) > glob_small_float) and (array_pole[1] # glob_large_float)) then ( /* if number 1*/
sz2 : array_pole[1]/10.0,
if (sz2 < hnew) then ( /* if number 2*/
omniout_float(INFO,"glob_h adjusted to ",20,h_param,12,"due to singularity."),
omniout_str(INFO,"Reached Optimal"),
return(hnew)
)/* end if 2*/
)/* end if 1*/
,
if ( not glob_reached_optimal_h) then ( /* if number 1*/
glob_reached_optimal_h : true,
glob_curr_iter_when_opt : glob_current_iter,
glob_optimal_clock_start_sec : elapsed_time_seconds(),
glob_optimal_start : array_x[1]
)/* end if 1*/
,
hnew : sz2
),/* END block */
return(hnew)
/* BOTTOM ADJUST FOR POLE */
)
/* End Function number1*/);
/* Begin Function number 1*/
prog_report(x_start,x_end)
:= (
block([ clock_sec, opt_clock_sec, clock_sec1, expect_sec, left_sec, percent_done, total_clock_sec],
/* TOP PROGRESS REPORT */
clock_sec1 : elapsed_time_seconds(),
total_clock_sec : convfloat(clock_sec1) - convfloat(glob_orig_start_sec),
glob_clock_sec : convfloat(clock_sec1) - convfloat(glob_clock_start_sec),
left_sec : convfloat(glob_max_sec) + convfloat(glob_orig_start_sec) - convfloat(clock_sec1),
expect_sec : comp_expect_sec(convfloat(x_end),convfloat(x_start),convfloat(array_x[1]) + convfloat(glob_h) ,convfloat( clock_sec1) - convfloat(glob_orig_start_sec)),
opt_clock_sec : convfloat( clock_sec1) - convfloat(glob_optimal_clock_start_sec),
glob_optimal_expect_sec : comp_expect_sec(convfloat(x_end),convfloat(x_start),convfloat(array_x[1]) +convfloat( glob_h) ,convfloat( opt_clock_sec)),
percent_done : comp_percent(convfloat(x_end),convfloat(x_start),convfloat(array_x[1]) + convfloat(glob_h)),
glob_percent_done : percent_done,
omniout_str_noeol(INFO,"Total Elapsed Time "),
omniout_timestr(convfloat(total_clock_sec)),
omniout_str_noeol(INFO,"Elapsed Time(since restart) "),
omniout_timestr(convfloat(glob_clock_sec)),
if (convfloat(percent_done) < convfloat(100.0)) then ( /* if number 1*/
omniout_str_noeol(INFO,"Expected Time Remaining "),
omniout_timestr(convfloat(expect_sec)),
omniout_str_noeol(INFO,"Optimized Time Remaining "),
omniout_timestr(convfloat(glob_optimal_expect_sec))
)/* end if 1*/
,
omniout_str_noeol(INFO,"Time to Timeout "),
omniout_timestr(convfloat(left_sec)),
omniout_float(INFO, "Percent Done ",33,percent_done,4,"%")
/* BOTTOM PROGRESS REPORT */
)
/* End Function number1*/);
/* Begin Function number 1*/
check_for_pole()
:= (
block([cnt, dr1, dr2, ds1, ds2, hdrc, m, n, nr1, nr2, ord_no, rad_c, rcs, rm0, rm1, rm2, rm3, rm4, found],
/* TOP CHECK FOR POLE */
/* IN RADII REAL EQ = 1 */
/* Computes radius of convergence and r_order of pole from 3 adjacent Taylor series terms. EQUATUON NUMBER 1 */
/* Applies to pole of arbitrary r_order on the real axis, */
/* Due to Prof. George Corliss. */
n : glob_max_terms,
m : n - 1 - 1,
while ((m >= 10) and ((omniabs(array_y_higher[1,m]) < glob_small_float) or (omniabs(array_y_higher[1,m-1]) < glob_small_float) or (omniabs(array_y_higher[1,m-2]) < glob_small_float ))) do ( /* do number 2*/
m : m - 1
)/* end do number 2*/
,
if (m > 10) then ( /* if number 1*/
rm0 : array_y_higher[1,m]/array_y_higher[1,m-1],
rm1 : array_y_higher[1,m-1]/array_y_higher[1,m-2],
hdrc : convfloat(m-1)*rm0-convfloat(m-2)*rm1,
if (omniabs(hdrc) > glob_small_float) then ( /* if number 2*/
rcs : glob_h/hdrc,
ord_no : convfloat(m-1)*rm0/hdrc - convfloat(m) + 2.0,
array_real_pole[1,1] : rcs,
array_real_pole[1,2] : ord_no
) else (
array_real_pole[1,1] : glob_large_float,
array_real_pole[1,2] : glob_large_float
)/* end if 2*/
) else (
array_real_pole[1,1] : glob_large_float,
array_real_pole[1,2] : glob_large_float
)/* end if 1*/
,
/* BOTTOM RADII REAL EQ = 1 */
/* TOP RADII COMPLEX EQ = 1 */
/* Computes radius of convergence for complex conjugate pair of poles. */
/* from 6 adjacent Taylor series terms */
/* Also computes r_order of poles. */
/* Due to Manuel Prieto. */
/* With a correction by Dennis J. Darland */
n : glob_max_terms - 1 - 1,
cnt : 0,
while ((cnt < 5) and (n >= 10)) do ( /* do number 2*/
if (omniabs(array_y_higher[1,n]) > glob_small_float) then ( /* if number 1*/
cnt : cnt + 1
) else (
cnt : 0
)/* end if 1*/
,
n : n - 1
)/* end do number 2*/
,
m : n + cnt,
if (m <= 10) then ( /* if number 1*/
array_complex_pole[1,1] : glob_large_float,
array_complex_pole[1,2] : glob_large_float
) elseif ((omniabs(array_y_higher[1,m]) >= (glob_large_float)) or (omniabs(array_y_higher[1,m-1]) >=(glob_large_float)) or (omniabs(array_y_higher[1,m-2]) >= (glob_large_float)) or (omniabs(array_y_higher[1,m-3]) >= (glob_large_float)) or (omniabs(array_y_higher[1,m-4]) >= (glob_large_float)) or (omniabs(array_y_higher[1,m-5]) >= (glob_large_float))) then ( /* if number 2*/
array_complex_pole[1,1] : glob_large_float,
array_complex_pole[1,2] : glob_large_float
) else (
rm0 : (array_y_higher[1,m])/(array_y_higher[1,m-1]),
rm1 : (array_y_higher[1,m-1])/(array_y_higher[1,m-2]),
rm2 : (array_y_higher[1,m-2])/(array_y_higher[1,m-3]),
rm3 : (array_y_higher[1,m-3])/(array_y_higher[1,m-4]),
rm4 : (array_y_higher[1,m-4])/(array_y_higher[1,m-5]),
nr1 : convfloat(m-1)*rm0 - 2.0*convfloat(m-2)*rm1 + convfloat(m-3)*rm2,
nr2 : convfloat(m-2)*rm1 - 2.0*convfloat(m-3)*rm2 + convfloat(m-4)*rm3,
dr1 : (-1.0)/rm1 + 2.0/rm2 - 1.0/rm3,
dr2 : (-1.0)/rm2 + 2.0/rm3 - 1.0/rm4,
ds1 : 3.0/rm1 - 8.0/rm2 + 5.0/rm3,
ds2 : 3.0/rm2 - 8.0/rm3 + 5.0/rm4,
if ((omniabs(nr1 * dr2 - nr2 * dr1) <= glob_small_float) or (omniabs(dr1) <= glob_small_float)) then ( /* if number 3*/
array_complex_pole[1,1] : glob_large_float,
array_complex_pole[1,2] : glob_large_float
) else (
if (omniabs(nr1*dr2 - nr2 * dr1) > glob_small_float) then ( /* if number 4*/
rcs : ((ds1*dr2 - ds2*dr1 +dr1*dr2)/(nr1*dr2 - nr2 * dr1)),
/* (Manuels) rcs : (ds1*dr2 - ds2*dr1)/(nr1*dr2 - nr2 * dr1) */
ord_no : (rcs*nr1 - ds1)/(2.0*dr1) -convfloat(m)/2.0,
if (omniabs(rcs) > glob_small_float) then ( /* if number 5*/
if (rcs > 0.0) then ( /* if number 6*/
rad_c : sqrt(rcs) * omniabs(glob_h)
) else (
rad_c : glob_large_float
)/* end if 6*/
) else (
rad_c : glob_large_float,
ord_no : glob_large_float
)/* end if 5*/
) else (
rad_c : glob_large_float,
ord_no : glob_large_float
)/* end if 4*/
)/* end if 3*/
,
array_complex_pole[1,1] : rad_c,
array_complex_pole[1,2] : ord_no
)/* end if 2*/
,
/* BOTTOM RADII COMPLEX EQ = 1 */
found : false,
/* TOP WHICH RADII EQ = 1 */
if ( not found and ((array_real_pole[1,1] = glob_large_float) or (array_real_pole[1,2] = glob_large_float)) and ((array_complex_pole[1,1] # glob_large_float) and (array_complex_pole[1,2] # glob_large_float)) and ((array_complex_pole[1,1] > 0.0) and (array_complex_pole[1,2] > 0.0))) then ( /* if number 2*/
array_poles[1,1] : array_complex_pole[1,1],
array_poles[1,2] : array_complex_pole[1,2],
found : true,
array_type_pole[1] : 2,
if (glob_display_flag) then ( /* if number 3*/
omniout_str(ALWAYS,"Complex estimate of poles used")
)/* end if 3*/
)/* end if 2*/
,
if ( not found and ((array_real_pole[1,1] # glob_large_float) and (array_real_pole[1,2] # glob_large_float) and (array_real_pole[1,1] > 0.0) and (array_real_pole[1,2] > 0.0) and ((array_complex_pole[1,1] = glob_large_float) or (array_complex_pole[1,2] = glob_large_float) or (array_complex_pole[1,1] <= 0.0 ) or (array_complex_pole[1,2] <= 0.0)))) then ( /* if number 2*/
array_poles[1,1] : array_real_pole[1,1],
array_poles[1,2] : array_real_pole[1,2],
found : true,
array_type_pole[1] : 1,
if (glob_display_flag) then ( /* if number 3*/
omniout_str(ALWAYS,"Real estimate of pole used")
)/* end if 3*/
)/* end if 2*/
,
if ( not found and (((array_real_pole[1,1] = glob_large_float) or (array_real_pole[1,2] = glob_large_float)) and ((array_complex_pole[1,1] = glob_large_float) or (array_complex_pole[1,2] = glob_large_float)))) then ( /* if number 2*/
array_poles[1,1] : glob_large_float,
array_poles[1,2] : glob_large_float,
found : true,
array_type_pole[1] : 3,
if (reached_interval()) then ( /* if number 3*/
omniout_str(ALWAYS,"NO POLE")
)/* end if 3*/
)/* end if 2*/
,
if ( not found and ((array_real_pole[1,1] < array_complex_pole[1,1]) and (array_real_pole[1,1] > 0.0) and (array_real_pole[1,2] > 0.0))) then ( /* if number 2*/
array_poles[1,1] : array_real_pole[1,1],
array_poles[1,2] : array_real_pole[1,2],
found : true,
array_type_pole[1] : 1,
if (glob_display_flag) then ( /* if number 3*/
omniout_str(ALWAYS,"Real estimate of pole used")
)/* end if 3*/
)/* end if 2*/
,
if ( not found and ((array_complex_pole[1,1] # glob_large_float) and (array_complex_pole[1,2] # glob_large_float) and (array_complex_pole[1,1] > 0.0) and (array_complex_pole[1,2] > 0.0))) then ( /* if number 2*/
array_poles[1,1] : array_complex_pole[1,1],
array_poles[1,2] : array_complex_pole[1,2],
array_type_pole[1] : 2,
found : true,
if (glob_display_flag) then ( /* if number 3*/
omniout_str(ALWAYS,"Complex estimate of poles used")
)/* end if 3*/
)/* end if 2*/
,
if ( not found ) then ( /* if number 2*/
array_poles[1,1] : glob_large_float,
array_poles[1,2] : glob_large_float,
array_type_pole[1] : 3,
if (reached_interval()) then ( /* if number 3*/
omniout_str(ALWAYS,"NO POLE")
)/* end if 3*/
)/* end if 2*/
,
/* BOTTOM WHICH RADII EQ = 1 */
array_pole[1] : glob_large_float,
array_pole[2] : glob_large_float,
/* TOP WHICH RADIUS EQ = 1 */
if (array_pole[1] > array_poles[1,1]) then ( /* if number 2*/
array_pole[1] : array_poles[1,1],
array_pole[2] : array_poles[1,2]
)/* end if 2*/
,
/* BOTTOM WHICH RADIUS EQ = 1 */
/* BOTTOM CHECK FOR POLE */
if (reached_interval()) then ( /* if number 2*/
display_pole()
)/* end if 2*/
)
/* End Function number1*/);
/* Begin Function number 1*/
get_norms()
:= (
block([ iii],
if ( not glob_initial_pass) then ( /* if number 2*/
iii : 1,
while (iii <= glob_max_terms) do ( /* do number 2*/
array_norms[iii] : 0.0,
iii : iii + 1
)/* end do number 2*/
,
/* TOP GET NORMS */
iii : 1,
while (iii <= glob_max_terms) do ( /* do number 2*/
if (omniabs(array_y[iii]) > array_norms[iii]) then ( /* if number 3*/
array_norms[iii] : omniabs(array_y[iii])
)/* end if 3*/
,
iii : iii + 1
)/* end do number 2*/
/* BOTTOM GET NORMS */
)/* end if 2*/
)
/* End Function number1*/);
/* Begin Function number 1*/
atomall()
:= (
block([ kkk, order_d, adj2, temporary, term,temp,temp2],
/* TOP ATOMALL */
/* END OUTFILE1 */
/* BEGIN ATOMHDR1 */
/* emit pre mult CONST - LINEAR $eq_no = 1 i = 1 */
array_tmp1[1] : array_const_0D1[1] * array_x[1],
/* emit pre add LINEAR - CONST $eq_no = 1 i = 1 */
array_tmp2[1] : array_tmp1[1] + array_const_0D2[1],
omniout_str(ALWAYS,"WARNING: arccos of linear function has low precision in testing."),
/* emit pre acos ID_LINEAR iii = 1 $eq_no = 1 */
/* emit pre acos 1 $eq_no = 1 */
array_tmp3[1] : arccos(array_tmp2[1]),
array_tmp3_a1[1] : sin(array_tmp3[1]),
/* emit pre add CONST FULL $eq_no = 1 i = 1 */
array_tmp4[1] : array_const_0D0[1] + array_tmp3[1],
/* emit pre assign xxx $eq_no = 1 i = 1 $min_hdrs = 5 */
if ( not array_y_set_initial[1,2]) then ( /* if number 1*/
if (1 <= glob_max_terms) then ( /* if number 2*/
temporary : array_tmp4[1] * expt(glob_h , (1)) * factorial_3(0,1),
array_y[2] : temporary,
array_y_higher[1,2] : temporary,
temporary : temporary / glob_h * (2.0),
array_y_higher[2,1] : temporary
)/* end if 2*/
)/* end if 1*/
,
kkk : 2,
/* END ATOMHDR1 */
/* BEGIN ATOMHDR2 */
/* emit pre mult CONST - LINEAR $eq_no = 1 i = 2 */
array_tmp1[2] : array_const_0D1[1] * array_x[2],
/* emit pre add LINEAR - CONST $eq_no = 1 i = 2 */
array_tmp2[2] : array_tmp1[2],
/* emit pre acos ID_LINEAR iii = 2 $eq_no = 1 */
/* emit pre acos 1 $eq_no = 1 */
array_tmp3[2] : - array_tmp2[2] / array_tmp3_a1[1],
array_tmp3_a1[2] : array_tmp2[1] * array_tmp3[2],
/* emit pre add CONST FULL $eq_no = 1 i = 2 */
array_tmp4[2] : array_tmp3[2],
/* emit pre assign xxx $eq_no = 1 i = 2 $min_hdrs = 5 */
if ( not array_y_set_initial[1,3]) then ( /* if number 1*/
if (2 <= glob_max_terms) then ( /* if number 2*/
temporary : array_tmp4[2] * expt(glob_h , (1)) * factorial_3(1,2),
array_y[3] : temporary,
array_y_higher[1,3] : temporary,
temporary : temporary / glob_h * (2.0),
array_y_higher[2,2] : temporary
)/* end if 2*/
)/* end if 1*/
,
kkk : 3,
/* END ATOMHDR2 */
/* BEGIN ATOMHDR3 */
/* emit pre acos ID_LINEAR iii = 3 $eq_no = 1 */
array_tmp3[3] : att(2,array_tmp3_a1,array_tmp3,2) / array_tmp3_a1[1],
array_tmp3_a1[3] : array_tmp3[3] * array_tmp2[1] + array_tmp3[2] * array_tmp2[2] * 1 / 2,
/* emit pre add CONST FULL $eq_no = 1 i = 3 */
array_tmp4[3] : array_tmp3[3],
/* emit pre assign xxx $eq_no = 1 i = 3 $min_hdrs = 5 */
if ( not array_y_set_initial[1,4]) then ( /* if number 1*/
if (3 <= glob_max_terms) then ( /* if number 2*/
temporary : array_tmp4[3] * expt(glob_h , (1)) * factorial_3(2,3),
array_y[4] : temporary,
array_y_higher[1,4] : temporary,
temporary : temporary / glob_h * (2.0),
array_y_higher[2,3] : temporary
)/* end if 2*/
)/* end if 1*/
,
kkk : 4,
/* END ATOMHDR3 */
/* BEGIN ATOMHDR4 */
/* emit pre acos ID_LINEAR iii = 4 $eq_no = 1 */
array_tmp3[4] : att(3,array_tmp3_a1,array_tmp3,2) / array_tmp3_a1[1],
array_tmp3_a1[4] : array_tmp3[4] * array_tmp2[1] + array_tmp3[3] * array_tmp2[2] * 2 / 3,
/* emit pre add CONST FULL $eq_no = 1 i = 4 */
array_tmp4[4] : array_tmp3[4],
/* emit pre assign xxx $eq_no = 1 i = 4 $min_hdrs = 5 */
if ( not array_y_set_initial[1,5]) then ( /* if number 1*/
if (4 <= glob_max_terms) then ( /* if number 2*/
temporary : array_tmp4[4] * expt(glob_h , (1)) * factorial_3(3,4),
array_y[5] : temporary,
array_y_higher[1,5] : temporary,
temporary : temporary / glob_h * (2.0),
array_y_higher[2,4] : temporary
)/* end if 2*/
)/* end if 1*/
,
kkk : 5,
/* END ATOMHDR4 */
/* BEGIN ATOMHDR5 */
/* emit pre acos ID_LINEAR iii = 5 $eq_no = 1 */
array_tmp3[5] : att(4,array_tmp3_a1,array_tmp3,2) / array_tmp3_a1[1],
array_tmp3_a1[5] : array_tmp3[5] * array_tmp2[1] + array_tmp3[4] * array_tmp2[2] * 3 / 4,
/* emit pre add CONST FULL $eq_no = 1 i = 5 */
array_tmp4[5] : array_tmp3[5],
/* emit pre assign xxx $eq_no = 1 i = 5 $min_hdrs = 5 */
if ( not array_y_set_initial[1,6]) then ( /* if number 1*/
if (5 <= glob_max_terms) then ( /* if number 2*/
temporary : array_tmp4[5] * expt(glob_h , (1)) * factorial_3(4,5),
array_y[6] : temporary,
array_y_higher[1,6] : temporary,
temporary : temporary / glob_h * (2.0),
array_y_higher[2,5] : temporary
)/* end if 2*/
)/* end if 1*/
,
kkk : 6,
/* END ATOMHDR5 */
/* BEGIN OUTFILE3 */
/* Top Atomall While Loop-- outfile3 */
while (kkk <= glob_max_terms) do ( /* do number 1*/
/* END OUTFILE3 */
/* BEGIN OUTFILE4 */
/* emit acos ID_LINEAR $eq_no = 1 */
array_tmp3[kkk] : att(kkk-1,array_tmp3_a1,array_tmp3,2)/array_tmp3_a1[1],
array_tmp3_a1[kkk] : array_tmp3[kkk] * array_tmp2[1] + array_tmp3[kkk-1] * array_tmp2[2] * (kkk - 2) / (kkk - 1),
/* emit NOT FULL - FULL add $eq_no = 1 */
array_tmp4[kkk] : array_tmp3[kkk],
/* emit assign $eq_no = 1 */
order_d : 1,
if (kkk + order_d + 1 <= glob_max_terms) then ( /* if number 1*/
if ( not array_y_set_initial[1,kkk + order_d]) then ( /* if number 2*/
temporary : array_tmp4[kkk] * expt(glob_h , (order_d)) / factorial_3((kkk - 1),(kkk + order_d - 1)),
array_y[kkk + order_d] : temporary,
array_y_higher[1,kkk + order_d] : temporary,
term : kkk + order_d - 1,
adj2 : 2,
while ((adj2 <= order_d + 1) and (term >= 1)) do ( /* do number 2*/
temporary : temporary / glob_h * convfp(adj2),
array_y_higher[adj2,term] : temporary,
adj2 : adj2 + 1,
term : term - 1
)/* end do number 2*/
)/* end if 2*/
)/* end if 1*/
,
kkk : kkk + 1
)/* end do number 1*/
/* BOTTOM ATOMALL */
/* END OUTFILE4 */
/* BEGIN OUTFILE5 */
)
/* BOTTOM ATOMALL ??? */
/* End Function number1*/);
/* BEGIN ATS LIBRARY BLOCK */
log10(x) := (log(x)/log(10.0));
omniout_str(iolevel,str) := (
if (glob_iolevel) >= iolevel then (
printf(true,"~a~%",string(str))
)
);
omniout_str_noeol(iolevel,str) := (
if (glob_iolevel >= iolevel) then (
printf(true,"~a",string(str))
)
);
omniout_labstr(iolevel,label,str) := (
if (glob_iolevel >= iolevel) then (
printf(true,"~a = ~a~%",string(label),string(str))
)
);
omniout_float(iolevel,prelabel,prelen,value,vallen,postlabel) := (
if (glob_iolevel >= iolevel) then (
if vallen = 4 then (
printf(true,"~a = ~g ~s ~%",prelabel,value, postlabel)
) else (
printf(true,"~a = ~g ~s ~%",prelabel,value, postlabel)
)
)
);
omniout_int(iolevel,prelabel,prelen,value,vallen,postlabel) := (
if (glob_iolevel >= iolevel) then (
printf(true,"~a = ~d ~a~%",prelabel,value, postlabel),
newline()
)
);
omniout_float_arr(iolevel,prelabel,elemnt,prelen,value,vallen,postlabel) := (
if (glob_iolevel >= iolevel) then (
sprint(prelabel,"[",elemnt,"]=",value, postlabel),
newline()
)
);
/*Function Start*/
dump_series(iolevel,dump_label,series_name,
array_series,numb
) := (
block([i],
if (glob_iolevel >= iolevel) then (
i : 1,
while (i <= numb) do (
sprint(dump_label,series_name,"i = ",i,"series = ",array_series[i]),
newline(),
i : i + 1
)
)
)
);
dump_series_2(iolevel,dump_label,series_name,
/*Function Start*/
array_series2,numb,subnum
) := (
block([i,sub,ts_term],
if (glob_iolevel >= iolevel) then (
sub : 1,
while (sub <= subnum) do (
i : 1,
while (i <= num) do (
sprint(dump_label,series_name,"sub = ",sub,"i = ",i,"series2 = ",array_series2[sub,i]),
i : i + 1
),
sub : sub + 1
)
)
)
);
cs_info(iolevel,str
) := (
if (glob_iolevel >= iolevel) then (
sprint(concat("cs_info " , str , " glob_correct_start_flag = " , glob_correct_start_flag , "glob_h := " , glob_h , "glob_reached_optimal_h := " , glob_reached_optimal_h))
)
);
logitem_time(fd,secs_in) := (
block([ cent_int, centuries, days, days_int, hours, hours_int, millinium_int, milliniums, minutes, minutes_int, sec_in_millinium, sec_int, seconds, secs, years, years_int],
secs : (secs_in),
printf(fd,"
"),
if (secs >= (0.0)) then ( /* if number 1*/
sec_in_millinium : ((sec_in_minute) * (min_in_hour) * (hours_in_day) * (days_in_year) * (years_in_century) * (centuries_in_millinium)),
milliniums : (secs / (sec_in_millinium)),
millinium_int : floor(milliniums),
centuries : (milliniums - (millinium_int))*(centuries_in_millinium),
cent_int : floor(centuries),
years : (centuries - cent_int) * (years_in_century),
years_int : floor(years),
days : (years - years_int) * (days_in_year),
days_int : floor(days),
hours : (days - days_int) * (hours_in_day),
hours_int : floor(hours),
minutes : (hours - hours_int) * (min_in_hour),
minutes_int : floor(minutes),
seconds : (minutes - minutes_int) * (sec_in_minute),
sec_int : floor(seconds),
if (millinium_int > 0) then ( /* if number 2*/
printf(fd,"~d Millinia ~d Centuries ~d Years ~d Days ~d Hours ~d Minutes ~d Seconds",millinium_int,cent_int,years_int,days_int,hours_int,minutes_int,sec_int)
) elseif (cent_int > 0) then ( /* if number 3*/
printf(fd,"~d Centuries ~d Years ~d Days ~d Hours ~d Minutes ~d Seconds",cent_int,years_int,days_int,hours_int,minutes_int,sec_int)
) elseif (years_int > 0) then ( /* if number 4*/
printf(fd,"~d Years ~d Days ~d Hours ~d Minutes ~d Seconds",years_int,days_int,hours_int,minutes_int,sec_int)
) elseif (days_int > 0) then ( /* if number 5*/
printf(fd,"~d Days ~d Hours ~d Minutes ~d Seconds",days_int,hours_int,minutes_int,sec_int)
) elseif (hours_int > 0) then ( /* if number 6*/
printf(fd,"~d Hours ~d Minutes ~d Seconds",hours_int,minutes_int,sec_int)
) elseif (minutes_int > 0) then ( /* if number 7*/
printf(fd,"~d Minutes ~d Seconds",minutes_int,sec_int)
) else (
printf(fd,"~d Seconds",sec_int)
)/* end if 7*/
) else (
printf(fd,"Unknown")
)/* end if 6*/
,
printf(fd," | ")
)
/* End Function number1*/);
omniout_timestr(secs_in) := (
block([cent_int, centuries, days, days_int, hours, hours_int, millinium_int, milliniums, minutes, minutes_int, sec_in_millinium, sec_int, seconds, secs, years, years_int],
secs : convfloat(secs_in),
if (secs >= convfloat(0.0)) then ( /* if number 6*/
sec_in_millinium : (convfloat(sec_in_minute) * convfloat(min_in_hour) * convfloat(hours_in_day) * convfloat(days_in_year) * convfloat(years_in_century) * convfloat(centuries_in_millinium)),
milliniums : (secs / convfloat(sec_in_millinium)),
millinium_int : floor(milliniums),
centuries : (milliniums - (millinium_int))*convfloat(centuries_in_millinium),
cent_int : floor(centuries),
years : (centuries - cent_int) * convfloat(years_in_century),
years_int : floor(years),
days : (years - years_int) * convfloat(days_in_year),
days_int : floor(days),
hours : (days - days_int) * convfloat(hours_in_day),
hours_int : floor(hours),
minutes : (hours - hours_int) * convfloat(min_in_hour),
minutes_int : floor(minutes),
seconds : (minutes - minutes_int) * convfloat(sec_in_minute),
sec_int : floor(seconds),
if (millinium_int > 0) then ( /* if number 7*/
printf(true,"= ~d Millinia ~d Centuries ~d Years ~d Days ~d Hours ~d Minutes ~d Seconds~%",millinium_int,cent_int,years_int,days_int,hours_int,minutes_int,sec_int)
) elseif (cent_int > 0) then ( /* if number 8*/
printf(true,"= ~d Centuries ~d Years ~d Days ~d Hours ~d Minutes ~d Seconds~%",cent_int,years_int,days_int,hours_int,minutes_int,sec_int)
) elseif (years_int > 0) then ( /* if number 9*/
printf(true,"= ~d Years ~d Days ~d Hours ~d Minutes ~d Seconds~%",years_int,days_int,hours_int,minutes_int,sec_int)
) elseif (days_int > 0) then ( /* if number 10*/
printf(true,"= ~d Days ~d Hours ~d Minutes ~d Seconds~%",days_int,hours_int,minutes_int,sec_int)
) elseif (hours_int > 0) then ( /* if number 11*/
printf(true,"= ~d Hours ~d Minutes ~d Seconds~%",hours_int,minutes_int,sec_int)
) elseif (minutes_int > 0) then ( /* if number 12*/
printf(true,"= ~d Minutes ~d Seconds~%",minutes_int,sec_int)
) else (
printf(true,"= ~d Seconds~%",sec_int)
)/* end if 12*/
) else (
printf(true," Unknown~%")
)/* end if 11*/
)
/* End Function number1*/);
/* Begin Function number 1*/
ats(
mmm_ats,array_a,array_b,jjj_ats) := (
block([ iii_ats, lll_ats,ma_ats, ret_ats],
ret_ats : 0.0,
if (jjj_ats <= mmm_ats) then ( /* if number 11*/
ma_ats : mmm_ats + 1,
iii_ats : jjj_ats,
while (iii_ats <= mmm_ats) do ( /* do number 1*/
lll_ats : ma_ats - iii_ats,
ret_ats : ret_ats + array_a[iii_ats]*array_b[lll_ats],
iii_ats : iii_ats + 1
)/* end do number 1*/
)/* end if 11*/
,
ret_ats
)
/* End Function number1*/);
/* Begin Function number 1*/
att(
mmm_att,array_aa,array_bb,jjj_att) := (
block([ al_att, iii_att,lll_att, ma_att, ret_att],
ret_att : 0.0,
if (jjj_att <= mmm_att) then ( /* if number 11*/
ma_att : mmm_att + 2,
iii_att : jjj_att,
while (iii_att <= mmm_att) do ( /* do number 1*/
lll_att : ma_att - iii_att,
al_att : (lll_att - 1),
if (lll_att <= glob_max_terms) then ( /* if number 12*/
ret_att : ret_att + array_aa[iii_att]*array_bb[lll_att]* convfp(al_att)
)/* end if 12*/
,
iii_att : iii_att + 1
)/* end do number 1*/
,
ret_att : ret_att / convfp(mmm_att)
)/* end if 11*/
,
ret_att
)
/* End Function number1*/);
/* Begin Function number 1*/
display_pole() := (
if ((array_pole[1] # glob_large_float) and (array_pole[1] > 0.0) and (array_pole[2] # glob_large_float) and (array_pole[2]> 0.0) and glob_display_flag) then ( /* if number 11*/
omniout_float(ALWAYS,"Radius of convergence ",4, array_pole[1],4," "),
omniout_float(ALWAYS,"Order of pole ",4, array_pole[2],4," ")
)/* end if 11*/
/* End Function number1*/);
/* Begin Function number 1*/
logditto(file) := (
printf(file,""),
printf(file,"ditto"),
printf(file," | ")
/* End Function number1*/);
/* Begin Function number 1*/
logitem_integer(file,n) := (
printf(file,""),
printf(file,"~d",n),
printf(file," | ")
/* End Function number1*/);
/* Begin Function number 1*/
logitem_str(file,str) := (
printf(file,""),
printf(file,str),
printf(file," | ")
/* End Function number1*/);
/* Begin Function number 1*/
logitem_good_digits(file,rel_error) := (
block([good_digits],
printf(file,""),
if (rel_error # -1.0) then ( /* if number 11*/
if (rel_error # 0.0) then ( /* if number 12*/
good_digits : -floor(log10(rel_error/100.0)),
printf(file,"~d",good_digits)
) else (
good_digits : 16,
printf(file,"~d",good_digits)
)/* end if 12*/
) else (
printf(file,"Unknown")
)/* end if 11*/
,
printf(file," | ")
)
/* End Function number1*/);
/* Begin Function number 1*/
log_revs(file,revs) := (
printf(file,revs)
/* End Function number1*/);
/* Begin Function number 1*/
logitem_float(file,x) := (
printf(file,""),
printf(file,"~g",x),
printf(file," | ")
/* End Function number1*/);
/* Begin Function number 1*/
logitem_pole(file,pole) := (
printf(file,""),
if pole = 0 then ( /* if number 11*/
printf(file,"NA")
) elseif pole = 1 then ( /* if number 12*/
printf(file,"Real")
) elseif pole = 2 then ( /* if number 13*/
printf(file,"Complex")
) else (
printf(file,"No Pole")
)/* end if 13*/
,
printf(file," | ")
/* End Function number1*/);
/* Begin Function number 1*/
logstart(file) := (
printf(file,"")
/* End Function number1*/);
/* Begin Function number 1*/
logend(file) := (
printf(file,"
~%")
/* End Function number1*/);
/* Begin Function number 1*/
not_reached_end(x,x_end) := (
block([ret],
if ((glob_neg_h and (x > x_end)) or (( not glob_neg_h) and (x < x_end))) then ( /* if number 13*/
ret : true
) else (
ret : false
)/* end if 13*/
,
ret)
/* End Function number1*/);
/* Begin Function number 1*/
chk_data() := (
block([ errflag],
errflag : false,
if ((glob_max_terms < 15) or (glob_max_terms > 512)) then ( /* if number 13*/
omniout_str(ALWAYS,"Illegal max_terms = -- Using 30"),
glob_max_terms : 30
)/* end if 13*/
,
if (glob_max_iter < 2) then ( /* if number 13*/
omniout_str(ALWAYS,"Illegal max_iter"),
errflag : true
)/* end if 13*/
,
if (errflag) then ( /* if number 13*/
quit()
)/* end if 13*/
)
/* End Function number1*/);
/* Begin Function number 1*/
comp_expect_sec(t_end2,t_start2,t2,clock_sec2) := (
block([ ms2, rrr, sec_left, sub1, sub2],
ms2 : clock_sec2,
sub1 : (t_end2-t_start2),
sub2 : (t2-t_start2),
if (sub1 = 0.0) then ( /* if number 13*/
sec_left : 0.0
) else (
if (sub2 > 0.0) then ( /* if number 14*/
rrr : (sub1/sub2),
sec_left : rrr * ms2 - ms2
) else (
sec_left : 0.0
)/* end if 14*/
)/* end if 13*/
,
sec_left
)
/* End Function number1*/);
/* Begin Function number 1*/
comp_percent(t_end2,t_start2, t2) := (
block([ rrr, sub1, sub2],
sub1 : (t_end2-t_start2),
sub2 : (t2-t_start2),
if (sub2 > glob_small_float) then ( /* if number 13*/
rrr : (100.0*sub2)/sub1
) else (
rrr : 0.0
)/* end if 13*/
,
rrr
)
/* End Function number1*/);
/* Begin Function number 1*/
factorial_2(nnn) := (
block([ ret],
ret : nnn!
)
/* End Function number1*/);
/* Begin Function number 1*/
factorial_1(nnn) := (
block([ ret],
if (nnn <= glob_max_terms) then ( /* if number 13*/
if (array_fact_1[nnn] = 0) then ( /* if number 14*/
ret : factorial_2(nnn),
array_fact_1[nnn] : ret
) else (
ret : array_fact_1[nnn]
)/* end if 14*/
) else (
ret : factorial_2(nnn)
)/* end if 13*/
,
ret
)
/* End Function number1*/);
/* Begin Function number 1*/
factorial_3(mmm,nnn) := (
block([ ret],
if ((nnn <= glob_max_terms) and (mmm <= glob_max_terms)) then ( /* if number 13*/
if (array_fact_2[mmm,nnn] = 0) then ( /* if number 14*/
ret : factorial_1(mmm)/factorial_1(nnn),
array_fact_2[mmm,nnn] : ret
) else (
ret : array_fact_2[mmm,nnn]
)/* end if 14*/
) else (
ret : factorial_2(mmm)/factorial_2(nnn)
)/* end if 13*/
,
ret
)
/* End Function number1*/);
/* Begin Function number 1*/
convfp(mmm) := (
(mmm)
/* End Function number1*/);
/* Begin Function number 1*/
convfloat(mmm) := (
(mmm)
/* End Function number1*/);
elapsed_time_seconds() :=(
block([t],
t: elapsed_real_time(),
t)
);
arcsin(x) :=(
asin(x)
);
arccos(x) :=(
acos(x)
);
arctan(x) :=(
atan(x)
);
omniabs(x) :=(
abs(x)
);
expt(x,y) :=(
(x^y)
);
/* END ATS LIBRARY BLOCK */
/* BEGIN USER DEF BLOCK */
/* BEGIN USER DEF BLOCK */
exact_soln_y (x) := (
(10.0 * (0.1 * x + 0.2) * arccos(0.1 * x + 0.2 ) - 10.0 * sqrt(1.0 -
expt((0.1 * x + 0.2) , 2 )))
);
/* END USER DEF BLOCK */
/* END USER DEF BLOCK */
/* END OUTFILE5 */
/* Begin Function number 1*/
main() := (
/* BEGIN OUTFIEMAIN */
block([ d1,d2,d3,d4,est_err_2,niii,done_once,
term,ord,order_diff,term_no,html_log_file,iiif,jjjf,
rows,r_order,sub_iter,calc_term,iii,temp_sum,current_iter,
x_start,x_end
,it, log10norm, max_terms, opt_iter, tmp,subiter],
define_variable(DEBUGL,3,fixnum ),
define_variable(DEBUGMASSIVE,4,fixnum ),
define_variable(ALWAYS,1,fixnum ),
define_variable(glob_max_terms,30,fixnum ),
define_variable(INFO,2,fixnum ),
define_variable(glob_iolevel,5,fixnum ),
/* Top Generate Globals Definition */
define_variable(glob_start,0,fixnum ),
define_variable(glob_max_rel_trunc_err,0.1e-10,float ),
define_variable(glob_last_good_h,0.1,float ),
define_variable(glob_log10abserr,0.0,float ),
define_variable(glob_warned2,false,boolean ),
define_variable(glob_optimal_clock_start_sec,0.0,float ),
define_variable(glob_display_interval,0.0,float ),
define_variable(glob_h,0.1,float ),
define_variable(min_in_hour,60,fixnum ),
define_variable(sec_in_minute,60,fixnum ),
define_variable(djd_debug2,true,boolean ),
define_variable(glob_log10relerr,0.0,float ),
define_variable(glob_small_float,0.1e-50,float ),
define_variable(glob_no_eqs,0,fixnum ),
define_variable(glob_log10_relerr,0.1e-10,float ),
define_variable(glob_log10_abserr,0.1e-10,float ),
define_variable(glob_neg_h,false,boolean ),
define_variable(glob_hmin,0.00000000001,float ),
define_variable(glob_percent_done,0.0,float ),
define_variable(glob_current_iter,0,fixnum ),
define_variable(glob_warned,false,boolean ),
define_variable(glob_not_yet_finished,true,boolean ),
define_variable(days_in_year,365,fixnum ),
define_variable(glob_max_opt_iter,10,fixnum ),
define_variable(glob_iter,0,fixnum ),
define_variable(glob_unchanged_h_cnt,0,fixnum ),
define_variable(glob_max_trunc_err,0.1e-10,float ),
define_variable(glob_relerr,0.1e-10,float ),
define_variable(glob_dump_analytic,false,boolean ),
define_variable(glob_next_display,0.0,float ),
define_variable(glob_look_poles,false,boolean ),
define_variable(glob_large_float,9.0e100,float ),
define_variable(glob_hmax,1.0,float ),
define_variable(glob_disp_incr,0.1,float ),
define_variable(glob_display_flag,true,boolean ),
define_variable(glob_normmax,0.0,float ),
define_variable(glob_max_sec,10000.0,float ),
define_variable(glob_hmin_init,0.001,float ),
define_variable(glob_not_yet_start_msg,true,boolean ),
define_variable(glob_optimal_expect_sec,0.1,float ),
define_variable(glob_log10normmin,0.1,float ),
define_variable(glob_max_minutes,0.0,float ),
define_variable(glob_orig_start_sec,0.0,float ),
define_variable(glob_dump,false,boolean ),
define_variable(glob_subiter_method,3,fixnum ),
define_variable(glob_smallish_float,0.1e-100,float ),
define_variable(glob_max_iter,1000,fixnum ),
define_variable(centuries_in_millinium,10,fixnum ),
define_variable(hours_in_day,24,fixnum ),
define_variable(MAX_UNCHANGED,10,fixnum ),
define_variable(glob_curr_iter_when_opt,0,fixnum ),
define_variable(glob_optimal_start,0.0,float ),
define_variable(glob_optimal_done,false,boolean ),
define_variable(glob_good_digits,0,fixnum ),
define_variable(glob_abserr,0.1e-10,float ),
define_variable(glob_almost_1,0.9990,float ),
define_variable(years_in_century,100,fixnum ),
define_variable(djd_debug,true,boolean ),
define_variable(glob_html_log,true,boolean ),
define_variable(glob_max_hours,0.0,float ),
define_variable(glob_reached_optimal_h,false,boolean ),
define_variable(glob_initial_pass,true,boolean ),
define_variable(glob_clock_start_sec,0.0,float ),
define_variable(glob_clock_sec,0.0,float ),
/* Bottom Generate Globals Deninition */
ALWAYS : 1,
INFO : 2,
DEBUGL : 3,
DEBUGMASSIVE : 4,
glob_iolevel : INFO,
/* Write Set Defaults */
glob_orig_start_sec : elapsed_time_seconds(),
MAX_UNCHANGED : 10,
glob_curr_iter_when_opt : 0,
glob_display_flag : true,
glob_no_eqs : 1,
glob_iter : -1,
opt_iter : -1,
glob_max_iter : 50000,
glob_max_hours : 0.0,
glob_max_minutes : 15.0,
omniout_str(ALWAYS,"##############ECHO OF PROBLEM#################"),
omniout_str(ALWAYS,"##############temp/lin_arccospostode.ode#################"),
omniout_str(ALWAYS,"diff ( y , x , 1 ) = arccos(0.1 * x + 0.2) ;"),
omniout_str(ALWAYS,"!"),
omniout_str(ALWAYS,"/* BEGIN FIRST INPUT BLOCK */"),
omniout_str(ALWAYS,"max_terms : 30,"),
omniout_str(ALWAYS,"Digits : 32,"),
omniout_str(ALWAYS,"!"),
omniout_str(ALWAYS,"/* END FIRST INPUT BLOCK */"),
omniout_str(ALWAYS,"/* BEGIN SECOND INPUT BLOCK */"),
omniout_str(ALWAYS,"x_start : -0.8,"),
omniout_str(ALWAYS,"x_end : 0.8 ,"),
omniout_str(ALWAYS,"array_y_init[0 + 1] : exact_soln_y(x_start),"),
omniout_str(ALWAYS,"glob_h : 0.00001 ,"),
omniout_str(ALWAYS,"glob_look_poles : true,"),
omniout_str(ALWAYS,"glob_max_iter : 100,"),
omniout_str(ALWAYS,"/* END SECOND INPUT BLOCK */"),
omniout_str(ALWAYS,"/* BEGIN OVERRIDE BLOCK */"),
omniout_str(ALWAYS,"glob_h : 0.005 ,"),
omniout_str(ALWAYS,"glob_display_interval : 0.1,"),
omniout_str(ALWAYS,"glob_look_poles : true,"),
omniout_str(ALWAYS,"glob_max_iter : 10000,"),
omniout_str(ALWAYS,"glob_max_minutes : 10,"),
omniout_str(ALWAYS,"/* END OVERRIDE BLOCK */"),
omniout_str(ALWAYS,"!"),
omniout_str(ALWAYS,"/* BEGIN USER DEF BLOCK */"),
omniout_str(ALWAYS,"exact_soln_y (x) := ("),
omniout_str(ALWAYS," (10.0 * (0.1 * x + 0.2) * arccos(0.1 * x + 0.2 ) - 10.0 * sqrt(1.0 -"),
omniout_str(ALWAYS,"expt((0.1 * x + 0.2) , 2 ))) "),
omniout_str(ALWAYS,");"),
omniout_str(ALWAYS,""),
omniout_str(ALWAYS,"/* END USER DEF BLOCK */"),
omniout_str(ALWAYS,"#######END OF ECHO OF PROBLEM#################"),
glob_unchanged_h_cnt : 0,
glob_warned : false,
glob_warned2 : false,
glob_small_float : 1.0e-200,
glob_smallish_float : 1.0e-64,
glob_large_float : 1.0e100,
glob_almost_1 : 0.99,
glob_log10_abserr : -8.0,
glob_log10_relerr : -8.0,
glob_hmax : 0.01,
/* BEGIN FIRST INPUT BLOCK */
/* BEGIN FIRST INPUT BLOCK */
max_terms : 30,
Digits : 32,
/* END FIRST INPUT BLOCK */
/* START OF INITS AFTER INPUT BLOCK */
glob_max_terms : max_terms,
glob_html_log : true,
/* END OF INITS AFTER INPUT BLOCK */
array(array_y_init,max_terms+ 1),
array(array_tmp0,max_terms+ 1),
array(array_tmp1,max_terms+ 1),
array(array_tmp2,max_terms+ 1),
array(array_tmp3_a1,max_terms+ 1),
array(array_tmp3,max_terms+ 1),
array(array_tmp4,max_terms+ 1),
array(array_pole,max_terms+ 1),
array(array_m1,max_terms+ 1),
array(array_last_rel_error,max_terms+ 1),
array(array_fact_1,max_terms+ 1),
array(array_type_pole,max_terms+ 1),
array(array_1st_rel_error,max_terms+ 1),
array(array_norms,max_terms+ 1),
array(array_y,max_terms+ 1),
array(array_x,max_terms+ 1),
array(array_complex_pole,1+ 1,3+ 1),
array(array_y_higher_work2,2+ 1,max_terms+ 1),
array(array_poles,1+ 1,3+ 1),
array(array_y_higher_work,2+ 1,max_terms+ 1),
array(array_y_set_initial,2+ 1,max_terms+ 1),
array(array_fact_2,max_terms+ 1,max_terms+ 1),
array(array_y_higher,2+ 1,max_terms+ 1),
array(array_real_pole,1+ 1,3+ 1),
term : 1,
while (term <= max_terms) do ( /* do number 2*/
array_y_init[term] : 0.0,
term : term + 1
)/* end do number 2*/
,
term : 1,
while (term <= max_terms) do ( /* do number 2*/
array_tmp0[term] : 0.0,
term : term + 1
)/* end do number 2*/
,
term : 1,
while (term <= max_terms) do ( /* do number 2*/
array_tmp1[term] : 0.0,
term : term + 1
)/* end do number 2*/
,
term : 1,
while (term <= max_terms) do ( /* do number 2*/
array_tmp2[term] : 0.0,
term : term + 1
)/* end do number 2*/
,
term : 1,
while (term <= max_terms) do ( /* do number 2*/
array_tmp3_a1[term] : 0.0,
term : term + 1
)/* end do number 2*/
,
term : 1,
while (term <= max_terms) do ( /* do number 2*/
array_tmp3[term] : 0.0,
term : term + 1
)/* end do number 2*/
,
term : 1,
while (term <= max_terms) do ( /* do number 2*/
array_tmp4[term] : 0.0,
term : term + 1
)/* end do number 2*/
,
term : 1,
while (term <= max_terms) do ( /* do number 2*/
array_pole[term] : 0.0,
term : term + 1
)/* end do number 2*/
,
term : 1,
while (term <= max_terms) do ( /* do number 2*/
array_m1[term] : 0.0,
term : term + 1
)/* end do number 2*/
,
term : 1,
while (term <= max_terms) do ( /* do number 2*/
array_last_rel_error[term] : 0.0,
term : term + 1
)/* end do number 2*/
,
term : 1,
while (term <= max_terms) do ( /* do number 2*/
array_fact_1[term] : 0.0,
term : term + 1
)/* end do number 2*/
,
term : 1,
while (term <= max_terms) do ( /* do number 2*/
array_type_pole[term] : 0.0,
term : term + 1
)/* end do number 2*/
,
term : 1,
while (term <= max_terms) do ( /* do number 2*/
array_1st_rel_error[term] : 0.0,
term : term + 1
)/* end do number 2*/
,
term : 1,
while (term <= max_terms) do ( /* do number 2*/
array_norms[term] : 0.0,
term : term + 1
)/* end do number 2*/
,
term : 1,
while (term <= max_terms) do ( /* do number 2*/
array_y[term] : 0.0,
term : term + 1
)/* end do number 2*/
,
term : 1,
while (term <= max_terms) do ( /* do number 2*/
array_x[term] : 0.0,
term : term + 1
)/* end do number 2*/
,
ord : 1,
while (ord <=1) do ( /* do number 2*/
term : 1,
while (term <= 3) do ( /* do number 3*/
array_complex_pole[ord,term] : 0.0,
term : term + 1
)/* end do number 3*/
,
ord : ord + 1
)/* end do number 2*/
,
ord : 1,
while (ord <=2) do ( /* do number 2*/
term : 1,
while (term <= max_terms) do ( /* do number 3*/
array_y_higher_work2[ord,term] : 0.0,
term : term + 1
)/* end do number 3*/
,
ord : ord + 1
)/* end do number 2*/
,
ord : 1,
while (ord <=1) do ( /* do number 2*/
term : 1,
while (term <= 3) do ( /* do number 3*/
array_poles[ord,term] : 0.0,
term : term + 1
)/* end do number 3*/
,
ord : ord + 1
)/* end do number 2*/
,
ord : 1,
while (ord <=2) do ( /* do number 2*/
term : 1,
while (term <= max_terms) do ( /* do number 3*/
array_y_higher_work[ord,term] : 0.0,
term : term + 1
)/* end do number 3*/
,
ord : ord + 1
)/* end do number 2*/
,
ord : 1,
while (ord <=2) do ( /* do number 2*/
term : 1,
while (term <= max_terms) do ( /* do number 3*/
array_y_set_initial[ord,term] : 0.0,
term : term + 1
)/* end do number 3*/
,
ord : ord + 1
)/* end do number 2*/
,
ord : 1,
while (ord <=max_terms) do ( /* do number 2*/
term : 1,
while (term <= max_terms) do ( /* do number 3*/
array_fact_2[ord,term] : 0.0,
term : term + 1
)/* end do number 3*/
,
ord : ord + 1
)/* end do number 2*/
,
ord : 1,
while (ord <=2) do ( /* do number 2*/
term : 1,
while (term <= max_terms) do ( /* do number 3*/
array_y_higher[ord,term] : 0.0,
term : term + 1
)/* end do number 3*/
,
ord : ord + 1
)/* end do number 2*/
,
ord : 1,
while (ord <=1) do ( /* do number 2*/
term : 1,
while (term <= 3) do ( /* do number 3*/
array_real_pole[ord,term] : 0.0,
term : term + 1
)/* end do number 3*/
,
ord : ord + 1
)/* end do number 2*/
,
/* BEGIN ARRAYS DEFINED AND INITIALIZATED */
array(array_tmp4,max_terms+1 + 1),
term : 1,
while (term <= max_terms + 1) do ( /* do number 2*/
array_tmp4[term] : 0.0,
term : term + 1
)/* end do number 2*/
,
array(array_tmp3,max_terms+1 + 1),
term : 1,
while (term <= max_terms + 1) do ( /* do number 2*/
array_tmp3[term] : 0.0,
term : term + 1
)/* end do number 2*/
,
array(array_tmp3_a1,max_terms+1 + 1),
term : 1,
while (term <= max_terms + 1) do ( /* do number 2*/
array_tmp3_a1[term] : 0.0,
term : term + 1
)/* end do number 2*/
,
array(array_tmp2,max_terms+1 + 1),
term : 1,
while (term <= max_terms + 1) do ( /* do number 2*/
array_tmp2[term] : 0.0,
term : term + 1
)/* end do number 2*/
,
array(array_tmp1,max_terms+1 + 1),
term : 1,
while (term <= max_terms + 1) do ( /* do number 2*/
array_tmp1[term] : 0.0,
term : term + 1
)/* end do number 2*/
,
array(array_tmp0,max_terms+1 + 1),
term : 1,
while (term <= max_terms + 1) do ( /* do number 2*/
array_tmp0[term] : 0.0,
term : term + 1
)/* end do number 2*/
,
array(array_x,max_terms+1 + 1),
term : 1,
while (term <= max_terms + 1) do ( /* do number 2*/
array_x[term] : 0.0,
term : term + 1
)/* end do number 2*/
,
array(array_y,max_terms+1 + 1),
term : 1,
while (term <= max_terms + 1) do ( /* do number 2*/
array_y[term] : 0.0,
term : term + 1
)/* end do number 2*/
,
array(array_const_1,max_terms+1 + 1),
term : 1,
while (term <= max_terms + 1) do ( /* do number 2*/
array_const_1[term] : 0.0,
term : term + 1
)/* end do number 2*/
,
array_const_1[1] : 1,
array(array_const_0D2,max_terms+1 + 1),
term : 1,
while (term <= max_terms + 1) do ( /* do number 2*/
array_const_0D2[term] : 0.0,
term : term + 1
)/* end do number 2*/
,
array_const_0D2[1] : 0.2,
array(array_const_0D1,max_terms+1 + 1),
term : 1,
while (term <= max_terms + 1) do ( /* do number 2*/
array_const_0D1[term] : 0.0,
term : term + 1
)/* end do number 2*/
,
array_const_0D1[1] : 0.1,
array(array_const_0D0,max_terms+1 + 1),
term : 1,
while (term <= max_terms + 1) do ( /* do number 2*/
array_const_0D0[term] : 0.0,
term : term + 1
)/* end do number 2*/
,
array_const_0D0[1] : 0.0,
array(array_m1,max_terms+1 + 1),
term : 1,
while (term <= max_terms) do ( /* do number 2*/
array_m1[term] : 0.0,
term : term + 1
)/* end do number 2*/
,
array_m1[1] : -1.0,
/* END ARRAYS DEFINED AND INITIALIZATED */
/* Initing Factorial Tables */
iiif : 0,
while (iiif <= glob_max_terms) do ( /* do number 2*/
jjjf : 0,
while (jjjf <= glob_max_terms) do ( /* do number 3*/
array_fact_1[iiif] : 0,
array_fact_2[iiif,jjjf] : 0,
jjjf : jjjf + 1
)/* end do number 3*/
,
iiif : iiif + 1
)/* end do number 2*/
,
/* Done Initing Factorial Tables */
/* TOP SECOND INPUT BLOCK */
/* BEGIN SECOND INPUT BLOCK */
/* END FIRST INPUT BLOCK */
/* BEGIN SECOND INPUT BLOCK */
x_start : -0.8,
x_end : 0.8 ,
array_y_init[0 + 1] : exact_soln_y(x_start),
glob_h : 0.00001 ,
glob_look_poles : true,
glob_max_iter : 100,
/* END SECOND INPUT BLOCK */
/* BEGIN OVERRIDE BLOCK */
glob_h : 0.005 ,
glob_display_interval : 0.1,
glob_look_poles : true,
glob_max_iter : 10000,
glob_max_minutes : 10,
/* END OVERRIDE BLOCK */
/* END SECOND INPUT BLOCK */
/* BEGIN INITS AFTER SECOND INPUT BLOCK */
glob_last_good_h : glob_h,
glob_max_terms : max_terms,
glob_max_sec : convfloat(60.0) * convfloat(glob_max_minutes) + convfloat(3600.0) * convfloat(glob_max_hours),
glob_abserr : expt(10.0 , (glob_log10_abserr)),
glob_relerr : expt(10.0 , (glob_log10_relerr)),
if (glob_h > 0.0) then ( /* if number 1*/
glob_neg_h : false,
glob_display_interval : omniabs(glob_display_interval)
) else (
glob_neg_h : true,
glob_display_interval : -omniabs(glob_display_interval)
)/* end if 1*/
,
chk_data(),
/* AFTER INITS AFTER SECOND INPUT BLOCK */
array_y_set_initial[1,1] : true,
array_y_set_initial[1,2] : false,
array_y_set_initial[1,3] : false,
array_y_set_initial[1,4] : false,
array_y_set_initial[1,5] : false,
array_y_set_initial[1,6] : false,
array_y_set_initial[1,7] : false,
array_y_set_initial[1,8] : false,
array_y_set_initial[1,9] : false,
array_y_set_initial[1,10] : false,
array_y_set_initial[1,11] : false,
array_y_set_initial[1,12] : false,
array_y_set_initial[1,13] : false,
array_y_set_initial[1,14] : false,
array_y_set_initial[1,15] : false,
array_y_set_initial[1,16] : false,
array_y_set_initial[1,17] : false,
array_y_set_initial[1,18] : false,
array_y_set_initial[1,19] : false,
array_y_set_initial[1,20] : false,
array_y_set_initial[1,21] : false,
array_y_set_initial[1,22] : false,
array_y_set_initial[1,23] : false,
array_y_set_initial[1,24] : false,
array_y_set_initial[1,25] : false,
array_y_set_initial[1,26] : false,
array_y_set_initial[1,27] : false,
array_y_set_initial[1,28] : false,
array_y_set_initial[1,29] : false,
array_y_set_initial[1,30] : false,
if (glob_html_log) then ( /* if number 2*/
html_log_file : openw("html/entry.html")
)/* end if 2*/
,
/* BEGIN SOLUTION CODE */
omniout_str(ALWAYS,"START of Soultion"),
/* Start Series -- INITIALIZE FOR SOLUTION */
array_x[1] : x_start,
array_x[2] : glob_h,
glob_next_display : x_start,
order_diff : 1,
/* Start Series array_y */
term_no : 1,
while (term_no <= order_diff) do ( /* do number 2*/
array_y[term_no] : array_y_init[term_no] * expt(glob_h , (term_no - 1)) / factorial_1(term_no - 1),
term_no : term_no + 1
)/* end do number 2*/
,
rows : order_diff,
r_order : 1,
while (r_order <= rows) do ( /* do number 2*/
term_no : 1,
while (term_no <= (rows - r_order + 1)) do ( /* do number 3*/
it : term_no + r_order - 1,
array_y_higher[r_order,term_no] : array_y_init[it]* expt(glob_h , (term_no - 1)) / ((factorial_1(term_no - 1))),
term_no : term_no + 1
)/* end do number 3*/
,
r_order : r_order + 1
)/* end do number 2*/
,
current_iter : 1,
glob_clock_start_sec : elapsed_time_seconds(),
if (omniabs(array_y_higher[1,1]) > glob_small_float) then ( /* if number 2*/
tmp : omniabs(array_y_higher[1,1]),
log10norm : (log10(tmp)),
if (log10norm < glob_log10normmin) then ( /* if number 3*/
glob_log10normmin : log10norm
)/* end if 3*/
)/* end if 2*/
,
display_alot(current_iter)
,
glob_clock_sec : elapsed_time_seconds(),
glob_current_iter : 0,
glob_iter : 0,
omniout_str(DEBUGL," "),
glob_reached_optimal_h : true,
glob_optimal_clock_start_sec : elapsed_time_seconds(),
while ((glob_current_iter < glob_max_iter) and not_reached_end(array_x[1] , x_end ) and ((convfloat(glob_clock_sec) - convfloat(glob_orig_start_sec)) < convfloat(glob_max_sec))) do ( /* do number 2*/
/* left paren 0001C */
if (reached_interval()) then ( /* if number 2*/
omniout_str(INFO," "),
omniout_str(INFO,"TOP MAIN SOLVE Loop")
)/* end if 2*/
,
glob_iter : glob_iter + 1,
glob_clock_sec : elapsed_time_seconds(),
glob_current_iter : glob_current_iter + 1,
atomall(),
if (glob_look_poles) then ( /* if number 2*/
/* left paren 0004C */
check_for_pole()
)/* end if 2*/
,/* was right paren 0004C */
if (reached_interval()) then ( /* if number 2*/
glob_next_display : glob_next_display + glob_display_interval
)/* end if 2*/
,
array_x[1] : array_x[1] + glob_h,
array_x[2] : glob_h,
/* Jump Series array_y */
order_diff : 1,
/* START PART 1 SUM AND ADJUST */
/* START SUM AND ADJUST EQ =1 */
/* sum_and_adjust array_y */
/* BEFORE ADJUST SUBSERIES EQ =1 */
ord : 2,
calc_term : 1,
/* adjust_subseriesarray_y */
iii : glob_max_terms,
while (iii >= calc_term) do ( /* do number 3*/
array_y_higher_work[2,iii] : array_y_higher[2,iii] / expt(glob_h , (calc_term - 1)) / factorial_3(iii - calc_term , iii - 1),
iii : iii - 1
)/* end do number 3*/
,
/* AFTER ADJUST SUBSERIES EQ =1 */
/* BEFORE SUM SUBSERIES EQ =1 */
temp_sum : 0.0,
ord : 2,
calc_term : 1,
/* sum_subseriesarray_y */
iii : glob_max_terms,
while (iii >= calc_term) do ( /* do number 3*/
temp_sum : temp_sum + array_y_higher_work[ord,iii],
iii : iii - 1
)/* end do number 3*/
,
array_y_higher_work2[ord,calc_term] : temp_sum * expt(glob_h , (calc_term - 1)) / (factorial_1(calc_term - 1)),
/* AFTER SUM SUBSERIES EQ =1 */
/* BEFORE ADJUST SUBSERIES EQ =1 */
ord : 1,
calc_term : 2,
/* adjust_subseriesarray_y */
iii : glob_max_terms,
while (iii >= calc_term) do ( /* do number 3*/
array_y_higher_work[1,iii] : array_y_higher[1,iii] / expt(glob_h , (calc_term - 1)) / factorial_3(iii - calc_term , iii - 1),
iii : iii - 1
)/* end do number 3*/
,
/* AFTER ADJUST SUBSERIES EQ =1 */
/* BEFORE SUM SUBSERIES EQ =1 */
temp_sum : 0.0,
ord : 1,
calc_term : 2,
/* sum_subseriesarray_y */
iii : glob_max_terms,
while (iii >= calc_term) do ( /* do number 3*/
temp_sum : temp_sum + array_y_higher_work[ord,iii],
iii : iii - 1
)/* end do number 3*/
,
array_y_higher_work2[ord,calc_term] : temp_sum * expt(glob_h , (calc_term - 1)) / (factorial_1(calc_term - 1)),
/* AFTER SUM SUBSERIES EQ =1 */
/* BEFORE ADJUST SUBSERIES EQ =1 */
ord : 1,
calc_term : 1,
/* adjust_subseriesarray_y */
iii : glob_max_terms,
while (iii >= calc_term) do ( /* do number 3*/
array_y_higher_work[1,iii] : array_y_higher[1,iii] / expt(glob_h , (calc_term - 1)) / factorial_3(iii - calc_term , iii - 1),
iii : iii - 1
)/* end do number 3*/
,
/* AFTER ADJUST SUBSERIES EQ =1 */
/* BEFORE SUM SUBSERIES EQ =1 */
temp_sum : 0.0,
ord : 1,
calc_term : 1,
/* sum_subseriesarray_y */
iii : glob_max_terms,
while (iii >= calc_term) do ( /* do number 3*/
temp_sum : temp_sum + array_y_higher_work[ord,iii],
iii : iii - 1
)/* end do number 3*/
,
array_y_higher_work2[ord,calc_term] : temp_sum * expt(glob_h , (calc_term - 1)) / (factorial_1(calc_term - 1)),
/* AFTER SUM SUBSERIES EQ =1 */
/* END SUM AND ADJUST EQ =1 */
/* END PART 1 */
/* START PART 2 MOVE TERMS to REGULAR Array */
term_no : glob_max_terms,
while (term_no >= 1) do ( /* do number 3*/
array_y[term_no] : array_y_higher_work2[1,term_no],
ord : 1,
while (ord <= order_diff) do ( /* do number 4*/
array_y_higher[ord,term_no] : array_y_higher_work2[ord,term_no],
ord : ord + 1
)/* end do number 4*/
,
term_no : term_no - 1
)/* end do number 3*/
,
/* END PART 2 HEVE MOVED TERMS to REGULAR Array */
display_alot(current_iter)
)/* end do number 2*/
,/* right paren 0001C */
omniout_str(ALWAYS,"Finished!"),
if (glob_iter >= glob_max_iter) then ( /* if number 2*/
omniout_str(ALWAYS,"Maximum Iterations Reached before Solution Completed!")
)/* end if 2*/
,
if (elapsed_time_seconds() - convfloat(glob_orig_start_sec) >= convfloat(glob_max_sec )) then ( /* if number 2*/
omniout_str(ALWAYS,"Maximum Time Reached before Solution Completed!")
)/* end if 2*/
,
glob_clock_sec : elapsed_time_seconds(),
omniout_str(INFO,"diff ( y , x , 1 ) = arccos(0.1 * x + 0.2) ;"),
omniout_int(INFO,"Iterations ",32,glob_iter,4," ")
,
prog_report(x_start,x_end),
if (glob_html_log) then ( /* if number 2*/
logstart(html_log_file),
logitem_str(html_log_file,"2012-09-20T23:24:23-05:00")
,
logitem_str(html_log_file,"Maxima")
,
logitem_str(html_log_file,"lin_arccos")
,
logitem_str(html_log_file,"diff ( y , x , 1 ) = arccos(0.1 * x + 0.2) ;")
,
logitem_float(html_log_file,x_start)
,
logitem_float(html_log_file,x_end)
,
logitem_float(html_log_file,array_x[1])
,
logitem_float(html_log_file,glob_h)
,
logitem_str(html_log_file,"16")
,
logitem_good_digits(html_log_file,array_last_rel_error[1])
,
logitem_integer(html_log_file,glob_max_terms)
,
logitem_float(html_log_file,array_1st_rel_error[1])
,
logitem_float(html_log_file,array_last_rel_error[1])
,
logitem_integer(html_log_file,glob_iter)
,
logitem_pole(html_log_file,array_type_pole[1])
,
if (array_type_pole[1] = 1 or array_type_pole[1] = 2) then ( /* if number 3*/
logitem_float(html_log_file,array_pole[1])
,
logitem_float(html_log_file,array_pole[2])
,
0
) else (
logitem_str(html_log_file,"NA")
,
logitem_str(html_log_file,"NA")
,
0
)/* end if 3*/
,
logitem_time(html_log_file,convfloat(glob_clock_sec))
,
if (glob_percent_done < 100.0) then ( /* if number 3*/
logitem_time(html_log_file,convfloat(glob_optimal_expect_sec))
,
0
) else (
logitem_str(html_log_file,"Done")
,
0
)/* end if 3*/
,
log_revs(html_log_file," 130 | ")
,
logitem_str(html_log_file,"lin_arccos diffeq.max")
,
logitem_str(html_log_file,"lin_arccos maxima results")
,
logitem_str(html_log_file,"c c++ Maple and Maxima")
,
logend(html_log_file)
)/* end if 2*/
,
if (glob_html_log) then ( /* if number 2*/
close(html_log_file)
)/* end if 2*/
/* END OUTFILEMAIN */
)
/* End Function number1*/);
main();