<rss xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" version="2.0">
  <channel>
    <title>MaplePrimes - Maplesoft Blog</title>
    <link>http://www.mapleprimes.com/maplesoftblog</link>
    <language>en-us</language>
    <copyright>2010 Maplesoft, A Division of Waterloo Maple Inc.</copyright>
    <generator>Maplesoft Document System</generator>
    <lastBuildDate>Thu, 02 Sep 2010 21:15:36 GMT</lastBuildDate>
    <pubDate>Thu, 02 Sep 2010 21:15:36 GMT</pubDate>
    <itunes:subtitle />
    <itunes:summary />
    <description>The latest posts on the Maplesoft Blog</description>
    <image>
      <url>http://www.mapleprimes.com/images/mapleprimeswhite.jpg</url>
      <title>MaplePrimes - Maplesoft Blog</title>
      <link>http://www.mapleprimes.com/maplesoftblog</link>
    </image>
    <item>
      <title>False Sharing</title>
      <link>http://www.mapleprimes.com/maplesoftblog/95842-False-Sharing?ref=Feed:MaplePrimes:Maplesoft Blog</link>
      <itunes:summary>&lt;p&gt;Consider the following C code:&lt;/p&gt;
&lt;pre&gt;#include &amp;lt;pthread.h&amp;gt;&lt;br&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br&gt;#include &amp;lt;stdint.h&amp;gt;&lt;br&gt;#include &amp;lt;stdlib.h&amp;gt;&lt;br&gt;#include &amp;lt;sys/time.h&amp;gt;&lt;br&gt;&lt;br&gt;#define NUM_THREADS 4&lt;br&gt;#define NUM_ITERATIONS (1L &amp;lt;&amp;lt; 32)&lt;br&gt;&lt;br&gt;long *data;&lt;br&gt;&lt;br&gt;void *thread_function( void *args )&lt;br&gt;{&lt;br&gt;   long i;&lt;br&gt;   long j = (long)args;&lt;br&gt;&lt;br&gt;   for ( i = 0; i &amp;lt; NUM_ITERATIONS; i++ )&lt;br&gt;   {&lt;br&gt;       data[j] = i;&lt;br&gt;   }&lt;br&gt;&lt;br&gt;   return NULL;&lt;br&gt;}&lt;br&gt;&lt;br&gt;int main( int argc, char **argv )&lt;br&gt;{&lt;br&gt;   long i, j;&lt;br&gt;   pthread_t ids[NUM_THREADS-1];&lt;br&gt;   struct timeval start, end;&lt;br&gt;   double d;&lt;br&gt;&lt;br&gt;   data = (long*)malloc( sizeof(long)*NUM_THREADS );&lt;br&gt;&lt;br&gt;   for ( j = 1; j &amp;lt;= NUM_THREADS; j++ )&lt;br&gt;   {&lt;br&gt;       for ( i = 0; i &amp;lt; NUM_THREADS; i++ )&lt;br&gt;       {&lt;br&gt;           data[i] = 0;&lt;br&gt;       }&lt;br&gt;&lt;br&gt;       gettimeofday( &amp;amp;start, NULL );&lt;br&gt;       for ( i = 0; i &amp;lt; j-1; i++ )&lt;br&gt;       {&lt;br&gt;           pthread_create( ids+i, NULL, thread_function, (void*)i );&lt;br&gt;       }&lt;br&gt;&lt;br&gt;       thread_function( (void*)i );&lt;br&gt;&lt;br&gt;       for ( i = 0; i &amp;lt; j-1; i++ )&lt;br&gt;       {&lt;br&gt;           pthread_join( ids[i], NULL );&lt;br&gt;       }&lt;br&gt;&lt;br&gt;       gettimeofday( &amp;amp;end, NULL );&lt;br&gt;&lt;br&gt;       d = end.tv_sec - start.tv_sec + (1.0e-6)*end.tv_usec - (1.0e-6)*start.tv_usec;&lt;br&gt;&lt;br&gt;       printf( "%ld) %g %g ips\n", j, d, ((double)j*NUM_ITERATIONS)/d );&lt;br&gt;   }&lt;br&gt;&lt;br&gt;   return 0;&lt;br&gt;}&lt;br&gt;&lt;/pre&gt;
&lt;p&gt;Basically this code&lt;/p&gt;
&lt;pre&gt;   for ( i = 0; i &amp;lt; NUM_ITERATIONS; i++ )&lt;br&gt;   {&lt;br&gt;       data[j] = i;&lt;br&gt;   }&lt;br&gt;&lt;/pre&gt;
&lt;p&gt;runs in parallel for 1 to NUM_THREADS threads and prints how long it  takes to run and the number of iterations executed per second.  &lt;em&gt;data&lt;/em&gt; is an array and &lt;em&gt;j&lt;/em&gt; is a thread specific index into the array.  Thus each thread is given  its own memory address.  This is important to recognize, the threads are  not sharing data.&lt;/p&gt;
&lt;p&gt;As we increase the number of threads (up to the number of cores),  the running time should stay the same, but the number of iterations per  second should increase linearly (remember each thread does  NUM_ITERATIONS, so adding a new thread adds NUM_ITERATIONS of work).   Let's see what happens when we actually run this code:&lt;/p&gt;
&lt;pre&gt;1) 15.758 2.72558e+08 ips&lt;br&gt;2) 28.8921 2.97311e+08 ips&lt;br&gt;3) 40.1948 3.20561e+08 ips&lt;br&gt;4) 46.6236 3.6848e+08 ips&lt;br&gt;&lt;/pre&gt;
&lt;p&gt;Well, that is nothing like what we were expecting.  The running time  increases significantly and the iterations per second increase only  slightly.  It would appear as though the threads are interfering with  each other, however we can see that they don't actually share any data.   What's happening?&lt;/p&gt;
&lt;p&gt;This is an example of &lt;strong&gt;false sharing&lt;/strong&gt;.  False sharing occurs when  multiple threads modify data that share the same cache line.  I'm not  going to go into too much detail about caching, see &lt;a href="https://secure.wikimedia.org/wikipedia/en/wiki/CPU_cache"&gt;this&lt;/a&gt; wikipedia  article for more details.  Briefly, each core has a small private cache  that stores a copy of a region of main memory (accessing the local copy  is faster than accessing main memory).  When the corresponding region in  main memory changes, the value stored in the cache is no longer  correct.  Thus if the core wants to use anything in that memory region,  it needs to make a new copy.  When multiple threads share a single cache  line, modification of the memory in one thread will force the other  threads to refresh their caches.  This refresh forces the threads to  wait for memory transfers far more then they would if the thread was  running exclusively.  If there are enough threads with enough memory  requests it is also possible to saturate the memory bus, which can delay  memory transfers even more.&lt;/p&gt;
&lt;p&gt;To fix this we need to make sure that the threads aren't sharing  cache lines.  The easiest way to fix a problem like this is to add  padding around the data.&lt;/p&gt;
&lt;pre&gt;#include &amp;lt;pthread.h&amp;gt;&lt;br&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br&gt;#include &amp;lt;stdint.h&amp;gt;&lt;br&gt;#include &amp;lt;stdlib.h&amp;gt;&lt;br&gt;#include &amp;lt;sys/time.h&amp;gt;&lt;br&gt;&lt;br&gt;#define NUM_THREADS 4&lt;br&gt;#define NUM_ITERATIONS (1L &amp;lt;&amp;lt; 32)&lt;br&gt;&lt;br&gt;#define CACHE_SIZE 128&lt;br&gt;&lt;br&gt;typedef struct {&lt;br&gt;   long d;&lt;br&gt;   char buffer[CACHE_SIZE-sizeof(long)];&lt;br&gt;} Data;&lt;br&gt;&lt;br&gt;Data *data;&lt;br&gt;   &lt;br&gt;void *thread_function( void *args )&lt;br&gt;{&lt;br&gt;   long i; &lt;br&gt;   long j = (long)args;&lt;br&gt;       &lt;br&gt;   for ( i = 0; i &amp;lt; NUM_ITERATIONS; i++ )&lt;br&gt;   {&lt;br&gt;       data[j].d = i;&lt;br&gt;   }&lt;br&gt;   &lt;br&gt;   return NULL;&lt;br&gt;}   &lt;br&gt;   &lt;br&gt;int main( int argc, char **argv )&lt;br&gt;{   &lt;br&gt;   long i, j;&lt;br&gt;   pthread_t ids[NUM_THREADS-1];&lt;br&gt;   struct timeval start, end;&lt;br&gt;   double d;&lt;br&gt;   &lt;br&gt;   data = (Data*)malloc( sizeof(Data)*NUM_THREADS );&lt;br&gt;       &lt;br&gt;   for ( j = 1; j &amp;lt;= NUM_THREADS; j++ )&lt;br&gt;   {       &lt;br&gt;       for ( i = 0; i &amp;lt; NUM_THREADS; i++ )&lt;br&gt;       {&lt;br&gt;           data[i].d = 0;&lt;br&gt;       }&lt;br&gt;       &lt;br&gt;       gettimeofday( &amp;amp;start, NULL );&lt;br&gt;       for ( i = 0; i &amp;lt; j-1; i++ )&lt;br&gt;       {&lt;br&gt;           pthread_create( ids+i, NULL, thread_function, (void*)i );&lt;br&gt;       }           &lt;br&gt;       &lt;br&gt;       thread_function( (void*)i );&lt;br&gt;       &lt;br&gt;       for ( i = 0; i &amp;lt; j-1; i++ )&lt;br&gt;       {&lt;br&gt;           pthread_join( ids[i], NULL );&lt;br&gt;       }   &lt;br&gt;       &lt;br&gt;       gettimeofday( &amp;amp;end, NULL );&lt;br&gt;       &lt;br&gt;       d = end.tv_sec - start.tv_sec + (1.0e-6)*end.tv_usec - (1.0e-6)*start.tv_usec;&lt;br&gt;       &lt;br&gt;       printf( "%ld) %g %g ips\n", j, d, ((double)j*NUM_ITERATIONS)/d );&lt;br&gt;   }   &lt;br&gt;   &lt;br&gt;   return 0;&lt;br&gt;}&lt;br&gt;&lt;/pre&gt;
&lt;p&gt;We have changed our array from type long, to type Data, a struct that  contains padding.  This padding guarantees that one struct's data won't  share a cache line with other structs, in particular structs used in  other threads.  Now let's run this code:&lt;/p&gt;
&lt;pre&gt;1) 15.6487 2.74462e+08 ips&lt;br&gt;2) 15.0241 5.71744e+08 ips&lt;br&gt;3) 13.5294 9.52364e+08 ips&lt;br&gt;4) 12.5411 1.36989e+09 ips&lt;br&gt;&lt;/pre&gt;
&lt;p&gt;This is what we were expecting (perhaps even a little better).&lt;/p&gt;
&lt;p&gt;So how does this effect Maple?  I originally tried to write these  examples in Maple, but I didn't get significant problems.  This is  because the overhead of Maple evaluating a statement probably clobbers  the shared cache line so it will need to be reloaded in either case.   However, as we make Maple faster, it may be possible for false sharing  to become a problem in your Maple code.&lt;/p&gt;
&lt;p&gt;If you want to download and try executing this code for yourself, be careful of compiler optimizations.&amp;nbsp; The function that we execute in the threads can easily be optimized into one that does not use the shared memory in each iteration.&lt;/p&gt;
&lt;p&gt;I built this example on Linux, using&lt;/p&gt;
&lt;pre&gt;gcc falsesharing.c -lpthread -o falsesharing&lt;br&gt;&lt;/pre&gt;
</itunes:summary>
      <description>&lt;p&gt;Consider the following C code:&lt;/p&gt;
