TTYOFF:TRUE$ DIMENSION(W) := BLOCK(/* W is an equation or a list of equations with an indeterminate on the left and a product of powers of MASS, LENGTH, TYME, TEMPERATURE, and CHARGE on the right. Globally establishes corresponding row(s) for exponent matrices, returning DONE. */ [V, ACTUAL, VALID], VALID: '[MASS, LENGTH, TYME, CHARGE, TEMPERATURE], W:LISTIFY(W), FOR U IN W DO ( V:RHS(U), U:LHS(U), ACTUAL: LISTOFVARS(V), FOR AC IN ACTUAL DO IF NOT MEMBER(AC,VALID) THEN PRINT( "WARNING:", AC, "NOT MEMBER OF", VALID), PUT(U,V,'DIMENSION))) $ LISTIFY(W) := IF LISTP(W) THEN W ELSE [W] $ %PURE: '[BOLTZMANNSCONSTANT, ELECTRICPERMITTIVITYOFAVACUUM] $ NONDIMENSIONALIZE(U) := BLOCK(/* U is a list of indeterminates representing classes of physical quantities such as VELOCITY or LENGTH, for which dimensions have previously been established by the DIMENSION function. Returns a list of nondimensional combinations of the physical quantities in U. */ /* ratmx:false in DOE MACSYMA */ [B, C, V, W, M, N, I, R, BASIS, LOGEXPAND, RATMX:false, SCALARMATRIXP], U: LISTIFY(U), /* Determine basis: */ M:N:0, BASIS:[LENGTH, TYME, MASS, TEMPERATURE, CHARGE], IF MEMBER('BOLTZMANNSCONSTANT, %PURE) THEN (M:M+1, BASIS:DELETE('TEMPERATURE,BASIS)), IF MEMBER('ELECTRICPERMITTIVITYOFAVACUUM,%PURE) THEN (M:M+1, BASIS:DELETE('CHARGE,BASIS)), IF MEMBER('GRAVITYCONSTANT,%PURE) THEN (N:N+1, BASIS:DELETE('MASS,BASIS)), IF MEMBER('PLANCKSCONSTANT,%PURE) THEN (N:N+1, BASIS:DELETE('TYME,BASIS)), IF MEMBER('SPEEDOFLIGHT,%PURE) THEN (N:N+1, BASIS:DELETE('LENGTH,BASIS)), IF BASIS=[] THEN RETURN(U), IF N>0 AND M<2 THEN ERROR("INVALID TO INCLUDE GRAVITYCONSTANT", "PLANCKSCONSTANT OR SPEEDOFLIGHT WITHOUT ALSO INCLUDING", "BOLTZMANNSCONSTANT & ELECTRICPERMITTIVITYOFAVACUUM"), C:B:V:W: [], /* ratmx:false in DOE MACSYMA */ LOGEXPAND:/* RATMX: */TRUE, SCALARMATRIXP:FALSE, N:0, M:LENGTH(BASIS), /* Construct matrix of exponents: */ FOR UU IN U DO (B: GET(UU, 'DIMENSION), IF B=FALSE THEN ERROR("FIRST DO AN APPROPRIATE DIMENSION(",''UU, "= TERM WITH POWERS OF MASS, LENGTH, TYME, TEMPERATURE & CHARGE" ), IF MEMBER('BOLTZMANNSCONSTANT, %PURE) THEN B: SUBST(TEMPERATURE=MASS*LENGTH^2/TYME^2, B), IF MEMBER(ELECTRICPERMITTIVITYOFAVACUUM,%PURE) THEN B: SUBST(CHARGE=LENGTH^(3/2)*MASS^(1/2)/TYME, B), IF MEMBER(SPEEDOFLIGHT,%PURE) THEN IF MEMBER(PLANCKSCONSTANT,%PURE) THEN B: SUBST([LENGTH=1/MASS,TYME=1/MASS], B) ELSE IF MEMBER(GRAVITYCONSTANT,%PURE) THEN B: SUBST([MASS=TYME,LENGTH=TYME], B) ELSE B: SUBST(LENGTH=TYME, B) ELSE IF MEMBER(PLANCKSCONSTANT,%PURE) THEN IF MEMBER(GRAVITYCONSTANT,%PURE) THEN B: SUBST([MASS=LENGTH^(-1/3), TYME=LENGTH^(-5/3)], B) ELSE B: SUBST(TYME=MASS*LENGTH^2, B) ELSE IF MEMBER(GRAVITYCONSTANT,%PURE) THEN B: SUBST(MASS=LENGTH^3/TYME^2, B), B:LOG(B), R:[], FOR UU IN BASIS DO R:CONS(COEFF(B,LOG(UU)), R), C:CONS(R,C), W:CONS(UU,W), N:N+1), C:SUBSTINPART('MATRIX,C,0), R:RANK(C), IF R=0 THEN RETURN(U), IF R=N THEN RETURN([]), /* Delete dependent columns: */ I:1, WHILE R