# These differential forms alpha[i] and beta[j] are as in sec-int-props #@ alpha_form alpha_form[1] := y[1]*(x[2]*dx[1] - x[1]*dx[2]); alpha_form[2] := (z[1]*z[2]+z[1])*y[1]*y[2]*(dx[1]*x[2]+dx[2]*x[1]) + (-2)*z[1]*x[1]*x[2]*y[2]*dx[3]+ (2*z[1]*z[2]+2)*x[1]*x[2]*dx[4]; #@ beta_form beta_form[1] := y[1]*(x[2]*dx[1] - x[1]*dx[2]); beta_form[2] := y[1]*y[2]*(x[2]*dx[1] + x[1]*dx[2]); beta_form[3] := x[1]*x[2]*y[2]*dx[3]; beta_form[4] := x[1]*x[2]*dx[4]; #@ theta_form theta_form[1] := add(diff(g0(x),x[i])*dx[i],i=1..4); theta_form[2] := add(x[i]*dx[i],i=1..4); alpha_form[3] := x[1]*x[2]*theta_form[1]; alpha_form[4] := x[1]*x[2]*y[1]*y[2]*theta_form[2]; # This is the matrix P such that alpha[i] = sum(P[i,j] * beta[j],j=1..4) #@ alpha_beta alpha_beta := [ [1,0,0,0], [0,z[1]*(1+z[2]),-2*z[1],2*(1+z[1]*z[2])], [sqrt(2)*(1-z[1])*(1-2*z[2]),z[1]*(1-2*z[2]),(z[1] - 2),(-2+3*z[1]-4*z[1]*z[2])], [(3*z[1]-2)*z[2]/(2*sqrt(2)),(1 - z[1] - z[1]*z[2])/2,z[1],-z[1]*z[2]] ]; # Norm of dg in terms of z #@ ndg_z ndg_z := sqrt((2 - z[1])^2 * (1 + z[2])); #@ D_alpha # This is the Stokes operator D = *d applied to alpha[1] D_alpha[1] := (9*z[1]^2*z[2]-9*z[1]^2+2*z[1]*z[2]+9*z[1]-2)/ndg_z; # This is the Stokes operator D = *d applied to alpha[2] D_alpha[2] := (45*z[1]^3*z[2]^2-45*z[1]^3*z[2]+78*z[1]^2*z[2]-20*z[1]*z[2]^2 -12*z[1]^2-28*z[1]*z[2]+12*z[1]-8*z[2])/sqrt(2)/ndg_z; # dz_cross_alpha[i,j] is * (dz[i] wedge alpha[j]) #@ dz_cross_alpha dz_cross_alpha[1,1] := 2*z[1]*(3*z[1]-2)*(z[1]*z[2]-z[1]+1)/ndg_z; dz_cross_alpha[1,2] := sqrt(2)*z[1]* (9*z[1]^3*z[2]^2-9*z[1]^3*z[2]-12*z[1]^2*z[2]^2+ 26*z[1]^2*z[2]+4*z[1]*z[2]^2-4*z[1]^2-24*z[1]*z[2]+ 8*z[1]+8*z[2]-4) / ndg_z; dz_cross_alpha[2,1] := 4*z[1]*z[2]*(2*z[2]-1) / ndg_z; dz_cross_alpha[2,2] := 2*sqrt(2)*(3*z[1]^2*z[2]-2*z[1]*z[2]+2*z[1]-2)*z[2]*(2*z[2]-1) / ndg_z; #@ xy0 xy0[1] := sqrt(uy0[1]); xy0[2] := sqrt(uy0[2]); xy0[3] := y[1]; xy0[4] := -y[1]*y[2]; # Rules for rewriting x[i], z[i], dx[i] and dz[i] in terms of y[j] and dy[j] #@ forms_to_y forms_to_y := { x[1] = sqrt(uy0[1]), x[2] = sqrt(uy0[2]), x[3] = y[1], x[4] = -y[1]*y[2], dx[1] = grad_y(sqrt(uy0[1])), dx[2] = grad_y(sqrt(uy0[2])), dx[3] = grad_y(y[1]), dx[4] = grad_y(-y[1]*y[2]), z[1] = y[1]^2, z[2] = y[2]^2, dz[1] = 2*y[1]*dy[1], dz[2] = 2*y[2]*dy[2] }: ###################################################################### # This is an alternative notation, which we are not really using. #@ de_rham_d0 de_rham_d0 := (u) -> add(diff(u,x[i])*dx[i],i=1..4): #@ de_rham_d1 de_rham_d1 := proc(u) local v,w,i,j; for i from 1 to 4 do for j from 1 to 4 do v[i,j] := diff(coeff(u,dx[i]),x[j]); od: od: w := add(add(v[i,j]*dx[j,i],j=1..i-1),i=1..4) - add(add(v[i,j]*dx[i,j],j=i+1..4),i=1..4); return(w); end: #@ wedge wedge := proc(u,v) add(add(coeff(u,dx[i])*coeff(v,dx[j])*dx[i,j],i=1..j-1),j=1..4) - add(add(coeff(u,dx[i])*coeff(v,dx[j])*dx[j,i],i=j+1..4),j=1..4); end: ###################################################################### #@ unnormalised_stokes unnormalised_stokes := proc(u) local nn,uu,du,S4,sgn4,s; nn := dg0(xx); uu := [seq(coeff(u,dx[i],1),i=1..4)]; du := [seq([seq(diff(uu[j],x[i]),j=1..4)],i=1..4)]; S4 := combinat[permute](4); sgn4 := (s) -> signum(mul(mul(s[j]-s[i],j=i+1..4),i=1..3)); add(sgn4(s)*du[s[1]][s[2]]*x[s[3]]*nn[s[4]],s in S4); end: #@ stokes stokes := (u) -> unnormalised_stokes(u)/sqrt(square_norm_of_dg0(xx)); # stokes_alpha([f1,f2]) = # stokes(f1 * alpha_form[1] + f2 * alpha_form[2]) # (where f1 and f2 should be given in terms of z[1] and z[2]). #@ stokes_alpha stokes_alpha := proc(ff) local i,j; add(add(diff(ff[i],z[j]) * dz_cross_alpha[j,i],j=1..2),i=1..2) + add(ff[i] * D_alpha[i],i=1..2); end: