## ## Symmetric Galerkin 3D Laplace ## Edge Adjacent LINEAR ## Log Term ## with(linalg): readlib(fortran): ## ## define arrays ## mq := array(1..3): mp := array(1..3): Q := array(1..3): P := array(1..3): R := array(1..3): JN := array(1..3): jn := array(1..3): N := array(1..3): jc := array(1..2); LL := array(1..1); cnum := array(0..3); CFS := array(0..2,0..2); rc := array(1..3,0..1); chks := array(0..3,1..3); # sq3 := sqrt(3); ## ## 3 noded triangle shape functions ## mq[1] := (sq3*(1-ee) - xx)/(2*sq3); mq[2] := (sq3*(1+ee) - xx)/(2*sq3); mq[3] := xx/sq3; # mp[1] := (sq3*(1-e) - x)/(2*sq3); mp[2] := (sq3*(1+e) - x)/(2*sq3); mp[3] := x/sq3; ## ## WLOG ## xp[1] := 0; yp[1] := 0; zp[1] := 0; yp[2] := 0; zp[2] := 0; zp[3] := 0; xq[2] := 0; yq[2] := 0; zq[2] := 0; xq[1] := xp[2]; yq[1] := 0; zq[1] := 0; ## xp[2] := 1; #zq[3] := 0; ## ## Q[1] := 0; Q[2] := 0; Q[3] := 0; P[1] := 0; P[2] := 0; P[3] := 0; for j from 1 to 3 do Q[1] := Q[1] + xq[j]*mq[j]; Q[2] := Q[2] + yq[j]*mq[j]; Q[3] := Q[3] + zq[j]*mq[j]; # P[1] := P[1] + xp[j]*mp[j]; P[2] := P[2] + yp[j]*mp[j]; P[3] := P[3] + zp[j]*mp[j]; od; ## normals n11 := diff(P[1],e); n12 := diff(P[2],e); n13 := diff(P[3],e); n21 := diff(P[1],x); n22 := diff(P[2],x); n23 := diff(P[3],x); JN1 := n12*n23-n22*n13; JN2 := -(n11*n23-n13*n21); JN3 := n11*n22-n12*n21; JN[1] := JN1; JN[2] := JN2; JN[3] := JN3; N[1] := 0; N[2] := 0; N[3] := 1; ## n11 := diff(Q[1],ee); n12 := diff(Q[2],ee); n13 := diff(Q[3],ee); n21 := diff(Q[1],xx); n22 := diff(Q[2],xx); n23 := diff(Q[3],xx); jn1 := n12*n23-n22*n13; jn2 := -(n11*n23-n13*n21); jn3 := n11*n22-n12*n21; ## jn[1] := jn1; jn[2] := jn2; jn[3] := jn3; ndN := JN[3]*jn[3]; ## P := add(P,N,1,eps); R := add(Q,P,1,-1); for j from 1 to 3 do R[j] := subs(ee=rho*ct-e,xx=rho*st,R[j]); R[j] := subs(rho=Lambda*cp,x=Lambda*sp,R[j]); R[j] := expand(R[j]); R[j] := collect(R[j],Lambda); for ll from 0 to 1 do rc[j,ll] := coeff(R[j],Lambda,ll); rc[j,ll] := collect(rc[j,ll],[ct,st]); od; od; ## ## r**2 = eps^2 + eps*b1*Lambda + b2*Lambda**2 ## b[1] := 2*(rc[1,0]*rc[1,1] + rc[2,0]*rc[2,1] + rc[3,0]*rc[3,1] )/eps; ## b[2] := rc[1,1]^2 + rc[2,1]^2 + rc[3,1]^2; ## jnr := jq1*Lambda-eps*ndN/jp ## jNr := jp1*Lambda-jp*eps ## jq1 := jn dot rc[*,1] jp1 := jN dot rc[*,1] ## jc[1] := jn[1]*rc[1,1] + jn[2]*rc[2,1] + jn[3]*rc[3,1]; jc[2] := JN[3]*rc[3,1]; jss := expand(jc[1]*jc[2]); ## ## Log term ## b2 := rc[1,1]^2 + rc[2,1]^2 + rc[3,1]^2; b2 := expand(b2): b2 := collect(b2,[cp,sp]); cc := coeff(b2,cp,2); cs := coeff(b2,cp,1)/sp; ss := coeff(b2,cp,0)/sp^2; ## c2=cc c1=cs c0=ss check := expand(b2 - (cc*cp^2+cs*cp*sp+ss*sp^2)); b2n := c2*cp^2+c1*cp*sp+c0*sp^2; ## ## #Lterm := cp*( - ndN/b2n^(3/2)); #Lterm := cp*( 3*jss/b2n^(5/2) ); Lterm := cp*( 3*jss/b2n^(5/2) - ndN/b2n^(3/2) ); Lterm := expand(Lterm); #Lterm := subs(sq3^2=3,Lterm); ## ## q = cotan(p) dq = -1/sp^2 * dp 0 0 z3 = 0 z0 := factor(expand(z0)); z0 := z0/c00^3/32; z0 := z0/(c10-2*c21*c11); z0 := z0/(c10^2-4*c21*c11*c10+4*c20*c11^2)^2; z0 := subs( c00=CFS[0,0], c10=CFS[1,0], c11=CFS[1,1], c20=CFS[2,0], c21=CFS[2,1], c22=CFS[2,2], z0): z0 := factor(expand(z0)); ## ==> z3 = 0