Manipulate[
(*Nasser M. Abbasi, july 7, 2014*)
tick;
Module[{j, x, t, graph, h, i, fun, len = 1, end = -1},
h = len/(nPoints - 1);
t = h/c;
fun = Which[f == 1, f1, f == 2, f2];
If[dataChanged == True,
dataChanged = False;
n = 0];
Which[
n == 0,
uNow = Table[0, {i, nPoints}];
uNext = uLast = uNow;
grid = Table[j h, {j, 0, nPoints - 1}];
uNow = fun[#] & /@ grid,
n == 1,
uNext[[1]] = 0;
uNext[[2 ;; -2]] = (1/2) (uNow[[1 ;; end - 2]] + uNow[[3 ;; end]]);
uNext[[end]] = 0;
uLast = uNow;
uNow = uNext,
n > 1,
uNext[[1]] = 0;
uNext[[2 ;; (end - 1)]] = uNow[[1 ;; (end - 2)]] + uNow[[3 ;; end]] - uLast[[2 ;; (end - 1)]];
uNext[[end]] = 0;
uLast = uNow;
uNow = uNext
];
graph = Grid[{
{Row[{"time", Spacer[5], padIt2[N[n*t], {6, 5}], Spacer[5], "step number", Spacer[2], padIt2[n, 6]}]},
(*{ScientificForm[N@(n-1)*t,4]},*)
{ListLinePlot[Transpose[{grid, uNow}], PlotRange -> {{-.1, 1.1}, {-1, 1}}, ImageSize -> 400, GridLines -> Automatic,
GridLinesStyle -> LightGray], SpanFromLeft}
}, Alignment -> Center
];
Which[state == "RUN" || state == "STEP",
n++;
If[state == "RUN",
tick = Not[tick]
]
];
graph
],
Grid[{
{
Grid[{
{ Button[Text@Style["run", 12], {state = "RUN"; tick = Not[tick]}, ImageSize -> {60, 40}],
Button[Text@Style["step", 12], {state = "STEP"; tick = Not[tick]}, ImageSize -> {60, 40}],
Button[Text@Style["stop", 12], {state = "STOP"; tick = Not[tick]}, ImageSize -> {60, 40}],
Button[Text@Style["reset", 12], {state = "RESET"; nPoints = 300; dataChanged = True; n = 0; c = 351; f = 2;
tick = Not[tick]}, ImageSize -> {60, 40}]}
}, Spacings -> {.5, 0}, Frame -> True, FrameStyle -> Gray
], SpanFromLeft
},
{"number of x-points",
Manipulator[Dynamic[nPoints, {nPoints = #; dataChanged = True; tick = Not[tick]} &], {5, 1000, 1}, ImageSize -> Tiny],
Dynamic[padIt2[nPoints, 4]], SpanFromLeft},
{"wave speed", Manipulator[Dynamic[c, {c = #; dataChanged = True; tick = Not[tick]} &], {1, 1000, 1}, ImageSize -> Tiny],
Dynamic[padIt2[c, 4]], SpanFromLeft},
{"select initial data",
SetterBar[Dynamic[f, {f = #; dataChanged = True; tick = Not[tick]} &], {1, 2}
], SpanFromLeft
}
}, Alignment -> Center, Spacings -> {0.5, .2}],
{{f, 2}, None},
{{state, "STOP"}, None},
{{n, 0}, None},
{{c, 351}, None},
{{dataChanged, True}, None},
{{nPoints, 300}, None},
{{tick, False}, None},
{{uNow, {}}, None},
{{uNext, {}}, None},
{{uLast, {}}, None},
{{grid, {}}, None},
TrackedSymbols :> {tick},
ControlPlacement -> Left, Alignment -> Center, ImageMargins -> 0, FrameMargins -> 0,
Initialization :>
(
f1[x_] := Piecewise[{{Sin[2 Pi (x - 0.2)/0.4], 0.2 <= x <= 0.6}, {0, True}}];
f2[x_] := Piecewise[{{x, 0 <= x <= 0.5}, {1 - x, True}}];
len = 1;
integerStrictPositive = (IntegerQ[#] && # > 0 &);
integerPositive = (IntegerQ[#] && # >= 0 &);
numericStrictPositive = (Element[#, Reals] && # > 0 &);
numericPositive = (Element[#, Reals] && # >= 0 &);
numericStrictNegative = (Element[#, Reals] && # < 0 &);
numericNegative = (Element[#, Reals] && # <= 0 &);
bool = (Element[#, Booleans] &);
numeric = (Element[#, Reals] &);
integer = (Element[#, Integers] &);
(*--------------------------------------------*)
padIt1[v_?numeric, f_List] := AccountingForm[v,
f, NumberSigns -> {"-", "+"}, NumberPadding -> {"0", "0"}, SignPadding -> True];
(*--------------------------------------------*)
padIt1[v_?numeric, f_Integer] := AccountingForm[Chop[v],
f, NumberSigns -> {"-", "+"}, NumberPadding -> {"0", "0"}, SignPadding -> True];
(*--------------------------------------------*)
padIt2[v_?numeric, f_List] := AccountingForm[v,
f, NumberSigns -> {"", ""}, NumberPadding -> {"0", "0"}, SignPadding -> True];
(*--------------------------------------------*)
padIt2[v_?numeric, f_Integer] := AccountingForm[Chop[v],
f, NumberSigns -> {"", ""}, NumberPadding -> {"0", "0"}, SignPadding -> True]
(*--------------------------------------------*)
)
]