Modeling Physical Systems
               with Modern Object Oriented Perl
                      YAPC::NA 2012

                              Joel Berger

                      University of Illinois at Chicago


                            June 15, 2012




Joel Berger (UIC)            OO Physical Modeling         June 15, 2012   1 / 15
The Problems


Physical Simulations


Differential Equations
A set of rules that define how variables change with some parameter
                                                      dx
                          x(t2 ) = x(t1 ) + dt ∗
                                                      dt




Example: Exponential Growth
                         dM
                             = rM        =⇒          M (t) = P exp(rt)
                          dt



     Joel Berger (UIC)                  OO Physical Modeling             June 15, 2012   2 / 15
The Problems


Physical Simulations


Differential Equations
A set of rules that define how variables change with some parameter
                                                      dx
                          x(t2 ) = x(t1 ) + dt ∗         (x, f (t1, t2))
                                                      dt




Example: Exponential Growth
                         dM
                             = rM        =⇒          M (t) = P exp(rt)
                          dt



     Joel Berger (UIC)                  OO Physical Modeling               June 15, 2012   2 / 15
The Problems


Physical Simulations


Differential Equations
A set of rules that define how variables change with some parameter
                                                      dx
                          x(t2 ) = x(t1 ) + dt ∗         (x, f (t1, t2))
                                                      dt




Example: Exponential Growth
                         dM
                             = rM        =⇒          M (t) = P exp(rt)
                          dt



     Joel Berger (UIC)                  OO Physical Modeling               June 15, 2012   2 / 15
The Problems


My Research: Ultrafast Electron Microscopy




    Joel Berger (UIC)       OO Physical Modeling   June 15, 2012   3 / 15
The Problems


My Research: Ultrafast Electron Microscopy




                        Photocathode       Magnetic Lenses    Detector




    Joel Berger (UIC)               OO Physical Modeling     June 15, 2012   3 / 15
The Problems


My Research: Ultrafast Electron Microscopy




        Laser
                        Photocathode       Magnetic Lenses    Detector




    Joel Berger (UIC)               OO Physical Modeling     June 15, 2012   3 / 15
The Problems


My Research: Ultrafast Electron Microscopy




                                                           Electron Beam




        Laser
                        Photocathode       Magnetic Lenses            Detector




    Joel Berger (UIC)               OO Physical Modeling             June 15, 2012   3 / 15
The Problems


My Research: Ultrafast Electron Microscopy




                                               RF Cavity
                                                           Electron Beam




        Laser
                        Photocathode       Magnetic Lenses            Detector




    Joel Berger (UIC)               OO Physical Modeling             June 15, 2012   3 / 15
The Problems


The Challenge: A Flexible Interface to a Complex Model

                   Magnetic Lens          Magnetic Lens
Electron Pulse
             v = vˆ
                  z
  w


         l                    RF Cavity
                               “z lens”
      Need: Compute dynamics of electron pulse (w(t), l(t))
      Note: Generation and optical elements add terms to DE
      Want: Representitive OO user-level interface



      Joel Berger (UIC)            OO Physical Modeling       June 15, 2012   4 / 15
The Problems


The Challenge: A Flexible Interface to a Complex Model

                   Magnetic Lens          Magnetic Lens
Electron Pulse
             v = vˆ
                  z
  w


         l                    RF Cavity
                               “z lens”
      Need: Compute dynamics of electron pulse (w(t), l(t))
      Note: Generation and optical elements add terms to DE
      Want: Representitive OO user-level interface



      Joel Berger (UIC)            OO Physical Modeling       June 15, 2012   4 / 15
The Problems


The Challenge: A Flexible Interface to a Complex Model

                   Magnetic Lens          Magnetic Lens
Electron Pulse
             v = vˆ
                  z
  w


         l                    RF Cavity
                               “z lens”
      Need: Compute dynamics of electron pulse (w(t), l(t))
      Note: Generation and optical elements add terms to DE
      Want: Representitive OO user-level interface



      Joel Berger (UIC)            OO Physical Modeling       June 15, 2012   4 / 15
The Problems


The Challenge: A Flexible Interface to a Complex Model

                   Magnetic Lens          Magnetic Lens
Electron Pulse
             v = vˆ
                  z
  w


         l                    RF Cavity
                               “z lens”
      Need: Compute dynamics of electron pulse (w(t), l(t))
      Note: Generation and optical elements add terms to DE
      Want: Representitive OO user-level interface



      Joel Berger (UIC)            OO Physical Modeling       June 15, 2012   4 / 15
The Problems


The “State of the Art”

Old codes are
    lacking full 6D dynamics
    optimized for performance vs usablilty
    hard to customize
    near impossible to comprehend

http://laacg.lanl.gov/laacg/services/download_sf.phtml
Getting Started with Poisson Superfish
. . . We do not recommend trying to build an input file “from scratch.”
Instead, find an example file that is similar to the problem you are trying
to solve. Make a copy of the file and then make any necessary
modifications to the geometry and options.


     Joel Berger (UIC)          OO Physical Modeling         June 15, 2012   5 / 15
The Problems


The “State of the Art”

Old codes are
    lacking full 6D dynamics
    optimized for performance vs usablilty
    hard to customize
    near impossible to comprehend

http://laacg.lanl.gov/laacg/services/download_sf.phtml
Getting Started with Poisson Superfish
. . . We do not recommend trying to build an input file “from scratch.”
Instead, find an example file that is similar to the problem you are trying
to solve. Make a copy of the file and then make any necessary
modifications to the geometry and options.


     Joel Berger (UIC)          OO Physical Modeling         June 15, 2012   5 / 15
