option nolet !*********************************************************** ! symbol : general :Levi-Civita,symbol: change position ! info:https://en.wikipedia.org/wiki/Levi-Civita_symbol !*********************************************************** ! website :https://petervlaschemeng.weebly.com/ ! topic :fluid dynamics (2019) !***************************************************************** !filename :FLUIDGENERALLEVICIVITASYMBOLPOSITIONINPUTSUBVERSION1CFINALFINAL !***************************************************************** print print "**************************************************************" print "--------------------------------------------------------------" print " fluid:general :Levi-Civita symbol(position,sub),version 1.0c " print " peter.vlasschaert@gmail.com,29/08/2019 " print "--------------------------------------------------------------" print " ref : maple code: Denis Constales (Prof UGent) " print "**************************************************************" !***************************************************************** ! ref code :peterperm.mw !***************************************************************** print "--------------------------------------------" print " example : epsilon(1,2,3) => sign = 1,even " print " example : epsilon(2,1,3) => sign = -1,odd " print " example : epsilon(1,1,3) => sign = 0 " print "--------------------------------------------" !**************************************** ! even or odd interchanges of position * !**************************************** print dim a(1),b(1,1) mat a = 0 mat b = 0 m1$ = " not a permutation " !******************************************************* ! how to use program , input integer = 1 for the example !******************************************************* input prompt " example = 1, input(epsilon),seq = 2 => ":s print if s=1 then n = 5 ! use 1,2,3,4,5 mat redim a(n),b(1,2) m1$ = " not a permutation " a(1) = 4 a(2) = 5 a(3) = 2 a(4) = 1 a(5) = 3 else input prompt " how many numbers (n:integer): seq. of epsilon => ": m print n=m ! integer : the length seq : sequence call matrix_inp(n,a()) end if ! copy a matrix dim dd(1) mat redim dd(n) mat dd = a print print "**************************" print " input permutation symbol " print "**************************" mat print a ! input matrix for the permutation k=0 ! init : counter dimension matrix b (number of rows) print "*************************************************" print "change position : interchange of position " print "*************************************************" print call algo_perm(n,a(),b(,),m2$,k) call epsilon_sign(m1$,m2$,k,eps,b(,)) print "************************************" print " value permutation symbol (epsilon) " print "************************************" print if s=1 then print "************" print " example " print "************" print print " epsilon(4,5,2,1,3) = ";" ,k = ";k;" , sign = ";eps else print "************" print " output " print "************" print call epsilon_str(a(),kk$) print kk$ ;" ,k = ";k;" , sign = ";eps end if print !****************************** ! How to use swap : see example !****************************** if s=1 then print " how to use swap of two elements " print dim h(4) h(1) = 3 h(2) = 2 h(3) = 4 h(4) = 1 print " input => " mat print h ! intechange element (2,3) call swap_el(2,3,h()) print " output => call swap_el(2,3,h())" print " swap element 2 and element 3 " mat print h end if print "***********************" print " final output sequence " print "***********************" dim mo(1,1),mo1(1,1) mat redim mo1(k+1,n),mo(k+1,n) mat mo = zero mat mo1 = zero for i3 = 1 to n mo1(1,i3) = dd(i3) next i3 !************************************ ! matrix input all output, matrix mo dim mo2(1,1) mat redim mo2(k,n) !************************************ print ! use b matrix for i=1 to k call swap_el(b(i,1),b(i,2),dd()) ! mat print dd ! or ! use mo2 , matrix for i1 = 1 to n mo2(i,i1) = dd(i1) next i1 ! end mo2 next i ! moh => same dimension as mo1, redimension for mo2 dim moh(1,1) mat redim moh(k+1,n) mat moh = 0 for l1=2 to k+1 for l2 = 1 to n moh(l1,l2)=mo2(l1-1,l2) next l2 next l1 mat mo = mo1+moh mat print mo end sub matrix_inp(n,a()) mat redim a(n) for j = 1 to n print "position ,in the string epsilon(";j;") = "; input a(j) next j end sub sub epsilon_str(a(),kk$) !***************************** ! how to build string epsilon !***************************** kk$ = "epsilon("& str$(a(1)) for i=2 to n kk$ = kk$ & "," & str$(a(i)) next i kk$ = kk$ & ") = " !************************** ! end build epsilon string !************************** end sub sub algo_perm(n,a(),b(,),m2$,k) for i= 1 to n if a(i) <> i then ! value matrix ( 1 on position one,....) otherwise for j=i+1 to n ! all values except the first if a(j) = i then exit for end if next j if n < j then m2$ = " not a permutation " exit for end if ! interchange a(j) = a(i) a(i) = i ! output : begin k=k+1 mat redim b(k,2) ! don't forget first index b must be k b(k,1) = i b(k,2) = j ! output : end end if next i end sub sub epsilon_sign(m1$,m2$,k,eps,b(,)) if m1$ = m2$ then print m1$ eps = 0 ! when two symbols are the same else mat print b ! even or odd if mod(k,2) = 0 then eps = 1 ! even print " k = ";k else eps = -1 ! odd print " k = ";k end if end if end sub sub swap_el(h1,h2,h()) temp1 = h(h1) h(h1) = h(h2) h(h2) = temp1 end sub