&lt;pre&gt;#include &amp;lt;pthread.h&amp;gt;&lt;br&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br&gt;#include &amp;lt;stdint.h&amp;gt;&lt;br&gt;#include &amp;lt;stdlib.h&amp;gt;&lt;br&gt;#include &amp;lt;sys/time.h&amp;gt;&lt;br&gt;&lt;br&gt;#define NUM_THREADS 4&lt;br&gt;#define NUM_ITERATIONS (1L &amp;lt;&amp;lt; 32)&lt;br&gt;&lt;br&gt;long *data;&lt;br&gt;&lt;br&gt;void *thread_function( void *args )&lt;br&gt;{&lt;br&gt;   long i;&lt;br&gt;   long j = (long)args;&lt;br&gt;&lt;br&gt;   for ( i = 0; i &amp;lt; NUM_ITERATIONS; i++ )&lt;br&gt;   {&lt;br&gt;       data[j] = i;&lt;br&gt;   }&lt;br&gt;&lt;br&gt;   return NULL;&lt;br&gt;}&lt;br&gt;&lt;br&gt;int main( int argc, char **argv )&lt;br&gt;{&lt;br&gt;   long i, j;&lt;br&gt;   pthread_t ids[NUM_THREADS-1];&lt;br&gt;   struct timeval start, end;&lt;br&gt;   double d;&lt;br&gt;&lt;br&gt;   data = (long*)malloc( sizeof(long)*NUM_THREADS );&lt;br&gt;&lt;br&gt;   for ( j = 1; j &amp;lt;= NUM_THREADS; j++ )&lt;br&gt;   {&lt;br&gt;       for ( i = 0; i &amp;lt; NUM_THREADS; i++ )&lt;br&gt;       {&lt;br&gt;           data[i] = 0;&lt;br&gt;       }&lt;br&gt;&lt;br&gt;       gettimeofday( &amp;amp;start, NULL );&lt;br&gt;       for ( i = 0; i &amp;lt; j-1; i++ )&lt;br&gt;       {&lt;br&gt;           pthread_create( ids+i, NULL, thread_function, (void*)i );&lt;br&gt;       }&lt;br&gt;&lt;br&gt;       thread_function( (void*)i );&lt;br&gt;&lt;br&gt;       for ( i = 0; i &amp;lt; j-1; i++ )&lt;br&gt;       {&lt;br&gt;           pthread_join( ids[i], NULL );&lt;br&gt;       }&lt;br&gt;&lt;br&gt;       gettimeofday( &amp;amp;end, NULL );&lt;br&gt;&lt;br&gt;       d = end.tv_sec - start.tv_sec + (1.0e-6)*end.tv_usec - (1.0e-6)*start.tv_usec;&lt;br&gt;&lt;br&gt;       printf( "%ld) %g %g ips\n", j, d, ((double)j*NUM_ITERATIONS)/d );&lt;br&gt;   }&lt;br&gt;&lt;br&gt;   return 0;&lt;br&gt;}&lt;br&gt;&lt;/pre&gt;
&lt;p&gt;Basically this code&lt;/p&gt;
&lt;pre&gt;   for ( i = 0; i &amp;lt; NUM_ITERATIONS; i++ )&lt;br&gt;   {&lt;br&gt;       data[j] = i;&lt;br&gt;   }&lt;br&gt;&lt;/pre&gt;
&lt;p&gt;runs in parallel for 1 to NUM_THREADS threads and prints how long it  takes to run and the number of iterations executed per second.  &lt;em&gt;data&lt;/em&gt; is an array and &lt;em&gt;j&lt;/em&gt; is a thread specific index into the array.  Thus each thread is given  its own memory address.  This is important to recognize, the threads are  not sharing data.&lt;/p&gt;
&lt;p&gt;As we increase the number of threads (up to the number of cores),  the running time should stay the same, but the number of iterations per  second should increase linearly (remember each thread does  NUM_ITERATIONS, so adding a new thread adds NUM_ITERATIONS of work).   Let's see what happens when we actually run this code:&lt;/p&gt;
&lt;pre&gt;1) 15.758 2.72558e+08 ips&lt;br&gt;2) 28.8921 2.97311e+08 ips&lt;br&gt;3) 40.1948 3.20561e+08 ips&lt;br&gt;4) 46.6236 3.6848e+08 ips&lt;br&gt;&lt;/pre&gt;
&lt;p&gt;Well, that is nothing like what we were expecting.  The running time  increases significantly and the iterations per second increase only  slightly.  It would appear as though the threads are interfering with  each other, however we can see that they don't actually share any data.   What's happening?&lt;/p&gt;
&lt;p&gt;This is an example of &lt;strong&gt;false sharing&lt;/strong&gt;.  False sharing occurs when  multiple threads modify data that share the same cache line.  I'm not  going to go into too much detail about caching, see &lt;a href="https://secure.wikimedia.org/wikipedia/en/wiki/CPU_cache"&gt;this&lt;/a&gt; wikipedia  article for more details.  Briefly, each core has a small private cache  that stores a copy of a region of main memory (accessing the local copy  is faster than accessing main memory).  When the corresponding region in  main memory changes, the value stored in the cache is no longer  correct.  Thus if the core wants to use anything in that memory region,  it needs to make a new copy.  When multiple threads share a single cache  line, modification of the memory in one thread will force the other  threads to refresh their caches.  This refresh forces the threads to  wait for memory transfers far more then they would if the thread was  running exclusively.  If there are enough threads with enough memory  requests it is also possible to saturate the memory bus, which can delay  memory transfers even more.&lt;/p&gt;
&lt;p&gt;To fix this we need to make sure that the threads aren't sharing  cache lines.  The easiest way to fix a problem like this is to add  padding around the data.&lt;/p&gt;
&lt;pre&gt;#include &amp;lt;pthread.h&amp;gt;&lt;br&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br&gt;#include &amp;lt;stdint.h&amp;gt;&lt;br&gt;#include &amp;lt;stdlib.h&amp;gt;&lt;br&gt;#include &amp;lt;sys/time.h&amp;gt;&lt;br&gt;&lt;br&gt;#define NUM_THREADS 4&lt;br&gt;#define NUM_ITERATIONS (1L &amp;lt;&amp;lt; 32)&lt;br&gt;&lt;br&gt;#define CACHE_SIZE 128&lt;br&gt;&lt;br&gt;typedef struct {&lt;br&gt;   long d;&lt;br&gt;   char buffer[CACHE_SIZE-sizeof(long)];&lt;br&gt;} Data;&lt;br&gt;&lt;br&gt;Data *data;&lt;br&gt;   &lt;br&gt;void *thread_function( void *args )&lt;br&gt;{&lt;br&gt;   long i; &lt;br&gt;   long j = (long)args;&lt;br&gt;       &lt;br&gt;   for ( i = 0; i &amp;lt; NUM_ITERATIONS; i++ )&lt;br&gt;   {&lt;br&gt;       data[j].d = i;&lt;br&gt;   }&lt;br&gt;   &lt;br&gt;   return NULL;&lt;br&gt;}   &lt;br&gt;   &lt;br&gt;int main( int argc, char **argv )&lt;br&gt;{   &lt;br&gt;   long i, j;&lt;br&gt;   pthread_t ids[NUM_THREADS-1];&lt;br&gt;   struct timeval start, end;&lt;br&gt;   double d;&lt;br&gt;   &lt;br&gt;   data = (Data*)malloc( sizeof(Data)*NUM_THREADS );&lt;br&gt;       &lt;br&gt;   for ( j = 1; j &amp;lt;= NUM_THREADS; j++ )&lt;br&gt;   {       &lt;br&gt;       for ( i = 0; i &amp;lt; NUM_THREADS; i++ )&lt;br&gt;       {&lt;br&gt;           data[i].d = 0;&lt;br&gt;       }&lt;br&gt;       &lt;br&gt;       gettimeofday( &amp;amp;start, NULL );&lt;br&gt;       for ( i = 0; i &amp;lt; j-1; i++ )&lt;br&gt;       {&lt;br&gt;           pthread_create( ids+i, NULL, thread_function, (void*)i );&lt;br&gt;       }           &lt;br&gt;       &lt;br&gt;       thread_function( (void*)i );&lt;br&gt;       &lt;br&gt;       for ( i = 0; i &amp;lt; j-1; i++ )&lt;br&gt;       {&lt;br&gt;           pthread_join( ids[i], NULL );&lt;br&gt;       }   &lt;br&gt;       &lt;br&gt;       gettimeofday( &amp;amp;end, NULL );&lt;br&gt;       &lt;br&gt;       d = end.tv_sec - start.tv_sec + (1.0e-6)*end.tv_usec - (1.0e-6)*start.tv_usec;&lt;br&gt;       &lt;br&gt;       printf( "%ld) %g %g ips\n", j, d, ((double)j*NUM_ITERATIONS)/d );&lt;br&gt;   }   &lt;br&gt;   &lt;br&gt;   return 0;&lt;br&gt;}&lt;br&gt;&lt;/pre&gt;
&lt;p&gt;We have changed our array from type long, to type Data, a struct that  contains padding.  This padding guarantees that one struct's data won't  share a cache line with other structs, in particular structs used in  other threads.  Now let's run this code:&lt;/p&gt;
&lt;pre&gt;1) 15.6487 2.74462e+08 ips&lt;br&gt;2) 15.0241 5.71744e+08 ips&lt;br&gt;3) 13.5294 9.52364e+08 ips&lt;br&gt;4) 12.5411 1.36989e+09 ips&lt;br&gt;&lt;/pre&gt;
&lt;p&gt;This is what we were expecting (perhaps even a little better).&lt;/p&gt;
&lt;p&gt;So how does this effect Maple?  I originally tried to write these  examples in Maple, but I didn't get significant problems.  This is  because the overhead of Maple evaluating a statement probably clobbers  the shared cache line so it will need to be reloaded in either case.   However, as we make Maple faster, it may be possible for false sharing  to become a problem in your Maple code.&lt;/p&gt;
&lt;p&gt;If you want to download and try executing this code for yourself, be careful of compiler optimizations.&amp;nbsp; The function that we execute in the threads can easily be optimized into one that does not use the shared memory in each iteration.&lt;/p&gt;
&lt;p&gt;I built this example on Linux, using&lt;/p&gt;
&lt;pre&gt;gcc falsesharing.c -lpthread -o falsesharing&lt;br&gt;&lt;/pre&gt;
</description>
      <guid>95842</guid>
      <pubDate>Fri, 06 Aug 2010 16:21:49 Z</pubDate>
      <itunes:author>dohashi</itunes:author>
      <author>dohashi</author>
    </item>
    <item>
      <title>Understanding the Question</title>
      <link>http://www.mapleprimes.com/maplesoftblog/95379-Understanding-The-Question?ref=Feed:MaplePrimes:Maplesoft Blog</link>
      <itunes:summary>&lt;p style="margin: 0 0 0 0; padding-top: 0px; padding-bottom: 0px;"&gt;&lt;span style="color: #000000; font-size: 100%; font-weight: normal; font-style: normal;"&gt; The hardest and/or most important part of answering a question is making sure the         real question is understood. The July 1, 2010 question &lt;/span&gt;&lt;a href="http://www.mapleprimes.com/questions/94651-Using-Fsolve-With-A-Dispersion-Relation"&gt; &lt;span style="color: #008080; font-size: 100%; font-weight: normal; font-style: normal;"&gt; &lt;span style="text-decoration: underline;"&gt;Using fsolve with a dispersion relation&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="color: #000000; font-size: 100%; font-weight: normal; font-style: normal;"&gt;&amp;nbsp;posted                     to MaplePrimes seemed to be about obtaining a numeric solution of an equation. Turns                     out it was more a question about the behavior of an implicit function.&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0 0 0 0; padding-top: 0px; padding-bottom: 0px;"&gt;</itunes:summary>
      <description>&lt;p style="margin: 0 0 0 0; padding-top: 0px; padding-bottom: 0px;"&gt;&lt;span style="color: #000000; font-size: 100%; font-weight: normal; font-style: normal;"&gt; The hardest and/or most important part of answering a question is making sure the         real question is understood. The July 1, 2010 question &lt;/span&gt;&lt;a href="http://www.mapleprimes.com/questions/94651-Using-Fsolve-With-A-Dispersion-Relation"&gt; &lt;span style="color: #008080; font-size: 100%; font-weight: normal; font-style: normal;"&gt; &lt;span style="text-decoration: underline;"&gt;Using fsolve with a dispersion relation&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="color: #000000; font-size: 100%; font-weight: normal; font-style: normal;"&gt;&amp;nbsp;posted                     to MaplePrimes seemed to be about obtaining a numeric solution of an equation. Turns                     out it was more a question about the behavior of an implicit function.&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0 0 0 0; padding-top: 0px; padding-bottom: 0px;"&gt;</description>
      <guid>95379</guid>
      <pubDate>Fri, 23 Jul 2010 19:36:15 Z</pubDate>
      <itunes:author>rlopez</itunes:author>
      <author>rlopez</author>
    </item>
    <item>
      <title>My son &amp; I attend a Rush concert</title>
      <link>http://www.mapleprimes.com/maplesoftblog/95129-My-Son--I-Attend-A-Rush-Concert?ref=Feed:MaplePrimes:Maplesoft Blog</link>
      <itunes:summary>&lt;p&gt;This week, I had the pleasure of attending a rock concert with my son Eric who is now about to turn 15 and who has turned out to possess non-trivial interests and talents in music. The concert was by the band Rush who, to the uninitiated, would be yet another big, loud, over-produced rock band. But to a generation of technocrats (e.g. yours truly) educated from the late 1970&amp;rsquo;s and on, they are the band of choice due to an intriguing mix of musicianship, technological...</itunes:summary>
      <description>&lt;p&gt;This week, I had the pleasure of attending a rock concert with my son Eric who is now about to turn 15 and who has turned out to possess non-trivial interests and talents in music. The concert was by the band Rush who, to the uninitiated, would be yet another big, loud, over-produced rock band. But to a generation of technocrats (e.g. yours truly) educated from the late 1970&amp;rsquo;s and on, they are the band of choice due to an intriguing mix of musicianship, technological...</description>
      <guid>95129</guid>
      <pubDate>Thu, 15 Jul 2010 14:16:24 Z</pubDate>
      <itunes:author>Tom Lee</itunes:author>
      <author>Tom Lee</author>
    </item>
    <item>
      <title>Teaching Matrix Norms</title>
      <link>http://www.mapleprimes.com/maplesoftblog/94988-Teaching-Matrix-Norms?ref=Feed:MaplePrimes:Maplesoft Blog</link>
      <itunes:summary>&lt;p style="margin: 0 0 0 0; padding-top: 0px; padding-bottom: 0px;"&gt;The greatest benefits from bringing Maple into the classroom are realized when the static pedagogy of a printed textbook is enlivened by the interplay of symbolic, graphic, and numeric calculations made possible by technology. &amp;nbsp;It is not enough merely to compute or check answers with Maple. &amp;nbsp;To stop after noting that indeed, Maple can compute the correct answer is not a pedagogical breakthrough.&lt;/p&gt;