The Problems


Other Attempts
                                           Modelica:
                                           Pros:
Mathematica:
                                                  Open-source, but behind
Pros:
                                                  close-source variants
    Can solve dynamics
                                                  Unique OO language for
    Pretty-printing of math for                   physical simulation
    readability
                                                  Classes have DEs as properties
Cons:
                                           Cons:
    Closed-source and expensive!
                                                  Lacks “has-a” relationship
    No OO and no key-value
                                                  Composing DEs not trivial
    datatypes
                                                  User-facing object instantiation
    Still rather slow ∼2mins/sim
                                                  not trivial
                                                  Some numerical problems (?)

        Joel Berger (UIC)       OO Physical Modeling                June 15, 2012   6 / 15
The Problems


Other Attempts
                                           Modelica:
                                           Pros:
Mathematica:
                                                  Open-source, but behind
Pros:
                                                  close-source variants
    Can solve dynamics
                                                  Unique OO language for
    Pretty-printing of math for                   physical simulation
    readability
                                                  Classes have DEs as properties
Cons:
                                           Cons:
    Closed-source and expensive!
                                                  Lacks “has-a” relationship
    No OO and no key-value
                                                  Composing DEs not trivial
    datatypes
                                                  User-facing object instantiation
    Still rather slow ∼2mins/sim
                                                  not trivial
                                                  Some numerical problems (?)

        Joel Berger (UIC)       OO Physical Modeling                June 15, 2012   6 / 15
The Problems


Other Attempts
                                           Modelica:
                                           Pros:
Mathematica:
                                                  Open-source, but behind
Pros:
                                                  close-source variants
    Can solve dynamics
                                                  Unique OO language for
    Pretty-printing of math for                   physical simulation
    readability
                                                  Classes have DEs as properties
Cons:
                                           Cons:
    Closed-source and expensive!
                                                  Lacks “has-a” relationship
    No OO and no key-value
                                                  Composing DEs not trivial
    datatypes
                                                  User-facing object instantiation
    Still rather slow ∼2mins/sim
                                                  not trivial
                                                  Some numerical problems (?)

        Joel Berger (UIC)       OO Physical Modeling                June 15, 2012   6 / 15
The Problems


Other Attempts
                                           Modelica:
                                           Pros:
Mathematica:
                                                  Open-source, but behind
Pros:
                                                  close-source variants
    Can solve dynamics
                                                  Unique OO language for
    Pretty-printing of math for                   physical simulation
    readability
                                                  Classes have DEs as properties
Cons:
                                           Cons:
    Closed-source and expensive!
                                                  Lacks “has-a” relationship
    No OO and no key-value
                                                  Composing DEs not trivial
    datatypes
                                                  User-facing object instantiation
    Still rather slow ∼2mins/sim
                                                  not trivial
                                                  Some numerical problems (?)

        Joel Berger (UIC)       OO Physical Modeling                June 15, 2012   6 / 15
The Problems


Other Attempts
                                           Modelica:
                                           Pros:
Mathematica:
                                                  Open-source, but behind
Pros:
                                                  close-source variants
    Can solve dynamics
                                                  Unique OO language for
    Pretty-printing of math for                   physical simulation
    readability
                                                  Classes have DEs as properties
Cons:
                                           Cons:
    Closed-source and expensive!
                                                  Lacks “has-a” relationship
    No OO and no key-value
                                                  Composing DEs not trivial
    datatypes
                                                  User-facing object instantiation
    Still rather slow ∼2mins/sim
                                                  not trivial
                                                  Some numerical problems (?)

        Joel Berger (UIC)       OO Physical Modeling                June 15, 2012   6 / 15
Perl Solution


. . . But First, Some Bookkeeping

If an object knows where it is, can it remember where it came from?
use MooseX::Declare;
use Method::Signatures::Modifiers;
use MooseX::RememberHistory;

class MyClass {                                     use objects as data storage
  has ’x’ => (
    traits => [’RememberHistory’],
                                                         current data during
    isa => ’Num’, is => ’rw’,                            simulation
    default => 0                                         all data afterwards
  );
}                                                   works for fixed width solvers
my $obj = MyClass->new;
                                                    adaptive solvers call functions
$obj->x( 1 );                                       repeatedly (i.e. PerlGSL::DiffEq)
$obj->x( 2 );

print join ’, ’, @{ $obj->x_history };
# 0, 1, 2


      Joel Berger (UIC)           OO Physical Modeling                June 15, 2012   7 / 15
Perl Solution


. . . But First, Some Bookkeeping

If an object knows where it is, can it remember where it came from?
use MooseX::Declare;
use Method::Signatures::Modifiers;
use MooseX::RememberHistory;

class MyClass {                                     use objects as data storage
  has ’x’ => (
    traits => [’RememberHistory’],
                                                         current data during
    isa => ’Num’, is => ’rw’,                            simulation
    default => 0                                         all data afterwards
  );
}                                                   works for fixed width solvers
my $obj = MyClass->new;
                                                    adaptive solvers call functions
$obj->x( 1 );                                       repeatedly (i.e. PerlGSL::DiffEq)
$obj->x( 2 );

print join ’, ’, @{ $obj->x_history };
# 0, 1, 2


      Joel Berger (UIC)           OO Physical Modeling                June 15, 2012   7 / 15
