Home My Page Projects Code Snippets Project Openings diderot
 Summary Activity Tracker Tasks SCM

# SCM Repository

[diderot] Diff of /branches/vis15/src/compiler/ein/mk-operators.sml
 [diderot] / branches / vis15 / src / compiler / ein / mk-operators.sml

# Diff of /branches/vis15/src/compiler/ein/mk-operators.sml

revision 3716, Sat Apr 2 17:35:02 2016 UTC revision 3978, Wed Jun 15 19:07:40 2016 UTC
# Line 84  Line 84
84      val expF : dim -> Ein.ein      val expF : dim -> Ein.ein
85      val expT : Ein.ein      val expT : Ein.ein
86
87      val powF  : dim * int -> Ein.ein      val powFI  : dim * int -> Ein.ein

88      val sqrtR : Ein.ein      val sqrtR : Ein.ein
89      val sqrtF : dim -> Ein.ein      val sqrtF : dim -> Ein.ein
90      val cosR  : Ein.ein      val cosR  : Ein.ein
# Line 139  Line 138
138      fun specialize (alpha, inc) = List.mapi (fn (i, _) => E.V(i + inc)) alpha      fun specialize (alpha, inc) = List.mapi (fn (i, _) => E.V(i + inc)) alpha
139
140      fun sumIds (n, inc, alpha) = let      fun sumIds (n, inc, alpha) = let
141          val vs = List.tabulate(n, fn v => E.V(v+inc))          val vs = List.tabulate(n, fn v => (v+inc))
142          in          in
143            ListPair.map (fn(v, i) => (v, 0, i-1)) (vs, alpha)            ListPair.map (fn(v, i) => (v, 0, i-1)) (vs, alpha)
144          end          end
145
146      fun sumIds2 (n, i) = List.tabulate(n, fn v => (E.V v, 0, i))      fun sumIds2 (n, i) = List.tabulate(n, fn v => (v, 0, i))
147
148    (******************************* Addition *****************************************)    (******************************* Addition *****************************************)
149
# Line 345  Line 344
344      val cross2TT = E.EIN{      val cross2TT = E.EIN{
345               params = [mkTEN [2], mkTEN [2]],               params = [mkTEN [2], mkTEN [2]],
346               index = [],               index = [],
347               body = E.Sum([(E.V 0, 0, 1), (E.V 1, 0, 1)],               body = E.Sum([(0, 0, 1), (1, 0, 1)],
348               E.Opn(E.Prod, [E.Eps2(0, 1), E.Tensor(0, [E.V 0]), E.Tensor(1, [E.V 1])]))               E.Opn(E.Prod, [E.Eps2(0, 1), E.Tensor(0, [E.V 0]), E.Tensor(1, [E.V 1])]))
349            }            }
350
# Line 353  Line 352
352      val cross3TT = E.EIN{      val cross3TT = E.EIN{
353               params = [mkTEN [3], mkTEN [3]],               params = [mkTEN [3], mkTEN [3]],
354               index = [3],               index = [3],
355               body = E.Sum([(E.V 1, 0, 2), (E.V 2, 0, 2)],               body = E.Sum([(1, 0, 2), (2, 0, 2)],
356                  E.Opn(E.Prod, [                  E.Opn(E.Prod, [
357                      E.Epsilon(0, 1, 2),                      E.Epsilon(0, 1, 2),
358                      E.Tensor(0, [E.V 1]),                      E.Tensor(0, [E.V 1]),
# Line 364  Line 363
363    (* Field Cross Product *)    (* Field Cross Product *)
364      val cross2FF = E.EIN{      val cross2FF = E.EIN{
365              params = [E.FLD(2), E.FLD(2)], index = [],              params = [E.FLD(2), E.FLD(2)], index = [],
366              body = E.Sum([(E.V 0, 0, 1), (E.V 1, 0, 1)],              body = E.Sum([(0, 0, 1), (1, 0, 1)],
367                  E.Opn(E.Prod, [E.Eps2(0, 1), E.Field(0, [E.V 0]), E.Field(1, [E.V 1])]))                  E.Opn(E.Prod, [E.Eps2(0, 1), E.Field(0, [E.V 0]), E.Field(1, [E.V 1])]))
368            }            }
369
370    (* Field Cross Product *)    (* Field Cross Product *)
371      val cross3FF = E.EIN{      val cross3FF = E.EIN{
372              params = [E.FLD(3), E.FLD(3)], index= [3],              params = [E.FLD(3), E.FLD(3)], index= [3],
373              body = E.Sum([(E.V 1, 0, 2), (E.V 2, 0, 2)],              body = E.Sum([(1, 0, 2), (2, 0, 2)],
374                  E.Opn(E.Prod, [E.Epsilon(0, 1, 2),                  E.Opn(E.Prod, [E.Epsilon(0, 1, 2),
375                  E.Field(0, [E.V 1]), E.Field(1, [E.V 2])]))                  E.Field(0, [E.V 1]), E.Field(1, [E.V 2])]))
376            }            }
# Line 429  Line 428
428            val alpha = List.take(shape1, length shape1 - 1)            val alpha = List.take(shape1, length shape1 - 1)
429            val expindexA = specialize(alpha, 0)            val expindexA = specialize(alpha, 0)
430            val expindexB = specialize(beta, length alpha)            val expindexB = specialize(beta, length alpha)
431            val s' = E.V(length alpha + length beta)            val sid = length alpha + length beta
432            val s'' = [(s', 0, i-1)]            val sx = E.V sid
433              val s'' = [(sid, 0, i-1)]
434            in            in
435              E.EIN{              E.EIN{
436                  params = [mkTEN shape1, mkTEN(i :: beta)],                  params = [mkTEN shape1, mkTEN(i :: beta)],
437                  index = alpha@beta,                  index = alpha@beta,
438                  body = E.Sum(s'', E.Opn(E.Prod, [                  body = E.Sum(s'', E.Opn(E.Prod, [
439                      E.Tensor(0, expindexA@[s']),   (* T_{\alpha i} *)                      E.Tensor(0, expindexA@[sx]),   (* T_{\alpha i} *)
440                      E.Tensor(1, [s']@expindexB )   (* T'_{i \beta} *)                      E.Tensor(1, [sx]@expindexB )   (* T'_{i \beta} *)
441                    ]))                    ]))
442                }                }
443            end            end
# Line 448  Line 448
448            val alpha = List.take(shape1, length shape1 - 1)            val alpha = List.take(shape1, length shape1 - 1)
449            val expindexA = specialize(alpha, 0)            val expindexA = specialize(alpha, 0)
450            val expindexB = specialize(beta, length alpha)            val expindexB = specialize(beta, length alpha)
451            val sid = E.V(length alpha + length beta)            val sid = length alpha + length beta
452              val sx = E.V sid
453            in            in
454              E.EIN{              E.EIN{
455                  params = [E.FLD dim, E.FLD dim],                  params = [E.FLD dim, E.FLD dim],
456                  index = alpha @ beta,                  index = alpha @ beta,
457                  body = E.Sum([(sid, 0, i-1)],                  body = E.Sum([(sid, 0, i-1)],
458                    E.Opn(E.Prod, [                    E.Opn(E.Prod, [
459                        E.Field(0, expindexA @ [sid]),   (* F_{\alpha i} *)                        E.Field(0, expindexA @ [sx]),   (* F_{\alpha i} *)
460                        E.Field(1, [sid] @ expindexB)    (* F'_{i \beta} *)                        E.Field(1, [sx] @ expindexB)    (* F'_{i \beta} *)
461                      ]))                      ]))
462                }                }
463            end            end
# Line 466  Line 467
467            val alpha = List.take(shape1, length shape1-1)            val alpha = List.take(shape1, length shape1-1)
468            val expindexA = specialize(alpha, 0)            val expindexA = specialize(alpha, 0)
469            val expindexB = specialize(beta, length alpha)            val expindexB = specialize(beta, length alpha)
470            val sid = E.V(length alpha + length beta)            val sid = length alpha + length beta
471              val sx = E.V sid
472            in            in
473              E.EIN{              E.EIN{
474                  params = [E.FLD dim, mkTEN(i::beta)],                  params = [E.FLD dim, mkTEN(i::beta)],
475                  index = alpha @ beta,                  index = alpha @ beta,
476                  body = E.Sum([(sid, 0, i-1)],                  body = E.Sum([(sid, 0, i-1)],
477                    E.Opn(E.Prod, [                    E.Opn(E.Prod, [
478                        E.Field(0, expindexA @ [sid]),           (* F_{\alpha i} *)                        E.Field(0, expindexA @ [sx]),           (* F_{\alpha i} *)
479                        E.Lift(E.Tensor(1, [sid] @ expindexB ))  (* F'_{i \beta} *)                        E.Lift(E.Tensor(1, [sx] @ expindexB ))  (* F'_{i \beta} *)
480                      ]))                      ]))
481                }                }
482            end            end
# Line 484  Line 486
486            val alpha = List.take(shape1, length shape1 - 1)            val alpha = List.take(shape1, length shape1 - 1)
487            val expindexA = specialize(alpha, 0)            val expindexA = specialize(alpha, 0)
488            val expindexB = specialize(beta, length alpha)            val expindexB = specialize(beta, length alpha)
489            val sid = E.V(length(alpha) + length beta)            val sid = length(alpha) + length beta
490              val sx = E.V sid
491            in            in
492              E.EIN{              E.EIN{
493                  params = [mkTEN shape1, E.FLD dim],                  params = [mkTEN shape1, E.FLD dim],
494                  index = alpha @ beta,                  index = alpha @ beta,
495                  body = E.Sum([(sid, 0, i-1)],                  body = E.Sum([(sid, 0, i-1)],
496                    E.Opn(E.Prod, [                    E.Opn(E.Prod, [
497                        E.Lift(E.Tensor(0, expindexA @ [sid])),   (* F_{\alpha i} *)                        E.Lift(E.Tensor(0, expindexA @ [sx])),   (* F_{\alpha i} *)
498                        E.Field(1, [sid] @ expindexB)             (* F'_{i \beta} *)                        E.Field(1, [sx] @ expindexB)             (* F'_{i \beta} *)
499                      ]))                      ]))
500                }                }
501            end            end
# Line 508  Line 511
511            val expindexB = specialize(beta, lenAlpha)            val expindexB = specialize(beta, lenAlpha)
512            val sumi = lenAlpha + length beta            val sumi = lenAlpha + length beta
513            val s' = [E.V sumi, E.V(sumi+1)]            val s' = [E.V sumi, E.V(sumi+1)]
514            val sx = [(E.V sumi, 0, i-1), (E.V(sumi+1), 0, j-1)]            val sx = [(sumi, 0, i-1), ((sumi+1), 0, j-1)]
515            in            in
516              E.EIN{              E.EIN{
517                  params = [mkTEN shape1, mkTEN(i::j::beta)],                  params = [mkTEN shape1, mkTEN(i::j::beta)],
# Line 526  Line 529
529            val expindexB = specialize(beta, lenAlpha)            val expindexB = specialize(beta, lenAlpha)
530            val sumi = lenAlpha + length beta            val sumi = lenAlpha + length beta
531            val s' = [E.V sumi, E.V(sumi+1)]            val s' = [E.V sumi, E.V(sumi+1)]
532            val sx = [(E.V sumi, 0, i-1), (E.V(sumi+1), 0, j-1)]            val sx = [(sumi, 0, i-1), ((sumi+1), 0, j-1)]
533            in            in
534              E.EIN{              E.EIN{
535                  params = [E.FLD dim, E.FLD dim],                  params = [E.FLD dim, E.FLD dim],
# Line 543  Line 546
546            val alpha = List.take(shape1, lenAlpha)            val alpha = List.take(shape1, lenAlpha)
547            val expindexA = specialize(alpha, 0)            val expindexA = specialize(alpha, 0)
548            val expindexB = specialize(beta, lenAlpha)            val expindexB = specialize(beta, lenAlpha)
549            val sumi = lenAlpha + length beta            val sid = lenAlpha + length beta
550            val s' = [E.V sumi, E.V(sumi+1)]            val s' = [E.V sid, E.V(sid+1)]
551            val sx = [(E.V sumi, 0, i-1), (E.V(sumi+1), 0, j-1)]            val sx = [(sid, 0, i-1), ((sid+1), 0, j-1)]
552            in            in
553              E.EIN{              E.EIN{
554                  params = [E.FLD dim, mkTEN shape1],                  params = [E.FLD dim, mkTEN shape1],
# Line 561  Line 564
564            val alpha = List.take(shape1, lenAlpha)            val alpha = List.take(shape1, lenAlpha)
565            val expindexA = specialize(alpha, 0)            val expindexA = specialize(alpha, 0)
566            val expindexB = specialize(beta, lenAlpha)            val expindexB = specialize(beta, lenAlpha)
567            val sumi = lenAlpha + length beta            val sid = lenAlpha + length beta
568            val s' = [E.V sumi, E.V(sumi+1)]            val s' = [E.V sid, E.V(sid+1)]
569            val sx = [(E.V sumi, 0, i-1), (E.V(sumi+1), 0, j-1)]            val sx = [(sid, 0, i-1), ((sid+1), 0, j-1)]
570            in            in
571              E.EIN{              E.EIN{
572                  params = [mkTEN(i::j::beta), E.FLD dim],                  params = [mkTEN(i::j::beta), E.FLD dim],
# Line 638  Line 641
641    (* Trace: <M_{i, i}>  This one Sx represents both i's*)    (* Trace: <M_{i, i}>  This one Sx represents both i's*)
642      fun traceT dim = E.EIN{      fun traceT dim = E.EIN{
643              params = [mkTEN [dim, dim]], index = [],              params = [mkTEN [dim, dim]], index = [],
644              body = E.Sum([(E.V 0, 0, dim-1)], E.Tensor(0, [E.V 0, E.V 0]))              body = E.Sum([(0, 0, dim-1)], E.Tensor(0, [E.V 0, E.V 0]))
645            }            }
646
647    (* Trace: <Sigma_i F_{\alpha i, i}>  This one Sx represents both i's *)    (* Trace: <Sigma_i F_{\alpha i, i}>  This one Sx represents both i's *)
648      fun traceF (dim, alpha) = let      fun traceF (dim, alpha) = let
649            val expindex = specialize(alpha, 0)            val expindex = specialize(alpha, 0)
650            val s = E.V(length alpha)            val sid = length alpha
651              val sx = E.V sid
652            in            in
653              E.EIN{              E.EIN{
654                  params = [E.FLD dim],                  params = [E.FLD dim],
655                  index = alpha,                  index = alpha,
656                  body = E.Sum([(s, 0, dim-1)], E.Field(0, expindex@[s, s]))                  body = E.Sum([(sid, 0, dim-1)], E.Field(0, expindex@[sx, sx]))
657                }                }
658            end            end
659
# Line 737  Line 741
741      val det3FA = E.EIN{      val det3FA = E.EIN{
742              params = [E.FLD 3],              params = [E.FLD 3],
743              index = [],              index = [],
744              body = E.Sum([(E.V 0, 0, 2), (E.V 1, 0, 2), (E.V 2, 0, 2)],              body = E.Sum([(0, 0, 2), (1, 0, 2), (2, 0, 2)],
745                E.Opn(E.Prod, [                E.Opn(E.Prod, [
746                    E.Epsilon(0, 1, 2),                    E.Epsilon(0, 1, 2),
747                    E.Field(0, [E.C 0, E.V 0]),                    E.Field(0, [E.C 0, E.V 0]),
# Line 749  Line 753
753      val det3F = E.EIN{      val det3F = E.EIN{
754              params = [E.FLD 3],              params = [E.FLD 3],
755              index = [],              index = [],
756              body = E.Sum([(E.V 0, 0, 2)],              body = E.Sum([(0, 0, 2)],
757                E.Opn(E.Prod, [                E.Opn(E.Prod, [
758                    E.Field(0, [E.C 0, E.V 0]),                    E.Field(0, [E.C 0, E.V 0]),
759                    E.Sum([(E.V 1, 0, 2)],                    E.Sum([(1, 0, 2)],
760                      E.Opn(E.Prod, [                      E.Opn(E.Prod, [
761                          E.Field(0, [E.C 1, E.V 1]),                          E.Field(0, [E.C 1, E.V 1]),
762                          E.Sum([(E.V 2, 0, 2)],                          E.Sum([(2, 0, 2)],
763                            E.Opn(E.Prod, [E.Epsilon(0, 1, 2), E.Field(0, [E.C 2, E.V 2])]))                            E.Opn(E.Prod, [E.Epsilon(0, 1, 2), E.Field(0, [E.C 2, E.V 2])]))
764                        ]))                        ]))
765                  ]))                  ]))
# Line 770  Line 774
774        fun tensorFn rator = E.EIN{        fun tensorFn rator = E.EIN{
775                params = [mkNoSubstTEN []],                params = [mkNoSubstTEN []],
776                index = [],                index = [],
777                body = E.Op1(rator, E.Field(0, []))                body = E.Op1(rator, E.Tensor(0, []))
778              }              }
779        fun liftFn rator dim = E.EIN{        fun liftFn rator dim = E.EIN{
780                params = [E.FLD dim],                params = [E.FLD dim],
# Line 778  Line 782
782                body = E.Op1(rator, E.Field(0, []))                body = E.Op1(rator, E.Field(0, []))
783              }              }
784      in      in
785      fun powF (dim, n) = E.EIN{      fun powFI (dim, n) = E.EIN{
786              params = [E.FLD dim],              params = [E.FLD dim],
787              index = [], body = E.Op1(E.PowInt n, E.Field(0, []))              index = [], body = E.Op1(E.PowInt n, E.Field(0, []))
788            }            }
# Line 806  Line 810
810            }            }
811
812      fun identity dim = E.EIN{      fun identity dim = E.EIN{
813              params = [], index = [dim, dim], body = E.Delta(E.V(0), E.V(1))              params = [], index = [dim, dim], body = E.Delta(0, 1)
814            }            }
815
816      fun zeros shape = E.EIN{      fun zeros shape = E.EIN{
# Line 859  Line 863
863      val curl2d = E.EIN{      val curl2d = E.EIN{
864              params = [E.FLD 2],              params = [E.FLD 2],
865              index = [],              index = [],
866              body = E.Sum([(E.V 0, 0, 1), (E.V 1, 0, 1)],              body = E.Sum([(0, 0, 1), (1, 0, 1)],
867                E.Opn(E.Prod, [                E.Opn(E.Prod, [
868                    E.Eps2(0, 1),                    E.Eps2(0, 1),
869                    E.Apply(E.Partial[E.V 0], E.Field(0, [E.V 1]))                    E.Apply(E.Partial[E.V 0], E.Field(0, [E.V 1]))
# Line 869  Line 873
873      val curl3d = E.EIN{      val curl3d = E.EIN{
874              params = [mkTEN [3]],              params = [mkTEN [3]],
875              index = [3],              index = [3],
876              body = E.Sum([(E.V 1, 0, 2), (E.V 2, 0, 2)],              body = E.Sum([(1, 0, 2), (2, 0, 2)],
877                E.Opn(E.Prod, [                E.Opn(E.Prod, [
878                    E.Epsilon(0, 1, 2),                    E.Epsilon(0, 1, 2),
879                    E.Apply(E.Partial[E.V 1], E.Field(0, [E.V 2]))                    E.Apply(E.Partial[E.V 1], E.Field(0, [E.V 2]))
# Line 905  Line 909
909    (*  <d F_i /d_i> *)    (*  <d F_i /d_i> *)
910      fun divergence (dim, alpha) = let      fun divergence (dim, alpha) = let
911            val expindex = specialize(alpha, 0)            val expindex = specialize(alpha, 0)
912            val sumI = length alpha            val sid = length alpha
913            val sumIndex = E.V sumI            val sumIndex = E.V sid
914            val sumIndexL = [sumIndex]            val sumIndexL = [sumIndex]
915            val S = expindex@sumIndexL            val S = expindex@sumIndexL
916            in            in
917              E.EIN{              E.EIN{
918                  params = [E.FLD dim],                  params = [E.FLD dim],
919                  index = alpha,                  index = alpha,
920                  body = E.Sum([(sumIndex, 0, dim-1)], E.Apply(E.Partial sumIndexL, E.Field(0, S)))                  body = E.Sum([(sid, 0, dim-1)], E.Apply(E.Partial sumIndexL, E.Field(0, S)))
921                }                }
922            end            end
923

Legend:
 Removed from v.3716 changed lines Added in v.3978

 root@smlnj-gforge.cs.uchicago.edu ViewVC Help Powered by ViewVC 1.0.0