...</itunes:summary>
      <description>&lt;p style="margin: 0 0 0 0; padding-top: 0px; padding-bottom: 0px;"&gt;The greatest benefits from bringing Maple into the classroom are realized when the static pedagogy of a printed textbook is enlivened by the interplay of symbolic, graphic, and numeric calculations made possible by technology. &amp;nbsp;It is not enough merely to compute or check answers with Maple. &amp;nbsp;To stop after noting that indeed, Maple can compute the correct answer is not a pedagogical breakthrough.&lt;/p&gt;
...</description>
      <guid>94988</guid>
      <pubDate>Fri, 09 Jul 2010 18:36:42 Z</pubDate>
      <itunes:author>Robert Lopez</itunes:author>
      <author>Robert Lopez</author>
    </item>
    <item>
      <title>New Parallel Features in Maple 14</title>
      <link>http://www.mapleprimes.com/maplesoftblog/94987-New-Parallel-Features-In-Maple-14?ref=Feed:MaplePrimes:Maplesoft Blog</link>
      <itunes:summary>&lt;p&gt;It has been a while since my last post, mostly because of a  combination of getting Maple 14 ready to ship and a lack of meaty topics  to write about.  I am trying to get back into the habit of posting more  regularly.  You can help me achieve my goal by posting questions about  parallel programming.  I'll do my best to answer.  However for now, I'll  give a brief overview of the new parallel programming features in Maple  14.&lt;/p&gt;