Perl Solution


. . . But First, Some Bookkeeping

If an object knows where it is, can it remember where it came from?
use MooseX::Declare;
use Method::Signatures::Modifiers;
use MooseX::RememberHistory;

class MyClass {                                     use objects as data storage
  has ’x’ => (
    traits => [’RememberHistory’],
                                                         current data during
    isa => ’Num’, is => ’rw’,                            simulation
    default => 0                                         all data afterwards
  );
}                                                   works for fixed width solvers
my $obj = MyClass->new;
                                                    adaptive solvers call functions
$obj->x( 1 );                                       repeatedly (i.e. PerlGSL::DiffEq)
$obj->x( 2 );

print join ’, ’, @{ $obj->x_history };
# 0, 1, 2


      Joel Berger (UIC)           OO Physical Modeling                June 15, 2012   7 / 15
Perl Solution


. . . But First, Some Bookkeeping

If an object knows where it is, can it remember where it came from?
use MooseX::Declare;
use Method::Signatures::Modifiers;
use MooseX::RememberHistory;

class MyClass {                                     use objects as data storage
  has ’x’ => (
    traits => [’RememberHistory’],
                                                         current data during
    isa => ’Num’, is => ’rw’,                            simulation
    default => 0                                         all data afterwards
  );
}                                                   works for fixed width solvers
my $obj = MyClass->new;
                                                    adaptive solvers call functions
$obj->x( 1 );                                       repeatedly (i.e. PerlGSL::DiffEq)
$obj->x( 2 );

print join ’, ’, @{ $obj->x_history };
# 0, 1, 2


      Joel Berger (UIC)           OO Physical Modeling                June 15, 2012   7 / 15
Perl Solution


. . . But First, Some Bookkeeping

If an object knows where it is, can it remember where it came from?
use MooseX::Declare;
use Method::Signatures::Modifiers;
use MooseX::RememberHistory;

class MyClass {                                     use objects as data storage
  has ’x’ => (
    traits => [’RememberHistory’],
                                                         current data during
    isa => ’Num’, is => ’rw’,                            simulation
    default => 0                                         all data afterwards
  );
}                                                   works for fixed width solvers
my $obj = MyClass->new;
                                                    adaptive solvers call functions
$obj->x( 1 );                                       repeatedly (i.e. PerlGSL::DiffEq)
$obj->x( 2 );

print join ’, ’, @{ $obj->x_history };
# 0, 1, 2


      Joel Berger (UIC)           OO Physical Modeling                June 15, 2012   7 / 15
Perl Solution


. . . But First, Some Bookkeeping

If an object knows where it is, can it remember where it came from?
use MooseX::Declare;
use Method::Signatures::Modifiers;
use MooseX::RememberHistory;

class MyClass {                                     use objects as data storage
  has ’x’ => (
    traits => [’RememberHistory’],
                                                         current data during
    isa => ’Num’, is => ’rw’,                            simulation
    default => 0                                         all data afterwards
  );
}                                                   works for fixed width solvers
my $obj = MyClass->new;
                                                    adaptive solvers call functions
$obj->x( 1 );                                       repeatedly (i.e. PerlGSL::DiffEq)
$obj->x( 2 );

print join ’, ’, @{ $obj->x_history };
# 0, 1, 2


      Joel Berger (UIC)           OO Physical Modeling                June 15, 2012   7 / 15
Perl Solution   A Simple OO-DE Example


Physical Classes


use MooseX::RememberHistory;
use MooseX::Declare;
use Method::Signatures::Modifiers;

class MyForce {
  has ’strength’ => ( isa => ’Num’, is => ’rw’, default => 0 );
  has ’affect’   => ( isa => ’CodeRef’, is => ’ro’, required => 1 );
}

class MyThing {
  has ’mass’ => ( isa => ’Num’, is => ’ro’, required => 1 );
  has ’x’    => ( traits => [ ’RememberHistory’ ], isa => ’Num’,
                  is => ’rw’, default => 0 );
  has ’vx’   => ( traits => [ ’RememberHistory’ ], isa => ’Num’,
                  is => ’rw’, default => 0 );
}




     Joel Berger (UIC)           OO Physical Modeling                  June 15, 2012   8 / 15
Perl Solution   A Simple OO-DE Example


The Solver: Attributes

class MySim {
  use List::Util ’sum’;

 has ’start’      => ( isa => ’Num’, is => ’ro’, default => 0 );
 has ’end’        => ( isa => ’Num’, is => ’ro’, default => 1 );
 has ’steps’      => ( isa => ’Num’, is => ’ro’, default => 100 );

 has ’step’       => ( isa => ’Num’, is => ’ro’, lazy => 1, builder => ’init_step’);
 has ’time’       => ( traits => [ ’RememberHistory’ ], isa => ’Num’, is => ’rw’,
                       lazy => 1, builder => ’init_time’ );

 has ’things’ => ( isa => ’ArrayRef[MyThing]’, is => ’rw’, default => sub{[]} );
 has ’forces’ => ( isa => ’ArrayRef[MyForce]’, is => ’rw’, default => sub{[]} );

 method init_step () {
   my $step = ($self->end - $self->start) / $self->steps;
   return $step;
 }

 method init_time () { return $self->start }


     Joel Berger (UIC)              OO Physical Modeling                  June 15, 2012   9 / 15
Perl Solution   A Simple OO-DE Example


The Solver: Methods

 method evolve ( MyThing $thing ) {
   my $dt = $self->step;
   my $vx = $thing->vx;

     my $force = sum map { $_->affect->($_, $thing) } @{ $self->forces };
     my $acc = $force / ($thing->mass);

     $thing->vx( $vx + $acc * $dt );
     $thing->x( $thing->x + $vx * $dt );
 }

  method run () {
    while ($self->time < $self->end) {
      $self->evolve( $_ ) for @{ $self->things };
      $self->time( $self->time + $self->step );
    }
  }
} # end of class MySim



      Joel Berger (UIC)           OO Physical Modeling                  June 15, 2012   10 / 15
Perl Solution   A Simple OO-DE Example


The Script

#!/usr/bin/env perl                            my $sim = MySim->new(
use strict; use warnings;                        end => 5,
use MySim;                                       things => [ $thing ],
use PDL;                                         forces => [ $acc, $dec ],
use PDL::Graphics::Prima::Simple;              );

my $thing = MyThing->new( mass => 2 );         $sim->run;

my $acc = MyForce->new(                        my $time = pdl $sim->time_history;
  strength => 2,                               my $x    = pdl $thing->x_history;
  affect => sub {shift->strength},
);                                             line_plot($time, $x);

my $dec = MyForce->new(
  strength => -30,
  affect => sub {
    my ($self, $thing) = @_;
    return 0 if ($thing->x < 0.1);
    return $self->strength;
  },
);

      Joel Berger (UIC)             OO Physical Modeling                June 15, 2012   11 / 15
Perl Solution   A Simple OO-DE Example


The Script

#!/usr/bin/env perl                            my $sim = MySim->new(
use strict; use warnings;                        end => 5,
use MySim;                                       things => [ $thing ],
use PDL;                                         forces => [ $acc, $dec ],
use PDL::Graphics::Prima::Simple;              );

my $thing = MyThing->new( mass => 2 );         $sim->run;

my $acc = MyForce->new(                        my $time = pdl $sim->time_history;
  strength => 2,                               my $x    = pdl $thing->x_history;
  affect => sub {shift->strength},
);                                             line_plot($time, $x);

my $dec = MyForce->new(
  strength => -30,
  affect => sub {
    my ($self, $thing) = @_;
    return 0 if ($thing->x < 0.1);
    return $self->strength;
  },
);

      Joel Berger (UIC)             OO Physical Modeling                June 15, 2012   11 / 15
Units Handling


Unit Handling (The Implied Covenant)


Mars Surveyor ’98 Orbiter
    Software used force in Newtons
    Users entered force in Foot-Pounds


The Covenant:
    Between programmer and user
    “Use the same units!”
    Unexpected and possibly undocumented action at a distance
    With Perl and Moose we can do better . . .



    Joel Berger (UIC)            OO Physical Modeling   June 15, 2012   12 / 15
Units Handling


Unit Handling (The Implied Covenant)


Mars Surveyor ’98 Orbiter (Sorry Larry!)
    Software used force in Newtons
    Users entered force in Foot-Pounds


The Covenant:
    Between programmer and user
    “Use the same units!”
    Unexpected and possibly undocumented action at a distance
    With Perl and Moose we can do better . . .



     Joel Berger (UIC)           OO Physical Modeling   June 15, 2012   12 / 15
Units Handling


Unit Handling (The Implied Covenant)


Mars Surveyor ’98 Orbiter (Sorry Larry!)
    Software used force in Newtons
    Users entered force in Foot-Pounds


The Covenant:
    Between programmer and user
    “Use the same units!”
    Unexpected and possibly undocumented action at a distance
    With Perl and Moose we can do better . . .



     Joel Berger (UIC)           OO Physical Modeling   June 15, 2012   12 / 15
Units Handling


Unit Handling (The Implied Covenant)


Mars Surveyor ’98 Orbiter (Sorry Larry!)
    Software used force in Newtons
    Users entered force in Foot-Pounds


The Covenant:
    Between programmer and user
    “Use the same units!”
    Unexpected and possibly undocumented action at a distance
    With Perl and Moose we can do better . . .



     Joel Berger (UIC)           OO Physical Modeling   June 15, 2012   12 / 15
Units Handling


Unit Handling (The Implied Covenant)


Mars Surveyor ’98 Orbiter (Sorry Larry!)
    Software used force in Newtons
    Users entered force in Foot-Pounds


The Covenant:
    Between programmer and user
    “Use the same units!”
    Unexpected and possibly undocumented action at a distance
    With Perl and Moose we can do better . . .



     Joel Berger (UIC)           OO Physical Modeling   June 15, 2012   12 / 15
Units Handling


Unit Handling (The Implied Covenant)


Mars Surveyor ’98 Orbiter (Sorry Larry!)
    Software used force in Newtons
    Users entered force in Foot-Pounds


The Covenant:
    Between programmer and user
    “Use the same units!”
    Unexpected and possibly undocumented action at a distance
    With Perl and Moose we can do better . . .



     Joel Berger (UIC)           OO Physical Modeling   June 15, 2012   12 / 15
Units Handling


MooseX::Types::NumUnit

        Str   to   Num   coercions
        convert unit if needed

use MooseX::Declare;
use Method::Signatures::Modifiers;

class   SphericalCow {
  use   MooseX::Types::NumUnit qw/num_of_unit/;
  has   ’radius’   => ( isa => num_of_unit(’m’),   is => ’rw’, default => 1 );
  has   ’velocity’ => ( isa => num_of_unit(’m/s’), is => ’rw’, default => 0 );
}

use strict; use warnings;

my $cow = SphericalCow->new(
  radius => ’1 ft’,
);

print $cow->radius . "n"; # 0.3048


        Joel Berger (UIC)                 OO Physical Modeling    June 15, 2012   13 / 15
Real World Example


Example of Physics::UEMColumn

Back to Electron Column Modeling
             Magnetic Lens       Magnetic Lens
Electron Pulse
              v = vˆ
                   z
  w


         l                      RF Cavity
                                 “z lens”
      As yet unreleased     Physics::UEMColumn
             https://github.com/jberger/Physics-UEMColumn
      Uses:   PerlGSL::DiffEq   on CPAN
             C-level solver of Perl-level DE closures


      Joel Berger (UIC)               OO Physical Modeling   June 15, 2012   14 / 15
Finally


Acknowledgements




   Graduate College Dean’s Fellowship (Major Student Funding)
   LAS Ph.D. Travel Award (Conference Funding)




   Department of Energy #DE-FG52-09NA29451
   (UEM Research Grant)
https://github.com/jberger/YAPCNA2012

    Joel Berger (UIC)      OO Physical Modeling        June 15, 2012   15 / 15

Modeling Physical Systems with Modern Object Oriented Perl

  • 1.
    Modeling Physical Systems with Modern Object Oriented Perl YAPC::NA 2012 Joel Berger University of Illinois at Chicago June 15, 2012 Joel Berger (UIC) OO Physical Modeling June 15, 2012 1 / 15
  • 2.
    The Problems Physical Simulations DifferentialEquations A set of rules that define how variables change with some parameter dx x(t2 ) = x(t1 ) + dt ∗ dt Example: Exponential Growth dM = rM =⇒ M (t) = P exp(rt) dt Joel Berger (UIC) OO Physical Modeling June 15, 2012 2 / 15
  • 3.
    The Problems Physical Simulations DifferentialEquations A set of rules that define how variables change with some parameter dx x(t2 ) = x(t1 ) + dt ∗ (x, f (t1, t2)) dt Example: Exponential Growth dM = rM =⇒ M (t) = P exp(rt) dt Joel Berger (UIC) OO Physical Modeling June 15, 2012 2 / 15
  • 4.
    The Problems Physical Simulations DifferentialEquations A set of rules that define how variables change with some parameter dx x(t2 ) = x(t1 ) + dt ∗ (x, f (t1, t2)) dt Example: Exponential Growth dM = rM =⇒ M (t) = P exp(rt) dt Joel Berger (UIC) OO Physical Modeling June 15, 2012 2 / 15
  • 5.
    The Problems My Research:Ultrafast Electron Microscopy Joel Berger (UIC) OO Physical Modeling June 15, 2012 3 / 15
  • 6.
    The Problems My Research:Ultrafast Electron Microscopy Photocathode Magnetic Lenses Detector Joel Berger (UIC) OO Physical Modeling June 15, 2012 3 / 15
  • 7.
    The Problems My Research:Ultrafast Electron Microscopy Laser Photocathode Magnetic Lenses Detector Joel Berger (UIC) OO Physical Modeling June 15, 2012 3 / 15
  • 8.
    The Problems My Research:Ultrafast Electron Microscopy Electron Beam Laser Photocathode Magnetic Lenses Detector Joel Berger (UIC) OO Physical Modeling June 15, 2012 3 / 15
  • 9.
    The Problems My Research:Ultrafast Electron Microscopy RF Cavity Electron Beam Laser Photocathode Magnetic Lenses Detector Joel Berger (UIC) OO Physical Modeling June 15, 2012 3 / 15
  • 10.
    The Problems The Challenge:A Flexible Interface to a Complex Model Magnetic Lens Magnetic Lens Electron Pulse v = vˆ z w l RF Cavity “z lens” Need: Compute dynamics of electron pulse (w(t), l(t)) Note: Generation and optical elements add terms to DE Want: Representitive OO user-level interface Joel Berger (UIC) OO Physical Modeling June 15, 2012 4 / 15
  • 11.
    The Problems The Challenge:A Flexible Interface to a Complex Model Magnetic Lens Magnetic Lens Electron Pulse v = vˆ z w l RF Cavity “z lens” Need: Compute dynamics of electron pulse (w(t), l(t)) Note: Generation and optical elements add terms to DE Want: Representitive OO user-level interface Joel Berger (UIC) OO Physical Modeling June 15, 2012 4 / 15
  • 12.
    The Problems The Challenge:A Flexible Interface to a Complex Model Magnetic Lens Magnetic Lens Electron Pulse v = vˆ z w l RF Cavity “z lens” Need: Compute dynamics of electron pulse (w(t), l(t)) Note: Generation and optical elements add terms to DE Want: Representitive OO user-level interface Joel Berger (UIC) OO Physical Modeling June 15, 2012 4 / 15
  • 13.
    The Problems The Challenge:A Flexible Interface to a Complex Model Magnetic Lens Magnetic Lens Electron Pulse v = vˆ z w l RF Cavity “z lens” Need: Compute dynamics of electron pulse (w(t), l(t)) Note: Generation and optical elements add terms to DE Want: Representitive OO user-level interface Joel Berger (UIC) OO Physical Modeling June 15, 2012 4 / 15
  • 14.
    The Problems The “Stateof the Art” Old codes are lacking full 6D dynamics optimized for performance vs usablilty hard to customize near impossible to comprehend http://laacg.lanl.gov/laacg/services/download_sf.phtml Getting Started with Poisson Superfish . . . We do not recommend trying to build an input file “from scratch.” Instead, find an example file that is similar to the problem you are trying to solve. Make a copy of the file and then make any necessary modifications to the geometry and options. Joel Berger (UIC) OO Physical Modeling June 15, 2012 5 / 15
  • 15.
    The Problems The “Stateof the Art” Old codes are lacking full 6D dynamics optimized for performance vs usablilty hard to customize near impossible to comprehend http://laacg.lanl.gov/laacg/services/download_sf.phtml Getting Started with Poisson Superfish . . . We do not recommend trying to build an input file “from scratch.” Instead, find an example file that is similar to the problem you are trying to solve. Make a copy of the file and then make any necessary modifications to the geometry and options. Joel Berger (UIC) OO Physical Modeling June 15, 2012 5 / 15
  • 16.
    The Problems Other Attempts Modelica: Pros: Mathematica: Open-source, but behind Pros: close-source variants Can solve dynamics Unique OO language for Pretty-printing of math for physical simulation readability Classes have DEs as properties Cons: Cons: Closed-source and expensive! Lacks “has-a” relationship No OO and no key-value Composing DEs not trivial datatypes User-facing object instantiation Still rather slow ∼2mins/sim not trivial Some numerical problems (?) Joel Berger (UIC) OO Physical Modeling June 15, 2012 6 / 15
  • 17.
    The Problems Other Attempts Modelica: Pros: Mathematica: Open-source, but behind Pros: close-source variants Can solve dynamics Unique OO language for Pretty-printing of math for physical simulation readability Classes have DEs as properties Cons: Cons: Closed-source and expensive! Lacks “has-a” relationship No OO and no key-value Composing DEs not trivial datatypes User-facing object instantiation Still rather slow ∼2mins/sim not trivial Some numerical problems (?) Joel Berger (UIC) OO Physical Modeling June 15, 2012 6 / 15
  • 18.
    The Problems Other Attempts Modelica: Pros: Mathematica: Open-source, but behind Pros: close-source variants Can solve dynamics Unique OO language for Pretty-printing of math for physical simulation readability Classes have DEs as properties Cons: Cons: Closed-source and expensive! Lacks “has-a” relationship No OO and no key-value Composing DEs not trivial datatypes User-facing object instantiation Still rather slow ∼2mins/sim not trivial Some numerical problems (?) Joel Berger (UIC) OO Physical Modeling June 15, 2012 6 / 15
  • 19.
    The Problems Other Attempts Modelica: Pros: Mathematica: Open-source, but behind Pros: close-source variants Can solve dynamics Unique OO language for Pretty-printing of math for physical simulation readability Classes have DEs as properties Cons: Cons: Closed-source and expensive! Lacks “has-a” relationship No OO and no key-value Composing DEs not trivial datatypes User-facing object instantiation Still rather slow ∼2mins/sim not trivial Some numerical problems (?) Joel Berger (UIC) OO Physical Modeling June 15, 2012 6 / 15
  • 20.
    The Problems Other Attempts Modelica: Pros: Mathematica: Open-source, but behind Pros: close-source variants Can solve dynamics Unique OO language for Pretty-printing of math for physical simulation readability Classes have DEs as properties Cons: Cons: Closed-source and expensive! Lacks “has-a” relationship No OO and no key-value Composing DEs not trivial datatypes User-facing object instantiation Still rather slow ∼2mins/sim not trivial Some numerical problems (?) Joel Berger (UIC) OO Physical Modeling June 15, 2012 6 / 15
  • 21.
    Perl Solution . .. But First, Some Bookkeeping If an object knows where it is, can it remember where it came from? use MooseX::Declare; use Method::Signatures::Modifiers; use MooseX::RememberHistory; class MyClass { use objects as data storage has ’x’ => ( traits => [’RememberHistory’], current data during isa => ’Num’, is => ’rw’, simulation default => 0 all data afterwards ); } works for fixed width solvers my $obj = MyClass->new; adaptive solvers call functions $obj->x( 1 ); repeatedly (i.e. PerlGSL::DiffEq) $obj->x( 2 ); print join ’, ’, @{ $obj->x_history }; # 0, 1, 2 Joel Berger (UIC) OO Physical Modeling June 15, 2012 7 / 15
  • 22.
    Perl Solution . .. But First, Some Bookkeeping If an object knows where it is, can it remember where it came from? use MooseX::Declare; use Method::Signatures::Modifiers; use MooseX::RememberHistory; class MyClass { use objects as data storage has ’x’ => ( traits => [’RememberHistory’], current data during isa => ’Num’, is => ’rw’, simulation default => 0 all data afterwards ); } works for fixed width solvers my $obj = MyClass->new; adaptive solvers call functions $obj->x( 1 ); repeatedly (i.e. PerlGSL::DiffEq) $obj->x( 2 ); print join ’, ’, @{ $obj->x_history }; # 0, 1, 2 Joel Berger (UIC) OO Physical Modeling June 15, 2012 7 / 15
  • 23.
    Perl Solution . .. But First, Some Bookkeeping If an object knows where it is, can it remember where it came from? use MooseX::Declare; use Method::Signatures::Modifiers; use MooseX::RememberHistory; class MyClass { use objects as data storage has ’x’ => ( traits => [’RememberHistory’], current data during isa => ’Num’, is => ’rw’, simulation default => 0 all data afterwards ); } works for fixed width solvers my $obj = MyClass->new; adaptive solvers call functions $obj->x( 1 ); repeatedly (i.e. PerlGSL::DiffEq) $obj->x( 2 ); print join ’, ’, @{ $obj->x_history }; # 0, 1, 2 Joel Berger (UIC) OO Physical Modeling June 15, 2012 7 / 15
  • 24.
    Perl Solution . .. But First, Some Bookkeeping If an object knows where it is, can it remember where it came from? use MooseX::Declare; use Method::Signatures::Modifiers; use MooseX::RememberHistory; class MyClass { use objects as data storage has ’x’ => ( traits => [’RememberHistory’], current data during isa => ’Num’, is => ’rw’, simulation default => 0 all data afterwards ); } works for fixed width solvers my $obj = MyClass->new; adaptive solvers call functions $obj->x( 1 ); repeatedly (i.e. PerlGSL::DiffEq) $obj->x( 2 ); print join ’, ’, @{ $obj->x_history }; # 0, 1, 2 Joel Berger (UIC) OO Physical Modeling June 15, 2012 7 / 15
  • 25.
    Perl Solution . .. But First, Some Bookkeeping If an object knows where it is, can it remember where it came from? use MooseX::Declare; use Method::Signatures::Modifiers; use MooseX::RememberHistory; class MyClass { use objects as data storage has ’x’ => ( traits => [’RememberHistory’], current data during isa => ’Num’, is => ’rw’, simulation default => 0 all data afterwards ); } works for fixed width solvers my $obj = MyClass->new; adaptive solvers call functions $obj->x( 1 ); repeatedly (i.e. PerlGSL::DiffEq) $obj->x( 2 ); print join ’, ’, @{ $obj->x_history }; # 0, 1, 2 Joel Berger (UIC) OO Physical Modeling June 15, 2012 7 / 15
  • 26.
    Perl Solution . .. But First, Some Bookkeeping If an object knows where it is, can it remember where it came from? use MooseX::Declare; use Method::Signatures::Modifiers; use MooseX::RememberHistory; class MyClass { use objects as data storage has ’x’ => ( traits => [’RememberHistory’], current data during isa => ’Num’, is => ’rw’, simulation default => 0 all data afterwards ); } works for fixed width solvers my $obj = MyClass->new; adaptive solvers call functions $obj->x( 1 ); repeatedly (i.e. PerlGSL::DiffEq) $obj->x( 2 ); print join ’, ’, @{ $obj->x_history }; # 0, 1, 2 Joel Berger (UIC) OO Physical Modeling June 15, 2012 7 / 15
  • 27.
    Perl Solution A Simple OO-DE Example Physical Classes use MooseX::RememberHistory; use MooseX::Declare; use Method::Signatures::Modifiers; class MyForce { has ’strength’ => ( isa => ’Num’, is => ’rw’, default => 0 ); has ’affect’ => ( isa => ’CodeRef’, is => ’ro’, required => 1 ); } class MyThing { has ’mass’ => ( isa => ’Num’, is => ’ro’, required => 1 ); has ’x’ => ( traits => [ ’RememberHistory’ ], isa => ’Num’, is => ’rw’, default => 0 ); has ’vx’ => ( traits => [ ’RememberHistory’ ], isa => ’Num’, is => ’rw’, default => 0 ); } Joel Berger (UIC) OO Physical Modeling June 15, 2012 8 / 15
  • 28.
    Perl Solution A Simple OO-DE Example The Solver: Attributes class MySim { use List::Util ’sum’; has ’start’ => ( isa => ’Num’, is => ’ro’, default => 0 ); has ’end’ => ( isa => ’Num’, is => ’ro’, default => 1 ); has ’steps’ => ( isa => ’Num’, is => ’ro’, default => 100 ); has ’step’ => ( isa => ’Num’, is => ’ro’, lazy => 1, builder => ’init_step’); has ’time’ => ( traits => [ ’RememberHistory’ ], isa => ’Num’, is => ’rw’, lazy => 1, builder => ’init_time’ ); has ’things’ => ( isa => ’ArrayRef[MyThing]’, is => ’rw’, default => sub{[]} ); has ’forces’ => ( isa => ’ArrayRef[MyForce]’, is => ’rw’, default => sub{[]} ); method init_step () { my $step = ($self->end - $self->start) / $self->steps; return $step; } method init_time () { return $self->start } Joel Berger (UIC) OO Physical Modeling June 15, 2012 9 / 15
  • 29.
    Perl Solution A Simple OO-DE Example The Solver: Methods method evolve ( MyThing $thing ) { my $dt = $self->step; my $vx = $thing->vx; my $force = sum map { $_->affect->($_, $thing) } @{ $self->forces }; my $acc = $force / ($thing->mass); $thing->vx( $vx + $acc * $dt ); $thing->x( $thing->x + $vx * $dt ); } method run () { while ($self->time < $self->end) { $self->evolve( $_ ) for @{ $self->things }; $self->time( $self->time + $self->step ); } } } # end of class MySim Joel Berger (UIC) OO Physical Modeling June 15, 2012 10 / 15
  • 30.
    Perl Solution A Simple OO-DE Example The Script #!/usr/bin/env perl my $sim = MySim->new( use strict; use warnings; end => 5, use MySim; things => [ $thing ], use PDL; forces => [ $acc, $dec ], use PDL::Graphics::Prima::Simple; ); my $thing = MyThing->new( mass => 2 ); $sim->run; my $acc = MyForce->new( my $time = pdl $sim->time_history; strength => 2, my $x = pdl $thing->x_history; affect => sub {shift->strength}, ); line_plot($time, $x); my $dec = MyForce->new( strength => -30, affect => sub { my ($self, $thing) = @_; return 0 if ($thing->x < 0.1); return $self->strength; }, ); Joel Berger (UIC) OO Physical Modeling June 15, 2012 11 / 15
  • 31.
    Perl Solution A Simple OO-DE Example The Script #!/usr/bin/env perl my $sim = MySim->new( use strict; use warnings; end => 5, use MySim; things => [ $thing ], use PDL; forces => [ $acc, $dec ], use PDL::Graphics::Prima::Simple; ); my $thing = MyThing->new( mass => 2 ); $sim->run; my $acc = MyForce->new( my $time = pdl $sim->time_history; strength => 2, my $x = pdl $thing->x_history; affect => sub {shift->strength}, ); line_plot($time, $x); my $dec = MyForce->new( strength => -30, affect => sub { my ($self, $thing) = @_; return 0 if ($thing->x < 0.1); return $self->strength; }, ); Joel Berger (UIC) OO Physical Modeling June 15, 2012 11 / 15
  • 32.
    Units Handling Unit Handling(The Implied Covenant) Mars Surveyor ’98 Orbiter Software used force in Newtons Users entered force in Foot-Pounds The Covenant: Between programmer and user “Use the same units!” Unexpected and possibly undocumented action at a distance With Perl and Moose we can do better . . . Joel Berger (UIC) OO Physical Modeling June 15, 2012 12 / 15
  • 33.
    Units Handling Unit Handling(The Implied Covenant) Mars Surveyor ’98 Orbiter (Sorry Larry!) Software used force in Newtons Users entered force in Foot-Pounds The Covenant: Between programmer and user “Use the same units!” Unexpected and possibly undocumented action at a distance With Perl and Moose we can do better . . . Joel Berger (UIC) OO Physical Modeling June 15, 2012 12 / 15
  • 34.
    Units Handling Unit Handling(The Implied Covenant) Mars Surveyor ’98 Orbiter (Sorry Larry!) Software used force in Newtons Users entered force in Foot-Pounds The Covenant: Between programmer and user “Use the same units!” Unexpected and possibly undocumented action at a distance With Perl and Moose we can do better . . . Joel Berger (UIC) OO Physical Modeling June 15, 2012 12 / 15
  • 35.
    Units Handling Unit Handling(The Implied Covenant) Mars Surveyor ’98 Orbiter (Sorry Larry!) Software used force in Newtons Users entered force in Foot-Pounds The Covenant: Between programmer and user “Use the same units!” Unexpected and possibly undocumented action at a distance With Perl and Moose we can do better . . . Joel Berger (UIC) OO Physical Modeling June 15, 2012 12 / 15
  • 36.
    Units Handling Unit Handling(The Implied Covenant) Mars Surveyor ’98 Orbiter (Sorry Larry!) Software used force in Newtons Users entered force in Foot-Pounds The Covenant: Between programmer and user “Use the same units!” Unexpected and possibly undocumented action at a distance With Perl and Moose we can do better . . . Joel Berger (UIC) OO Physical Modeling June 15, 2012 12 / 15
  • 37.
    Units Handling Unit Handling(The Implied Covenant) Mars Surveyor ’98 Orbiter (Sorry Larry!) Software used force in Newtons Users entered force in Foot-Pounds The Covenant: Between programmer and user “Use the same units!” Unexpected and possibly undocumented action at a distance With Perl and Moose we can do better . . . Joel Berger (UIC) OO Physical Modeling June 15, 2012 12 / 15
  • 38.
    Units Handling MooseX::Types::NumUnit Str to Num coercions convert unit if needed use MooseX::Declare; use Method::Signatures::Modifiers; class SphericalCow { use MooseX::Types::NumUnit qw/num_of_unit/; has ’radius’ => ( isa => num_of_unit(’m’), is => ’rw’, default => 1 ); has ’velocity’ => ( isa => num_of_unit(’m/s’), is => ’rw’, default => 0 ); } use strict; use warnings; my $cow = SphericalCow->new( radius => ’1 ft’, ); print $cow->radius . "n"; # 0.3048 Joel Berger (UIC) OO Physical Modeling June 15, 2012 13 / 15
  • 39.
    Real World Example Exampleof Physics::UEMColumn Back to Electron Column Modeling Magnetic Lens Magnetic Lens Electron Pulse v = vˆ z w l RF Cavity “z lens” As yet unreleased Physics::UEMColumn https://github.com/jberger/Physics-UEMColumn Uses: PerlGSL::DiffEq on CPAN C-level solver of Perl-level DE closures Joel Berger (UIC) OO Physical Modeling June 15, 2012 14 / 15
  • 40.
    Finally Acknowledgements Graduate College Dean’s Fellowship (Major Student Funding) LAS Ph.D. Travel Award (Conference Funding) Department of Energy #DE-FG52-09NA29451 (UEM Research Grant) https://github.com/jberger/YAPCNA2012 Joel Berger (UIC) OO Physical Modeling June 15, 2012 15 / 15