Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
kill(all);
load("myhelpers.mac");
/* redefine this to change dimensionality: */
n:[nx,ny];
dims:length(n);
assume(c>0);
if dims = 1 then n:[1];
esymmatrix(n, v, i,j):=ematrix(n,n,v,i,j)+ematrix(n,n,v,j,i);
wave_A:sum(n[i]*esymmatrix(dims+1, -c, 1+i,1),i,1,dims);
[wave_V, wave_D, wave_invV]:hypdiagonalize(wave_A);
wave_vm:makelist(concat(vm,i),i,1,dims);
wave_vp:makelist(concat(vp,i),i,1,dims);
wave_wm:append([um],wave_vm);
wave_wp:append([up],wave_vp);
wave_sm:makelist(concat(sm,i),i,1,length(wave_D));
wave_sp:makelist(concat(sp,i),i,1,length(wave_D));
wave_sminw:wave_invV.wave_wm;
wave_spinw:wave_invV.wave_wp;
wave_wmins:wave_V.wave_sm;
wave_wpins:wave_V.wave_sp;
wave_radbdryspinw:makelist(
if wave_D[i,i] >= 0 then wave_sminw[i,1] else 0,
i, 1, length(wave_D));
wave_radbdrywp:fullhypsimp(wave_V.wave_radbdryspinw);
wave_dirbdryspinw:makelist(
if wave_D[i,i] >= 0 then wave_sminw[i,1] else ubc,
i, 1, length(wave_D));
wave_dirbdrywp:fullhypsimp(wave_V.wave_dirbdryspinw);
print("Radiation boundary condition for the wave equation:");
print(wave_radbdrywp);
print("Dirichlet boundary condition for the wave equation:");
print(expand(wave_dirbdrywp));
wave_known_dirbdrywp:vstack([-n.wave_vm/2 + um/2 + ubc],
-n*um/2 + n*ubc - 1/2*n*(n.wave_vm) + wave_vm);
assert(norm_2_squared(fullhypsimp(wave_known_dirbdrywp - wave_dirbdrywp))=0);
print("Homogeneous-dirichlet in characteristic:");
print(fullhypsimp(wave_invV.vstack(
-columnvector(first(wave_wmins)),
rest(wave_wmins))
));
print("Homogeneous-Neumann in characteristic:");
print(fullhypsimp(wave_invV.vstack(
columnvector(first(wave_wmins)),
-rest(wave_wmins))
));
/* ------------------------------------------------------------------------- */
wave_eigenvalues:makelist(wave_D[i,i], i, 1, length(wave_D));
if member(0, wave_eigenvalues) then
wave_sflux:hyp_upwind_flux([-c,0,c], wave_D)
else
wave_sflux:hyp_upwind_flux([-c,c], wave_D);
wave_wflux:ratsimp(wave_V.ev(wave_sflux, [sm=wave_sminw,sp=wave_spinw]));
wave_strongwflux:fullhypsimp(subst([c=cm], wave_A).wave_wm - wave_wflux);
/*
print("Wave equation flux in terms of characteristic variables:");
print(wave_sflux);
print("Weak flux divided by (-c), as implemented in StrongWaveOperator:");
print(hypsimp(ev(wave_wflux, cp=c, cm=c)/(-c)));
*/
print("Wave equation weak flux in terms of physical variables:");
print(wave_wflux);
print("Strong-form wave equation flux in terms of physical variables:");
/*print(wave_strongwflux);*/
print(fullhypsimp(ev(wave_strongwflux)));
/* Closed-form expression for upwind flux */
wave_knownstrongwflux:vstack(
[(cp*n.wave_vp - cm*n.wave_vm + cp*up-cm*um)/2],
(cp*n*(n.wave_vp)-cm*n*(n.wave_vm) + cp*n*up - cm*n*um)/2
);
assert(norm_2_squared(fullhypsimp(wave_knownstrongwflux - wave_strongwflux))=0);