&lt;p&gt;A new function has been added to the Task Programming Model.  The  Threads:-Task:-Return function allows a parallel algorithm implemented  on top of the Task Programming Model to perform an early bail out.  Lets  imagine that you have implemented a parallel search.  You are looking  for a particular element in a large set of data.  Using the Task  Programming Model, you've created a bunch of tasks, each searching a  particular subset of the data.  However one of the first tasks to  execute finds the element you are looking for.  In Maple 13, there was  no built in way of telling the other tasks that the result have been  found and they they should not execute.  In Maple 14, the Return  function allows one task to specify a return value (which will be  returned from Threads:-Task:-Start) and signal the other tasks that the  algorithm is complete and that additional tasks should not be executed.   Tasks that are already running will still run to completion, but tasks  that have not started executing will not be started.&lt;/p&gt;
&lt;p&gt;You may have noticed that there is a race condition with Return.   What happens if two tasks both call Return in parallel?  Only one of  the values will become the value that is passed to Threads:-Task:-Start.   I suppose I could say the "first" value is the one that is used, but  really, what does that mean?   If you call Return, then the value passed  to Return should be an acceptable result for the algorithm.&amp;nbsp; If you call Return more than once, any of those values should be valid, thus it shouldn't matter which one becomes the return value.&amp;nbsp; That  said, the Return function does give some feedback.  In the task  that succeeds in having its value accepted, Return will return true.  In all  other tasks that call Return, it will return false.  This allows the  code to know if a particular result was or was not accepted.&lt;/p&gt;

&lt;p&gt;Maple 14 also adds the Task Programming Model to the C External  Calling API.  This means that you can write your algorithms in C and  make use of the Task Programming Model.  The C API is similar to the  Maple API, with a few differences.  In particular, you need to create  each child task individually, instead of as a single call to Continue,  as you would in Maple.  As well, because it is C code, you need to worry  about a few details like memory management that are handled  automatically in Maple.&amp;nbsp; Using External Call is fairly advanced, so I won't go into too much detail here.&amp;nbsp; If you'd like to see more details of using the Task Programming Model in External Calling, I can write a seperated post dedicated to that.&lt;/p&gt;

&lt;p&gt;As with every release of Maple, we spent some time trying to make  our existing functionality faster and more stable.  For parallel  programming, we reduced the overhead of using the Task Programming  Model, as well as reducing the locking in the kernel (which should help  improve parallelism).  Of course many bugs have been fixed, which should  make parallel programming more reliable in Maple 14.&lt;/p&gt;
</itunes:summary>
      <description>&lt;p&gt;It has been a while since my last post, mostly because of a  combination of getting Maple 14 ready to ship and a lack of meaty topics  to write about.  I am trying to get back into the habit of posting more  regularly.  You can help me achieve my goal by posting questions about  parallel programming.  I'll do my best to answer.  However for now, I'll  give a brief overview of the new parallel programming features in Maple  14.&lt;/p&gt;

&lt;p&gt;A new function has been added to the Task Programming Model.  The  Threads:-Task:-Return function allows a parallel algorithm implemented  on top of the Task Programming Model to perform an early bail out.  Lets  imagine that you have implemented a parallel search.  You are looking  for a particular element in a large set of data.  Using the Task  Programming Model, you've created a bunch of tasks, each searching a  particular subset of the data.  However one of the first tasks to  execute finds the element you are looking for.  In Maple 13, there was  no built in way of telling the other tasks that the result have been  found and they they should not execute.  In Maple 14, the Return  function allows one task to specify a return value (which will be  returned from Threads:-Task:-Start) and signal the other tasks that the  algorithm is complete and that additional tasks should not be executed.   Tasks that are already running will still run to completion, but tasks  that have not started executing will not be started.&lt;/p&gt;
&lt;p&gt;You may have noticed that there is a race condition with Return.   What happens if two tasks both call Return in parallel?  Only one of  the values will become the value that is passed to Threads:-Task:-Start.   I suppose I could say the "first" value is the one that is used, but  really, what does that mean?   If you call Return, then the value passed  to Return should be an acceptable result for the algorithm.&amp;nbsp; If you call Return more than once, any of those values should be valid, thus it shouldn't matter which one becomes the return value.&amp;nbsp; That  said, the Return function does give some feedback.  In the task  that succeeds in having its value accepted, Return will return true.  In all  other tasks that call Return, it will return false.  This allows the  code to know if a particular result was or was not accepted.&lt;/p&gt;

&lt;p&gt;Maple 14 also adds the Task Programming Model to the C External  Calling API.  This means that you can write your algorithms in C and  make use of the Task Programming Model.  The C API is similar to the  Maple API, with a few differences.  In particular, you need to create  each child task individually, instead of as a single call to Continue,  as you would in Maple.  As well, because it is C code, you need to worry  about a few details like memory management that are handled  automatically in Maple.&amp;nbsp; Using External Call is fairly advanced, so I won't go into too much detail here.&amp;nbsp; If you'd like to see more details of using the Task Programming Model in External Calling, I can write a seperated post dedicated to that.&lt;/p&gt;

&lt;p&gt;As with every release of Maple, we spent some time trying to make  our existing functionality faster and more stable.  For parallel  programming, we reduced the overhead of using the Task Programming  Model, as well as reducing the locking in the kernel (which should help  improve parallelism).  Of course many bugs have been fixed, which should  make parallel programming more reliable in Maple 14.&lt;/p&gt;
</description>
      <guid>94987</guid>
      <pubDate>Fri, 09 Jul 2010 18:25:46 Z</pubDate>
      <itunes:author>dohashi</itunes:author>
      <author>dohashi</author>
    </item>
    <item>
      <title>From Months to Days</title>
      <link>http://www.mapleprimes.com/maplesoftblog/94591-From-Months-To-Days?ref=Feed:MaplePrimes:Maplesoft Blog</link>
      <itunes:summary>&lt;p&gt;The term &amp;ldquo;from months to days&amp;rdquo; is a favorite slogan of mine and I have relied on it religiously for over two decades to illustrate the fundamental benefit of symbolic computation. Whether it&amp;rsquo;s the efficient development of complex physical models using MapleSim, or exploration of parametric design surface equations (my dissertation) using good old fashioned Maple V Release 2, the punch that symbolic computation provided was to automate the algebraic mechanics...</itunes:summary>
      <description>&lt;p&gt;The term &amp;ldquo;from months to days&amp;rdquo; is a favorite slogan of mine and I have relied on it religiously for over two decades to illustrate the fundamental benefit of symbolic computation. Whether it&amp;rsquo;s the efficient development of complex physical models using MapleSim, or exploration of parametric design surface equations (my dissertation) using good old fashioned Maple V Release 2, the punch that symbolic computation provided was to automate the algebraic mechanics...</description>
      <guid>94591</guid>
      <pubDate>Tue, 29 Jun 2010 04:00:00 Z</pubDate>
      <itunes:author>Tom Lee</itunes:author>
      <author>Tom Lee</author>
    </item>
    <item>
      <title>Drawing Solids of Revolution</title>
      <link>http://www.mapleprimes.com/maplesoftblog/90006-Drawing-Solids-Of-Revolution?ref=Feed:MaplePrimes:Maplesoft Blog</link>
      <itunes:summary>&lt;p style="margin: 0 0 0 0; padding-top: 0px; padding-bottom: 0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin: 0 0 0 0; padding-top: 0px; padding-bottom: 0px;"&gt;&lt;span style="color: #000000; font-size: 100%; font-weight: normal; font-style: normal;"&gt;In a recent &lt;/span&gt;&lt;a href="http://www.mapleprimes.com/maplesoftblog/53004-Volumes-By-Slicing"&gt;&lt;span style="color: #008080; font-size: 100%; font-weight: normal; font-style: normal;"&gt;&lt;span style="text-decoration: underline;"&gt;blog post&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="color: #000000; font-size: 100%; font-weight: normal; font-style: normal;"&gt;, I pointed out that Maple did not have a built-in functionality for drawing graphs that arise in computing volumes by slices. However, I did provide several examples of ad-hoc visualizations that one could build with the graphing tools in Maple.&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0 0 0 0; padding-top: 0px; padding-bottom: 0px;"&gt;&lt;span style="color: #000000; font-size: 100%; font-weight: normal; font-style: normal;"&gt;&amp;nbsp; &lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0 0 0 0; padding-top: 0px; padding-bottom: 0px;"&gt;&lt;span style="color: #000000; font-size: 100%; font-weight: normal; font-style: normal;"&gt;Recently, a user called attention to a weakness in the Student Calculus 1 command, &lt;/span&gt;&lt;span style="color: #000000; font-size: 100%; font-weight: bold; font-style: normal;"&gt;VolumeOfRevolution&lt;/span&gt;&lt;span style="color: #000000; font-size: 100%; font-weight: normal; font-style: normal;"&gt;. This command (and the tutor built on it) will draw a surface of revolution bounded by the surfaces generated by revolving the graph of one or two functions.&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0 0 0 0; padding-top: 0px; padding-bottom: 0px;"&gt;&lt;span style="color: #000000; font-size: 100%; font-weight: normal; font-style: normal;"&gt;&lt;/span&gt;</itunes:summary>
      <description>&lt;p style="margin: 0 0 0 0; padding-top: 0px; padding-bottom: 0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin: 0 0 0 0; padding-top: 0px; padding-bottom: 0px;"&gt;&lt;span style="color: #000000; font-size: 100%; font-weight: normal; font-style: normal;"&gt;In a recent &lt;/span&gt;&lt;a href="http://www.mapleprimes.com/maplesoftblog/53004-Volumes-By-Slicing"&gt;&lt;span style="color: #008080; font-size: 100%; font-weight: normal; font-style: normal;"&gt;&lt;span style="text-decoration: underline;"&gt;blog post&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="color: #000000; font-size: 100%; font-weight: normal; font-style: normal;"&gt;, I pointed out that Maple did not have a built-in functionality for drawing graphs that arise in computing volumes by slices. However, I did provide several examples of ad-hoc visualizations that one could build with the graphing tools in Maple.&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0 0 0 0; padding-top: 0px; padding-bottom: 0px;"&gt;&lt;span style="color: #000000; font-size: 100%; font-weight: normal; font-style: normal;"&gt;&amp;nbsp; &lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0 0 0 0; padding-top: 0px; padding-bottom: 0px;"&gt;&lt;span style="color: #000000; font-size: 100%; font-weight: normal; font-style: normal;"&gt;Recently, a user called attention to a weakness in the Student Calculus 1 command, &lt;/span&gt;&lt;span style="color: #000000; font-size: 100%; font-weight: bold; font-style: normal;"&gt;VolumeOfRevolution&lt;/span&gt;&lt;span style="color: #000000; font-size: 100%; font-weight: normal; font-style: normal;"&gt;. This command (and the tutor built on it) will draw a surface of revolution bounded by the surfaces generated by revolving the graph of one or two functions.&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0 0 0 0; padding-top: 0px; padding-bottom: 0px;"&gt;&lt;span style="color: #000000; font-size: 100%; font-weight: normal; font-style: normal;"&gt;&lt;/span&gt;</description>
      <guid>90006</guid>
      <pubDate>Tue, 22 Jun 2010 16:03:45 Z</pubDate>
      <itunes:author>Robert Lopez</itunes:author>
      <author>Robert Lopez</author>
    </item>
    <item>
      <title>Lines - The Devil Is in the Details</title>
      <link>http://www.mapleprimes.com/maplesoftblog/89029-Lines--The-Devil-Is-In-The-Details?ref=Feed:MaplePrimes:Maplesoft Blog</link>
      <itunes:summary>&lt;p style="margin: 0 0 0 0; padding-top: 0px; padding-bottom: 0px;"&gt;&lt;span&gt;Points and lines, and the relationships between them, are essential ingredients of so many problems in, for example, calculus. In particular, obtaining the equation of the perpendicular bisector of a line segment, dropping a perpendicular from a point to a given line, and calculating the distance from a point to a line are three tasks treated in elementary analytic geometry that recur in the applications....&lt;/span&gt;</itunes:summary>
      <description>&lt;p style="margin: 0 0 0 0; padding-top: 0px; padding-bottom: 0px;"&gt;&lt;span&gt;Points and lines, and the relationships between them, are essential ingredients of so many problems in, for example, calculus. In particular, obtaining the equation of the perpendicular bisector of a line segment, dropping a perpendicular from a point to a given line, and calculating the distance from a point to a line are three tasks treated in elementary analytic geometry that recur in the applications....&lt;/span&gt;</description>
      <guid>89029</guid>
      <pubDate>Fri, 04 Jun 2010 18:22:08 Z</pubDate>
      <itunes:author>Robert Lopez</itunes:author>
      <author>Robert Lopez</author>
    </item>
    <item>
      <title>The Traveling Salesman's U.S. Roadtrip</title>
      <link>http://www.mapleprimes.com/maplesoftblog/89021-The-Traveling-Salesmans-US-Roadtrip?ref=Feed:MaplePrimes:Maplesoft Blog</link>
      <itunes:summary>&lt;p&gt;I spend much of my time traveling for business. These trips often last a week, and we try to visit as many potential customers as possible, and in the most efficient order. This involves matching our hosts' calendars with our own, booking the most cost effective travel options, and coping with last-minute cancellations and changes. It isn&amp;rsquo;t easy!&lt;/p&gt;
&lt;p&gt;This has become so much easier with the advent of shareable calendars and mapping services, like Google Maps.&amp;nbsp;...</itunes:summary>
      <description>&lt;p&gt;I spend much of my time traveling for business. These trips often last a week, and we try to visit as many potential customers as possible, and in the most efficient order. This involves matching our hosts' calendars with our own, booking the most cost effective travel options, and coping with last-minute cancellations and changes. It isn&amp;rsquo;t easy!&lt;/p&gt;
&lt;p&gt;This has become so much easier with the advent of shareable calendars and mapping services, like Google Maps.&amp;nbsp;...</description>
      <guid>89021</guid>
      <pubDate>Fri, 04 Jun 2010 15:41:40 Z</pubDate>
      <itunes:author>samirkhan</itunes:author>
      <author>samirkhan</author>
    </item>
    <item>
      <title>Four compelling reasons to clean your desk</title>
      <link>http://www.mapleprimes.com/maplesoftblog/88731-Four-Compelling-Reasons-To-Clean-Your-Desk?ref=Feed:MaplePrimes:Maplesoft Blog</link>
      <itunes:summary>&lt;p&gt;My wife will testify that I am horrible when it comes to keeping things organized and tidy. My colleagues who have seen my office  can attest to this as well. My usual defence is that a messy environment is  an indication of how busy you are (consequently how productive you are) and  basic creativity. But every once in a while, usually when I hit a mental  block, I launch into clean up mode to do something completely different hoping  that when I&amp;rsquo;m done, my mental block will be gone. I just went through one of these moments. This time, my cleansing took me to the bottom of one of my  office desk drawers to a pile of photos that I had stashed in there ten years ago.  Glancing through these, four immediately jumped out and helped me flash back to  some key moments in my life. Yes, my 15 minute sabbatical digging through my desk  was one of the most productive quarter hours I&amp;rsquo;ve had in a long time. Here,  then, are these four photos that respectively offer a compelling reason to  reflect a bit on the past ...&lt;/p&gt;</itunes:summary>
      <description>&lt;img src="/view.aspx?si=88731/0\image001.jpg" alt="Four compelling reasons to clean your desk" align="left"/&gt;&lt;p&gt;My wife will testify that I am horrible when it comes to keeping things organized and tidy. My colleagues who have seen my office  can attest to this as well. My usual defence is that a messy environment is  an indication of how busy you are (consequently how productive you are) and  basic creativity. But every once in a while, usually when I hit a mental  block, I launch into clean up mode to do something completely different hoping  that when I&amp;rsquo;m done, my mental block will be gone. I just went through one of these moments. This time, my cleansing took me to the bottom of one of my  office desk drawers to a pile of photos that I had stashed in there ten years ago.  Glancing through these, four immediately jumped out and helped me flash back to  some key moments in my life. Yes, my 15 minute sabbatical digging through my desk  was one of the most productive quarter hours I&amp;rsquo;ve had in a long time. Here,  then, are these four photos that respectively offer a compelling reason to  reflect a bit on the past ...&lt;/p&gt;</description>
      <guid>88731</guid>
      <pubDate>Mon, 31 May 2010 04:00:00 Z</pubDate>
      <itunes:author>Tom Lee</itunes:author>
      <author>Tom Lee</author>
    </item>
    <item>
      <title>Fitting Circles to 3D Data - an Update</title>
      <link>http://www.mapleprimes.com/maplesoftblog/88732-Fitting-Circles-To-3D-Data--An-Update?ref=Feed:MaplePrimes:Maplesoft Blog</link>
      <itunes:summary>&lt;p&gt;&lt;span&gt;Back in July of 2005, one of the early &lt;/span&gt;&lt;a href="http://www.maplesoft.com/applications/view.aspx?SID=1644"&gt;&lt;span&gt;&lt;span&gt;Tips &amp;amp; Techniques&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&amp;nbsp;articles (since updated) in the Maple Reporter was a comparison of two different approaches to fitting a circle to 3D data points. The impetus for the comparison was Carl Cowen's article on the subject. His approach was algebraic - he used the singular value decomposition to obtain a basis for the...&lt;/span&gt;</itunes:summary>
      <description>&lt;p&gt;&lt;span&gt;Back in July of 2005, one of the early &lt;/span&gt;&lt;a href="http://www.maplesoft.com/applications/view.aspx?SID=1644"&gt;&lt;span&gt;&lt;span&gt;Tips &amp;amp; Techniques&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&amp;nbsp;articles (since updated) in the Maple Reporter was a comparison of two different approaches to fitting a circle to 3D data points. The impetus for the comparison was Carl Cowen's article on the subject. His approach was algebraic - he used the singular value decomposition to obtain a basis for the...&lt;/span&gt;</description>
      <guid>88732</guid>
      <pubDate>Mon, 31 May 2010 04:00:00 Z</pubDate>
      <itunes:author>Robert Lopez</itunes:author>
      <author>Robert Lopez</author>
    </item>
    <item>
      <title>Parametrizing a Curve</title>
      <link>http://www.mapleprimes.com/maplesoftblog/87653-Parametrizing-A-Curve?ref=Feed:MaplePrimes:Maplesoft Blog</link>
      <itunes:summary>&lt;p&gt;In 1988, Keith Geddes and others involved with the Maple project at the University of Waterloo published a Maple Calculus Workbook of interesting calculus problems and their solutions in Maple. Over the years, I've paged through this book, extracting some of its more unique problems. Recently, I extracted the following problem from this book, and added it to my Clickable Calculus collection, which I use for workshops and web-based presentations.&lt;/p&gt;</itunes:summary>
      <description>&lt;p&gt;In 1988, Keith Geddes and others involved with the Maple project at the University of Waterloo published a Maple Calculus Workbook of interesting calculus problems and their solutions in Maple. Over the years, I've paged through this book, extracting some of its more unique problems. Recently, I extracted the following problem from this book, and added it to my Clickable Calculus collection, which I use for workshops and web-based presentations.&lt;/p&gt;</description>
      <guid>87653</guid>
      <pubDate>Thu, 13 May 2010 04:00:00 Z</pubDate>
      <enclosure url="http://www.maplesoft.com/view.aspx?SF=87653/0\ParametrizingACurv.mw" length="978944" type="" />
      <itunes:author>Dr. Robert Lopez</itunes:author>
      <author>Dr. Robert Lopez</author>
    </item>
    <item>
      <title>Stepwise Solutions in Maple</title>
      <link>http://www.mapleprimes.com/maplesoftblog/87638-Stepwise-Solutions-In-Maple?ref=Feed:MaplePrimes:Maplesoft Blog</link>
      <itunes:summary>&lt;p&gt;Three recent articles in the Tips &amp;amp; Techniques series addressed the question of stepwise solutions in Maple. Just what is it that Maple provides by way of stepwise solutions for standard calculations in the mathematical curricula?   There are commands, assistants, tutors, and task templates that provide stepwise calculations in precalculus, calculus, linear algebra, and vector calculus. In addition, since Maple can implement nearly any mathematical operation, any stepwise calculation can be reproduced in Maple by assembling the appropriate intermediate steps, just as they would be assembled when working with pencil and paper.&lt;/p&gt;</itunes:summary>
      <description>&lt;p&gt;Three recent articles in the Tips &amp;amp; Techniques series addressed the question of stepwise solutions in Maple. Just what is it that Maple provides by way of stepwise solutions for standard calculations in the mathematical curricula?   There are commands, assistants, tutors, and task templates that provide stepwise calculations in precalculus, calculus, linear algebra, and vector calculus. In addition, since Maple can implement nearly any mathematical operation, any stepwise calculation can be reproduced in Maple by assembling the appropriate intermediate steps, just as they would be assembled when working with pencil and paper.&lt;/p&gt;</description>
      <guid>87638</guid>
      <pubDate>Wed, 12 May 2010 04:00:00 Z</pubDate>
      <enclosure url="http://www.maplesoft.com/view.aspx?SF=87638/268415\StepwiseSolutions.mw" length="152576" type="" />
      <itunes:author>Dr. Robert Lopez</itunes:author>
      <author>Dr. Robert Lopez</author>
    </item>
    <item>
      <title>Some first thoughts on MapleSim 4</title>
      <link>http://www.mapleprimes.com/maplesoftblog/87606-Some-First-Thoughts-On-MapleSim-4?ref=Feed:MaplePrimes:Maplesoft Blog</link>
      <itunes:summary>&lt;p&gt;I have to thank my friend John Wass, an editor from Scientific Computing  magazine who began a recent article with the clear warning &amp;ldquo;Attention  Engineers! The developers at Maplesoft rarely sit still for very long.&amp;rdquo;&amp;nbsp;  This was a comment on the thrilling speed that enhancements are flowing  from the MapleSim pipeline. Although his quote refers to a MapleSim 3  article he wrote, I chuckled as the sentiment still rings true as my  colleagues and I catch our breaths after the recent release of MapleSim  4.&amp;nbsp; Yes, the engineering community has definitely taken notice that  MapleSim, in such a short amount of time, is already making a big  difference in the way we do and think about modeling.&lt;/p&gt;</itunes:summary>
      <description>&lt;img src="/view.aspx?si=87606/268306\MapleSim4_3D.jpg" alt="Some first thoughts on MapleSim 4" align="left"/&gt;&lt;p&gt;I have to thank my friend John Wass, an editor from Scientific Computing  magazine who began a recent article with the clear warning &amp;ldquo;Attention  Engineers! The developers at Maplesoft rarely sit still for very long.&amp;rdquo;&amp;nbsp;  This was a comment on the thrilling speed that enhancements are flowing  from the MapleSim pipeline. Although his quote refers to a MapleSim 3  article he wrote, I chuckled as the sentiment still rings true as my  colleagues and I catch our breaths after the recent release of MapleSim  4.&amp;nbsp; Yes, the engineering community has definitely taken notice that  MapleSim, in such a short amount of time, is already making a big  difference in the way we do and think about modeling.&lt;/p&gt;</description>
      <guid>87606</guid>
      <pubDate>Wed, 05 May 2010 04:00:00 Z</pubDate>
      <itunes:author>Tom Lee</itunes:author>
      <author>Tom Lee</author>
    </item>
    <item>
      <title>Making the obvious…well…obvious</title>
      <link>http://www.mapleprimes.com/maplesoftblog/82841-Making-The-Obviouswellobvious?ref=Feed:MaplePrimes:Maplesoft Blog</link>
      <itunes:summary>&lt;p class="MsoNormal"&gt;Sometimes the obvious escapes me, and it&amp;rsquo;s only due  to some chance observation that I realize the same fundamental principles are  everywhere.&lt;/p&gt;
&lt;p class="MsoNormal"&gt;A short time ago, I created a simple hydraulic  network in MapleSim, and after experimenting with some of the parameters, found it  gave the same behaviour as an electric circuit I&amp;rsquo;d modeled earlier.&lt;/p&gt;</itunes:summary>
      <description>&lt;p class="MsoNormal"&gt;Sometimes the obvious escapes me, and it&amp;rsquo;s only due  to some chance observation that I realize the same fundamental principles are  everywhere.&lt;/p&gt;
&lt;p class="MsoNormal"&gt;A short time ago, I created a simple hydraulic  network in MapleSim, and after experimenting with some of the parameters, found it  gave the same behaviour as an electric circuit I&amp;rsquo;d modeled earlier.&lt;/p&gt;</description>
      <guid>82841</guid>
      <pubDate>Tue, 04 May 2010 04:00:00 Z</pubDate>
      <itunes:author>Samir Khan</itunes:author>
      <author>Samir Khan</author>
    </item>
  </channel>
</rss>