Authors Konstantinos N. Anagnostopoulos
License CC-BY-SA-4.0
COMPUTATIONAL PHYSICS A Practical Introduction to Computational Physics and Scientific Computing Athens, 2014 KONSTANTINOS N. ANAGNOSTOPOULOS National Technical University of Athens National Technical University of Athens COMPUTATIONAL PHYSICS A Practical Introduction to Computational Physics and Scientific Computing AUTHORED BY KONSTANTINOS N. ANAGNOSTOPOULOS Physics Department, National Technical University of Athens, Zografou Campus, 15780 Zografou, Greece konstant@mail.ntua.gr, www.physics.ntua.gr/˜konstant/ PUBLISHED BY KONSTANTINOS N. ANAGNOSTOPOULOS and the NATIONAL TECHNICAL UNIVERSITY OF ATHENS Book Website: www.physics.ntua.gr/˜konstant/ComputationalPhysics ©Konstantinos N. Anagnostopoulos 2014, 2016 First Published 2014 Version¹ 1.1.20161207095000 Cover: Design by K.N. Anagnostopoulos. The front cover picture is a snapshot taken during Monte Carlo sim- ulations of hexatic membranes. Work done with Mark J. Bowick. Relevant video at youtu.be/Erc7Q6YXfLk ⃝ CC This book and its cover(s) are subject to copyright. They are licensed under the Creative Commons Attribution-ShareAlike 4.0 International License. To view a copy of this license, visit creativecommons.org/licenses/by-sa/4.0/ The book is accompanied by software available at the book’s website. All the software, unless the copyright does not belong to the author, is open source, covered by the GNU public license, see www.gnu.org/licenses/. This is explicitly mentioned at the end of the respective source files. ISBN 978-1-312-46441-4 (lulu.com, vol. I) ISBN 978-1-312-46488-9 (lulu.com, vol. II) ¹The first number is the major version, corresponding to an “edition” of a conventional book. Versions differing by major numbers have been altered substantially. Chapter numbers and page references are not guaranteed to match between different versions. The second number is the minor version. Versions differing by a minor version may have serious errors/typos corrected and/or substantial text modifications. Versions differing by only the last number may have minor typos corrected, added references etc. When reporting errors, please mention the version number you are referring to. Contents Foreword vii 1 The Computer 1 1.1 The Operating System . . . . . . . . . . . . . . . . . . . . . 3 1.1.1 Filesystem . . . . . . . . . . . . . . . . . . . . . . . . 3 1.1.2 Commands . . . . . . . . . . . . . . . . . . . . . . . 11 1.1.3 Looking for Help . . . . . . . . . . . . . . . . . . . . 14 1.2 Text Processing Tools – Filters . . . . . . . . . . . . . . . . 16 1.3 Programming with Emacs . . . . . . . . . . . . . . . . . . . 21 1.3.1 Calling Emacs . . . . . . . . . . . . . . . . . . . . . . 21 1.3.2 Interacting with Emacs . . . . . . . . . . . . . . . . 23 1.3.3 Basic Editing . . . . . . . . . . . . . . . . . . . . . . 24 1.3.4 Cut and Paste . . . . . . . . . . . . . . . . . . . . . . 27 1.3.5 Windows . . . . . . . . . . . . . . . . . . . . . . . . 29 1.3.6 Files and Buffers . . . . . . . . . . . . . . . . . . . . 30 1.3.7 Modes . . . . . . . . . . . . . . . . . . . . . . . . . . 31 1.3.8 Emacs Help . . . . . . . . . . . . . . . . . . . . . . . 32 1.3.9 Emacs Customization . . . . . . . . . . . . . . . . . 34 1.4 The Fortran Programming Language . . . . . . . . . . . . 35 1.4.1 The Foundation . . . . . . . . . . . . . . . . . . . . 35 1.4.2 Details . . . . . . . . . . . . . . . . . . . . . . . . . . 45 1.4.3 Arrays . . . . . . . . . . . . . . . . . . . . . . . . . . 50 1.5 Gnuplot . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 1.6 Shell Scripting . . . . . . . . . . . . . . . . . . . . . . . . . 62 2 Kinematics 77 2.1 Motion on the Plane . . . . . . . . . . . . . . . . . . . . . . 77 2.1.1 Plotting Data . . . . . . . . . . . . . . . . . . . . . . 85 2.1.2 More Examples . . . . . . . . . . . . . . . . . . . . . 88 2.2 Motion in Space . . . . . . . . . . . . . . . . . . . . . . . . 99 2.3 Trapped in a Box . . . . . . . . . . . . . . . . . . . . . . . . 107 iii iv CONTENTS 2.3.1 The One Dimensional Box . . . . . . . . . . . . . . 108 2.3.2 Errors . . . . . . . . . . . . . . . . . . . . . . . . . . 114 2.3.3 The Two Dimensional Box . . . . . . . . . . . . . . 117 2.4 Applications . . . . . . . . . . . . . . . . . . . . . . . . . . . 121 2.5 Problems . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140 3 Logistic Map 145 3.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . 145 3.2 Fixed Points and 2n Cycles . . . . . . . . . . . . . . . . . . 147 3.3 Bifurcation Diagrams . . . . . . . . . . . . . . . . . . . . . 154 3.4 The Newton-Raphson Method . . . . . . . . . . . . . . . . 157 3.5 Calculation of the Bifurcation Points . . . . . . . . . . . . . 163 3.6 Liapunov Exponents . . . . . . . . . . . . . . . . . . . . . . 167 3.7 Problems . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180 4 Motion of a Particle 191 4.1 Numerical Integration of Newton’s Equations . . . . . . . . 191 4.2 Prelude: Euler Methods . . . . . . . . . . . . . . . . . . . . 192 4.3 Runge–Kutta Methods . . . . . . . . . . . . . . . . . . . . . 204 4.3.1 A Program for the 4th Order Runge–Kutta . . . . . 208 4.4 Comparison of the Methods . . . . . . . . . . . . . . . . . . 212 4.5 The Forced Damped Oscillator . . . . . . . . . . . . . . . . 215 4.6 The Forced Damped Pendulum . . . . . . . . . . . . . . . . 222 4.7 Appendix: On the Euler–Verlet Method . . . . . . . . . . . 229 4.8 Appendix: 2nd order Runge–Kutta Method . . . . . . . . 233 4.9 Problems . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236 5 Planar Motion 241 5.1 Runge–Kutta for Planar Motion . . . . . . . . . . . . . . . 241 5.2 Projectile Motion . . . . . . . . . . . . . . . . . . . . . . . . 246 5.3 Planetary Motion . . . . . . . . . . . . . . . . . . . . . . . . 252 5.4 Scattering . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256 5.4.1 Rutherford Scattering . . . . . . . . . . . . . . . . . 260 5.4.2 More Scattering Potentials . . . . . . . . . . . . . . . 267 5.5 More Particles . . . . . . . . . . . . . . . . . . . . . . . . . . 270 5.6 Problems . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281 6 Motion in Space 285 6.1 Adaptive Stepsize Control for Runge–Kutta Methods . . . . 286 6.2 Motion of a Particle in an EM Field . . . . . . . . . . . . . 295 6.3 Relativistic Motion . . . . . . . . . . . . . . . . . . . . . . . 296 CONTENTS v 6.4 Problems . . . . . . . . . . . . . . . . . . . . . . . . . . . . 307 7 Electrostatics 311 7.1 Electrostatic Field of Point Charges . . . . . . . . . . . . . . 311 7.2 The Program – Appetizer and ... Desert . . . . . . . . . . . 314 7.3 The Program – Main Dish . . . . . . . . . . . . . . . . . . . 323 7.4 The Program - Conclusion . . . . . . . . . . . . . . . . . . . 329 7.5 Electrostatic Field in the Vacuum . . . . . . . . . . . . . . . 334 7.6 Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 341 7.7 Poisson Equation . . . . . . . . . . . . . . . . . . . . . . . . 342 7.8 Problems . . . . . . . . . . . . . . . . . . . . . . . . . . . . 349 8 Diffusion Equation 353 8.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . 353 8.2 Heat Conduction in a Thin Rod . . . . . . . . . . . . . . . . 355 8.3 Discretization . . . . . . . . . . . . . . . . . . . . . . . . . . 356 8.4 The Program . . . . . . . . . . . . . . . . . . . . . . . . . . 358 8.5 Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 361 8.6 Diffusion on the Circle . . . . . . . . . . . . . . . . . . . . . 363 8.7 Analysis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 366 8.8 Problems . . . . . . . . . . . . . . . . . . . . . . . . . . . . 370 9 The Anharmonic Oscillator 373 9.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . 373 9.2 Calculation of the Eigenvalues of Hnm (λ) . . . . . . . . . . 375 9.3 Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 384 9.4 The Double Well Potential . . . . . . . . . . . . . . . . . . . 390 9.5 Problems . . . . . . . . . . . . . . . . . . . . . . . . . . . . 398 10 Time Independent Schrödinger Equation 401 10.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . 401 10.2 The Infinite Potential Well . . . . . . . . . . . . . . . . . . . 404 10.3 Bound States . . . . . . . . . . . . . . . . . . . . . . . . . . 415 10.4 Measurements . . . . . . . . . . . . . . . . . . . . . . . . . . 425 10.5 The Anharmonic Oscillator - Again... . . . . . . . . . . . . 431 10.6 The Lennard–Jones Potential . . . . . . . . . . . . . . . . . 435 10.7 Problems . . . . . . . . . . . . . . . . . . . . . . . . . . . . 438 11 The Random Walker 443 11.1 (Pseudo)Random Numbers . . . . . . . . . . . . . . . . . . 444 11.2 Using Pseudorandom Number Generators . . . . . . . . . . 456 vi CONTENTS 11.3 Random Walks . . . . . . . . . . . . . . . . . . . . . . . . . 463 11.4 Problems . . . . . . . . . . . . . . . . . . . . . . . . . . . . 471 12 Monte Carlo Simulations 475 12.1 Statistical Physics . . . . . . . . . . . . . . . . . . . . . . . . 476 12.2 Entropy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 479 12.3 Fluctuations . . . . . . . . . . . . . . . . . . . . . . . . . . . 483 12.4 Correlation Functions . . . . . . . . . . . . . . . . . . . . . 485 12.5 Sampling . . . . . . . . . . . . . . . . . . . . . . . . . . . . 487 12.5.1 Simple Sampling . . . . . . . . . . . . . . . . . . . . 488 12.5.2 Importance Sampling . . . . . . . . . . . . . . . . . 489 12.6 Markov Processes . . . . . . . . . . . . . . . . . . . . . . . . 490 12.7 Detailed Balance Condition . . . . . . . . . . . . . . . . . . 491 12.8 Problems . . . . . . . . . . . . . . . . . . . . . . . . . . . . 493 13 Simulation of the d = 2 Ising Model 495 13.1 The Ising Model . . . . . . . . . . . . . . . . . . . . . . . . 495 13.2 Metropolis . . . . . . . . . . . . . . . . . . . . . . . . . . . . 501 13.3 Implementation . . . . . . . . . . . . . . . . . . . . . . . . . 504 13.3.1 The Program . . . . . . . . . . . . . . . . . . . . . . 509 13.3.2 Towards a Convenient User Interface . . . . . . . . . 515 13.4 Thermalization . . . . . . . . . . . . . . . . . . . . . . . . . 527 13.5 Autocorrelations . . . . . . . . . . . . . . . . . . . . . . . . 529 13.6 Statistical Errors . . . . . . . . . . . . . . . . . . . . . . . . 535 13.6.1 Errors of Independent Measurements . . . . . . . . 537 13.6.2 Jackknife . . . . . . . . . . . . . . . . . . . . . . . . 539 13.6.3 Bootstrap . . . . . . . . . . . . . . . . . . . . . . . . 542 13.7 Appendix: Autocorrelation Function . . . . . . . . . . . . . 543 13.8 Appendix: Error Analysis . . . . . . . . . . . . . . . . . . . 550 13.8.1 The Jackknife Method . . . . . . . . . . . . . . . . . 550 13.8.2 The Bootstrap Method . . . . . . . . . . . . . . . . . 555 13.8.3 Comparing the Methods . . . . . . . . . . . . . . . . 558 13.9 Problems . . . . . . . . . . . . . . . . . . . . . . . . . . . . 562 14 Critical Exponents 571 14.1 Critical Slowing Down . . . . . . . . . . . . . . . . . . . . . 573 14.2 Wolff Cluster Algorithm . . . . . . . . . . . . . . . . . . . . 574 14.3 Implementation . . . . . . . . . . . . . . . . . . . . . . . . . 581 14.3.1 The Program . . . . . . . . . . . . . . . . . . . . . . 583 14.4 Production . . . . . . . . . . . . . . . . . . . . . . . . . . . 588 14.5 Data Analysis . . . . . . . . . . . . . . . . . . . . . . . . . . 591 CONTENTS vii 14.6 Autocorrelation Times . . . . . . . . . . . . . . . . . . . . . 599 14.7 Temperature Scaling . . . . . . . . . . . . . . . . . . . . . . 604 14.8 Finite Size Scaling . . . . . . . . . . . . . . . . . . . . . . . 608 14.9 Calculation of βc . . . . . . . . . . . . . . . . . . . . . . . . 611 14.10Studying Scaling with Collapse . . . . . . . . . . . . . . . . 615 14.11Binder Cumulant . . . . . . . . . . . . . . . . . . . . . . . . 625 14.12Appendix: Scaling . . . . . . . . . . . . . . . . . . . . . . . 629 14.12.1Binder Cumulant . . . . . . . . . . . . . . . . . . . . 629 14.12.2Scaling . . . . . . . . . . . . . . . . . . . . . . . . . . 634 14.12.3Finite Size Scaling . . . . . . . . . . . . . . . . . . . 636 14.13Appendix: Critical Exponents . . . . . . . . . . . . . . . . . 639 14.13.1Definitions . . . . . . . . . . . . . . . . . . . . . . . . 639 14.13.2Hyperscaling Relations . . . . . . . . . . . . . . . . . 640 14.14Problems . . . . . . . . . . . . . . . . . . . . . . . . . . . . 640 Bibliography 644 Index 652 viii CONTENTS This book has been written assuming that the reader executes all the commands presented in the text and follows all the instructions at the same time. If this advice is neglected, then the book will be of little help and some parts of the text may seem incomprehensible. The book’s website is at http://www.physics.ntua.gr/˜konstant/ComputationalPhysics/ From there, you can can download the accompanying software, which con- tains, among other things, all the programs presented in the book. Some conventions: Text using the font shown below refers to com- mands given using a shell (the “command line”), input and output of programs, code written in Fortran (or any other programming language), as well as to names of files and programs: > echo Hello world Hello world When a line starts with the prompt > then the text that follows is a command, which can be given from the command line of a terminal. The second line, Hello World, is the output of the command. The contents of a file with Fortran code is listed below: program add z = 1.0 y = 2.0 x = z + y print * , x end program add What you need in order to work on your PC: CONTENTS ix • An operating system of the GNU/Linux family and its basic tools. • A Fortran compiler. The gfortran compiler is freely available for all major operating systems under an open source license at http://www.gfortran.org. • An advanced text editor, suitable for editing code in several pro- gramming languages, like Emacs². • A good plotting program, suitable for data analysis, like gnuplot³. • The shell tcsh⁴. • The programs awk⁵, grep, sort, cat, head, tail, less. Make sure that they are available in your computer environment. If you have installed a GNU/Linux distribution on your computer, all of the above can be installed easily. For example, in a Debian like distribution (Ubuntu, ...) the commands > sudo apt−get install tcsh emacs gnuplot−x11 gnuplot−doc > sudo apt−get install gfortran gawk gawk−doc binutils > sudo apt−get install manpages−dev coreutils liblapack3 install all the necessary tools. If you don’t wish to install GNU/Linux on your computer, you can try the following: • Boot your computer using a usb/DVD live GNU/Linux, like Ubuntu⁶. This will not make any permanent changes in your hard drive but it will start and run slower. On the other hand, you may save all your computing environment and documents and use it on any computer you like. • Install Cygwin⁷ in your Microsoft Windows. It is a very good solu- tion for Microsoft-addicted users. If you choose the full installation, then you will find all the tools needed in this book. ²http://www.gnu.org/software/emacs/ ³http://www.gnuplot.info ⁴http://www.tcsh.org ⁵http://www.gnu.org/software/gawk ⁶http://www.ubuntu.com ⁷http://www.cygwin.com x CONTENTS • Mac OS X is based on Unix. It is possible to install all the software needed in this book and follow the material as presented. Search the internet for instructions, e.g. google “gfortran for Mac”, “emacs for Mac”, “tcsh for Mac”, etc. Foreword This book is the culmination of my ten years’ experience in teaching three introductory, undergraduate level, scientific computing/computational physics classes at the National Technical University of Athens. It is suit- able mostly for junior or senior level science courses, but I am currently teaching its first chapters to sophomores without a problem. A two semester course can easily cover all the material in the book, including lab sessions for practicing. Why another book in computational physics? Well, when I started teaching those classes there was no bibliography available in Greek, so I was compelled to write lecture notes for my students. Soon, I realized that my students, majoring in physics or applied mathematics, were having a hard time with the technical details of programming and computing, rather than with the physics concepts. I had to take them slowly by the hand through the “howto” of computing, something that is reflected in the philosophy of this book. Hoping that this could be useful to a wider audience, I decided to translate these notes in English and put them in an order and structure that would turn them into “a book”. I also decided to make the book freely available on the web. I was partly motivated by my anger caused by the increase of academic (e)book prices to ridiculous levels during times of plummeting publishing costs. Publishers play a diminishing role in academic publishing. They get an almost ready-made manuscript in electronic form by the author. They need to take no serious investment risk on an edition, thanks to print- on-demand capabilities. They have virtually zero cost ebook publishing. Moreover, online bookstores have decreased costs quite a lot. Academic books need no advertisement budget, their success is due to their aca- demic reputation. I don’t see all of these reflected on reduced book prices, quite the contrary, I’m afraid. My main motivation, however, is the freedom that independent pub- lishing would give me in improving, expanding and changing the book in the future. It is great to have no length restrictions for the presenta- xi xii FOREWORD tion of the material, as well as not having to report to a publisher. The reader/instructor that finds the book long, can read/print the portion of the book that she finds useful for her. This is not a reference book. It uses some interesting, I hope, physics problems in order to introduce the student to the fundamentals of solv- ing a scientific problem numerically. At the same time, it keeps an eye in the direction of advanced and high performance scientific computing. The reader should follow the instructions given in each chapter, since the book teaches by example. Several skills are taught through the solution of a particular problem. My lectures take place in a (large) computer lab, where the students are simultaneously doing what I am doing (and more). The program that I am editing and the commands that I am executing are shown on a large screen, displaying my computer monitor and actions live. The book provides no systematic teaching of a program- ming language or a particular tool. A very basic introduction is given in the first chapter and then the reader learns whatever is necessary for the solution of her problem. There is more than one way to do it⁸ and the problems can be solved by following a basic or a fancy way, depending on the student’s computational literacy. The book provides the necessary tools for both. A bibliography is provided at the end of the book, so that the missing pieces of a puzzle can be sought in the literature. This is also not a computational physics playground. Of course I hope that the reader will have fun doing what is in the book, but my goal is to provide an experience that will set the solid foundation for her becoming a high performance computing, number crunching, heavy duty data analysis expert in the future. This is why the programming language of the core numerical algorithms has been chosen to be Fortran, a highly optimized, scientifically oriented, programming language. The computer environment is set in a Unix family operating system, enriched by all the powerful GNU tools provided by the FSF⁹. These tools are indispensable in the complicated data manipulation needed in scientific research, which requires flexibility and imagination. Of course, Fortran is not the best choice for heavy duty object oriented programming, and is not optimal for interacting with the operating system. The philosophy¹⁰ ⁸A Perl moto! ⁹Free Software Foundation, www.fsf.org. ¹⁰Java and C++ have been popular choices in computational physics courses. But object oriented programming is usually avoided in the high performance part of a com- putation. So, one usually uses those languages in a procedural style of programming, cheating herself that she is actually learning the advantages of object oriented program- ming. xiii is to let Fortran do what is best for, number crunching, and leave data manipulation and file administration to external, powerful tools. Tools, like awk, shell scripting, gnuplot, Perl and others, are quite powerful and complement all the weaknesses of Fortran mentioned before. The plotting program is chosen to be gnuplot, which provides very powerful tools to manipulate the data and create massive and complicated plots. It can also create publication quality plots and contribute to the “fun part” of the learning experience by creating animations, interactive 3d plots etc. All the tools used in the book are open source software and they are accessible to everyone for free. They can be used in a Linux environment, but they can also be installed and used in Microsoft Windows and Mac OS X. The other hard part in teaching computational physics to scientists and engineers is to explain that the approach of solving a problem nu- merically is quite different from solving it analytically. Usually, students of this level are coming with a background in analysis and fundamental physics. It is hard to put them into the mode of thinking about solving a problem using only additions, multiplications and some logical opera- tions. The hardest part is to explain the discretization of a model defined analytically, which can be done in many ways, depending on the accu- racy of the approximation. Then, one has to extrapolate the numerical solution, in order to obtain a good approximation of the analytic one. This is done step by step in the book, starting with problems in simple motion and ending with discussing finite size scaling in statistical physics models in the vicinity of a continuous phase transition. The book comes together with additional material which can be found at the web page of the book¹¹. The accompanying software contains all the computer programs presented in the book, together with useful tools and programs solving some of the exercises of each chapter. Each chapter has problems complementing the material covered in the text. The student needs to solve them in order to obtain hands on experience in scientific computing. I hope that I have already stressed enough that, in order for this book to be useful, it is not enough to be read in a café or in a living room, but one needs to do what it says. Hoping that this book will be useful to you as a student or as an instructor, I would like to ask you to take some time to send me feedback for improving and/or correcting it. I would also appreciate fan mail or, if you are an expert, a review of the book. If you use the book in a class, as a main textbook or as supplementary material, I would also be ¹¹www.physics.ntua.gr/˜konstant/ComputationalPhysics/ xiv FOREWORD thrilled to know about it. Send me email at konstantmail.ntua.gr and let me know if I can publish, anonymously or not, (part of) what you say on the web page (otherwise I will only use it privately for my personal ego-boost). Well, nothing is given for free: As one of my friends says, some people are payed in dollars and some others in ego-dollars! Have fun computing scientifically! Athens, 2014. Chapter 1 The Computer The aim of this chapter is to lay the grounds for the development of the computational skills which are necessary in the following chapters. It is not an in depth exposition but a practical training by example. For a more systematic study of the topics discussed, we refer to the bibliography. Many of the references are freely available in the web. The are many choices that one has to make when designing a com- puter project. These depend on the needs for numerical efficiency, on available programming hours, on the needs for extensibility and upgrad- ability and so on. In this book we will get the flavor of a project that is mostly scientifically and number crunching oriented. One has to make the best of the available computing resources and have powerful tools available for a productive analysis of the data. Such an environment, found in most of today’s supercomputers, that offers flexibility, depend- ability, simplicity, powerful tools for data analysis and effective compilers is provided by the family of the Unix operating systems. The GNU/Linux operating system is a Unix variant that is freely available and most of its utilities are open source software. The voluntary work of millions of excellent programmers worldwide has built the most stable, fastest and highest quality software available for scientific computing today. Thanks to the idea of the open source software pioneered by Richard Stallman¹ this giant collaboration has been made possible. Another choice that we have to make is the programming language, and this is going to be Fortran. Fortran has been built mainly for numer- ical applications and it has been used by many scientists and engineers because of its efficiency in high performance computing. The language is simple and compilers are able to optimize, parallelize and vectorize the ¹www.stallman.org 1 2 CHAPTER 1. THE COMPUTER code very efficiently. There is a lot of scientific and engineering software available in libraries written in Fortran, which has been used and tested extensively for many years. This is a crucial factor for scientific software, so that it can be trusted to be efficient and free of errors. Fortran is not the best choice for interacting with the operating system or for text processing. This shortcoming can be easily overcome by the use of ex- ternal tools and Fortran can be left to do what she has been designed for: number crunching. Its structure is simple and can be used both for procedural and object oriented programming, in such a way that, it will not make the life of an inexperienced programmer difficult, and at the same time provide high level, abstract and powerful tools for high performance, modular, object oriented, programming needed in a large and complicated project. Fortran, as well as other languages like C, C++ and Java, is a language that needs to be compiled by a compiler. Other languages, like perl, awk, shell scripting, Macsyma, Mathematica, Octave, Matlab, . . ., are interpreted line by line. These languages can be simple in their use, but they can be prohibitively slow when it comes to a numerically demanding program. A compiler is a tool that analyzes the whole program and optimizes the computer instructions executed by the computer. But if programming time is more valuable, then a simple, interpreted language can lead to faster results. Another choice that we make in this book, and we mention it because it is not the default in most Linux distributions, is the choice of shell. The shell is a program that “connects” the user to the operating system. In this book, we will teach how to use a shell² to “send” commands to the operating system, which is the most effective way to perform complicated tasks. We will use the shell tcsh, although most of the commands can be interpreted by most popular shells. Shell scripting is simpler in this shell, although shells like bash provide more powerful tools, mostly needed for complicated system administration tasks. That may cause a small inconvenience to some readers, since tcsh is not preinstalled in Linux distributions³. ²It is more popular to be called “the command line”, or the “terminal”, or the “console”, but in fact the user interaction is through a shell. ³See www.tcsh.org. On Debian like systems, like Ubuntu, installation is very simple through the software center or by the command sudo apt-get install tcsh. 1.1. THE OPERATING SYSTEM 3 1.1 The Operating System The Unix family of operating systems offer an environment where com- plicated tasks can be accomplished by combining many different tools, each of which performs a distinct task. This way, one can use the power of each tool, so that trivial but complicated parts of a calculation don’t have to be programmed. This makes the life of a researcher much easier and much more productive, since research requires from us to try many things before we understand how to compute what we are looking for. In the Unix operating system everything is a file, and files are or- ganized in a unique and unified filesystem. Documents, pictures, music, movies, executable programs are files. But also directories or devices, like hard disks, monitors, mice, sound cards etc, are, from the point of view of the operating system, files. In order for a music file to be played by your computer, the music data needs to be written to a device file, connected by the operating system to the sound card. The characters you type in a terminal are read from a file “the keyboard”, and written to a file “the monitor” in order to be displayed. Therefore, the first thing that we need to understand is the structure of the Unix filesystem. 1.1.1 Filesystem There is at least one path in the filesystem associated with each file. There are two types of paths, relative paths and absolute paths. These are two examples: bin / RungeKutta / rk . exe / home / george / bin / RungeKutta / rk . exe The paths shown above may refer to the same or a different file. This depends on “where we are”. If “we are” in the directory /home/george, then both paths refer to the same file. If on the other way “we are” in a directory /home/john or /home/george/CompPhys, then the paths refer⁴ to two different files. In the last two cases, the paths refer to the files / home / john / bin / RungeKutta / rk . exe / home / george / CompPhys / bin / RungeKutta / rk . exe ⁴Some times two or more paths refer to the same file, or as we say, a file has two or more “links” in the same filesystem, but let’s keep it simple for the moment. 4 CHAPTER 1. THE COMPUTER respectively. How can we tell the difference? An absolute path always begins with the / character, whereas a relative path does not. When we say that “we are in a directory”, we refer to a position in the filesystem called the current directory, or working directory. Every process in the operating system has a unique current directory associated with it. Figure 1.1: The Unix filesystem. It looks like a tree, with the root directory / at the top and branches that connect directories with their parents. Every directory contains files, among them other directories called its subdirectories. Every directory has a unique parent directory, noted by .. (double dots). The parent of the root directory is itself. The filesystem is built on its root and looks like a tree positioned upside down. The symbol of the root is the character / The root is a directory. Every directory is a file that contains a list of files, and it is connected to a unique directory, its parent directory . Its list of files contains other directories, called its subdirectories, which all have it as their parent directory. All these files are the contents of the directory. Therefore, the filesystem is a tree of directories with the root directory at its top which branch to its subdirectories, which in their turn branch into other subdirectories and so on. There is practically no limit to how 1.1. THE OPERATING SYSTEM 5 large this tree can become, even for a quite demanding environment⁵. A path consists of a string of characters, with the characters / sep- arating its components, and refers to a unique location in the filesystem. Every component refers to a file. All, but the last one, must be directories in a hierarchy, from parent directory to subdirectory. The only exception is a possible / in the beginning, which refers to the root directory. Such an example can be seen in figure 1.1. In a Unix filesystem there is complete freedom in the choice of the loca- tion of the files⁶. Fortunately, there are some universally accepted conven- tions respected by almost everyone. One expects to find home directories in the directory /home, configuration files in the directory /etc, appli- cation executables in directories with names such as /bin, /usr/bin, /usr/local/bin, software libraries in directories with names such as /lib, /usr/lib etc. There are some important conventions in the naming of the paths. A single dot “.” refers to the current directory and a double dot “..” to the parent directory. Similarly, a tilde “~” refers to the home directory of the user. Assume, e.g., that we are the user george running a process with a current directory /home/george/Music/Rock (see figure 1.1). Then, the following paths refer to the same file /home/george/Doc/lyrics.doc: . . / . . / Doc / lyrics . doc ~/ Doc / lyrics . doc ~george / Doc / lyrics . doc . / . . / . . / Doc / lyrics . doc Notice that ~ and ~george refer to the home directory of the user george (ourselves), whereas ~mary refer to the home directory of another user, mary. We are now going to introduce the basic commands for filesystem navigation and manipulation⁷. The command cd (=change directory) ⁵Of course, the capacity of the filesystem is finite, issue the command “df -i .” in order to see the number of inodes available in your filesystem. Every file corresponds to one and only one inode of the filesystem. Every path is mapped to a unique inode, but an inode maybe pointed to by more than one paths. ⁶This gives a great sense of freedom, but historically this was a important factor that led the Unix operating systems, although superior in quality, not to win a fair share of the market! The Linux family tries to keep things simple and universal to a large extent, but one should be aware that because of this freedom files in different version of Linuxes or Unices can be in different places. ⁷Remember that lines that begin with the > character are commands. All other lines refer to the output of the commands. 6 CHAPTER 1. THE COMPUTER changes the current directory, whereas the command pwd (=print working directory) prints the current directory: > cd / usr / bin > pwd / usr / bin > cd / usr / local / lib > pwd / usr / local / lib > cd > pwd / home / george > cd − > pwd / usr / local / lib > cd . . / . . / > pwd / usr The argument of the command cd is an absolute or a relative path. If the path is correct and we have the necessary permissions, the command changes the current directory to this path. If no path is given, then the current directory changes to the home directory of the user. If the character - is given instead of a path, then the command changes the current directory to the previous current directory. The command mkdir creates new directories, whereas the command rmdir removes empty directories. Try: > mkdir new > mkdir new / 0 1 > mkdir new / 0 1 / 0 2 / 0 3 mkdir : cannot create directory ‘ new / 0 1 / 0 2 / 0 3 ’ : No such file or directory > mkdir −p new / 0 1 / 0 2 / 0 3 > rmdir new rmdir : ‘ new ’ : Directory not empty > rmdir new / 0 1 / 0 2 / 0 3 > rmdir new / 0 1 / 0 2 > rmdir new / 0 1 > rmdir new Note that the command mkdir cannot create directories more than one level down the filesystem, whereas the command mkdir -p can. The “switch” -p makes the behavior of the command different than the default one. 1.1. THE OPERATING SYSTEM 7 In order to list the contents of a directory, we use the command ls (=list): > ls BE . eps Byz . eps Programs srBE_xyz . eps srB_xyz . eps B . eps Bzy . eps srBd_xyz . eps srB_xy . eps > l s Programs Backup rk3_Byz . f90 rk3 . f90 plot−commands rk3_Bz . f90 rk3_g . f90 The first command is given without an argument and it lists the con- tents of the current directory. The second one, lists the contents of the subdirectory of the current directory Programs. If the argument is a list of paths pointing to regular files, then the command prints the names of the paths. Another way of giving the command is total 252 -rw-r--r-- 1 george users 24284 May 1 12:08 BE . eps -rw-r--r-- 1 george users 22024 May 1 11:53 B . eps -rw-r--r-- 1 george users 29935 May 1 13:02 Byz . eps -rw-r--r-- 1 george users 48708 May 1 12:41 Bzy . eps drwxr -xr-x 4 george users 4096 May 1 23:38 Programs -rw-r--r-- 1 george users 41224 May 1 22:56 srBd_xyz . eps -rw-r--r-- 1 george users 23187 May 1 21:13 srBE_xyz . eps -rw-r--r-- 1 george users 24610 May 1 20:29 srB_xy . eps -rw-r--r-- 1 george users 23763 May 1 20:29 srB_xyz . eps The switch -l makes ls to list the contents of the current directory to- gether with useful information on the files in 9 columns. The first column lists the permissions of the files (see below). The second one lists the num- ber of links of the files⁸. The third one lists the user who is the owner of each file. The fourth one lists the group that is assigned to the files. The fifth one lists the size of the file in bytes (=8 bits). The next three ones list the modification time of the file and the last one the paths of the files. File permissions⁹ are separated in three classes: owner permissions, group permissions and other permissions. Each class is given three spe- cific permissions, r=read, w=write and x=execute. For regular files, read permission effectively means access to the file for reading/copying, write permission means permission to modify the contents of the file and ex- ⁸For a directory it means the number of its subdirectories plus 2 (the parent directory and itself). For a regular file, it shows how many paths in the filesystem point to this file. ⁹See the “File system permissions” entry in en.wikipedia.org. 8 CHAPTER 1. THE COMPUTER ecute permission means permission to execute the file as a command¹⁰. For directories, read permission means that one is able to read the names of the files in the directory (but not make it as current directory with the cd command), write permission means to be able to modify its contents (i.e. create, delete, and rename files) and execute permission grants per- mission to access/modify the contents of the files (but not list the names of the files, this is granted by the read permission). The command ls -l lists permissions in three groups. The owner (positions 2-4), the group (positions 5-7) and the rest of the world (others - positions 8-10). For example -rw-r--r-- -rwxr----- drwx--x--x In the first case, the owner has read and write but not execute permissions and the group+others have only read permissions. In the second case, the user has read, write and execute permissions, the group has read permissions and others have no permissions at all. In the last case, the user has read, write and execute permissions, whereas the group and the world have only execute permissions. The first character d indicates a special file, which in this case is a directory. All special files have this position set to a character, while regular files have it set to -. File permissions can be modified by using the command chmod: > chmod u+x file > chmod og−w file1 file2 > chmod a+r file Using the first command, the owner (u≡ user) obtains (+) permission to execute (x) the file named file. Using the second one, the rest of the world (o≡ others) and the group (g≡group) loose (-) the write (w) permission to the files named file1 and file2. Using the third one, everyone (a≡all) obtain read (r) permission on the file named file. We will close this section by discussing some commands which are used for administering files in the filesystem. The command cp (copy) copies the contents of files into other files: > cp file1 . f90 file2 . f90 ¹⁰Of course it is the user’s responsibility to make sure the file with execute permission is actually a program that is possible to execute. An error results if this is not the case. 1.1. THE OPERATING SYSTEM 9 > cp file1 . f90 file2 . f90 file3 . f90 Programs If the file file2.f90 does not exist, the first command copies the contents of file1.f90 to a new file file2.f90. If it already exists, it replaces its contents by the contents of the file file2.f90. In order for the second command to be executed, Programs needs to be a directory. Then, the contents of the files file1.f90, file2.f90, file3.f90 are copied to indentical files in the directory Programs. Of course, we assume that the user has the appropriate privileges for the command to be executed successfully. The command mv “moves”, or renames, files: > mv file1 . f90 file2 . f90 > mv file1 . f90 file2 . f90 file3 . f90 Programs The first command renames the file file1.f90 to file2.f90. The second one moves files file1.f90, file2.f90, file3.f90 into the directory Programs. The command rm (remove) deletes files¹¹. Beware, the command is unforgiving: after deletion, a file cannot be restored into the filesystem¹². Therefore, after executing successfully the following commands > ls file1 . f90 file2 . f90 file3 . f90 file4 . csh > rm file1 . f90 file2 . f90 file3 . f90 > ls file4 . csh the files file1.f90, file2.f90, file3.f90 do not exist in the filesystem anymore. A more prudent use of the command demands the flag -i. Then, before deletion we are asked for confirmation: > rm −i * rm : remove regular file ‘ file1 . f90 ’ ? y rm : remove regular file ‘ file2 . f90 ’ ? y rm : remove regular file ‘ file3 . f90 ’ ? y rm : remove regular file ‘ file4 . csh ’ ? n ¹¹Actually it removes “links” from files. A file may have more than one links in the same partition of a filesystem. A file is deleted when its last link is removed. ¹²This does not mean that its contents have been deleted from the disk. Deletion means marking for overwriting. Until the data is overwritten it can be recovered by the use of special tools. Shredding sensitive data can be tricky business... 10 CHAPTER 1. THE COMPUTER > ls file4 . csh When we type y, the file is deleted, when we type n, the file is not deleted. We cannot remove directories the same way. It is possible to use the command rmdir in order to remove empty directories. In order to delete directories together with their contents (including subdirectories and their contents) use the command¹³ rm -r. For example, assume that the contents of the directories dir1 and dir1/dir2 are the files: . / dir1 . / dir1 / file2 . f90 . / dir1 / file1 . f90 . / dir1 / dir2 . / dir1 / dir2 / file3 . f90 Then the results of the following commands are: > rm dir1 rm : cannot remove ‘ dir1 ’ : Is a directory > rm dir1 / dir2 rm : cannot remove ‘ dir1 / dir2 ’ : Is a directory > rmdir dir1 rmdir : dir1 : Directory not empty > rmdir dir1 / dir2 rmdir : dir1 / dir2 : Directory not empty > rm −r dir1 The last command removes all files (assuming that we have write per- missions for all directories and subdirectories). Alternatively, we can empty the contents of all directories first, and then remove them with the command rmdir: > cd dir1 / dir2 ; rm file3 . f90 > cd . . ; rmdir dir2 > rm file1 . f90 file2 . f90 > cd . . ; rmdir dir1 Note that by using a semicolon, we can execute two or more commands on the same line. ¹³A small mistake, like rm -rf * and your data is ... history! 1.1. THE OPERATING SYSTEM 11 1.1.2 Commands Commands in a Unix operating system are files with execute permission. When we write a sentence on the command line, like > l s −l test . f90 test . dat the shell reads its and interprets it. The shell is a program that creates a interface between a user and the operating system. The first word (ls) of the sentence is interpreted as a command. The rest of the words are the arguments of the command and the program can use them (or not) at the discretion of its programmer. There is a special convention for arguments that begin with a - (e.g. -l, --help, --version, -O3). They are called options or switches, and they act as virtual switches that make the program act in a particular way. We have already seen that the program ls gives a different output with the switch -l. In order for a command to be executed, the shell looks for a file that has the same name as the command (here a file named ls). In order to understand where the shell looks for such a file, we should digress a little bit and explain the use of shell variables and environment variables. These have a name, which is a string of permissible characters, and their values are obtained by preceding their name with the $ character. For example the variable PATH has value $PATH. The values of the environment variables can be set with the command¹⁴ setenv and of the shell variables with the command set: > s e t e n v MYVAR test−env > s e t myvar = test−s h e l l > echo $MYVAR $myvar test−env test−s h e l l Two special variables are the variables PATH and path: >echo $PATH / usr / local / bin : / usr / bin : / bin : / usr / X11 / bin >echo $path / usr / local / bin / usr / bin / bin / usr / X11 / bin The first one is an environment variable and the second one is a shell variable. Their values are set by the shell, and we don’t need to worry ¹⁴The command setenv is special to the tcsh shell. For example the bash shell uses the syntax MYVAR=test-env in order to set the value of an environment variable. 12 CHAPTER 1. THE COMPUTER about them, unless we want to change them. Their value is a string of characters whose components should be valid paths to directories. In the first case, the components are separated by a :, while in the second case, by one or more spaces. In the example shown above, the shell searches each component of the path or PATH variables (in this order) until it finds a file ls in their contents. If it succeeds and the file has execute permissions, then the program in this file is executed. If it fails, then it prints an error message. Try the commands: > which l s / bin / l s > l s −l / bin / l s −rwxr−xr−x 1 root root 93560 Sep 28 2006 / bin / l s We see that the program that the ls command executes the program in the file /bin/ls. The arguments of a command are passed on to the program that the command executes for possible interpretation. For example: > l s −l test . f90 test . dat The argument -l is the switch that results in a long listing of the files. The arguments test.f90 and test.dat are interpreted by the program ls as paths that it will look up for file information. You can use the * (wildcard) character as a shorthand notation for a group of files. For example, in the command shown below > l s −l * . f90 * . dat the shell will expand *.f90 and *.dat to a list of all files whose names end with .f90 or .dat. Therefore, if the current directory contains the files test.f90, test1.f90, myprog.f90, test.dat, hello.dat, the ar- guments that will be passed on to the command ls are > l s −l myprog . f90 test1 . f90 test . f90 hello . dat test . dat For each command there are three special files associated with it. The first one is the standard input (stdin), the second one is the standard output (stdout) and the third one the standard error (stderr). These are files where the program can print or read data from. By default, these files are the terminal that the user uses to execute the command. In this case, 1.1. THE OPERATING SYSTEM 13 when the program reads data from the stdin, then it reads the data that we type to the terminal using the keyboard. When the program writes data to the stdout or to the stderr, then the data is written to the terminal. The advantage of using these special files in order to read/write data is that the user can redirect the input/output to these files to any file she wants. Using the character > at the end of a command redirects the stdout to the file whose name is written after >. For example: > ls file1 . f90 file2 . f90 file3 . f90 file4 . csh > l s > results > ls file1 . f90 file2 . f90 file3 . f90 file4 . csh results The first of the above commands, prints the contents of the current work- ing directory to the terminal. The second command redirects data written to the stdout to the file results. After executing the command, the file results is created and its contents are the names of the files file1.f90 file2.f90 file3.f90 file4.csh. If the file results does not exist (as in the above example), the file is created. If it already exists, it is truncated and its contents replaced by the data written to the stdout of the com- mand. If we want to append data without erasing the existing contents, then we should use the string of characters >>. Therefore, if we give the command > l s >> results after executing the previous commands, then the contents of the file results will be file1 . f90 file2 . f90 file3 . f90 file4 . csh file1 . f90 file2 . f90 file3 . f90 file4 . csh results The redirection of the stdin is accomplished by the use of the char- acter < while that of the stderr by the use of the string of characters¹⁵ >&. We will see more examples in section 1.2. It is possible to redirect the stdout of a command to be the stdin of another command. This is very useful for creating filters. A filter is ¹⁵This syntax is particular to the tcsh shell. For other shells (bash, sh, ...) read their documentation. 14 CHAPTER 1. THE COMPUTER a command that creates a flow of data between two or more programs. This process is called piping. Pipes are creating by using the character | > cmd1 | cmd2 | cmd3 | ... | cmdN Using the syntax shown above, the stdout of the command cmd1 is redi- rected to the stdin of the command cmd2, the stdout of the command cmd2 is redirected to the stdin of the command cmd3 etc. More examples will be presented in section 1.2. 1.1.3 Looking for Help Unix got itself a reputation for not being user friendly. This is far from the truth. Although there is a steep learning curve, detailed documentation for almost everything is available online. The key for a comfortable ride is to learn how to use the help system available on your computer and on the internet. Most of the commands are self documented. A simple test, like the one shown below, will help you with the basic usage of most of the commands: > cmd --help > cmd -h > cmd -help > cmd -\? For example, try the command ls --help. For a window application, start from the menu “Help”. You should not be afraid and/or lazy and you should proceed with careful searching and reading. For example, let’s assume that you have heard about a command that sounds like printf, or something like that. The first level of online help is the man (=manual) command that searches the “man pages”. Read the output of the command > man p r i n t f The command info usually provides more detailed and user friendly documentation. It has basic browsing capabilities like the browsers you use to read pages from the internet. Try the command > info printf 1.1. THE OPERATING SYSTEM 15 Furthermore, the commands > man −k p r i n t f > whatis p r i n t f will inform you that there are other, possibly related, commands with names like fprintf, fwprintf, wprintf, sprintf...: > whatis p r i n t f printf (1) − format and p r i n t data printf (1 p ) − write formatted output printf (3) − formatted output conversion printf (3 p ) − p r i n t formatted output p r i n t f [ builtins ] (1) − bash built−in commands , see bash←- (1) The second column printed by the whatis command is the “section” of the man pages. In order to gain access to the information in a particular section, you have to give it as an argument to the man command: > man 1 printf > man 1p p r i n t f > man 3 printf > man 3p p r i n t f > man bash Section 1 of the man pages contains information of ordinary command line commands, section 3 contains information on functions in libraries of the C language. Section 2 contains information on commands used for system administration. You may browse the directory /usr/share/man, or read the man page of the man command (use the command man man for that!). By using the command > p r i n t f --help we obtain plenty of memory refreshing information. The command > locate printf shows us many files related to the command printf. The commands 16 CHAPTER 1. THE COMPUTER > which p r i n t f > where p r i n t f give information on the location of the executable(s) of the command printf. Another useful feature of the shell is the command or it filename com- pletion. This means that we can write only the first characters of the name of a command or filename and then press simultaneously the keys [Ctrl-d]¹⁶ (i.e. press the key Ctrl and the key of the letter d at the same time). Then the shell will complete the name of the command up to the point that is is unique with the given string of characters¹⁷: > pri [ Ctrl−d ] printafm printf printenv printnodetest Try to type an x on the command line and then type [Ctrl-d]. You will learn all the commands that are available and whose name begins with an x: xterm, xeyes, xclock, xcalc, ... Finally, the internet contains a wealth of information. Google your blues... and you will be rewarded! 1.2 Text Processing Tools – Filters For doing data analysis, we will need powerful tools for manipulating data in text files. These are files that consist solely of printable charac- ters. Some tools that can be used in order to construct complicated and powerful filters are the programs cat, less, head, tail, grep, sort and awk. Suppose that we have data in a file named data¹⁸ which contains information on the contents of a food warehouse and their prices: bananas 100 pieces 1.45 apples 325 boxes 1.18 pears 34 kilos 2.46 bread 62 kilos 0.60 ¹⁶If you use the bash shell press [Tab] once or twice. ¹⁷Use the same procedure to auto-complete the names of files in the arguments of commands. ¹⁸The particular file, as well as most of the files in this section, can be found in the accompanying software of the chapter. It is highly recommended that you try all the commands in this section by using all the provided files. 1.2. TEXT PROCESSING TOOLS – FILTERS 17 ham 85 kilos 3.56 The command > c a t data prints the contents of the file data to the stdout. In general, this com- mand prints the contents of all files given in its arguments or the stdin if none is given. Since the stdin and the stdout can be redirected, the command > cat < data > data1 takes the contents of the file data from the stdin and prints them to the stdout, which in this case is the file data1. This command has the same result as the command: > cp data data1 The command > c a t data data1 > data2 prints the contents of the file data and then the contents of the file data1 to the stdout. Since the stdout is redirected to the file data2, data2 contains the data of both files. By giving the command > l e s s g f o r t r a n . txt you can browse the data contained in the file gfortran.txt one page at a time. Press [space] in order to “turn” a page, [b] to turn back a page. Press the up and down arrows to move one line backwards/forward. Press [g] in order to jump to the beginning of the file and press [G] in order to jump to the end. Press [h] in order to get a help message and press [q] in order to quit. The commands > head −n 1 data bananas 100 pieces 1 . 4 5 > t a i l −n 2 data 18 CHAPTER 1. THE COMPUTER bread 62 kilos 0.60 ham 85 kilos 3.56 > t a i l −n 2 data | head −n 1 bread 62 kilos 0.60 print the first line, the last two lines and the second to the last line of the file data to the stdout respectively. Note that, by piping the stdout of the command tail to the stdin of the command head, we are able to construct the filter “print the line before the last one”. The command sort sorts the contents of a file by comparing each line of its text with all others. The sorting is alphabetical, unless otherwise set by using options. For example > s o r t data apples 325 boxes 1.18 bananas 100 pieces 1.45 bread 62 kilos 0.60 ham 85 kilos 3.56 pears 34 kilos 2.46 For reverse sorting, try sort -r data. We can also sort by comparing specific fields of each line. By default, fields are words separated by one or more spaces. For example, in order to sort w.r.t. the second column of the file data, we can use the switch -k 2 (=second field). Furthermore, we can use the switch -n for numerical sorting: > s o r t −k 2 −n data pears 34 kilos 2.46 bread 62 kilos 0.60 ham 85 kilos 3.56 bananas 100 pieces 1.45 apples 325 boxes 1.18 If we omit the switch -n, the comparison of the lines is performed based on character sorting of the second field and the result is > s o r t −k 2 data bananas 100 pieces 1.45 apples 325 boxes 1.18 pears 34 kilos 2.46 bread 62 kilos 0.60 ham 85 kilos 3.56 1.2. TEXT PROCESSING TOOLS – FILTERS 19 The last column contains floating point numbers (not integers). In order to sort by the values of such numbers we should use the switch -g: > s o r t −k 4 −g data bread 62 kilos 0.60 apples 325 boxes 1.18 bananas 100 pieces 1.45 pears 34 kilos 2.46 ham 85 kilos 3.56 The command grep processes a text file line by line, searching for a given string of characters. When this string is found anywhere in a line, this line is printed to the stdout. The command > grep kilos data pears 34 kilos 2.46 bread 62 kilos 0.60 ham 85 kilos 3.56 prints each line containing the string “kilos”. If we want to search for all line not containing the string “kilos”, then we add the switch -v: > grep −v kilos data bananas 100 pieces 1 . 4 5 apples 325 boxes 1 . 1 8 We can use a regular expression for searching a whole family of strings of characters. These monsters need a full book for discussing them in detail! But it is not hard to learn how to use some simple forms of regular expressions. Here are some examples: > grep ^b data bananas 100 pieces 1.45 bread 62 kilos 0.60 > grep ’0$ ’ data bread 62 kilos 0.60 > grep ’ 3 [ 2 4 ] ’ data apples 325 boxes 1.18 pears 34 kilos 2.46 The first one, prints each line whose first character is a b. The second one, prints each line that ends with a 0. The third one, prints each line contaning the strings 32 or 34. 20 CHAPTER 1. THE COMPUTER By far, the strongest tool in our toolbox is the awk program. By default, awk analyzes a text file line by line. Each word (or field in the awk jargon) of these lines is stored in a set of variables with names $1, $2, .... The variable $0 contains the full line currently processed, whereas the variable NF counts the number of fields in the current line. The variable NR counts the number of lines of the file processed so far by awk. An awk program can be written in the command line. A set of com- mands within { ... } is executed for each line of input. The constructs BEGIN{ ... } and END{ ... } contain commands executed, only once, before and after the processing of the file respectively. For example, the command > awk ’{ p r i n t $1 , ” t o t a l v a l u e= ” , $2 * $4 } ’ data bananas total value= 145 apples total value= 383.5 pears total value= 83.64 bread total value= 3 7 . 2 ham total value= 302.6 prints the name of the product (1st column = $1) and the total value stored in the warehouse (2nd column = $2) × (4th column = $4). More examples are given below: > awk ’{ value += $2 * $4 }END{ p r i n t ” T o t a l= ” , value } ’ data Total= 951.94 > awk ’{ av += $4 }END{ p r i n t ” Average P r i c e = ” , av / NR } ’ data Average Price= 1.85 > awk ’{ p r i n t $2^2 * sin ( $4 ) + exp ( $4 ) } ’ data The first one calculates the total value of all products: The processing of each line results in the increment (+=) of the variable value by the product of the second and fourth fields. In the end (END{ ... }), the string Total= is printed, together with the final value of the variable value. This is an easy way for computing the sum of the values calculated for each line. The second command, calculates and prints an average. The sum is calculated in each line and stored in the variable av. In the end, we print the quotient of the sum of all values by the number of lines that have been processed (NR). The last command shows a (crazy) mathematical expression based on numerical values found in each line of the file data: It computes the square of the second field times the sine of the fourth field plus the exponential of the fourth field. 1.3. PROGRAMMING WITH EMACS 21 There is much more potential in the commands presented above. Reading the documentation and getting experience by using them will provide you with very strong tools in order to accomplish complicated tasks. 1.3 Programming with Emacs For a programmer that spends many hours programming every day, the environment and the tools available for editing the commands of a large and complicated program determine, to a large extent, the quality of her life! An editor edits the contents of a text file, that consists solely of printable characters. Such editors, available in most Linux environments, are the programs gedit, vim, pico, nano, zile... They provide basic functionality such as adding, removing or changing text within a file as well as more complicated functions, such as copying, pasting, searching and replacing text etc. There are many functions that are particularly useful to a programmer, such as detecting and formatting keywords of a particular programming language, pretty printing, closing scopes etc, which can be very useful for comfortable programming and for spotting errors. A very powerful and “knowledgeable” editor, offering many such functions for several programming languages, is the GNU Emacs editor¹⁹. Emacs is open source software, it is available for free and can be used in most available operating systems. It is programmable²⁰ and the user can automate most of her everyday repeated tasks and configure it to her liking. There is a full interaction with the operating system, in fact Emacs has been built with the ambition of becoming an operating system. For example, a programmer can edit a Fortran file, compile it, debug it and run it, everything done with Emacs commands. 1.3.1 Calling Emacs In the command line type > emacs & ¹⁹http://www.gnu.org/software/emacs/ (main site), http://www.emacswiki.org/ (expert tips), http://en.wikipedia.org/wiki/Emacs (general info) ²⁰Emacs is written in a dialect of the programming language Lisp, called Elisp. There is no need of an in-depth knowledge of the language in order to program simple functions, just see how others are doing it... 22 CHAPTER 1. THE COMPUTER Note the character & at the end of the line. This makes the particular command to run in the background. Without it, the shell waits until a command exits in order to return the prompt. In a desktop environment, Emacs starts in its own window. For a quick and dirty editing session, or in the case that a windows environ- ment is not available²¹, we can run Emacs in a terminal mode. Then, we omit the & at the end of the line and we run the command > emacs −nw The switch -nw forces Emacs to run in terminal mode. Figure 1.2: The Emacs window in a windows environment. The buttons of very basic functions found on its toolbar are shown and explained. ²¹Quite handy when we edit files in a remote computer. 1.3. PROGRAMMING WITH EMACS 23 Figure 1.3: Emacs in a non-window mode running on the console. In this figure, we have typed the command save-buffers-kill-emacs in the minibuffer, a command that exits Emacs after saving edited data from all buffers. The same command can be given using the keyboard shortcut C-x C-c. We can see the mode line and the name of the buffer toy.f written on it, the percentage of the buffer (6%) shown in the window, the line and columns (33,0) where the point lies and the editing mode which is active on the buffer (Fortran mode (Fortran), Abbreviation mode (Abbrev), Auto Fill mode (Fill)). 1.3.2 Interacting with Emacs We can interact with Emacs in various ways. Newbies will prefer buttons and menus that offer a simple and intuitive interface. For advanced usage, however, we recommend that you make an effort to learn the keyboard shortcuts. There are also thousands of functions available to be used interactively. They are called from a “command line”, called the minibuffer in the Emacs jargon. Keyboard shortcuts are usually combinations of keystrokes that con- sist of the simultaneous pressing of the Ctrl or Alt keys together with other keys. Our convention is that a key sequence starting with a C- means that the characters that follow are keys simultaneously pressed with the Ctrl key. A key sequance starting with a M- means that the 24 CHAPTER 1. THE COMPUTER characters that follow are keys simultaneously pressed with the Alt key²². Some commands have shortcuts consisting of two or more composite keystrokes. For example by C-x C-c we mean that we have to press simultaneously the Ctrl key together with x and then press simultane- ously the Ctrl key together with c. This sequence is a shortcut to the command that exits Emacs. Another example is C-x 2 which means to press the Ctrl key together with x and then press only the key 2. This is a shortcut to the command that splits a window horizontally to two equal parts. The most useful shortcuts are M-x (press the Alt key siumutaneously with the x key) and C-g. The first command takes us to the minibuffer where we can give a command by typing its name. For example, type M-x and then type save-buffers-kill-emacs in the minibuffer (this will terminate Emacs). The second one is an “SOS button” that interrupts anything Emacs does and returns control to the working buffer. This can be pretty handy when a command hangs or destroys our work and we need to interrupt it. The conventions for the mouse events are as follows: With Mouse-1, Mouse-2 and Mouse-3 we denote a simple click with the left, middle and right buttons of the mouse respectively. With Drag-Mouse-1 we mean to press the left button of the mouse and at the same time drag the mouse. We summarize the possible ways of giving a command in Emacs with the following examples that have the same effect: Open a file and put its contents in a buffer for editing. • By pressing the toolbar button that looks like a white sheet of paper (see figure 1.2). • By choosing the File→Visit New File menu entry. • By typing the keyboard shortcut C-x C-f. • By typing the name of the command in the minibuffer: M-x find-file The number of available commands increases from the top to the bottom of the above list. 1.3.3 Basic Editing In order to edit a file, Emacs places the contents of a file in a buffer. Such a buffer is a chunk of computer memory where the contents of the file ²²Actually, M- is the so called Meta key, usually bound to the Alt key. It is also bound to the Esc and C-[ keys. The latter can be our only choices available in dumb terminals. 1.3. PROGRAMMING WITH EMACS 25 Figure 1.4: The basic menus found in Emacs when run in a desktop environment. We can see the basic commands and the keyboard shortcut reminders in the parentheses. E.g. the command File → Visit New File can be given by typing C-x C-f. Note the commands File → Visit New File (open a file), File→Save (write contents of a buffer to a file), File→Exit Emacs, File → Split Window (split window in two), File→New Frame (open a new Emacs desktop window) and of course the well known commands Cut, Copy, Paste, Undo from the Edit menu. We can choose different buffers from the menu Buffers, which contain the contents of other files that we have opened for editing. We recommend trying the Emacs Tutorial and Read Emacs Manual in the Help menu. are copied and it is not the file itself. When we make changes to the contents of a buffer, the file remains intact. For our changes to take effect and be written to the file, we have to save the buffer. Then, the contents of the buffer are written back to the file. It is important to understand the following cycle of events: • Read a file’s contents to a buffer. • Edit buffer contents. • Write (save) buffer’s contents back into the file. Emacs may have more than one buffers open for editing simultaneously. By default, the name of the buffer is the same as the name of the file 26 CHAPTER 1. THE COMPUTER that is edited, although this is not necessary²³. The name of a buffer is written in the modeline of the window of the buffer, as can be seen in figure 1.3. If Emacs crashes or exits before we save our edits, it is possible to recover (part of) them. There is a command M-x recover-file that will guide us through the necessary recovery steps, or we can look for a file that has the same name as the buffer we were editing surrounded by two #. For example, if we were editing the file file.f90, the automatically saved changes can be found in the file #file.f90#. Auto saving is done periodically by Emacs and its frequency can be controlled by the user. The point where we insert text while editing is called “the point”. This is right before the blinking cursor²⁴. Each buffer has another posi- tion marked by “the mark”. A point and the mark define a “region” in the buffer. This is a part of the text in the buffer where the func- tions of Emacs can act (e.g. copy, cut, change case, spelling etc.). We can set the region by setting a point and then press C-SPC²⁵ or give the command M-x set-mark-command. This defines the current point to be the mark. Then we can move the cursor to another point which will define a region together with the mark that we set. Alternatively we can use Drag-Mouse-1 (hold the left mouse button and drag the mouse) and mark a region. The mark can be set with Mouse-3, i.e. with a simple click of the right button of the mouse. Therefore by Mouse-1 at a point and then Mouse-3 at a different point will set the region between the two points. We can open a file in a buffer with the command C-x C-f, and then by typing its path. If the file already exists, its contents are copied to a buffer, otherwise a new buffer is created. Then: • We can browse the buffer’s contents with the Up/Down/Left/Right arrows. Alternatively, by using the commands C-n, C-p, C-f and C-b. • If the buffer is large, we can browse its contents one page at a time ²³The user can change the name of the buffer without affecting the name of the file it edits. Also, if we open more than one files with the same name, emacs gives each buffer a unique name. E.g. if we edit more than one files named index.html then the corresponding buffers are named index.html, index.html<2>, index.html<3>, ... . ²⁴Strictly speaking, the point lies between two characters and not on top of a character. The cursor lies on the character immediately to the right of the point. A point is assigned to every window, therefore a buffer can have multiple points, one for each window that displays its contents. ²⁵Press the Ctrl and spacebar keys simultanesouly. 1.3. PROGRAMMING WITH EMACS 27 by using the Page Up/Page Dn keys. Alternatively, by using the commands C-v, M-v. • Enter text at the points simply by typing it. • Delete characters before the point by using the Backspace key and after the point by using the Delete key. The command C-d deletes a forward character. • Erase all the characters in a line that lie ahead of the point by using the command C-k. • Open a new line by using Enter or C-o. • Go to the first character of a line by using Home and the last one by using End. Alternatively, by using the commands C-a and C-e, respectively. • Go to the first character of the buffer with the key C-Home and the last one with the key C-End. Alternatively, with M-x beginning-of-buffer and M-x end-of-buffer. • Jump to any line we want: Type M-x goto-line and then the line number. • Search for text after the point: Press C-s and then the text you are looking for. This is an incremental search and the point jumps immediately to the first string that matches the search. The same search can be repeated by pressing C-s repeatedely. When we finish editing (or frequently enough so that we don’t loose our work due to an unfortunate event), we save the changes in the buffer, either by pressing the save icon on the toolbar, or by pressing the keys C-s, or by giving the command M-x save-buffer. 1.3.4 Cut and Paste Use the instructions below for slightly more advanced editing: • Undo! Some of the changes described below can be catastrophic. Emacs has a great Undo function that keeps in its memory many of the changes inflicted by our editing commands. By repeatedely pressing C-/, we undo the changes we made. Alternatively, we can use C-x u or the menu entry Edit→Undo. Remember that C-g interrupts any Emacs process currently running in the buffer. 28 CHAPTER 1. THE COMPUTER • Cut text by using the mouse: Click with Mouse-1 at the point before the beginning of the text and then Mouse-3 at the point after the end. A second Mouse-3 and the region is ... gone (in fact it is written in the “kill ring” and it is available for pasting)! • Cut text by using a keyboard shortcut: Set the mark by C-SPC at the point before the beginning of the text that you want to cut. Then move the cursor after the last character of the text that you want to cut and type C-w. • Copy text by using the mouse: Drag the mouse Drag-Mouse-1 and mark the region that you want to copy. Alternatively, Mouse-1 at the point before the beginning of the text and then Mouse-3 at the point after the end. • Copy text by using a keyboard shortcut: Set the mark at the begin- ning of the text with C-SPC and then move the cursor after the last character of the text. Then type M-w. • Pasting text with the mouse: We click the middle button²⁶ Mouse-2 at the point that we want to insert the text from the kill ring (the copied text). • Pasting text with a keyboard shortcut: We move the point to the desired insertion point and type C-y. • Pasting text from previous copying: A fast choice is the menu entry Edit→Paste from kill manu and then select from the copied texts. The keyboard shortcut is to first type C-y and then M-y repeatedly, until the text that we want is yanked. • Insert the contents of a file: Move the point to the desired place and type C-x i and the path of the file. Alternatively, give the command M-x insert-file. • Insert the contents of a buffer: We can insert the contents of a whole buffer at a point by giving the command M-x insert-buffer. • Replace text: We can replace text interactively with the command M-x query-replace, then type the string we want to replace, and then the replacement string. Then, we will be asked whether we want the change to be made and we can answer by typing y (yes), ²⁶If it is a two button mouse, try clicking the left and right buttons simultaneously. 1.3. PROGRAMMING WITH EMACS 29 n (no), q (quit the replacements). A , (comma) makes only one replacement and quits (useful if we know that this is the last change that we want to make). If we are confident, we can change all string in a buffer, no questions asked, by giving the command M-x replace-string. • Change case: We can change the case in the words of a region with the commands M-x upcase-region, M-x capitalize-region and M-x downcase-region. Try it. We note that cutting and pasting can be made between different windows of the same or different buffers. 1.3.5 Windows Sometimes it is very convenient to edit one or more different buffers in two or more windows. The term “windows” in Emacs refers to regions of the same Emacs desktop window. In fact, a desktop window running an Emacs session is referred to as a frame in the Emacs jargon. Emacs can split a frame in two or more windows, horizontally or/and vertically. Study figure 1.5 on page 69 for details. We can also open a new frame and edit several buffers simultaneously²⁷. We can manipulate windows and frames as follows: • Position the point at the center of the window and clear the screen from garbage: C-l (careful: l not 1). • Split a window in two, horizontally: C-x 2. • Split a window in two, vertically: C-x 3. • Delete all other windows (remain only with the current one): C-x 1. • Delete the current windows (the others remain): C-x 0. • Move the cursor to the other window: Mouse-1 or C-x o. • Change the size of window: Use Drag-Mouse-1 on the line sepa- rating two windows (the mode line). Use C-^, C-} for making a change of the horizontal/vertical size of a window respectively. ²⁷Be careful not to start a new Emacs session each time that all you need is a new frame. A new Emacs process takes time to start, binds computer resources and does not communicate with a different Emacs process. 30 CHAPTER 1. THE COMPUTER • Create a new frame: C-x 5 2. • Delete a frame: C-x 5 0. • Move the cursor to a different frame: With Mouse-1 or with C-x 5 o. You can have many windows in a dumb terminal. This is a blessing when a dekstop environment is not available. Of course, in that case you cannot have many frames. 1.3.6 Files and Buffers • Open a file: C-x C-f or M-x find-file. • Save a buffer: C-x C-s or M-x save buffer. With C-x C-c or M-x save-buffers-kill-emacs we can also exit Emacs. From the menu: File→Save. From the toolbar: click on the save icon. • Save buffer contents to a different file: C-x C-w or M-x write-file. From the menu: File→Save As. From the toolbar: click on the “save as” icon. • Save all buffers: C-x s or M-x save-some-buffers. • Connect a buffer to a different file: M-x set-visited-filename. • Kill a buffer: C-x k. • Change the buffer of the current window: C-x b. Also, use the menu Buffers, then choose the name of the buffer. • Show the list of all buffers: C-x C-b. From the menu: Buffers → List All Buffers. By typing Enter next to the name of the buffer, we make it appear in the window. There are several buffer administration commands. Learn about them by typing C-h m when the cursor is in the Bufer List window. • Recover data from an edited buffer: If Emacs crashed, do not de- spair. Start a new Emacs and type M-x recover-file and follow the instructions. The command M-x recover-session recovers all unsaved buffers. 1.3. PROGRAMMING WITH EMACS 31 • Backup files: When you save a buffer, the previous contents of the file become a backup file. This is a file whose path is the same as the original’s file with a ˜ appended in the end. For example a file test.f90 will have as a backup the file test.f90˜. Emacs has version control, and you can configure it to keep as many versions of your edits as you want. • Directory browsing and directory administration commands: C-x d or M-x dired. You can act on the files of a directory (open, delete, rename, copy etc) by giving appropriate commands. When the cursor is in the dired window, type C-h m to read the relevant documentation. 1.3.7 Modes Each buffer can be in different modes. Each mode may activate different commands or editing environment. For example each mode can color keywords relevant to the mode and/or bind keys to different commands. There exist major modes, and a buffer can be in only one of them. There are also minor modes, and a buffer can be in one or more of them. Emacs activates major and minor modes by default for each file. This usually depends on the filename but there are also other ways to control this. The user can change both major and minor modes at will, using appropriate commands. Active modes are shown in a parenthesis on the mode line (see figures 1.3 and 1.5. • M-x f90-mode: This mode is of special interest in this book since we will edit a lot of Fortran code. We need it activated in buffers that contain a Fortran program and its most useful characteristics are automatic code alignment by pressing the key TAB, the coloring of Fortran commands, variables and other structural constructs (sub- routines, if statements, do loops, variable declarations, statement labels etc). Another interesting function is the one that comments out a whole region of code, as well as the inverse function. • M-x c-mode: For files containing programs written in the C lan- guage. Related modes are the c++-mode, java-mode, perl-mode, awk-mode, python-mode, makefile-mode, octave-mode, gnuplot-mode, mathematica-mode and others. • latex-mode: For files containing LATEX text formatting commands. 32 CHAPTER 1. THE COMPUTER • text-mode: For editing simple text files (.txt). • fundamental-mode: The basic mode, when one that fits better doesn’t exist... Some interesting minor modes are: • M-x auto-fill-mode: When a line becomes too long, it is wrapped automatically. A related command to do that for the whole region is M-x fill-region, and for a paragraph M-x fill-paragraph. • M-x overwite-mode: Instead of inserting characters at the point, overwrite the existing ones. By giving the command several times, we toggle between activating and deactivating the mode. • M-x read-only mode: When visiting a file with valuable data that we don’t want to change by mistake, we can activate this mode so that changes will not be allowed by Emacs. When we open a file with the command C-x C-r or M-x find-file-read-only this mode is activated. We can toggle this mode on and off with the command C-x C-q (M-x toggle-read-only). See the mode line of the buffer jack.c in figure 1.5 which contains a string %%. By clicking on the %% we can toggle the read-only mode on and off. • flyspell-mode: Spell checking as we type. • font-lock-mode: Colors the structural elements of the buffer which are defined by the major mode (e.g. the commands of a Fortran program). In a desktop environment, we can choose modes from the menu of the mode line. By clicking with Mouse-3 on the name of a mode we are offered options for (de)activating minor modes. With a Mouse-1 we can (de)activate the read-only mode with a click on :%% or :-- respectively. See figure 1.5. 1.3.8 Emacs Help Emacs’ documentation is impressive. For newbies, we recommend to follow the mini course offered by the Emacs tutorial. You can start the tutorial by typing C-h t or select Help → Emacs Tutorial from the menu. Enjoy... The Emacs man page (give the man emacs command in the command line) will give you a summary of the basic options when calling Emacs from the command line. 1.3. PROGRAMMING WITH EMACS 33 A quite detailed manual can be found in the Emacs info pages²⁸. Using info needs some training, but using the Emacs interface is quite intuitive and similar to using a web browser. Type the command C-h r (or choose Help→Emacs Tutorial from the menu) and you will open the front page of the emacs manual in a new window. By using the keys SPC and Backspace we can read the documentation page by page. When you find a link (similar to web page hyperlinks), you can click on it in order to open to read the topic it refers to. Using the navigation icons on the toolbar, you can go to the previous or to the next pages, go up one level etc. There are commands that can be given by typing single characters. For example, type d in order to jump to the main info directory. There you can find all the available manuals in the info system installed on your computer. Type g (emacs) and go to the top page of the Emacs manual. Type g (info) and read the info manual. Emacs is structured in an intuitive and user friendly way. You will learn a lot from the names of the commands: Almost all names of Emacs commands consist of whole words, separated by a hyphen “-”, which almost form a full sentence. These make them quite long sometimes, but by using auto completion of their names this does not pose a grave problem. • auto completion: The names of the commands are auto completed by typing a TAB one or more times. E.g., type M-x in order to go to the minibuffer. Type capi[TAB] and the command autocompletes to capitalize-. By typing [TAB] for a second time, a new window opens and offers the options for completing to two possible com- mands: capitalize-region and capitalize-word. Type an extra r[TAB] and the command auto completes to the only possible choice capitalize-region. You can see all the commands that start with an s by typing M-x s[TAB][TAB]. Sure, there are many... Click on the *Completions* buffer and browse the possibilities. A lot will become clear just by reading the names of the commands. By typ- ing M-x [TAB][TAB], all available commands will appear in your buffer! • keyboard shortcuts: If you don’t remember what happens when you type C-s, no problem: Type C-h k and then the ... forgotten key sequence C-s. Conversely, have you forgotten what is the keyboard ²⁸If you prefer books in the form of PDF visit the page www.gnu.org/software/emacs and click on Documentation. You will find a 600 page book that has almost everything! 34 CHAPTER 1. THE COMPUTER shortcut of the command save-buffer? Type C-h w and then the command. • functions: Are you looking for a command, e.g. save-something -I-forgot? Type C-h f and then save-[TAB] in order to browse over different choices. Use Mouse-2 in order to select the command you are interested in, or type and complete the rest of its name (you may use [TAB] again). Read about the function in the *Help* buffer that opens. • variables: Do the same after typing C-h v in order to see a vari- able’s value and documentation. • command apropos: Have you forgotten the exact name of a com- mand? No problem... Type C-h a and a keyword. All commands related to the keyword you typed will appear in a buffer. Use C-h d for even more information. • modes: When in a buffer, type C-h m and read information about the active modes of the buffer. • info: Type C-h i • Have you forgotten everything mentioned above? Just type C-h ? 1.3.9 Emacs Customization You can customize everything in Emacs. From key bindings to program- ming your own functions in the Elisp language. The most common way for a user to customize her Emacs sessions, is to put all her customization commands in the file ∼/.emacs in her home directory. Emacs reads and executes all these commands just before starting a session. Such a .emacs file is given below: ; D e f i n e F1 key t o save t h e b u f f e r ( global-set-key [ f1 ] ’ save-buffer ) ; D e f i n e Control−c s t o save t h e b u f f e r ( global-set-key ”\C−cs ” ’ save-some-buffers ) ; D e f i n e Meta−s ( Alt−s ) t o i n t e r a c t i v e l y s e a r c h forward ( global-set-key ”\M−s” ’ isearch-forward ) ; D e f i n e M−x i s t o i n t e r a c t i v e l y s e a r c h forward ( defalias ’ is ’ isearch-forward ) ; D e f i n e M−x fm t o s e t fortran−mode f o r t h e b u f f e r ( defun fm ( ) ( interactive ) ( f90-mode ) ) 1.4. THE FORTRAN PROGRAMMING LANGUAGE 35 ; D e f i n e M−x s i g n t o s i g n my name ( defun sign ( ) ( interactive ) ( insert ”K. N. Anagnostopoulos ” ) ) Everything after a ; is a comment. Functions/commands are enclosed in parentheses. The first three ones bind the keys F1, C-c s and M-s to the commands save-buffer, save-some-buffers and isearch-forward respectively. The next one defines an alias of a command. This means that, when we give the command M-x is in the minibuffer, then the command isearch-forward will be executed. The last two commands are the definitions of the functions (fm) and (sign), which can be called interactively from the minibuffer. For more complicated examples google “emacs .emacs file” and you will see other users’ .emacs files. You may also customize Emacs from the menu commands Options→Customize Emacs. For learning the Elisp lan- guage, you can read the manual “Emacs Lisp Reference Manual” found at the address www.gnu.org/software/emacs/manual/elisp.html 1.4 The Fortran Programming Language In this section, we give a very basic introduction to the Fortran program- ming language. This is not a systematic exposition and you are expected to learn what is needed in this book by example. So, please, if you have not already done it, get in front of a computer and do what you read. You can find many good tutorials and books introducing Fortran in a more complete way in the bibliography. 1.4.1 The Foundation The first program that one writes when learning a new programming language is the “Hello World!” program. This is the program that prints “Hello World!” on your screen: program hello ! p r i n t a message t o t h e world : p r i n t * , ’ H e l l o World ! ’ ! t h i s i s a comment end program hello 36 CHAPTER 1. THE COMPUTER Commands, or statements, in Fortran are strings of characters separated by blanks (“words”) that we are allowed to write from the 1st to the 132nd column of a file. Each line starts a new command²⁹. We can put more than one command on each line by separating them with a semicolon (;). Everything after an exclamation mark (!) is a comment. Proliferation of comments is necessary for documenting our code. Good documentation of our code is an integral part of programming. If the code is planned to be read by others, or by us at a later time, make sure to explain in detail what each line is supposed to do. You and your collaborators will save a lot of time in the process of debugging, improving and extending your code. The main entry to the program is defined by the command program name, where name can be any string of alphanumeric characters and an underscore. When the program runs, it starts executing commands at this point. The end of the program, as well as of any other program unit (functions, subroutines, modules), is defined by the line end program name. The first (and only) command given in the above program is the print command. It prints the string of characters “Hello World!” to the stdout. The “*,” is part of the syntax and it is not printed, of course. Fortran does not distinguish capital from small letters, so we could have written PRINT, Print, prINt, ... A string of characters in Fortran is enclosed in single or double quotes ('Hello World!' or "Hello World!" is equivalent). In order to execute the commands in a program, it is necessary to com- pile it. This is a job done by a program called the compiler that translates the human language programming statements into binary commands that can be loaded to the computer memory for execution. There are many Fortran compilers available, and you should learn which compilers are available for use in your computing environment. Typical names for Fortran compilers are gfortran, f90, ifort, g95, .... You should find out which compiler is best suited for your program and spend time reading its documentation carefully. It is important to learn how to use a new compiler so that you can finely tune it to optimize the performance of your program. We are going to use the open source and freely available compiler gfortran, which can be installed on most popular operating systems³⁰. The compilation command is: ²⁹It is possible to break long lines by putting a & at the end of each broken line and continue the same command in the next one. More on that later. ³⁰http://gcc.gnu.org/fortran/ 1.4. THE FORTRAN PROGRAMMING LANGUAGE 37 > g f o r t r a n hello . f90 −o hello The switch -o defines the name of the executable file, which in our case is hello. If the compilation is successful, the program runs with the command: > . / hello Hello world ! Now, we will try a simple calculation. Given the radius of a circle we will compute its length and area. The program can be found in the file area_01.f90: program circle_area PI = 3.141593 R = 4.0 p r i n t * , ’ P e r i m e t e r= ’ , 2 . 0 * PI * R p r i n t * , ’ Area= ’ , PI * R * * 2 end program circle_area The first two commands define the values of the variables PI and R. These variables are of type REAL, which are floating point numbers. Fortran has implicit rules that can be used to define the type of variables. By default, variables whose name starts with i, j, k, l, m and n are of INTEGER type. These are exact whole numbers. All other variables are of type REAL³¹. We can override these implicit rules by explicitly declaring the type of a variable or by changing the implicit rules with the use of the implicit statement. The following two commands have two effects: Computing the length 2πR and the area πR2 of the circle and printing the results. The expressions 2.0*PI*R and PI*R**2 are evaluated before being printed by the print command. The multiplication and raising to a power operators are * and **, respectively. Note the explicit decimal points at the constants 2.0 and 4.0. If we write 2 or 4 instead, then these are going to be constants of the INTEGER type and by using them ³¹Don’t confuse REAL variables with the real numbers. REAL variables take values that are finite approximations to real numbers and take values that are a subset of the rational numbers. This approximation becomes better with increasing the amount of memory allocated to REALs. In most computing environments, REALs are allocated 4 or 8 bytes of memory, in which case they approximate real numbers with, more or less, 7 or 17 significant digits, respectively. 38 CHAPTER 1. THE COMPUTER the wrong way we may obtain surprising results³². We compile and run the program with the commands: > g f o r t r a n area_01 . f90 −o area > . / area Perimeter= 25.13274 Area= 50.26548 We will now try a process that repeats itself for many times. We will calculate the length and area of 10 circles of different radii Ri = 1.28 + i, i = 1, 2, . . . , 10. We will store the values of the radii in an array R(10) of the REAL type. The code can be found in the file area_02.f90: program circle_area dimension R ( 1 0 ) PI = 3.141593 R ( 1 ) = 2.28 do i =2 ,10 R ( i ) = R ( i−1) + 1 . 0 enddo do i = 1 , 1 0 perimeter = 2* PI * R ( i ) area = PI * R ( i ) * * 2 p r i n t * , i , ’ ) R= ’ , R ( i ) , ’ p e r i m e t e r= ’ , perimeter p r i n t * , i , ’ ) R= ’ , R ( i ) , ’ a r e a = ’ , area enddo end program circle_area The command dimension R(10) defines an array of length 10. This way, the elements of the array are referred by an index that takes value from 1 to 10. For example R(4) is the fourth element of the array. Between the lines do i = 2 , 10 ... enddo we can write commands that are repeatedly executed while the INTEGER ³²Try adding the command print *,2/4, 2.0/4.0 and check the results. 1.4. THE FORTRAN PROGRAMMING LANGUAGE 39 variable i takes values from 2 to 10 with increasing step³³ equal to 1. The command: R ( i ) = R ( i−1) + 1 . 0 defines the i-th radius to have a value which is larger by the (i-1)-th by 1. For the loop to work correctly, we must define the initial value of R(1), otherwise the final result is undefined³⁴. The second loop uses the defined R-values in order to do the computation and printing of the results. Now, we will write an interactive version of the program. Instead of hard coding the values of the radii, we will interact with the user asking her to give her own values. The program will read the 10 values of the radii from the standard input (stdin). The program can be found in the file area_03.f90: program circle_area i m p l i c i t none i n t e g e r , parameter :: N=10 real , parameter :: PI =3.141593 real , dimension ( N ) :: R real :: area , perimeter integer :: i do i =1 , N p r i n t * , ’ Enter r a d i u s o f c i r c l e : ’ read * , R ( i ) p r i n t * , ’ i = ’ , i , ’ R( i )= ’ , R ( i ) enddo open (UNIT=13 ,FILE= ’AREA.DAT’ ) do i = 1 , N perimeter = 2* PI * R ( i ) area = PI * R ( i ) * * 2 w r i t e ( 1 3 , * ) i , ’ ) R= ’ , R ( i ) , ’ a r e a= ’ , area ,& ’ p e r i m e t e r= ’ , perimeter enddo ³³The step can change by adding one more entry to the do line: do i=0,12,4 runs the loop for i=0,4,8,12, whereas do i=10,6,-2 for i=10,8,6. ³⁴That means that different compilers and/or runs can give different results. 40 CHAPTER 1. THE COMPUTER close (13) end program circle_area The first statement in the above program is implicit none! This state- ment deactivates the implicit rules of Fortran, and the programmer is obliged to declare all variables in a program unit. It is highly recom- mendable that you always use this option... You might spend a little more time typing the declarations, but this effort cannot be compared to the pain looking for bugs due to typos in the names of variables³⁵! We will follow this practice throughout the book. The declarations of the variables follow this statement. The variables N and i are declared to be of the INTEGER type, whereas the variables PI, area, perimeter and R(N) are declared to be of the REAL type. The variables PI and N are specified to be parameters. Parameters are given specific values which cannot be changed during the execution of the program. The array elements R(i) are read using the command read: read * , R ( i ) The command read reads from the stdin. The user types the values at the terminal and then presses [Enter]. We can read more than one variables with one read command. In order to print data to a file, we have to connect it to a unit. Each unit is represented by any number between 0 and 99. Some numbers are reserved for special units³⁶. The connection of a unit to a file is done with the open command. When this is done, we can write to the file with the command³⁷ write(n,*), where n is the unit number. When we are done writing to a file we should use the command close(n). Then the unit number is available to be used for a different file. The flow of commands is like open (UNIT=13 ,FILE= ’AREA.DAT’ ) ... write (13 ,*) . . . . ... close (13) ³⁵Can you see the difference between the names pl1 and p11? ³⁶E.g., 5 is the stdin, 6 is the stdout and 0 is the stderr. ³⁷Try to see what happens when you write to a unit what has not been connected to a file via an open command! 1.4. THE FORTRAN PROGRAMMING LANGUAGE 41 The name of the file is determined by the option FILE='AREA.DAT' of the open statement. Uppercase or lowercase characters in the filename make a difference. The option FILE='path' can use any valid path in the filesystem, provided that we have the necessary permissions. The line w r i t e ( 1 3 , * ) i , ’ ) R= ’ , R ( i ) , ’ a r e a= ’ , area ,& ’ p e r i m e t e r= ’ , perimeter shows us how to continue a line containing a long statement to the next one. We place a & at the end of the line and then continue writing the statement to the next. This can happen up to 39 times. The next step will be to learn how to define and use functions and subroutines. The program below shows how to define a subroutine area_of_circle, which computes the length and area of a circle of given radius. The following program can be found in the file area_04.f90: program circle_area i m p l i c i t none i n t e g e r , parameter :: N=10 real , parameter :: P =3.141593 real , dimension ( N ) :: R real :: area , perimeter integer :: i do i =1 , N p r i n t * , ’ Enter r a d i u s o f c i r c l e : ’ read * , R ( i ) p r i n t * , ’ i = ’ , i , ’ R( i )= ’ , R ( i ) enddo open (UNIT=13 ,FILE= ’AREA.DAT’ ) do i = 1 , N c a l l area_of_circle ( R ( i ) , perimeter , area ) w r i t e ( 1 3 , * ) i , ’ ) R= ’ , R ( i ) , ’ a r e a= ’ , area ,& ’ p e r i m e t e r= ’ , perimeter enddo close (13) end program circle_area 42 CHAPTER 1. THE COMPUTER s u b r o u t i n e area_of_circle ( R , L , A ) i m p l i c i t none real :: R,L,A r e a l , parameter : : PI = 3.141593 , PI2 = 2 . 0 * PI L= PI2 * R A= PI * R * R return end s u b r o u t i n e area_of_circle The calculation of the length and the area of the circle is performed by the call to the subroutine: c a l l area_of_circle ( R ( i ) , perimeter , area ) The command call calls a subroutine and transfers the control of the program within the subroutine. The above subroutine has the arguments (R(i),perimeter,area). The argument R(i) is an input variable. It provides the necessary data to the subroutine in order to perform its computation. The arguments perimeter and area are intended for out- put. Upon return of the subroutine to the main program, they store the result of the computation. The user of a subroutine must learn how to use its arguments in order to be able to call it in her program. These must be documented carefully by the programmer of the subroutine. The actual program executed by the subroutine is between the lines: s u b r o u t i n e area_of_circle ( R , L , A ) ... end s u b r o u t i n e area_of_circle The arguments (R,L,A) must be declared in the subroutine and need not have the same names as the ones that we use when we call it. A change of their values within the subroutine will change the values of the cor- responding variables in the calling program³⁸. Therefore, the statements L=PI2*R and A=PI*R*R change the values of the variables perimeter and area to the desired values. The command return returns the control to the calling program. The parameters PI and PI2 are “private” to the subroutine. Their names and values are invisible outside the subroutine. ³⁸We say that variables in Fortran are passed to subroutines by reference and not by value as in C. 1.4. THE FORTRAN PROGRAMMING LANGUAGE 43 Similarly, the variables i, N, ..., defined in the main program, are invisible within the subroutine. We summarize all of the above in a program trionymo.f90, which computes the roots of a second degree polynomial: ! ============================================================= ! Program t o compute r o o t s o f a 2nd order polynomial ! Tasks : Input from user , l o g i c a l s t a t e m e n t s , ! use o f f u n c t i o n s , s t o p ! Accuracy i n f l o a t i n g p o i n t a r i t h m e t i c ! e . g . IF ( x . eq . 0 . 0 ) ! ! T e s t s : a , b , c= 1 2 3 D= −8 ! a , b , c= 1 −8 16 D= 0 x1= 4 ! a , b , c= 1 −1 −2 D= 9 . x1= 2 . x2= −1. ! a , b , c= 2.3 −2.99 −16.422 x1= 3. 4 x2= −2.1 ! But : 6 . 8 ( x −4.3) * * 2 = 6.8 x * * 2 −58.48*x +125.732 ! a , b , c= 6.8 −58.48 125.73199 ! D= 0.000204147349 x1= 4.30105066 x2= 4.29894924 ! a , b , c= 6.8 −58.48 1 2 5 . 7 3 2 , D= −0.000210891725 < 0 ! ! ! ============================================================= program trionymo i m p l i c i t none real : : a , b , c , D r e a l : : x1 , x2 r e a l : : Discriminant p r i n t * , ’ Enter a , b , c : ’ read * , a , b , c ! T e s t i f we have a w e l l d e f i n e d polynomial o f 2nd degree : i f ( a . eq . 0 . 0 ) s t o p ’ trionymo : a=0 ’ ! Compute t h e d i s c r i m i n a n t (= d i a k r i n o u s a ) D = Discriminant ( a , b , c ) p r i n t * , ’ D i s c r i m i n a n t : D= ’ , D ! Compute t h e r o o t s i n each c a s e : D>0 , D=0 , D<0 ( no r o o t s ) i f ( D . g t . 0.0 ) then c a l l roots ( a , b , c , x1 , x2 ) p r i n t * , ’ Roots : x1= ’ , x1 , ’ x2= ’ , x2 e l s e i f ( D . eq . 0 . 0 ) then c a l l roots ( a , b , c , x1 , x2 ) p r i n t * , ’ Double Root : x1= ’ , x1 else p r i n t * , ’No r e a l r o o t s ’ 44 CHAPTER 1. THE COMPUTER endif end program trionymo ! ============================================================= ! This i s t h e f u n c t i o n t h a t computes t h e d i s c r i m i n a n t ! A f u n c t i o n r e t u r n s a v a l u e . This v a l u e i s a s s i g n e d with t h e ! statement : ! D i s c r i m i n a n t = <value > ! i . e . we simply a s s i g n anywhere i n t h e program a v a r i a b l e with ! t h e name o f t h e f u n c t i o n . ! ============================================================= r e a l f u n c t i o n Discriminant ( a , b , c ) i m p l i c i t none real : : a , b , c Discriminant = b * * 2 − 4.0 * a * c end f u n c t i o n Discriminant ! ============================================================= ! The s u b r o u t i n e t h a t computes t h e r o o t s . ! ============================================================= s u b r o u t i n e roots ( a , b , c , x1 , x2 ) i m p l i c i t none real : : a , b , c r e a l : : x1 , x2 r e a l : : D , Discriminant i f ( a . eq . 0 . 0 ) s t o p ’ r o o t s : a=0 ’ D = Discriminant ( a , b , c ) i f ( D . ge . 0 . 0 ) then D = sqrt (D) else p r i n t * , ’ r o o t s : Sorry , cannot compute r o o t s , D<0= ’ , D stop endif x1 = (−b + D ) / ( 2 . 0 * a ) x2 = (−b − D ) / ( 2 . 0 * a ) end s u b r o u t i n e roots The program reads the coefficients of the polynomial ax2 + bx + c. After a check whether a ̸= 0, it computes the discriminant D = b2 − 4ac by calling the function Discriminant(a,b,c). The only difference between a function and a subroutine is that the first one returns a value of a given type. We don’t need to use the command call in order to run the commands of a function, this is done by computing its value in an 1.4. THE FORTRAN PROGRAMMING LANGUAGE 45 expression. The type of the value returned must be declared both in the program that uses the function (real :: Discriminant) and at the entry point of its program unit (real function Discriminant(a,b,c)). The value returned to the calling program is the one assigned to the variable that has the same name as the function: r e a l f u n c t i o n Discriminant ( a , b , c ) ... Discriminant = b * * 2 − 4.0 * a * c ... end f u n c t i o n Discriminant Notice the use of the comparison operators .gt. (strictly greater than) and .eq. (equal to)³⁹: i f ( D . g t . 0.0 ) then ... e l s e i f ( D . eq . 0 . 0 ) then ... else ... endif 1.4.2 Details You may skip this paragraph during a first reading of the book. It is intended mainly to be a reference when reading the later chapters. There are more types of variables built in Fortran. In the program listed below, we show how to use CHARACTER variables, floating point numbers of double precision REAL(8) and complex numbers of single and double precision, COMPLEX and COMPLEX(8) respectively: program f90_vars i m p l i c i t none c h a r a c t e r ( 1 0 0 ) : : string real (4) :: x ! s i n g l e p r e c i s i o n , same as r e a l : : x real (8) : : x8 ! e q u i v a l e n t t o : double p r e c i s i o n x8 ! re al (16) : : x16 ! may not be supported by a l l c o m p i l e r s ³⁹Other operators are .lt., .ge. .le. (strictly less, greater or equal, less or equal), .ne. (not equal) and .or., .and., .not. (logical or, and and negation). 46 CHAPTER 1. THE COMPUTER ! Complex Numbers : complex ( 4 ) : : z ! s i n g l e p r e c i s i o n , same as complex : : z complex ( 8 ) : : z8 ! double p r e c i s i o n !A s t r i n g : a c h a r a c t e r a r r a y : string = ’ H e l l o World ! ’ ! s t r i n g s m a l l e r s i z e , l e a v e s blanks ! TRIM : t r i m blanks p r i n t * , ’A s t r i n g : : ’ , string , ’ : : ’ ,TRIM( string ) , ’ : : ’ p r i n t * , ’ j o i n them : : ’ , string // string , ’ : : ’ p r i n t * , ’ j o i n them : : ’ , TRIM( string ) / / TRIM( string ) , ’ : : ’ ! R e a l s with i n c r e a s i n g a c c u r a c y : Determine PI = 3 . 1 4 1 5 9 . . . x = 4.0 * atan ( 1 . 0 ) ! Use D f o r double p r e c i s i o n exponent x8 = 4.0 D0 * atan ( 1 . 0 D0 ) ! Use Q f o r q u a d r i p l e p r e c i s i o n exponent ! x16 = 4.0Q0* atan ( 1 . 0 Q0) p r i n t * , ’ x4= ’ , x , ’ x8= ’ , x8 ! , ’ x16= ’ , x16 p r i n t * , ’ x4 : ’ , range ( x ) , p r e c i s i o n ( x ) , EPSILON( x ) ,& TINY( x ) ,HUGE( x ) p r i n t * , ’ x8 : ’ , range ( x8 ) , p r e c i s i o n ( x8 ) , EPSILON( x8 ) ,& TINY( x8 ) ,HUGE( x8 ) ! Complex numbers : s i n g l e p r e c i s i o n z = ( 2 . 0 , 1 . 0 ) * cexp ( ( 3 . 0 , − 1 . 0 ) ) p r i n t * , ’ z= ’ , z , ’ Re ( z )= ’ ,REAL( z ) , ’ Im( z )= ’ ,IMAG( z ) ,& ’ | z | = ’ ,ABS( z ) , ’ z *= ’ , CONJG( z ) ! Complex numbers : double p r e c i s i o n z8 = ( 2 . 0 D0 , 1 . 0 D0 ) * cdexp ( ( 3 . 0 D0 , −1.0 D0 ) ) p r i n t * , ’ z= ’ , z8 , ’ Re ( z )= ’ ,DBLE( z8 ) , ’ Im( z )= ’ ,DIMAG( z8 ) ,& ’ | z | = ’ ,CDABS( z8 ) , ’ z *= ’ ,DCONJG( z8 ) p r i n t * , ’ z4 : ’ , range ( z ) , p r e c i s i o n ( z ) p r i n t * , ’ z8 : ’ , range ( z8 ) , p r e c i s i o n ( z8 ) end program f90_vars Some interesting points of the program above are: • The number K in the declaration REAL(K):: x refers to the number of bytes allocated to the variable x. For K=4 we have single precision (same as REAL), for K=8 double precision and for K=16 quadruple precision. The latter is not always available. In the declarations COMPLEX(K), K refers to the number of bytes allocated to the real and imaginary parts of the complex number. • We always use the exponent notation D in double precision con- stants, even if the exponent 0. Otherwise the constants are of single precision and we loose the desired accuracy. 1.4. THE FORTRAN PROGRAMMING LANGUAGE 47 • When we want to state the precision of the return value of an in- trinsic function explicitly, we usually add a d at the beginning of its name (e.g. exp→dexp, ABS→DABS. When we want to use the com- plex version of a function, we usually add a c at the beginning of its name (e.g. exp→cexp, ABS→CABS). Modify the program in order to achieve higher accuracy in the calculation of π and z = (2+i)e3−i , by using double precision variables. • The maximum number of characters in the CHARACTER variable string is 100, and this is declared by the statement CHARACTER(100). • When we print a CHARACTER variable, all its characters are printed, including trailing blanks. This is very annoying and we can use the function TRIM in order to remove them. • The operator // joins two CHARACTER variables or constants. Notice the effect of the function TRIM in the above program. Another important point to discuss is how to be able to access the same variables from different program units. So far, we simply mentioned that variables have a scope within each function and subroutine. If we wish to have access to the same location of memory⁴⁰ from different program units, then we use the COMMON statement which defines a common block. See the following example: ! −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− program f90_common i m p l i c i t none r e a l : : k1 = 1 . 0 , k2 = 1 . 0 , k3 =1.0 common / CONSTANTS / k1 , k2 p r i n t * , ’ main : k1= ’ , k1 , ’ k2= ’ , k2 , ’ k3= ’ , k3 c a l l s1 ! p r i n t s k1 and k2 but not k3 c a l l s2 ! changes t h e v a l u e o f k2 but not k3 p r i n t * , ’ main : k1= ’ , k1 , ’ k2= ’ , k2 , ’ k3= ’ , k3 end program f90_common ! −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− s u b r o u t i n e s1 ( ) i m p l i c i t none r e a l k1 , k2 , k3 ⁴⁰Common blocks are supposed to be obsolescent in Fortran and programmers are encouraged to avoid them and use modules instead. Due to their simplicity and pop- ularity we will show their usage and also use them in this book. 48 CHAPTER 1. THE COMPUTER common / CONSTANTS / k1 , k2 p r i n t * , ’ s 1 : k1= ’ , k1 , ’ k2= ’ , k2 , ’ k3= ’ , k3 end s u b r o u t i n e s1 ! −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− s u b r o u t i n e s2 ( ) i m p l i c i t none r e a l k1 , k2 , k3 common / CONSTANTS / k1 , k2 k2 = 2.0 k3 = 2.0 end s u b r o u t i n e s2 The common block has the name CONSTANTS and we can refer to it from any program unit. Each program unit that uses this common block must use the same declaration, although the names of variables are allowed to be different. The common block CONSTANTS points to the same location in the computer memory, where we expect to find the values of two real variables. These variables (k1 and k2) are used and have their values changed in the subroutines s1 and s2. The variable k3, is a different variable in each program unit. The program prints main : k1= 1.000000 k2= 1.000000 k3= 1.000000 s1 : k1= 1.000000 k2= 1.000000 k3= −2.8117745E−05 main : k1= 1.000000 k2= 2.000000 k3= 1.000000 One of the weaknesses of Fortran is that it does not have a convenient control for Input/Output (I/O). For complicated I/O and text manipulation we will use other programs that can do a better job, like awk, perl, shell scripting, or programs written in C/C++. It is important to know some details about I/O commands in Fortran, mainly the specifications that control the accuracy of printed floating point numbers. So far, I/O commands, like print, write, read, used a * in order to control the printing of numbers. But we can replace the * with explicit format directives as follows: program f90_format1 i m p l i c i t none integer :: i real :: x r e a l , dimension ( 1 0 ) :: a real (8) :: x8 1.4. THE FORTRAN PROGRAMMING LANGUAGE 49 i = 123456 x = 2.0 * atan2 ( 1 . 0 , 0 . 0 ) p r i n t ’ (A5 , I6 , F12 . 7 ) ’ , ’ x , i = ’ , i , x x8 = 2.0 D0 * atan2 ( 1 . 0 D0 , 0 . 0 D0 ) w r i t e ( 6 , ’ ( F18 . 1 6 , E24 . 1 7 , G24 . 1 7 , G24 . 1 7 ) ’ ) x8 , x8 ,& 1 . 0 D15 * x8 , 1 . 0 D18 * x8 w r i t e ( 6 , ’ (3F20 . 1 6 ) ’ ) x8 , x8 / 2 . 0 , c o s ( x8 ) w r i t e ( 6 , ’ (200F12 . 6 ) ’ ) ( a ( i ) , i = 1 , 1 0 ) end program f90_format1 Note the parentheses within the single quotes: (A5,I6,F12.7) is a format directive for the print statement. The A is for printing a CHARACTER, the I for printing an INTEGER and the F for printing a floating point number. The numbers after the letter declare the number of spaces used for printing each one. Beware! If the printing space is not enough, Fortran will not print and you will find a series of * in place of the value of your result! Bummer... In order to estimate the number of spaces needed for a floating point number, you have to include the space taken by the decimal point, the sign, the exponent character, the sign of the exponent and the digits needed for the exponent. Plus a space to separate the numbers in between... So, be generous and give plenty of printing space. In the example shown above, A5 denotes a character of 5 spaces, I6 and integer of 6 spaces and F12 a floating point number of 12 spaces. The decimal point in F12.7 means that we want a floating point with the accuracy of 7 significant digits. The format directive (F18.16,E24.17,G24.17,G24.17) shows how to print double precision variables. These provide an accuracy of 16-17 significant digits and there is no need for keeping more digits. The command E prints a number in scientific form with an exponent. The command G prints the exponent when it is needed. The numbers before the letters denote multiplicity. Therefore 3F20.16 instructs the printing of 3 floating point numbers by reserving 20 spaces and using 16 significant digits for each one of them. The command write(6,'(200F12.6)')(a(i), i=1,10) shows how to print a large array using an implicit loop. We used many more spaces than actually needed (200F12.16) which is OK. If the array gets larger by increasing the range of i, then we will have enough room for printing in the same line. The program prints (we have folded the long line in order to make it visible): x , i= 123456 3.1415927 3.1415926535897931 0.31415926535897931E+01 3141592653589793.0 50 CHAPTER 1. THE COMPUTER 0.31415926535897933E+19 3.1415926535897931 1.5707963267948966 −1.0000000000000000 0.000000 0.000000 0.000000 . . . . We can organize the format commands by using the FORMAT statement. Then, we use labeled statements in order to refer to them. Labels are numbers put in the beginning of a line which should be unique to a program unit and are within the range 1-99999. We can transfer the control of the program to such a line with a goto command or by using the label in the I/O statements print, write and read as in the example shown below: program f90_format2 i m p l i c i t none integer i real x , a (10) r e a l *8 x8 i = 123456 x = 2.0 * atan2 ( 1 . 0 , 0 . 0 ) p r i n t 100 , ’ x , i = ’ , i , x x8 = 2.0 D0 * atan2 ( 1 . 0 D0 , 0 . 0 D0 ) w r i t e ( 6 , 1 2 3 ) x8 , x8 ,& 1 . 0 D15 * x8 , 1 . 0 D18 * x8 w r i t e ( 6 , 4 4 4 4 ) x8 , x8 / 2 . 0 , c o s ( x8 ) w r i t e (6 ,9999) ( a ( i ) , i = 1 , 1 0 ) 100 FORMAT( A5 , I6 , F12 . 7 ) 123 FORMAT( F18 . 1 6 , E24 . 1 7 , G24 . 1 7 , G24 . 1 7 ) 4444 FORMAT(3 F20 . 1 6 ) 9999 FORMAT(200 F12 . 6 ) end program f90_format2 The reader should also study the Fortran intrinsic functions shown in table 1.2, page 71. 1.4.3 Arrays You may skip this section during the first reading of this book. It will be useful to come back here later. Arrays are related data of the same type which can be accessed by using one or more indices. For example, after a declaration real, dimension(10) :: A, the expressions A (1) , A (2) , . . . , A (10) 1.4. THE FORTRAN PROGRAMMING LANGUAGE 51 refer to its 10 real values. The indices can be integer expressions, for example A ( i ) , B ( 2 * i+3) , C ( INT ( x+y ( j ) ) ) where in the last case we used the integer value of the intrinsic function INT(x), which returns the integer part of x. Note that, arrays and func- tions enclose indices and arguments between parentheses (...) which are of the same style, and the compiler must look at their declarations in order to tell the difference. Examples of array declarations are r e a l , dimension ( 1 0 ) : : a , b r e a l , dimension (20) : : c , d which declare the arrays a, b, c, d, which are of the real kind, with elements a(1) ... a(10), b(1) ... b(10), c(1) ... c(20) and d(1) ... d(20). An equivalent declaration is r e a l : : a ( 1 0 ) , b ( 1 0 ) , c (20) , d (20 ) or i n t e g e r , parameter : : n1 = 1 0 , n2 = 20 real , dimension ( n1 ) : : a , c ( n2 ) real : : b ( n1 ) , d ( n2 ) In the last form, we show how to use constant parameters for declaring the size of arrays. For the declarations shown above, the lower bound of all arrays is 1 and the upper bound for a and b is 10 and for c and d is 20. The upper and lower bound of arrays can be explicitly determined. The declarations i n t e g e r , parameter : : n1 = 1 0 , n2 = 20 real , dimension ( 0 : n1 ) :: a real , dimension(−n1 : n2 ) :: c define the real array a with 11 values a(0) ... a(10) and the array c with 31 values c(-10) c(-9) ... c(-1) c(0) c(1) ... c(20). The arrays shown above have dimension 1 and they are like vectors. We can declare arrays of more than one dimension. This means that we 52 CHAPTER 1. THE COMPUTER need more than one indices in order to determine an array element⁴¹. Therefore, the declaration i n t e g e r , dimension ( 2 , 2 ) :: a defines an integer array with values a(1,1), a(1,2), a(2,1) and a(2,2). The following declarations define two three dimensional real arrays a and b: i n t e g e r , parameter : : n1 = 1 0 , n2 = 20 , n3 = 2* n1+n2 r e a l , dimension ( n1 , n2 , n3 ) :: a r e a l , dimension(−n1 : n1 , 0 : n2 , 1 3 : n3 ) : : b Some important definitions used in the bibliography are: • array: Variables of the same type to which we refer with one or more indices. Variables with only one value are called scalar. • An array’s dimension has an upper bound and a lower bound which define the allowed range of index values. If the lower bound is omitted in a declaration, then it takes the value 1. • The rank of an array is the number of its dimensions, i.e. the number of indices needed to determine its values. • The extent of a dimension it the number of its elements. It is equal to (upper bound)-(lower bound)+1. • The size of an array is the total number of its elements. For a one dimensional array, its size is equal to its extent, whereas for a multi dimensional one, it is equal to the product of the extents of all of its dimensions. • The shape of an array is its rank and extents of all its dimensions. The values of arrays can be set the same way as scalars: integer : : i real : : a (4) , b (2 ,2) b ( 1 , 1 ) = 2.0 ; b ( 1 , 2 ) = 4.0 b ( 2 , 1 ) = 3.4 ; b ( 2 , 2 ) = 7 . 8 ⁴¹Fortran allows up to seven indices in an array. 1.4. THE FORTRAN PROGRAMMING LANGUAGE 53 do i =1 ,4 a(i) = 1.0 enddo Alternatively we can use the name of the array as one object: a = ( / 1 . 0 , 2 . 0 , 3 . 0 , 4.0 / ) b = 0.0 The first line defines the values of an array by using an array constructor. The second line defines all elements of the array b to be equal to 0. This is an example of a very convenient feature of the Fortran language. If all the arrays in an expression are conformable, then we can use the intrinsic Fortran operations to act on whole arrays. Two arrays are conformable if they have the same shape or if one of them is a scalar. Therefore the program integer : : i , j real : : x , y , a (10) , b (10) , c (4 ,4) , d (4 ,4) do i =1 ,10 a(i) = b(i) enddo do j =1 ,4 do i =1 ,4 c ( i , j ) = x * d ( i , j )+y enddo enddo is equivalent to integer : : i , j real : : x , y , a (10) , b (10) , c (4 ,4) , d (4 ,4) a = b c = x * d+y Many Fortran intrinsic functions are elemental. This means that their arguments can be arrays, in which case the function acts on each array element separately. For example, the commands integer : : i , j real : : x , y , a (10) , b (10) , c (4 ,4) , d (4 ,4) 54 CHAPTER 1. THE COMPUTER c = s i n ( d ) + x * exp ( −2.0* d ) c a l l random_number ( a ) set c(i,j) = sin(d(i,j))+x*exp(-2.0*d(i,j)) for all i and j, and the elements of a(i) equal to a random number uniformly distributed in the interval [0, 1). We should stress that in order for two arrays to be conformable, it is not necessary that they have the same lower and upper bounds. For example, the command b=c*d in the following program has the same effect as the do loop: integer : : i real : : b ( 0 : 1 9 ) , c ( 1 0 : 2 9 ) , d ( −9:10) b = c*d do i =1 ,20 b ( i−1) = c ( i+9) * d ( i−10) enddo In the following, we mention some useful functions that act on arrays. Assume that real : : a ( −10:10) , b ( −10:10) , c ( 1 0 , 1 0 ) , d ( 1 0 , 1 0 ) , e ( 1 0 , 1 0 ) then • LBOUND(a) and UBOUND(a) return the lower bound and the upper bound of the array a. In the above example LBOUND(a) = -10 and UBOUND(a) = 10. • c = TRANSPOSE(d) sets c(i,j)=d(j,i). • e = MATMUL(c,d) ∑ sets the array e equal to the matrix product c, d. I.e. e(i,j)= 10 k=1 c(i,k)*d(k,j). Be careful, the command e=c*d sets e(i,j)=c(i,j)*d(i,j). • SUM(a) computes ∑ the sum of all the elements of a. I.e. SUM(a) = 10 i=−10 a(i) • PRODUCT(a) computes ∏10 the product of all the elements of a. I.e. PRODUCT(a) = i=−10 a(i) • DOT_PRODUCT(a,b) computes ∑10the inner product of a, b. I.e. DOT_PRODUCT(a,b) = i=−10 a(i)*b(i) 1.4. THE FORTRAN PROGRAMMING LANGUAGE 55 • MAXVAL(a) and MINVAL(a) return the maximum and minimum val- ues in the array a respectively. You can find more functions and documentation in the bibliography [11, 10]. In the following, we provide some information related to the Input/Output (I/O) of arrays. Input (“reading”) and output (“writing”) of array values can be done by reading and writing their elements in any order we want. In the example below, we read the array a and write the array b in two different ways: integer : : i , j real : : a (4) , b (2 ,2) do i =1 ,4 read * , a ( i ) enddo read * , ( a ( i ) , i = 1 , 4 ) do j =1 ,2 do i =1 ,2 print * , b(i , j) enddo enddo p r i n t * , ( ( b ( i , j ) , i =1 ,2) , j =1 ,2 ) Inside the do loops, input and output is done one element per line from/to standard input/output. The commands (a(i), i=1,4) and ( (b(i,j) i=1,2), j=1,2) are implied do loops and read/write from/to the same line. During input, if the number of values for a are exhausted, then the program tries to read values from the following line(s). Similarly, if the output of b exhausts the maximum number of characters per line, then the output continues in the next line⁴². Try it... We can also preform I/O of arrays without explicit reference to their elements. In this case, the arrays are read/written in a specified order. For example, the program real : : a (4) , b (2 ,2) read *, a read *, b ⁴²If we want to force a long output to be written in one line, then we must replace the * by an explicit format directive, e.g. print '(100I6)',( (c(i,j), i=1,10), j=1,10) 56 CHAPTER 1. THE COMPUTER print * , a , b reads the values a(1) a(2) a(3) a(4) from the stdin. Then, it continues reading b(1,1), b(2,1), b(1,2), b(2,2) from the next line (record). Notice that the array b is read in a column major way. Printing a and b, will print a(1) a(2) a(3) a(4) and b(1,1), b(2,1), b(1,2), b(2,2) in two different records (also in column major mode). Finally, we summarize some of the Fortran capabilities in array ma- nipulation. More details can be found in the bibliography. Read the comments in the program for a partial explanation of each command: program arrays i m p l i c i t none integer : : i , j , n , m real : : a ( 3 ) , b ( 3 , 3 ) , c ( 3 , 3 ) = −99.0 , d ( 3 , 3 ) = −99.0 , s i n t e g e r : : semester (1000) , grade (1000) l o g i c a l : : pass (1000) ! c o n s t r u c t t h e matrix : use t h e RESHAPE f u n c t i o n ! | 1 . 1 −1.2 −1.3| ! | 2 . 1 2.2 −2.3| ! | 3 . 1 3.2 3 . 3 | b = RESHAPE ( ( / 1 . 1 , 2 . 1 , 3 . 1 , & ! ( n o t i c e rows<−>columns ) −1.2 , 2 . 2 , 3 . 2 , & −1.3 , −2.3 , 3.3 / ) , ( / 3 , 3 / ) ) ! same matrix , now exchange rows and columns : ORDER= ( / 2 , 1 / ) b = RESHAPE ( ( / 1 . 2 , −1.2 , −1.3 , & 2 . 1 , 2 . 2 , −2.3 , & 3 . 1 , 3 . 2 , 3.3 / ) , ( / 3 , 3 / ) , ORDER = ( / 2 , 1 / ) ) a = b ( : , 2 ) ! a a s s i g n e d t h e second column o f b : a ( i )=b ( i , 2 ) a = b ( 1 , : ) ! a a s s i g n e d t h e f i r s t row o f b : a ( i )=b ( 1 , i ) a = 2 . 0 * b ( : , 3 ) + s i n ( b ( 2 , : ) ) ! a ( i )= 2* b ( i , 3 ) + s i n ( b ( 2 , i ) ) a = 1 . 0 + 2 . 0 * exp(−a )+b ( : , 3 ) ! a ( i )= 1+2* exp(−a ( i ) )+b ( i , 3 ) s = SUM( b ) ! r e t u r n s sum o f a l l elements of b s = SUM( b , MASK =(b . g t . 0 ) ) ! r e t u r n s sum o f p o s i t i v e e l e m e n t s o f b a = SUM( b , DIM=1) ! each a ( i ) i s t h e sum o f t h e columns o f b a = SUM( b , DIM=2) ! each a ( i ) i s t h e sum o f t h e rows of b ! r e p e a t a l l t h e above using PRODUCT! ! a l l i n s t r u c t i o n s may be e x e c u t e d i n p a r a l l e l a t any order ! FORALL( i = 1 : 3 ) c ( i , i ) = a ( i ) ! s e t t h e d i a g o n a l o f c ! compute upper bounds o f i n d i c e s i n b : n=UBOUND( b , DIM=1) ; m=UBOUND( b , DIM=2) ! l o g needs p o s i t i v e argument , add a r e s t r i c t i o n ( ” mask ” ) FORALL( i =1: n , j =1: m , b ( i , j ) . g t . 0 . 0 ) c ( i , j ) = l o g ( b ( i , j ) ) ! upper t r i a n g u l a r p a r t o f ma t rix : ! c a r e f u l , j = i +1 :m NOT p e r m i t t e d FORALL( i =1: n , j =1: m , i . l t . j ) c(i , j) = b(i , j) ! each s t a t e m e n t e x e c u t e d BEFORE t h e n e x t one ! 1.5. GNUPLOT 57 FORALL( i =2:n −1 , j =2:n−1) ! a l l r i g h t hand s i d e e v a l u a t e d BEFORE t h e assignment ! i . e . , t h e OLD v a l u e s o f b averaged and then a s s i g n e d t o b b ( i , j ) =(b ( i +1 , j )+b ( i −1 , j )+b ( i , j +1)+b ( i , j−1) ) / 4 . 0 c ( i , j ) = 1 . 0 / b ( i +1 , j +1) ! t h e NEW v a l u e s o f b a r e a s s i g n e d END FORALL ! assignment but only f o r el e m e n t s b ( i , j ) which a r e not 0 WHERE ( b . ne . 0 . 0 ) c = 1.0/b !MATMUL( b , c ) i s e v a l u a t e d , then d i s a s s i g n e d t h e r e s u l t only ! a t p o s i t i o n s where b >0. WHERE ( b . gt . 0.0) d = MATMUL( b , c ) WHERE ( grade . ge . 5 ) semester = semester + 1 ! student ’ s s e m e s t e r i n c r e a s e s by 1 pass = . true . ELSEWHERE pass = . false . END WHERE end program arrays The code shown above can be found in the file f90_arrays.f90 of the accompanying software. 1.5 Gnuplot Plotting data is an indispensable tool for their qualitative, but also quanti- tative, analysis. Gnuplot is a high quality, open source, plotting program that can be used for generating publication quality plots, as well as for heavy duty analysis of a large amount of scientific data. Its great ad- vantage is the possibility to use it from the command line, as well as from shell scripts and other programs. Gnuplot is programmable and it is possible to call external programs in order manipulate data and cre- ate complicated plots. There are many mathematical functions built in gnuplot and a fit command for non linear fitting of data. There exist interactive terminals where the user can transform a plot by using the mouse and keyboard commands. This section is brief and only the features, necessary for the fol- lowing chapters, are discussed. For more information visit the offi- cial page of gnuplot http://gnuplot.info. Try the rich demo gallery at http://gnuplot.info/screenshots/, where you can find the type of graph that you want to create and obtain an easy to use recipe for it. The book [14] is an excellent place to look for many of gnuplot’s secrets⁴³. ⁴³A the time of the writing of this book, there was a very nice site www.gnuplotting.org which shows how to create many beautiful and complicated 58 CHAPTER 1. THE COMPUTER You can start a gnuplot session with the gnuplot command: > gnuplot G N U P L O T Version X . XX .... The gnuplot FAQ is available from www . gnuplot . i n f o / faq / .... Terminal type s e t to ’ wxt ’ gnuplot > There is a welcome message and then a prompt gnuplot> is issued wait- ing for your command. Type a command an press [Enter]. Type quit in order to quit the program. In the following, when we show a prompt gnuplot>, it is assumed that the command after the prompt is executed from within gnuplot. Plotting a function is extremely easy. Use the command plot and x as the independent variable of the function⁴⁴. The command gnuplot > p l o t x plots the function y = f (x) = x which is a straight line with slope 1. In order to plot many functions simultaneously, you can write all of them in one line: gnuplot > p l o t [ −5:5][ −2:4] x , x * * 2 , s i n ( x ) , b e s j 0 ( x ) The above command plots the functions x, x2 , sin x and J0 (x). Within the square brackets [:], we set the limits of the x and y axes, respectively. The bracket [-5:5] sets −5 ≤ x ≤ 5 and the bracket [-2:4] sets −2 ≤ y ≤ 4. You may leave the job of setting such limits to gnuplot, by omitting some, or all of them, from the respective positions in the brackets. For example, typing [1:][:5] changes the lower and upper limits of x and y and leaves the upper and lower limits unchanged⁴⁵. plots. ⁴⁴You can change the symbol of the independent variable. For example, the command set dummy t sets the independent variable to be t. ⁴⁵By default, the x and y ranges are determined automatically. In order to force them to be automatic, you can insert a * in the brackets at the corresponding position(s). For example plot [1:*][*:5] sets the upper and lower limits of x and y to be determined automatically. 1.5. GNUPLOT 59 In order to plot data points (xi , yi ), we can read their values from files. Assume that a file data has the following numbers recorded in it: # x y1 y2 0.5 1.0 0.779 1.0 2.0 0.607 1.5 3.0 0.472 2.0 4.0 0.368 2.5 5.0 0.287 3.0 6.0 0.223 The first line is taken by gnuplot as a comment line, since it begins with a #. In fact, gnuplot ignores everything after a #. In order to plot the second column as a function of the first, type the command: gnuplot > p l o t ” data ” using 1 : 2 with points The name of the file is within double quotes. After the keyword using, we instruct gnuplot which columns to use as the x and y coordinates, respectively. The keywords with points instructs gnuplot to add each pair (xi , yi ) to the plot with points. The command gnuplot > p l o t ” data ” using 1 : 3 with lines plots the third column as a function of the first, and the keywords with lines instruct gnuplot to connect each pair (xi , yi ) with a straight line segment. We can combine several plots together in one plot: gnuplot > p l o t ” data ” using 1 : 3 with points , exp ( −0.5* x ) gnuplot > r e p l o t ” data ” using 1 : 2 gnuplot > r e p l o t 2* x The first line plots the 1st and 3rd columns in the file data together with the function e−x/2 . The second line adds the plot of the 1st and 2nd columns in the file data and the third line adds the plot of the function 2x. There are many powerful ways to use the keyword using. Instead of column numbers, we can put mathematical expressions enclosed inside brackets, like using (...):(...). Gnuplot evaluates each expression within the brackets and plots the result. In these expressions, the values 60 CHAPTER 1. THE COMPUTER of each column in the file data are represented as in the awk language. $i are variables that expand to the number read from columns i=1,2,3,.... Here are some examples: gnuplot > p l o t ” data ” using 1 : ( $2 * s i n ( $1 ) * $3 ) with points gnuplot > r e p l o t 2* x * s i n ( x ) * exp(−x / 2 ) The first line plots the 1st column of the file data together with the value yi sin(xi )zi , where yi , xi and zi are the numbers in the 2nd, 1st and 3rd columns respectively. The second line adds the plot of the function 2x sin(x)e−x/2 . gnuplot > p l o t ” data ” using ( l o g ( $1 ) ) : ( l o g ( $2 * * 2 ) ) gnuplot > r e p l o t 2* x+ l o g ( 4 ) The first line plots the logarithm of the 1st column together with the logarithm of the square of the 2nd column. We can plot the data written to the standard output of any command. Assume that there is a program called area that prints the perimeter and area of a circle to the stdout in the form shown below: > . / area R= 3.280000 area= 33.79851 R= 6.280000 area= 123.8994 R= 5.280000 area= 87.58257 R= 4.280000 area= 57.54895 The interesting data is at the second and fourth columns. These can be plotted directly with the gnuplot command: gnuplot > p l o t ”< . / a r e a ” using 2:4 All we have to do is to type the full command after the < within the double quotes. We can create complicated filters using pipes as in the following example: gnuplot > p l o t \ ”< . / a r e a | s o r t −g −k 2 | awk ’{ p r i n t l o g ( $2 ) , l o g ( $4 ) } ’ ” \ using 1 : 2 The filter produces data to the stdout, by combining the action of the commands area, sort and awk. The data printed by the last program is 1.5. GNUPLOT 61 in two columns and we plot the results using 1:2. In order to save plots in files, we have to change the terminal that gnu- plot outputs the plots. Gnuplot can produce plots in several languages (e.g. PDF, postscript, SVG, LATEX, jpeg, png, gif, etc), which can be inter- preted and rendered by external programs. By redirecting the output to a file, we can save the plot to the hard disk. For example: gnuplot > p l o t ” data ” using 1 : 3 gnuplot > s e t t e r m i n a l jpeg gnuplot > s e t output ” data . j p g ” gnuplot > replot gnuplot > s e t output gnuplot > s e t t e r m i n a l wxt The first line makes the plot as usual. The second one sets the output to be in the JPEG format and the third one sets the name of the file to which the plot will be saved. The fourth lines repeats all the previous plotting commands and the fifth one closes the file data.jpg. The last line chooses the interactive terminal wxt to be the output of the next plot. High quality images are usually saved in the PDF, encapsulated postcript or SVG format. Use set terminal pdf,postscript eps or svg, respectively. And now a few words for 3-dimensional (3d) plotting. The next example uses the command splot in order to make a 3d plot of the function f (x, y) = e−x −y . After you make the plot, you can use the 2 2 mouse in order to rotate it and view it from a different perspective: gnuplot > s e t pm3d gnuplot > s e t hidden3d gnuplot > s e t s i z e ratio 1 gnuplot > s e t i s o s a m p l e s 50 gnuplot > s p l o t [ −2:2][ −2:2] exp(−x**2−y * * 2 ) If you have data in the form (xi , yi , zi ) and you want to create a plot of zi = f (xi , yi ), write the data in a file, like in the following example: −1 −1 2.000 −1 0 1.000 −1 1 2.000 0 −1 1.000 0 0 0.000 0 1 1.000 62 CHAPTER 1. THE COMPUTER 1 −1 2.000 1 0 1.000 1 1 2.000 Note the empty line that follows the change of the value of the first column. If the name of the file is data3, then you can plot the data with the commands: gnuplot > s e t pm3d gnuplot > s e t hidden3d gnuplot > s e t s i z e ratio 1 gnuplot > s p l o t ” data3 ” with lines We close this section with a few words on parametric plots. A para- metric plot on the plane (2-dimensions) is a curve (x(t), y(t)), where t is a parameter. A parametric plot in space (3-dimensions) is a surface (x(u, v) , y(u, v), z(u, v)), where (u, v) are parameters. The following com- mands plot the circle (sin t, cos t) and the sphere (cos u cos v, cos u sin v, sin u): gnuplot > s e t p a r a m e t r i c gnuplot > p l o t s i n ( t ) , c o s ( t ) gnuplot > s p l o t c o s ( u ) * c o s ( v ) , c o s ( u ) * s i n ( v ) , s i n ( u ) 1.6 Shell Scripting Complicated system administration tasks are not among the strengths of the Fortran programming language. But in a typical GNU/Linux envi- ronment, there exist many powerful tools that can be used very effectively for this purpose. This way, one can use Fortran for the high performance and scientific computing part of the project and leave the administration and trivial data analysis tasks to other, external, programs. One can avoid repeating the same sequence of commands by coding them in a file. An example can be found in the file script01.csh: # ! / bin / t c s h −f g f o r t r a n area_01 . f90 −o area . / area g f o r t r a n area_02 . f90 −o area . / area 1.6. SHELL SCRIPTING 63 g f o r t r a n area_03 . f90 −o area . / area g f o r t r a n area_04 . f90 −o area . / area This is a very simple shell script. The first line instructs the operating system that the lines that follow are to be interpreted by the program /bin/tcsh⁴⁶. This can be any program in the system, which in our case is the tcsh shell. The following lines are valid commands for the shell, one in each line. They compile the Fortran programs found in the files that we created in section 1.4 with gfortran, and then they run the executable ./area. In order to execute the commands in the file, we have to make sure that the file has the appropriate execute permissions. If not, we have to give the command: > chmod u+x script01 . csh Then we simply type the path to the file script01.csh > . / script01 . csh and the above commands are run the one after the other. Some of the versions of the programs that we wrote are asking for input from the stdin, which, normally, you have to type on the terminal. Instead of interacting directly with the program, we can write the input data to a file Input, and run the command . / area < Input A more convenient solution is to use the, so called, “Here Document”. A “Here Document” is a section of the script that is treated as if it were a separate file. As such, it can be used as input to programs by sending its “contents” to the stdin of the command that runs the program⁴⁷. The “Here Document” does not appear in the filesystem and we don’t need to administer it as a regular file. An example of using a “Here Document” can be found in the file script02.csh: # ! / bin / t c s h −f ⁴⁶Use #!/bin/bash if you prefer the bash shell. ⁴⁷Their great advantage is that we can use variable and command substitution in them, therefore sending this information to the program that we want to run. 64 CHAPTER 1. THE COMPUTER g f o r t r a n area_04 . f90 −o area . / area <<EOF 1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0 10.0 EOF The stdin of the command ./area is redirected to the contents between the lines . / area <<EOF ... EOF The string EOF marks the beginning and the end of the “Here Document”, and can be any string you like. The last EOF has to be placed exactly in the beginning of the line. The power of shell scripting lies in its programming capabilities: Vari- ables, arrays, loops and conditionals can be used in order to create a complicated program. Shell variables can be used as discussed in section 1.1.2: The value of a variable name is $name and it can be set with the command set name = value. An array is defined, for example, by the command s e t R = ( 1 . 0 2.0 3.0 4.0 5.0 6.0 7 . 0 8.0 9.0 1 0 . 0 ) and its data can be accessed using the syntax $R[1] ... $R[10]. Lets take a look at the following script: # ! / bin / t c s h −f s e t files = ( area_01 . f90 area_02 . f90 area_03 . f90 area_04 . f90 ) set R = ( 1 . 0 2.0 3.0 4.0 5.0 6.0 7 . 0 8.0 9.0 1 0 . 0 ) echo ” H e l l o $USER Today i s ” ‘ date ‘ f o r e a c h file ( $files ) echo ” # −−−−−−−−−−− Working on f i l e $ f i l e ” 1.6. SHELL SCRIPTING 65 g f o r t r a n $file −o area . / area <<EOF $R [ 1 ] $R [ 2 ] $R [ 3 ] $R [ 4 ] $R [ 5 ] $R [ 6 ] $R [ 7 ] $R [ 8 ] $R [ 9 ] $R [ 1 0 ] EOF echo ” # −−−−−−−−−−− Done ” i f ( −f AREA . DAT ) c a t AREA . DAT end The first two lines of the script define the values of the arrays files (4 values) and R (10 values). The command echo echoes its argument to the stdin. $USER is the name of the user running the script. `date` is an example of command substitution: When a command is enclosed between backquotes and is part of a string, then the command is executed and its stdout is pasted back to the string. In the example shown above, `date` is replaced by the current date and time in the format produced by the date command. The foreach loop f o r e a c h file ( $files ) ... end is executed once for each of the 4 values of the array files. Each time the value of the variable file is set equal to one of the values area_01.f90, area_02.f90, area_03.f90, area_04.f90. These values can be used by the commands in the loop. Therefore, the command gfortran $file -o area compiles a different file each time that it is executed by the loop. The last line in the loop i f ( −f AREA . DAT ) c a t AREA . DAT is a conditional. It executes the command cat AREA.DAT if the condition -f AREA.DAT is true. In this case, -f constructs a logical expression which is true when the file AREA.DAT exists. We close this section by presenting a more complicated and advanced 66 CHAPTER 1. THE COMPUTER script. It only serves as a demonstration of the shell scripting capabilities. For more information, the reader is referred to the bibliography [16, 17, 18,19,20]. Read carefully the commands, as well as the comments which follow the # mark. Then, write the commands to a file script04.csh⁴⁸, make it an executable file with the command chmod u+x script04.csh and give the command > . / script04 . csh This is my first serious tcsh script The script will run with the words “This is my first serious tcsh script” as its arguments. Notice how these arguments are manipulated by the script. Then, the script asks for the values of the radii of ten or more circles interactively, so that it will compute their perimeter and area. Type them on the terminal and then observe the script’s output, so that you understand the function of each command. You will not regret the time investment! # ! / bin / t c s h −f # Run t h i s s c r i p t as : # . / s c r i p t 0 4 . csh H e l l o t h i s i s a t c s h s c r i p t #−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− # ‘command‘ i s command s u b s t i t u t i o n : i t i s r e p l a c e d by s t d o u t o f command s e t now = ‘ date ‘ ; s e t mypc = ‘ uname −a ‘ # P r i n t i n f o r m a t i o n : v a r i a b l e s a r e expanded w i t h i n double q u o t e s echo ” I am u s e r $user working on t h e computer $HOST” #HOST i s p r e d e f i n e d echo ”Today t h e d a t e i s : $now” #now i s d e f i n e d above echo ”My home d i r e c t o r y i s : $home” #home i s p r e d e f i n e d echo ”My c u r r e n t d i r e c t o r y i s : $cwd” #cwd changes with cd echo ”My computer runs : $mypc” #mypc i s d e f i n e d above echo ”My p r o c e s s i d i s : $$ ” #$$ i s predefined # Manipulate t h e command l i n e : ( $# argv i s number o f e l e m e n t s i n a r r a y argv ) echo ”The command l i n e has $# argv arguments ” echo ”The name o f t h e command I am running i s : $0 ” echo ” Arguments 3rd t o l a s t o f t h e command : $argv [3 −] ” # third to l a s t echo ”The l a s t argument i s : $argv [ $# argv ] ” # l a s t element echo ” A l l arguments : $argv ” # Ask u s e r f o r i n p u t : e n t e r r a d i i o f c i r c l e s echo −n ” Enter r a d i i o f c i r c l e s : ” # v a r i a b l e $< s t o r e s one l i n e o f i n p u t s e t Rs = ( $ <) #Rs i s now an a r r a y with a l l words e n t e r e d by u s e r i f ( $#Rs < 10 ) then #make a t e s t , need a t l e a s t 10 o f them echo ”Need more than 10 r a d i i . E x i t i n g . . . . ” exit (1) endif echo ”You e n t e r e d $#Rs r a d i i , t h e f i r s t i s $Rs [ 1 ] and t h e l a s t $Rs [ $#Rs ] ” echo ” Rs= $Rs ” # Now, compute t h e p e r i m e t e r o f each c i r c l e : f o r e a c h R ( $Rs ) # −v rad=$R s e t t h e awk v a r i a b l e rad equal t o $R . p i=atan2 (0 , −1) = 3 . 1 4 . . . s e t l = ‘awk −v rad=$R ’BEGIN{ p r i n t 2* atan2 (0 , −1) * rad } ’ ‘ ⁴⁸You will find it also in the accompanying software 1.6. SHELL SCRIPTING 67 echo ” C i r c l e with R= $R has p e r i m e t e r $ l ” end # a l i a s d e f i n e s a command t o do what you want : use awk as a c a l c u l a t o r a l i a s acalc ’awk ”BEGIN{ p r i n t \ ! * } ” ’ # \ ! * s u b s t i t u t e s a r g s o f a c a l c echo ” Using a c a l c t o compute 2+3=” ‘ acalc 2+3‘ echo ” Using a c a l c t o compute c o s ( 2 * p i )=” ‘ acalc cos ( 2 * atan2 (0 , −1) ) ‘ # Now do t h e same loop over r a d i i as above i n a d i f f e r e n t way # while ( e x p r e s s i o n ) i s e x e c u t e d as long as ” e x p r e s s i o n ” i s t r u e while ( $#Rs > 0) # e x e c u t e d as long as $Rs c o n t a i n s r a d i i s e t R = $Rs [ 1 ] # t a k e f i r s t element o f $Rs s h i f t Rs #now $Rs has one l e s s element : old $Rs [ 1 ] has vanished s e t a = ‘ acalc atan2 (0 , −1) * ${R }* ${R } ‘ # =p i *R*R c a l c u l a t e d by a c a l c # c o n s t r u c t a f i l e n a m e t o save t h e r e s u l t from t h e v a l u e o f R : s e t file = area$ {R } . dat echo ” C i r c l e with R= $R has a r e a $a ” > $file # save r e s u l t i n a f i l e end #end while # Now look f o r our f i l e s : save t h e i r names i n an a r r a y f i l e s : s e t files = ( ‘ l s −1 area * . dat ‘ ) i f ( $# f i l e s == 0) echo ” Sorry , no a r e a f i l e s found ” echo ”−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−” echo ” f i l e s : $ f i l e s ” l s −l $files echo ”−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−” echo ”And t h e r e s u l t s f o r t h e a r e a a r e : ” f o r e a c h f ( $files ) echo −n ” f i l e ${ f } : ” c a t $f end # now play a l i t t l e b i t with f i l e names : echo ”−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−” s e t f = $files [ 1 ] # t e s t p e r m i s s i o n s on f i r s t f i l e # −f , −r , −w, −x , −d t e s t e x i s t e n c e o f f i l e , rwxd p e r m i s s i o n s # t h e ! n e g a t e s t h e e x p r e s s i o n ( t r u e −> f a l s e , f a l s e −> t r u e ) echo ” t e s t i n g p e r m i s s i o n s on f i l e s : ” i f ( −f $f ) echo ” $ f i l e e x i s t s ” i f ( −r $f ) echo ” $ f i l e i s r e a d a b l e by me” i f ( −w $f ) echo ” $ f i l e i s w r i t a b l e by be ” i f ( ! −w / bin / l s ) echo ” / bin / l s i s NOT w r i t a b l e by me” i f ( ! −x $f ) echo ” $ f i l e i s NOT an e x e c u t a b l e ” i f ( −x / bin / l s ) echo ” / bin / l s i s e x e c u t a b l e by me” i f ( ! −d $f ) echo ” $ f i l e i s NOT a d i r e c t o r y ” i f ( −d / bin ) echo ” / bin i s a d i r e c t o r y ” echo ”−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−” # t r a n s f o r m t h e name o f a f i l e s e t f = $cwd / $f # add t h e f u l l path i n $ f s e t filename = $f : r # removes e x t e n s i o n . dat s e t extension = $f : e # g e t s e x t e n s i o n . dat s e t fdir = $f : h # g e t s directory of $f s e t base = ‘ basename $f ‘ # removes d i r e c t o r y name echo ” f i l e i s : $f ” echo ” f i l e n a m e i s : $ f i l e n a m e ” echo ” e x t e n s i o n i s : $ e x t e n s i o n ” echo ” d i r e c t o r y i s : $ f d i r ” echo ” basename i s : $base ” # now t r a n s f o r m t h e name t o one with d i f f e r e n t e x t e n s i o n : s e t newfile = ${ filename } . jpg echo ” j p e g name i s : $ n e w f i l e ” echo ” j p e g base i s : ” ‘ basename $newfile ‘ i f ( $newfile : e == jpg ) echo ‘ basename $newfile ‘ ” i s a p i c t u r e ” echo ”−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−” # Now save a l l data i n a f i l e using a ” here document ” # A here document s t a r t s with <<EOF and ends with a l i n e 68 CHAPTER 1. THE COMPUTER # s t a r t i n g e x a c t l y with EOF (EOF can be any s t r i n g as below ) # In a ” here document ” we can use v a r i a b l e s and command # substitution : c a t <<AREAS >> areas . dat # This f i l e c o n t a i n s t h e a r e a s o f c i r c l e o f gi v e n r a d i i # Computation done by ${ u s e r } on ${HOST} . Today i s ‘ date ‘ ‘ c a t $files ‘ AREAS # now s e e what we g o t : i f ( −f areas . dat ) c a t areas . dat # You can use a ” here document ” as standard i n p u t t o any command : # use gnuplot t o save a p l o t : gnuplot does t h e j o b and e x i t s . . . gnuplot <<GNU s e t terminal jpeg s e t output ” areas . jpg ” plot ” a r e a s . dat ” using 4 : 7 title ” a r e a s . dat ” ,\ pi * x * x title ” p i *R^2 ” s e t output GNU # check our r e s u l t s : d i s p l a y t h e j p e g f i l e using eog i f ( −f areas . jpg ) eog areas . jpg & 1.6. SHELL SCRIPTING 69 Figure 1.5: In this figure, the Emacs window has been split in three windows. The splitting was done horizontally first (C-x 2), and then vertically (C-x 3). By dragging the mouse (Drag-Mouse-1) on the horizontal mode lines and vertical lines that separate the windows, we can change window sizes. Notice the useful information diplayed on the mode lines. Each window has one point and the cursor is on the active window (in this case the window of the buffer named ELines.f). A buffer with no active changes in its contents is marked by a --, an edited buffer is marked by ** and a buffer in read only mode with (%%). With a mouse click on a %%, we can change them to -- (so that we can edit) and vice versa. With Mouse-3 on the name of a mode we can activate a choice of minor modes. With Mouse-1 on the name of a mode we ca have access to commands relevant to the mode. The numbers (17,31), (16,6) and (10,15) on the mode lines show the (line,column) of the point location on the respective windows. 70 CHAPTER 1. THE COMPUTER awk search for and process patterns in a file, cat display, or join, files cd change working directory chmod change the access mode of a file cp copy files date display current time and date df display the amount of available disk space diff display the differences between two files du display information on disk usage echo echo a text string to output find find files grep search for a pattern in files gzip compress files in the gzip (.gz) format (gunzip to uncompress) head display the first few lines of a file kill send a signal (like KILL) to a process locate search for files stored on the system (faster than find) less display a file one screen at a time ln create a link to a file lpr print files ls list information about files man search information about command in man pages mkdir create a directory mv move and/or rename a file ps report information on the processes run on the system pwd print the working directory rm remove (delete) files rmdir remove (delete) a directory sort sort and/or merge files tail display the last few lines of a file tar store or retrieve files from an archive file top dynamic real-time view of processes wc counts lines, words and characters in a file whatis list man page entries for a command where show where a command is located in the path (alternatively: whereis) which locate an executable program using ”path” zip create compressed archive in the zip format (.zip) unzip get/list contents of zip archive Table 1.1: Basic Unix commands. 1.6. SHELL SCRIPTING 71 Table 1.2: Some intrinsic functions in Fortran. Function Description ABS modulus of a complex number, absolute value of number ACOS arccosine of a number ADJUSTL moves non blank characters of a string to the left ADJUSTR moves non blank characters of a string to the right AIMAG imaginary part of a complex number AINT truncates fractional part but preserves data type ANINT rounds to nearest whole number but pre- serves data type ASIN arcsine of a number ATAN arctangent of a number ATAN2 arctangent of arg1 divided by arg2 re- solved into the correct quadrant CMPLX converts to the COMPLEX data type arg1 + i arg2 CONJG complex conjugate of a complex number COS cosine of an angle in radians COSH hyperbolic cosine DATE_AND_TIME returns current date and time DBLE converts to the real(8) data type DIM if arg1 > arg2, then returns arg1 - arg2; otherwise 0 DPROD double precision product of two single precision numbers EXP exponential EPSILON Returns a positive number that is negligi- ble compared to 1.0 HUGE Returns the largest number of the same kind as the argument INT converts to the INTEGER data type by truncation KIND Returns the KIND value of argument LEN Returns the length of a string Continued... 72 CHAPTER 1. THE COMPUTER Table 1.2: Continued... Function Description LEN_TRIM returns the length of a string without trail- ing blanks LGE,LGT,LLE,LLT string comparison functions LOG natural logarithm LOG10 common logarithm MAX maximum value of arguments MAXEXPONENT returns the maximum exponent of the same kind as the argument MIN minimum value of arguments MINEXPONENT returns the minimum exponent of the same kind as the argument MOD arg1 modulo arg2 NINT converts to the INTEGER data type by rounding RANDOM_NUMBER returns pseudo-random numbers 0 ≤ r < 1 RANDOM_SEED starts random number generator or returns generator parameters PRECISION returns the decimal precision of the same kind as the argument REAL real part of a complex number REAL converts to the REAL data type SIGN if arg2 < 0, then returns -arg1; else +arg1 SIN sine of an angle in radians SINH hyperbolic sine SQRT square root TAN tangent of an angle in radians TANH hyperbolic tangent TINY returns the smallest positive number of the same kind as the argument TRIM returns string with trailing blanks re- moved Array functions ALL true if all values are true ALLOCATED array allocation status ANY true if any values are true COUNT number of elements in an array Continued... 1.6. SHELL SCRIPTING 73 Table 1.2: Continued... Function Description DOT_PRODUCT dot product of two rank-one arrays LBOUND lower dimension bounds of an array MATMUL matrix multiplication MAXLOC location of a maximum value in an array MAXVAL maximum value in an array MERGE merge arrays under mask MINLOC location of a minimum value in an array MINVAL minimum value in an array PACK pack an array into an array of rank one under a mask PRODUCT product of array elements RESHAPE reshape an array SHAPE shape of an array or scalar SIZE size of an array SPREAD replicate an array by adding a dimension SUM sum of array elements TRANSPOSE transpose an array of rank two UBOUND upper dimension bounds of an array UNPACK unpack an array of rank one into an array under a mask 74 CHAPTER 1. THE COMPUTER Table 1.3: Basic Emacs commands. Leaving Emacs suspend Emacs (or iconify it under X) C-z exit Emacs permanently C-x C-c Files read a file into Emacs C-x C-f save a file back to disk C-x C-s save all files C-x s insert contents of another file into this buffer C-x i toggle read-only status of buffer C-x C-q Getting Help The help system is simple. Type C-h (or F1) and follow the directions. If you are a first-time user, type C-h t for a tutorial. remove help window C-x 1 apropos: show commands matching a string C-h a describe the function a key runs C-h k describe a function C-h f get mode-specific information C-h m Error Recovery abort partially typed or executing command C-g recover files lost by a system crash M-x recover-session undo an unwanted change C-x u, C-_ or C-/ restore a buffer to its original contents M-x revert-buffer redraw garbaged screen C-l Incremental Search search forward C-s search backward C-r regular expression search C-M-s abort current search C-g Use C-s or C-r again to repeat the search in either direction. If Emacs is still searching, C-g cancels only the part not matched. Motion entity to move over backward forward character C-b C-f word M-b M-f line C-p C-n go to line beginning (or end) C-a C-e go to buffer beginning (or end) M-< M-> scroll to next screen C-v Continued... 1.6. SHELL SCRIPTING 75 Table 1.3: Continued... scroll to previous screen M-v scroll left C-x < scroll right C-x > scroll current line to center of screen C-u C-l Killing and Deleting entity to kill backward forward character (delete, not kill) DEL C-d word M-DEL M-d line (to end of) M-0 C-k C-k kill region C-w copy region to kill ring M-w yank back last thing killed C-y replace last yank with previous kill M-y Marking set mark here C-@ or C-SPC exchange point and mark C-x C-x mark paragraph M-h mark entire buffer C-x h Query Replace interactively replace a text string M-% or M-x query-replace using regular expressions M-x query-replace-regexp Buffers select another buffer C-x b list all buffers C-x C-b kill a buffer C-x k Multiple Windows When two commands are shown, the second is a similar command for a frame instead of a window. delete all other windows C-x 1 C-x 5 1 split window, above and below C-x 2 C-x 5 2 delete this window C-x 0 C-x 5 0 split window, side by side C-x 3 switch cursor to another window C-x o C-x 5 o grow window taller C-x ^ shrink window narrower C-x { grow window wider C-x } Continued... 76 CHAPTER 1. THE COMPUTER Table 1.3: Continued... Formatting indent current line (indent code etc) TAB insert newline after point C-o fill paragraph M-q Case Change uppercase word M-u lowercase word M-l capitalize word M-c uppercase region C-x C-u lowercase region C-x C-l The Minibuffer The following keys are defined in the minibuffer. complete as much as possible TAB complete up to one word SPC complete and execute RET abort command C-g Type C-x ESC ESC to edit and repeat the last command that used the minibuffer. Type F10 to activate menu bar items on text terminals. Spelling Check check spelling of current word M-$ check spelling of all words in region M-x ispell-region check spelling of entire buffer M-x ispell-buffer On the fly spell checking M-x flyspell-mode Info – Getting Help Within Emacs enter the Info documentation reader C-h i scroll forward SPC scroll reverse DEL next node n previous node p move up u select menu item by name m return to last node you saw l return to directory node d go to top node of Info file t go to any node by name g quit Info q Chapter 2 Kinematics In this chapter we show how to program simple kinematic equations of motion of a particle and how to do basic analysis of numerical results. We use simple methods for plotting and animating trajectories on the two dimensional plane and three dimensional space. In section 2.3 we study numerical errors in the calculation of trajectories of freely moving particles bouncing off hard walls and obstacles. This will be a prelude to the study of the integration of the dynamical equations of motion that we will introduce in the following chapters. 2.1 Motion on the Plane When a particle moves on the plane, its position can be given in Cartesian coordinates (x(t), y(t)). These, as a function of time, describe the particle’s trajectory. The position vector is ⃗r(t) = x(t) x̂ + y(y) ŷ, where x̂ and ŷ are the unit vectors on the x and y axes respectively. The velocity vector is ⃗v (t) = vx (t) x̂ + vy (t) ŷ where d⃗r(t) ⃗v (t) = dt dx(t) dy(t) vx (t) = vy (t) = , (2.1) dt dt The acceleration ⃗a(t) = ax (t) x̂ + ay (t) ŷ is given by d⃗v (t) d2⃗r(t) ⃗a(t) = = dt dt2 dvx (t) d2 x(t) dvy (t) d2 y(t) ax (t) = = ay (t) = = . (2.2) dt dt2 dt dt2 77 78 CHAPTER 2. KINEMATICS y vy v 11 00 00 11 ax vx ay r a ^y x^ x Figure 2.1: The trajectory of a particle moving in the plane. The figure shows its position vector ⃗r, velocity ⃗v and acceleration ⃗a and their Cartesian components in the chosen coordinate system at a point of the trajectory. In this section we study the kinematics of a particle trajectory, there- fore we assume that the functions (x(t), y(t)) are known. By taking their derivatives, we can compute the velocity and the acceleration of the particle in motion. We will write simple programs that compute the values of these functions in a time interval [t0 , tf ], where t0 is the initial and tf is the final time. The continuous functions x(t), y(t), vx (t), vy (t) are approximated by a discrete sequence of their values at the times t0 , t0 + δt, t0 + 2δt, t0 + 3δt, . . . such that t0 + nδt ≤ tf . We will start the design of our program by forming a generic template to be used in all of the problems of interest. Then we can study each problem of particle motion by programming only the equations of mo- tion without worrying about the less important tasks, like input/output, user interface etc. Figure 2.2 shows a flowchart of the basic steps in the algorithm. The first part of the program declares variables and defines the values of the fixed parameters (like π = 3.1459 . . ., g = 9.81, etc). The program starts by interacting with the user (“user interface”) and asks for the values of the variables x0 , y0 , t0 , tf , δt . . .. The program prints these values to the stdout so that the user can check them for correctness and store them in her data. The main calculation is performed in a loop executed while t ≤ tf . The values of the positions and the velocities x(t), y(t), vx (t), vy (t) are 2.1. MOTION ON THE PLANE 79 Declare variables Define fixed parameters (PI,...) User Interface: Get input from user x0,y0, t0, tf, dt, ... Print parameters to stdout Initialize variables and other parameters of the motion Open data file t = t0 END t < tf NO YES Calculate x, y, vx, vy Print results in data file t = t + dt Figure 2.2: The flowchart of a typical program computing the trajectory of a particle from its (kinematic) equations of motion. calculated and printed in a file together with the time t. At this point we fix the format of the program output, something that is very important to do it in a consistent and convenient way for easing data analysis. We choose to print the values t, x, y, vx, vy in five columns in each line of the output file. The specific problem that we are going to solve is the computation of the trajectory of the circular motion of a particle on a circle with center (x0 , y0 ) and radius R with constant angular velocity ω. The position on the circle can be defined by the angle θ, as can be seen in figure 2.3. We define the initial position of the particle at time t0 to be θ(t0 ) = 0. The equations giving the position of the particle at time t are x(t) = x0 + R cos (ω(t − t0 )) y(t) = y0 + R sin (ω(t − t0 )) . (2.3) Taking the derivative w.r.t. t we obtain the velocity vx (t) = −ωR sin (ω(t − t0 )) vy (t) = ωR cos (ω(t − t0 )) , (2.4) 80 CHAPTER 2. KINEMATICS y (R cos θ , R sin θ ) θ (x,y) (x0, y0) ^ y x^ x Figure 2.3: The trajectory of a particle moving on a circle with constant angular velocity calculated by the program Circle.f90. and the acceleration ax (t) = −ω 2 R cos (ω(t − t0 )) = −ω 2 (x(t) − x0 ) ay (t) = −ω 2 R sin (ω(t − t0 )) = −ω 2 (y(t) − y0 ) . (2.5) We note that the above equations imply that R ⃗ · ⃗v = 0 (R ⃗ ≡ ⃗r − ⃗r0 , ⃗v ⊥ R, ⃗ ⃗v tangent to the trajectory) and ⃗a = −ω R (R and ⃗a anti-parallel, ⃗a ⊥ ⃗v ). 2⃗ ⃗ The data structure is quite simple. The constant angular velocity ω is stored in the REAL variable omega. The center of the circle (x0 , y0 ), the radius R of the circle and the angle θ are stored in the REAL variables x0, y0, R, theta. The times at which we calculate the particle’s position and velocity are defined by the parameters t0 , tf , δt and are stored in the REAL variables t0, tf, dt. The current position (x(t), y(t)) is calculated and stored in the REAL variables x, y and the velocity (vx (t), vy (t)) in the REAL variables vx, vy. The declarations of the variables are put in the beginning of the program: r e a l : : x0 , y0 , R , x , y , vx , vy , t , t0 , tf , dt r e a l : : theta , omega r e a l , parameter : : PI =3.1415927 were we defined the value¹ of π = 3.1415927 by using the parameter specification. ¹The reader is reminded that REAL variables are stored in 4 bytes and have an accuracy of about 7 decimal digits. 2.1. MOTION ON THE PLANE 81 The user interface of the program is the interaction of the program with the user and, in our case, it is the part of the program where the user enters the parameters omega, x0, y0, R, t0, tf, dt. The program issues a prompt with the names the variables expected to be read. This is done using simple print statements. The variables are read from the stdin by simple read statements and the values entered by the user are printed to the stdout²: print * , ’ # Enter omega : ’ read * , omega print * , ’ # Enter c e n t e r o f c i r c l e ( x0 , y0 ) and r a d i u s R : ’ read * , x0 , y0 , R print * , ’ # Enter t0 , t f , dt : ’ read * , t0 , tf , dt print * , ’ # omega= ’ , omega print * , ’ # x0= ’ , x0 , ’ y0= ’ , y0 , ’ R= ’ , R print * , ’ # t 0= ’ , t0 , ’ t f = ’ , tf , ’ dt= ’ , dt Next, the program initializes the state of the computation. This includes checking the validity of the parameters entered by the user, so that the computation will be possible. For example, the program computes the expression 2.0*PI/omega, where it is assumed that omega has a non zero value. We will also demand that R > 0 and ω > 0. An if statement will make those checks and if the parameters have illegal values, the stop statement will stop the program execution³. The program opens the file Circle.dat for writing the calculated values of the position and the velocity of the particle. i f (R . l e . 0.0) stop ’ I l l e g a l value of R ’ i f ( omega . l e . 0 . 0 ) s t o p ’ I l l e g a l v a l u e o f omega ’ p r i n t * , ’ # T= ’ , 2 . 0 * PI / omega open ( u n i t =11 , f i l e = ’ C i r c l e . dat ’ ) If R ≤ 0 or ω ≤ 0 the corresponding stop statements are executed which end the program execution. The optional error messages are included after the stop statements which are printed to the stdout. The value of the period T = 2π/ω is also calculated and printed for reference. The open statement uses unit 11 for writing to the file Circle.dat. ²This is done so that the used can check for typos and see the actual value read by the program. By redirecting the stdout of a file on the hard disk, the parameters can be saved for future reference and used in data analysis. ³Note that there are more assumptions that need to be checked by the program. We leave this as an exercise for the reader. 82 CHAPTER 2. KINEMATICS The choice of the unit number is free for the programmer to choose. We recommend using the units 10 to 99 for input/output to files⁴. The main calculation is performed within the loop t = t0 do while ( t . l e . tf ) ......... t = t + dt enddo The first statement sets the initial value of the time. The statements be- tween the do while(condition) and enddo are executed as long as condition has a .TRUE. value. The statement t=t+dt increments the time and this is necessary in order not to enter into an infinite loop. Τhe commands put in place of the dots ......... calculate the position and the velocity and print them to the file Circle.dat: theta = omega * ( t−t0 ) x = x0+R * c o s ( theta ) y = y0+R * s i n ( theta ) vx = −omega * R * s i n ( theta ) vy = omega * R * c o s ( theta ) w r i t e ( 1 1 , * ) t , x , y , vx , vy Notice the use of the intrinsic functions sin and cos that calculate the sine and cosine of an angle expressed in radians. We use the intermediate variable theta in order to store the phase θ(t) = ω(t − t0 ). The command write(11,*) writes the variables t,x,y,vx,vy to the unit 11, which has been associated to the file Circle.dat with the open statement shown above. The program is stored in the file Circle.f90 and can be found in the accompanied software. The extension .f90 is used by the compiler in order to denote source code written in free format Fortran language. Compilation and running can be done using the commands: > g f o r t r a n Circle . f90 −o cl > . / cl The switch -o cl forces the compiler gfortran to write the binary com- ⁴Some numbers can be reserved for special files, like 5 for stdin, 6 for stdout and 0 for stderr. Using numbers larger than 99 can lead to portability problems. 2.1. MOTION ON THE PLANE 83 mands executed by the program to the file⁵ cl. The command ./cl loads the program instructions to the computer memory for execution. When the programs starts execution, it first asks for the parameter data and then performs the calculation. A typical session looks like: > g f o r t r a n Circle . f90 −o cl > . / cl # Enter omega : 1.0 # Enter c e n t e r o f c i r c l e ( x0 , y0 ) and r a d i u s R : 1 . 0 1 . 0 0.5 # Enter t0 , t f , dt : 0.0 20.0 0.01 # omega= 1. # x0= 1 . y0= 1 . R= 0.5 # t 0= 0. t f = 20. dt= 0.00999999978 # T= 6.28318548 The lines shown above that start with a # character are printed by the program and lines without # are the values of the parameters entered interactively by the user. The user types in the parameters and then presses the Enter key in order for the program to read them. Here we have ω = 1.0, x0 = y0 = 1.0, R = 0.5, t0 = 0.0, tf = 20.0 and δt = 0.01. You can execute the above program many times for different values of the parameter by writing the parameter values in a file using an editor. For example, in the file Circle.in type the following data: 1.0 omega 1 . 0 1 . 0 0.5 ( x0 , y0 ) , R 0.0 20.0 0.01 t0 tf dt Each line has the parameters read by the program with a read statement (a record). The rest of the line is ignored by the program and the user can write anything she likes as a comment on how to use the parameters. The program can read the above values of the parameters with the command: > . / cl < Circle . in > Circle . out The command ./cl runs the commands found in the executable file ./cl. The < Circle.in redirects the contents of the file Circle.in to the stan- dard input (stdin) of the command ./cl. This way the program reads ⁵If omitted, the executable file has the default name a.out. 84 CHAPTER 2. KINEMATICS in the values of the parameters from the contents of the file Circle.in. The > Circle.out redirects the standard output (stdout) of the com- mand ./cl to the file Circle.out. Its contents can be inspected after the execution of the program with the command cat: > c a t Circle . out # Enter omega : # Enter c e n t e r o f c i r c l e ( x0 , y0 ) and r a d i u s R : # Enter t0 , t f , dt : # omega= 1. # x0= 1 . y0= 1 . R= 0.5 # t 0= 0. t f = 20. dt= 0.00999999978 # T= 6.28318548 We list the full program in Circle.f90 below: ! ============================================================ ! F i l e C i r c l e . f90 ! C o n s t a n t angular v e l o c i t y c i r c u l a r motion ! S e t ( x0 , y0 ) c e n t e r o f c i r c l e , i t s r a d i u s R and omega . ! At t =t0 , t h e p a r t i c l e i s a t t h e t a =0 !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− program Circle i m p l i c i t none !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ! Declaration of va r ia b le s r e a l : : x0 , y0 , R , x , y , vx , vy , t , t0 , tf , dt r e a l : : theta , omega r e a l , parameter : : PI =3.1415927 !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ! Ask u s e r f o r i n p u t : p r i n t * , ’ # Enter omega : ’ read * , omega p r i n t * , ’ # Enter c e n t e r o f c i r c l e ( x0 , y0 ) and r a d i u s R : ’ read * , x0 , y0 , R p r i n t * , ’ # Enter t0 , t f , dt : ’ read * , t0 , tf , dt p r i n t * , ’ # omega= ’ , omega p r i n t * , ’ # x0= ’ , x0 , ’ y0= ’ , y0 , ’ R= ’ , R p r i n t * , ’ # t 0= ’ , t0 , ’ t f = ’ , tf , ’ dt= ’ , dt !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ! Initialize i f (R . l e . 0.0) stop ’ I l l e g a l value of R ’ i f ( omega . l e . 0 . 0 ) s t o p ’ I l l e g a l v a l u e o f omega ’ p r i n t * , ’ # T= ’ , 2 . 0 * PI / omega open ( u n i t =11 , f i l e = ’ C i r c l e . dat ’ ) !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− 2.1. MOTION ON THE PLANE 85 ! Compute : t = t0 do while ( t . l e . tf ) theta = omega * ( t−t0 ) x = x0+R * c o s ( theta ) y = y0+R * s i n ( theta ) vx = −omega * R * s i n ( theta ) vy = omega * R * c o s ( theta ) w r i t e ( 1 1 , * ) t , x , y , vx , vy t = t + dt enddo close (11) end program Circle 2.1.1 Plotting Data We use gnuplot for plotting the data produced by our programs. The file Circle.dat has the time t and the components x, y, vx, vy in five columns. Therefore we can plot the functions x(t) and y(t) by using the gnuplot commands: gnuplot > p l o t ” C i r c l e . dat ” using 1 : 2 with lines t i t l e ” x ( t ) ” gnuplot > r e p l o t ” C i r c l e . dat ” using 1 : 3 with lines t i t l e ” y ( t ) ” 1.5 4 x(t) theta(t) y(t) pi 1.4 -pi 3 1.3 2 1.2 1 1.1 1 0 0.9 -1 0.8 -2 0.7 -3 0.6 0.5 -4 0 2 4 6 8 10 12 14 16 18 20 0 2 4 6 8 10 12 14 16 18 20 Figure 2.4: The plots (x(t), y(t)) (left) and θ(t) (right) from the data in Circle.dat for ω = 1.0, x0 = y0 = 1.0, R = 0.5, t0 = 0.0, tf = 20.0 and δt = 0.01. The second line puts the second plot together with the first one. The results can be seen in figure 2.4. Let’s see now how we can make the plot of the function θ(t). We can do that using the raw data from the file Circle.dat within gnuplot, with- out having to write a new program. Note that θ(t) = tan−1 ((y − y0 )/(x − x0 )). 86 CHAPTER 2. KINEMATICS The function atan2 is available in gnuplot⁶ as well as in Fortran. Use the online help system in gnuplot in order to see its usage: gnuplot > help atan2 The ‘ atan2 ( y , x ) ‘ f u n c t i o n returns the arc tangent ( inverse tangent ) of the ratio of the r e a l parts of its arguments . ‘ atan2 ‘ returns its argument in radians or degrees , as selected by ‘ s e t a n g l e s ‘ , in the correct quadrant . Therefore, the right way to call the function is atan2(y-y0,x-x0). In our case x0=y0=1 and x, y are in the 2nd and 3rd columns of the file Circle.dat. We can construct an expression after the using command as in page 60, where $2 is the value of the second and $3 the value of the third column: gnuplot > x0 = 1 ; y0 = 1 gnuplot > p l o t ” C i r c l e . dat ” using 1 : ( atan2 ( $3−y0 , $2−x0 ) ) \ with lines t i t l e ” t h e t a ( t ) ” , pi ,−pi The second command is broken in two lines by using the character \ so that it fits conveniently in the text⁷. Note how we defined the val- ues of the variables x0, y0 and how we used them in the expression atan2($3-x0,$2-y0). We also plot the lines which graph the constant functions f1 (t) = π and f2 (t) = −π which mark the limit values of θ(t). The gnuplot variable⁸ pi is predefined and can be used in formed ex- pressions. The result can be seen in the left plot of figure 2.4. The velocity components (vx (t), vy (t)) as function of time as well as the trajectory ⃗r(t) can be plotted with the commands: gnuplot > p l o t ” C i r c l e . dat ” using 1 : 4 t i t l e ” v_x ( t ) ” \ with lines gnuplot > r e p l o t ” C i r c l e . dat ” using 1 : 5 t i t l e ” v_y ( t ) ” \ with lines gnuplot > p l o t ” C i r c l e . dat ” using 2:3 t i t l e ”x−y ” with lines We close this section by showing how to do a simple animation of the particle trajectory using gnuplot. There is a file animate2D.gnu in the accompanied software which you can copy in the directory where you ⁶The command help functions will show you all the available functions in gnuplot. ⁷This can be done on the gnuplot command line as well. ⁸Use the command show variables in order to see the current/default values of gnuplot variables. 2.1. MOTION ON THE PLANE 87 t= 20.000000 (x,y)= (1.208431,1.454485) 1.6 1.4 1.2 1 0.8 0.6 0.4 0.2 0 0 0.2 0.4 0.6 0.8 1 1.2 1.4 1.6 Figure 2.5: The particle trajectory plotted by the gnuplot program in the file animate2D.gnu of the accompanied software. The position vector is shown at a given time t, which is marked on the title of the plot together with the coordinates (x,y). The data is produced by the program Circle.f90 described in the text. have the data file Circle.dat. We are not going to explain how it works⁹ but how to use it in order to make your own animations. The final result is shown in figure 2.5. All that you need to do is to define the data file¹⁰, the initial time t0, the final time tf and the time step dt. These times can be different from the ones we used to create the data in Circle.dat. A full animation session can be launched using the commands: gnuplot > file = ” C i r c l e . dat ” gnuplot > s e t xrange [ 0 : 1 . 6 ] ; s e t yrange [ 0 : 1 . 6 ] gnuplot > t0 = 0 ; tf = 20 ; dt = 0 . 1 gnuplot > load ” animate2D . gnu” The first line defines the data file that animate2D.gnu reads data from. The second line sets the range of the plots and the third line defines the time parameters used in the animation. The final line launches the animation. If you want to rerun the animation, you can repeat the last two commands as many times as you want using the same or different parameters. E.g. if you wish to run the animation at “half the speed” ⁹You are most welcome to study the commands in the script and guess how it works of course! ¹⁰It can be any file that has (t, x, y) in the 1st, 2nd and 3rd columns respectively. 88 CHAPTER 2. KINEMATICS you should simply redefine dt=0.05 and set the initial time to t0=0: gnuplot > t0 = 0 ; dt = 0.05 gnuplot > load ” animate2D . gnu” 2.1.2 More Examples We are now going to apply the steps described in the previous section to other examples of motion on the plane. The first problem that we are going to discuss is that of the small oscillations of a simple pendulum. Figure 2.6 shows the single oscillating degree of freedom θ(t), which is the small angle that the pendulum forms with the √ vertical direction. The motion is periodic with angular frequency ω = g/l and period y x l θ T 111 000 111 000 111 000 111 000 111 000 mg Figure 2.6: The simple pendulum whose motion for θ ≪ 1 is described by the program SimplePendulum.f90. T = 2π/ω. The angular velocity is computed from θ̇ ≡ dθ/dt which gives θ(t) = θ0 cos (ω(t − t0 )) θ̇(t) = −ωθ0 sin (ω(t − t0 )) (2.6) We have chosen the initial conditions θ(t0 ) = θ0 and θ̇(t0 ) = 0. In order to write the equations of motion in the Cartesian coordinate system shown in figure 2.6 we use the relations x(t) = l sin (θ(t)) y(t) = −l cos (θ(t)) dx(t) vx (t) = = lθ̇(t) cos (θ(t)) dt dy(t) vy (t) = = lθ̇(t) sin (θ(t)) . (2.7) dt 2.1. MOTION ON THE PLANE 89 These are similar to the equations (2.3) and (2.4) that we used in the case of the circular motion of the previous section. Therefore the structure of the program is quite similar. Its final form, which can be found in the file SimplePendulum.f90, is: ! ============================================================== ! F i l e SimplePendulum . f90 ! S e t pendulum o r i g i n a l p o s i t i o n a t t h e t a 0 with no i n i t i a l speed !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− program SimplePendulum i m p l i c i t none !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ! Declaration of variables r e a l : : l , x , y , vx , vy , t , t0 , tf , dt r e a l : : theta , theta0 , dtheta_dt , omega r e a l , parameter : : PI =3.1415927 , g =9.81 !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ! Ask u s e r f o r i n p u t : p r i n t * , ’ # Enter l : ’ read * , l p r i n t * , ’ # Enter t h e t a 0 : ’ read * , theta0 p r i n t * , ’ # Enter t0 , t f , dt : ’ read * , t0 , tf , dt p r i n t * , ’ # l = ’ , l , ’ t h e t a 0= ’ , theta0 p r i n t * , ’ # t 0= ’ , t0 , ’ t f = ’ , tf , ’ dt= ’ , dt !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ! Initialize omega = s q r t ( g / l ) p r i n t * , ’ # omega= ’ , omega , ’ T= ’ , 2 . 0 * PI / omega open ( u n i t =11 , f i l e = ’ SimplePendulum . dat ’ ) !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ! Compute : t = t0 do while ( t . l e . tf ) theta = theta0 * c o s ( omega * ( t−t0 ) ) dtheta_dt = −omega * theta0 * s i n ( omega * ( t−t0 ) ) x = l * s i n ( theta ) y = −l * c o s ( theta ) vx = l * dtheta_dt * c o s ( theta ) vy = l * dtheta_dt * s i n ( theta ) w r i t e ( 1 1 , 1 0 0 ) t , x , y , vx , vy , theta , dtheta_dt t = t + dt enddo close (11) 100 FORMAT( 7 G15 . 7 ) end program SimplePendulum 90 CHAPTER 2. KINEMATICS We note that the acceleration of gravity g is hard coded in the program and that the user can only set the length l of the pendulum. The data file SimplePendulum.dat produced by the program, contains two extra columns with the current values of θ(t) and the angular velocity θ̇(t). The statement write(11,100) writes to the unit 11 according to the format set by the FORMAT statement, found in the line labeled by the label 100. This is done so that we can be sure that the data is printed in one line for each value of t (see the discussion on page 48). A simple session for the study of the above problem is shown below¹¹: > g f o r t r a n SimplePendulum . f90 −o sp > . / sp # Enter l : 1.0 # Enter t h e t a 0 : 0.314 # Enter t0 , t f , dt : 0 20 0.01 # l= 1. t h e t a 0= 0.31400001 # t 0= 0. tf= 20. dt= 0.00999999978 # omega= 3.132092 T= 2.0060668 > gnuplot gnuplot > p l o t ” SimplePendulum . dat ” u 1 : 2 w l t ” x ( t ) ” gnuplot > p l o t ” SimplePendulum . dat ” u 1 : 3 w l t ” y ( t ) ” gnuplot > p l o t ” SimplePendulum . dat ” u 1 : 4 w l t ” v_x ( t ) ” gnuplot > r e p l o t ” SimplePendulum . dat ” u 1 : 5 w l t ” v_y ( t ) ” gnuplot > p l o t ” SimplePendulum . dat ” u 1 : 6 w l t ” t h e t a ( t ) ” gnuplot > r e p l o t ” SimplePendulum . dat ” u 1 : 7 w l t ” t h e t a ’ ( t ) ” gnuplot > p l o t [ − 0 . 6 : 0 . 6 ] [ − 1 . 1 : 0 . 1 ] ” SimplePendulum . dat ” \ u 2:3 w l t ”x−y ” gnuplot > file = ” SimplePendulum . dat ” gnuplot > t0 =0; tf =20.0; dt =0.1 gnuplot > s e t xrange [ − 0 . 6 : 0 . 6 ] ; s e t yrange [ − 1 . 1 : 0 . 1 ] gnuplot > load ” animate2D . gnu” The next example is the study of the trajectory of a particle shot near the earth’s surface¹² when we consider the effect of air resistance to be negligible. Then, the equations describing the trajectory of the particle ¹¹Notice that we replaced the command “using 1:2 with lines title” with “u 1:2 w lines t”. These abbreviations can be done with every gnuplot command if an abbreviation uniquely determines a command. ¹²I.e. ⃗g = const. and the Coriolis force can be ignored. 2.1. MOTION ON THE PLANE 91 and its velocity are given by the parametric equations x(t) = v0x t 1 y(t) = v0y t − gt2 2 vx (t) = v0x vy (t) = v0y − gt , (2.8) where t is the parameter. The initial conditions are x(0) = y(0) = 0, vx (0) = v0x = v0 cos θ and vy (0) = v0y = v0 sin θ, as shown in figure 2.7. Figure 2.7: The trajectory of a particle moving under the influence of a constant gravitational field. The initial conditions are set to x(0) = y(0) = 0, vx (0) = v0x = v0 cos θ and vy (0) = v0y = v0 sin θ. The structure of the program is similar to the previous ones. The user enters the magnitude of the particle’s initial velocity and the shooting angle θ in degrees. The initial time is taken to be t0 = 0. The program calculates v0x and v0y and prints them to the stdout. The data is written to the file Projectile.dat. The full program is listed below and it can be found in the file Projectile.f90 in the accompanied software: ! ============================================================ ! F i l e P r o j e c t i l e . f90 ! Shooting a p r o j e c t i l e near t h e e a r t h s u r f a c e . ! No a i r r e s i s t a n c e . ! S t a r t s a t ( 0 , 0 ) , s e t ( v0 , t h e t a ) . !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− program Projectile i m p l i c i t none !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ! Declaration of variables r e a l : : x0 , y0 , R , x , y , vx , vy , t , tf , dt 92 CHAPTER 2. KINEMATICS r e a l : : theta , v0x , v0y , v0 r e a l , parameter : : PI =3.1415927 , g =9.81 !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ! Ask u s e r f o r i n p u t : p r i n t * , ’ # Enter v0 , t h e t a ( i n d e g r e e s ) : ’ read * , v0 , theta p r i n t * , ’ # Enter t f , dt : ’ read * , tf , dt p r i n t * , ’ # v0= ’ , v0 , ’ t h e t a = ’ , theta , ’ o ( d e g r e e s ) ’ p r i n t * , ’ # t 0= ’ , 0 . 0 , ’ t f = ’ , tf , ’ dt= ’ , dt !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ! Initialize i f ( v0 . l e . 0 . 0 ) s t o p ’ I l l e g a l v a l u e o f v0<=0 ’ i f ( theta . l e . 0.0 . or . theta . ge . 9 0 . 0 ) & stop ’ I l l e g a l value of the ta ’ theta = ( PI / 1 8 0 . 0 ) * theta ! c o n v e r t t o r a d i a n s v0x = v0 * c o s ( theta ) v0y = v0 * s i n ( theta ) p r i n t * , ’ # v0x = ’ , v0x , ’ v0y= ’ , v0y open ( u n i t =11 , f i l e = ’ P r o j e c t i l e . dat ’ ) !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ! Compute : t = 0.0 do while ( t . l e . tf ) x = v0x * t y = v0y * t − 0 . 5 * g * t * t vx = v0x vy = v0y − g*t w r i t e ( 1 1 , * ) t , x , y , vx , vy t = t + dt enddo close (11) end program Projectile A typical session for the study of this problem is shown below: > g f o r t r a n Projectile . f90 −o pj > . / pj # Enter v0 , t h e t a ( i n d e g r e e s ) : 10 45 # Enter t f , dt : 1.4416 0.001 # v0= 10.0000000 t h e t a = 45.000000 o ( d e g r e e s ) # t 0= 0.0000000 tf= 1.4416000 dt= 1.00000005E−03 # v0x = 7.0710678 v0y= 7.0710678 > gnuplot gnuplot > p l o t ” P r o j e c t i l e . dat ” using 1 : 2 w l t ” x ( t ) ” gnuplot > r e p l o t ” P r o j e c t i l e . dat ” using 1 : 3 w l t ” y ( t ) ” 2.1. MOTION ON THE PLANE 93 gnuplot > plot ” P r o j e c t i l e . dat ” using 1 : 4 w l t ” v_x ( t ) ” gnuplot > r e p l o t ” P r o j e c t i l e . dat ” using 1 : 5 w l t ” v_y ( t ) ” gnuplot > plot ” P r o j e c t i l e . dat ” using 2:3 w l t ”x−y ” gnuplot > file = ” P r o j e c t i l e . dat ” gnuplot > s e t xrange [ 0 : 1 0 . 3 ] ; s e t yrange [ 0 : 1 0 . 3 ] gnuplot > t0 =0; tf = 1 . 4 4 1 6 ; dt =0.05 gnuplot > load ” animate2D . gnu” Next, we will study the effect of air resistance of the form F⃗ = −mk⃗v . The solutions to the equations of motion Figure 2.8: The forces that act on the particle of figure 2.7 when we assume air resistance of the form F⃗ = −mk⃗v . dvx ax = = −kvx dt dvy ay = = −kvy − g (2.9) dt with initial conditions x(0) = y(0) = 0, vx (0) = v0x = v0 cos θ and vy (0) = v0y = v0 sin θ are¹³ vx (t) = v0x e−kt ( g ) −kt g vy (t) = v0y + e − k k v0x ( −kt ) x(t) = 1−e k 1( g)( ) g y(t) = v0y + 1 − e−kt − t (2.10) k k k Programming the above equations is as easy as before, the only dif- ference being that the user needs to provide the value of the constant k. ¹³The proof of equations (2.10) is left as an exercise for the reader. 94 CHAPTER 2. KINEMATICS The full program can be found in the file ProjectileAirResistance.f90 and it is listed below: ! ============================================================ ! F i l e P r o j e c t i l e A i r R e s i s t a n c e . f90 ! Shooting a p r o j e c t i l e near t h e e a r t h s u r f a c e ! with a i r r e s i s t a n c e ! S t a r t s a t ( 0 , 0 ) , s e t k , ( v0 , t h e t a ) . !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− program ProjectileAirResistance i m p l i c i t none !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ! Declaration of va r ia b le s r e a l : : x0 , y0 , R , x , y , vx , vy , t , tf , dt , k r e a l : : theta , v0x , v0y , v0 r e a l , parameter : : PI =3.1415927 , g =9.81 !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ! Ask u s e r f o r i n p u t : p r i n t * , ’ # Enter k , v0 , t h e t a ( i n d e g r e e s ) : ’ read * , k , v0 , theta p r i n t * , ’ # Enter t f , dt : ’ read * , tf , dt print * , ’# k = ’ , k p r i n t * , ’ # v0= ’ , v0 , ’ t h e t a = ’ , theta , ’ o ( d e g r e e s ) ’ p r i n t * , ’ # t 0= ’ , 0 . 0 , ’ t f = ’ , tf , ’ dt= ’ , dt !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ! Initialize i f ( v0 . l e . 0 . 0 ) s t o p ’ I l l e g a l v a l u e o f v0<=0 ’ if ( k . l e . 0 . 0 ) s t o p ’ I l l e g a l v a l u e o f k <=0 ’ i f ( theta . l e . 0.0 . or . theta . ge . 9 0 . 0 ) & stop ’ I l l e g a l value of the ta ’ theta = ( PI / 1 8 0 . 0 ) * theta ! c o n v e r t t o r a d i a n s v0x = v0 * c o s ( theta ) v0y = v0 * s i n ( theta ) p r i n t * , ’ # v0x = ’ , v0x , ’ v0y= ’ , v0y open ( u n i t =11 , f i l e = ’ P r o j e c t i l e A i r R e s i s t a n c e . dat ’ ) !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ! Compute : t = 0.0 do while ( t . l e . tf ) x = ( v0x / k ) *(1.0 − exp(−k * t ) ) y = ( 1 . 0 / k ) * ( v0y +( g / k ) ) *(1.0 − exp(−k * t ) ) −(g / k ) * t vx = v0x * exp(−k * t ) vy = ( v0y +( g / k ) ) * exp(−k * t ) −(g / k ) w r i t e ( 1 1 , * ) t , x , y , vx , vy t = t + dt enddo close (11) 2.1. MOTION ON THE PLANE 95 end program ProjectileAirResistance 8 x(t) v_x(t) v0x/k 0 1.4 y(t) v_y(t) 7 -(g/k)*x+(g/k**2)+v0y/k -g/k 6 1.2 5 1 4 0.8 3 2 0.6 1 0.4 0 -1 0.2 -2 0 0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1 0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1 Figure 2.9: The plots of x(t),y(t) (left) and vx (t),vy (t) (right) from the data produced by the program ProjectileAirResistance.f90 for k = 5.0, v0 = 10.0, θ = π/4, tf = 0.91 and δt = 0.001. We also plot the asymptotes of these functions as t → ∞. We also list the commands of a typical session of the study of the problem: > g f o r t r a n ProjectileAirResistance . f90 −o pja > . / pja # Enter k , v0 , t h e t a ( i n d e g r e e s ) : 5.0 10.0 45 # Enter t f , dt : 0.91 0.001 # k = 5. # v0= 10. theta= 45. o ( d e g r e e s ) # t 0= 0. t f = 0.910000026 dt= 0.00100000005 # v0x = 7.07106781 v0y= 7.07106781 > gnuplot gnuplot > v0x = 10* c o s ( pi / 4 ) ; v0y = 10* s i n ( pi / 4 ) gnuplot > g = 9.81 ; k = 5 gnuplot > p l o t [ : ] [ : v0x / k + 0 . 1 ] ” P r o j e c t i l e A i r R e s i s t a n c e . dat ” \ using 1 : 2 with lines t i t l e ” x ( t ) ” , v0x / k gnuplot > r e p l o t ” P r o j e c t i l e A i r R e s i s t a n c e . dat ” \ using 1 : 3 with lines t i t l e ” y ( t ) ” ,\ −(g / k ) * x +( g / k * * 2 ) +v0y / k gnuplot > p l o t [ : ] [ − g / k − 0 . 6 : ] ” P r o j e c t i l e A i r R e s i s t a n c e . dat ” \ using 1 : 4 with lines t i t l e ” v_x ( t ) ” , 0 gnuplot > r e p l o t ” P r o j e c t i l e A i r R e s i s t a n c e . dat ” \ using 1 : 5 with lines t i t l e ” v_y ( t ) ” ,−g / k gnuplot > p l o t ” P r o j e c t i l e A i r R e s i s t a n c e . dat ” \ using 2:3 with lines t i t l e ” With a i r r e s i s t a n c e k=5.0 ” gnuplot > r e p l o t ” P r o j e c t i l e . dat ” \ 96 CHAPTER 2. KINEMATICS 3 With air resistance k=5.0 No air resistance k=0.0 2.5 2 1.5 1 0.5 0 0 2 4 6 8 10 12 Figure 2.10: Trajectories of the particles shot with v0 = 10.0, θ = π/4 in the absence of air resistance and when the air resistance is present in the form F⃗ = −mk⃗v with k = 5.0. using 2:3 with lines t i t l e ”No a i r r e s i s t a n c e k=0.0 ” gnuplot > file = ” P r o j e c t i l e A i r R e s i s t a n c e . dat ” gnuplot > s e t xrange [ 0 : 1 . 4 ] ; s e t yrange [ 0 : 1 . 4 ] gnuplot > t0 =0; tf = 0 . 9 1 ; dt =0.01 gnuplot > load ” animate2D . gnu” Long commands have been continued to the next line as before. We defined the gnuplot variables v0x, v0y, g and k to have the values that we used when running the program. We can use them in order to construct the asymptotes of the plotted functions of time. The results are shown in figures 2.9 and 2.10. The last example of this section will be that of the anisotropic har- monic oscillator. The force on the particle is Fx = −mω12 x Fy = −mω22 y (2.11) where the “spring constants” k1 = mω12 and k2 = mω22 are different in the directions of the axes x and y. The solutions of the dynamical equations of motion for x(0) = A, y(0) = 0, vx (0) = 0 and vy (0) = ω2 A are x(t) = A cos(ω1 t) y(t) = A sin(ω2 t) vx (t) = −ω1 A sin(ω1 t) vy (t) = ω2 A cos(ω2 t) . (2.12) If the angular frequencies ω1 and ω2 satisfy certain relations, the trajec- tories of the particle are closed and self intersect at a given number of 2.1. MOTION ON THE PLANE 97 points. The proof of these relations, as well as their numerical confirma- tion, is left as an exercise for the reader. The program listed below is in the file Lissajoux.f90: ! ============================================================ ! F i l e L i s s a j o u s . f90 ! Lissajous curves ( s p e c i a l case ) ! x ( t )= c o s ( o1 t ) , y ( t )= s i n ( o2 t ) !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− program Lissajous i m p l i c i t none !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ! Declaration of variables r e a l x0 , y0 , R , x , y , vx , vy , t , t0 , tf , dt r e a l o1 , o2 , T1 , T2 r e a l , parameter : : PI =3.1415927 !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ! Ask u s e r f o r i n p u t : p r i n t * , ’ # Enter omega1 and omega2 : ’ read * , o1 , o2 p r i n t * , ’ # Enter t f , dt : ’ read * , tf , dt p r i n t * , ’ # o1= ’ , o1 , ’ o2= ’ , o2 p r i n t * , ’ # t 0= ’ , 0 . 0 , ’ t f = ’ , tf , ’ dt= ’ , dt !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ! Initialize i f ( o1 . l e . 0 . 0 . or . o2 . l e . 0 . 0 ) s t o p ’ omega1 or omega2<=0 ’ T1 = 2 . 0 * PI / o1 T2 = 2 . 0 * PI / o2 p r i n t * , ’ # T1= ’ , T1 , ’ T2= ’ , T2 open ( u n i t =11 , f i l e = ’ L i s s a j o u s . dat ’ ) !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ! Compute : t = 0.0 do while ( t . l e . tf ) x = c o s ( o1 * t ) y = s i n ( o2 * t ) vx = −o1 * s i n ( o1 * t ) vy = o2 * c o s ( o2 * t ) w r i t e ( 1 1 , * ) t , x , y , vx , vy t = t + dt enddo close (11) end program Lissajous We have set A = 1 in the program above. The user must enter the two angular frequencies ω1 and ω2 and the corresponding times. A typical 98 CHAPTER 2. KINEMATICS session for the study of the problem is shown below: > g f o r t r a n Lissajous . f90 −o lsj > . / lsj # Enter omega1 and omega2 : 3 5 # Enter t f , dt : 10.0 0.01 # o1= 3 . o2= 5. # t 0= 0. t f = 1 0 . dt= 0.00999999978 # T1= 2.09439516 T2= 1.2566371 >gnuplot gnuplot > p l o t ” L i s s a j o u s . dat ” using 1 : 2 w l t ”x ( t ) ” gnuplot > r e p l o t ” L i s s a j o u s . dat ” using 1 : 3 w l t ”y ( t ) ” gnuplot > p l o t ” L i s s a j o u s . dat ” using 1 : 4 w l t ” v_x ( t ) ” gnuplot > r e p l o t ” L i s s a j o u s . dat ” using 1 : 5 w l t ” v_y ( t ) ” gnuplot > p l o t ” L i s s a j o u s . dat ” using 2:3 w l t ”x−y f o r 3:5 ” gnuplot > file = ” L i s s a j o u s . dat ” gnuplot > s e t xrange [ − 1 . 1 : 1 . 1 ] ; s e t yrange [ −1.1:1.1] gnuplot > t0 =0; tf =10; dt =0.1 gnuplot > load ” animate2D . gnu” The results for ω1 = 3 and ω2 = 5 are shown in figure 2.11. t= 6.400000 (x,y)= (0.949047,0.509265) 1 0.5 0 -0.5 -1 -1 -0.5 0 0.5 1 Figure 2.11: The trajectory of the anisotropic oscillator with ω1 = 3 and ω2 = 5. 2.2. MOTION IN SPACE 99 2.2 Motion in Space By slightly generalizing the methods described in the previous section, we will study the motion of a particle in three dimensional space. All we have to do is to add an extra equation for the coordinate z(t) and the component of the velocity vz (t). The structure of the programs will be exactly the same as before. y x θ l z T r θ v ωt Txy 00 11 00 11 00 11 mg Figure 2.12: The conical pendulum of the program ConicalPendulum.f90. The first example is the conical pendulum, which can be seen in figure 2.12. The particle moves on the xy plane with constant angular velocity ω. The equations of motion are derived from the relations Tz = T cos θ = mg Txy = T sin θ = mω 2 r , (2.13) where r = l sin θ. Their solution¹⁴ is x(t) = r cos ωt y(t) = r sin ωt z(t) = −l cos θ , (2.14) ¹⁴One has to choose appropriate initial conditions. Exercise: find them! 100 CHAPTER 2. KINEMATICS where we have to substitute the values g cos θ = ω2l √ sin θ = 1 − cos2 θ g sin θ r = . (2.15) ω 2 cos θ For the velocity components we obtain vx = −rω sin ωt vy = rω cos ωt vz = 0 . (2.16) Therefore we must have √ g ω ≥ ωmin = , (2.17) l and when ω → ∞, θ → π/2. In the program that we will write, the user must enter the parameters l, ω, the final time tf and the time step δt. We take t0 = 0. The convention that we follow for the output of the results is that they should be written in a file where the first 7 columns are the values of t, x, y, z, vx , vy and vz . Each line in this file is long and, in order to prevent Fortran from breaking it into two separate lines, we have to give an explicit format specification. See the discussion on page 48. The full program is listed below: ! ============================================================ ! F i l e ConicalPendulum . f90 ! S e t pendulum angular v e l o c i t y omega and d i s p l a y motion i n 3D !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− program ConicalPendulum i m p l i c i t none !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ! Declaration of va r ia b le s r e a l : : l , r , x , y , z , vx , vy , vz , t , tf , dt r e a l : : theta , cos_theta , sin_theta , omega r e a l , parameter : : PI =3.1415927 , g =9.81 !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ! Ask u s e r f o r i n p u t : p r i n t * , ’ # Enter l , omega : ’ read * , l , omega p r i n t * , ’ # Enter t f , dt : ’ 2.2. MOTION IN SPACE 101 read * , tf , dt print * , ’# l= ’ , l , ’ omega= ’ , omega p r i n t * , ’ # T= ’ , 2 . 0 * PI / omega , ’ omega_min= ’ , s q r t ( g / l ) p r i n t * , ’ # t 0= ’ , 0 . 0 , ’ t f = ’ , tf , ’ dt= ’ , dt !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ! Initialize cos_theta = g / ( omega * omega * l ) i f ( cos_theta . ge . 1 ) s t o p ’ c o s ( t h e t a )>= 1 ’ sin_theta = s q r t (1.0 − cos_theta * cos_theta ) z = −g / ( omega * omega ) ! they remain c o n s t a n t throught vz= 0.0 ! t h e motion r = g / ( omega * omega ) * sin_theta / cos_theta open ( u n i t =11 , f i l e = ’ ConicalPendulum . dat ’ ) !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ! Compute : t = 0.0 do while ( t . l e . tf ) x = r * c o s ( omega * t ) y = r * s i n ( omega * t ) vx = −r * s i n ( omega * t ) * omega vy = r * c o s ( omega * t ) * omega w r i t e ( 1 1 , 1 0 0 ) t , x , y , z , vx , vy , vz t = t + dt enddo close (11) 100 FORMAT(20 G15 . 7 ) end program ConicalPendulum In order to compile and run the program we can use the commands shown below: > g f o r t r a n ConicalPendulum . f90 −o cpd > . / cpd # Enter l , omega : 1 . 0 6.28 # Enter t f , dt : 10.0 0.01 # l= 1 . omega= 6.28000021 # T= 1.00050724 omega_min= 3.132092 # t 0= 0. t f = 1 0 . dt= 0.00999999978 The results are recorded in the file ConicalPendulum.dat. In order to plot the functions x(t), y(t), z(t), vx (t), vy (t), vz (t) we give the following gnuplot commands: > gnuplot gnuplot > p l o t ” ConicalPendulum . dat ” u 1 : 2 w l t ” x ( t ) ” 102 CHAPTER 2. KINEMATICS gnuplot > replot ” ConicalPendulum . dat ” u 1:3 w l t ”y ( t ) ” gnuplot > replot ” ConicalPendulum . dat ” u 1:4 w l t ”z( t )” gnuplot > plot ” ConicalPendulum . dat ” u 1:5 w l t ” v_x ( t ) ” gnuplot > replot ” ConicalPendulum . dat ” u 1:6 w l t ” v_y ( t ) ” gnuplot > replot ” ConicalPendulum . dat ” u 1:7 w l t ” v_z ( t ) ” The results are shown in figure 2.13. In order to make a three dimen- 1 8 x(t) v_x(t) y(t) v_y(t) 0.8 z(t) v_z(t) 6 0.6 4 0.4 2 0.2 0 0 -0.2 -2 -0.4 -4 -0.6 -6 -0.8 -1 -8 0 1 2 3 4 5 6 7 8 9 10 0 1 2 3 4 5 6 7 8 9 10 Figure 2.13: The plots of the functions x(t), y(t), z(t), vx (t), vy (t), vz (t) of the program ConicalPendulum.f90 for ω = 6.28, l = 1.0. sional plot of the trajectory, we should use the gnuplot command splot: gnuplot > s p l o t ” ConicalPendulum . dat ” u 2 : 3 : 4 w l t ” r ( t ) ” The result is shown in figure 2.14. We can click on the trajectory and rotate it and view it from a different angle. We can change the plot limits with the command: gnuplot > s p l o t [ − 1 . 1 : 1 . 1 ] [ − 1 . 1 : 1 . 1 ] [ − 0 . 3 : 0 . 0 ] \ ” ConicalPendulum . dat ” using 2 : 3 : 4 w l t ” r ( t ) ” We can animate the trajectory of the particle by using the file animate3D.gnu from the accompanying software. The commands are similar to the ones we had to give in the two dimensional case for the planar trajectories when we used the file animate2D.gnu: gnuplot > file = ” ConicalPendulum . dat ” gnuplot > s e t xrange [ − 1 . 1 : 1 . 1 ] ; s e t yrange [ − 1 . 1 : 1 . 1 ] gnuplot > s e t zrange [ − 0 . 3 : 0 ] gnuplot > t0 =0; tf =10; dt =0.1 gnuplot > load ” animate3D . gnu” 2.2. MOTION IN SPACE 103 Figure 2.14: The plot of the particle trajectory ⃗r(t) of the program ConicalPendulum.f90 for ω = 6.28, l = 1.0. We can click and drag with the mouse on the window and rotate the curve and see it from a different angle. At the bottom left of the window, we see the viewing direction, given by the angles θ = 55.0 degrees (angle with the z axis) and ϕ = 62 degrees (angle with the x axis). The result can be seen in figure 2.15. The program animate3D.gnu can be used on the data file of any program that prints t x y z as the first words on each of its lines. All we have to do is to change the value of the file variable in gnuplot. Next, we will study the trajectory of a charged particle in a homoge- neous magnetic field B ⃗ = B ẑ. At time t0 , the particle is at ⃗r0 = x0 x̂ and its velocity is ⃗v0 = v0y ŷ + v0z ẑ, see figure 2.16. The magnetic force on the particle is F⃗ = q(⃗v × B) ⃗ = qBvy x̂ − qBvx ŷ and the equations of motion are dvx qB ax = = ωvy ω≡ dt m dvy ay = = −ωvx dt az = 0. (2.18) By integrating the above equations with the given initial conditions we obtain vx (t) = v0y sin ωt vy (t) = v0y cos ωt vz (t) = v0z . (2.19) 104 CHAPTER 2. KINEMATICS t= 10.100000 (x,y,z)= (0.964311,-0.090732,-0.248742) 0 -0.05 -0.1 z-0.15 -0.2 -0.25 -0.3 -1 0.5 1 -0.5 0 0 x 0.5 -0.5 y 1 -1 Figure 2.15: The particle trajectory ⃗r(t) computed by the program ConicalPendulum.f90 for ω = 6.28, l = 1.0 and plotted by the gnuplot script animate3D.gnu. The title of the plot shows the current time and the particles coor- dinates. Integrating once more, we obtain the position of the particle as a function of time ( v0y ) v0y x(t) = x0 + − cos ωt = x0 cos ωt ω ω v0y v0y y(t) = sin ωt = −x0 sin ωt με x0 = − ω ω z(t) = v0z t , (2.20) where we have chosen x0 = −v0y /ω. This choice places the center of the circle, which is the projection of the trajectory on the xy plane, to be at the origin of the coordinate system. The trajectory is a helix with radius R = −x0 and pitch v0z T = 2πv0z /ω. We are now ready to write a program that calculates the trajectory given by (2.20). The user enters the parameters v0 and θ, shown in figure 2.16, as well as the angular frequency ω (Larmor frequency). The components of the initial velocity are v0y = v0 cos θ and v0z = v0 sin θ. The initial position is calculated from the equation x0 = −v0y /ω. The program can be found in the file ChargeInB.f90: 2.2. MOTION IN SPACE 105 z B v0z v0 x0 θ v0y y x Figure 2.16: A particle at time t0 = 0 is at the position ⃗r0 = x0 x̂ with velocity ⃗ = B ẑ. ⃗v0 = v0y ŷ + v0z ẑ in a homogeneous magnetic field B ! =========================================================== ! F i l e ChargeInB . f90 !A charged p a r t i c l e o f mass m and charge q e n t e r s a magnetic ! f i e l d B i n +z d i r e c t i o n . I t e n t e r s with v e l o c i t y ! v0x =0 , v0y=v0 c o s ( t h e t a ) , v0z=v0 s i n ( t h e t a ) , 0<= t h e t a < p i / 2 ! a t t h e p o s i t i o n x0=−v0y / omega , omega=q B/m ! ! Enter v0 and t h e t a and s e e t r a j e c t o r y from ! t 0=0 t o t f a t s t e p dt !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− program ChargeInB i m p l i c i t none !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ! Declaration of variables r e a l : : x , y , z , vx , vy , vz , t , tf , dt r e a l : : x0 , y0 , z0 , v0x , v0y , v0z , v0 r e a l : : theta , omega r e a l , parameter : : PI =3.1415927 !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ! Ask u s e r f o r i n p u t : p r i n t * , ’ # Enter omega : ’ read * , omega p r i n t * , ’ # Enter v0 , t h e t a ( d e g r e e s ) : ’ read * , v0 , theta p r i n t * , ’ # Enter t f , dt : ’ read * , tf , dt p r i n t * , ’ # omega= ’ , omega , ’ T= ’ , 2 . 0 * PI / omega p r i n t * , ’ # v0= ’ , v0 , ’ t h e t a = ’ , theta , ’ o ( d e g r e e s ) ’ p r i n t * , ’ # t 0= ’ ,0.0 , ’ tf= ’ , tf , ’ dt= ’ , dt !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− 106 CHAPTER 2. KINEMATICS ! Initialize i f ( theta . l t . 0 . 0 . or . theta . ge . 9 0 . 0 ) s t o p ’ I l l e g a l 0< t h e t a <90 ’ theta = ( PI / 1 8 0 . 0 ) * theta ! c o n v e r t t o r a d i a n s v0y = v0 * c o s ( theta ) v0z = v0 * s i n ( theta ) p r i n t * , ’ # v0x= ’ , 0 . 0 , ’ v0y= ’ , v0y , ’ v0z= ’ , v0z x0 = − v0y / omega p r i n t * , ’ # x0= ’ , x0 , ’ y0= ’ , 0 . 0 , ’ z0= ’ , 0 . 0 p r i n t * , ’ # xy plane : C i r c l e with c e n t e r ( 0 , 0 ) and R= ’ ,ABS( x0 ) p r i n t * , ’ # s t e p o f h e l i x : s=v0z *T= ’ , v0z * 2 . 0 * PI / omega open ( u n i t =11 , f i l e = ’ ChargeInB . dat ’ ) !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ! Compute : t = 0.0 vz = v0z do while ( t . l e . tf ) x = x0 * c o s ( omega * t ) y = −x0 * s i n ( omega * t ) z = v0z * t vx = v0y * s i n ( omega * t ) vy = v0y * c o s ( omega * t ) w r i t e ( 1 1 , 1 0 0 ) t , x , y , z , vx , vy , vz t = t + dt enddo close (11) 100 FORMAT(20 G15 . 7 ) end program ChargeInB A typical session in which we calculate the trajectories shown in figures 2.17 and 2.18 is shown below: 3.5 1 x(t) v_x(t) y(t) v_y(t) z(t) 0.8 v_z(t) 3 0.6 2.5 0.4 2 0.2 1.5 0 -0.2 1 -0.4 0.5 -0.6 0 -0.8 -0.5 -1 0 1 2 3 4 5 6 7 8 9 10 0 1 2 3 4 5 6 7 8 9 10 Figure 2.17: The plots of the x(t), y(t), z(t), vx (t), vy (t), vz (t) functions calculated by the program in ChargeInB.f90 for ω = 6.28, x0 = 1.0, θ = 20 degrees. 2.3. TRAPPED IN A BOX 107 > g f o r t r a n ChargeInB . f90 −o chg > . / chg # Enter omega : 6.28 # Enter v0 , t h e t a ( d e g r e e s ) : 1 . 0 20 # Enter t f , dt : 10 0.01 # omega= 6.28000021 T= 1.00050724 # v0= 1 . theta= 20. o ( d e g r e e s ) # t 0= 0. t f = 1 0 . dt= 0.00999999978 # v0x= 0 . v0y= 0.939692616 v0z= 0.342020124 # x0= −0.149632573 y0= 0 . z0= 0. # xy plane : C i r c l e with c e n t e r ( 0 , 0 ) and R= 0.149632573 # s t e p o f h e l i x : s=v0z *T= 0.342193604 > gnuplot gnuplot > p l o t ” ChargeInB . dat ” u 1 : 2 w l t i t l e ”x ( t ) ” gnuplot > r e p l o t ” ChargeInB . dat ” u 1 : 3 w l t i t l e ”y ( t ) ” gnuplot > r e p l o t ” ChargeInB . dat ” u 1 : 4 w l t i t l e ”z ( t )” gnuplot > p l o t ” ChargeInB . dat ” u 1 : 5 w l t i t l e ” v_x ( t ) ” gnuplot > r e p l o t ” ChargeInB . dat ” u 1 : 6 w l t i t l e ” v_y ( t ) ” gnuplot > r e p l o t ” ChargeInB . dat ” u 1 : 7 w l t i t l e ” v_z ( t ) ” gnuplot > s p l o t ” ChargeInB . dat ” u 2 : 3 : 4 w l t i t l e ” r ( t ) ” gnuplot > file = ” ChargeInB . dat ” gnuplot > s e t xrange [ − 0 . 6 5 : 0 . 6 5 ] ; s e t yrange [ −0 . 6 5 : 0 . 6 5 ] gnuplot > s e t zrange [ 0 : 1 . 3 ] gnuplot > t0 =0; tf = 3 . 5 ; dt =0.1 gnuplot > load ” animate3D . gnu” 2.3 Trapped in a Box In this section we will study the motion of a particle that is free, except when bouncing elastically on a wall or on certain obstacles. This motion is calculated by approximate algorithms that introduce systematic errors. These types of errors¹⁵ are also encountered in the study of more compli- cated dynamics, but the simplicity of the problem will allow us to control them in a systematic and easy to understand way. ¹⁵In the previous sections, our calculations had a small systematic error due to the approximate nature of numerical floating point operations which approximate exact real number calculations. But the algorithms used were not introducing systematic errors like in the cases discussed in this section. 108 CHAPTER 2. KINEMATICS t= 3.500000 (x,y,z)= (0.149623,0.001671,1.197069) 1.2 1 z 0.8 0.6 0.4 0.2 0 -0.6 0.6 -0.4 0.4 -0.2 0.2 0 0 x 0.2 -0.2 y 0.4 -0.4 0.6 -0.6 Figure 2.18: The trajectory ⃗r(t) calculated by the program in ChargeInB.f90 for ω = 6.28, v0 = 1.0, θ = 20 degrees as shown by the program animate3D.gnu. The current time and the coordinates of the particle are printed on the title of the plot. 2.3.1 The One Dimensional Box The simplest example of such a motion is that of a particle in a “one dimensional box”. The particle moves freely on the x axis for 0 < x < L, as can be seen in figure 2.19. When it reaches the boundaries x = 0 and x = L it bounces and its velocity instantly reversed. Its potential energy is { 0 0<x<L V (x) = , (2.21) +∞ elsewhere which has the shape of an infinitely deep well. The force F = −dV (x)/dx = 0 within the box and F = ±∞ at the position of the walls. Initially we have to know the position of the particle x0 as well as its velocity v0 (the sign of v0 depends on the direction of the particle’s motion) at time t0 . As long as the particle moves within the box, its motion is free and x(t) = x0 + v0 (t − t0 ) v(t) = v0 . (2.22) 2.3. TRAPPED IN A BOX 109 x 1111 0000 v 1111 0000 1111 0000 1111111111111 0000000000000 1111 0000 1111 0000 11111111111111111111111111111111 00000000000000000000000000000000 L Figure 2.19: A particle in a one dimensional box with its walls located at x = 0 and x = L. For a small enough change in time δt, so that there is no bouncing on the wall in the time interval (t, t + δt), we have that x(t + δt) = x(t) + v(t)δt v(t + δt) = v(t) . (2.23) Therefore we could use the above relations in our program and when the particle bounces off a wall we could simple reverse its velocity v(t) → −v(t). The devil is hiding in the word “when”. Since the time interval δt is finite in our program, there is no way to know the instant of the collision with accuracy better than ∼ δt. However, our algorithm will change the direction of the velocity at time t + δt, when the particle will have already crossed the wall. This will introduce a systematic error, which is expected to decrease with decreasing δt. One way to implement the above idea is by constructing the loop do while ( t . l e . tf ) write (11 ,*) t , x , v x = x + v * dt t = t + dt i f ( x . l t . 0.0 . or . x . g t . L ) v = −v enddo where the last line gives the testing condition for the wall collision and the subsequent change of the velocity. The full program that realizes the proposed algorithm is listed below and can be found in the file box1D_1.f90. The user can set the size of the box L, the initial conditions x0 and v0 at time t0, the final time tf and the time step dt: 110 CHAPTER 2. KINEMATICS ! ============================================================ ! F i l e box1D_1 . f90 ! Motion o f a f r e e p a r t i c l e i n a box 0<x<L ! Use i n t e g r a t i o n with time s t e p dt : x = x + v * dt !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− program box1D i m p l i c i t none !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ! Declaration of va r ia b le s r e a l : : L , x0 , v0 , t0 , tf , dt , t , x , v !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ! Ask u s e r f o r i n p u t : p r i n t * , ’ # Enter L : ’ read * , L print * , ’# L = ’ , L i f ( L . l e . 0 . 0 ) s t o p ’L must be p o s i t i v e . ’ p r i n t * , ’ # Enter x0 , v0 : ’ read * , x0 , v0 p r i n t * , ’ # x0= ’ , x0 , ’ v0= ’ , v0 i f ( x0 . l t . 0.0 . or . x0 . g t . L ) s t o p ’ i l l e g a l v a l u e o f x0 . ’ i f ( v0 . eq . 0.0 ) s t o p ’ i l l e g a l v a l u e o f v0 = 0 . ’ p r i n t * , ’ # Enter t0 , t f , dt : ’ read * , t0 , tf , dt p r i n t * , ’ # t 0= ’ , t0 , ’ t f = ’ , tf , ’ dt= ’ , dt !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ! Initialize t = t0 x = x0 v = v0 open ( u n i t =11 , f i l e = ’ box1D_1 . dat ’ ) !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ! Compute : do while ( t . l e . tf ) write (11 ,*) t , x , v x = x + v * dt t = t + dt i f ( x . l t . 0.0 . or . x . g t . L ) v = −v enddo close (11) end program box1D The computed data is recorded in the file box1D_1.dat in three columns. Compiling, running and plotting the trajectory using gnuplot can be done as follows: > g f o r t r a n box1D_1 . f90 −o box1 > . / box1 # Enter L : 2.3. TRAPPED IN A BOX 111 10 # L = 10. # Enter x0 , v0 : 0 1.0 # x0= 0 . v0= 1. # Enter t0 , t f , dt : 0 100 0.01 # t 0= 0. t f = 100. dt= 0.00999999978 > gnuplot gnuplot > p l o t ” box1D_1 . dat ” using 1 : 2 w l t i t l e ” x ( t ) ” ,\ 0 notitle , 1 0 notitle gnuplot > p l o t [ : ] [ − 1 . 2 : 1 . 2 ] ” box1D_1 . dat ” \ using 1 : 3 w l t i t l e ” v ( t ) ” 12 x(t) 10 8 x(t) 10.0002 6 10.0001 10.0001 4 10 10 2 9.99995 0 9.9999 9.99985 -2 0 10 20 30 40 50 60 70 80 90 100 90 90.0005 90.001 90.0015 Figure 2.20: The trajectory x(t) of a particle in a box with L = 10, x0 = 0.0, v0 = 1.0, t0 = 0, δt = 0.01. The plot to the right magnifies a detail when t ≈ 90 which exposes the systematic errors in determining the exact moment of the collision of the particle with the wall at tk = 90 and the corresponding maximum value of x(t), xm = L = 10.0. The trajectory x(t) is shown in figure 2.20. The effects of the system- atic errors can be easily seen by noting that the expected collisions occur every T /2 = L/v = 10 units of time. Therefore, on the plot to the right of figure 2.20, the reversal of the particle’s motion should have occurred at t = 90, x = L = 10. The reader should have already realized that the above mentioned error can be made to vanish by taking arbitrarily small δt. Therefore, we naively expect that as long as we have the necessary computer power to take δt as small as possible and the corresponding time intervals as many as possible, we can achieve any precision that we want. Well, that is true only up to a point. The problem is that the next position is determined by the addition operation x+v*dt and the next moment in 112 CHAPTER 2. KINEMATICS time by t+dt. Floating point numbers of the REAL type have a maximum accuracy of approximately 7 significant decimal digits. Therefore, if the operands x and v*dt are real numbers differing by more than 7 orders of magnitude (v*dt≲ 10−7 x), the effect of the addition x+v*dt=x, which is null! The reason is that the floating point unit of the processor has to convert both numbers x and v*dt into a representation having the same exponent and in doing so, the corresponding significant digits of the smaller number v*dt are lost. The result is less catastrophic when v*dt≲ 10−a x with 0 < a < 7, but some degree of accuracy is also lost at each addition operation. And since we have accumulation of such errors over many intervals t→t+dt, the error can become significant and destroy our calculation for large enough times. A similar error accumulates in the determination of the next instant of time t+dt, but we will discuss below how to make this contribution to the total error negligible. The above mentioned errors can become less detrimental by using floating point numbers of greater accuracy than the REAL type. For example REAL(8) numbers have approximately 16 significant decimal digits. But again, the precision is finite and the same type of errors are there only to be revealed by a more demanding and complicated calculation. The remedy to such a problem can only be a change in the algorithm. This is not always possible, but in the case at hand this is easy to do. For example, consider the equation that gives the position of a particle in free motion x(t) = x0 + v0 (t − t0 ) . (2.24) Let’s use the above relation for the parts of the motion between two collisions. Then, all we have to do is to reverse the direction of the motion and reset the initial position and time to be the position and time of the collision. This can be done by using the loop: t = t0 do while ( t . l e . tf ) x = x0 + v0 * ( t−t0 ) w r i t e ( 1 1 , * ) t , x , v0 i f ( x . l t . 0.0 . or . x . g t . L ) then x0 = x t0 = t v0 = −v0 endif t = t + dt In the above algorithm, the error in the time of the collision is not van- 2.3. TRAPPED IN A BOX 113 ishing but we don’t have the “instability” problem of the dt→ 0 limit¹⁶. Therefore we can isolate and study the effect of each type of error. The full program that implements the above algorithm is given below and can be found in the file box1D_2.f90: ! ============================================================ ! F i l e box1D_2 . f90 ! Motion o f a f r e e p a r t i c l e i n a box 0<x<L ! Use c o n s t a n t v e l o c i t y e q u a t i o n : x = x0 + v0 * ( t−t 0 ) ! Re verse v e l o c i t y and r e d e f i n e x0 , t 0 on boundaries !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− program box1D i m p l i c i t none !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ! Declaration of variables r e a l : : L , x0 , v0 , t0 , tf , dt , t , x , v !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ! Ask u s e r f o r i n p u t : p r i n t * , ’ # Enter L : ’ read * , L print * , ’# L = ’ , L i f ( L . l e . 0 . 0 ) s t o p ’L must be p o s i t i v e . ’ p r i n t * , ’ # Enter x0 , v0 : ’ read * , x0 , v0 p r i n t * , ’ # x0= ’ , x0 , ’ v0= ’ , v0 i f ( x0 . l t . 0.0 . or . x0 . g t . L ) s t o p ’ i l l e g a l v a l u e o f x0 . ’ i f ( v0 . eq . 0.0 ) s t o p ’ i l l e g a l v a l u e o f v0 = 0 . ’ p r i n t * , ’ # Enter t0 , t f , dt : ’ read * , t0 , tf , dt p r i n t * , ’ # t 0= ’ , t0 , ’ t f = ’ , tf , ’ dt= ’ , dt !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ! Initialize t = t0 open ( u n i t =11 , f i l e = ’ box1D_2 . dat ’ ) !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ! Compute : do while ( t . l e . tf ) x = x0 + v0 * ( t−t0 ) w r i t e ( 1 1 , * ) t , x , v0 i f ( x . l t . 0.0 . or . x . g t . L ) then x0 = x t0 = t v0 = −v0 endif t = t + dt ¹⁶We still have this problem in the t=t+dt operation. See discussion in the next section. 114 CHAPTER 2. KINEMATICS enddo close (11) end program box1D Compiling and running the above program is done as before and the results are stored in the file box1D_2.dat. The algorithm can be improved in order to compute the exact solution. We leave that as an exercise for the reader¹⁷. 2.3.2 Errors In this section we will study the effect of the systematic errors that we encountered in the previous section in more detail. We considered two types of errors: First, the systematic error of determining the instant of the collision of the particle with the wall. This error is reduced by taking a smaller time step δt. Then, the systematic error that accumulates with each addition of two numbers with increasing difference in their orders of magnitude. This error is increased with decreasing δt. The competition of the two effects makes the optimal choice of δt the result of a careful analysis. Such a situation is found in many interesting problems, therefore it is quite instructive to study it in more detail. When the exact solution of the problem is not known, the systematic errors are controlled by studying the behavior of the solution as a function of δt. If the solutions are converging in a region of values of δt, one gains confidence that the true solution has been determined up to the accuracy of the convergence. In the previous sections, we studied two different algorithms, pro- grammed in the files box1D_1.f90 and box1D_2.f90. We will refer to them as “method 1” and “method 2” respectively. We will study the convergence of the results as δt → 0 by fixing all the parameters except δt and then study the dependence of the results on δt. We will take L = 10, v0 = 1.0, x0 = 0.0, t0 = 0.0, tf = 95.0, so that the particle will collide with the wall every 10 units of time. We will measure the position of the particle x(t ≈ 95)¹⁸ as a function of δt and study its convergence to a limit¹⁹ as δt → 0. The analysis requires a lot of repetitive work: Compiling, setting the parameter values, running the program and calculating the value of x(t ≈ ¹⁷See the file box1D_3.dat. ¹⁸Note the ≈! ¹⁹Of course we know the answer: x(95) = 5. 2.3. TRAPPED IN A BOX 115 95) for many values of δt. We write the values of the parameters read by the program in a file box1D_anal.in: 10 L 0 1.0 x0 v0 0 95 0.05 t0 tf dt Then we compile the program > g f o r t r a n box1D_1 . f90 −o box and run it with the command: > c a t box1D_anal . in | . / box By using the pipe |, we send the contents of box1D_anal.in to the stdin of the command ./box by using the command cat. The result x(t ≈ 95) can be found in the last line of the file box1D_1.dat: > t a i l −n 1 box1D_1 . dat 94.9511948 5.45000267 −1. The third number in the above line is the value of the velocity. In a file box1D_anal.dat we write δt and the first two numbers coming out from the command tail. Then we decrease the value δt → δt/2 in the file box1D_anal.in and run again. We repeat for 12 more times until δt reaches the value²⁰ 0.000012. We do the same²¹ using method 2 and we place the results for x(t ≈ 95) in two new columns in the file box1D_anal.dat. The result is # −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− # dt t1_95 x1 (95) x2 (9 5 ) # −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− 0.050000 94.95119 5.450003 5.550126 0.025000 94.97849 5.275011 5.174837 0.012500 94.99519 5.124993 5.099736 0.006250 94.99850 4.987460 5.063134 0.003125 94.99734 5.021894 5.035365 ²⁰Try the command sed 's/0.05/0.025/' box1D_anal.in | ./box by changing 0.025 with the desired value of δt. ²¹See the shell script box1D_anal.csh as a suggestion on how to automate this boring process. 116 CHAPTER 2. KINEMATICS 0.001563 94.99923 5.034538 5.017764 0.000781 94.99939 4.919035 5.011735 0.000391 94.99979 4.695203 5.005493 0.000195 95.00000 5.434725 5.001935 0.000098 94.99991 5.528124 5.000745 0.000049 94.99998 3.358000 5.000330 0.000024 94.99998 2.724212 5.000232 0.000012 94.99999 9.240705 5.000158 Convergence is studied in figure 2.21. The 1st method maximizes its accuracy for δt ≈ 0.01, whereas for δt < 0.0001 the error becomes > 10% and the method becomes useless. The 2nd method has much better behavior that the 1st one. We observe that as δt decreases, the final value of t approaches the expected tf = 95. Why don’t we obtain t = 95, especially when t/δt is an integer? How many steps does it really take to reach t ≈ 95, when the expected number of those is ≈ 95/δt? Each time you take a measurement, issue the command > wc −l box1D_1 . dat which measures the number of lines in the file box1D_1.dat and compare this number with the expected one. The result is interesting: # −−−−−−−−−−−−−−−−−−−−−− # dt N N0 # −−−−−−−−−−−−−−−−−−−−−− 0.050000 1900 1900 0.025000 3800 3800 0.012500 7601 7600 0.006250 15203 15200 0.003125 30394 30400 0.001563 60760 60780 0.000781 121751 121638 0.000391 243753 242966 0.000195 485144 487179 0.000098 962662 969387 0.000049 1972589 1938775 0.000024 4067548 3958333 0.000012 7540956 7916666 where the second column has the number of steps computed by the program and the third one has the expected number of steps. We observe that the accuracy decreases with decreasing δt and in the end the difference is about 5%! Notice that the last line should have given 2.3. TRAPPED IN A BOX 117 tf = 0.000012 × 7540956 ≈ 90.5, an error comparable to the period of the particle’s motion. We conclude that one important source of accumulation of system- atic errors is the calculation of time. This type of errors become more significant with decreasing δt. We can improve the accuracy of the calcu- lation significantly if we use the multiplication t=t0+i*dt instead of the addition t=t+dt, where i is a step counter: ! t = t + dt ! Not a c c u r a t e , avoid t = t0 + i * dt ! B e t t e r accuracy , p r e f e r The main loop in the program box1D_1.f90 becomes: t = t0 x = x0 v = v0 i = 0 do while ( t . l e . tf ) write (11 ,*) t , x , v i = i + 1 x = x + v * dt t = t0 + i * dt i f ( x . l t . 0.0 . or . x . g t . L ) v = −v enddo The full program can be found in the file box1D_4.f90 of the accompa- nying software. We call this “method 3”. We perform the same change in the file box1D_2.f90, which we store in the file box1D_5.f90. We call this “method 4”. We repeat the same analysis using methods 3 and 4 and we find that the problem of calculating time accurately practically vanishes. The result of the analysis can be found on the right plot of fig- ure 2.21. Methods 2 and 4 have no significant difference in their results, whereas methods 1 and 3 do have a dramatic difference, with method 3 decreasing the error more than tenfold. The problem of the increase of systematic errors with decreasing δt does not vanish completely due to the operation x=x+v*dt. This type of error is harder to deal with and one has to invent more elaborate algorithms in order to reduce it significantly. This will be discussed further in chapter 4. 2.3.3 The Two Dimensional Box A particle is confined to move on the plane in the area 0 < x < Lx and 0 < y < Ly . When it reaches the boundaries of this two dimensional 118 CHAPTER 2. KINEMATICS 100 100 10 10 1 1 δx (%) δx (%) 0.1 0.1 0.01 0.01 0.001 0.001 method 1 method 3 method 2 method 4 0.0001 0.0001 1e-05 0.0001 0.001 0.01 0.1 1e-05 0.0001 0.001 0.01 0.1 δt δt Figure 2.21: The error δx = 2|xi (95) − x(95)|/|xi (95) + x(95)| × 100 where xi (95) is the value calculated by method i = 1, 2, 3, 4 and x(95) the exact value according to the text. box, it bounces elastically off its walls. The particle is found in an infinite depth orthogonal potential well. The particle starts moving at time t0 from (x0 , y0 ) and our program will calculate its trajectory until time tf with time step δt. Such a trajectory can be seen in figure 2.23. If the particle’s position and velocity are known at time t, then at time t + δt they will be given by the relations x(t + δt) = x(t) + vx (t)δt y(t + δt) = y(t) + vy (t)δt vx (t + δt) = vx (t) vy (t + δt) = vy (t) . (2.25) The collision of the particle off the walls is modeled by reflection of the normal component of the velocity when the respective coordinate of the particle crosses the wall. This is a source of the systematic errors that we discussed in the previous section. The central loop of the program is: i = i + 1 t = t0 + i * dt x = x + vx * dt y = y + vy * dt i f ( x . l t . 0.0 . or . x . g t . Lx ) vx = −vx i f ( y . l t . 0.0 . or . y . g t . Ly ) vy = −vy The full program can be found in the file box2D_1.f90. Notice that we introduced two counters nx and ny of the particle’s collisions with the walls: 2.3. TRAPPED IN A BOX 119 ! ============================================================ ! F i l e box2D_1 . f90 ! Motion o f a f r e e p a r t i c l e i n a box 0<x<Lx 0<y<Ly ! Use i n t e g r a t i o n with time s t e p dt : x = x + vx * dt y=y+vy * dt !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− program box2D i m p l i c i t none !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ! Declaration of variables r e a l ( 8 ) : : Lx , Ly , x0 , y0 , v0x , v0y , t0 , tf , dt , t , x , y , vx , vy i n t e g e r : : i , nx , ny !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ! Ask u s e r f o r i n p u t : p r i n t * , ’ # Enter Lx , Ly : ’ read * , Lx , Ly p r i n t * , ’ # Lx = ’ , Lx , ’ Ly= ’ , Ly i f ( Lx . l e . 0 . 0 ) s t o p ’Lx must be p o s i t i v e . ’ i f ( Ly . l e . 0 . 0 ) s t o p ’Ly must be p o s i t i v e . ’ p r i n t * , ’ # Enter x0 , y0 , v0x , v0y : ’ read * , x0 , y0 , v0x , v0y p r i n t * , ’ # x0= ’ , x0 , ’ y0= ’ , y0 , ’ v0x= ’ , v0x , ’ v0y= ’ , v0y i f ( x0 . l t . 0.0 . or . x0 . g t . Lx ) s t o p ’ i l l e g a l v a l u e x0 ’ i f ( y0 . l t . 0.0 . or . y0 . g t . Ly ) s t o p ’ i l l e g a l v a l u e y0 ’ i f ( v0x **2+ v0y * * 2 . eq . 0.0 ) s t o p ’ i l l e g a l v a l u e v0=0 ’ p r i n t * , ’ # Enter t0 , t f , dt : ’ read * , t0 , tf , dt p r i n t * , ’ # t 0= ’ , t0 , ’ t f = ’ , tf , ’ dt= ’ , dt !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ! Initialize i = 0 nx = 0 ; ny = 0 t = t0 x = x0 ; y = y0 vx = v0x ; vy = v0y open ( u n i t =11 , f i l e = ’ box2D_1 . dat ’ ) !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ! Compute : do while ( t . l e . tf ) w r i t e ( 1 1 , * ) t , x , y , vx , vy i = i + 1 t = t0 + i * dt x = x + vx * dt y = y + vy * dt i f ( x . l t . 0.0 . or . x . g t . Lx ) then vx = −vx nx = nx + 1 endif i f ( y . l t . 0.0 . or . y . g t . Ly ) then 120 CHAPTER 2. KINEMATICS vy = −vy ny = ny + 1 endif enddo close (11) print * , ’# Number o f c o l l i s i o n s : ’ print * , ’# nx= ’ , nx , ’ ny= ’ , ny end program box2D A typical session for the study of a particle’s trajectory could be: > g f o r t r a n box2D_1 . f90 −o box > . / box # Enter Lx , Ly : 10.0 5.0 # Lx = 1 0 . Ly= 5. # Enter x0 , y0 , v0x , v0y : 5.0 0.0 1 . 2 7 1.33 # x0= 5 . y0= 0 . v0x= 1 . 2 7 v0y= 1.33 # Enter t0 , t f , dt : 0 50 0.01 # t 0= 0. t f = 50. dt= 0.01 # Number o f c o l l i s i o n s : # nx= 6 ny= 13 > gnuplot gnuplot > p l o t ” box2D_1 . dat ” using 1 : 2 w l title ”x ( t ) ” gnuplot > r e p l o t ” box2D_1 . dat ” using 1 : 3 w l title ”y ( t ) ” gnuplot > p l o t ” box2D_1 . dat ” using 1 : 4 w l title ” vx ( t ) ” gnuplot > r e p l o t ” box2D_1 . dat ” using 1 : 5 w l title ” vy ( t ) ” gnuplot > p l o t ” box2D_1 . dat ” using 2:3 w l title ”x−y ” Notice the last line of output from the program: The particle bounces off the vertical walls 6 times (nx=6) and from the horizontal ones 13 (ny=13). The gnuplot commands construct the diagrams displayed in figures 2.22 and 2.23. In order to animate the particle’s trajectory, we can copy the file box2D_animate.gnu of the accompanying software to the current direc- tory and give the gnuplot commands: gnuplot > file = ” box2D_1 . dat ” gnuplot > Lx = 10 ; Ly = 5 gnuplot > t0 = 0 ; tf = 50; dt = 1 gnuplot > load ” box2D_animate . gnu” gnuplot > t0 = 0 ; dt = 0 . 5 ; load ” box2D_animate . gnu” The last line repeats the same animation at half speed. You can also 2.4. APPLICATIONS 121 12 1.5 x(t) vx(t) y(t) vy(t) 10 1 8 0.5 6 0 4 -0.5 2 0 -1 -2 -1.5 0 10 20 30 40 50 0 10 20 30 40 50 Figure 2.22: The results for the trajectory of a particle in a two dimensional box given by the program box2D_1.f90. The parameters are Lx = 10, Ly = 5, x0 = 5, y0 = 0, v0x = 1.27, v0y = 1.33, t0 = 0, tf = 50, δt = 0.01. use the file animate2D.gnu discussed in section 2.1.1. We add new com- mands in the file box2D_animate.gnu so that the plot limits are calculated automatically and the box is drawn on the plot. The arrow drawn is not the position vector with respect to the origin of the coordinate axes, but the one connecting the initial with the current position of the particle. The next step should be to test the accuracy of your results. This can be done by generalizing the discussion of the previous section and is left as an exercise for the reader. 2.4 Applications In this section we will study simple examples of motion in a box with different types of obstacles. We will start with a game of ... mini golf. The player shoots a (point) “ball” which moves in an orthogonal box of linear dimensions Lx and Ly and which is open on the x = 0 side. In the box there is a circular “hole” with center at (xc , yc ) and radius R. If the “ball” falls in the “hole”, the player wins. If the ball leaves out of the box through its open side, the player loses. In order to check if the ball is in the hole when it is at position (x, y), all we have to do is to check whether (x − xc )2 + (y − yc )2 ≤ R2 . Initially we place the ball at the position (0, Ly /2) at time t0 = 0. The player hits the ball which leaves with initial velocity of magnitude v0 at an angle θ degrees with the x axis. The program is found in the file MiniGolf.f90 and is listed below: 122 CHAPTER 2. KINEMATICS t= 48.000000 (x,y)= (5.901700,3.817100) 5 4 3 y 2 1 0 0 2 4 6 8 10 x Figure 2.23: The trajectory of the particle of figure 2.22 until t = 48. The origin of the arrow is at the initial position of the particle and its end is at its current position. The bold lines mark the boundaries of the box. ! ============================================================ ! F i l e MiniGolf . f ! Motion o f a f r e e p a r t i c l e i n a box 0<x<Lx 0<y<Ly ! The box i s open a t x=0 and has a h o l e a t ( xc , yc ) o f r a d i u s R ! B a l l i s s h o t a t ( 0 , Ly / 2 ) with speed v0 , a n g l e t h e t a ( d e g r e e s ) ! Use i n t e g r a t i o n with time s t e p dt : x = x + vx * dt y=y+vy * dt ! B a l l s t o p s i n h o l e ( s u c c e s s ) or a t x=0 ( f a i l u r e ) !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− program MiniGolf i m p l i c i t none !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ! Declaration of va r ia b le s real (8) : : Lx , Ly , x0 , y0 , v0x , v0y , t0 , tf , dt , t , x , y , vx , vy real (8) : : v0 , theta , xc , yc , R , R2 r e a l ( 8 ) , parameter : : PI =3.14159265358979324 D0 integer : : i , nx , ny character (7) : : result !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ! Ask u s e r f o r i n p u t : p r i n t * , ’ # Enter Lx , Ly : ’ read * , Lx , Ly p r i n t * , ’ # Lx = ’ , Lx , ’ Ly= ’ , Ly 2.4. APPLICATIONS 123 t= 45.300000 (x,y)= (7.854117,2.982556) 5 4 3 y 2 1 0 0 2 4 6 8 10 x Figure 2.24: The trajectory of the particle calculated by the program MiniGolf.f90 using the parameters chosen in the text. The moment of ... success is shown. At time t = 45.3 the particle enters the hole’s region which has its center at (8, 2.5) and its radius is 0.5. i f ( Lx . l e . 0 . 0 ) s t o p ’Lx must be p o s i t i v e . ’ i f ( Ly . l e . 0 . 0 ) s t o p ’Ly must be p o s i t i v e . ’ p r i n t * , ’ # Enter h o l e p o s i t i o n and r a d i u s : ( xc , yc ) , R : ’ read * , xc , yc , R p r i n t * , ’ # ( xc , yc )= ( ’ , xc , ’ , ’ , yc , ’ ) R= ’ , R p r i n t * , ’ # Enter v0 , t h e t a ( d e g r e e s ) : ’ read * , v0 , theta p r i n t * , ’ # v0= ’ , v0 , ’ t h e t a = ’ , theta , ’ d e g r e e s ’ i f ( v0 . l e . 0.0 D0 ) s t o p ’ i l l e g a l v a l u e o f v0 . ’ i f (ABS( theta ) . ge . 90.0 D0 ) s t o p ’ i l l e g a l v a l u e o f t h e t a . ’ p r i n t * , ’ # Enter dt : ’ read * , dt p r i n t * , ’ # dt= ’ , dt !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ! Initialize t0 = 0.0 D0 x0 = 0.00001 D0 ! s m a l l but non−z e r o y0 = Ly / 2 . 0 R2 = R * R theta = ( PI / 1 8 0 . 0 D0 ) * theta v0x = v0 * c o s ( theta ) 124 CHAPTER 2. KINEMATICS v0y = v0 * s i n ( theta ) p r i n t * , ’ # x0= ’ , x0 , ’ y0= ’ , y0 , ’ v0x= ’ , v0x , ’ v0y= ’ , v0y i = 0 nx = 0 ; ny = 0 t = t0 x = x0 ; y = y0 vx = v0x ; vy = v0y open ( u n i t =11 , f i l e = ’ MiniGolf . dat ’ ) !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ! Compute : do while ( .TRUE. ) ! f o r e v e r ! w r i t e ( 1 1 , * ) t , x , y , vx , vy i = i + 1 t = t0 + i * dt x = x + vx * dt y = y + vy * dt i f ( x . g t . Lx ) then vx = −vx nx = nx + 1 endif i f ( y . l t . 0.0 . or . y . g t . Ly ) then vy = −vy ny = ny + 1 endif i f ( x . l e . 0.0 D0 ) then result = ’ Failure ’ e x i t ! e x i t do loop endif i f ( ( ( x−xc ) * ( x−xc ) +(y−yc ) * ( y−yc ) ) . l e . R2 ) then r e s u l t = ’ Success ’ e x i t ! e x i t do loop endif enddo close (11) p r i n t * , ’ # Number o f c o l l i s i o n s : ’ p r i n t * , ’ # R e s u l t= ’ , r e s u l t , ’ nx= ’ , nx , ’ ny= ’ , ny end program MiniGolf In order to run it, we can use the commands: > g f o r t r a n MiniGolf . f90 −o mg > . / mg # Enter Lx , Ly : 10 5 # Lx = 1 0 . Ly= 5. # Enter h o l e p o s i t i o n and r a d i u s : ( xc , yc ) , R : 8 2.5 0.5 # ( xc , yc )= ( 8. , 2.5 ) R= 0.5 2.4. APPLICATIONS 125 # Enter v0 , t h e t a ( d e g r e e s ) : 1 80 # v0= 1 . theta= 80. d e g r e e s # Enter dt : 0.01 # dt= 0.01 # x0= 1 . E−05 y0= 2.5 v0x= 0.173648178 v0y= 0.984807753 # Number o f c o l l i s i o n s : # R e s u l t= S u c c e s s nx= 0 ny= 9 You should construct the plots of the position and the velocity of the particle. You can also use the animation program found in the file MiniGolf_animate.gnu for fun. Copy it from the accompanying software to the current directory and give the gnuplot commands: gnuplot > file = ” MiniGolf . dat ” gnuplot > Lx = 1 0 ; Ly = 5 gnuplot > xc = 8 ; yc = 2.5 ; R = 0.5 gnuplot > t0 = 0 ; dt = 0 . 1 gnuplot > load ” MiniGolf_animate . gnu” The results are shown in figure 2.24. The next example with be three dimensional. We will study the mo- tion of a particle confined within a cylinder of radius R and height L. The collisions of the particle with the cylinder are elastic. We take the axis of the cylinder to be the z axis and the two bases of the cylinder to be located at z = 0 and z = L. This is shown in figure 2.26. The collisions of the particle with the bases of the cylinder are easy to program: we follow the same steps as in the case of the simple box. For the collision with the cylinder’s side, we consider the projection of the motion on the x − y plane. The projection of the particle moves within a circle of radius R and center at the intersection of the z axis with the plane. This is shown in figure 2.25. At the collision, the r component of the velocity is reflected vr → −vr , whereas vθ remains the same. The velocity of the particle before the collision is ⃗v = vx x̂ + vy ŷ = vr r̂ + vθ θ̂ (2.26) and after the collision is ⃗v ′ = vx′ x̂ + vy′ ŷ = −vr r̂ + vθ θ̂ (2.27) 126 CHAPTER 2. KINEMATICS From the relations r̂ = cos θx̂ + sin θŷ θ̂ = − sin θx̂ + cos θŷ , (2.28) and vr = ⃗v · r̂, vθ = ⃗v · θ̂, we have that vr = vx cos θ + vy sin θ vθ = −vx sin θ + vy cos θ . (2.29) The inverse relations are vx = vr cos θ − vθ sin θ vy = vr sin θ + vθ cos θ . (2.30) With the transformation vr → −vr , the new velocity in Cartesian coordi- nates will be vx′ = −vr cos θ − vθ sin θ vy′ = −vr sin θ + vθ cos θ . (2.31) The transformation vx → vx′ , vy → vy′ will be performed in the subroutine reflectVonCircle(vx,vy,x,y,xc,yc,R). Upon entry to the subroutine, we provide the initial velocity (vx,vy), the collision point (x,y), the center of the circle (xc,yc) and the radius of the circle²² R. Upon exit from the subroutine, (vx,vy) have been replaced with the new values²³ (vx′ , vy′ ). The program can be found in the file Cylinder3D.f90 and is listed below: ! ============================================================ ! F i l e Cylinder3D . f90 ! Motion o f a f r e e p a r t i c l e i n a c y l i n d e r with a x i s t h e z−a x i s , ! r a d i u s R and 0<z<L ! Use i n t e g r a t i o n with time s t e p dt : x = x + vx * dt ! y = y + vy * dt ! z = z + vz * dt ! Use s u b r o u t i n e r e f l e c t V o n C i r c l e f o r c o l l i s i o n s a t r=R !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− program Cylinder3D ²²Of course one expects R2 = (x − xc )2 + (y − yc )2 , but because of systematic errors, we require R to be given. ²³Note that upon exit, the particle is also placed exactly on the circle. 2.4. APPLICATIONS 127 v ^ y^ θ vθ ^r vr v’ ^x (x,y) R − vr θ (xc,yc) Figure 2.25: The elastic collision of the particle moving within the circle of radius R = |R|⃗ and center ⃗rc = xc x̂ + yc ŷ at the point ⃗r = xx̂ + y ŷ. We have that R ⃗ = (x − xc )x̂ + (y − yc )ŷ. The initial velocity is ⃗v = vr r̂ + vθ θ̂ where r̂ ≡ R/R. After ⃗ reflecting vr → −vr the new velocity of the particle is ⃗v ′ = −vr r̂ + vθ θ̂. i m p l i c i t none !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ! Declaration of variables real (8) : : x0 , y0 , z0 , v0x , v0y , v0z , t0 , tf , dt , t , x , y , z , vx , vy , vz real (8) : : L , R , R2 , vxy , rxy , r2xy , xc , yc integer : : i , nr , nz !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ! Ask u s e r f o r i n p u t : p r i n t * , ’ # Enter R , L : ’ read * , R , L p r i n t * , ’ # R= ’ , R , ’ L= ’ , L i f ( R . l e . 0 . 0 ) s t o p ’R must be p o s i t i v e . ’ i f ( L . l e . 0 . 0 ) s t o p ’L must be p o s i t i v e . ’ p r i n t * , ’ # Enter x0 , y0 , z0 , v0x , v0y , v0z : ’ read * , x0 , y0 , z0 , v0x , v0y , v0z rxy = DSQRT ( x0 * x0+y0 * y0 ) p r i n t * , ’ # x0 = ’ , x0 , ’ y0 = ’ , y0 , ’ z0= ’ , z0 , ’ rxy= ’ , rxy p r i n t * , ’ # v0x= ’ , v0x , ’ v0y= ’ , v0y , ’ v0z= ’ , v0z i f ( rxy . g t . R ) s t o p ’ i l l e g a l v a l u e o f rxy > R ’ i f ( z0 . l t . 0.0 D0 ) s t o p ’ i l l e g a l v a l u e o f z0 < 0 ’ i f ( z0 . g t . L ) s t o p ’ i l l e g a l v a l u e o f z0 > L ’ i f ( v0x **2+ v0y **2+ v0z * * 2 . eq . 0 . 0 ) s t o p ’ i l l e g a l v a l u e o f v0 = 0 . ’ p r i n t * , ’ # Enter t0 , t f , dt : ’ 128 CHAPTER 2. KINEMATICS read * , t0 , tf , dt p r i n t * , ’ # t 0= ’ , t0 , ’ t f = ’ , tf , ’ dt= ’ , dt !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ! Initialize i = 0 nr = 0 ; nz = 0 t = t0 x = x0 ; y = y0 ; z = z0 vx = v0x ; vy = v0y ; vz = v0z R2 = R * R xc = 0.0 D0 ! c e n t e r o f c i r c l e which i s t h e p r o j e c t i o n o f t h e yc = 0.0 D0 ! c y l i n d e r on t h e xy plane open ( u n i t =11 , f i l e = ’ Cylinder3D . dat ’ ) !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ! Compute : do while ( t . l e . tf ) w r i t e ( 1 1 , 1 0 0 ) t , x , y , z , vx , vy , vz i = i + 1 t = t0 + i * dt x = x + vx * dt y = y + vy * dt z = z + vz * dt i f ( z . l t . 0.0 . or . z . g t . L ) then vz = −vz ! r e f l e c t i o n on c y l i n d e r caps nz = nz + 1 endif r2xy = x * x+y * y i f ( r2xy . g t . R2 ) then c a l l reflectVonCircle ( vx , vy , x , y , xc , yc , R ) nr = nr + 1 endif enddo close (11) p r i n t * , ’ # Number o f c o l l i s i o n s : ’ p r i n t * , ’ # nr= ’ , nr , ’ nz= ’ , nz 100 FORMAT(100 G28 . 1 6 ) end program Cylinder3D !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ! ============================================================ !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− s u b r o u t i n e reflectVonCircle ( vx , vy , x , y , xc , yc , R ) i m p l i c i t none real (8) : : vx , vy , x , y , xc , yc , R real (8) : : theta , cth , sth , vr , vth theta = atan2 ( y−yc , x−xc ) cth = c o s ( theta ) sth = s i n ( theta ) 2.4. APPLICATIONS 129 vr = vx * cth + vy * sth vth = −vx * sth + vy * cth vx = −vr * cth − vth * sth ! r e f l e c t vr −> −vr vy = −vr * sth + vth * cth x = xc + R * cth ! put x , y on t h e c i r c l e y = yc + R * sth end s u b r o u t i n e reflectVonCircle Notice that the function atan2 is used for computing the angle theta. This function, when called with two arguments atan2(y,x), returns the angle θ = tan−1 (y/x) in radians. The correct quadrant of the circle where (x, y) lies is chosen. The angle that we want to compute is given by atan2(y-yc,x-xc). Then we apply equations (2.29) and (2.31) and in the last two lines we enforce the particle to be at the point (xc +R cos θ, yc + R sin θ), exactly on the circle. t= 500.000000 (x,y,z)= (2.227212,0.469828,7.088600) 10 8 z 6 4 2 0 10 5 -10 0 -5 y 0 -5 x 5 -10 10 Figure 2.26: The trajectory of a particle moving inside a cylinder with R = 10, L = 10, computed by the program Cylinder3D.f90. We have chosen ⃗r0 = 1.0x̂ + 2.2ŷ + 3.1ẑ, ⃗v0 = 0.93x̂ − 0.89ŷ + 0.74ẑ, t0 = 0, tf = 500.0, δt = 0.01. A typical session is shown below: 130 CHAPTER 2. KINEMATICS > g f o r t r a n Cylinder3D . f90 −o cl > . / cl # Enter R , L : 10.0 10.0 # R= 1 0 . L= 10. # Enter x0 , y0 , z0 , v0x , v0y , v0z : 1 . 0 2.2 3 . 1 0.93 −0.89 0 . 7 4 # x0 = 1 . y0 = 2.2 z0= 3 . 1 rxy= 2.41660919 # v0x= 0.93 v0y= −0.89 v0z= 0.74 # Enter t0 , t f , dt : 0.0 500.0 0.01 # t 0= 0. t f = 500. dt= 0.01 # Number o f c o l l i s i o n s : # nr= 33 nz= 37 In order to plot the position and the velocity as a function of time, we use the following gnuplot commands: gnuplot > file=” Cylinder3D . dat ” gnuplot > p l o t file using 1 : 2 with lines title ” x ( t ) ” ,\ file using 1 : 3 with lines title ” y ( t ) ” ,\ file using 1 : 4 with lines title ” z( t )” gnuplot > p l o t file using 1 : 5 with lines title ” v_x ( t ) ” ,\ file using 1 : 6 with lines title ” v_y ( t ) ” ,\ file using 1 : 7 with lines title ” v_z ( t ) ” We can√also compute the distance of the particle from the cylinder’s axis r(t) = x(t)2 + y(t)2 as a function of time using the command: gnuplot > p l o t file using 1 : ( s q r t ( $2 **2+ $3 * * 2 ) ) w l t ” r ( t ) ” In order to plot the trajectory, together with the cylinder, we give the commands: gnuplot > L = 10 ; R = 10 gnuplot > s e t urange [ 0 : 2 . 0 * pi ] gnuplot > s e t vrange [ 0 : L ] gnuplot > s e t parametric gnuplot > s p l o t file using 2 : 3 : 4 with lines notitle , \ R * c o s ( u ) , R * s i n ( u ) , v notitle The command set parametric is necessary if one wants to make a para- metric plot of a surface ⃗r(u, v) = x(u, v) x̂ + y(u, v) ŷ + z(u, v) ẑ. The cylin- der (without the bases) is given by the parametric equations ⃗r(u, v) = R cos u x̂ + R sin u ŷ + v ẑ with u ∈ [0, 2π), v ∈ [0, L]. 2.4. APPLICATIONS 131 We can also animate the trajectory with the help of the gnuplot script file Cylinder3D_animate.gnu. Copy the file from the accompanying soft- ware to the current directory and give the gnuplot commands: gnuplot > R =10; L =10; t0 =0; tf =500; dt=10 gnuplot > load ” Cylinder3D_animate . gnu” The result is shown in figure 2.26. The last example will be that of a simple model of a spacetime worm- hole. This is a simple spacetime geometry which, in the framework of the theory of general relativity, describes the connection of two distant areas in space which are asymptotically flat. This means, that far enough from the wormhole’s mouths, space is almost flat - free of gravity. Such a geometry is depicted in figure 2.27. The distance traveled by someone through the mouths could be much smaller than the distance traveled outside the wormhole and, at least theoretically, traversable wormholes could be used for interstellar/intergalactic traveling and/or communica- tions between otherwise distant areas in the universe. Of course we should note that such macroscopic and stable wormholes are not known to be possible to exist in the framework of general relativity. One needs an exotic type of matter with negative energy density which has never been observed. Such exotic geometries may realize microscopically as quantum fluctuations of spacetime and make the small scale structure of the geometry²⁴ a “spacetime foam”. We will study a very simple model of the above geometry on the plane with a particle moving freely in it²⁵. We take the two dimensional plane and cut two equal disks of radius R with centers at distance d like in figure 2.28. We identify the points on the two circles such that the point 1 of the left circle is the same as the point 1 on the right circle, the point 2 on the left with the point 2 on the right etc. The two circles are given by the parametric equations x(θ) = d/2 + R cos θ, y(θ) = R sin θ, −π < θ ≤ π for the right circle and x(θ) = −d/2 − R cos θ, y(θ) = R sin θ, −π < θ ≤ π for the left. Points on the two circles with the same θ are identified. A particle entering the wormhole from the left circle with velocity v is immediately exiting from the right with velocity v ′ as shown in figure 2.28. ²⁴See K.S. Thorne “Black Holes and Time Wraps: Einstein’s Outrageous Legacy”, W.W. Norton, New York for a popular review of these concepts. ²⁵This idea can be found as an exercise in the excellent introductory general relativ- ity textbook J. B. Hartle, “Gravity: An Introduction to Einstein’s General Relativity”, Addison Wesley 2003, Ch. 7, Ex. 25. 132 CHAPTER 2. KINEMATICS Figure 2.27: A typical geometry of space near a wormhole. Two asymptotically flat regions of space are connected through a “neck” which can be arranged to be of small length compared to the distance of the wormhole mouths when traveled from the outside space. Then we will do the following: 1. Write a program that computes the trajectory of a particle moving in the geometry of figure 2.28. We set the limits of motion to be −L/2 ≤ x ≤ L/2 and −L/2 ≤ y ≤ L/2. We will use periodic boundary conditions in order to define what happens when the particle attempts to move outside these limits. This means that we identify the x = −L/2 line with the x = +L/2 line as well as the y = −L/2 line with the y = +L/2 line. The user enters the parameters R, d and L as well as the initial conditions (x0 , y0 ), (v0 , ϕ) where ⃗v0 = v0 (cos ϕx̂ + sin ϕŷ). The user will also provide the time parameters tf and dt for motion in the time interval t ∈ [t0 = 0, tf ] with step dt. 2. Plot the particle’s trajectory with (x0 , y0 ) = (0, −1), (v0 , ϕ) = (1, 10o ) με tf = 40, dt = 0.05 in the geometry with L = 20, d = 5, R = 1. 3. Find a closed trajectory which does not cross the boundaries |x| = L/2, |y| = L/2 and determine whether it is stable under small per- turbations of the initial conditions. 4. Find other closed trajectories that go through the mouths of the 2.4. APPLICATIONS 133 y v’ 4 4 θ θ v 3 1 1 3 x 2 2 Figure 2.28: A simple model of the spacetime geometry of figure 2.27. The particle moves on the whole plane except withing the two disks that have been removed. The neck of the wormhole is modeled by the two circles x(θ) = ±d/2±R cos θ, y(θ) = R sin θ, −π < θ ≤ π and has zero length since their points have been identified. There is a given direction in this identification, so that points with the same θ are the same (you can imagine how this happens by folding the plane across the y axis and then glue the two circles together). The entrance of the particle through one mouth and exit through the other is done as shown for the velocity vector ⃗v → ⃗v ′ . 134 CHAPTER 2. KINEMATICS wormhole and study their stability under small perturbations of the initial conditions. 5. Add to the program the option to calculate the distance traveled by the particle. If the particle starts from (−x0 , 0) and moves in the +x direction to the (x0 , 0), x0 > R + d/2 position, draw the trajectory and calculate the distance traveled on paper. Then confirm your calculation from the numerical result coming from your program. 6. Change the boundary conditions, so that the particle bounces off elastically at |x| = L/2, |y| = L/2 and replot all the trajectories mentioned above. Define the right circle c1 by the parametric equations d x(θ) = + R cos θ , y(θ) = R sin θ , −π < θ ≤ π , (2.32) 2 and the left circle c2 by the parametric equations d x(θ) = − − R cos θ , y(θ) = R sin θ , −π < θ ≤ π . (2.33) 2 The particle’s position changes at time dt by ti = idt xi = xi−1 + vx dt yi = yi−1 + vy dt (2.34) for i = 1, 2, . . . for given (x0 , y0 ), t0 = 0 and as long as ti ≤ tf . If the point (xi , yi ) is outside the boundaries |x| = L/2, |y| = L/2, we redefine xi → xi ± L, yi → yi ± L in each case respectively. Points defined by the same value of θ are identified, i.e. they represent the same points of space. If the point (xi , yi ) crosses either one of the circles c1 or c2 , then we take the particle out from the other circle. Crossing the circle c1 is determined by the relation ( )2 d xi − + yi2 ≤ R2 . (2.35) 2 The angle θ is calculated from the equation ( ) y θ = tan−1 i , (2.36) xi − d2 2.4. APPLICATIONS 135 y v’ ^ ^ e e’θ θ ^ er ^ e’r (x’,y’) v (x,y) θ θ x Figure 2.29: The particle crossing the wormhole through the right circle c1 with velocity ⃗v . It emerges from c2 with velocity ⃗v ′ . The unit vectors (êr , êθ ), (ê′r , ê′θ ) are computed from the parametric equations of the two circles c1 and c2 . and the point (xi , yi ) is mapped to the point (x′i , yi′ ) where d x′i = − − R cos θ , yi′ = yi , (2.37) 2 as can be seen in figure 2.29. For mapping ⃗v → ⃗v ′ , we first calculate the vectors } { ′ êr = cos θ x̂ + sin θ ŷ êr = − cos θ x̂ + sin θ ŷ → , (2.38) êθ = − sin θ x̂ + cos θ ŷ ê′θ = sin θ x̂ + cos θ ŷ so that the velocity ⃗v = vr êr + vθ êθ → ⃗v ′ = −vr ê′r + vθ ê′θ , (2.39) where the radial components are vr = ⃗v · êr and vθ = ⃗v · êθ . Therefore, the relations that give the “emerging” velocity ⃗v ′ are: vr = vx cos θ + vy sin θ vθ = −vx sin θ + vy cos θ . (2.40) vx′ = vr cos θ + vθ sin θ vy′ = −vr sin θ + vθ cos θ Similarly we calculate the case of entering from c2 and emerging from c1 . The condition now is: ( )2 d xi + + yi2 ≤ R2 . (2.41) 2 136 CHAPTER 2. KINEMATICS The angle θ is given by ( ) yi θ = π − tan−1 d , (2.42) xi + 2 and the point (xi , yi ) is mapped to the point (x′i , yi′ ) where d x′i = + R cos θ , yi′ = yi . (2.43) 2 For mapping ⃗v → ⃗v ′ , we calculate the vectors } { ′ êr = − cos θ x̂ + sin θ ŷ êr = cos θ x̂ + sin θ ŷ → ′ , (2.44) êθ = sin θ x̂ + cos θ ŷ êθ = − sin θ x̂ + cos θ ŷ so that the velocity ⃗v = vr êr + vθ êθ → ⃗v ′ = −vr ê′r + vθ ê′θ . (2.45) The emerging velocity ⃗v ′ is: vr = −vx cos θ + vy sin θ vθ = vx sin θ + vy cos θ ′ . (2.46) vx = −vr cos θ − vθ sin θ vy′ = −vr sin θ + vθ cos θ Systematic errors are now coming from crossing the two mouths of the wormhole. There are no systematic errors from crossing the boundaries |x| = L/2, |y| = L/2 (why?). Try to think of ways to control those errors and study them. The closed trajectories that we are looking for come from the initial conditions (x0 , y0 , v0 , ϕ) = (0, 0, 1, 0) (2.47) and they connect points 1 of figure 2.28. They are unstable, as can be seen by taking ϕ → ϕ + ϵ. The closed trajectories that cross the wormhole and “wind” through space can come from the initial conditions (x0 , y0 , v0 , ϕ) = (−9, 0, 1, 0) (x0 , y0 , v0 , ϕ) = (2.5, −3, 1, 90o ) and cross the points 3 → 3 and 2 → 2 → 4 → 4 respectively. They are also unstable, as can be easily verified by using the program that you will write. The full program is listed below: 2.4. APPLICATIONS 137 ! ============================================================ program WormHole2D i m p l i c i t none !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ! Declaration of variables r e a l ( 8 ) , parameter : : PI =3.14159265358979324 D0 r e a l ( 8 ) : : Lx , Ly , L , R , d r e a l ( 8 ) : : x0 , y0 , v0 , theta r e a l ( 8 ) : : t0 , tf , dt r e a l ( 8 ) : : t , x , y , vx , vy r e a l ( 8 ) : : xc1 , yc1 , xc2 , yc2 , r1 , r2 integer : : i !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ! Ask u s e r f o r i n p u t : p r i n t * , ’ # Enter L , d , R : ’ read * , L , d , R p r i n t * , ’ # L= ’ , L , ’ d= ’ , d , ’ R= ’ , R i f ( L . l e . d +2.0 D0 * R ) s t o p ’L <= d+2*R ’ i f ( d . le . 2.0 D0 * R ) s t o p ’d <= 2*R ’ p r i n t * , ’ # Enter ( x0 , y0 ) , v0 , t h e t a ( d e g r e e s ) : ’ read * , x0 , y0 , v0 , theta p r i n t * , ’ # x0= ’ , x0 , ’ y0 = ’ , y0 p r i n t * , ’ # v0= ’ , v0 , ’ t h e t a = ’ , theta , ’ d e g r e e s ’ i f ( v0 . l e . 0.0 D0 ) s t o p ’ i l l e g a l v a l u e o f v0 . ’ p r i n t * , ’ # Enter t f , dt : ’ read * , tf , dt p r i n t * , ’ # t f = ’ , tf , ’ dt= ’ , dt !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ! Initialize theta = ( PI / 1 8 0 . 0 D0 ) * theta i = 0 t = 0.0 D0 x = x0 ; y = y0 vx = v0 * c o s ( theta ) ; vy = v0 * s i n ( theta ) p r i n t * , ’ # x0= ’ , x , ’ y0= ’ , y , ’ v0x= ’ , vx , ’ v0y= ’ , vy ! Wormhole ’ s c e n t e r s : xc1 = 0.5 D0 * d ; yc1 = 0.0 D0 xc2 = −0.5D0 * d ; yc2 = 0.0 D0 ! Box l i m i t s c o o r d i n a t e s : Lx = 0.5 D0 * L ; Ly = 0.5 D0 * L ! Test i f already inside cut region : r1 = s q r t ( ( x−xc1 ) * * 2 + ( y−yc1 ) * * 2 ) r2 = s q r t ( ( x−xc2 ) * * 2 + ( y−yc2 ) * * 2 ) i f ( r1 . l e . R ) s t o p ’ r 1 <= R ’ i f ( r2 . l e . R ) s t o p ’ r2 <= R ’ ! T e s t i f o u t s i d e box l i m i t s : i f (ABS( x ) . ge . Lx ) s t o p ’ | x | >= Lx ’ i f (ABS( y ) . ge . Ly ) s t o p ’ | y | >= Ly ’ 138 CHAPTER 2. KINEMATICS open ( u n i t =11 , f i l e = ’Wormhole . dat ’ ) !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ! Compute : do while ( t . l t . tf ) w r i t e ( 1 1 , * ) t , x , y , vx , vy i = i+1 t = i * dt x = x + vx * dt ; y = y + vy * dt ! T o r o i d a l boundary c o n d i t i o n s : i f ( x . g t . Lx ) x = x − L i f ( x . l t . −Lx ) x = x + L i f ( y . g t . Ly ) y = y − L i f ( y . l t . −Ly ) y = y + L ! Test i f i n s i d e the cut disks r1 = s q r t ( ( x−xc1 ) * * 2 + ( y−yc1 ) * * 2 ) r2 = s q r t ( ( x−xc2 ) * * 2 + ( y−yc2 ) * * 2 ) i f ( r1 . l t . R ) then ! N o t i c e : we pass r 1 as r a d i u s o f c i r c l e , not R c a l l crossC1 ( x , y , vx , vy , dt , r1 , d ) e l s e i f ( r2 . l t . R ) then c a l l crossC2 ( x , y , vx , vy , dt , r2 , d ) endif ! s m a l l chance here t h a t s t i l l i n C1 or C2 , but OK s i n c e ! another dt−advance giv e n a t t h e beginning o f do−loop enddo ! do while ( t . l t . t f ) end program WormHole2D ! ======================================================= s u b r o u t i n e crossC1 ( x , y , vx , vy , dt , R , d ) i m p l i c i t none r e a l ( 8 ) : : x , y , vx , vy , dt , R , d r e a l ( 8 ) : : vr , v0 ! v0 −> v t h e t a r e a l ( 8 ) : : theta , xc , yc p r i n t * , ’ # I n s i d e C1 : ( x , y , vx , vy , R)= ’ , x , y , vx , vy , R xc = 0.5 D0 * d ! c e n t e r o f C1 yc = 0.0 D0 theta = atan2 ( y−yc , x−xc ) x = −xc − R * c o s ( theta ) ! new x−value , y i n v a r i a n t ! Velocity transformation : vr = vx * c o s ( theta )+vy * s i n ( theta ) v0 = −vx * s i n ( theta )+vy * c o s ( theta ) vx = vr * c o s ( theta )+v0 * s i n ( theta ) vy = −vr * s i n ( theta )+v0 * c o s ( theta ) ! advance x , y , h o p e f u l l y o u t s i d e C2 : x = x + vx * dt y = y + vy * dt print * , ’# Exit C2 : ( x , y , vx , vy )= ’ , x , y , vx , vy end s u b r o u t i n e crossC1 ! ======================================================= s u b r o u t i n e crossC2 ( x , y , vx , vy , dt , R , d ) 2.4. APPLICATIONS 139 implicit none real (8) , parameter : : PI =3.14159265358979324 D0 real (8) : : x , y , vx , vy , dt , R , d real (8) : : vr , v0 ! v0 −> v t h e t a real (8) : : theta , xc , yc p r i n t * , ’ # I n s i d e C2 : ( x , y , vx , vy , R)= ’ , x , y , vx , vy , R xc = −0.5D0 * d ! c e n t e r o f C2 yc = 0.0 D0 theta = PI−atan2 ( y−yc , x−xc ) x = −xc + R * c o s ( theta ) ! new x−value , y i n v a r i a n t ! Velocity transformation : vr = −vx * c o s ( theta )+vy * s i n ( theta ) v0 = vx * s i n ( theta )+vy * c o s ( theta ) vx = −vr * c o s ( theta )−v0 * s i n ( theta ) vy = −vr * s i n ( theta )+v0 * c o s ( theta ) ! advance x , y , h o p e f u l l y o u t s i d e C1 : x = x + vx * dt y = y + vy * dt print * , ’# Exit C1 : ( x , y , vx , vy )= ’ , x , y , vx , vy end s u b r o u t i n e crossC2 It is easy to compile and run the program. See also the files Wormhole.csh and Wormhole_animate.gnu of the accompanying software and run the gnuplot commands: gnuplot > file = ”Wormhole . dat ” gnuplot > R =1; d =5; L=20; gnuplot > ! . / Wormhole . csh gnuplot > t0 =0; dt = 0 . 2 ; load ” Wormhole_animate . gnu” You are now ready to answer the rest of the questions that we asked in our list. 140 CHAPTER 2. KINEMATICS 2.5 Problems 2.1 Change the program Circle.f90 so that it prints the number of full circles traversed by the particle. 2.2 Add all the necessary tests on the parameters entered by the user in the program Circle.f90, so that the program is certain to run without problems. Do the same for the rest of the programs given in the same section. 2.3 A particle moves with constant angular velocity ω on a circle that has the origin of the coordinate system at its center. At time t0 = 0, the particle is at (x0 , y0 ). Write the program CircularMotion.f90 that will calculate the particle’s trajectory. The user should enter the parameters ω, x0 , y0 , t0 , tf , δt. The program should print the results like the program Circle.f90 does. 2.4 Change the program SimplePendulum.f90 so that the user could enter a non zero initial velocity. 2.5 Study the k → 0 limit in the projectile motion given by equations (2.10). Expand e−kt = 1−kt+ 2!1 (kt)2 +. . . and keep the non vanish- ing terms as k → 0. Then keep the next order leading terms which have a smaller power of k. Program these relations in a file ProjectileSmallAirResistance.f90. Consider the initial condi- tions ⃗v0 = x̂ + ŷ and calculate the range of the trajectory numerically by using the two programs ProjectileSmallAirResistance.f90, ProjectileAirResistance.f90. Determine the range of values of k for which the two results agree within 5% accuracy. 2.6 Write a program for a projectile which moves through a fluid with fluid resistance proportional to the square of the velocity. Compare the range of the trajectory with the one calculated by the program ProjectileAirResistance.f90 for the parameters shown in figure 2.10. 2.7 Change the program Lissajous.f90 so that the user can enter a different amplitude and initial phase in each direction. Study the case where the amplitudes are the same and the phase difference in the two directions are π/4, π/2, π, −π. Repeat by taking the am- plitude in the y direction to be twice as much the amplitude in the x direction. 2.5. PROBLEMS 141 2.8 Change the program ProjectileAirResistance.f90, so that it can calculate also the k = 0 case. 2.9 Change the program ProjectileAirResistance.f90 so that it can calculate the trajectory of the particle in three dimensional space. Plot the position coordinates and the velocity components as a func- tion of time. Plot the three dimensional trajectory using splot in gnuplot and animate the trajectory using the gnuplot script animate3D.gnu. 2.10 Change the program ChargeInB.f90 so that it can calculate the number of full revolutions that the projected particle’s position on the x − y plane makes during its motion. 2.11 Change the program box1D_1.f90 so that it prints the number of the particle’s collisions on the left wall, on the right wall and the total number of collisions to the stdout. 2.12 Do the same for the program box1D_2.f90. Fill the table on page 115 the number of calculated collisions and comment on the results. 2.13 Run the program box1D_1.f90 and choose L= 10, v0=1. Decrease the step dt up to the point that the particle stops to move. For which value of dt this happens? Increase v0=10,100. Until which value of dt the particle moves now? Why? 2.14 Change the REAL declarations to REAL(8) in the program box1D_1.f90. Add explicit exponents D0 to all constants (e.g. 0.0→0.0D0). Com- pare your results to those obtained in section 2.3.2. Repeat problem 2.13. What do you observe? 2.15 Change the program box1D_1.f90 so that you can study non elastic collisions v ′ = −ev, 0 < e ≤ 1 with the walls. 2.16 Change the program box2D_1.f90 so that you can study inelastic collisions with the walls, such that vx′ = −evx , vy′ = −evy , 0 < e ≤ 1. 2.17 Use the method of calculating time in the programs box1D_4.f90 and box1D_5.f90 in order to produce the results in figure 2.21. 2.18 Particle falls freely moving in the vertical direction. It starts with zero velocity at height h. Upon reaching the ground, it bounces inelastically such that vy′ = −evy with 0 < e ≤ 1 a parameter. Write the necessary program in order to study numerically the particle’s motion and study the cases e = 0.1, 0.5, 0.9, 1.0. 142 CHAPTER 2. KINEMATICS 2.19 Generalize the program of the previous problem so that you can study the case ⃗v0 = v0x x̂. Animate the calculated trajectories. 2.20 Study the motion of a particle moving inside the box of figure 2.30. Count the number of collisions of the particle with the walls before it leaves the box. Lx a Ly Figure 2.30: Problem 2.20. 2.21 Study the motion of the point particle on the “billiard table” of figure 2.31. Count the number of collisions with the walls before the particle enters into a hole. The program should print from which hole the particle left the table. a a a a Ly a a a a Lx Figure 2.31: Problem 2.21. 2.22 Write a program in order to study the motion of a particle in the box of figure 2.32. At the center of the box there is a disk on which the particle bounces off elastically (Hint: use the routine reflectVonCircle of the program Cylinder3D.f90). 2.23 In the box of the previous problem, put four disks on which the particle bounces of elastically like in figure 2.33. 2.5. PROBLEMS 143 Ly 2R Lx Figure 2.32: Problem 2.22. 2R 111 000 111 000 111 000 111 000 111 000 111 000 111 111 000 Ly 000 111 000 111 000 111 000 2R 111 000 111 000 111 000 111 000 2R 2R 111 000 111 000 111 000 111 000 111 000 2a Lx Figure 2.33: Problem 2.23. 2.24 Consider the arrangement of figure 2.34. Each time the particle bounces elastically off a circle, the circle disappears. The game is over successfully if all the circles vanish. Each time the particle bounces off on the wall to the left, you lose a point. Try to find trajectories that minimize the number of lost points. 111 000 111 000 111 000 111 000 111 000 111 000 111 000 111 000 111 000 111 000 Ly 111 000 111 000 111 000 111 111 000 000 111 000 111 000 111 000 111 000 111 000 111 000 111 111 111 000 000 000 111 000 111 000 111 111 000 000 111 000 111 000 111 000 000 000 111 111 000 111 111 000 Lx Figure 2.34: Problem 2.24. 144 CHAPTER 2. KINEMATICS Chapter 3 Logistic Map Nonlinear differential equations model interesting dynamical systems in physics, biology and other branches of science. In this chapter we per- form a numerical study of the discrete logistic map as a “simple math- ematical model with complex dynamical properties” [21] similar to the ones encountered in more complicated and interesting dynamical sys- tems. For certain values of the parameter of the map, one finds chaotic behavior giving us an opportunity to touch on this very interesting topic with important consequences in physical phenomena. Chaotic evolu- tion restricts out ability for useful predictions in an otherwise fully deter- ministic dynamical system: measurements using slightly different initial conditions result in a distribution which is indistinguishable from the dis- tribution coming from sampling a random process. This scientific field is huge and active and we refer the reader to the bibliography for a more complete introduction [21, 22, 23, 24, 25, 26, 27, 38]. 3.1 Introduction The most celebrated application of the logistic map comes from the study of population growth in biology. One considers populations which re- produce at fixed time intervals and whose generations do not overlap. The simplest (and most naive) model is the one that makes the rea- sonable assumption that the rate of population growth dP (t)/dt of a population P (t) is proportional to the current population: dP (t) = kP (t) . (3.1) dt The general solution of the above equation is P (t) = P (0)ekt showing an exponential population growth for k > 0 an decline for k < 0. It 145 146 CHAPTER 3. LOGISTIC MAP is obvious that this model is reasonable as long as the population is small enough so that the interaction with its environment (adequate food, diseases, predators etc) can be neglected. The simplest model that takes into account some of the factors of the interaction with the environment (e.g. starvation) is obtained by the introduction of a simple non linear term in the equation so that dP (t) = kP (t)(1 − bP (t)) . (3.2) dt The parameter k gives the maximum growth rate of the population and b controls the ability of the species to maintain a certain population level. The equation (3.2) can be discretized in time by assuming that each gen- eration reproduces every δt and that the n-th generation has population Pn = P (tn ) where tn = t0 + (n − 1)δt. Then P (tn+1 ) ≈ P (tn ) + δtP ′ (tn ) and equation (3.1) becomes Pn+1 = rPn , (3.3) where r = 1 + kδt. The solutions of the above equation are well ap- proximated by Pn ∼ P0 ektn ∝ e(r−1)n so that we have population growth when r > 1 and decline when r < 1. Equation (3.2) can be discretized as follows: Pn+1 = Pn (r − bPn ) . (3.4) Defining xn = (b/r)Pn we obtain the logistic map xn+1 = rxn (1 − xn ) . (3.5) We define the functions f (x) = rx(1 − x), F (x, r) = rx(1 − x) (3.6) (their only difference is that, in the first one, r is considered as a given parameter), so that xn+1 = f (xn ) = f (2) (xn−1 ) = . . . = f (n) (x1 ) = f (n+1) (x0 ) , (3.7) where we use the notation f (1) (x) = f (x), f (2) (x) = f (f (x)), f (3) (x) = f (f (f (x))), . . . for function composition. In what follows, the derivative of f will be useful: ∂F (x, r) f ′ (x) = = r(1 − 2x) . (3.8) ∂x 3.2. FIXED POINTS AND 2N CYCLES 147 Since we interpret xn to be the fraction of the population with respect to its maximum value, we should have 0 ≤ xn ≤ 1 for each¹ n. The function f (x) has one global maximum for x = 1/2 which is equal to f (1/2) = r/4. Therefore, if r > 4, then f (1/2) > 1, which for an appro- priate choice of x0 will lead to xn+1 = f (xn ) > 1 for some value of n. Therefore, the interval of values of r which is of interest for our model is 0 < r ≤ 4. (3.9) The logistic map (3.5) may be viewed as a finite difference equation and it is a one step inductive relation. Given an initial value x0 , a sequence of values {x0 , x1 , . . . , xn , . . . } is produced. This will be referred² to as the trajectory of x0 . In the following sections we will study the properties of these trajectories as a function of the parameter r. The solutions of the logistic map are not known except in special cases. For r = 2 we have 1( ) xn = 1 − (1 − x0 )2n , (3.10) 2 and for³ r = 4 1 √ xn = sin2 (2n πθ) , θ= sin−1 x0 . (3.11) π For r = 2, limn→∞ xn = 1/2 whereas for r = 4 we have periodic trajectories resulting in rational θ and non periodic resulting in irrational θ. For other values of r we have to resort to a numerical computation of the trajectories of the logistic map. 3.2 Fixed Points and 2n Cycles It is obvious that if the point x∗ is a solution of the equation x = f (x), then xn = x∗ ⇒ xn+k = x∗ for every k ≥ 0. For the function f (x) = rx(1 − x) we have two solutions x∗1 = 0 and x∗2 = 1 − 1/r . (3.12) ¹Note that if xn > 1 then xn+1 < 0, so that if we want xn ≥ 0 for each n, then we should have xn ≤ 1 for each n. ²In the bibliography, the term “splinter of x0 ” is frequently used. ³E. Schröder, “Über iterierte Funktionen”, Math. Ann. 3 (1870) 296; E. Lorenz, “The problem of deducing the climate from the governing equations”, Tellus 16 (1964) 1 148 CHAPTER 3. LOGISTIC MAP We will see that for appropriate values of r, these solutions are attractors of most of the trajectories. This means that for a range of values for the initial point 0 ≤ x0 ≤ 1, the sequence {xn } approaches asymptotically one of these points as n → ∞. Obviously the (measure zero) sets of initial values {x0 } = {x∗1 } and {x0 } = {x∗2 } result in trajectories attracted by x∗1 and x∗2 respectively. In order to determine which one of the two values is preferred, we need to study the stability of the fixed points x∗1 and x∗2 . For this, assume that for some value of n, xn is infinitesimally close to the fixed point x∗ so that xn = x∗ + ϵn xn+1 = x∗ + ϵn+1 . (3.13) Since xn+1 = f (xn ) = f (x∗ + ϵn ) ≈ f (x∗ ) + ϵn f ′ (x∗ ) = x∗ + ϵn f ′ (x∗ ) , (3.14) where we used the Taylor expansion of the analytic function f (x∗ + ϵn ) about x∗ and the relation x∗ = f (x∗ ), we have that ϵn+1 = ϵn f ′ (x∗ ). Then we obtain ϵn+1 = |f ′ (x∗ )| . (3.15) ϵn Therefore, if |f ′ (x∗ )| < 1 we obtain limn→∞ ϵn = 0 and the fixed point x∗ is stable: the sequence {xn+k } approaches x∗ asymptotically. If |f ′ (x∗ )| > 1 then the sequence {xn+k } deviates away from x∗ and the fixed point is unstable. The limiting case |f ′ (x∗ )| = 1 should be studied separately and it indicates a change in the stability properties of the fixed point. In the following discussion, these points will be shown to be bifurcation points. For the function f (x) = rx(1 − x) with f ′ (x) = r(1 − 2x) we have that f (0) = r and f ′ (1 − 1/r) = 2 − r. Therefore, if r < 1 the point x∗1 = 0 ′ is an attractor, whereas the point x∗2 = 1 − 1/r < 0 is irrelevant. When r > 1, the point x∗1 = 0 results in |f ′ (x∗1 )| = r > 1, therefore x∗1 is unstable. Any initial value x0 near x∗1 deviates from it. Since for 1 < r < 3 we have that 0 ≤ |f ′ (x∗2 )| = |2 − r| < 1, the point x∗2 is an attractor. Any initial value x0 ∈ (0, 1) approaches x∗2 = 1 − 1/r. When r = rc = 1 we have the (1) limiting case x∗1 = x∗2 = 0 and we say that at the critical value rc = 1 the (1) fixed point x∗1 bifurcates to the two fixed points x∗1 and x∗2 . As r increases, the fixed points continue to bifurcate. Indeed, when r = rc = 3 we have that f ′ (x∗2 ) = 2 − r = −1 and for r > rc the point (2) (2) x∗2 becomes unstable. Consider the solution of the equation x = f (2) (x). If 0 < x∗ < 1 is one of its solutions and for some n we have that xn = x∗ , 3.2. FIXED POINTS AND 2N CYCLES 149 then xn+2 = xn+4 = . . . = xn+2k = . . . = x∗ and xn+1 = xn+3 = . . . = xn+2k+1 = . . . = f (x∗ ) (therefore f (x∗ ) is also a solution). If 0 < x∗3 < x∗4 < 1 are two such different solutions with x∗3 = f (x∗4 ), x∗4 = f (x∗3 ), then the trajectory is periodic with period 2. The points x∗3 , x∗4 are such that they are real solutions of the equation f (2) (x) = r2 x(1 − x)(1 − rx(1 − x)) = x , (3.16) and at the same time they are not the solutions x∗1 = 0 x∗2 = 1 − 1/r of the equation⁴ x = f (2) (x), the polynomial above can be written in the form (see [22] for more details) ( ( )) 1 x x− 1− (Ax2 + Bx + C) = 0 . (3.17) r By expanding the polynomials (3.16), (3.17) and comparing their coef- ficients we conclude that A = −r3 , B = r2 (r + 1) and C = −r(r + 1). The roots of the trinomial in (3.17) are determined by the discriminant ∆ = r2 (r + 1)(r − 3). For the values of r of interest (1 < r ≤ 4), the dis- (2) criminant becomes positive when r > rc = 3 and we have two different solutions √ x∗α = ((r + 1) ∓ r2 − 2r − 3)/(2r) α = 3, 4 . (3.18) (2) When r = rc we have one double root, therefore a unique fixed point. The study of the stability of the solutions of x = f (2) (x) requires the same steps that led to the equation (3.15) and we determine if the absolute value of f (2)′ (x) is greater, less or equal to one. By noting that⁵ f (2)′ (x3 ) = f (2)′ (x4 ) = f ′ (x3 )f ′ (x4 ) = −r2 + 2r + 4, we see that for √ r = rc = 3, f (2)′ (x∗3 ) = f (2)′ (x∗4 ) = 1 and for r = rc = 1 + 6 ≈ √ (2) (3) 3.4495, f (x3 ) =f (x4 ) = −1. For the intermediate values 3 < r < 1 + 6 the (2)′ (2)′ derivatives |f (2)′ (x∗α )| < 1 for α = 3, 4. Therefore, these points are stable solutions of x = f (2) (x) and the points x∗1 , x∗2 bifurcate to x∗α , α = 1, 2, 3, 4 (2) for r = rc = 3. Almost all trajectories with initial points in the interval [0, 1] are attracted by the periodic trajectory with period 2, the “2-cycle” {x∗3 , x∗4 }. ⁴Because, if x∗ = f (x∗ ) ⇒ f (2) (x∗ ) = f (f (x∗ )) = f (x∗ ) = x∗ etc, the point x∗ is also a solution of x∗ = f (n) (x∗ ). ⁵The chain rule dh(g(x))/dx = h′ (g(x))g ′ (x) gives that f (2)′ (x∗3 ) = df (f (x∗3 ))/dx = f (f (x∗3 ))f ′ (x∗3 ) = f ′ (x∗4 )f ′ (x∗3 ) and similarly for f (2)′ (x∗4 ). We can prove by induction ′ that for the n solutions x∗n+1 , x∗n+2 , . . . , x∗2n that belong to the n-cycle of the equation x = f (n) (x) we have that f (n)′ (xn+i ) = f ′ (xn+1 ) f ′ (xn+2 ) . . . f ′ (x2n ) for every i = 1, . . . , n. 150 CHAPTER 3. LOGISTIC MAP Using similar arguments we find that the fixed points x∗α , α = 1, 2, 3, 4 √ bifurcate to the eight fixed points x∗α , α = 1, . . . , 8 when r = rc = 1 + 6. (3) These are real solutions of the equation that gives the 4-cycle x = f (4) (x). For rc < r < rc ≈ 3.5441, the points x∗α , α = 5, . . . , 8 are a stable 4- (3) (4) cycle which is an attractor of almost all trajectories of the logistic map⁶. (4) (5) Similarly, for rc < r < rc the 16 fixed points of the equation x = f (8) (x) (5) (6) give a stable 8-cycle, for rc < r < rc a stable 16-cycle etc⁷. This is the phenomenon which is called period doubling which continues ad (n) infinitum. The points rc are getting closer to each other as n increases (n) so that limn→∞ rc = rc ≈ 3.56994567. As we will see, rc marks the onset of the non-periodic, chaotic behavior of the trajectories of the logistic map. 0.9 0.14 0.8 0.12 0.7 0.1 0.6 0.08 0.5 0.06 0.4 0.04 r= 0.5 0.3 r= 0.99 0.02 r= 1/0.9 0.2 r= 1/0.88 r= 1/0.86 0 0.1 0 20 40 60 80 100 120 140 160 180 200 0 10 20 30 40 50 Figure 3.1: (Left) Some trajectories of the logistic map with x0 = 0.1 and various values of r. We can see the first bifurcation for rc = 1 from x∗1 = 0 to x∗2 = 1 − 1/r. (1) (2) (3) (Right) Trajectories of the logistic map for rc < r = 3.5 < rc . The three curves start from three different initial points. After a transient period, depending on the initial point, one obtains a periodic trajectory √ which is a 2-cycle. The horizontal lines are the expected values x∗3,4 = ((r + 1) ∓ r2 − 2r − 3)/(2r) (see text). Computing the bifurcation points becomes quickly intractable and we have to resort to a numerical computation of their values. Initially we will write a program that computes trajectories of the logistic map for chosen values of r and x0 . The program can be found in the file logistic.f90 and is listed below: ⁶The points x∗α , α = 1, . . . , 4 are unstable fixed points and 2-cycle. (n) (n+1) ⁷Generally, for rc < r < rc < rc ≈ 3.56994567 we have 2n fixed points of n−1 the equation x = f (2 ) (x) and stable 2n−1 -cycles, which are attractors of almost all trajectories. 3.2. FIXED POINTS AND 2N CYCLES 151 ! =========================================================== ! D i s c r e t e L o g i s t i c Map ! =========================================================== program logistic_map i m p l i c i t none i n t e g e r : : NSTEPS , i r e a l ( 8 ) : : r , x0 , x1 ! −−−−− Input : p r i n t * , ’ # Enter NSTEPS , r , x0 : ’ read * , NSTEPS , r , x0 p r i n t * , ’ # NSTEPS = ’ , NSTEPS print * , ’# r = ’ ,r p r i n t * , ’ # x0 = ’ , x0 ! −−−−− I n i t i a l i z e : open ( u n i t =33 , f i l e = ’ l o g . dat ’ ) w r i t e ( 3 3 , * ) 0 , x0 ! −−−−− C a l c u l a t e : do i =1 , NSTEPS x1 = r * x0 * ( 1 . 0 D0−x0 ) w r i t e ( 3 3 , * ) i , x1 x0 = x1 enddo c l o s e (33) end program logistic_map The program is compiled and run using the commands: > g f o r t r a n logistic . f90 −o l > echo ” 100 0.5 0 . 1 ” | . / l The command echo prints to the stdout the values of the parameters NSTEPS=100, r=0.5 and x0=0.1. Its stdout is redirected to the stdin of the command ./l by using a pipe via the symbol |, from which the program reads their value and uses them in the calculation. The results can be found in two columns in the file log.dat and can be plotted using gnuplot. The plots are put in figure 3.1 and we can see the first (1) (2) two bifurcations when r goes past the values rc and rc . Similarly, we (n−1) can study trajectories which are 2n -cycles when r crosses the values rc . Another way to depict the 2-cycles is by constructing the cobweb plots: We start from the point (x0 , 0) and we calculate the point (x0 , x1 ), where x1 = f (x0 ). This point belongs on the curve y = f (x). The point (x0 , x1 ) is then projected on the diagonal y = x and we obtain the point (x1 , x1 ). We repeat n times obtaining the points (xn , xn+1 ) and (xn+1 , xn+1 ) on y = f (x) 152 CHAPTER 3. LOGISTIC MAP 0.7 0.8 0.6 0.7 0.5 0.6 0.5 0.4 0.4 0.3 0.3 0.2 0.2 0.1 0.1 0 0 0 0.2 0.4 0.6 0.8 1 0 0.2 0.4 0.6 0.8 1 Figure 3.2: Cobweb plots of the logistic map for r = 2.8 and 3.3. (Left) The left plot is an example of a fixed point x∗ = f (x∗ ). The green line is y = f (x) and the blue line is y = f (2) (x). The trajectory ends at the unique non zero intersection of the diagonal and y = f (x) which is x∗2 = 1 − 1/r. The trajectory intersects the curve y = f (2) (x) at the same point. y = f (2) (x) does not intersect the diagonal anywhere else. (Right) The right plot shows an example of a 2-cycle. y = f (2) (x) intersects the diagonal at two additional points determined by x∗3 and x∗4 . The trajectory ends up on the orthogonal (x∗3 , x∗3 ), (x∗4 , x∗3 ), (x∗4 , x∗4 ), (x∗3 , x∗4 ). and y = x respectively. The fixed points x∗ = f (x∗ ) are at the intersections of these curves and, if they are attractors, the trajectories will converge on them. If we have a 2n -cycle, we will observe a periodic trajectory n going through points which are solutions to the equation x = f (2 ) (x). This exercise can be done by using the following program, which can be found in the file logistic1.f90: ! =========================================================== ! D i s c r e t e L o g i s t i c Map ! Map t h e t r a j e c t o r y i n 2d spa c e ( plane ) ! =========================================================== program logistic_map i m p l i c i t none i n t e g e r : : NSTEPS , i r e a l ( 8 ) : : r , x0 , x1 ! −−−−− Input : p r i n t * , ’ # Enter NSTEPS , r , x0 : ’ read * , NSTEPS , r , x0 p r i n t * , ’ # NSTEPS = ’ , NSTEPS print * , ’# r = ’ ,r p r i n t * , ’ # x0 = ’ , x0 ! −−−−− I n i t i a l i z e : open ( u n i t =33 , f i l e = ’ t r j . dat ’ ) ! −−−−− C a l c u l a t e : 3.2. FIXED POINTS AND 2N CYCLES 153 0.9 0.8 0.8 0.7 0.7 0.6 0.6 0.5 0.5 0.4 0.4 0.3 0.3 0.2 0.2 0.1 0.1 0 0 0 0.2 0.4 0.6 0.8 1 0 0.2 0.4 0.6 0.8 1 Figure 3.3: (Left) A 4-cycle for r = 3.5. The blue curve is y = f (4) (x) which intersects the diagonal at four points determined by xα , α = 5, 6, 7, 8. The four cycle passes through these points. (Right) a non periodic orbit for r = 3.7 when the system exhibits chaotic behavior. w r i t e ( 3 3 , * ) 0 , x0 , 0 do i =1 , NSTEPS x1 = r * x0 * ( 1 . 0 D0−x0 ) w r i t e ( 3 3 , * ) 2* i−3,x0 , x1 w r i t e ( 3 3 , * ) 2* i−2,x1 , x1 x0 = x1 enddo c l o s e (33) end program logistic_map Compiling and running this program is done exactly as in the case of the program in logistic.f90. We can plot the results using gnuplot. The plot in figure 3.2 can be constructed using the commands: gnuplot > s e t s i z e square gnuplot > f ( x ) = r * x *(1.0 − x ) gnuplot > r = 3.3 gnuplot > p l o t ”<echo 50 3.3 0 . 2 | . / l ; c a t t r j . dat ” using 2:3 w l gnuplot > replot f(x) ,f(f(x) ) ,x The plot command shown above, runs the program exactly as it is done on the command line. This is accomplished by using the symbol <, which reads the plot from the stdout of the command "echo 50 3.3 0.2|./l;cat trj.dat". Only the second command "echo trj.dat" writes to the stdout, therefore the plot is constructed from the contents of the file trj.dat. The following line adds the plots of the functions f (x), f (2) (x) = f (f (x)) and of the diagonal y = x. Figures 3.2 and 3.3 show examples of attractors which are fixed points, 2-cycles and 4-cycles. An 154 CHAPTER 3. LOGISTIC MAP example of a non periodic trajectory is also shown, which exhibits chaotic behavior which can happen when r > rc ≈ 3.56994567. 3.3 Bifurcation Diagrams The bifurcations of the fixed points of the logistic map discussed in the previous section can be conveniently shown on the “bifurcation diagram”. We remind to the reader that the first bifurcations happen at the critical values of r rc(1) < rc(2) < rc(3) < . . . < rc(n) < . . . < rc , (3.19) (1) (2) (3) √ (n) where rc = 1, rc = 3, rc = 1 + 6 and rc = limn→∞ rc ≈ 3.56994567. we have 2n fixed points x∗α , α = 1, 2, ..., 2n of x = (n) (n+1) For rc < r < rc f (2 ) (x). By plotting these points x∗α (r) as a function of r we construct the n bifurcation diagram. These can be calculated numerically by using the program bifurcate.f90. In this program, the user selects the values of r that she needs to study and for each one of them the program records the point of the 2n−1 -cycles⁸ x∗α (r), α = 2n−1 + 1, 2n−1 + 2, . . . , 2n . This is easily done by computing the logistic map several times until we are sure that the trajectories reach the stable state. The parameter NTRANS in the program determines the number of points that we throw away, which should contain all the transient behavior. After NTRANS steps, the program records NSTEPS points, where NSTEPS should be large enough to cover all the points of the 2n−1 -cycles or depict a dense enough set of values of the non periodic orbits. The program is listed below: ! =========================================================== ! B i f u r c a t i o n Diagram o f t h e L o g i s t i c Map ! =========================================================== program bifurcation_diagram i m p l i c i t none r e a l ( 8 ) , parameter : : rmin = 2.5 D0 r e a l ( 8 ) , parameter : : rmax = 4.0 D0 i n t e g e r , parameter : : NTRANS = 500 ! Number o f d i s c a r d e d s t e p s i n t e g e r , parameter : : NSTEPS = 100 ! Number o f recorded s t e p s i n t e g e r , parameter : : RSTEPS = 2000 ! Number o f v a l u e s o f r integer :: i real (8) : : r , dr , x0 , x1 ! −−−−− I n i t i a l i z e : ⁸If we want to be more precise, the bifurcation diagram contains also the unstable points. What we really construct is the orbit diagram which contains only the stable points. 3.3. BIFURCATION DIAGRAMS 155 open ( u n i t =33 , f i l e = ’ b i f . dat ’ ) dr = ( rmax−rmin ) / RSTEPS ! Increment i n r ! −−−−− C a l c u l a t e : r = rmin do while ( r . l e . rmax ) x0 = 0.5 D0 ! −−−− T r a n s i e n t s t e p s : s k i p do i =1 , NTRANS x1 = r * x0 * ( 1 . 0 D0−x0 ) x0 = x1 enddo do i =1 , NSTEPS x1 = r * x0 * ( 1 . 0 D0−x0 ) w r i t e ( 3 3 , * ) r , x1 x0 = x1 enddo r = r + dr enddo ! do while c l o s e (33) end program bifurcation_diagram 1 0.52 0.9 0.8 0.515 0.7 0.51 0.6 0.505 0.5 0.5 0.4 0.495 0.3 0.49 0.2 0.485 0.1 0 0.48 2.4 2.6 2.8 3 3.2 3.4 3.6 3.8 4 3.6295 3.63 3.6305 3.631 3.6315 3.632 3.6325 3.633 3.6335 3.634 Figure 3.4: (Left) The bifurcation diagram computed by the program bifurcate.f90 for 2.5 < r < 4. Notice the first bifurcation points followed by intervals of chaotic, non- periodic orbits interrupted by intermissions of stable periodic trajectories. The chaotic trajectories take values in subsets of the interval √ (0, 1). For r = 4 they take values within the whole (0, 1). One can see that for r = 1 + 8 ≈ 3.8284 we obtain a 3-cycle which subsequently bifurcates to 3 · 2n -cycles. (Right) The diagram on the left is magnified in a range of r showing the self-similarity of the diagram at all scales. The program can be compiled and run using the commands: > g f o r t r a n bifurcate . f90 −o b > ./ b; 156 CHAPTER 3. LOGISTIC MAP The left plot of figure 3.4 can be constructed by the gnuplot commands: gnuplot > p l o t ” b i f . dat ” with dots We observe the fixed points and the 2n -cycles for r < rc . When r goes past rc , the trajectories become non-periodic and exhibit chaotic behavior. Chaotic behavior will be discussed more extensively in the next section. For the time being, we note that if we measure the distance between the (n+1) (n) points ∆r(n) = rc − rc , we find that it decreases constantly with n so that ∆r(n) lim = δ ≈ 4.669 201 609 , (3.20) n→∞ ∆r (n+1) where δ is the Feigenbaum constant. An additional constant α, defined by the quotient of the separation of adjacent elements ∆wn of period doubled attractors from one double to the next ∆wn+1 , is ∆wn lim = α ≈ 2.502 907 875 . (3.21) n→∞ ∆wn+1 It is √also interesting to note the appearance of a 3-cycle right after r = 1 + 8 ≈ 3.8284 > rc ! By using the theorem of Sharkovskii, Li and Yorke⁹ showed that any one dimensional system has 3-cycles, therefore it will have cycles of any length and chaotic trajectories. The stability of the 3-cycle can be studied from the solutions of x = f (3) (x) in exactly the same way that we did in equations (3.16) and (3.17) (see [22] for details). Figure 3.5 magnifies a branch of the 3-cycle. By magnifying different regions in the bifurcation plot, as shown in the right plot of figure 3.4, we find similar shapes to the branching of the 3-cycle. Figure 3.4 shows that between intervals of chaotic behavior we obtain “windows” of periodic trajectories. These are infinite but countable. It is also quite interesting to note that if we magnify a branch withing these windows, we obtain a diagram that is similar to the whole diagram! We say that the bifurcation diagram exhibits self similarity. There are more interesting properties of the bifurcation diagram and we refer the reader to the bibliography for a more complete exposition. We close this section by mentioning that the qualitative properties of the bifurcation diagram are the same for a whole class of functions. Feigenbaum discovered that if one takes any function that is concave and ⁹T.Y. Li, J.A. Yorke, “Period Three Implies Chaos”, American Mathematical Monthly 82 (1975) 985. 3.4. THE NEWTON-RAPHSON METHOD 157 0.52 0.51 0.5 0.49 0.48 0.47 0.46 3.83 3.835 3.84 3.845 3.85 √ Figure 3.5: Magnification of one of the three branches of the 3-cycle for r > 1 + 8. To the left, we observe the temporary halt of the chaotic behavior of the trajectory, which comes back as shown in the plot to the right after an intermission of stable periodic trajectories. has a unique global maximum, its bifurcation diagram behaves qualita- tively the same way as that of the logistic map. Examples of such func- tions¹⁰ studied in the literature are g(x) = xer(1−x) , u(x) = r sin(πx) and w(x) = b − x2 . The constants δ and α of equations (3.20) and (3.21) are the same of all these mappings. The functions that result in chaotic behavior are studied extensively in the literature and you can find a list of those in [28]. 3.4 The Newton-Raphson Method In order to determine the bifurcation points, one has to solve the nonlin- ear, polynomial, algebraic equations x = f (n) (x) and f (n)′ (x) = −1. For this reason, one has to use an approximate numerical calculation of the roots, and the simple Newton-Raphson method will prove to be a good choice. Newton-Raphson’s method uses an initial guess x0 for the solution of the equation g(x) = 0 and computes a sequence of points x1 , x2 , . . . , xn , xn+1 , . . . that presumably converges to one of the roots of the equation. The computation stops at a finite n, when we decide that the desired level of accuracy has been achieved. In order to understand how it works, we assume that g(x) is an analytic function for all the values of x used in ¹⁰ The function x exp(r(1 − x)) has been used as a model for populations whose large density is restricted by epidemics. The populations are always positive independently of the (positive) initial conditions and the value of r. 158 CHAPTER 3. LOGISTIC MAP the computation. Then, by Taylor expanding around xn we obtain g(xn+1 ) = g(xn ) + (xn+1 − xn )g ′ (x) + . . . . (3.22) If we wish to have g(xn+1 ) ≈ 0, we choose g(xn ) xn+1 = xn − . (3.23) g ′ (xn ) The equation above gives the Newton-Raphson method for one equation g(x) = 0 of one variable x. Different choices for x0 will possibly lead to different roots. When g ′ (x), g ′′ (x) are non zero at the root and g ′′′ (x) is bounded, the convergence of the method is quadratic with the number of iterations. This means that there is a neighborhood of the root α such that the distance ∆xn+1 = xn+1 − α is ∆xn+1 ∝ (∆xn )2 . If the root α has multiplicity larger than 1, convergence is slower. The proofs of these statements are simple and can be found in [29]. The Newton-Raphson method is simple to program and, most of the times, sufficient for the solution of many problems. In the general case it works well only close enough to a root. We should also keep in mind that there are simple reasons for the method to fail. For example, when g ′ (xn ) = 0 for some n, the method stops. For functions that tend to 0 as x → ±∞, it is easy to make a bad choice for x0 that does not lead to convergence to a root. Sometimes it is a good idea to combine the Newton-Raphson method with the bisection method. When the derivative g ′ (x) diverges at the root we might get into trouble. For example, the equation |x|ν = 0 with 0 < ν < 1/2, does not lead to a convergent sequence. In some cases, we might enter into non-convergent cycles [8]. For some functions the basin of attraction of a root (the values of x0 that will converge to the root) can be tiny. See problem 13. As a test case of our program, consider the equation √ ϵ tan ϵ = ρ2 − ϵ2 (3.24) which results from the solution of Schrödinger’s equation for the en- ergy spectrum of a quantum mechanical particle of mass m in a one dimensional √ potential well √ of depth V0 and width L. The parameters ϵ = mL2 E/(2ℏ) and ρ = mL2 V0 /(2ℏ). Given ρ, we solve for ϵ which gives the energy E. The function g(x) and its derivative g ′ (x) are √ g(x) = x tan x − ρ2 − x2 x x g ′ (x) = √ + + tan x . (3.25) ρ −x 2 2 cos2 x 3.4. THE NEWTON-RAPHSON METHOD 159 The program of the Newton-Raphson method for solving the equation g(x) = 0 can be found in the file nr.f90: ! =========================================================== ! Newton Raphson f o r a f u n c t i o n o f one v a r i a b l e ! =========================================================== program NewtonRaphson i m p l i c i t none r e a l ( 8 ) , parameter : : rho = 15.0 D0 r e a l ( 8 ) , parameter : : eps = 1D−6 i n t e g e r , parameter : : NMAX = 1000 r e a l ( 8 ) : : x0 , x1 , e r r , g , gp integer : : i p r i n t * , ’ Enter x0 : ’ read * , x0 e r r = 1 . 0 D0 print * , ’ i t e r x error ’ p r i n t * , ’−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−’ p r i n t * , 0 , x0 , e r r do i =1 , NMAX ! value of function g ( x ) : g = x0 * tan ( x0 )−s q r t ( rho * rho−x0 * x0 ) ! value of the d e r i v a t i v e g ’ ( x ) : gp = x0 / s q r t ( rho * rho−x0 * x0 )+x0 / ( c o s ( x0 ) * * 2 ) +tan ( x0 ) x1 = x0 − g / gp e r r = ABS( x1−x0 ) p r i n t * , i , x1 , e r r i f ( e r r . l t . eps ) e x i t x0 = x1 enddo end program NewtonRaphson In the program listed above, the user is asked to set the initial point x0 . We fix ρ = rho = 15. It is instructive to make the plot of the left and right hand sides of (3.24) and make a graphical determination of the roots from their intersections. Then we can make appropriate choices of the initial point x0 . Using gnuplot, the plots are made with the commands: gnuplot > g1 ( x ) = x * tan ( x ) gnuplot > g2 ( x ) = s q r t ( rho * rho−x * x ) gnuplot > p l o t [ 0 : 2 0 ] [ 0 : 2 0 ] g1 ( x ) , g2 ( x ) The compilation and running of the program can be done as follows: > g f o r t r a n nr . f90 −o n 160 CHAPTER 3. LOGISTIC MAP 20 15 10 5 ε tanε (ρ2-ε2)1/2 0 0 5 10 15 20 ε Figure 3.6: Plots of the right and left hand sides of equation (3.24). The intersections of the curves determine the solutions of the equation and their approximate graphical estimation can serve as initial points x0 for the Newton-Raphson method. > echo ” 1 . 4 ” | . / n Enter x0 : iter x error −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− 0 1.3999999999999999 1.0000000000000000 1 1.5254292024457967 0.12542920244579681 2 1.5009739120496131 2.4455290396183660E−002 3 1.4807207017202200 2.0253210329393090E−002 4 1.4731630533073483 7.5576484128716537E−003 5 1.4724779331237687 6.8512018357957949E−004 6 1.4724731072313519 4.8258924167932093E−006 7 1.4724731069952235 2.3612845012621619E−010 We conclude that one of the roots of the equation is ϵ ≈ 1.472473107. The reader can compute more of these roots by following these steps by herself. The method discussed above can be easily generalized to the case of two equations. Suppose that we need to solve simultaneously two algebraic equations g1 (x1 , x2 ) = 0 and g2 (x1 , x2 ) = 0. In order to compute a sequence (x10 , x20 ), (x11 , x21 ), . . ., (x1n , x2n ), (x1(n+1) , x2(n+1) ), . . . that may converge to a root of the above system of equations, we Taylor expand 3.4. THE NEWTON-RAPHSON METHOD 161 the two functions around (x1n , x2n ) ∂g1 (x1n , x2n ) g1 (x1(n+1) , x2(n+1) ) = g1 (x1n , x2n ) + (x1(n+1) − x1n ) ∂x1 ∂g1 (x1n , x2n ) + (x2(n+1) − x2n ) + ... ∂x2 ∂g2 (x1n , x2n ) g2 (x1(n+1) , x2(n+1) ) = g2 (x1n , x2n ) + (x1(n+1) − x1n ) ∂x1 ∂g2 (x1n , x2n ) + (x2(n+1) − x2n ) + . . . . (3.26) ∂x2 Defining δx1 = (x1(n+1) − x1n ) and δx2 = (x2(n+1) − x2n ) and setting g1 (x1(n+1) , x2(n+1) ) ≈ 0, g2 (x1(n+1) , x2(n+1) ) ≈ 0, we obtain ∂g1 ∂g1 δx1 + δx2 = −g1 ∂x1 ∂x2 ∂g2 ∂g2 δx1 + δx2 = −g2 . (3.27) ∂x1 ∂x2 This is a linear 2 × 2 system of equations A11 δx1 + A12 δx2 = b1 A21 δx1 + A22 δx2 = b2 , (3.28) where Aij = ∂gi /∂xj and bi = −gi , with i, j = 1, 2. Solving for δxi we obtain x1(n+1) = x1n + δx1 x2(n+1) = x2n + δx2 . (3.29) The iterations stop when δxi become small enough. As an example, consider the equations with g1 (x) = 2x2 − 3xy + y − 2, g2 (x) = 3x + xy + y − 1. We have A11 = 4x − 3y, A12 = 1 − 3x, A21 = 3 + y, A22 = 1 + x. The program can be found in the file nr2.f90: ! =========================================================== ! Newton Raphson o f two f u n c t i o n s o f two v a r i a b l e s ! =========================================================== program NewtonRaphson2 i m p l i c i t none r e a l ( 8 ) , parameter : : eps = 1D−6 i n t e g e r , parameter : : NMAX = 1000 r e a l ( 8 ) : : A ( 2 , 2 ) , b ( 2 ) , dx ( 2 ) 162 CHAPTER 3. LOGISTIC MAP real (8) : : x , y , err integer : : i p r i n t * , ’ Enter x0 , y0 : ’ read * , x , y e r r = 1 . 0 D0 print * , ’ i t e r x y error ’ p r i n t * , ’−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−’ print * , 0 ,x , y , err do i =1 , NMAX b(1) = −(2.0 D0 * x * x−3.0D0 * x * y+y−2.0D0 ) ! −g1 ( x , y ) b (2) = −(3.0 D0 * x + x * y + y − 1 . 0 D0 ) ! −g2 ( x , y ) ! dg1 / dx dg1 / dy A ( 1 , 1 ) = 4.0 D0 * x−3.0D0 * y ; A ( 1 , 2 ) = 1 . 0 D0 −3.0D0 * x ! dg2 / dx dg2 / dy A ( 2 , 1 ) = 3.0 D0+y ; A ( 2 , 2 ) = 1 . 0 D0+x c a l l solve2x2 ( A , B , dx ) x = x + dx ( 1 ) y = y + dx ( 2 ) e r r = 0.5 D0 *SQRT( dx ( 1 ) **2+ dx ( 2 ) * * 2 ) print * , i , x , y , err i f ( e r r . l t . eps ) e x i t enddo end program NewtonRaphson2 ! =========================================================== s u b r o u t i n e solve2x2 ( A , b , dx ) i m p l i c i t none r e a l ( 8 ) : : A ( 2 , 2 ) , b ( 2 ) , dx ( 2 ) r e a l ( 8 ) : : num1 , num2 , det num1 = A ( 2 , 2 ) * b ( 1 )−A ( 1 , 2 ) * b ( 2 ) num2 = A ( 1 , 1 ) * b ( 2 )−A ( 2 , 1 ) * b ( 1 ) det = A ( 1 , 1 ) * A ( 2 , 2 )−A ( 1 , 2 ) * A ( 2 , 1 ) i f ( det . eq . 0.0 D0 ) s t o p ’ s o l v e 2 x 2 : d e t=0 ’ dx ( 1 ) = num1 / det dx ( 2 )= num2 / det end s u b r o u t i n e solve2x2 In order to guess the region where the real roots of the systems lie, we make a 3-dimensional plot using gnuplot: gnuplot > s e t i s o s a m p l e s 20 gnuplot > s e t hidden3d gnuplot > s p l o t 2* x**2 −3*x * y+y −2 ,3* x+y * x+y −1 ,0 We plot the functions gi (x, y) together with the plane x = 0. The in- tersection of the three surfaces determine the roots we are looking for. Compiling and running the program can be done by using the com- mands: 3.5. CALCULATION OF THE BIFURCATION POINTS 163 > g f o r t r a n nr2 . f90 −o n > echo 2.2 1 . 5 | . / n Enter x0 , y0 : iter x y error −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− 0 2.20000000 1.50000000 1.0000 1 0.76427104 0.26899383 0.9456 2 0.73939531 −0.68668275 0.4780 3 0.74744506 −0.71105605 1.2834 E−002 4 0.74735933 −0.71083147 1.2019 E−004 5 0.74735932 −0.71083145 1.2029 E−008 > echo 0 1 | . / n ................. 5 −0.10899022 1.48928857 4.3461 E−012 > echo −5 0 | . / n 6 −6.13836909 −3.77845711 3.2165 E−013 The computation above leads to the roots (0.74735932, −0.71083145), (−0.10899022, 1.48928857), (−6.13836909, −3.77845711). The Newton-Raphson method for many variables becomes hard quite soon: One needs to calculate the functions as well as their derivatives, which is prohibitively expensive for many problems. It is also hard to determine the roots, since the method converges satisfactorily only very close to the roots. We refer the reader to [8] for more information on how one can deal with these problems. 3.5 Calculation of the Bifurcation Points In order to determine the bifurcation points for r < rc we will solve the algebraic equations x = f (k) (x) and f (k)′ (x) = −1. At these points, k-cycles become unstable and 2k-cycles appear and are stable. This hap- pens when r = rc , where k = 2n−2 . We will look for solutions (x∗α , rc ) (n) (n) for α = k + 1, k + 2, . . . , 2k. We define the functions F (x, r) = f (x) = rx(1 − x) and F (k) (x, r) = f (k) (x) as in equation (3.6). We will solve the algebraic equations: g1 (x, r) = x − F (k) (x, r) = 0 ∂F (k) (x, r) g2 (x, r) = + 1 = 0. (3.30) ∂x According to the discussion of the previous section, in order to calculate the roots of these equations we have to solve the linear system (3.28), 164 CHAPTER 3. LOGISTIC MAP where the coefficients are b1 = −g1 (x, r) = −x + F (k) (x, r) ∂F (k) (x, r) b2 = −g2 (x, r) = − −1 ∂x ∂g1 (x, r) ∂F (k) (x, r) A11 = =1− ∂x ∂x (k) ∂g1 (x, r) ∂F (x, r) A12 = =− ∂r ∂r ∂g2 (x, r) ∂ 2 F (k) (x, r) A21 = = ∂x ∂x2 2 (k) ∂g2 (x, r) ∂ F (x, r) A22 = = . (3.31) ∂r ∂x∂r The derivatives will be calculated approximately using finite differences ∂F (k) (x, r) F (k) (x + ϵ, r) − F (k) (x − ϵ, r) ≈ ∂x 2ϵ (k) ∂F (x, r) F (x, r + ϵ) − F (k) (x, r − ϵ) (k) ≈ , (3.32) ∂r 2ϵ and similarly for the second derivatives ∂F (k) (x+ 2ϵ ,r) ∂F (k) (x− 2ϵ ,r) ∂ 2 F (k) (x, r) − ≈ ∂x ∂x ∂x2 2 2ϵ { } 1 F (k) (x + ϵ, r) − F (k) (x, r) F (k) (x, r) − F (k) (x − ϵ, r) = − ϵ ϵ ϵ 1 { (k) } = 2 F (x + ϵ, r) − 2F (k) (x, r) + F (k) (x − ϵ, r) ϵ ∂F (k) (x+ϵx ,r) ∂F (k) (x−ϵx ,r) ∂ 2 F (k) (x, r) − ≈ ∂r ∂r ∂x∂r 2ϵx { (k) 1 F (x + ϵx , r + ϵr ) − F (k) (x + ϵx , r − ϵr ) = 2ϵx 2ϵr } F (x − ϵx , r + ϵr ) − F (k) (x − ϵx , r − ϵr ) (k) − 2ϵr 1 { (k) = F (x + ϵx , r + ϵr ) − F (k) (x + ϵx , r − ϵr ) 4ϵx ϵr } −F (k) (x − ϵx , r + ϵr ) + F (k) (x − ϵx , r − ϵr ) (3.33) We are now ready to write the program for the Newton-Raphson method like in the previous section. The only difference is the approximate cal- culation of the derivatives using the relations above and the calculation 3.5. CALCULATION OF THE BIFURCATION POINTS 165 of the function F (k) (x, r) by a routine that will compose the function f (x) k-times. The program can be found in the file bifurcationPoints.f90: ! =========================================================== ! bifurcationPoints . f ! C a l c u l a t e b i f u r c a t i o n p o i n t s o f t h e d i s c r e t e l o g i s t i c map ! a t p e r i o d k by s o l v i n g t h e c o n d i t i o n ! g1 ( x , r ) = x − F( k , x , r ) = 0 ! g2 ( x , r ) = dF( k , x , r ) / dx+1 = 0 ! determining when t h e Floquet m u l t i p l i e r becomes 1 ! F( k , x , r ) i t e r a t e s F( x , r ) = r * x * ( x−1) k t i m e s ! The e q u a t i o n s a r e s o l v e d by using a Newton−Raphson method ! =========================================================== program bifurcationPoints i m p l i c i t none r e a l ( 8 ) , parameter : : tol =1.0 D−10 i n t e g e r : : k , iter r e a l ( 8 ) : : r0 , x0 r e a l ( 8 ) : : A ( 2 , 2 ) , B ( 2 ) , dX ( 2 ) r e a l ( 8 ) : : error r e a l ( 8 ) : : F , dFdx , dFdr , d2Fdx2 , d2Fdrdx ! −−−− Input : p r i n t * , ’ # Enter k , r0 , x0 : ’ read * , k , r0 , x0 p r i n t * , ’ # Pe ri od k= ’ , k p r i n t * , ’ # r0= ’ , r0 , ’ x0= ’ , x0 ! −−−− I n i t i a l i z e error = 1 . 0 D0 ! i n i t i a l l a r g e value of error > t o l iter = 0 do while ( error . g t . tol ) ! −−−− C a l c u l a t e j a c o b i a n matrix A ( 1 , 1 ) = 1 . 0 D0−dFdx ( k , x0 , r0 ) A ( 1 , 2 ) = −dFdr ( k , x0 , r0 ) A ( 2 , 1 ) = d2Fdx2 ( k , x0 , r0 ) A ( 2 , 2 ) = d2Fdrdx ( k , x0 , r0 ) B(1) = −x0 + F ( k , x0 , r0 ) B (2) = −dFdx ( k , x0 , r0 ) −1.0D0 ! −−−− S o l v e a 2x2 l i n e a r system : c a l l solve2x2 ( A , B , dX ) x0 = x0 + dX ( 1 ) r0 = r0 + dX ( 2 ) error = 0.5 D0 * s q r t ( dX ( 1 ) **2+ dX ( 2 ) * * 2 ) iter = iter+1 p r i n t * , iter , ’ x0= ’ , x0 , ’ r0= ’ , r0 , ’ e r r = ’ , error enddo ! do while ( e r r o r . g t . t o l ) end program bifurcationPoints ! =========================================================== ! Function F( k , x , r ) and i t s d e r i v a t i v e s 166 CHAPTER 3. LOGISTIC MAP real (8) function F(k , x , r) i m p l i c i t none r e a l ( 8 ) : : x , r , x0 integer k , i x0 = x do i =1 , k x0 = r * x0 * ( 1 . 0 D0−x0 ) enddo F = x0 end f u n c t i o n F ! −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− r e a l ( 8 ) f u n c t i o n dFdx ( k , x , r ) i m p l i c i t none r e a l ( 8 ) : : x , r , eps real (8) : : F integer k eps = 1 . 0 D−6*x dFdx = ( F ( k , x+eps , r )−F ( k , x−eps , r ) ) / ( 2 . 0 D0 * eps ) end f u n c t i o n dFdx ! −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− r e a l ( 8 ) f u n c t i o n dFdr ( k , x , r ) i m p l i c i t none r e a l ( 8 ) : : x , r , eps real (8) : : F integer k eps = 1 . 0 D−6*r dFdr = ( F ( k , x , r+eps )−F ( k , x , r−eps ) ) / ( 2 . 0 D0 * eps ) end f u n c t i o n dFdr ! −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− r e a l ( 8 ) f u n c t i o n d2Fdx2 ( k , x , r ) i m p l i c i t none r e a l ( 8 ) : : x , r , eps real (8) : : F integer k eps = 1 . 0 D−6*x d2Fdx2 = ( F ( k , x+eps , r ) −2.0D0 * F ( k , x , r )+F ( k , x−eps , r ) ) / ( eps * eps ) end f u n c t i o n d2Fdx2 ! −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− r e a l ( 8 ) f u n c t i o n d2Fdrdx ( k , x , r ) i m p l i c i t none r e a l ( 8 ) : : x , r , epsx , epsr real (8) : : F integer k 3.5. CALCULATION OF THE BIFURCATION POINTS 167 epsx = 1 . 0 D−6*x epsr = 1 . 0 D−6*r d2Fdrdx = ( F ( k , x+epsx , r+epsr )−F ( k , x+epsx , r−epsr ) & −F ( k , x−epsx , r+epsr )+F ( k , x−epsx , r−epsr ) ) & / ( 4 . 0 D0 * epsx * epsr ) end f u n c t i o n d2Fdrdx ! =========================================================== s u b r o u t i n e solve2x2 ( A , b , dx ) i m p l i c i t none r e a l ( 8 ) : : A ( 2 , 2 ) , b ( 2 ) , dx ( 2 ) r e a l ( 8 ) : : num1 , num2 , det num1 = A ( 2 , 2 ) * b ( 1 ) − A ( 1 , 2 ) * b ( 2 ) num2 = A ( 1 , 1 ) * b ( 2 ) − A ( 2 , 1 ) * b ( 1 ) det = A ( 1 , 1 ) * A ( 2 , 2 )− A ( 1 , 2 ) * A ( 2 , 1 ) i f ( det . eq . 0.0 D0 ) s t o p ’ s o l v e 2 x 2 : d e t = 0 ’ dx ( 1 ) = num1 / det dx ( 2 ) = num2 / det end s u b r o u t i n e solve2x2 Compiling and running the program can be done as follows: > g f o r t r a n bifurcationPoints . f90 −o b > echo 2 3.5 0.5 | . / b # Enter k , r0 , x0 : # Period k= 2 # r0= 3.5000000000000 x0= 0.50000000000 1 x0= 0.4455758353187 r0= 3.38523275827 err= 6.35088E−002 2 x0= 0.4396562547624 r0= 3.45290970406 err= 3.39676E−002 3 x0= 0.4399593001407 r0= 3.44949859951 err= 1.71226 E−003 4 x0= 0.4399601690333 r0= 3.44948974267 err= 4.44967 E−006 5 x0= 0.4399601689937 r0= 3.44948974281 err= 7.22160 E−011 > echo 2 3.5 0.85 | . / b ................. 4 x0= 0.8499377795512 r0= 3.44948974275 err= 1.85082E−011 > echo 4 3.5 0.5 | . / b ................. 5 x0= 0.5235947861540 r0= 3.54409035953 err= 1.86318 E−011 > echo 4 3.5 0.35 | . / b ................. 5 x0= 0.3632903374118 r0= 3.54409035955 err= 5.91653E−013 The above listing shows the points of the 2-cycle and some of the points (3) of the 4-cycle. It is also possible to compare the calculated value rc = (3) √ 3.449490132 with the expected one rc = 1+ 6 ≈ 3.449489742. Improving the accuracy of the calculation is left as an exercise for the reader who has to control the systematic errors of the calculations and achieve better (4) accuracy in the computation of rc . 168 CHAPTER 3. LOGISTIC MAP 3.6 Liapunov Exponents We have seen that when r > rc ≈ 3.56994567, the trajectories of the lo- gistic map become non periodic and exhibit chaotic behavior. Chaotic behavior mostly means sensitivity of the evolution of a dynamical system to the choice of initial conditions. More precisely, it means that two dif- ferent trajectories constructed from infinitesimally close initial conditions, diverge very fast from each other. This implies that there is a set of initial conditions that densely cover subintervals of (0, 1) whose trajectories do not approach arbitrarily close to any cycle of finite length. Assume that two trajectories have x0 , x̃0 as initial points and ∆x0 = x0 − x̃0 . When the points xn , x̃n have a distance ∆xn = x̃n − xn that for small enough n increases exponentially with n (the “time”), i.e. ∆xn ∼ ∆x0 eλn , λ > 0, (3.34) the system is most likely exhibiting chaotic behavior¹¹. The exponent λ is called a Liapunov exponent. A useful equation for the calculation of λ is 1∑ n−1 λ = lim ln |f ′ (xk )| . (3.35) n→∞ n k=0 This relation can be easily proved by considering infinitesimal ϵ ≡ |∆x0 | ¹¹Sensitivity to the initial condition alone does not necessarily imply chaos. It is necessary to have topological mixing and dense periodic orbits. Topological mixing means that every open set in phase space will evolve to a set that for large enough time will have non zero intersection with any open set. Dense periodic orbits means that every point in phase space lies infinitesimally close to a periodic orbit. 3.6. LIAPUNOV EXPONENTS 169 so that λ = lim lim n1 ln |∆xn |/ϵ. Then we obtain n→∞ ϵ→0 x̃1 = f (x̃0 ) = f (x0 + ϵ) ≈ f (x0 ) + ϵf ′ (x0 ) = x1 + ϵf ′ (x0 ) ⇒ ∆x1 x̃1 − x1 = ≈ f ′ (x0 ) ϵ ϵ x̃2 = f (x̃1 ) = f (x1 + ϵf ′ (x0 )) ≈ f (x1 ) + (ϵf ′ (x0 ))f ′ (x1 ) = x2 + ϵf ′ (x0 )f ′ (x1 ) ⇒ ∆x2 x̃2 − x2 = ≈ f ′ (x0 )f ′ (x1 ) ϵ ϵ x̃3 = f (x̃2 ) = f (x2 + ϵf ′ (x0 )f ′ (x1 )) ≈ f (x2 ) + (ϵf ′ (x0 )f ′ (x1 ))f ′ (x2 ) = x3 + ϵf ′ (x0 )f ′ (x1 )f ′ (x2 ) ⇒ ∆x3 x̃3 − x3 = ≈ f ′ (x0 )f ′ (x1 )f ′ (x2 ) . (3.36) ϵ ϵ We can show by induction that |∆xn |/ϵ ≈ f ′ (x0 )f ′ (x1 )f ′ (x2 ) . . . f ′ (xn−1 ) and by taking the logarithm and the limits we can prove (3.35). A first attempt to calculate the Liapunov exponents could be made by using the definition (3.34). We modify the program logistic.f90 so that it calculates two trajectories whose initial distance is ϵ = epsilon: ! =========================================================== ! D i s c r e t e L o g i s t i c Map : ! Two t r a j e c t o r i e s with c l o s e i n i t i a l c o n d i t i o n s . ! =========================================================== program logistic_map i m p l i c i t none i n t e g e r : : NSTEPS , i r e a l ( 8 ) : : r , x0 , x1 , x0t , x1t , e p s i l o n ! −−−−− Input : p r i n t * , ’ # Enter NSTEPS , r , x0 , e p s i l o n : ’ read * , NSTEPS , r , x0 , e p s i l o n p r i n t * , ’ # NSTEPS = ’ , NSTEPS print * , ’# r = ’ ,r p r i n t * , ’ # x0 = ’ , x0 print * , ’# epsilon = ’ , epsilon x0t = x0+ e p s i l o n ! −−−−− I n i t i a l i z e : open ( u n i t =33 , f i l e = ’ l i a . dat ’ ) w r i t e ( 3 3 , * ) 1 , x0 , x0t , ABS( x0t−x0 ) / e p s i l o n 170 CHAPTER 3. LOGISTIC MAP 1e+16 1e+14 1e+12 1e+10 |∆xn|/ε 1e+08 1e+06 10000 ε = 10-15 ε = 10-12 100 ε = 10-10 ε = 10-8 1 ε = 10-6 ε = 10-4 0.01 0 20 40 60 80 100 120 140 160 180 200 n Figure 3.7: A plot of |∆xn |/ϵ for the logistic map for r = 3.6, x0 = 0.2. Note the convergence of the curves as ϵ → 0 and the approximate exponential behavior in this limit. The two lines are fits to the equation (3.34) and give λ = 0.213(4) and λ = 0.217(6) respectively. ! −−−−− C a l c u l a t e : do i =2 , NSTEPS x1 = r * x0 * ( 1 . 0 D0−x0 ) x1t = r * x0t * ( 1 . 0 D0−x0t ) w r i t e ( 3 3 , * ) i , x1 , x1t , ABS( x1t−x1 ) / e p s i l o n x0 = x1 ; x0t = x1t enddo c l o s e (3 3) end program logistic_map After running the program, the quantity |∆xn |/ϵ is found at the fourth column of the file lia.dat. The curves of figure 3.7 can be constructed by using the commands: > gfortran liapunov1 . f90 −o l > gnuplot gnuplot > s e t l o g s c a l e y gnuplot > p l o t \ ”<echo 200 3.6 0.2 1 e−15 | . / l ; c a t l i a . dat ” u 1 : 4 w l 3.6. LIAPUNOV EXPONENTS 171 The last line plots the stdout of the command "echo 200 3.6 0.2 1e-15 |./l;cat lia.dat", i.e. the contents of the file lia.dat produced after running our program using the parameters NSTEPS = 200, r = 3.6, x0 = 0.2 and epsilon = 10−15 . The gnuplot command set logscale y, puts the y axis in a logarithmic scale. Therefore an exponential function is shown as a straight line and this is what we see in figure 3.7: The points |∆xn |/ϵ tend to lie on a straight line as ϵ decreases. The slopes of these lines are equal to the Liapunov exponent λ. Deviations from the straight line behavior indicates corrections and systematic errors, as we point out in figure 3.7. A different initial condition results in a slightly different value of λ, and the true value can be estimated as the average over several such choices. We estimate the error of our computation from the standard error of the mean. The reader should perform such a computation as an exercise. One can perform a fit of the points |∆xn |/ϵ to the exponential function in the following way: Since |∆xn |/ϵ ∼ C exp(λn) ⇒ ln(|∆xn |/ϵ) = λn + c, we can make a fit to a straight line instead. Using gnuplot, the relevant commands are: gnuplot > f i t [ 5 : 5 3 ] a * x+b \ ”<echo 500 3.6 0.2 1 e−15 | . / l ; c a t l i a . dat ”\ using 1 : ( l o g ( $4 ) ) via a , b gnuplot > r e p l o t exp ( a * x+b ) The command shown above fits the data to the function a*x+b by taking the 1st column and the logarithm of the 4th column (using 1:(log($4))) of the stdout of the command that we used for creating the previous plot. We choose data for which 5 ≤ n ≤ 53 ([5:53]) and the fitting parameters are a,b (via a,b). The second line, adds the fitted function to the plot. Now we are going to use equation (3.35) for calculating λ. This equation is approximately correct when (a) we have already reached the steady state and (b) in the large n limit. For this reason we should study if we obtain a satisfactory convergence when we (a) “throw away” a number of NTRANS steps, (b) calculate the sum (3.35) for increasing NSTEPS= n (c) calculate the sum (3.35) for many values of the initial point x0 . This has to be carefully repeated for all values of r since each factor will contribute differently to the quality of the convergence: In regions that manifest chaotic behavior (large λ) convergence will be slower. The program can be found in the file liapunov2.f90: ! =========================================================== 172 CHAPTER 3. LOGISTIC MAP 0.48 0.46 (1/n)Σk=NN+n-1 ln|f’(xk)| 0.44 0.42 0.4 0.38 r=3.8 x0=0.20 r=3.8 x0=0.35 0.36 r=3.8 x0=0.50 r=3.8 x0=0.75 r=3.8 x0=0.90 0.34 0 10000 20000 30000 40000 50000 60000 70000 n ∑N +n−1 Figure 3.8: Plot of the sum (1/n) ln |f ′ (xk )| as a function of n for the logistic k=N map with r = 3.8, N = 2000 for different initial conditions x0 = 0.20, 0.35, 0.50, 0.75, 0.90. The different curves converge in the limit n → ∞ to λ = 0.4325(10). ! D i s c r e t e L o g i s t i c Map : ! Liapunov exponent from sum_i l n | f ’ ( x _ i ) | ! NTRANS: number o f d i s c a r d e d i t e r a t i o n i n order t o d i s c a r d ! t r a n s i e n t behavior ! NSTEPS : number o f terms i n t h e sum ! =========================================================== program logistic_map i m p l i c i t none i n t e g e r : : NTRANS , NSTEPS , i r e a l ( 8 ) : : r , x0 , x1 , sum ! −−−−− Input : p r i n t * , ’ # Enter NTRANS, NSTEPS , r , x0 : ’ read * , NTRANS , NSTEPS , r , x0 p r i n t * , ’ # NTRANS = ’ , NTRANS p r i n t * , ’ # NSTEPS = ’ , NSTEPS print * , ’# r = ’ ,r p r i n t * , ’ # x0 = ’ , x0 do i =1 , NTRANS x1 = r * x0 * ( 1 . 0 D0−x0 ) x0 = x1 3.6. LIAPUNOV EXPONENTS 173 enddo sum = l o g (ABS( r * ( 1 . 0 D0 −2.0D0 * x0 ) ) ) ! −−−−− I n i t i a l i z e : open ( u n i t =33 , f i l e = ’ l i a . dat ’ ) w r i t e ( 3 3 , * ) 1 , x0 , sum ! −−−−− C a l c u l a t e : do i =2 , NSTEPS x1 = r * x0 * ( 1 . 0 D0−x0 ) sum = sum + l o g (ABS( r * ( 1 . 0 D0 −2.0D0 * x1 ) ) ) w r i t e ( 3 3 , * ) i , x1 , sum / i x0 = x1 enddo c l o s e (33) end program logistic_map After NTRANS steps, the program calculates NSTEPS times the sum of the terms ln |f ′ (xk )| = ln |r(1 − 2xk )|. At each step the sum divided by the number of steps i is printed to the file lia.dat. Figure 3.6 shows the results for r = 3.8. This is a point where the system exhibits strong chaotic behavior and convergence is achieved after we compute a large number of steps. Using NTRANS = 2 000 and NSTEPS ≈ 70 000 the achieved accuracy is about 0.2% with λ = 0.4325 ± 0.0010 ≡ 0.4325(10). The main contribution to the error comes from the different paths followed by each initial point chosen. The plot can be constructed with the gnuplot commands: > gfortran liapunov2 . f90 −o l > gnuplot gnuplot > p l o t \ ”<echo 2000 70000 3.8 0.20 |./ l ; cat lia . dat ” u 1:3 w l ,\ ”<echo 2000 70000 3.8 0.35 |./ l ; cat lia . dat ” u 1:3 w l ,\ ”<echo 2000 70000 3.8 0.50 |./ l ; cat lia . dat ” u 1:3 w l ,\ ”<echo 2000 70000 3.8 0.75 |./ l ; cat lia . dat ” u 1:3 w l ,\ ”<echo 2000 70000 3.8 0.90 |./ l ; cat lia . dat ” u 1:3 w l The plot command runs the program using the parameters NTRANS = 2 000, NSTEPS = 70 000, r = 3.8 and x0 = 0.20, 0.35, 0.50, 0.75, 0.90 and plots the results from the contents of the file lia.dat. In order to determine the regions of chaotic behavior we have to study the dependence of the Liapunov exponent λ on the value of r. Using our experience coming from the careful computation of λ before, we will run the program for several values of r using the parameters NTRANS = 2 000, NSTEPS = 60 000 from the initial point x0 = 0.2. This calculation gives accuracy of the order of 1%. If we wish to measure λ carefully and estimate the error of the results, we have to follow the steps described in 174 CHAPTER 3. LOGISTIC MAP figures 3.7 and 3.8. The program can be found in the file liapunov3.f90 and it is a simple modification of the previous program so that it can perform the calculation for many values of r. ! =========================================================== ! D i s c r e t e L o g i s t i c Map : ! Liapunov exponent from sum_i l n | f ’ ( x _ i ) | ! C a l c u l a t i o n f o r r i n [ rmin , rmax ] with RSTEPS s t e p s ! RSTEPS : v a l u e s or r s t u d i e d : r=rmin +(rmax−rmin ) / RSTEPS ! NTRANS: number o f d i s c a r d e d i t e r a t i o n i n order t o d i s c a r d ! t r a n s i e n t behavior ! NSTEPS : number o f terms i n t h e sum ! x s t a r t : v a l u e o f i n i t i a l x0 f o r eve ry r ! =========================================================== program logistic_map i m p l i c i t none r e a l ( 8 ) , parameter : : rmin = 2.5 D0 r e a l ( 8 ) , parameter : : rmax = 4.0 D0 r e a l ( 8 ) , parameter : : xstart = 0.2 D0 i n t e g e r , parameter : : RSTEPS = 1000 i n t e g e r , parameter : : NSTEPS = 60000 i n t e g e r , parameter : : NTRANS = 2000 i n t e g e r : : i , ir r e a l ( 8 ) : : r , x0 , x1 , sum , dr open ( u n i t =33 , f i l e = ’ l i a . dat ’ ) dr = ( rmax−rmin ) / ( RSTEPS −1) do ir =0 , RSTEPS−1 r = rmin+ir * dr x0= xstart do i =1 , NTRANS x1 = r * x0 * ( 1 . 0 D0−x0 ) x0 = x1 enddo sum = l o g (ABS( r * ( 1 . 0 D0 −2.0D0 * x0 ) ) ) ! −−−−− C a l c u l a t e : do i =2 , NSTEPS x1 = r * x0 * ( 1 . 0 D0−x0 ) sum = sum + l o g (ABS( r * ( 1 . 0 D0 −2.0D0 * x1 ) ) ) x0 = x1 enddo w r i t e ( 3 3 , * ) r , sum / NSTEPS enddo ! do i r =0 ,RSTEPS−1 c l o s e (3 3) end program logistic_map The program can be compiled and run using the commands: 3.6. LIAPUNOV EXPONENTS 175 > g f o r t r a n liapunov3 . f90 −o l > ./l & The character & makes the program ./l to run in the background. This is recommended for programs that run for a long time, so that the shell returns the prompt to the user and the program continues to run even after the shell is terminated. 0.6 0.4 0.2 λ 0 -0.2 -0.4 2.6 2.8 3 3.2 3.4 3.6 3.8 4 r Figure 3.9: The Liapunov exponent λ of the logistic map calculated via equation (3.35). Note the chaotic behavior that manifests for the values of r where λ > 0 and the windows of stable k-cycles where λ < 0. Compare this plot with the bifurcation diagram of figure 3.4. At the points where λ = 0 we have onset of chaos (or “edge of chaos”) with manifestation of weak chaos (i.e. |∆xn | ∼ |∆x0 |nω ). At these points we have transitions from stable k-cycles to strong chaos. We observe the onset of chaos for the first time when r = rc ≈ 3.5699, at which point λ = 0 (for smaller r the plot seems to touch the λ = 0 line, but in fact λ takes negative values with |λ| very small). The data are saved in the file lia.dat and we can make the plot shown in figure 3.7 using gnuplot: gnuplot > p l o t ” l i a . dat ” with lines notitle , 0 notitle Now we can compare figure 3.9 with the bifurcation diagram shown in figure 3.4. The intervals with λ < 0 correspond to stable k-cycles. The 176 CHAPTER 3. LOGISTIC MAP intervals where λ > 0 correspond to manifestation of strong chaos. These intervals are separated by points with λ = 0 where the system exhibits weak chaos. This means that neighboring trajectories diverge from each other with a power law |∆xn | ∼ |∆x0 |nω instead of an exponential, where ω = 1/(1 − q) is a positive exponent that needs to be determined. The parameter q is the one usually used in the literature. Strong chaos is obtained in the q → 1 limit. For larger r, switching between chaotic and stable periodic trajectories is observed each time λ changes sign. The critical values of r can be computed with relatively high accuracy by restricting the calculation to a small enough neighborhood of the critical point. You can do this using the program listed above by setting the parameters rmin and rmax. 5 5 4 4 3 3 p(x) p(x) 2 2 1 1 0 0 0 0.2 0.4 0.6 0.8 1 0 0.2 0.4 0.6 0.8 1 x x Figure 3.10: The distribution functions p(x) of x of the logistic map for r = 3.59 (left) and 3.8 (right). The chaotic behavior appears to be weaker for r = 3.59, and this is reflected on the value of the entropy. One sees that there exist intervals of x with p(x) = 0 which become smaller and vanish as r gets close to 4. This distribution is very hard to be distinguished from a truly random distribution. We can also study the chaotic properties of the trajectories of the logistic map by computing the distribution p(x) of the values of x in the interval (0, 1). After the transitional period, the distribution p(x) for the k cycles will have support only at the points of the k cycles, whereas for the chaotic regimes it will have support on subintervals of (0, 1). The distribution function p(x) is independent for most of the initial points of the trajectories. If one obtains a large number of points from many trajectories of the logistic map, it will be practically impossible to understand that these are produced by a deterministic rule. For this reason, chaotic systems can be used for the production of pseudorandom numbers, as we will see in chapter 11. By measuring the entropy, which is a measure of disorder in a system, we can quantify the “randomness” of 3.6. LIAPUNOV EXPONENTS 177 the distribution. As we will see in chapter 12, it is given by the equation ∑ S=− pk ln pk , (3.37) k where pk is the probability of observing the state k. In our case, we can make an approximate calculation of S by dividing the interval (0, 1) to N subintervals of width ∆x. For given r we obtain a large number M of values xn of the logistic map and we compute the histogram hk of their distribution in the intervals (xk , xk + ∆x). The probability density is obtained from the limit of pk = hk /(M ∆x) as M becomes large and ∆x ∑ ∫1 small (large N ). Indeed, N pk ∆x = 1 converges to 0 p(x) dx = 1. We ∑ k=1 will define S = − N k=1 pk ln pk ∆x. 5 4 3 p(x) 2 1 0 0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1 x Figure 3.11: The distribution p(x) of x for the logistic map for r = 4. We observe strong chaotic behavior, p(x) has support over the whole interval (0, 1) and the entropy is large. The solid line is the analytic form of the distribution p(x) = π −1 x−1/2 (1−x)−1/2 which is known for r = 4 [30]. This is the beta distribution for a = 1/2, b = 1/2. The program listed below calculates pk for chosen values of r, and then the entropy S is calculated using (3.37). It is a simple modification of the program in liapunov3.f90 where we add the parameter NHIST counting the number of intervals N for the histograms. The probability density is calculated in the array p(NHIST). The program can be found in the file entropy.f90: 178 CHAPTER 3. LOGISTIC MAP ! =========================================================== ! D i s c r e t e L o g i s t i c Map : ! Entropy c a l c u l a t i o n from S=−sum_i p _ i l n p _ i ! C a l c u l a t i o n f o r r i n [ rmin , rmax ] with RSTEPS s t e p s ! RSTEPS : v a l u e s or r s t u d i e d : r=rmin +(rmax−rmin ) / RSTEPS ! NHIST : number o f histogram b i n s f o r c a l c u l a t i o n o f p _ i ! NSTEPS : number o f v a l u e s o f x i n t h e h i s t o g r a m s ! NTRANS: number o f d i s c a r t e d i t e r a t i o n i n order t o d i s c a r d ! t r a n s i e n t behavior ! x s t a r t : v a l u e o f i n i t i a l x0 f o r eve ry r ! =========================================================== program logistic_map i m p l i c i t none r e a l ( 8 ) , parameter : : rmin = 2.5 D0 r e a l ( 8 ) , parameter : : rmax = 4.0 D0 r e a l ( 8 ) , parameter : : xstart = 0.2 D0 i n t e g e r , parameter : : RSTEPS = 1000 i n t e g e r , parameter : : NHIST = 10000 i n t e g e r , parameter : : NTRANS = 2000 i n t e g e r , parameter : : NSTEPS = 5000000 r e a l ( 8 ) , parameter : : xmin =0.0 D0 , xmax =1.0 D0 i n t e g e r : : i , ir , isum , n r e a l ( 8 ) : : r , x0 , x1 , sum , dr , dx r e a l ( 8 ) : : p ( NHIST ) , S open ( u n i t =33 , f i l e = ’ entropy . dat ’ ) p = 0.0 D0 dr = ( rmax−rmin ) / ( RSTEPS −1) dx = ( xmax−xmin ) / ( NHIST −1) do ir =0 , RSTEPS−1 r = rmin+ir * dr x0= xstart do i =1 , NTRANS x1 = r * x0 * ( 1 . 0 D0−x0 ) x0 = x1 enddo ! make histogram : n=INT ( x0 / dx ) +1; p ( n )=p ( n ) +1.0 D0 do i =2 , NSTEPS x1 = r * x0 * ( 1 . 0 D0−x0 ) n = INT ( x1 / dx ) +1 p ( n )=p ( n ) +1.0 D0 x0 = x1 enddo ! p ( k ) i s now histogram o f x−v a l u e s . ! Normalize so t h a t sum_k p ( k ) * dx=1 ! to get probability d i s t r i b u t i o n : p = p / NSTEPS / dx ! sum a l l non z e r o terms : p ( n ) * l o g ( p ( n ) ) * dx 3.6. LIAPUNOV EXPONENTS 179 S = −SUM( p * l o g ( p ) , MASK=p . g t . 0 . 0 D0 ) * dx write (33 ,*) r , S enddo ! do i r =0 ,RSTEPS−1 c l o s e (33) ! pr i n t the l a s t p r o b a b i l i t y d i s t r i b u t i o n : open ( u n i t =34 , f i l e = ’ e n t r o p y _ h i s t . dat ’ ) do n =1 , NHIST x0 = xmin +(n−1) * dx + 0.5 D0 * dx w r i t e ( 3 4 , * ) r , x0 , p ( n ) enddo c l o s e (34) end program logistic_map 0 -1 -2 -3 -4 S -5 -6 -7 -8 -9 3.5 3.55 3.6 3.65 3.7 3.75 3.8 3.85 3.9 3.95 4 r ∑ Figure 3.12: The entropy S = − k pk ln pk ∆x for the logistic map as a function of r. The vertical line is rc ≈ 3.56994567 which marks the beginning of chaos and the horizontal is the corresponding entropy. The entropy is low for small values of r, where we have the stable 2n cycles, and large in the chaotic regimes. S drops suddenly when we pass√to a (temporary) periodic behavior interval. We clearly observe the 3-cycle for r = 1 + 8 ≈ 3.8284 and the subsequent bifurcations that we observed in the bifurcation diagram (figure 3.4) and the Liapunov exponent diagram (figure 3.9). For the calculation of the distribution functions and the entropy we have to choose the parameters which control the systematic error. The parameter NTRANS should be large enough so that the transitional behav- ior will not contaminate our results. Our measurements must be checked 180 CHAPTER 3. LOGISTIC MAP for being independent of its value. The same should be done for the ini- tial point xstart. The parameter NHIST controls the partitioning of the interval (0, 1) and the width ∆x, so it should be large enough. The pa- rameter NSTEPS is the number of “measurements” for each value of r and it should be large enough in order to reduce the “noise” in pk . It is obvi- ous that NSTEPS should be larger when ∆x becomes smaller. Appropriate choices lead to the plots shown in figures 3.10 and 3.11 for r = 3.59, 3.58 and 4. We see that stronger chaotic behavior means a wider distribution of the values of x. The entropy is shown in figure 3.12. The stable periodic trajectories lead to small entropy, whereas the chaotic ones lead to large entropy. There is a sudden increase in the value of the entropy at the beginning of chaos at r = rc , which increases even further as the chaotic behavior becomes stronger. During the intermissions of the chaotic behavior there are sudden drops in the value of the entropy. It is quite instructive to compare the entropy diagrams with the corresponding bifurcation dia- grams (see figure 3.4) and the Liapunov exponent diagrams (see figure 3.9). The entropy is increasing until r reaches its maximum value 4, but this is not done smoothly. By magnifying the corresponding areas in the plot, we can see an infinite number of sudden drops in the entropy in intervals of r that become more and more narrow. 3.7. PROBLEMS 181 3.7 Problems Several of the programs that you need to write for solving the problems of this chapter can be found in the Problems directory of the accompanying software of this chapter. 3.1 Confirm that the trajectories of the logistic map for r < 1 are falling off exponentially for large enough n. (a) Choose r = 0.5 and plot the trajectories for x0 = 0.1 − 0.9 with step 0.1 for n = 1, . . . , 1000. Put the y axis in a logarithmic scale. From the resulting curves discuss whether you obtain an exponential falloff. (b) Fit the points xn for n > 20 to the function c e−ax and deter- mine the fitting parameters a and c. How do these parameters depend on the initial point x0 ? You can use the following gnuplot commands for your calculation: gnuplot > ! gfortran logistic . f90 −o l gnuplot > a = 0 . 7 ; c = 0 . 4 ; gnuplot > f i t [ 1 0 : ] c * exp(−a * x ) \ ”<echo 1000 0.5 0 . 5 | . / l ; c a t l o g . dat ” via a , c gnuplot > p l o t c * exp(−a * x ) ,\ ”<echo 1000 0.5 0 . 5 | . / l ; c a t l o g . dat ” w l As you can see, we set NSTEPS = 1000, r = 0.5, x0 = 0.5. By setting the limits [10:] to the fit command, the fit includes only the points xn ≥ 10, therefore avoiding the transitional period and the deviation from the exponential falloff for small n. (c) Repeat for r = 0.3 − 0.9 with step 0.1 and for r = 0.99, 0.999. As you will be approaching r = 1, you will need to discard more points from near the origin. You might also need to increase NSTEPS. You should always check graphically whether the fitted exponential function is a good fit to the points xn for large n. Construct a table for the values of a as a function of r. The solutions of the equation (3.3) is e(r−1)x . How is this related to the values that you computed in your table? 3.2 Consider the logistic map for r = 2. Choose NSTEPS=100 and cal- culate the corresponding trajectories for x0=0.2, 0.3, 0.5, 0.7, 182 CHAPTER 3. LOGISTIC MAP 0.9. Plot them on the same graph. Calculate the fixed point x∗2 and compare your result to the known value 1 − 1/r. Repeat for x0= 10−α for α = −1, −2, −5, −10, −20, −25. What do you conclude about the point x∗1 = 0? 3.3 Consider the logistic map for r = 2.9, 2.99, 2.999. Calculate the stable point x∗2 and compare your result to the known value 1 − 1/r. How large should NSTEPS be chosen each time? You may choose x0=0.3. 3.4 Consider the logistic map for r = 3.2. Take x0=0.3, 0.5, 0.9 and NSTEPS=300 and plot the resulting trajectories. Calculate the fixed points x∗3 and x∗4 by using the command tail log.dat. Increase NSTEPS and repeat so that you make sure that the trajectory has converged to the 2-cycle. Compare their values to the ones given by equation (3.18). Make the following plots: gnuplot > p l o t \ ”<echo 300 3.2 0 . 3 | . / l ; awk ’NR%2==0’ l o g . dat ” w l gnuplot > r e p l o t \ ”<echo 300 3.2 0 . 3 | . / l ; awk ’NR%2==1’ l o g . dat ” w l What do you observe? 3.5 Repeat the previous problem for r = 3.4494. How big should NSTEPS be chosen so that you obtain x3∗ and x∗4 with an accuracy of 6 sig- nificant digits? 3.6 Repeat the previous problem for r = 3.5 and 3.55. Choose NSTEPS = 1000, x0 = 0.5. Show that the trajectories approach a 4-cycle and an 8-cycle respectively. Calculate the fixed points x∗5 -x∗8 and x∗9 -x∗16 . 3.7 Plot the functions f (x), f (2) (x), f (4) (x), x for given r on the same graph. Use the commands: gnuplot > s e t samples 1000 gnuplot > f ( x ) = r * x*(1 −x ) gnuplot > r =1; p l o t [ 0 : 1 ] x , f ( x ) , f ( f ( x ) ) , f ( f ( f ( f ( x ) ) ) ) √ The command r=1 sets the value of r. Take r = 2.5, 3, 3.2, 1+ 6, 3.5. Determine the fixed points and the k-cycles from the intersections of the plots with the diagonal y = x. 3.7. PROBLEMS 183 3.8 Construct the cobweb plots of figures 3.2 and 3.4 for r = 2.8, 3.3 and 3.5. Repeat by dropping from the plot an increasing number of initial points, so that in the end only the k-cycles will remain. Do the same for r = 3.55. 3.9 Construct the bifurcation diagrams shown in figure 3.4. 3.10 Construct the bifurcation diagram of the logistic map for 3.840 < r < 3.851 and for 0.458 < x < 0.523. Compute the first four bifurcation points with an accuracy of 5 significant digits by magnifying the appropriate parts of the plots. Take NTRANS=15000. 3.11 Construct the bifurcation diagram of the logistic map for 2.9 < r < (n) 3.57. Compute graphically the bifurcation points rc for n = 2, 3, 4, 5, 6, 7, 8. Make sure that your results are stable against variations of the parameters NTRANS, NSTEPS as well as from the choice of (n) branching point. From the known values of rc for n = 2, 3, and from the dependence of your results on the choices of NTRANS, NSTEPS, estimate the accuracy achieved by this graphical method. (n) (n−1) (n+1) (n) Compute the ratios (rc − rc )/(rc − rc ) and compare your results to equation (3.20). 3.12 Choose the values of ρ in equation (3.24) so that you obtain only one energy level. Compute the resulting value of the energy. When do we have three energy levels? 3.13 Consider the polynomial g(x) = x3 − 2x2 − 11x + 12. Find the roots obtained by the Newton-Raphson method when you choose x0 = 2.35287527, 2.35284172, 2.35283735, 2.352836327, 2.352836323. What do you conclude concerning the basins of attraction of each root of the polynomial? Make a plot of the polynomial in a neighborhood of its roots and try other initial points that will converge to each one of the roots. 3.14 Use the Newton-Raphson method in order to compute the 4-cycle x∗5 , . . . , x∗8 of the logistic map. Use appropriate areas of the bifur- cation diagram so that you can choose the initial points correctly. Check that your result for rc is the same for all x∗α . Tune the (4) parameters chosen in your calculation on order to improve the ac- curacy of your measurements. 3.15 Repeat the previous problem for the 8-cycle x∗9 , . . . , x∗16 and rc . (5) 184 CHAPTER 3. LOGISTIC MAP (n) (n) n rc n rc 2 3.0000000000 10 3.56994317604 3 3.4494897429 11 3.569945137342 4 3.544090360 12 3.5699455573912 5 3.564407266 13 3.569945647353 6 3.5687594195 14 3.5699456666199 7 3.5696916098 15 3.5699456707464 8 3.56989125938 16 3.56994567163008 9 3.56993401837 17 3.5699456718193 rc = 3.56994567 . . . Table 3.1: The values of rc(n) for the logistic map calculated for problem 17. rc(∞) ≡ rc is taken from the bibliography. 3.16 Repeat the previous problem for the 16-cycle x∗17 , . . . , x∗32 and rc . (6) (n) 3.17 Calculate the critical points rc for n = 3, . . . , 17 of the logistic map using the Newton-Raphson method. In order to achieve that, you should determine the bifurcation points graphically in the bifurca- tion diagram first and then choose the initial points in the Newton- Raphson method appropriately. The program in bifurcationPoints.f90 should read the parameters eps, epsx, epsr from the stdin so that they can be tuned for increasing n. If these parameters are too small the convergence will be unstable and if they are too large you will have large systematic errors. Using this method, try to reproduce table 3.1 3.18 Calculate the ratios ∆r(n) /∆r(n+1) of equation (3.20) using the re- sults of table 3.1. Calculate Feigenbaum’s constant and comment on the accuracy achieved by your calculation. 3.19 Estimate Feigenbaum’s constant δ and the critical value rc by as- suming that for large enough n, rc ≈ rc − Cδ −n . This behavior (n) is a result of equation (3.20). Fit the results of table 3.1 to this function and calculate δ and rc . This hypothesis is confirmed in figure 3.13 where we can observe the exponential convergence of (n) rc to rc . Construct the same plot using the parameters of your calculation. Hint: You can use the following gnuplot commands: 3.7. PROBLEMS 185 gnuplot > nmin =2; nmax =17 gnuplot > r ( x )= rc−c * d **( − x ) gnuplot > f i t [ nmin : nmax ] r ( x ) ” r c r i t ” u 1 : 2 via rc , c , d gnuplot > plot ” r c r i t ” , r(x) gnuplot > p r i n t rc , d The file rcrit contains the values of table 3.1. You should vary the parameters nmin, nmax and repeat until you obtain a stable fit. 1 C δ-n 0.01 0.0001 rc(n) - rc 1e-06 1e-08 1e-10 1e-12 2 4 6 8 10 12 14 16 18 n Figure 3.13: Test of the relation rc(n) ≈ rc − Cδ −n discussed in problem 17. The parameters used in the plot are approximately rc = 3.5699457, δ = 4.669196 and C = 12.292. 3.20 Use the Newton-Raphson method to calculate the first three bifur-√ cation points after the appearance of the 3-cycle for r = 1 + 8. Choose one bifurcation point of the 3-cycle, one of the 6-cycle and one of the 12-cycle and magnify the bifurcation diagram in their neighborhood. 3.21 Consider the map describing the evolution of a population xn+1 = p(xn ) = xn er(1−xn ) . (3.38) (a) Plot the functions x, p(x), p(2) (x), p(4) (x) for r = 1.8, 2, 2.6, 2.67, 2.689 for 0 < x < 8. For which values of r do you expect to obtain stable k-cycles? 186 CHAPTER 3. LOGISTIC MAP (b) For the same values of r plot the trajectories with initial points x0 = 0.2, 0.5, 0.7. For each r make a separate plot. (c) Use the Newton-Raphson method in order to determine the (n) points rc for n = 3, 4, 5 as well as the first two bifurcation points of the 3-cycle. (d) Construct the bifurcation diagram for 1.8 < r < 4. Determine the point marking the onset of chaos as well as the point where the 3-cycle starts. Magnify the diagram around a branch that you will choose. (e) Estimate Feigenbaum’s constant δ as in problem 17. Is your result compatible with the expectation of universality for the value of δ? Is the value of rc the same as that of the logistic map? 3.22 Consider the sine map: xn+1 = s(xn ) = r sin(πxn ) . (3.39) (a) Plot the functions x, s(x), s(2) (x), s(4) (x), s(8) (x) for r = 0.65, 0.75, 0.84, 0.86, 0.88. Which values of r are expected to lead to stable k-cycles? (b) For the same values of r, plot the trajectories with initial points x0 = 0.2, 0.5, 0.7. Make one plot for each r. (c) Use the Newton-Raphson method in order to determine the (n) points rc for n = 3, 4, 5 as well as the first two bifurcation points of the 3-cycle. (d) Construct the bifurcation diagram for 0.6 < r < 1. Within which limits do the values of x lie in? Repeat for 0.6 < r < 2. What do you observe? Determine the point marking the onset of chaos as well as the point where the 3-cycle starts. Magnify the diagram around a branch that you will choose. 3.23 Consider the map: xn+1 = 1 − rx2n . (3.40) (a) Construct the bifurcation diagram for 0 < r < 2. Within which limits do the values of x lie in? Determine the point marking the onset of chaos as well as the point where the 3-cycle starts. Magnify the diagram around a branch that you will choose. 3.7. PROBLEMS 187 (b) Use the Newton-Raphson method in order to determine the (n) points rc for n = 3, 4, 5 as well as the first two bifurcation points of the 3-cycle. 3.24 Consider the tent map: { rxn 0 ≤ xn ≤ 12 xn+1 = r min{xn , 1 − xn } = . (3.41) r(1 − xn ) 12 < xn ≤ 1 Construct the bifurcation diagram for 0 < r < 2. Within which lim- its do the values of x lie in? On the same graph, plot the functions r/2, r − r2 /2. Magnify the diagram in the area 1.407 < r < 1.416 and 0.580 < x < 0.588. At which point do the two disconnected intervals within which xn take their values merge into one? Magnify the areas 1.0 < r < 1.1, 0.4998 < x < 0.5004 and 1.00 < r < 1.03, 0.4999998 < x < 0.5000003 and determine the merging points of two disconnected intervals within which xn take their values. 3.25 Consider the Gauss map (or mouse map): xn+1 = e−rxn + q . 2 (3.42) Construct the bifurcation diagram for −1 < q < 1 and r = 4.5, 4.9, 7.5. Make your program to take as the initial point of the new trajectory to be the last one of the previous trajectory and choose x0 = 0 for q = −1. Repeat for x0 = 0.7, 0.5, −0.7. What do you observe? Note that as q is increased, we obtain bifurcations and “anti-bifurcations”. 3.26 Consider the circle map: xn+1 = [xn + r − q sin(2πxn )] mod 1 . (3.43) (Make sure that your program keeps the values of xn so that 0 ≤ xn < 1). Construct the bifurcation diagram for 0 < q < 2 and r = 1/3. 3.27 Use the program in liapunov.f90 in order to compute the distance between two trajectories of the logistic map for r = 3.6 that origi- nally are at a distance ∆x0 = 10−15 . Choose x0 = 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 0.99, 0.999 and calculate the Liapunov exponent by fitting to a straight line appropriately. Compute the mean value and the standard error of the mean. 188 CHAPTER 3. LOGISTIC MAP 3.28 Calculate the Liapunov exponent for r = 3.58, 3.60, 3.65, 3.70, 3.80 for the logistic map. Use both ways mentioned in the text. Choose at least 5 different initial points and calculate the mean and the standard error of the mean of your results. Compare the values of λ that you obtain with each method and comment. (n) 3.29 Compute the critical value rc numerically as the limit lim rc for n→∞ the logistic map with an accuracy of nine significant digits. Use the calculation of the Liapunov exponent λ given by equation (3.35). 3.30 Compute the values of r of the logistic map numerically for which we (a) enter a stable 3-cycle (b) reenter into the chaotic behavior. Do the calculation by computing the Liapunov exponent λ and compare your results with the ones obtained from the bifurcation diagram. 3.31 Calculate the Liapunov exponent using equation (3.35) for the fol- lowing maps: xn+1 = xn er(1−xn ) , 1.8 < r < 4 xn+1 = r sin(πxn ) , 0.6 < r < 1 xn+1 = 1 − rx2n , 0<r<2 xn+1 = e−rxn + q , 2 r = 7.5, −1 < q < 1 [ ] 1 xn+1 = xn + − q sin(2πxn ) mod 1 , 0 < q < 2 ,(3.44) 3 and construct the diagrams similar to the ones in figure 3.9. Com- pare your plots with the respective bifurcation diagrams (you may put both graphs on the same plot). Use two different initial points x0 = 0, 0.2 for the Gauss map (xn+1 = e−rxn + q) and observe the dif- 2 ferences. For the circle map (xn+1 = [xn + 1/3 − q sin(2πxn )] mod 1) study carefully the values 0 < q < 0.15. 3.32 Reproduce the plots in figures 3.10, 3.11 and 3.12. Compute the function p(x) for r = 3.68, 3.80, 3.93 and 3.98. Determine the points where you have stronger chaos by observing p(x) and the corresponding values of the entropy. Compute the entropy for r ∈ (3.95, 4.00) by taking RSTEPS=2000 and estimate the values of r where we enter to and exit from chaos. Compare your results with the computation of the Liapunov exponent. 3.7. PROBLEMS 189 3.33 Consider the Hénon map: xn+1 = yn + 1 − ax2n yn+1 = bxn (3.45) (a) Construct the two bifurcation diagrams for xn and yn for b = 0.3, 1.0 < a < 1.5. Check if the values a = 1.01, 1.4 that we will use below correspond to stable periodic trajectories or chaotic behavior. (b) Write a program in a file attractor.f90 which will take NINIT = NL × NL initial conditions (x0 (i), y0 (i)) i = 1, . . . ,NL on a NL×NL lattice of the square xm ≤ x0 ≤ xM , ym ≤ y0 ≤ yM . Each of the points (x0 (i), y0 (i)) will evolve according to equa- tion (3.45) for n = NSTEPS steps. The program will print the points (xn (i), yn (i)) to the stdout. Choose xm = ym = 0.6, xM = yM = 0.8, NL= 200. (c) Choose a = 1.01, b = 0.3 and plot the points (xn (i), yn (i)) for n = 0, 1, 2, 3, 10, 20, 30, 40, 60, 1000 on the same diagram. (d) Choose a = 1.4, b = 0.3 and plot the points (xn (i), yn (i)) for n = 0, . . . , 7 on the same diagram. (e) Choose a = 1.4, b = 0.3 and plot the points (xn (i), yn (i)) for n = 999 on the same diagram. Observe the Hénon strange attractor and its fractal properties. It is characterized by a Hausdorff¹² dimension dH = 1.261 ± 0.003. Then magnify the regions {(x, y)| −1.290 < x < −1.270, 0.378 < y < 0.384} , {(x, y)| 1.150 < x < −1.130, 0.366 < y < 0.372} , {(x, y)| 0.108 < x < 0.114, 0.238 < y < 0.241} , {(x, y)| 0.300 < x < 0.320, 0.204 < y < 0.213} , {(x, y)| 1.076 < x < 1.084, 0.090 < y < 0.096} , {(x, y)| 1.216 < x < 1.226, 0.032 < y < 0.034} . 3.34 Consider the Duffing map: xn+1 = yn yn+1 = −bxn + ayn − yn3 . (3.46) ¹²D.A. Russel, J.D. Hanson, and E. Ott, “Dimension of strange attractors”, Phys. Rev. Lett. 45 (1980) 1175. See “Hausdorff dimension” in Wikipedia. 190 CHAPTER 3. LOGISTIC MAP (a) Construct the two bifurcation diagrams for xn and yn for b = 0.3, 0 < a < √ 2.78. Choose √ four different initial conditions (x0 , y0 ) = (±1/ 2, ±1/ 2). What do you observe? (b) Use the program attractor.f90 from problem 33 in order to study the attractor of the map for b = 0.3, a = 2.75. 3.35 Consider the Tinkerbell map: xn+1 = x2n − yn2 + axn + byn yn+1 = 2xn yn + cxn + dyn . (3.47) (a) Choose a = 0.9, b = −0.6013, c = 2.0, d = 0.50. Plot a trajectory on the plane by plotting the points (xn , yn ) for n = 0, . . . , 10 000 with (x0 , y0 ) = (−0.72, −0.64). (b) Use the program attractor.f90 from problem 33 in order to study the attractor of the map for the values of the parameters a, b, c, d given above. Choose xm = −0.68, xM = −0.76, ym = −0.60, yM = −0.68, n = 10 000. (c) Repeat the previous question by taking d = 0.27. Chapter 4 Motion of a Particle In this chapter we will study the numerical solution of classical equations of motion of one dimensional mechanical systems, e.g. a point particle moving on the line, the simple pendulum etc. We will make an introduc- tion to the numerical integration of ordinary differential equations with initial conditions and in particular to the Euler and Runge-Kutta meth- ods. We study in detail the examples of the damped harmonic oscillator and of the damped pendulum under the influence of an external peri- odic force. The latter system is nonlinear and exhibits interesting chaotic behavior. 4.1 Numerical Integration of Newton’s Equa- tions Consider the problem of the solution of the dynamical equations of mo- tion of one particle under the influence of a dynamical field given by Newton’s law. The equations can be written in the form d2⃗x = ⃗a(t, ⃗x, ⃗v ) , (4.1) dt2 where F⃗ d⃗x ⃗a(t, ⃗x, ⃗v ) ≡ ⃗v = . (4.2) m dt From the numerical analysis point of view, the problems that we will dis- cuss are initial value problems for ordinary differential equations where the initial conditions ⃗x(t0 ) = ⃗x0 ⃗v (t0 ) = ⃗v0 , (4.3) 191 192 CHAPTER 4. MOTION OF A PARTICLE determine a unique solution ⃗x(t). The equations (4.1) are of second order with respect to time and it is convenient to write them as a system of twice as many first order equations: d⃗x d⃗v = ⃗v = ⃗a(t, ⃗x, ⃗v ) . (4.4) dt dt In particular, we will be interested in the study of the motion of a particle moving on a line (1 dimension), therefore the above equations become dx dv =v = a(t, x, v) 1-dimension dt dt x(t0 ) = x0 v(t0 ) = v0 . (4.5) When the particle moves on the plane (2 dimensions) the equations of motion become dx dvx = vx = ax (t, x, vx , y, vy ) 2-dimensions dt dt dy dvy = vy = ay (t, x, vx , y, vy ) dt dt x(t0 ) = x0 vx (t0 ) = v0x y(t0 ) = y0 vy (t0 ) = v0y , (4.6) 4.2 Prelude: Euler Methods As a first attempt to tackle the problem, we will study a simple pendulum of length l in a homogeneous gravitational field g (figure 4.1). The equations of motion are given by the differential equations d2 θ g 2 = − sin θ dt l dθ = ω, (4.7) dt which can be rewritten as a first order system of differential equations dθ = ω dt dω g = − sin θ , (4.8) dt l The equations above need to be written in a discrete form appropriate for a numerical solution with the aid of a computer. We split the interval 4.2. PRELUDE: EULER METHODS 193 θ l 00 11 00 11 0 1 00 11 0 1 m 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 g Figure 4.1: A simple pendulum of length l in a homogeneous gravitational field g. of time of integration [ti , tf ] to N − 1 equal intervals¹ of width ∆t ≡ h, where h = (tf − ti )/(N − 1). The derivatives are approximated by the relations (xn+1 − xn )/∆t ≈ x′n , so that ωn+1 = ωn + αn ∆t θn+1 = θn + ωn ∆t . (4.9) where α = −(g/l) sin θ is the angular acceleration. This is the so-called Euler method. The error at each step is estimated to be of order (∆t)2 . This is most easily seen by Taylor expanding around the point tn and neglecting all terms starting from the second derivative and beyond². What we are mostly interested in is in the total error of the estimate of the functions we integrate for at time tf ! We expect that errors accumulate in an additive way at each integration step, and since the number of steps is N ∝ 1/∆t the total error should be ∝ (∆t)2 × (1/∆t) = ∆t. This is indeed what happens, and we say that Euler’s method is a first order method. Its range of applicability is limited and we only study it for academic reasons. Euler’s method is asymmetric because it uses information only from the beginning of the integration interval (t, t + ∆t). It can be put in a more balanced form by using the velocity at the end of the interval (t, t + ∆t). This way we obtain the Euler-Cromer method with a slightly ¹We have N discrete time points ti ≡ t1 , . . . , tN −1 , tN ≡ tf ²See appendix 4.7 for retails. 194 CHAPTER 4. MOTION OF A PARTICLE 0.5 50 100 1000 0.4 10000 50000 80000 0.3 100000 θs(t) 0.2 0.1 θ 0 -0.1 -0.2 -0.3 -0.4 0 1 2 3 4 5 6 7 t Figure 4.2: Convergence of Euler’s method for a simple pendulum with period T ≈ 1.987(ω 2 = 10.0) for several values of the time step ∆t which is determined by the number of integration steps Nt= 50−100, 000. The solution is given for θ0 = 0.2, ω0 = 0.0 and we compare it with the known solution for small angles with α(t) ≈ −(g/l) θ. improved behavior, but which is still of first order ωn+1 = ωn + αn ∆t θn+1 = θn + ωn+1 ∆t . (4.10) An improved algorithm is the Euler–Verlet method which is of second order and gives total error³ ∼ (∆t)2 . This is given by the equations θn+1 = 2θn − θn−1 + αn (∆t)2 θn+1 − θn−1 ωn = . (4.11) 2∆t The price that we have to pay is that we have to use a two step relation in order to advance the solution to the next step. This implies that we have to carefully determine the initial conditions of the problem which are given only at one given time ti . We make one Euler time step backwards in order to define the value of θ0 . If the initial conditions are θ1 = θ(ti ), ω1 = ω(ti ), then we define 1 θ0 = θ1 − ω1 ∆t + α1 (∆t)2 . (4.12) 2 ³See appendix 4.7 for details. 4.2. PRELUDE: EULER METHODS 195 0.025 50 100 0.02 1000 10000 50000 0.015 80000 100000 θs(t) 0.01 0.005 0 θ -0.005 -0.01 -0.015 -0.02 -0.025 0 1 2 3 4 5 6 7 t Figure 4.3: Convergence of the Euler-Cromer method, similarly to figure 4.2. We observe a faster convergence compared to Euler’s method. It is important that at this step the error introduced is not larger than O(∆t2 ), otherwise it will spoil and eventually dominate the O(∆t2 ) total error of the method introduced by the intermediate steps. At the last step we also have to take θN − θN −1 ωN = . (4.13) ∆t Even though the method has smaller total error than the Euler method, it becomes unstable for small enough ∆t due to roundoff errors. In particular, the second equation in (4.11) gives the angular velocity as the ratio of two small numbers. The problem is that the numerator is the result of the subtraction of two almost equal numbers. For small enough ∆t, this difference has to be computed from the last digits of the finite representation of the numbers θn+1 and θn in the computer memory. The accuracy in the determination of (θn+1 − θn ) decreases until it eventually becomes exactly zero. For the first equation of (4.11), the term αn ∆t2 is smaller by a factor ∆t compared to the term αn ∆t in Euler’s method. At some point, by decreasing ∆t, we obtain αn ∆t2 ≪ 2θn − θn−1 and the accuracy of the method vanishes due to the finite representation of real number in the memory of the computer. When the numbers αn ∆t2 and 2θn −θn−1 differ from each other by more that approximately seven orders of magnitude, adding the first one to the second is equivalent to adding 196 CHAPTER 4. MOTION OF A PARTICLE 0.025 50 100 0.02 1000 10000 50000 0.015 80000 100000 θs(t) 0.01 0.005 0 θ -0.005 -0.01 -0.015 -0.02 -0.025 0 1 2 3 4 5 6 7 t Figure 4.4: Convergence of the Euler-Verlet method, similarly to figure 4.2. We observe a faster convergence than Euler’s method, but the roundoff errors make the results useless for Nt≳ 50, 000 (note what happens when Nt= 100, 000. Why?). zero and the contribution of the acceleration vanishes⁴. Writing programs that implement the methods discussed so far is quite simple. We will write a program that compares the results from all three methods Euler, Euler–Cromer and Euler–Verlet. The main program is mainly a user interface, and the computation is carried out by three subroutines euler, euler_cromer and euler_verlet. The user must provide the function accel(x) which gives the angular acceleration as a function of x. The variable x in our problem corresponds to the angle theta. For starters we take accel(x)= -10.0 * sin(x), the acceleration of the simple pendulum. The data structure is very simple: Three real arrays REAL T(P), X(P) and V(P) store the times tn , the angles θn and the angular velocities ωn for n = 1, . . . , Nt. The user determines the time interval for the integration from ti = 0 to tf = Tfi and the number of discrete times Nt. The latter should be less than P, the size of the arrays. She also provides the initial conditions θ0 = Xin and ω0 = Vin. After this, we call the main integration ⁴Numbers of type real have approximately seven significant digits. The accuracy of the operations described above is determined by the number ϵ, which is the smallest positive number such that 1 + ϵ > 1. For a variable x of some type, this number is given by a call to the Fortran intrinsic function epsilon(x). For variables of type real, ϵ ≈ 1.2 × 10−7 and for variables of type real(8) ϵ ≈ 2.2 × 10−16 . 4.2. PRELUDE: EULER METHODS 197 8 50 100 6 1000 10000 15000 4 18000 20000 100000 2 0 -2 v -4 -6 -8 -10 -12 0 1 2 3 4 5 6 7 t Figure 4.5: Convergence of Euler’s method for the simple pendulum like in figure 4.2 for θ0 = 3.0, ω0 = 0.0. The behavior of the angular velocity is shown and we notice unstable behavior for Nt≲ 1, 000. routines which take as input the initial conditions, the time interval of the integration and the number of discrete times Xin,Vin,Tfi,Nt. The output of the routines is the arrays T,X,V which store the results for the time, position and velocity respectively. The results are printed to the files euler.dat, euler_cromer.dat and euler_verlet.dat. After setting the initial conditions and computing the time step ∆t ≡ h = Tfi/(Nt − 1), the integration in each of the subroutines is performed in do loops which advance the solution for time ∆t. The results are stored at each step in the arrays T,X,V. For example, the central part of the program for Euler’s method is: T ( 1 ) = 0.0 X ( 1 ) = Xin V ( 1 ) = Vin h = Tfi / ( Nt −1) do i = 2 , Nt T ( i ) = T ( i−1)+h X ( i ) = X ( i−1)+V ( i−1) * h V ( i ) = V ( i−1)+accel ( X ( i−1) ) * h enddo Some care has to be taken in the case of the Euler–Verlet method where one has to initialize the first two steps, as well as take special care for the 198 CHAPTER 4. MOTION OF A PARTICLE 8 50 100 1000 6 10000 15000 18000 20000 4 100000 2 0 v -2 -4 -6 -8 0 1 2 3 4 5 6 7 t Figure 4.6: Convergence of Euler-Cromer’s method, like in figure 4.5. We observe a faster convergence than for Euler’s method. last step for the velocity: T(1) = 0.0 X(1) = Xin V(1) = Vin X0 = X(1) − V ( 1 ) * h + accel ( X ( 1 ) ) *h*h/2.0 T (2) = h X (2) = 2.0* X (1) − X0 + accel ( X ( 1 ) ) *h*h do i = 3 , Nt .............. enddo V ( Nt )= ( X ( Nt )−X ( Nt −1) ) / h The full program can be found in the file euler.f90 and is listed below: ! ========================================================= ! Program t o i n t e g r a t e e q u a t i o n s o f motion f o r a c c e l e r a t i o n s ! which a r e f u n c t i o n s o f x with t h e method o f Euler , ! Euler−Cromer and Euler−V e r l e t . ! The u s e r s e t s i n i t i a l c o n d i t i o n s and t h e s u b r o u t i n e s r e t u r n !X( t ) and V( t )=dX( t ) / dt i n a r r a y s T ( 1 . . Nt ) ,X ( 1 . . Nt ) ,V ( 1 . . Nt ) ! The u s e r p r o v i d e s number o f t i m e s Nt and t h e f i n a l ! time T f i . I n i t i a l time i s assumed t o be t _ i =0 and t h e ! i n t e g r a t i o n s t e p h = T f i / ( Nt −1) ! The u s e r programs a r e a l f u n c t i o n a c c e l ( x ) which g i v e s t h e 4.2. PRELUDE: EULER METHODS 199 8 50 100 1000 6 10000 15000 18000 20000 4 100000 2 0 v -2 -4 -6 -8 0 1 2 3 4 5 6 7 t Figure 4.7: Convergence of the Euler-Verlet method, similarly to figure 4.5. We observe a faster convergence compared to Euler’s method but that the roundoff errors make the results unstable for Nt≳ 18, 000. ! a c c e l e r a t i o n dV( t ) / dt as f u n c t i o n o f X. !NOTE: T ( 1 ) = 0 T( Nt ) = T f i ! ========================================================= program diff_eq_euler i m p l i c i t none i n t e g e r , parameter : : P=110000 ! The s i z e o f t h e a r r a y s r e a l , dimension ( P ) : : T , X , V ! time t , x ( t ) , v ( t )=dx / dt real : : Xin , Vin , Tfi ! i n i t i a l conditions integer : : Nt , i ! The u s e r p r o v i d e s i n i t i a l c o n d i t i o n s X_0 , V_0 f i n a l time t _ f ! and Nt : p r i n t * , ’ Enter X_0 , V_0 , t _ f , Nt ( t _ i =0) : ’ read ( 5 , * ) Xin , Vin , Tfi , Nt ! This check i s n e c e s s a r y i n order t o avoid memory ! access violations : i f ( Nt . ge . P ) then p r i n t * , ’ Nt must be s t r i c t l y l e s s than P . Nt , P= ’ , Nt , P stop endif ! Xin= X( 1 ) , Vin=V( 1 ) , T ( 1 ) =0 and t h e r o u t i n e g i v e s e v o l u t i o n i n ! T ( 2 . . Nt ) , X ( 2 . . Nt ) , V ( 2 . . Nt ) which we p r i n t i n a f i l e c a l l euler ( Xin , Vin , Tfi , Nt , T , X , V ) open ( u n i t =20 , f i l e =” e u l e r . dat ” ) do i =1 , Nt ! Each l i n e i n data f i l e has time , p o s i t i o n , v e l o c i t y : 200 CHAPTER 4. MOTION OF A PARTICLE write (20 ,*) T(i) , X(i) , V(i) enddo c l o s e (2 0) ! we c l o s e t h e u n i t t o be reused below !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− !We r e p e a t e v e r y t h i n g f o r each method c a l l euler_cromer ( Xin , Vin , Tfi , Nt , T , X , V ) open ( u n i t =20 , f i l e =” e u l e r _ c r o m e r . dat ” ) do i =1 , Nt write (20 ,*) T(i) , X(i) , V(i) enddo c l o s e (2 0) !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− c a l l euler_verlet ( Xin , Vin , Tfi , Nt , T , X , V ) open ( u n i t =20 , f i l e =” e u l e r _ v e r l e t . dat ” ) do i =1 , Nt write (20 ,*) T(i) , X(i) , V(i) enddo c l o s e (2 0) !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− end program diff_eq_euler ! ========================================================= ! Function which r e t u r n s t h e v a l u e o f a c c e l e r a t i o n a t ! p o s i t i o n x used i n t h e i n t e g r a t i o n s u b r o u t i n e s ! e u l e r , e u l e r _ c r o m e r and e u l e r _ v e r l e t ! ========================================================= r e a l f u n c t i o n accel ( x ) i m p l i c i t none real x accel = −10.0* s i n ( x ) end f u n c t i o n accel ! ========================================================= ! D r i v e r r o u t i n e f o r i n t e g r a t i n g e q u a t i o n s o f motion ! using t h e Euler method ! Input : ! Xin=X( 1 ) , Vin=V( 1 ) −− i n i t i a l c o n d i t i o n a t t =0 , ! T f i t h e f i n a l time and Nt t h e number o f t i m e s ! Output : ! The a r r a y s T ( 1 . . Nt ) , X ( 1 . . Nt ) , V ( 1 . . Nt ) which ! g i v e s x ( t _ k )=X( k ) , dx / dt ( t _ k )=V( k ) , t _ k=T( k ) k = 1 . . Nt ! where f o r k=1 we have t h e i n i t i a l c o n d i t i o n . ! ========================================================= s u b r o u t i n e euler ( Xin , Vin , Tfi , Nt , T , X , V ) i m p l i c i t none i n t e g e r : : Nt r e a l , dimension ( Nt ) : : T , X , V ! time t , x ( t ) , v ( t )=dx / dt real : : Xin , Vin , Tfi integer : : i real : : h , accel ! ** declare the function a c c e l ** ! I n i t i a l c o n d i t i o n s s e t here : 4.2. PRELUDE: EULER METHODS 201 T ( 1 ) = 0.0 X ( 1 ) = Xin V ( 1 ) = Vin ! h i s t h e time s t e p Dt h = Tfi / ( Nt −1) do i = 2 , Nt T ( i ) = T ( i−1)+h ! time advances by Dt=h X ( i ) = X ( i−1)+V ( i−1) * h ! advancement o f p o s i t i o n V ( i ) = V ( i−1)+accel ( X ( i−1) ) * h ! and v e l o c i t y . enddo end s u b r o u t i n e euler ! ========================================================= ! D r i v e r r o u t i n e f o r i n t e g r a t i n g e q u a t i o n s o f motion ! using t h e Euler−Cromer method ! Input : ! Xin=X( 1 ) , Vin=V( 1 ) −− i n i t i a l c o n d i t i o n a t t =0 , ! T f i t h e f i n a l time and Nt t h e number o f t i m e s ! Output : ! The a r r a y s T ( 1 . . Nt ) , X ( 1 . . Nt ) , V ( 1 . . Nt ) which ! g i v e s x ( t _ i )=X( i ) , dx / dt ( t _ i )=V( i ) , t _ i =T( i ) i = 1 . . Nt ! where f o r i =1 we have t h e i n i t i a l c o n d i t i o n . ! ========================================================= s u b r o u t i n e euler_cromer ( Xin , Vin , Tfi , Nt , T , X , V ) i m p l i c i t none i n t e g e r : : Nt r e a l , dimension ( Nt ) : : T , X , V ! time t , x ( t ) , v ( t )=dx / dt real : : Xin , Vin , Tfi integer : : i real : : h , accel T ( 1 ) = 0.0 X ( 1 ) = Xin V ( 1 ) = Vin h = Tfi / ( Nt −1) do i = 2 , Nt T ( i ) = T ( i−1)+h V ( i ) = V ( i−1)+accel ( X ( i−1) ) * h ! here i s t h e d i f f e r e n c e compared t o Euler X ( i ) = X ( i−1)+V ( i ) * h enddo end s u b r o u t i n e euler_cromer ! ========================================================= ! D r i v e r r o u t i n e f o r i n t e g r a t i n g e q u a t i o n s o f motion ! using t h e Euler − V e r l e t method ! Input : ! Xin=X( 1 ) , Vin=V( 1 ) −− i n i t i a l c o n d i t i o n a t t =0 , ! T f i t h e f i n a l time and Nt t h e number o f t i m e s 202 CHAPTER 4. MOTION OF A PARTICLE ! Output : ! The a r r a y s T ( 1 . . Nt ) , X ( 1 . . Nt ) , V ( 1 . . Nt ) which ! g i v e s x ( t _ i )=X( i ) , dx / dt ( t _ i )=V( i ) , t _ i =T( i ) i = 1 . . Nt ! where f o r i =1 we have t h e i n i t i a l c o n d i t i o n . ! ========================================================= s u b r o u t i n e euler_verlet ( Xin , Vin , Tfi , Nt , T , X , V ) i m p l i c i t none i n t e g e r : : Nt r e a l , dimension ( Nt ) : : T , X , V ! time t , x ( t ) , v ( t )=dx / dt real : : Xin , Vin , Tfi integer : : i real : : h , h2 , X0 , o2h real : : accel ! I n i t i a l c o n d i t i o n s s e t here : T(1) = 0.0 X(1) = Xin V(1) = Vin h = Tfi / ( Nt −1) ! time s t e p h2 = h*h ! time s t e p squared o2h = 0.5/h ! h/2 !We have t o i n i t i a l i z e one more s t e p : X0 c o r r e s po n d s t o ’X( 0 ) ’ X0 = X(1) − V ( 1 ) * h + accel ( X ( 1 ) ) * h2 / 2 . 0 T (2) = h X (2) = 2.0* X (1) − X0 + accel ( X ( 1 ) ) * h2 !Now i s t a r t s from 3 : do i = 3 , Nt T(i) = T ( i−1)+h X(i) = 2 . 0 * X ( i−1) − X ( i−2) + accel ( X ( i−1) ) * h2 V ( i−1) = o2h * ( X ( i )−X ( i−2) ) enddo ! N o t i c e t h a t we have one more s t e p f o r t h e v e l o c i t y : V ( Nt )= ( X ( Nt )−X ( Nt −1) ) / h end s u b r o u t i n e euler_verlet Compiling the running the program can be done with the commands: > g f o r t r a n euler . f90 −o euler > . / euler Enter X_0 , V_0 , t_f , Nt ( t_i =0) : 0.2 0.0 6.0 1000 > l s euler * . dat euler_cromer . dat euler . dat euler_verlet . dat > head −n 5 euler . dat 0.000000 0.2000000 0.000000 6.0060062E−03 0.2000000 −1.1932093E−02 1.2012012 E−02 0.1999283 −2.3864185E−02 1.8018018 E−02 0.1997850 −3.5792060E−02 2.4024025E−02 0.1995700 −4.7711499E−02 4.2. PRELUDE: EULER METHODS 203 The last command shows the first 5 lines of the file euler.dat. We see the data for the time, the position and the velocity stored in 3 columns. We can graph the results using gnuplot: gnuplot > p l o t ” e u l e r . dat ” using 1 : 2 with lines gnuplot > p l o t ” e u l e r . dat ” using 1 : 3 with lines These commands result in plotting the positions and the velocities as a function of time respectively. We can add the results of all methods to the last plot with the commands: gnuplot > r e p l o t ” e u l e r _ c r o m e r . dat ” using 1 : 3 with lines gnuplot > r e p l o t ” e u l e r _ v e r l e t . dat ” using 1 : 3 with lines The results can be seen in figures 4.2–4.7. Euler’s method is unsta- ble unless we take a quite small time step. The Euler–Cromer method behaves impressively better. The results converge and remain constant for Nt∼ 100, 000. The Euler–Verlet method converges much faster, but roundoff errors kick in soon. This is more obvious in figure 4.7 where the initial angular position is large. For small angles we can compare with the solution one obtains for the harmonic pendulum (sin(θ) ≈ θ): g α(θ) = − θ ≡ −Ω2 θ l θ(t) = θ0 cos(Ωt) + (ω0 /Ω) sin(Ωt) ω(t) = ω0 cos(Ωt) − (θ0 Ω) sin(Ωt) . (4.14) In figures 4.2–4.4 we observe that the results agree with the above for- mulas for the values of ∆t where the methods converge. This way we can check our program for bugs. The plot of the functions above can be done with the following gnuplot commands⁵: gnuplot > s e t dummy t gnuplot > omega2 = 10 gnuplot > X0 = 0.2 gnuplot > V0 = 0.0 gnuplot > omega = s q r t ( omega2 ) gnuplot > x(t) = X0 * c o s ( omega * t ) +( V0 / omega ) * s i n ( omega * t ) gnuplot > v(t) = V0 * c o s ( omega * t ) −(omega * X0 ) * s i n ( omega * t ) gnuplot > plot x(t) , v(t) ⁵The command set dummy t sets the independent variable for functions to be t instead of x which is the default. 204 CHAPTER 4. MOTION OF A PARTICLE The results should not be compared only graphically since subtle differ- ences can remain unnoticed. It is more desirable to plot the differences of the theoretical values from the numerically computed ones which can be done using the commands: gnuplot > p l o t ” e u l e r . dat ” using 1 : ( $2−x ( $1 ) ) with lines gnuplot > p l o t ” e u l e r . dat ” using 1 : ( $3−v ( $1 ) ) with lines The command using 1:($2-x($1)) puts the values found in the first column on the x axis and the value found in the second column minus the value of the function x(t) for t equal to the value found in the first column on the y axis. This way, we can make the plots shown in⁶ figures 4.11-4.14. 4.3 Runge–Kutta Methods Euler’s method is a one step finite difference method of first order. First order means that the total error introduced by the discretization of the integration interval [ti , tf ] by N discrete times is of order ∼ O(h), where h ≡ ∆t = (tf − ti )/N is the time step of the integration. In this section we will discuss a generalization of this approach where the total error will be of higher order in h. This is the class of Runge-Kutta methods which are one step algorithms where the total discretization error is of order ∼ O(hp ). The local error introduced at each step is of order ∼ O(hp+1 ) leading after N = (tf − ti )/∆t steps to a maximum error of order tf − ti 1 ∼ O(hp+1 ) × N = O(hp+1 ) × ∼ O(hp+1 ) × = O(hp ) . (4.15) ∆t h In such a case we say that we have a Runge-Kutta method of pth order. The price one has to pay for the increased accuracy is the evaluation of the derivatives of the functions in more than one points in the interval (t, t + ∆t). Let’s consider for simplicity the problem with only one unknown function x(t) which evolves in time according to the differential equation: dx = f (t, x) . (4.16) dt Consider the first order method first. The most naive approach would ⁶A small modification is necessary in order to plot the absolute value of the differences. 4.3. RUNGE–KUTTA METHODS 205 x 2 01 11 00 1 00 11 tn t n+1 t n+2 t h Figure 4.8: The geometry of the step of the Runge-Kutta method of 1st order given by equation (4.17). be to take the derivative to be given by the finite difference dx xn+1 − xn ≈ = f (tn , xn ) ⇒ xn+1 = xn + hf (tn , xn ) . (4.17) dt ∆t By Taylor expanding, we see that the error at each step is O(h2 ), therefore the error after integrating from ti → tf is O(h). Indeed, dx xn+1 = x(tn + h) = xn + h (xn ) + O(h2 ) = xn + hf (tn , xn ) + O(h2 ) . (4.18) dt The geometry of the step is shown in figure 4.8. We start from point 1 and by linearly extrapolating in the direction of the derivative k1 ≡ f (tn , xn ) we determine the point xn+1 . We can improve the method above by introducing an intermediate point 2. This process is depicted in figure 4.9. We take the point 2 in the middle of the interval (tn , tn+1 ) by making a linear extrapolation from xn in the direction of the derivative k1 ≡ f (tn , xn ). Then we use the slope at point 2 as an estimator of the derivative within this interval, i.e. k2 ≡ f (tn+1/2 , xn+1/2 ) = f (tn + h/2, xn + (h/2)k1 ). We use k2 to linearly 206 CHAPTER 4. MOTION OF A PARTICLE x 3 2 k2 01 11 00 1 00k 11 1 tn t n+1/2 t n+1 t h/2 h/2 Figure 4.9: The geometry of an integration step of the 2nd order Runge-Kutta method given by equation (4.19). extrapolate from xn to xn+1 . Summarizing, we have that k1 = f (tn , xn ) h h k2 ≡ f (tn + , xn + k1 ) 2 2 xn+1 = xn + hk2 . (4.19) For the procedure described above we have to evaluate f twice at each step, thereby doubling the computational effort. The error at each step (4.19) becomes ∼ O(h3 ), however, giving a total error of ∼ O(h2 ) ∼ O(1/N 2 ). So for given computational time, (4.19) is superior to (4.17). We can further improve the accuracy gain by using the Runge–Kutta method of 4th order. In this case we have 4 evaluations of the derivative f per step, but the total error becomes now ∼ O(h4 ) and the method is su- perior to that of (4.19)⁷. The process followed is explained geometrically in figure 4.10. We use 3 intermediate points for evolving the solution from xn to xn+1 . Point 2 is determined by linearly extrapolating from xn ⁷Not always though! Higher order does not necessarily mean higher accuracy, al- though this is true in the simple cases considered here. 4.3. RUNGE–KUTTA METHODS 207 x 2 k2 01 k4 11 00 1 4 00k 11 1 3 k3 tn t n+1/2 t n+1 t h/2 h/2 Figure 4.10: The geometry of an integration step of the Runge-Kutta method of 4th order given by equation (4.20). to the midpoint of the interval (tn , tn+1 = tn + h) by using the direction given by the derivative k1 ≡ f (tn , xn ), i.e. x2 = xn + (h/2)k1 . We calculate the derivative k2 ≡ f (tn + h/2, xn + (h/2)k1 ) at the point 2 and we use it in order to determine point 3, also located at the midpoint of the interval (tn , tn+1 ). Then we calculate the derivative k3 ≡ f (tn + h/2, xn + (h/2)k2 ) at the point 3 and we use it to linearly extrapolate to the end of the in- terval (tn , tn+1 ), thereby obtaining point 4, i.e. x4 = xn + hk3 . Then we calculate the derivative k4 ≡ f (tn + h, xn + hk3 ) at the point 4, and we use all four derivative k1 , k2 , k3 and k4 as estimators of the derivative of the function in the interval (tn , tn+1 ). If each derivative contributes with a particular weight in this estimate, the discretization error can become 208 CHAPTER 4. MOTION OF A PARTICLE ∼ O(h5 ). Such a choice is k1 = f (tn , xn ) h h k2 = f (tn + , xn + k1 ) 2 2 h h k3 = f (tn + , xn + k2 ) 2 2 k4 = f (tn + h, xn + h k3 ) h xn+1 = xn + (k1 + 2k2 + 2k3 + k4 ) . (4.20) 6 We note that the second term of the last equation takes an average of the four derivatives with weights 1/6, 1/3, 1/3 and 1/6 respectively. A generic small change in these values will increase the discretization error to worse than h5 . We remind to the reader the fact that by decreasing h the discretization errors decrease, but that roundoff errors will start showing up for small enough h. Therefore, a careful determination of h that minimizes the total error should be made by studying the dependence of the results as a function of h. 4.3.1 A Program for the 4th Order Runge–Kutta Consider the problem of the motion of a particle in one dimension. For this, we have to integrate a system of two differential equations (4.5) for two unknown functions of time x1 (t) ≡ x(t) and x2 (t) ≡ v(t) so that dx1 dx2 = f1 (t, x1 , x2 ) = f2 (t, x1 , x2 ) (4.21) dt dt 4.3. RUNGE–KUTTA METHODS 209 In this case, equations (4.20) generalize to: k11 = f1 (tn , x1,n , x2,n ) k21 = f2 (tn , x1,n , x2,n ) h h h k12 = f1 (tn + , x1,n + k11 , x2,n + k21 ) 2 2 2 h h h k22 = f2 (tn + , x1,n + k11 , x2,n + k21 ) 2 2 2 h h h k13 = f1 (tn + , x1,n + k12 , x2,n + k22 ) 2 2 2 h h h k23 = f2 (tn + , x1,n + k12 , x2,n + k22 ) 2 2 2 k14 = f1 (tn + h, x1,n + h k13 , x2,n + h k23 ) k24 = f2 (tn + h, x1,n + h k13 , x1,n + h k23 ) h x1,n+1 = x1,n + (k11 + 2k12 + 2k13 + k14 ) 6 h x2,n+1 = x1,n + (k21 + 2k22 + 2k23 + k24 ) . (4.22) 6 Programming this algorithm is quite simple. The main program is an interface between the user and the driver routine of the integration. The user enters the initial and final times ti = Ti and tf = Tf and the number of discrete time points Nt. The initial conditions are x1 (ti ) = X10, x2 (ti ) = X20. The main data structure consists of three real arrays T(P), X1(P), X2(P) which store the times ti ≡ t1 , t2 , . . . , tNt ≡ tf and the corresponding values of the functions x1 (tk ) and x2 (tk ), k = 1, . . . , Nt. The main program calls the driver routine RK(T,X1,X2,Ti,Tf,X10,X20,Nt) which “drives” the heart of the program, the subroutine RKSTEP(t,x1,x2,dt) which per- forms one integration step using equations (4.22). RKSTEP evolves the functions x1, x2 at time t by one step h = dt. The routine RK stores the calculated values in the arrays T, X1 and X2 at each step. When RK returns the control to the main program, all the results are stored in T, X1 and X2, which are subsequently printed in the file rk.dat. The full program is listed below and can be found in the file rk.f90: ! ======================================================== ! Program t o s o l v e a 2 ODE system using Runge−Kutta Method ! User must supply d e r i v a t i v e s ! dx1 / dt= f 1 ( t , x1 , x2 ) dx2 / dt=f 2 ( t , x1 , x2 ) ! as r e a l f u n c t i o n s ! Output i s w r i t t e n i n f i l e rk . dat ! ======================================================== 210 CHAPTER 4. MOTION OF A PARTICLE program rk_solve i m p l i c i t none i n t e g e r , parameter : : P=110000 r e a l , dimension ( P ) : : T , X1 , X2 real : : Ti , Tf , X10 , X20 i n t e g e r : : Nt integer : : i ! Input : p r i n t * , ’ Runge−Kutta Method f o r 2−ODEs I n t e g r a t i o n ’ p r i n t * , ’ Enter Nt , Ti , TF , X10 , X20 : ’ read * , Nt , Ti , Tf , X10 , X20 p r i n t * , ’ Nt = ’ , Nt p r i n t * , ’ Time : I n i t i a l Ti = ’ , Ti , ’ F i n a l Tf= ’ , Tf print * , ’ X1( Ti )= ’ , X10 , ’ X2( Ti )= ’ , X20 i f ( Nt . g t . P ) s t o p ’ Nt>P ’ ! The C a l c u l a t i o n : c a l l RK ( T , X1 , X2 , Ti , Tf , X10 , X20 , Nt ) ! Output : open ( u n i t =11 , f i l e = ’ rk . dat ’ ) do i =1 , Nt w r i t e ( 1 1 , * ) T ( i ) , X1 ( i ) , X2 ( i ) enddo close (11) end program rk_solve ! ======================================================== ! The f u n c t i o n s f1 , f 2 ( t , x1 , x2 ) provided by t h e u s e r ! ======================================================== r e a l f u n c t i o n f1 ( t , x1 , x2 ) i m p l i c i t none r e a l : : t , x1 , x2 f1=x2 ! dx1 / dt= v = x2 end f u n c t i o n f1 !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− r e a l f u n c t i o n f2 ( t , x1 , x2 ) i m p l i c i t none r e a l : : t , x1 , x2 f2=−10.0D0 * x1 ! harmonic o s c i l l a t o r end f u n c t i o n f2 ! ======================================================== !RK(T , X1 , X2 , Ti , Tf , X10 , X20 , Nt ) i s t h e d r i v e r ! f o r t h e Runge−Kutta i n t e g r a t i o n r o u t i n e RKSTEP ! Input : I n i t i a l and f i n a l t i m e s Ti , Tf ! I n i t i a l v a l u e s a t t =Ti X10 , X20 ! Number o f s t e p s o f i n t e g r a t i o n : Nt−1 ! S i z e o f a r r a y s T , X1 , X2 ! Output : r e a l a r r a y s T( Nt ) , X1 ( Nt ) ,X2( Nt ) where ! T ( 1 ) = Ti X1 ( 1 ) = X10 X2 ( 1 ) = X20 ! X1 ( k ) = X1 ( a t t =T( k ) ) X2( k ) = X2( a t t =T( k ) ) 4.3. RUNGE–KUTTA METHODS 211 ! T( Nt )=TF ! ======================================================== s u b r o u t i n e RK ( T , X1 , X2 , Ti , Tf , X10 , X20 , Nt ) i m p l i c i t none i n t e g e r : : Nt r e a l , dimension ( Nt ) : : T , X1 , X2 real : : Ti , Tf , X10 , X20 real : : dt real : : TS , X1S , X2S ! v a l u e s o f time and X1 , X2 a t gi v e n s t e p integer : : i ! I n i t i a l i z e variables : dt = ( Tf−Ti ) / ( Nt −1) T (1) = Ti X1 ( 1 ) = X10 X2 ( 1 ) = X20 TS = Ti X1S = X10 X2S = X20 ! Make RK s t e p s : The arguments o f RKSTEP ! a r e r e p l a c e d with t h e new ones ! do i =2 , Nt c a l l RKSTEP ( TS , X1S , X2S , dt ) T ( i ) = TS X1 ( i ) = X1S X2 ( i ) = X2S enddo end s u b r o u t i n e RK ! ======================================================== ! S u b r o u t i n e RKSTEP( t , x1 , x2 , dt ) ! Runge−Kutta I n t e g r a t i o n r o u t i n e o f ODE ! dx1 / dt= f 1 ( t , x1 , x2 ) dx2 / dt=f 2 ( t , x1 , x2 ) ! User must supply d e r i v a t i v e f u n c t i o n s : ! r e a l f u n c t i o n f 1 ( t , x1 , x2 ) ! r e a l f u n c t i o n f 2 ( t , x1 , x2 ) ! Given i n i t i a l p o i n t ( t , x1 , x2 ) t h e r o u t i n e advances i t ! by time dt . ! Input : I n i t a l time t and f u n c t i o n v a l u e s x1 , x2 ! Output : F i n a l time t +dt and f u n c t i o n v a l u e s x1 , x2 ! C a r e f u l ! : v a l u e s o f t , x1 , x2 a r e o v e r w r i t t e n . . . ! ======================================================== s u b r o u t i n e RKSTEP ( t , x1 , x2 , dt ) i m p l i c i t none r e a l : : t , x1 , x2 , dt r e a l : : f1 , f2 r e a l : : k11 , k12 , k13 , k14 , k21 , k22 , k23 , k24 r e a l : : h , h2 , h6 h =dt ! h =dt , i n t e g r a t i o n s t e p h2 =0.5 D0 * h ! h2=h / 2 212 CHAPTER 4. MOTION OF A PARTICLE h6 =h / 6 . 0 ! h6=h / 6 k11=f1 ( t , x1 , x2 ) k21=f2 ( t , x1 , x2 ) k12=f1 ( t+h2 , x1+h2 * k11 , x2+h2 * k21 ) k22=f2 ( t+h2 , x1+h2 * k11 , x2+h2 * k21 ) k13=f1 ( t+h2 , x1+h2 * k12 , x2+h2 * k22 ) k23=f2 ( t+h2 , x1+h2 * k12 , x2+h2 * k22 ) k14=f1 ( t+h , x1+h * k13 , x2+h * k23 ) k24=f2 ( t+h , x1+h * k13 , x2+h * k23 ) t =t+h x1 =x1+h6 * ( k11 +2.0 D0 * ( k12+k13 )+k14 ) x2 =x2+h6 * ( k21 +2.0 D0 * ( k22+k23 )+k24 ) end s u b r o u t i n e RKSTEP 4.4 Comparison of the Methods 100 50 500 5000 50000 1 0.01 1e-04 δx 1e-06 1e-08 1e-10 1e-12 0.1 1 10 t Figure 4.11: The discrepancy of the numerical results of the Euler method from the analytic solution for the simple harmonic oscillator. The parameters chosen are ω 2 = 10, ti = 0, tf = 6, x(0) = 0.2, v(0) = 0 and the number of steps is N = 50, 500, 5, 000, 50, 000. Observe that the error becomes approximately ten times smaller each time according to the expectation of being of order ∼ O(∆t). In this section we will check our programs for correctness and ac- curacy w.r.t. discretization and roundoff errors. The simplest test is to 4.4. COMPARISON OF THE METHODS 213 0.1 50 500 5000 0.01 50000 0.001 1e-04 1e-05 δx 1e-06 1e-07 1e-08 1e-09 1e-10 0.1 1 10 t Figure 4.12: Like in figure 4.11 for the Euler-Cromer method. The error becomes approximately ten times smaller each time according to the expectation of being of order ∼ O(∆t). check the results against a known analytic solution of a simple model. This will be done for the simple harmonic oscillator. Our programs will need small changes which are summarized below. First, we will need to use higher accuracy variables and we will change all variables of type REAL to REAL(8). For this we need to change the corresponding dec- larations in the beginning of each (sub)program. For each numerical constant in the program we need to put an explicit exponent with the letter D instead of an E. For example 0.5 → 0.5D0, 1.2E-3 → 1.2D-3 etc. Then we need to alter the functions that compute the acceleration of the particle to give a = −ω 2 x. We will take ω 2 = 10 (T ≈ 1.987). Therefore the relevant part of the program in euler.f90 becomes r e a l ( 8 ) f u n c t i o n accel ( x ) i m p l i c i t none real (8) : : x accel = −10.0D0 * x end f u n c t i o n accel and that of the program in rk.f90 becomes r e a l ( 8 ) f u n c t i o n f2 ( t , x1 , x2 ) i m p l i c i t none 214 CHAPTER 4. MOTION OF A PARTICLE 1 50 500 5000 50000 0.01 1e-04 1e-06 δx 1e-08 1e-10 1e-12 1e-14 0.1 1 10 t Figure 4.13: Like in figure 4.11 for the Euler-Verlet method. The error becomes approximately 100 times smaller each time according to the expectation of being of order ∼ O(∆t2 ). r e a l ( 8 ) : : t , x1 , x2 f2=−10.0D0 * x1 end f u n c t i o n f2 The programs are run for a given time interval ti = 0 to tf = 6 with the initial conditions x0 = 0.2, v0 = 0. The time step ∆t is varied by varying the number of steps Nt-1. The computed numerical solution is compared to the well known solution for the simple harmonic oscillator a(x) = −ω 2 x xh (t) = x0 cos(ωt) + (v0 /ω) sin(ωt) vh (t) = v0 cos(ωt) − (x0 ω) sin(ωt) , (4.23) We study the deviation δx(t) = |x(t) − xh (t)| and δv(t) = |v(t) − vh (t)| as a function of the time step ∆t. The results are shown in figures 4.11–4.14. We note that for the Euler method and the Euler–Cromer method, the errors are of order O(∆t) as expected. However, the latter has smaller errors compared to the first one. For the Euler–Verlet method, the error turns out to be of order O(∆t2 ) whereas for the 4th order Runge–Kutta is of order⁸ O(∆t4 ). ⁸The reader should confirm these claims, initially by looking at the figures 4.11-4.14 and then by reproducing these results. A particular time t can be chosen and the errors can be plotted against ∆t, ∆t2 and ∆t4 respectively. 4.5. THE FORCED DAMPED OSCILLATOR 215 0.01 50 500 5000 1e-04 50000 1e-06 1e-08 δx 1e-10 1e-12 1e-14 1e-16 1e-18 0.1 1 10 t Figure 4.14: Like in figure 4.11 for the 4th order Runge–Kutta method. The error becomes approximately 10−4 times smaller each time according to the expectation of being of order ∼ O(∆t4 ). The roundoff errors become apparent for 50, 000 steps. Another way for checking the numerical results is by looking at a conserved quantity, like the energy, momentum or angular momentum, and study its deviation from its original value. In our case we study the mechanical energy 1 1 E = mv 2 + mω 2 x2 (4.24) 2 2 which is computed at each step. The deviation δE = |E − E0 | is shown in figures 4.15–4.18. 4.5 The Forced Damped Oscillator In this section we will study a simple harmonic oscillator subject to a damping force proportional to its velocity and an external periodic driving force, which for simplicity will be taken to have a sinusoidal dependence in time, d2 x dx 2 +γ + ω02 x = a0 sin ωt , (4.25) dt dt where F (t) = ma0 sin ωt and ω is the angular frequency of the driving force. 216 CHAPTER 4. MOTION OF A PARTICLE 1000 50 500 5000 100 50000 10 1 δE 0.1 0.01 0.001 1e-04 1e-05 0.1 1 10 t Figure 4.15: Like in figure 4.11 for the case of mechanical energy for the Euler method. Consider initially the system without the influence of the driving force, i.e. with a0 = 0. The real solutions of the differential equation⁹ which are finite for t → +∞ are given by √ 2 2 √ 2 2 x0 (t) = c1 e−(γ+ γ −4ω0 )t/2 + c2 e−(γ− γ −4ω0 )t/2 , γ 2 − 4ω02 > 0 , (4.26) x0 (t) = c1 e−γt/2 + c2 e−γt/2 t , γ 2 − 4ω02 = 0 , (4.27) (√ ) −γt/2 x0 (t) = c1 e cos −γ + 4ω0 t/2 2 2 (√ ) −γt/2 +c2 e sin −γ + 4ω0 t/2 , 2 2 γ 2 − 4ω02 < 0 .(4.28) In the last case, the solution oscillates with an amplitude decreasing ex- ponentially with time. In the a0 > 0 case, the general solution is obtained from the sum of a special solution xs (t) and the solution of the homogeneous equation x0 (t). A special solution can be obtained from the ansatz xs (t) = A sin ωt+ ⁹These are easily obtained by substituting the ansatz x(t) = Ae−Ωt and solving for Ω. 4.5. THE FORCED DAMPED OSCILLATOR 217 0.1 50 500 5000 0.01 50000 0.001 1e-04 1e-05 δE 1e-06 1e-07 1e-08 1e-09 1e-10 0.1 1 10 t Figure 4.16: Like in figure 4.11 for the case of mechanical energy for the Euler– Cromer method. B cos ωt, which when substituted in (4.25) and solved for A and B we find that a0 [(ω02 − ω 2 ) cos ωt + γω sin ωt] xs (t) = , (4.29) (ω02 − ω 2 )2 + ω 2 γ 2 and x(t) = x0 (t) + xs (t) . (4.30) The solution x0 (t) decreases exponentially with time and eventually only xs (t) remains. The only case where this is not true, is when we have resonance without damping for ω = ω0 , γ = 0. In that case the solution is a0 x(t) = c1 cos ωt + c2 sin ωt + 2 (cos ωt + 2(ωt) sin ωt) . (4.31) 4ω The first two terms are the same as that of the simple harmonic oscillator. The last one increases the amplitude linearly with time, which is a result of the influx of energy from the external force to the oscillator. Our program will be a simple modification of the program in rk.f90. The main routines RK(T,X1,X2,T0,TF,X10,X20,Nt) and RKSTEP(t,x1,x2,dt) remain as they are. We only change the user interface. The basic param- eters ω0 , ω, γ, a0 are entered interactively by the user from the standard input stdin. These parameters should be accessible also by the function f2(t,x1,x2), and one way to be able to do this, is to store them in vari- ables which are placed in a common block. Such variables are accessible to 218 CHAPTER 4. MOTION OF A PARTICLE 1 50 500 5000 0.01 50000 1e-04 1e-06 δE 1e-08 1e-10 1e-12 1e-14 1e-16 0.1 1 10 t Figure 4.17: Like in figure 4.11 for the case of mechanical energy for the Euler–Verlet method. all subprograms that declare a common block with the same name using a COMMON declaration. Such a declaration is shown in the following lines real (8) : : omega_0 , omega , gamma , a_0 , omega_02 , omega2 common / params / omega_0 , omega , gamma , a_0 , omega_02 , omega2 which when written in a (sub)program, the (sub)program gains ac- cess to the “memory position” params where the values of the vari- ables are stored. Another point that needs our attention is the function f2(t,x1,x2) which now takes the velocity v → x2 in its arguments: r e a l ( 8 ) f u n c t i o n f2 ( t , x1 , x2 ) i m p l i c i t none real (8) omega_0 , omega , gamma , a_0 , omega_02 , omega2 common / params / omega_0 , omega , gamma , a_0 , omega_02 , omega2 r e a l ( 8 ) t , x1 , x2 , a a = a_0 * c o s ( omega * t ) f2=−omega_02 * x1−gamma * x2+a end f u n c t i o n f2 The main program found in the file dlo.f90 is listed below. The subrou- tines RK, RKSTEP are the same as in rk.f90 and should also be included in the same file. 4.5. THE FORCED DAMPED OSCILLATOR 219 0.01 50 500 5000 50000 1e-04 1e-06 1e-08 δE 1e-10 1e-12 1e-14 1e-16 0.1 1 10 t Figure 4.18: Like in figure 4.11 for the case of mechanical energy for the 4th order Runge–Kutta method. Roundoff errors appear for large enough number of steps. ! ======================================================== ! Program t o s o l v e Damped Lin ea r O s c i l l a t o r ! using 4 th order Runge−Kutta Method ! Output i s w r i t t e n i n f i l e dlo . dat ! ======================================================== program dlo_solve i m p l i c i t none i n t e g e r , parameter : : P=110000 r e a l ( 8 ) , dimension ( P ) : : T , X1 , X2 r e a l ( 8 ) : : Ti , Tf , X10 , X20 r e a l ( 8 ) : : Energy real (8) : : omega_0 , omega , gamma , a_0 , omega_02 , omega2 common / params / omega_0 , omega , gamma , a_0 , omega_02 , omega2 i n t e g e r : : Nt , i ! Input : p r i n t * , ’ Runge−Kutta Method f o r DLO I n t e g r a t i o n ’ p r i n t * , ’ Enter omega_0 , omega , gamma , a_0 : ’ read * , omega_0 , omega , gamma , a_0 omega_02 = omega_0 * omega_0 omega2 = omega * omega p r i n t * , ’ omega_0= ’ , omega_0 , ’ omega= ’ , omega p r i n t * , ’gamma= ’ , gamma , ’ a_0= ’ , a_0 p r i n t * , ’ Enter Nt , Ti , TF , X10 , X20 : ’ read * , Nt , Ti , Tf , X10 , X20 p r i n t * , ’ Nt = ’ , Nt p r i n t * , ’ Time : I n i t i a l Ti = ’ , Ti , ’ F i n a l Tf= ’ , Tf 220 CHAPTER 4. MOTION OF A PARTICLE print * , ’ X1( Ti )= ’ , X10 , ’ X2( Ti )= ’ , X20 i f ( Nt . g t . P ) s t o p ’ Nt>P ’ ! The C a l c u l a t i o n : c a l l RK ( T , X1 , X2 , Ti , Tf , X10 , X20 , Nt ) ! Output : open ( u n i t =11 , f i l e = ’ dlo . dat ’ ) w r i t e ( 1 1 , * ) ’ # Damped Lin ea r O s c i l l a t o r − dlo ’ w r i t e ( 1 1 , * ) ’ # omega_0= ’ , omega_0 , ’ omega= ’ , omega ,& ’ gamma= ’ , gamma , ’ a_0= ’ , a_0 do i =1 , Nt Energy = 0.5 D0 * X2 ( i ) * X2 ( i ) +0.5 D0 * omega_02 * X1 ( i ) * X1 ( i ) w r i t e ( 1 1 , * ) T ( i ) , X1 ( i ) , X2 ( i ) , Energy enddo close (11) end program dlo_solve ! ======================================================== ! The f u n c t i o n s f1 , f 2 ( t , x1 , x2 ) provided by t h e u s e r ! ======================================================== r e a l ( 8 ) f u n c t i o n f1 ( t , x1 , x2 ) i m p l i c i t none r e a l ( 8 ) t , x1 , x2 f1=x2 ! dx1 / dt= v = x2 end f u n c t i o n f1 !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− r e a l ( 8 ) f u n c t i o n f2 ( t , x1 , x2 ) i m p l i c i t none real (8) omega_0 , omega , gamma , a_0 , omega_02 , omega2 common / params / omega_0 , omega , gamma , a_0 , omega_02 , omega2 r e a l ( 8 ) t , x1 , x2 , a a = a_0 * c o s ( omega * t ) f2=−omega_02 * x1−gamma * x2+a end f u n c t i o n f2 The results are shown in figures 4.19–4.22. Figure 4.19 shows the transition from a damped motion for γ > 2ω0 to an oscillating motion with damping amplitude for γ < 2ω0 . The exponential decrease of the amplitude is shown in figure 4.21, whereas the dependence of the period T from the damping coefficient γ is shown in figure 4.22. Motivated by equation (4.28), written in the form ( ) 2π 4ω0 − 2 = γ2 , (4.32) T we construct the plot in figure 4.22. The right hand side of the equation is put on the horizontal axis, whereas the left hand side on the vertical. Equation (4.32) predicts that both quantities are equal and all measure- ments should lie on a particular line, the diagonal y = x. The period T 4.5. THE FORCED DAMPED OSCILLATOR 221 5 6.29 3.15 4 1.57 0.32 3 2 1 0 x -1 -2 -3 -4 -5 0 2 4 6 8 10 t Figure 4.19: The position as a function of time for the damped oscillator for several values of γ and ω0 = 3.145. can be estimated from the time between two consecutive extrema of x(t) or two consecutive zeros of the velocity v(t) (see figure 4.19). Finally it is important to study the trajectory of the system in phase space. This can be seen¹⁰ in figure 4.20. A point in this space is a state of the system and a trajectory describes the evolution of the system’s states in time. We see that all such trajectories end up as t → +∞ to the point (0, 0), independently of the initial conditions. Such a point is an example of a system’s attractor. Next, we add the external force and study the response of the system to it. The system exhibits a transient behavior that depends on the initial conditions. For large enough times it approaches a steady state that does not depend on (almost all of) the initial conditions. This can be seen in figure 4.23. This is easily understood for our system by looking at equa- tions (4.26)–(4.28). We see that the steady state xs (t) becomes dominant when the exponentials have damped away. xs (t) can be written in the form x(t) = x0 (ω) cos(ωt + δ(ω)) a0 ωγ x0 (ω) = √ 2 , tan δ(ω) = . (4.33) (ω0 − ω 2 )2 + γ 2 ω 2 ω2 − ω02 ¹⁰To be precise, phase space is the space of positions-momenta, but in our case the difference is trivial. 222 CHAPTER 4. MOTION OF A PARTICLE 15 6.29 3.15 1.57 0.32 10 5 0 v -5 -10 -15 -5 -4 -3 -2 -1 0 1 2 3 4 5 x Figure 4.20: The phase space trajectory for the damped oscillator for several values of γ and ω0 = 3.145. Note the attractor at (x, v) = (0, 0) where all trajectories are “attracted to” as t → +∞. These equations are verified in figure 4.24 where we study the depen- dence of the amplitude x0 (ω) on the angular frequency of the driving force. Finally we study the trajectory of the system in phase space. As we can see in figure 4.20, this time the attractor is an ellipse, which is a one dimensional curve instead of a zero dimensional point. For large enough times, all trajectories approach their attractor asymptotically. 4.6 The Forced Damped Pendulum In this section we will study a non-linear dynamical system which ex- hibits interesting chaotic behavior. This is a simple model which, despite its deterministic nature, the prediction of its future behavior becomes in- tractable after a short period of time. Consider a simple pendulum in a constant gravitational field whose motion is damped by a force propor- tional to its velocity and it is under the influence of a vertical, harmonic external driving force: d2 θ dθ 2 + γ + ω02 sin θ = −2A cos ωt sin θ . (4.34) dt dt 4.6. THE FORCED DAMPED PENDULUM 223 10 1.0 0.8 0.6 0.4 0.2 0.1 1 Amplitude 0.1 0.01 0 5 10 15 20 25 30 35 40 t Figure 4.21: The amplitude of oscillation for the damped oscillator for several values of γ and ω0 = 3.145. Note the exponential damping of the amplitude with time. In the equation above, θ is the angle of the pendulum with the vertical axis, γ is the damping coefficient, ω02 = g/L is the pendulum’s natural angular frequency, ω is the angular frequency of the driving force and 2A is the amplitude of the external angular acceleration caused by the driving force. In the absence of the driving force, the damping coefficient drives the system to the point (θ, θ̇) = (0, 0), which is an attractor for the system. This continues to happen for small enough A, but for A > Ac the behavior of the system becomes more complicated. The program that integrates the equations of motion of the system can be obtained by making trivial changes to the program in the file dlo.f90. This changes are listed in detail below, but we note that X1 ↔ θ, X2 ↔ θ̇, a_0 ↔ A. The final program can be found in the file fdp.f90. It is listed below, with the understanding that the commands in between the dots are the same as in the programs found in the files dlo.f90, rk.f90. ! ======================================================== ! Program t o s o l v e Forced Damped Pendulum ! using 4 th order Runge−Kutta Method 224 CHAPTER 4. MOTION OF A PARTICLE 10 2 4 ω0 - (2 π/T) 2 1 1 10 γ2 Figure 4.22: The period of oscillation of the damped oscillator for several values of γ and ω0 = 3.145. The axes are chosen so that equation (4.28) (2π/T )2 = 4ω02 − γ 2 can be easily verified. The points in the plot are our measurements whereas the straight line is the theoretical prediction, the diagonal y = x ! Output i s w r i t t e n i n f i l e fdp . dat ! ======================================================== program dlo_solve i m p l i c i t none i n t e g e r , parameter : : P=1010000 ................................ Energy = 0.5 D0 * X2 ( i ) * X2 ( i )+omega_02 * ( 1 . 0 D0−c o s ( X1 ( i ) ) ) ................................ end program dlo_solve !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− r e a l ( 8 ) f u n c t i o n f2 ( t , x1 , x2 ) i m p l i c i t none real (8) omega_0 , omega , gamma , a_0 , omega_02 , omega2 common / params / omega_0 , omega , gamma , a_0 , omega_02 , omega2 r e a l ( 8 ) t , x1 , x2 f2=−(omega_02 +2.0 D0 * a_0 * c o s ( omega * t ) ) * s i n ( x1 )−gamma * x2 end f u n c t i o n f2 ! ======================================================== s u b r o u t i n e RKSTEP ( t , x1 , x2 , dt ) i m p l i c i t none ................................ 4.6. THE FORCED DAMPED PENDULUM 225 1 x0=1 v0=0 x0=0 v0=1 0.8 0.6 0.4 0.2 x(t) 0 -0.2 -0.4 -0.6 -0.8 0 10 20 30 40 50 60 t Figure 4.23: The period of oscillation for the forced damped oscillator for different initial conditions. We have chosen ω0 = 3.145, ω = 2.0, γ = 0.5 and a0 = 1.0. We note that after the transient behavior the system oscillates harmonically according to the relation x(t) = x0 (ω) cos(ωt + δ). r e a l ( 8 ) , parameter : : pi =3.14159265358979324 D0 r e a l ( 8 ) , parameter : : pi2 =6.28318530717958648 D0 ................................ x1 =x1+h6 * ( k11 +2.0 D0 * ( k12+k13 )+k14 ) x2 =x2+h6 * ( k21 +2.0 D0 * ( k22+k23 )+k24 ) i f ( x1 . g t . pi ) x1 = x1 − pi2 i f ( x1 . l t . −pi ) x1 = x1 + pi2 end s u b r o u t i n e RKSTEP The final lines in the program are added so that the angle is kept within the interval [−π, π]. In order to study the system’s properties we will set ω0 = 1, ω = 2, and γ = 0.2 unless we explicitly state otherwise. The natural period of the pendulum is T0 = 2π/ω0 = 2π ≈ 6.28318530717958648 whereas that of the driving force is T = 2π/ω = π ≈ 3.14159265358979324. For A < Ac , with Ac ≈ 0.18, the point (θ, θ̇) = (0, 0) is an attractor, which means that the pendulum eventually stops at its stable equilibrium point. For Ac < A < 0.71 the attractor is a closed curve, which means that the pendulum at its steady state oscillates indefinitely without circling 226 CHAPTER 4. MOTION OF A PARTICLE 0.7 0.6 0.5 0.4 x0(ω) 0.3 0.2 0.1 0 1 1.5 2 2.5 3 3.5 4 4.5 5 ω Figure 4.24: The oscillation amplitude x0 (ω) as a function of ω for the forced damped oscillator, where ω0 = 3.145, γ = 0.5 and a0 = 1.0. We observe a resonance for ω ≈ ω0 . The points of the plot are our measurements and the line is the theoretical prediction given by equation (4.33). through its unstable equilibrium point at θ = ±π. The period of motion is found to be twice that of the driving force. For 0.72 < A < 0.79 the attractor is an open curve, because at its steady state the pendulum crosses the θ = ±π point. The period of the motion becomes equal to that of the driving force. For 0.79 < A ≲ 1.033 we have period doubling for critical values of A, but the trajectory is still periodic. For even larger values of A the system enters into a chaotic regime where the trajectories are non periodic. For A ≈ 3.1 we find the system in a periodic steady state again, whereas for A ≈ 3.8 – 4.448 we have period doubling. For A ≈ 4.4489 we enter into a chaotic regime again etc. These results can be seen in figures 4.27–4.29. The reader should construct the bifurcation diagram of the system by solving problem 20 of this chapter. We can also use the so called Poincaré diagrams in order to study the chaotic behavior of a system. These are obtained by placing a point in phase space when the time is an integer multiple of the period of the driving force. Then, if for example the period of the motion is equal to that of the period of the driving force, the Poincaré diagram consists of only one point. If the period of the motion is an n–multiple of the 4.6. THE FORCED DAMPED PENDULUM 227 2 1.5 1 0.5 0 -0.5 v -1 -1.5 -2 -2.5 -3 -0.8 -0.6 -0.4 -0.2 0 0.2 0.4 0.6 0.8 1 x Figure 4.25: A phase space trajectory of the forced damped oscillator with ω0 = 3.145, ω = 2.0, γ = 0.5 and a0 = 1.0. The harmonic oscillation which is the steady state of the system is an ellipse, which is an attractor of all the phase space trajectories that correspond to different initial conditions. period of the driving force then the Poincaré diagram consists of only n points. Therefore, in the period doubling regime, the points of the Poincaré diagram double at each period doubling point. In the chaotic regime, the Poincaré diagram consists of an infinite number of points which belong to sets that have interesting fractal structure. One way to construct the Poincaré diagram numerically, is to process the data of the output file fdp.dat using awk¹¹: awk −v o=$omega −v nt=$Nt −v tf=$TF \ ’BEGIN{T =6.283185307179/ o ; dt=tf / nt ; } $1%T<dt { p r i n t $2 , $3 } ’\ fdp . dat where $omega, $Nt, $TF are the values of the angular frequency ω, the number of points of time and the final time tf . We calculate the period T and the time step dt in the program. Then we print those lines of the file ¹¹The command can be written in one line without the final \ of the first and second lines. 228 CHAPTER 4. MOTION OF A PARTICLE 0.4 0.3 0.2 0.1 0 v -0.1 -0.2 -0.3 -0.4 -0.2 -0.15 -0.1 -0.05 0 0.05 0.1 0.15 0.2 x Figure 4.26: The trajectory shown in figure 4.25 for t > 100. The trajectory is almost on top of an ellipse corresponding to the steady state motion of the system. This ellipse is an attractor of the system. where the time is an integer multiple of the period¹². This is accomplished by the modulo operation $1 % T. The value of the expression $1 % T < dt is true when the remainder of the division of the first column ($1) of the file fdp.dat with the period T is smaller than dt. The results in the chaotic regime are displayed in figure 4.30. We close this section by discussing another concept that helps us in the analysis of the dynamical properties of the pendulum. This is the concept of the basin of attraction which is the set of initial conditions in phase space that lead the system to a specific attractor. Take for example the case for A > 0.79 in the regime where the pendulum at its steady state has a circular trajectory with a positive or negative direction. By taking a large sample of initial conditions and recording the direction of the resulting motion after the transient behavior, we obtain figure 4.31. ¹²The accuracy of this condition is limited by dt, which makes the points in the Poincaré diagram slightly fuzzy. 4.7. APPENDIX: ON THE EULER–VERLET METHOD 229 2 -1.4 1.5 -1.6 1 -1.8 0.5 -2 0 -2.2 -0.5 -2.4 -1 -2.6 -1.5 -2 -2.8 -2 -1.5 -1 -0.5 0 0.5 1 1.5 2 -4 -3 -2 -1 0 1 2 3 4 3 -0.5 2.8 -1 2.6 2.4 -1.5 2.2 -2 2 1.8 -2.5 1.6 -3 1.4 1.2 -3.5 -4 -3 -2 -1 0 1 2 3 4 -4 -3 -2 -1 0 1 2 3 4 Figure 4.27: A phase space trajectory of the forced damped pendulum. The parameters chosen are ω0 = 1.0, ω = 2.0, γ = 0.2 and A = 0.60, 0.72, 0.85, 1.02. We observe the phenomenon of period doubling. 4.7 Appendix: On the Euler–Verlet Method Equations (4.11) can be obtained from the Taylor expansion (∆t)2 ′′ (∆t)3 ′′′ θ(t + ∆t) = θ(t) + (∆t)θ′ (t) + θ (t) + θ (t) + O((∆t)4 ) 2! 3! 2 3 (∆t) (∆t) θ(t − ∆t) = θ(t) − (∆t)θ′ (t) + θ′′ (t) − θ′′′ (t) + O((∆t)4 ) . 2! 3! By adding and subtracting the above equations we obtain θ(t + ∆t) + θ(t − ∆t) = 2θ(t) + (∆t)2 θ′′ (t) + O((∆t)4 ) θ(t + ∆t) − θ(t − ∆t) = 2(∆t)θ′ (t) + O((∆t)3 ) (4.35) which give equations (4.11) θ(t + ∆t) = 2θ(t) − θ(t − ∆t) + (∆t)2 α(t) + O((∆t)4 ) θ(t + ∆t) − θ(t − ∆t) ω(t) = + O((∆t)2 ) (4.36) 2(∆t) 230 CHAPTER 4. MOTION OF A PARTICLE -0.5 -0.5 -1 -1 -1.5 -1.5 -2 -2 -2.5 -2.5 -3 -3 -3.5 -3.5 -4 -3 -2 -1 0 1 2 3 4 -4 -3 -2 -1 0 1 2 3 4 -0.5 5 4 -1 3 2 -1.5 1 -2 0 -1 -2.5 -2 -3 -3 -4 -3.5 -5 -4 -3 -2 -1 0 1 2 3 4 -4 -3 -2 -1 0 1 2 3 4 Figure 4.28: A phase space trajectory of the forced damped pendulum. The parameters chosen are ω0 = 1.0, ω = 2.0, γ = 0.2 and A = 1.031, 1.033, 1.04, 1.4. We observe the chaotic behavior of the system. From the first equation and equations (4.9) we obtain: θ(t + ∆t) = θ(t) + ω(t)(∆t) + O((∆t)2 ) (4.37) When we perform a numerical integration, we are interested in the total error accumulated after N − 1 integration steps. In this method, these errors must be studied carefully: • The error in the velocity ω(t) does not accumulate because it is given by the difference of the positions θ(t + ∆t) − θ(t − ∆t). • The accumulation of the errors for the position is estimated as fol- lows: Assume that δθ(t) is the total accumulated error from the integration from time t0 to t. Then according to the expansions 4.7. APPENDIX: ON THE EULER–VERLET METHOD 231 3.2 5 3 4 3 2.8 2 2.6 1 2.4 0 2.2 -1 2 -2 1.8 -3 1.6 -4 1.4 -5 -4 -3 -2 -1 0 1 2 3 4 -4 -3 -2 -1 0 1 2 3 4 6 8 6 4 4 2 2 0 0 -2 -2 -4 -4 -6 -6 -8 -4 -3 -2 -1 0 1 2 3 4 -4 -3 -2 -1 0 1 2 3 4 Figure 4.29: A phase space trajectory of the forced damped pendulum. The parameters chosen are ω0 = 1.0, ω = 2.0, γ = 0.2 and A = 1.568, 3.8, 4.44, 4.5. We observe the system exiting and reentering regimes of chaotic behavior. (4.36) the error for the first step is δθ(t0 + ∆t) = O((∆t)4 ). Then¹³ θ(t0 + 2∆t) = 2θ(t0 + ∆t) − θ(t0 ) + ∆t2 α(t0 + ∆t) + O((∆t)4 ) ⇒ δθ(t0 + 2∆t) = 2δθ(t0 + ∆t) − δθ(t0 ) + O((∆t)4 ) = 2O((∆t)4 ) − 0 + O((∆t)4 ) = 3O((∆t)4 ) . For the next steps we obtain θ(t0 + 3∆t) = 2θ(t0 + 2∆t) − θ(t0 + ∆t) + ∆t2 α(t0 + 2∆t) + O((∆t)4 ) ⇒ δθ(t0 + 3∆t) = 2δθ(t0 + 2∆t) − δθ(t0 + ∆t) + O((∆t)4 ) = 6O((∆t)4 ) − O((∆t)4 ) + O((∆t)4 ) = 6O((∆t)4 ) , ¹³Remember that the acceleration α(t) is given, therefore δα(t) = 0. 232 CHAPTER 4. MOTION OF A PARTICLE 5 8 4 6 3 4 2 2 1 0 0 -1 -2 -2 -4 -3 -6 -4 -5 -8 -4 -3 -2 -1 0 1 2 3 4 -4 -3 -2 -1 0 1 2 3 4 Figure 4.30: A Poincaré diagram for the forced damped pendulum in its chaotic regime. The parameters chosen are ω0 = 1.0, ω = 2.0, γ = 0.2 and A = 1.4, 4.5. 8 8 6 6 4 4 2 2 0 0 -2 -2 -4 -4 -6 -6 -8 -8 -4 -3 -2 -1 0 1 2 3 4 -4 -3 -2 -1 0 1 2 3 4 Figure 4.31: Basin of attraction for the forced damped pendulum. The parameters chosen are ω0 = 1.0, ω = 2.0, γ = 0.2 and A = 0.85, 1.4. θ(t0 + 4∆t) = 2θ(t0 + 3∆t) − θ(t0 + 2∆t) + ∆t2 α(t0 + 3∆t) + O((∆t)4 ) ⇒ δθ(t0 + 4∆t) = 2δθ(t0 + 3∆t) − δθ(t0 + 2∆t) + O((∆t)4 ) = 12O((∆t)4 ) − 3O((∆t)4 ) + O((∆t)4 ) = 10O((∆t)4 ) . Then, inductively, if δθ(t0 + (n − 1)∆t) = (n−1)n 2 O((∆t)4 ), we obtain θ(t0 + n∆t) = 2θ(t0 + (n − 1)∆t) − θ(t0 + (n − 2)∆t) + ∆t2 α(t0 + (n − 1)∆t) +O((∆t)4 ) ⇒ δθ(t0 + n∆t) = 2δθ(t0 + (n − 1)∆t) − δθ(t0 + (n − 2)∆t) + O((∆t)4 ) (n − 1)n (n − 2)(n − 1) = 2 O((∆t)4 ) − O((∆t)4 ) + O((∆t)4 ) 2 2 n(n + 1) = O((∆t)4 ) . 2 4.8. APPENDIX: 2ND ORDER RUNGE–KUTTA METHOD 233 Finally n(n + 1) 1 δθ(t0 + n∆t) = O((∆t)4 ) ∼ O((∆t)4 ) ∼ O((∆t)2 ) . 2 ∆t2 (4.38) Therefore the total error is O((∆t)2 ). We also mention the Velocity Verlet method or the Leapfrog method. In this case we use the velocity explicitly: 1 θn+1 = θn + ωn ∆t + αn ∆t2 2 1 ωn+ 1 = ωn + αn ∆t 2 2 1 ωn+1 = ωn+ 1 + αn+1 ∆t . (4.39) 2 2 The last step uses the acceleration αn+1 which should depend only on the position θn+1 and not on the velocity. The Verlet methods are popular in molecular dynamics simulations of many body systems. One of their advantages is that the constraints of the system of particles are easily encoded in the algorithm. 4.8 Appendix: 2nd order Runge–Kutta Method In this appendix we will show how the choice of the intermediate point 2 in equation (4.17) reduces the error by a power of h. This choice is special, since by choosing another point (e.g. t = tn + 0.4h) the result would have not been the same. Indeed, from the relation ∫ tn+1 dx = f (t, x) ⇒ xn+1 = xn + f (t, x) dx . (4.40) dt tn By Taylor expanding around the point (tn+1/2 , xn+1/2 ) we obtain df f (t, x) = f (tn+1/2 , xn+1/2 ) + (t − tn+1/2 ) (tn+1/2 ) + O(h2 ) . (4.41) dt 234 CHAPTER 4. MOTION OF A PARTICLE Therefore ∫ tn+1 f (t, x) dx tn tn+1 df (t − tn+1/2 )2 = f (tn+1/2 , xn+1/2 )(tn+1 − tn ) + (tn+1/2 ) dt 2 tn +O(h )(tn+1 − tn ) 2 { } df (tn+1 − tn+1/2 )2 (tn − tn+1/2 )2 = f (tn+1/2 , xn+1/2 )h + (tn+1/2 ) − dt 2 2 2 +O(h )h { 2 } df h (−h)2 = f (tn+1/2 , xn+1/2 )h + (tn+1/2 ) − + O(h3 ) dt 2 2 = f (tn+1/2 , xn+1/2 )h + O(h3 ) . (4.42) Note that for the vanishing of the O(h) term it is necessary to place the intermediate point at time tn+1/2 . This is not a unique choice. This can be most easily seen by a different analysis of the Taylor expansion. Expanding around the point (tn , xn ) we obtain 2 dxn 1 2 d xn xn+1 = xn + (tn+1 − tn ) + (tn+1 − tn ) 2 + O(h3 ) dt 2 dt h2 dfn = xn + hfn + + O(h3 ) 2 ( dt ) h2 ∂fn ∂fn dxn = xn + hfn + + + O(h3 ) 2 ∂t ∂x dt 2 ( ) h ∂fn ∂fn = xn + hfn + + fn + O(h3 ) , (4.43) 2 ∂t ∂x where we have set fn ≡ f (tn , xn ), dxn dt ≡ dx dt (xn ) etc. We define k1 = f (tn , xn ) = fn k2 = f (tn + ah, xn + bhk1 ) xn+1 = xn + h(c1 k1 + c2 k2 ) . (4.44) and we will determine the conditions so that the terms O(h2 ) of the last equation in the error are identical with those of equation (4.43). By 4.8. APPENDIX: 2ND ORDER RUNGE–KUTTA METHOD 235 expanding k2 we obtain k2 = f (tn + ah, xn + bhk1 ) ∂f = f (tn , xn + bhk1 ) + ha (tn , xn + bhk1 ) + O(h2 ) ∂t ∂f ∂f = f (tn , xn ) + hbk1 (tn , xn ) + ha (tn , xn ) + O(h2 ) { ∂x } ∂t ∂fn ∂fn = fn + h a + bk1 + O(h2 ) ∂t ∂x { } ∂fn ∂fn = fn + h a + bfn + O(h2 ) (4.45) ∂t ∂x Substituting in (4.44) we obtain xn+1 = xn + h(c1 k1 + c2 k2 ) { ( ) } ∂fn ∂fn = x n + h c 1 fn + c 2 fn + c 2 h a + bfn + O(h )2 ∂t ∂x ( ) h2 ∂fn ∂fn = xn + h(c1 + c2 )fn + (2c2 a) + (2c2 b)fn 2 ∂t ∂x 3 +O(h ) . (4.46) All we need is to choose c1 + c2 = 1 2c2 a = 1 2c2 b = 1 . (4.47) The choice c1 = 0, c2 = 1, a = b = 1/2 leads to equation (4.19). Some other choices in the bibliography are c2 = 1/2 and c2 = 3/4. 236 CHAPTER 4. MOTION OF A PARTICLE 4.9 Problems 4.1 Prove that the total error in the Euler–Cromer method is of order ∆t. 4.2 Reproduce the results in figures 4.11–4.18 4.3 Improve your programs so that there is no accumulation of roundoff error in the calculation of time when h is very small for the methods Euler, Euler-Cromer, Euler-Verlet and Runge-Kutta. Repeat the analysis of the previous problem. 4.4 Make the appropriate changes in your programs of the Euler, Euler- Cromer, Euler-Verlet and Runge-Kutta methods so that all floating variables change from REAL→REAL(8). Repeat the analysis of the previous problem. 4.5 Compare the results obtained from the Euler, Euler-Cromer, Euler- Verlet, Runge-Kutta methods for the following systems where the analytic solution is known: (a) Particle falling in a constant gravitational field. Consider the case v(0) = 0, m = 1, g = 10. (b) Particle falling in a constant gravitational field moving in a fluid from which exerts a force F = −kv on the particle. Consider the case v(0) = 0, m = 1, g = 10 k = 0.1, 1.0, 2.0. Calculate the limiting velocity of the particle numerically and compare the value obtained to the theoretical expectation. (c) Repeat for the case of a force of resistance of magnitude |F | = kv 2 . 4.6 Consider the damped harmonic oscillator d2 x dx 2 +γ + ω02 x = 0 . (4.48) dt dt Take ω0 = 3.145, γ = 0.5 and calculate its mechanical energy as a function of time. Is it monotonic? Why? (show that d(E/m)/dt = −γv 2 ). Repeat for γ = 4, 5, 6, 7, 8. When is the system oscillating and when it’s not? Calculate numerically the critical value of γ for which the system passes from a non oscillating to an oscillating regime. Compare your results with the theoretical expectations. 4.9. PROBLEMS 237 4.7 Reproduce the results of figures 4.19–4.22. 4.8 Reproduce the results of figures 4.23–4.26. Calculate the phase δ(ω) numerically and compare with equation (4.33). 4.9 Consider a simple model for a swing. Take the damped harmonic oscillator and a driving force which periodically exerts a momen- tary push with angular frequency ω. Define “momentary” to be an impulse given by the acceleration a0 by an appropriately small time interval ∆t. The acceleration is 0 for all other times. Calculate the amplitude x0 (ω) for ω0 = 3.145 and γ = 0.5. 4.10 Consider a “half sine” driving force on a damped harmonic oscilla- tor { a0 cos ωt cos ωt > 0 a(t) = 0 cos ωt ≤ 0 Study the transient behavior of the system for several initial con- ditions and calculate its steady state motion for ω0 = 3.145 and γ = 0.5. Calculate the amplitude x0 (ω). 4.11 Consider the driving force on a damped oscillator given by 1 1 2 2 a(t) = + cos ω + cos 2ωt − cos 4ωt π 2 3π 15π Study the transient behavior of the system for several initial con- ditions and calculate its steady state motion for ω0 = 3.145 and γ = 0.5. Calculate the amplitude x0 (ω). Compare your results with those of the previous problem and comment about. 4.12 Write a program that simulates N identical, independent harmonic oscillators. Take N = 20 and choose random initial conditions for each one of them. Study their trajectories in phase space and check whether they cross each other. Comment on your results. 4.13 Place the N = 20 harmonic oscillators of the previous problem in a small square in phase space whose center is at the origin of the axes. Consider the evolution of the system in time. Does the shape of the rectangle change in time? Does the area change in time? Explain... 4.14 Repeat the previous problem when each oscillator is damped with γ = 0.5. Take ω0 = 3.145. 238 CHAPTER 4. MOTION OF A PARTICLE 4.15 Consider the forced damped oscillator with ω = 2, ω0 = 1.0, γ = 0.2. Study the transient behavior of the system in the plots of θ(t), θ̇(t) for A = 0.1, 0.5, 0.79, 0.85, 1.03, 1.4. 4.16 Consider the forced damped pendulum with ω = 2, ω0 = 1.0, γ = 0.2 and study the phase space trajectories for A = 0.1, 0.19, 0.21, 0.25, 0.5, 0.71, 0.79, 0.85, 1.02, 1.031, 1.033, 1.05, 1.08, 1.1, 1.4, 1.8, 3.1, 3.5, 3.8, 4.2, 4.42, 4.44, 4.445, 4.447, 4.4488. Consider both the transient behavior and the steady state motion. 4.17 Reproduce the results in figures 4.30. 4.18 Reproduce the results in figures 4.31. 4.19 Consider the forced damped oscillator with ω0 = 1 , ω = 2, γ = 0.2 After the transient behavior, the motion of the system for A = 0.60, A = 0.75 and A = 0.85 is periodic. Measure the period of the motion with an accuracy of three significant digits and compare it with the natural period of the pendulum and with the period of the driving force. Take as initial conditions the following pairs: (θ0 , θ̇0 ) = (3.1, 0.0), (2.5, 0.0), (2.0, 0.0), (1.0, 0.0), (0.2, 0.0), (0.0, 1.0), (0.0, 3.0), (0.0, 6.0). Check if the period is independent of the initial conditions. 4.20 Consider the forced damped pendulum with ω0 = 1 , ω = 2, γ = 0.2 Study the motion of the pendulum when the amplitude A takes values in the interval [0.2, 5.0]. Consider specific discrete values of A by splitting the interval above in subintervals of width equal to δA = 0.002. For each value of A, record in a file the value of A, the angular position and the angular velocity of the pendulum when tk = kπ with k = ktrans , ktrans + 1, ktrans + 2, . . . , kmax : A θ(tk ) θ̇(tk ) The choice of ktrans is made so that the transient behavior will be discarded and study only the steady state of the pendulum. You may take kmax = 500, ktrans = 400, ti = 0, tf = 500π, and split the intervals [tk , tk + π] to 50 subintervals. Choose θ0 = 3.1, θ̇0 = 0. 4.9. PROBLEMS 239 (a) Construct the bifurcation diagram by plotting the points (A, θ(tk )). (b) Repeat by plotting the points (A, θ̇(tk )). (c) Check whether your results depend on the choice of θ0 , θ̇0 . Repeat your analysis for θ0 = 0, θ̇0 = 1. (d) Study the onset of chaos: Take A ∈ [1.0000, 1.0400] with δA = 0.0001 and A ∈ [4.4300, 4.4500] with δA = 0.0001 and compute with the given accuracy the value Ac where the system enters into the chaotic behavior regime. (e) The plot the points (θ(tk ), θ̇(tk )) for A = 1.034, 1.040, 1.080, 1.400, 4.450, 4.600. Put 2000 points for each value of A and commend on the strength of the chaotic behavior of the pen- dulum. 240 CHAPTER 4. MOTION OF A PARTICLE Chapter 5 Planar Motion In this chapter we will study the motion of a particle moving on the plane under the influence of a dynamical field. Special emphasis will be given to the study of the motion in a central field, like in the problem of planetary motion and scattering. We also study the motion of two or more interacting particles moving on the plane, which requires the solution of a larger number of dynamical equations. These problems can be solved numerically by using Runge–Kutta integration methods, therefore this chapter extends and applies the numerical methods studied in the previous chapter. 5.1 Runge–Kutta for Planar Motion In two dimensions, the initial value problem that we are interested in, is solving the system of equations (4.6) dx dvx = vx = ax (t, x, vx , y, vy ) dt dt dy dvy = vy = ay (t, x, vx , y, vy ) . (5.1) dt dt The 4th order Runge-Kutta method can be programmed by making small modifications of the program in the file rk.f90. In order to facil- itate the study of many different dynamical fields, for each field we put the code of the respective acceleration in a different file. The code which is common for all the forces, namely the user interface and the imple- mentation of the Runge–Kutta method, will be put in the file rk2.f90. The program that computes the acceleration will be put in a file named rk_XXX.f90, where XXX is a string of characters that identifies the force. 241 242 CHAPTER 5. PLANAR MOTION For example, the file rk2_hoc.f90 contains the program computing the acceleration of the simple harmonic oscillator, the file rk2_g.f90 the ac- celeration of a constant gravitational field ⃗g = −g ŷ etc. Different force fields will require the use of one or more coupling constants which need to be accessible to the code in the main program and some subroutines. For this reason, we will provide two variables k1, k2 in a common block: real (8) : : k1 , k2 common / couplings / k1 , k2 This common block will be accessed by the acceleration functions f3 and f4, the function energy and the main program where the user will enter the values of k1 and k2. The initial conditions are stored in the variables X10 ↔ x0 , X20 ↔ y0 , V10 ↔ vx0 , V20 ↔ vy0 , and the values of the functions of time will be stored in the arrays X1(P) ↔ x(t), X2(P) ↔ y(t), V1(P) ↔ vx (t), V2(P) ↔ vy (t). The integration is performed by a call to the subroutine c a l l RK ( T , X1 , X2 , V1 , V2 , Ti , Tf , X10 , X20 , V10 , V20 , Nt ) The results are written to the file rk2.dat. Each line in this file contains the time, position, velocity and the total mechanical energy, where the energy is calculated by the function energy(t,x1,x2,v1,v2): open ( u n i t =11 , f i l e = ’ rk2 . dat ’ ) do i =1 , Nt w r i t e ( 1 1 , * ) T ( i ) , X1 ( i ) , X2 ( i ) , V1 ( i ) , V2 ( i ) ,& energy ( T ( i ) , X1 ( i ) , X2 ( i ) , V1 ( i ) , V2 ( i ) ) enddo The code for the function energy, which is different for each force field, is written in the same file with the acceleration. The code for the subroutine RKSTEP(t,x1,x2,x3,x4,dt) should be extended in order to integrate four instead of two functions. The full code is listed below: ! ======================================================== ! Program t o s o l v e a 4 ODE system using Runge−Kutta Method ! User must supply d e r i v a t i v e s ! dx1 / dt= f 1 ( t , x1 , x2 , x3 , x4 ) dx2 / dt=f 2 ( t , x1 , x2 , x3 , x4 ) ! dx3 / dt=f 3 ( t , x1 , x2 , x3 , x4 ) dx4 / dt=f 4 ( t , x1 , x2 , x3 , x4 ) ! as r e a l ( 8 ) f u n c t i o n s 5.1. RUNGE–KUTTA FOR PLANAR MOTION 243 ! Output i s w r i t t e n i n f i l e rk2 . dat ! ======================================================== program rk2_solve i m p l i c i t none i n t e g e r , parameter : : P=1010000 r e a l ( 8 ) , dimension ( P ) : : T , X1 , X2 , V1 , V2 r e a l ( 8 ) : : Ti , Tf , X10 , X20 , V10 , V20 i n t e g e r : : Nt , i real (8) : : k1 , k2 common / couplings / k1 , k2 r e a l ( 8 ) : : energy , E0 , EF , DE ! Input : p r i n t * , ’ Runge−Kutta Method f o r 4−ODEs I n t e g r a t i o n ’ p r i n t * , ’ Enter c o u p l i n g c o n s t a n t s : ’ read * , k1 , k2 p r i n t * , ’ k1= ’ , k1 , ’ k2= ’ , k2 p r i n t * , ’ Enter Nt , Ti , Tf , X10 , X20 , V10 , V20 : ’ read * , Nt , Ti , TF , X10 , X20 , V10 , V20 p r i n t * , ’ Nt = ’ , Nt p r i n t * , ’ Time : I n i t i a l Ti = ’ , Ti , ’ F i n a l Tf= ’ , Tf print * , ’ X1( Ti )= ’ , X10 , ’ X2( Ti )= ’ , X20 print * , ’ V1 ( Ti )= ’ , V10 , ’ V2( Ti )= ’ , V20 ! The C a l c u l a t i o n : c a l l RK ( T , X1 , X2 , V1 , V2 , Ti , Tf , X10 , X20 , V10 , V20 , Nt ) ! Output : open ( u n i t =11 , f i l e = ’ rk2 . dat ’ ) do i =1 , Nt w r i t e ( 1 1 , * ) T ( i ) , X1 ( i ) , X2 ( i ) , V1 ( i ) , V2 ( i ) ,& energy ( T ( i ) , X1 ( i ) , X2 ( i ) , V1 ( i ) , V2 ( i ) ) enddo close (11) ! Rutherford s c a t t e r i n g a n g l e s : p r i n t * , ’ v−a n g l e : ’ , atan2 ( V2 ( Nt ) , V1 ( Nt ) ) p r i n t * , ’ b−a n g l e : ’ , 2 . 0 D0 * atan ( k1 / ( V10 * V10 * X20 ) ) E0 = energy ( Ti , X10 , X20 , V10 , V20 ) EF = energy ( T ( Nt ) , X1 ( Nt ) , X2 ( Nt ) , V1 ( Nt ) , V2 ( Nt ) ) DE = ABS( 0 . 5 D0 * ( EF−E0 ) / ( EF+E0 ) ) p r i n t * , ’E0 , EF , DE/ E= ’ , E0 , EF , DE end program rk2_solve ! ======================================================== ! The v e l o c i t y f u n c t i o n s f1 , f 2 ( t , x1 , x2 , v1 , v2 ) ! ======================================================== r e a l ( 8 ) f u n c t i o n f1 ( t , x1 , x2 , v1 , v2 ) i m p l i c i t none r e a l ( 8 ) : : t , x1 , x2 , v1 , v2 f1=v1 ! dx1 / dt= v1 end f u n c t i o n f1 !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− r e a l ( 8 ) f u n c t i o n f2 ( t , x1 , x2 , v1 , v2 ) 244 CHAPTER 5. PLANAR MOTION i m p l i c i t none r e a l ( 8 ) : : t , x1 , x2 , v1 , v2 f2=v2 ! dx2 / dt= v2 end f u n c t i o n f2 ! ======================================================== !RK(T , X1 , X2 , V1 , V2 , Ti , Tf , X10 , X20 , V10 , V20 , Nt ) i s t h e d r i v e r ! f o r t h e Runge−Kutta i n t e g r a t i o n r o u t i n e RKSTEP ! Input : I n i t i a l and f i n a l t i m e s Ti , Tf ! I n i t i a l v a l u e s a t t =Ti X10 , X20 , V10 , V20 ! Number o f s t e p s o f i n t e g r a t i o n : Nt−1 ! S i z e o f a r r a y s T , X1 , X2 , V1 , V2 ! Output : r e a l a r r a y s T( Nt ) , X1 ( Nt ) ,X2( Nt ) , ! V1 ( Nt ) ,V2( Nt ) where ! T ( 1 ) = Ti X1 ( 1 ) = X10 X2 ( 1 ) = X20 V1 ( 1 ) = V10 V2 ( 1 ) = V20 ! X1 ( k ) = X1 ( a t t =T( k ) ) X2( k ) = X2( a t t =T( k ) ) ! V1 ( k ) = V1 ( a t t =T( k ) ) V2( k ) = V2( a t t =T( k ) ) ! T( Nt )= Tf ! ======================================================== s u b r o u t i n e RK ( T , X1 , X2 , V1 , V2 , Ti , Tf , X10 , X20 , V10 , V20 , Nt ) i m p l i c i t none i n t e g e r : : Nt r e a l ( 8 ) , dimension ( Nt ) : : T , X1 , X2 , V1 , V2 r e a l ( 8 ) : : Ti , Tf r e a l ( 8 ) : : X10 , X20 r e a l ( 8 ) : : V10 , V20 r e a l ( 8 ) : : dt r e a l ( 8 ) : : TS , X1S , X2S ! v a l u e s o f time and X1 , X2 a t gi v e n s t e p real (8) : : V1S , V2S integer : : i ! I n i t i a l i z e variables : dt = ( Tf−Ti ) / ( Nt −1) T ( 1 ) = Ti X1 ( 1 ) = X10 ; X2 ( 1 ) = X20 V1 ( 1 ) = V10 ; V2 ( 1 ) = V20 TS = Ti X1S = X10 ; X2S = X20 V1S = V10 ; V2S = V20 ! Make RK s t e p s : The arguments o f RKSTEP a r e ! r e p l a c e d with t h e new ones do i =2 , Nt c a l l RKSTEP ( TS , X1S , X2S , V1S , V2S , dt ) T ( i ) = TS X1 ( i ) = X1S ; X2 ( i ) = X2S V1 ( i ) = V1S ; V2 ( i ) = V2S enddo end s u b r o u t i n e RK ! ======================================================== ! S u b r o u t i n e RKSTEP( t , x1 , x2 , dt ) ! Runge−Kutta I n t e g r a t i o n r o u t i n e o f ODE 5.1. RUNGE–KUTTA FOR PLANAR MOTION 245 ! dx1 / dt= f 1 ( t , x1 , x2 , x3 , x4 ) dx2 / dt=f 2 ( t , x1 , x2 , x3 , x4 ) ! dx3 / dt=f 3 ( t , x1 , x2 , x3 , x4 ) dx4 / dt=f 4 ( t , x1 , x2 , x3 , x4 ) ! User must supply d e r i v a t i v e f u n c t i o n s : ! r e a l f u n c t i o n f 1 ( t , x1 , x2 , x3 , x4 ) ! r e a l f u n c t i o n f 2 ( t , x1 , x2 , x3 , x4 ) ! r e a l f u n c t i o n f 3 ( t , x1 , x2 , x3 , x4 ) ! r e a l f u n c t i o n f 4 ( t , x1 , x2 , x3 , x4 ) ! Given i n i t i a l p o i n t ( t , x1 , x2 ) t h e r o u t i n e advances i t ! by time dt . ! Input : I n i t a l time t and f u n c t i o n v a l u e s x1 , x2 , x3 , x4 ! Output : F i n a l time t +dt and f u n c t i o n v a l u e s x1 , x2 , x3 , x4 ! C a r e f u l ! : v a l u e s o f t , x1 , x2 , x3 , x4 a r e o v e r w r i t t e n . . . ! ======================================================== s u b r o u t i n e RKSTEP ( t , x1 , x2 , x3 , x4 , dt ) i m p l i c i t none r e a l ( 8 ) : : t , x1 , x2 , x3 , x4 , dt r e a l ( 8 ) : : f1 , f2 , f3 , f4 r e a l ( 8 ) : : k11 , k12 , k13 , k14 , k21 , k22 , k23 , k24 r e a l ( 8 ) : : k31 , k32 , k33 , k34 , k41 , k42 , k43 , k44 r e a l ( 8 ) : : h , h2 , h6 h =dt ! h =dt , i n t e g r a t i o n s t e p h2 =0.5 D0 * h ! h2=h / 2 h6=h / 6 . 0 D0 ! h6=h / 6 k11=f1 ( t , x1 , x2 , x3 , x4 ) k21=f2 ( t , x1 , x2 , x3 , x4 ) k31=f3 ( t , x1 , x2 , x3 , x4 ) k41=f4 ( t , x1 , x2 , x3 , x4 ) k12=f1 ( t+h2 , x1+h2 * k11 , x2+h2 * k21 , x3+h2 * k31 , x4+h2 * k41 ) k22=f2 ( t+h2 , x1+h2 * k11 , x2+h2 * k21 , x3+h2 * k31 , x4+h2 * k41 ) k32=f3 ( t+h2 , x1+h2 * k11 , x2+h2 * k21 , x3+h2 * k31 , x4+h2 * k41 ) k42=f4 ( t+h2 , x1+h2 * k11 , x2+h2 * k21 , x3+h2 * k31 , x4+h2 * k41 ) k13=f1 ( t+h2 , x1+h2 * k12 , x2+h2 * k22 , x3+h2 * k32 , x4+h2 * k42 ) k23=f2 ( t+h2 , x1+h2 * k12 , x2+h2 * k22 , x3+h2 * k32 , x4+h2 * k42 ) k33=f3 ( t+h2 , x1+h2 * k12 , x2+h2 * k22 , x3+h2 * k32 , x4+h2 * k42 ) k43=f4 ( t+h2 , x1+h2 * k12 , x2+h2 * k22 , x3+h2 * k32 , x4+h2 * k42 ) k14=f1 ( t+h , x1+h * k13 , x2+h * k23 , x3+h * k33 , x4+h * k43 ) k24=f2 ( t+h , x1+h * k13 , x2+h * k23 , x3+h * k33 , x4+h * k43 ) k34=f3 ( t+h , x1+h * k13 , x2+h * k23 , x3+h * k33 , x4+h * k43 ) k44=f4 ( t+h , x1+h * k13 , x2+h * k23 , x3+h * k33 , x4+h * k43 ) t =t+h x1=x1+h6 * ( k11 +2.0 D0 * ( k12+k13 )+k14 ) x2=x2+h6 * ( k21 +2.0 D0 * ( k22+k23 )+k24 ) x3=x3+h6 * ( k31 +2.0 D0 * ( k32+k33 )+k34 ) 246 CHAPTER 5. PLANAR MOTION x4=x4+h6 * ( k41 +2.0 D0 * ( k42+k43 )+k44 ) end s u b r o u t i n e RKSTEP 5.2 Projectile Motion Consider a particle in the constant gravitational field near the surface of the earth which moves with constant acceleration ⃗g = −g ŷ so that x(t) = x0 + v0x t , y(t) = y0 + v0y t − 12 gt2 vx (t) = v0x , vy (t) = v0y − gt (5.2) ax (t) = 0 , ay (t) = −g The particle moves on a parabolic trajectory that depends on the initial conditions ( ) v0y 1 g (y − y0 ) = (x − x0 ) − 2 (x − x0 )2 v0x 2 v0x tan2 θ = tan θ (x − x0 ) − (x − x0 )2 , (5.3) 4hmax where tan θ = v0y /v0x is the direction of the initial velocity and hmax is the maximum height of the trajectory. The acceleration ax (t) = 0 ay (t) = −g (ax ↔ f3 , ay ↔ f4) and the mechanical energy is coded in the file rk2_g.f90: ! ======================================================== ! The a c c e l e r a t i o n f u n c t i o n s f3 , f 4 ( t , x1 , x2 , v1 , v2 ) provided ! by t h e u s e r ! ======================================================== ! Free f a l l i n c o n s t a n t g r a v i t a t i o n a l f i l e d with ! g = −k2 r e a l ( 8 ) f u n c t i o n f3 ( t , x1 , x2 , v1 , v2 ) i m p l i c i t none r e a l ( 8 ) : : t , x1 , x2 , v1 , v2 real (8) : : k1 , k2 common / couplings / k1 , k2 f3 =0.0 D0 ! dx3 / dt=dv1 / dt=a1 end f u n c t i o n f3 !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− r e a l ( 8 ) f u n c t i o n f4 ( t , x1 , x2 , v1 , v2 ) i m p l i c i t none r e a l ( 8 ) : : t , x1 , x2 , v1 , v2 5.2. PROJECTILE MOTION 247 0.25 0.06 x(t) y(t) 0.05 0.2 0.04 0.15 0.03 0.1 0.02 0.05 0.01 0 0 0 0.05 0.1 0.15 0.2 0.25 0 0.05 0.1 0.15 0.2 0.25 1.01 1 vx(t) vy(t) 1.005 0.5 1 0 0.995 -0.5 0.99 -1 0.985 -1.5 0 0.05 0.1 0.15 0.2 0.25 0 0.05 0.1 0.15 0.2 0.25 Figure 5.1: Plots of x(t), y(t), vx (t), vy (t) for a projectile fired in a constant gravita- tional field ⃗g = −10.0 ŷ with initial velocity ⃗v0 = x̂ + ŷ. real (8) : : k1 , k2 common / couplings / k1 , k2 f4=−k1 ! dx4 / dt=dv2 / dt=a2 end f u n c t i o n f4 !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− r e a l ( 8 ) f u n c t i o n energy ( t , x1 , x2 , v1 , v2 ) i m p l i c i t none r e a l ( 8 ) : : t , x1 , x2 , v1 , v2 real (8) : : k1 , k2 common / couplings / k1 , k2 energy = 0.5 D0 * ( v1 * v1+v2 * v2 ) + k1 * x2 end f u n c t i o n energy In order to calculate a projectile’s trajectory you may use the following commands: > g f o r t r a n −O2 rk2 . f90 rk2_g . f90 −o rk2 > . / rk2 Runge−Kutta Method for 4−ODEs Integration Enter coupling constants : 10.0 0.0 k1= 10.000000 k2= 0.000000 248 CHAPTER 5. PLANAR MOTION 0.06 1.8e-05 E(t)-E(0) 1.6e-05 0.05 1.4e-05 0.04 1.2e-05 0.03 1e-05 y 8e-06 0.02 6e-06 0.01 4e-06 2e-06 0 0 0.05 0.1 0.15 0.2 0.25 0 x 0 0.05 0.1 0.15 0.2 0.25 Figure 5.2: (Left) The parabolic trajectory of a projectile fired in a constant gravi- tational field ⃗g = −10.0 ŷ with initial velocity ⃗v0 = x̂ + ŷ. (Right) The deviation of the projectile’s energy from its initial value is due to numerical errors. Enter Nt , Ti , Tf , X10 , X20 , V10 , V20 : 20000 0.0 0.2 0.0 0.0 1 . 0 1 . 0 Nt= 20000 Time : Initial Ti = 0.000000 Final Tf= 0.200000 X1 ( Ti )= 0.000000 X2 ( Ti )= 0.000000 V1 ( Ti )= 1.000000 V2 ( Ti )= 1.000000 The analysis of the results contained in the file rk2.dat can be done using gnuplot: gnuplot > s e t t e r m i n a l x11 1 gnuplot > p l o t ” rk2 . dat ” using 1 : 2 with lines t i t l e ”x ( t ) ” gnuplot > s e t t e r m i n a l x11 2 gnuplot > p l o t ” rk2 . dat ” using 1 : 3 with lines t i t l e ”y ( t ) ” gnuplot > s e t t e r m i n a l x11 3 gnuplot > p l o t ” rk2 . dat ” using 1 : 4 with lines t i t l e ” vx ( t ) ” gnuplot > s e t t e r m i n a l x11 4 gnuplot > p l o t ” rk2 . dat ” using 1 : 5 with lines t i t l e ” vy ( t ) ” gnuplot > s e t t e r m i n a l x11 5 gnuplot > p l o t ” rk2 . dat ” using 1 : ( $6 −1.0) w lines t ”E( t ) Ε−(0) ” gnuplot > s e t t e r m i n a l x11 6 gnuplot > s e t s i z e square gnuplot > set t i t l e ” Trajectory ” gnuplot > p l o t ” rk2 . dat ” using 2:3 with lines notit The results can be seen in figures 5.1 and 5.2. We note a small increase in the mechanical energy which is due to the accumulation of numerical errors. We can animate the trajectory by writing a script of gnuplot com- mands in a file rk2_animate.gpl 5.2. PROJECTILE MOTION 249 icount = icount+skip p l o t ”< c a t −n rk2 . dat ” \ using 3 : ( $1<= icount ? $4 : 1 / 0 ) with lines notitle # pause 1 i f ( icount < nlines ) r e r e a d Before calling the script, the user must set the values of the variables icount, skip and nlines. Each time gnuplot reads the script, it plots icount number of lines from rk2.dat. Then the script is read again and a new plot is made with skip lines more than the previous one, unless icount < nlines. The plotted “file” "<cat -n rk2.dat" is the standard output (stdout) of the command cat -n rk2.dat which prints to the stdout the contents of the file rk2.dat line by line, together with the line number. Therefore the plot command reads data which are the line number, the time, the coordinate x, the coordinate y etc. The keyword using in using 3 : ( $1<= icount ? $4 : 1 / 0 ) instructs the plot command to use the 3rd column on the horizontal axis and if the first column is less than icount ($1<= icount) put on the vertical axis the value of the 4th column if the first column is less than icount. Otherwise ($1 > icount) it prints an undefined number (1/0) which makes gnuplot print nothing at all. You may also uncomment the command pause if you want to make the animation slower. In order to run the script from gnuplot, issue the commands gnuplot > icount = 10 gnuplot > skip = 200 gnuplot > nlines = 20000 gnuplot > load ” rk2_animate . gpl ” The scripts shown above can be found in the accompanying software. More scripts can be found there that automate many of the boring pro- cedures. The usage of two of these is explained below. The first one is in the file rk2_animate.csh: > . / rk2_animate . csh −h Usage : rk2_animate . csh −t [ sleep time ] −d [ skip points ] <file > Default file is rk2 . dat Other options : −x : s e t lower value in xrange 250 CHAPTER 5. PLANAR MOTION −X : s e t lower value in xrange −y : s e t lower value in yrange −Y : s e t lower value in yrange −r : automatic determination of x−y range > . / rk2_animate . csh −r −d 500 rk2 . dat The last line is a command that animates a trajectory read from the file rk2.dat. Each animation frame contains 500 more points than the previous one. The option -r calculates the plot range automatically. The option -h prints a short help message. A more useful script is in the file rk2.csh. > . / rk2 . csh −h Usage : rk2 . csh −f <force > k1 k2 x10 x20 v10 v20 STEPS t0 tf Other Options : −n Do not animate trajectory Available forces ( value of <force >) : 1 : ax=−k1 ay= −k2 y Harmonic oscillator 2 : ax= 0 ay= −k1 Free fall 3 : ax= −k2 vx ay= −k2 vy − k1 Free fall + \ air resistance ~ v 4 : ax= −k2 | v | vx ay= −k2 | v | vy − k1 Free fall + \ air resistance ~ v^2 5 : ax= k1 * x1 / r^3 ay= k1 * x2 / r^3 Coulomb Force .... The option -h prints operating instructions. A menu of forces is available, and a choice can be made using the option -f. The rest of the command line consists of the parameters read by the program in rk2.f90, i.e. the coupling constants k1, k2, the initial conditions x10, x20, v10, v20 and the integration parameters STEPS, t0 and tf. For example, the commands > rk2 . csh -f 2 -- 10.0 0.0 0.0 0.0 1 . 0 1 . 0 20000 0.0 0.2 > rk2 . csh -f 1 -- 16.0 1 . 0 0.0 1 . 0 1 . 0 0.0 20000 0.0 6.29 > rk2 . csh -f 5 -- 10.0 0.0 -10 0.2 1 0 . 0.0 20000 0.0 3.00 compute the trajectory of a particle in the constant gravitational field discussed above, the trajectory of an anisotropic harmonic oscillator (k1 = ax = −ω12 x, k2 = ay = −ω22 y) and the scattering of a particle in a Coulomb field – try them! I hope that you will have enough curiosity to look “under the hood” of the scripts and try to modify them or create new ones. Some advise to the lazy guys: If you need to program your own force field follow the recipe: Write the code of your acceleration field 5.2. PROJECTILE MOTION 251 in a file named e.g. rk2_myforce.f90 as we did with rk2_g.f90. Edit the file rk2.csh and modify the line s e t forcecode = ( hoc g vg v2g cb ) to s e t forcecode = ( hoc g vg v2g cb myforce ) (the variable $forcecode may have more entries than the ones shown above). Count the order of the string myforce, which is 6 in our case. In order to access this force field from the command line, use the option -f 6: > rk2 . csh −f 6 −− . . . . . . . Now, we will study the effect of the air resistance on the motion of the projectile. For small velocities this is a force proportional to the velocity F⃗r = −mk⃗v , therefore ax = −kvx ay = −kvy − g . (5.4) By taking v0x ( ) x(t) = x0 + 1 − e−kt k 1( g)( ) g y(t) = y0 + v0y + 1 − e−kt − t k k k −kt vx (t) = v0x e ( g ) −kt g vy (t) = v0y + e − , (5.5) k k we obtain the motion of a particle with terminal velocity vy (+∞) = −g/k (x(+∞) = const., y(+∞) ∼ t). The acceleration caused by the air resistance is programmed in the file (k1 ↔ g, k2 ↔ k ) rk2_vg.f90: ! ======================================================== ! The a c c e l e r a t i o n f u n c t i o n s f3 , f 4 ( t , x1 , x2 , v1 , v2 ) provided ! by t h e u s e r ! ======================================================== 252 CHAPTER 5. PLANAR MOTION ! Free f a l l i n c o n s t a n t g r a v i t a t i o n a l f i l e d with ! ax = −k2 vx ay = −k2 vy − k1 r e a l ( 8 ) f u n c t i o n f3 ( t , x1 , x2 , v1 , v2 ) i m p l i c i t none r e a l ( 8 ) : : t , x1 , x2 , v1 , v2 real (8) : : k1 , k2 common / couplings / k1 , k2 f3=−k2 * v1 ! dx3 / dt=dv1 / dt=a1 end f u n c t i o n f3 !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− r e a l ( 8 ) f u n c t i o n f4 ( t , x1 , x2 , v1 , v2 ) i m p l i c i t none r e a l ( 8 ) : : t , x1 , x2 , v1 , v2 real (8) : : k1 , k2 common / couplings / k1 , k2 f4=−k2 * v2−k1 ! dx4 / dt=dv2 / dt=a2 end f u n c t i o n f4 The results are shown in figure 5.3 where we see the effect of an in- creasing air resistance on the particle trajectory. The effect of a resistance force of the form F⃗r = −mkv 2 v̂ is shown in figure 5.4. 1.4 0.0 0.0 0.05 0.2 0.2 1.0 1.2 1.0 5.0 5.0 0.04 10.0 1 10.0 20.0 20.0 30.0 0.8 30.0 0.03 y y 0.6 0.02 0.4 0.01 0.2 0 0 0 0.05 0.1 0.15 0.2 0 0.2 0.4 0.6 0.8 1 x x Figure 5.3: The trajectory of a projectile moving in a constant gravitational field ⃗g = −10 ŷ with air resistance causing acceleration ⃗ar = −k⃗v for k = 0, 0.2, 1, 5, 10, 20, 30. The left plot has ⃗v (0) = x̂ + ŷ and the right plot has ⃗v (0) = 5x̂ + 5ŷ. 5.3 Planetary Motion Consider the simple planetary model of a “sun” of mass M and a planet “earth” at distance r from the sun and mass m such that m ≪ M . Ac- cording to Newton’s law of gravity, the earth’s acceleration is GM GM ⃗a = ⃗g = − 2 r̂ = − 3 ⃗r , (5.6) r r 5.3. PLANETARY MOTION 253 1.4 0.0 0.0 0.05 0.2 0.2 1.0 1.2 1.0 5.0 5.0 0.04 10.0 1 10.0 20.0 20.0 30.0 0.8 30.0 0.03 y y 0.6 0.02 0.4 0.01 0.2 0 0 0 0.05 0.1 0.15 0.2 0 0.2 0.4 0.6 0.8 1 x x Figure 5.4: The trajectory of a projectile moving in a constant gravitational field ⃗g = −10 ŷ with air resistance causing acceleration ⃗ar = −kv 2 v̂ for k = 0, 0.2, 1, 5, 10, 20, 30. The left plot has ⃗v (0) = x̂ + ŷ and the right plot has ⃗v (0) = 5x̂ + 5ŷ. where G = 6.67 × 10−11 kgrm·sec2 , M = 1.99 × 1030 kgr, m = 5.99 × 1024 kgr. 3 When the hypothesis m ≪ M is not valid, the two body problem is reduced to that of the one body problem with the mass replaced by the reduced mass µ 1 1 1 = + . µ m M The force of gravity is a central force. This implies conservation of the angular momentum L ⃗ = ⃗r × p⃗ with respect to the center of the force, which in turn implies that the motion is confined on one plane. We choose the z axis so that ⃗ = Lz k̂ = m(xvy − yvx )k̂ . L (5.7) The force of gravity is conservative and the mechanical energy 1 GmM E = mv 2 − (5.8) 2 r is conserved. If we choose the origin of the coordinate axes to be the center of the force, the equations of motion (5.6) become GM ax = − x r3 GM ay = − 3 y, (5.9) r where r2 = x2 + y 2 . This is a system of two coupled differential equations for the functions x(t), y(t). The trajectories are conic sections which are either an ellipse (bound states - “planet”), a parabola (e.g. escape to 254 CHAPTER 5. PLANAR MOTION infinity when the particle starts moving with speed equal to the escape velocity) or a hyperbola (e.g. scattering). Kepler’s third law of planetary motion states that the orbital period T of a planet satisfies the equation 4π 2 3 T2 = a , (5.10) GM where a is the semi-major axis of the elliptical trajectory. The eccentricity is a measure of the deviation of the trajectory from being circular √ b2 e= 1− 2 , (5.11) a where b is the semi-minor axis. The eccentricity is 0 for the circle and tends to 1 as the ellipse becomes more and more elongated. The foci F1 and F2 are located at a distance ea from the center of the ellipse. They have the property that for every point on the ellipse P F1 + P F2 = 2a . (5.12) The acceleration given to the particle by Newton’s force of gravity is programmed in the file rk2_cb.f90: ! ======================================================== ! The a c c e l e r a t i o n f u n c t i o n s f3 , f 4 ( t , x1 , x2 , v1 , v2 ) provided ! by t h e u s e r ! ======================================================== ! Motion i n Coulombic p o t e n t i a l : ! ax= k1 * x1 / r ^3 ay= k1 * x2 / r ^3 r e a l ( 8 ) f u n c t i o n f3 ( t , x1 , x2 , v1 , v2 ) i m p l i c i t none r e a l ( 8 ) : : t , x1 , x2 , v1 , v2 real (8) : : k1 , k2 common / couplings / k1 , k2 r e a l ( 8 ) : : r2 , r3 r2=x1 * x1+x2 * x2 r3=r2 * s q r t ( r2 ) i f ( r3 . g t . 0 . 0 D0 ) then f3=k1 * x1 / r3 ! dx3 / dt=dv1 / dt=a1 else f3 =0.0 D0 endif end f u n c t i o n f3 !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− r e a l ( 8 ) f u n c t i o n f4 ( t , x1 , x2 , v1 , v2 ) 5.3. PLANETARY MOTION 255 i m p l i c i t none r e a l ( 8 ) : : t , x1 , x2 , v1 , v2 real (8) : : k1 , k2 common / couplings / k1 , k2 r e a l ( 8 ) : : r2 , r3 r2=x1 * x1+x2 * x2 r3=r2 * s q r t ( r2 ) i f ( r3 . g t . 0 . 0 D0 ) then f4=k1 * x2 / r3 ! dx4 / dt=dv2 / dt=a2 else f4 =0.0 D0 endif end f u n c t i o n f4 !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− r e a l ( 8 ) f u n c t i o n energy ( t , x1 , x2 , v1 , v2 ) i m p l i c i t none r e a l ( 8 ) : : t , x1 , x2 , v1 , v2 real (8) : : k1 , k2 common / couplings / k1 , k2 real (8) : : r r= s q r t ( x1 * x1+x2 * x2 ) i f ( r . g t . 0.0 D0 ) then energy = 0.5 D0 * ( v1 * v1+v2 * v2 ) + k1 / r else energy = 0.0 D0 endif end f u n c t i o n energy We set k1= −GM and take special care to avoid hitting the center of the force, the singular point at (0, 0). The same code can be used for the electrostatic Coulomb field with k1= qQ/4πϵ0 m. At first we study trajectories which are bounded. We set GM = 10, x(0) = 1.0, y(0) = 0, v0x = 0 and vary v0y . We measure the period T and the length of the semi axes of the resulting ellipse. The results can be found in table 5.1. Some of the trajectories are shown in figure 5.5. There we can see the dependence of the size of the ellipse on the period. Figure 5.6 confirms Kepler’s third law of planetary motion given by equation (5.10). In order to confirm Kepler’s third law of planetary motion numeri- cally, we take the logarithm of both sides of equation (5.10) ( 2) 3 1 4π ln T = ln a + ln . (5.13) 2 2 GM Therefore, the points (ln a, ln T ) lie on a straight line. Using a linear least squares fit we calculate the slope and the intercept which should be equal to 32 and 1/2 ln (4π 2 /GM ) respectively. This is left as an exercise. 256 CHAPTER 5. PLANAR MOTION v0x T /2 2a 3.2 1.030 2.049 3.4 1.281 2.370 3.6 1.682 2.841 3.8 2.396 3.597 4.0 3.927 5.000 4.1 5.514 6.270 4.2 8.665 8.475 4.3 16.931 13.245 4.3 28.088 18.561 4.38 42.652 24.522 4.40 61.359 31.250 4.42 99.526 43.141 Table 5.1: The results for the period T and the length of the semi-major axis a of the trajectory of planetary motion for GM = 10, x(0) = 1.0, y(0) = 0, v0y = 0. In the case where the initial velocity of the particle becomes larger than the escape velocity ve , the particle escapes from the influence of the gravitational field to infinity. The escape velocity corresponds to zero mechanical energy, which gives 2GM ve2 = . (5.14) r When GM = 10, x(0) = 1.0, y(0) = 0, we obtain ve ≈ 4.4721 . . .. The numerical calculation of ve is left as an exercise. 5.4 Scattering In this section we consider scattering of particles from a central potential¹. We assume particles that follow unbounded trajectories that start from infinity and move almost free from the influence of the force field towards its center. When they approach the region of interaction they get deflected and get off to infinity in a new direction. We say that the particles have been scattered and that the angle between their original and final direction is the scattering angle θ. Scattering problems are interesting because we can infer to the properties of the scattering potential from the distribution of the scattering angle. This approach is heavily used in today’s particle ¹We refer the reader to [38], chapter 4. 5.4. SCATTERING 257 8 1.68 6 2.40 3.93 4 5.52 16.95 2 0 y -2 -4 -6 -8 -14 -12 -10 -8 -6 -4 -2 0 2 x Figure 5.5: Planetary trajectories for GM = 10, x(0) = 1.0, y(0) = 0, v0y = 0 and v0x = 3.6, 3.8, 4.0, 4.1, 4.3. The numbers are the corresponding half periods. accelerators for the study of fundamental interactions between elementary particles. First we will discuss scattering of small hard spheres of radius r1 by other hard spheres or radius R2 . The interaction potential² is given by { 0 r > R2 + r1 V (r) = , (5.15) ∞ r < R2 + r1 where r is the distance between the center of r1 from the center of R2 . Assume that the particles in the beam do not interact with each other and that there is only one collision per scattering. Let J be the intensity of the beam³ and A its cross sectional area. Assume that the target has n particles per unit area. The cross sectional area of the interaction is σ = π(r1 + R2 )2 where r1 and R2 are the radii of the scattered particles and targets respectively (see figure (5.8)): All the spheres of the beam which lie outside this area are not scattered by the particular target. The ²The so called hard core potential. ³The number of particles crossing a surface perpendicular to the beam per unit time and unit area. 258 CHAPTER 5. PLANAR MOTION 100000 10000 1000 T2 100 10 1 1 10 100 1000 10000 3 a Figure 5.6: Kepler’s third law of planetary motion for GM = 10. The points are the measurements taken from table 5.1. The solid line is the known analytic solution (5.10). total interaction cross section is Σ = nAσ, (5.16) where nA is the total number of target spheres which lie within the beam. On the average, the scattering rate is N = JΣ = JnAσ . (5.17) The above equation is the definition of the total scattering cross section σ of the interaction. The differential cross section σ(θ) is defined by the relation dN = JnAσ(θ) dΩ , (5.18) where dN is the number of particles per unit time scattered within the solid angle dΩ. The total cross section is ∫ ∫ ∫ σtot = σ(θ) dΩ = σ(θ) sin θ dθdϕ = 2π σ(θ) sin θ dθ . (5.19) Ω 5.4. SCATTERING 259 1 0.8 0.6 0.4 0.2 y 0 -0.2 -0.4 -0.6 -0.8 -0.6 -0.4 -0.2 0 0.2 0.4 0.6 0.8 1 x Figure 5.7: The spiral orbit of a particle moving under the influence of a central force F = −k/r r̂. ⃗ 3 In the last relation we used the cylindrical symmetry of the interaction with respect to the axis of the collision. Therefore 1 dN σ(θ) = . (5.20) nAJ 2π sin θ dθ This relation can be used in experiments for the measurement of the differential cross section by measuring the rate of detection of particles within the space contained in between two cones defined by the angles θ and θ + dθ. This is the relation that we will use in the numerical calculation of σ(θ). Generally, in order to calculate the differential cross section we shoot a particle at a target as shown in figure 5.9. The scattering angle θ depends on the impact parameter b. The part of the beam crossing the ring of radius b(θ), thickness db and area 2πb db is scattered in angles between θ and θ + dθ. Since there is only one particle at the target we have that nA = 1. The number of particles per unit time crossing the ring is J2πb db, therefore 2πb(θ) db = −2πσ(θ) sin θ dθ (5.21) 260 CHAPTER 5. PLANAR MOTION 11 00 11 00 11 00 11 00 θ 11 00 11 00 11 00 11 1111111 0000000 00 11 00 11 00 11 1111111 0000000 00 11 00 00 11 00 11 1111111 0000000 11 00 00 11 00 11 1111111 0000000 11 00 1111111 0000000 1111111 0000000 1111111 0000000 R2 11 00 11 00 11 00 1111111 0000000 11 00 1111111 0000000 11 00 1111111 0000000 11 00 1111111 0000000 11 00 r1 11 00 11 00 11 00 1111111 0000000 11 00 1111111 0000000 11 00 11 00 11 00 11 00 11 00 R+r 2 1 11 00 11 00 11 00 11 00 σ 11 00 11 00 11 00 11 00 00 11 00 11 00 11 00 11 00 11 00 11 00 11 00 11 00 11 Figure 5.8: Scattering of hard spheres. The scattering angle is θ. The cross sectional area σ is shown to the right. (the − sign is because as b increases, θ decreases). From the potential we can calculate b(θ) and from b(θ) we can calculate σ(θ). Conversely, if we measure σ(θ), we can calculate b(θ). 5.4.1 Rutherford Scattering The scattering of a charged particle with charge q (“electron”) in a Coulomb potential of a much heavier charge Q (“nucleus”) is called Rutherford scattering. In this case, the interaction potential is given by 1 Q V (r) = , (5.22) 4πϵ0 r which accelerates the particle with acceleration qQ r̂ ⃗r ⃗a = ≡ α . (5.23) 4πϵ0 m r2 r3 The energy of the particle is E = 12 mv 2 and the magnitude of its angular momentum is l = mvb, where v ≡ |⃗v |. The dependence of the impact parameter on the scattering angle is [38] α θ b(θ) = 2 cot . (5.24) v 2 5.4. SCATTERING 261 vf vi b 111 000 111 000 θ 111 000 111 000 111 000 db Figure 5.9: Beam particles passing through the ring 2πbdb are scattered within the solid angle dΩ = 2πsinθ dθ. Using equation (5.21) we obtain α2 1 θ σ(θ) = 4 sin−4 . (5.25) 4 v 2 Consider the scattering trajectories. The results for same charges are shown in figure 5.10. A similar figure is obtained in the case of opposite charges. In the latter case we have to take special care for small impact parameters b < 0.2 where the scattering angle is ≈ 1. A large number of integration steps is needed in order to obtain the desired accuracy. A useful monitor of the accuracy of the calculation is the measurement of the energy of the particle which should be conserved. The results are shown in table 5.2. We will now describe a method for calculating the cross section by using equation (5.20). Alternatively we could have used equation (5.21) and perform a numerical calculation of the derivatives. This is left as an exercise for the reader. Our calculation is more like an experiment. We place a “detector” that “detects” particles scattered within angles θ and θ+δθ. For this reason we split the interval [0, π] in Nb bins so that δθ = π/Nb . We perform “scattering experiments” by varying b ∈ [bm , bM ] with step δb. Due to the symmetry of the problem we fix ϕ to be a constant, therefore a given θ corresponds to a cone with an opening angle θ and an apex at the center of scattering. For given b we measure the scattering angle θ and record the number of particles per unit time δN ∝ bδb. The latter is proportional to the area of the ring of radius b. All we need now is the beam ∑ intensity J which is the total number of particles per unit time J ∝ i bδb (note than in the ratio δN /J the 262 CHAPTER 5. PLANAR MOTION 40 35 30 25 20 15 10 5 0 -20 -15 -10 -5 0 5 10 15 20 Figure 5.10: Rutherford scattering trajectories. We set k1 ≡ qQ = 1 (see code in 4πϵ0 m the file rk2_cb.f90) and b = 0.08, 0.015, 0.020, 0.035, 0.080, 0.120, 0.200, 0.240, 0.320, 0.450, 0.600, 1.500. The initial position of the particle is at x(0) = −50 and its initial velocity is v = 3 in the x direction. The number of integration steps is 1000, the initial time is 0 and the final time is 30. proportionality constant and δb cancel) and the solid angle 2π sin(θ) δθ. Finally we can easily use equation (5.19) in order to calculate the total cross section σtot . The program that performs this calculation is in the file scatter.f90 and it is a simple modification of the program in rk2.f90: ! ======================================================== ! Program t h a t computes s c a t t e r i n g c r o s s −s e c t i o n o f a c e n t r a l ! f o r c e on t h e plane . The u s e r should f i r s t check t h a t t h e ! parameters used , l e a d t o a f r e e s t a t e i n t h e end . ! * * X20 i s t h e impact parameter b * * !A 4 ODE system i s s o l v e d using Runge−Kutta Method ! User must supply d e r i v a t i v e s ! dx1 / dt= f 1 ( t , x1 , x2 , x3 , x4 ) dx2 / dt=f 2 ( t , x1 , x2 , x3 , x4 ) ! dx3 / dt=f 3 ( t , x1 , x2 , x3 , x4 ) dx4 / dt=f 4 ( t , x1 , x2 , x3 , x4 ) ! as r e a l ( 8 ) f u n c t i o n s ! Output i s w r i t t e n i n f i l e s c a t t e r . dat ! ======================================================== program scatter_cross_section i m p l i c i t none 5.4. SCATTERING 263 b θn θa ∆E/E Nt 0.008 2.9975 2.9978 2.8 10−9 5000 0.020 2.7846 2.7854 2.7 10−9 5000 0.030 2.6131 2.6142 2.5 10−9 5000 0.043 2.4016 2.4031 2.3 10−9 5000 0.056 2.2061 2.2079 2.0 10−9 5000 0.070 2.0152 2.0172 1.7 10−9 5000 0.089 1.7887 1.7909 1.4 10−9 5000 0.110 1.5786 1.5808 1.0 10−9 5000 0.130 1.4122 1.4144 0.8 10−9 5000 0.160 1.2119 1.2140 0.5 10−9 5000 0.200 1.0123 1.0142 0.3 10−9 5000 0.260 0.8061 0.8077 0.1 10−9 5000 0.360 0.5975 0.5987 2.9 10−11 5000 0.560 0.3909 0.3917 0.3 10−11 5000 1.160 0.1905 0.1910 5.3 10−14 5000 Table 5.2: Scattering angles of Rutherford scattering. We set k1 ≡ qQ = 1 (see file 4πϵ0 m rk2_cb.f90) and study the resulting trajectories for the values of b shown in column 1. θn is the numerically calculated scattering angle and θa is the one calculated from equation (5.24). The ratio ∆E/E shows the change in the particle’s energy due to numerical errors. The last column is the number of integration steps. The particle’s initial position is at x(0) = −50 and initial velocity ⃗v = 3x̂. i n t e g e r , parameter : : P=1010000 r e a l ( 8 ) , dimension ( P ) : : T , X1 , X2 , V1 , V2 r e a l ( 8 ) : : Ti , Tf , X10 , X20 , V10 , V20 r e a l ( 8 ) : : X20F , dX20 ! max impact parameter and s t e p i n t e g e r : : Nt integer : : i real (8) : : k1 , k2 common / couplings / k1 , k2 i n t e g e r , parameter : : Nbins=20 i n t e g e r : : index r e a l ( 8 ) : : angle , bins ( Nbins ) , Npart r e a l ( 8 ) , parameter : : PI =3.14159265358979324 D0 r e a l ( 8 ) , parameter : : rad2deg =180.0 D0 / PI r e a l ( 8 ) , parameter : : dangle =PI / Nbins r e a l ( 8 ) R , density , dOmega , sigma , sigmatot ! Input : p r i n t * , ’ Runge−Kutta Method f o r 4−ODEs I n t e g r a t i o n ’ p r i n t * , ’ Enter c o u p l i n g c o n s t a n t s : ’ read * , k1 , k2 p r i n t * , ’ k1= ’ , k1 , ’ k2= ’ , k2 264 CHAPTER 5. PLANAR MOTION b θn θa ∆E/E STEPS 0.020 2.793 2.785 0.02 1 000 000 0.030 2.620 2.614 8.2 10−3 300 000 0.043 2.405 2.403 7.2 10−4 150 000 0.070 2.019 2.017 3.2 10−7 150 000 0.089 1.793 1.791 8.2 10−7 60 000 0.110 1.583 1.581 1.2 10−6 30 000 0.130 1.417 1.414 9.4 10−7 20 000 0.160 1.216 1.214 6.0 10−5 5 000 0.200 1.016 1.014 4.1 10−6 5 000 0.260 0.8093 0.8077 2.2 10−7 5 000 0.360 0.6000 0.5987 7.6 10−9 5 000 0.560 0.3926 0.3917 1.2 10−10 5 000 1.160 0.1913 0.1910 2.9 10−13 5 000 Table 5.3: Rutherford scattering of opposite charges with = −1. The table is qQ 4πϵ0 m similar to table 5.2. We observe the numerical difficulty for small impact parameters. print *, ’ Enter Nt , Ti , Tf , X10 , X20 , V10 , V20 : ’ read *, Nt , Ti , TF , X10 , X20 , V10 , V20 print *, ’ Enter f i n a l impact parameter X20F and s t e p dX20 : ’ read *, X20F , dX20 print *, ’ Nt = ’ , Nt print *, ’ Time : I n i t i a l Ti = ’ , Ti , ’ F i n a l Tf= ’ , Tf print *, ’ X1( Ti )= ’ , X10 , ’ X2( Ti )= ’ , X20 print *, ’ V1 ( Ti )= ’ , V10 , ’ V2( Ti )= ’ , V20 print *, ’ Impact par X20F = ’ , X20F , ’ dX20 = ’ , dX20 open ( u n i t =11 , f i l e = ’ s c a t t e r . dat ’ ) bins = 0.0 d0 ! The C a l c u l a t i o n : Npart = 0.0 D0 X20 = X20 + dX20 / 2 . 0 D0 ! s t a r t s i n middle o f f i r s t i n t e r v a l do while ( X20 . l t . X20F ) c a l l RK ( T , X1 , X2 , V1 , V2 , Ti , Tf , X10 , X20 , V10 , V20 , Nt ) ! Take a b s o l u t e v a l u e due t o symmetry : angle = DABS ( atan2 ( V2 ( Nt ) , V1 ( Nt ) ) ) ! Output : The f i n a l a n g l e . Check i f almost c o n s t a n t w r i t e ( 1 1 , * ) ’@ ’ , X20 , angle ,& DABS ( atan2 ( V2 ( Nt−50) , V1 ( Nt−50) ) ) ,& k1 / V10 * * 2 / tan ( angle / 2 . 0 D0 ) ! Update histogram : index = i n t ( angle / dangle ) +1 ! Number o f incoming p a r t i c l e s per u n i t time 5.4. SCATTERING 265 100 10 1 σ(θ) 0.1 0.01 0.001 0 0.5 1 1.5 2 2.5 3 θ Figure 5.11: Differential cross section of the Rutherford scattering. The solid line qQ is the function (5.25) for α = 1, v = 3. We set 4πϵ 0m = 1. The particle’s initial position is x(0) = −50 and its initial velocity is ⃗v = 3x̂. We used 5000 integration steps, initial time equal to 0 and final time equal to 30. The impact parameter varies between 0.02 and 1 with step equal to 0.0002. ! i s proportional to radius of ring ! o f r a d i u s X20 , t h e impact parameter : ! db i s c a n c e l l e d from d e n s i t y bins ( index ) = bins ( index ) + X20 Npart = Npart + X20 !<−− i . e . from here X20 = X20 + dX20 enddo ! Print scattering cross section : R = X20 ! beam r a d i u s density = Npart / ( PI * R * R ) ! beam f l u x d e n s i t y J sigmatot = 0.0 D0 ! t o t a l cross section do i =1 , Nbins angle = ( i−0.5D0 ) * dangle dOmega = 2.0 D0 * PI * s i n ( angle ) * dangle ! d ( S o l i d Angle ) sigma = bins ( i ) / ( density * dOmega ) i f ( sigma . g t . 0 . 0 D0 ) w r i t e ( 1 1 , * ) ’ ds= ’ ,& angle , angle * rad2deg , sigma sigmatot = sigmatot + sigma * dOmega enddo w r i t e ( 1 1 , * ) ’ s i g m a t o t= ’ , sigmatot 266 CHAPTER 5. PLANAR MOTION 10 1 σ(θ) 0.1 0.01 0.001 1 10 100 1000 -4 sin (θ/2) Figure 5.12: Differential cross section of the Rutherford scattering like in figure 5.11. The solid line is the function 1/(4 × 34 )x from which we can deduce the functional form of σ(θ). close (11) end program scatter_cross_section The results are recorded in the file scatter.dat. An example session that reproduces figures 5.11 and 5.12 is > g f o r t r a n scatter . f90 rk2_cb . f90 −o scatter > . / scatter Runge−Kutta Method for 4−ODEs Integration Enter coupling constants : 1 . 0 0.0 k1= 1.00000 k2= 0.00000 Enter Nt , Ti , Tf , X10 , X20 , V10 , V20 : 5000 0 30 −50 0.02 3 0 Enter final impact parameter X20F and step dX20 : 1 0.0002 Nt= 5000 Time : Initial T0 = 0.00000 Final TF= 30.00000 X1 ( T0 )= −50.00000 X2 ( T0 )= 2.00000E−002 V1 ( T0 )= 3.00000 V2 ( T0 )= 0.00000 Impact par X20F = 1.00000 dX20 = 2.00000E−004 5.4. SCATTERING 267 The results can be plotted with the gnuplot commands: gnuplot > s e t l o g gnuplot > p l o t [ : 1 0 0 0 ] ”<grep ds= s c a t t e r . dat ” \ u ( ( s i n ( $2 / 2 ) ) **( −4) ) : ( $4 ) notit , \ ( 1 . / ( 4 . * 3 . * * 4 ) ) * x notit gnuplot > unset l o g gnuplot > s e t l o g y gnuplot > p l o t [ : ] ”<grep ds= s c a t t e r . dat ” u 2:4 notit , \ ( 1 . / ( 4 . * 3 . * * 4 ) ) * ( s i n ( x / 2 ) ) **( −4) notit The results are in a very good agreement with the theoretical ones given by (5.25). The next step will be to study other central potentials whose solution is not known analytically. 5.4.2 More Scattering Potentials Consider scattering from a force field { 1 − r r≤a F⃗ = f (r) r̂ , f (r) = r2 a3 . (5.26) 0 r>a This is a very simple classical model of the scattering of a positron e+ by the hydrogen atom. The positron has positive charge +e and the hydrogen atom consists of a positively charged proton with charge +e in an electron cloud of opposite charge −e. We set the scales so that me+ = 1 and e2 /4πϵ0 = 1. We will perform a numerical calculation of b(θ), σ(θ) and σtot . The potential energy is given by dV (r) 1 r2 3 f (r) = − ⇒ V (r) = + 2 − . (5.27) dr r 2a 2a where V (r) = 0 for r ≥ a. The program containing the calculation of the acceleration caused by this force can be found in the file rk_hy.f90: ! ======================================================== ! The a c c e l e r a t i o n f u n c t i o n s f3 , f 4 ( t , x1 , x2 , v1 , v2 ) provided ! by t h e u s e r ! ======================================================== ! Motion i n hydrogen atom + p o s i t r o n : ! f ( r ) = 1 / r^2−r / k1^3 ! ax= f ( r ) * x1 / r ay= f ( r ) * x2 / r r e a l ( 8 ) f u n c t i o n f3 ( t , x1 , x2 , v1 , v2 ) 268 CHAPTER 5. PLANAR MOTION i m p l i c i t none r e a l ( 8 ) : : t , x1 , x2 , v1 , v2 real (8) : : k1 , k2 common / couplings / k1 , k2 r e a l ( 8 ) : : r2 , r , fr r2=x1 * x1+x2 * x2 r = s q r t ( r2 ) i f ( r . l e . k1 . and . r2 . g t . 0 . 0 D0 ) then fr = 1 / r2−r / k1 * * 3 else fr = 0.0 D0 endif i f ( fr . g t . 0 . 0 D0 . and . r . g t . 0 . 0 D0 ) then f3=fr * x1 / r ! dx3 / dt=dv1 / dt=a1 else f3 =0.0 D0 endif end f u n c t i o n f3 !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− r e a l ( 8 ) f u n c t i o n f4 ( t , x1 , x2 , v1 , v2 ) i m p l i c i t none r e a l ( 8 ) : : t , x1 , x2 , v1 , v2 real (8) : : k1 , k2 common / couplings / k1 , k2 r e a l ( 8 ) : : r2 , r , fr r2=x1 * x1+x2 * x2 r = s q r t ( r2 ) i f ( r . l e . k1 . and . r2 . g t . 0 . 0 D0 ) then fr = 1 / r2−r / k1 * * 3 else fr = 0.0 D0 endif i f ( fr . g t . 0 . 0 D0 . and . r . g t . 0 . 0 D0 ) then f4=fr * x2 / r ! dx3 / dt=dv1 / dt=a1 else f4 =0.0 D0 endif end f u n c t i o n f4 !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− r e a l ( 8 ) f u n c t i o n energy ( t , x1 , x2 , v1 , v2 ) i m p l i c i t none r e a l ( 8 ) : : t , x1 , x2 , v1 , v2 real (8) : : k1 , k2 common / couplings / k1 , k2 r e a l ( 8 ) : : r , Vr r= s q r t ( x1 * x1+x2 * x2 ) i f ( r . l e . k1 . and . r . g t . 0 . 0 D0 ) then 5.4. SCATTERING 269 Vr = 1 / r + 0.5 D0 * r * r / k1 * * 3 − 1 . 5 D0 / k1 else Vr = 0.0 D0 endif energy = 0.5 D0 * ( v1 * v1+v2 * v2 ) + Vr end f u n c t i o n energy The results are shown in figures 5.13–5.14. We find that σtot = πa2 (see problem 5.10). 3.5 2.0 1.5 3 1.0 0.5 2.5 0.25 0.125 2 θ 1.5 1 0.5 0 0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1 b Figure 5.13: The impact parameter b(θ) for the potential given by equation (5.27) for different values of the initial velocity v. We set a = 1, x(0) = −5 and made 4000 integration steps from ti = 0 to tf = 40. Another interesting dynamical field is given by the Yukawa potential. This is a phenomenological model of nuclear interactions: e−r/a V (r) = k . (5.28) r This field can also be used as a model of the effective interaction of electrons in metals (Thomas–Fermi) or as the Debye potential in a classic plasma. The resulting force is e−r/a ( r) F⃗ (r) = f (r) r̂ , f (r) = k 1 + (5.29) r2 a 270 CHAPTER 5. PLANAR MOTION 100 2.0 1.5 1.0 10 0.5 0.25 0.125 σ(θ) 1 0.1 0.01 0 0.5 1 1.5 2 2.5 3 3.5 θ Figure 5.14: The function σ(θ) for the potential given by equation (5.27) for different values of the initial velocity v. We set a = 1, x(0) = −5 and the integration is performed by making 4000 steps from ti = 0 to tf = 40. The program of the resulting acceleration can be found in the file rk2_yu.f90. The results are shown in figures 5.15–5.16. 5.5 More Particles In this section we will generalize the discussion of the previous para- graphs in the case of a dynamical system with more degrees of freedom. The number of dynamical equations that need to be solved depends on the number of degrees of freedom and we have to write a program that implements the 4th order Runge–Kutta method for an arbitrary number of equations NEQ. We will explain how to allocate memory dynamically, in which case the necessary memory storage space, which depends on NEQ, is allocated at the time of running the program and not at compilation time. Until now, memory has been allocated statically. This means that arrays have sizes which are known at compile time. For example, in the program rk2.f90 the integer parameter P had a given value which determined the size of all arrays using the declarations: 5.5. MORE PARTICLES 271 10 yu v= 4.0 cb v= 4.0 yu v=15.0 1 cb v=15.0 0.1 θ 0.01 0.001 1e-04 0 0.5 1 1.5 2 2.5 3 b Figure 5.15: The function b(θ) for the Yukawa scattering for several values of the initial velocity v. We set a = 1, k = 1, x(0) = −50 and the integration is performed with 5000 steps from ti = 0 to tf = 30. The lines marked as cb are equation (5.24) of the Rutherford scattering. i n t e g e r , parameter : : P=1010000 r e a l ( 8 ) , dimension ( P ) : : T , X1 , X2 , V1 , V2 Changing P after compilation is impossible and if this becomes necessary we have to edit the file, change the value of P and recompile. Dynamical memory allocation allows us to read in Nt and NEQ at execution time and then ask from the operating system to allocate the necessary memory. All we have to do is to declare the shape of the arrays (i.e. how many indices they take) and give them the allocatable attribute. The needed memory can be asked for at execution time by calling the function ALLOCATE. Here is an example: integer Nt , NEQ real (8) , allocatable :: T (:) ! Rank−1 a r r a y real (8) , a l l o c a t a b l e : : X ( : , : ) ! Rank−2 a r r a y real (8) , a l l o c a t a b l e : : X0 ( : ) ! Rank−1 a r r a y read * , Nt 272 CHAPTER 5. PLANAR MOTION 10 0.25 0.5 1 1.0 1.5 0.1 2.0 0.01 θ 0.001 1e-04 1e-05 1e-06 0 0.5 1 1.5 2 2.5 3 b Figure 5.16: The function b(θ) for the Yukawa scattering for several values of the range a of the force. We set v = 4.0, k = 1, x(0) = −50 and the integration is performed with 5000 steps from ti = 0 to tf = 30. c a l l finit ( NEQ ) a l l o c a t e ( X0 ( NEQ ) ) a l l o c a t e ( T ( Nt ) ) a l l o c a t e ( X ( Nt , NEQ ) ) ... ( compute with X0 , T , X ) ... d e a l l o c a t e ( X0 ) deallocate (X ) deallocate (T ) ( X0 , T , X are not usable anymore ) ... .................... s u b r o u t i n e finit ( NEQ ) NEQ = 4 end s u b r o u t i n e finit In this program the arrays have the allocatable attribute and for each : they have an extra index. Therefore the arrays T,X0 are rank-1 arrays and have only one index, whereas the array X is a rank-2 array and has two indices. The user enters the value of Nt and the subroutine finit 5.5. MORE PARTICLES 273 sets the value of NEQ. The calls to the function ALLOCATE allocate the nec- essary memory⁴. If memory allocation is successful, then the arrays can be used in the same way as the statically allocated ones. When allocatable arrays are not necessary anymore we should make a call to the function DEALLOCATE which returns the unused memory back to the system. Oth- erwise our program might suffer from “memory leaks” if e.g. the memory is repeatedly asked in a loop that calls a function that allocates memory without deallocating it in the end. Dynamical memory allocation is very convenient but for high performance computing static allocation might be preferable so that the compiler performs a more efficient optimization. The main program will be written in the file rkA.f90, whereas the force-dependent part of the code will be written in files with names of the form rkA_XXX.f90. In the latter, the user must program a subrou- tine f(t,X,dXdt) which takes as input the time t and the values of the functions X(NEQ) and outputs the values of their derivatives dXdt(NEQ) at time t. The function finit(NEQ) sets the number of functions in f and it is called once during the initialization phase of the program. The program in the file rkA.f90⁵ is listed below: ! ======================================================== ! Program t o s o l v e an ODE system using t h e ! 4 th order Runge−Kutta Method !NEQ: Number o f e q u a t i o n s ! User s u p p l i e s two s u b r o u t i n e s : ! f ( t , x , xdot ) : with r e a l ( 8 ) : : t , x (NEQ) , xdot (NEQ) which ! giv en t h e time t and c u r r e n t v a l u e s o f f u n c t i o n s x (NEQ) ! i t r e t u r n s t h e v a l u e s o f d e r i v a t i v e s : xdot = dx / dt ! The v a l u e s o f two c o u p l i n g c o n s t a n t s k1 , k2 may be used ! i n f which a r e read i n t h e main program and s t o r e d i n ! common / c o u p l i n g s / k1 , k2 ! f i n i t (NEQ) : s e t s t h e v a l u e o f NEQ ! ! User I n t e r f a c e : ! k1 , k2 : r e a l ( 8 ) c o u p l i n g c o n s t a n t s ! Nt , Ti , Tf : Nt−1 i n t e g r a t i o n s t e p s , i n i t i a l / f i n a l time ! X0 : r e a l ( 8 ) , dimension (NEQ) : i n i t i a l c o n d i t i o n s ! Output : ⁴We assume that Nt, NEQ are positive and small enough so that the requested memory is available. It is better to use the call allocate(T(Nt),STAT=IERR). The non zero value of IERR after the call indicates a successful allocation and the following test stops the program otherwise: IF(IERR .eq. 0) STOP 'Memory allocation for T failed' ⁵In the accompanying software you will find the files rkN.f90 and rkN_XXX.f90 which show you how to write the same program using static memory allocation. 274 CHAPTER 5. PLANAR MOTION ! rkA . dat with Nt l i n e s c o n s i s t i n g o f : T( Nt ) ,X( Nt ,NEQ) ! ======================================================== program rk2_solve i m p l i c i t none real (8) , a l l o c a t a b l e : : T ( : ) real (8) , a l l o c a t a b l e : : X ( : , : ) r e a l ( 8 ) , a l l o c a t a b l e : : X0 ( : ) r e a l ( 8 ) : : Ti , Tf i n t e g e r : : Nt , NEQ , i real (8) : : k1 , k2 common / couplings / k1 , k2 !We need e x p l i c i t i n t e r f a c e , s i n c e energy has ! assumed−shape a r r a y s as arguments . INTERFACE r e a l ( 8 ) f u n c t i o n energy ( t_intrf , x_intrf ) i m p l i c i t none r e a l ( 8 ) : : t_intrf , x_intrf ( : ) end f u n c t i o n energy END INTERFACE ! Input : p r i n t * , ’ Runge−Kutta Method f o r ODE I n t e g r a t i o n . ’ ! Get t h e number o f e q u a t i o n s : c a l l finit ( NEQ ) ; a l l o c a t e ( X0 ( NEQ ) ) p r i n t * , ’NEQ= ’ , NEQ p r i n t * , ’ Enter c o u p l i n g c o n s t a n t s : ’ read * , k1 , k2 p r i n t * , ’ k1= ’ , k1 , ’ k2= ’ , k2 p r i n t * , ’ Enter Nt , Ti , Tf , X0 : ’ read * , Nt , Ti , TF , X0 p r i n t * , ’ Nt = ’ , Nt p r i n t * , ’ Time : I n i t i a l Ti = ’ , Ti , ’ F i n a l Tf= ’ , Tf p r i n t ’ (A,2000G28 . 1 6 ) ’ , ’ X0 = ’ , X0 a l l o c a t e ( T ( Nt ) ) ; a l l o c a t e ( X ( Nt , NEQ ) ) ! The C a l c u l a t i o n : c a l l RK ( T , X , Ti , Tf , X0 , Nt , NEQ ) ! Output : open ( u n i t =11 , f i l e = ’ rkA . dat ’ ) do i =1 , Nt w r i t e ( 1 1 , ’ (2000G28 . 1 6 ) ’ ) T ( i ) , X ( i , : ) ,& energy ( T ( i ) , X ( i , : ) ) enddo close (11) end program rk2_solve ! ======================================================== ! D r i v e r o f t h e RKSTEP r o u t i n e ! ======================================================== s u b r o u t i n e RK ( T , X , Ti , Tf , X0 , Nt , NEQ ) i m p l i c i t none i n t e g e r : : Nt , NEQ 5.5. MORE PARTICLES 275 r e a l ( 8 ) , dimension ( Nt ) :: T r e a l ( 8 ) , dimension ( Nt , NEQ ) : : X r e a l ( 8 ) , dimension ( NEQ ) : : X0 r e a l ( 8 ) : : Ti , Tf r e a l ( 8 ) : : dt r e a l ( 8 ) : : TS , XS ( NEQ ) ! v a l u e s o f time and X a t gi v e n s t e p integer : : i ! I n i t i a l i z e variables : dt = ( Tf−Ti ) / ( Nt −1) T ( 1 ) = Ti X ( 1 , : ) = X0 TS = Ti XS = X0 ! Make RK s t e p s : The arguments o f RKSTEP a r e ! r e p l a c e d with t h e new ones do i =2 , Nt c a l l RKSTEP ( TS , XS , dt , NEQ ) T ( i ) = TS X ( i , : ) = XS enddo end s u b r o u t i n e RK ! ======================================================== ! S u b r o u t i n e RKSTEP( t , X, dt ) ! Runge−Kutta I n t e g r a t i o n r o u t i n e o f ODE ! ======================================================== s u b r o u t i n e RKSTEP ( t , x , dt , NEQ ) i m p l i c i t none i n t e g e r : : NEQ r e a l ( 8 ) , dimension ( NEQ ) : : x r e a l ( 8 ) : : t , dt , tt r e a l ( 8 ) , dimension ( NEQ ) : : k1 , k2 , k3 , k4 , xx r e a l ( 8 ) : : h , h2 , h6 !We need e x p l i c i t i n t e r f a c e , s i n c e f has assumed−shape ! a r r a y s as arguments . INTERFACE s u b r o u t i n e f ( t_intrf , x_intrf , xdot_intrf ) i m p l i c i t none r e a l ( 8 ) : : t_intrf r e a l ( 8 ) , dimension ( : ) : : x_intrf , xdot_intrf end s u b r o u t i n e f END INTERFACE h =dt ! h =dt , i n t e g r a t i o n s t e p h2 =0.5 D0 * h ! h2=h / 2 h6=h / 6 . 0 D0 ! h6=h / 6 c a l l f ( t , x , k1 ) ; xx = x + h2 * k1 ; tt =t+h2 c a l l f ( tt , xx , k2 ) ; xx = x + h2 * k2 ; tt =t+h2 c a l l f ( tt , xx , k3 ) ; xx = x + h * k3 ; tt =t+h 276 CHAPTER 5. PLANAR MOTION c a l l f ( tt , xx , k4 ) t =t+h x =x +h6 * ( k1 +2.0 D0 * ( k2+k3 )+k4 ) end s u b r o u t i n e RKSTEP Note the use of array sections: w r i t e ( 1 1 , ’ (2000G28 . 1 6 ) ’ ) T ( i ) , X ( i , : ) X ( 1 , : ) = X0 X ( i , : ) = XS The expression X (1,:) refers to the first row of the array X. The ar- rays X0 and X (1,:) are conformable and we can assign the entries in X (1,:) equal to the entries in X0, i.e. X(1,1)=X0(1), X(1,2)=X0(2), ... , X(1,NEQ)=X0(NEQ) in only one statement X(1,:)= X0. Similarly the statement write(...) X(i,:) prints the whole i-th row of the array X whereas the statement X(i,:)= XS assigns X(i,1)=XS(1), X(i,2)=XS(2), ... , X(i,NEQ)=XS(NEQ). Note the vector operations: xx = x + h2 * k1 x = x + h6 * ( k1 +2.0 D0 * ( k2+k3 )+k4 ) which are equivalent to the following do loops do i =1 , NEQ xx ( i ) = x ( i ) + h2 * k1 ( i ) enddo do i =1 , NEQ x ( i ) = x ( i ) + h6 * ( k1 ( i ) +2.0 D0 * ( k2 ( i )+k3 ( i ) )+k4 ( i ) ) enddo A few words in order to explain what is an INTERFACE block. Up to now we declared only the type of the functions in the calling program. When the arguments of the function are arrays for which we only know their shape and not their size (assumed-shape arrays), the compiler needs more information. We need to declare the arguments, their types and, in case they are arrays, their shapes as well. Each program that calls these functions should include an INTERFACE block which provides this infor- mation. For the functions f and energy, the corresponding INTERFACE block is INTERFACE 5.5. MORE PARTICLES 277 !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− s u b r o u t i n e f ( t_intrf , x_intrf , xdot_intrf ) i m p l i c i t none r e a l ( 8 ) : : t_intrf r e a l ( 8 ) , dimension ( : ) : : x_intrf , xdot_intrf end s u b r o u t i n e f !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− r e a l ( 8 ) f u n c t i o n energy ( t_intrf , x_intrf ) i m p l i c i t none r e a l ( 8 ) : : t_intrf , x_intrf ( : ) end f u n c t i o n energy !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− END INTERFACE You may create files like e.g. interfaces.inc with groups of INTERFACE blocks and include them in all subprograms that use them with the state- ment include "interfaces.inc". Figure 5.17: Three particles of equal mass interact via their mutual gravitational attraction. The problem is solved numerically using the program in the files rkA.f90, rkA_3pcb.f90. The same program can be used in order to study the motion of three equal charges under the influence of their attractive or repulsive electrostatic force. Consider three particles of equal mass exerting a force of gravitational attraction on each other⁶ like the ones shown in figure 5.17. The forces ⁶The same program can be used for three equal charges exerting an electrostatic force on each other, which can be either attractive or repulsive. 278 CHAPTER 5. PLANAR MOTION exerting on each other are given by mk1 F⃗ij = 3 ⃗rij , i, j = 1, 2, 3 , (5.30) rij where k1 = −Gm and the equations of motion become (i = 1, 2, 3) dxi dvix ∑ 3 xi − xj = vix = k1 3 dt dt j=1,j̸=i rij dyi dviy ∑ 3 yi − yj = viy = k1 3 , (5.31) dt dt j=1,j̸=i rij where rij2 = (xi − xj )2 + (yi − yj )2 . The total energy of the system is 1 2 ∑3 k1 2 E/m = (v1 + v2 ) + . (5.32) 2 i,j=1,j<i rij The relations shown above are programmed in the file rkA_3pcb.f90 listed below: ! =============================== ! S e t s number o f e q u a t i o n s ! =============================== s u b r o u t i n e finit ( NEQ ) NEQ = 12 end s u b r o u t i n e finit ! =============================== ! Three p a r t i c l e s o f t h e same ! mass on t h e plane i n t e r a c t i n g ! v i a Coulombic f o r c e ! =============================== s u b r o u t i n e f ( t , X , dXdt ) i m p l i c i t none real (8) : : k1 , k2 common / couplings / k1 , k2 r e a l ( 8 ) : : t , X ( : ) , dXdt ( : ) !−−−−−−−−−−−−−−−−−−−−−−− r e a l ( 8 ) : : x11 , x12 , x21 , x22 , x31 , x32 r e a l ( 8 ) : : v11 , v12 , v21 , v22 , v31 , v32 r e a l ( 8 ) : : r12 , r13 , r23 !−−−−−−−−−−−−−−−−−−−−−−− x11 = X ( 1 ) ; x21 = X ( 5 ) ; x31 = X ( 9 ) x12 = X ( 2 ) ; x22 = X ( 6 ) ; x32 = X ( 1 0 ) 5.5. MORE PARTICLES 279 v11 = X ( 3 ) ; v21 = X ( 7 ) ; v31 = X ( 1 1 ) v12 = X ( 4 ) ; v22 = X ( 8 ) ; v32 = X ( 1 2 ) !−−−−−−−−−−−−−−−−−−−−−−− r12 = ( ( x11−x21 ) * ( x11−x21 ) +( x12−x22 ) * ( x12−x22 ) ) * * ( − 1. 5 D0 ) r13 = ( ( x11−x31 ) * ( x11−x31 ) +( x12−x32 ) * ( x12−x32 ) ) * * ( − 1. 5 D0 ) r23 = ( ( x21−x31 ) * ( x21−x31 ) +( x22−x32 ) * ( x22−x32 ) ) * * ( − 1. 5 D0 ) !−−−−−−−−−−−−−− dXdt ( 1 ) = v11 dXdt ( 2 ) = v12 dXdt ( 3 ) = k1 * ( x11−x21 ) * r12+k1 * ( x11−x31 ) * r13 ! a11=dv11 / dt dXdt ( 4 ) = k1 * ( x12−x22 ) * r12+k1 * ( x12−x32 ) * r13 ! a12=dv12 / dt !−−−−−−−−−−−−−− dXdt ( 5 ) = v21 dXdt ( 6 ) = v22 dXdt ( 7 ) = k1 * ( x21−x11 ) * r12+k1 * ( x21−x31 ) * r23 ! a21=dv21 / dt dXdt ( 8 ) = k1 * ( x22−x12 ) * r12+k1 * ( x22−x32 ) * r23 ! a22=dv22 / dt !−−−−−−−−−−−−−− dXdt ( 9 ) = v31 dXdt ( 1 0 ) = v32 dXdt ( 1 1 ) = k1 * ( x31−x11 ) * r13+k1 * ( x31−x21 ) * r23 ! a31=dv31 / dt dXdt ( 1 2 ) = k1 * ( x32−x12 ) * r13+k1 * ( x32−x22 ) * r23 ! a32=dv32 / dt end s u b r o u t i n e f ! =============================== r e a l ( 8 ) f u n c t i o n energy ( t , X ) i m p l i c i t none real (8) : : k1 , k2 common / couplings / k1 , k2 real (8) : : t , X ( : ) !−−−−−−−−−−−−−−−−−−−−−−− r e a l ( 8 ) : : x11 , x12 , x21 , x22 , x31 , x32 r e a l ( 8 ) : : v11 , v12 , v21 , v22 , v31 , v32 r e a l ( 8 ) : : r12 , r13 , r23 !−−−−−−−−−−−−−−−−−−−−−−− x11 = X ( 1 ) ; x21 = X ( 5 ) ; x31 = X ( 9 ) x12 = X ( 2 ) ; x22 = X ( 6 ) ; x32 = X ( 1 0 ) v11 = X ( 3 ) ; v21 = X ( 7 ) ; v31 = X ( 1 1 ) v12 = X ( 4 ) ; v22 = X ( 8 ) ; v32 = X ( 1 2 ) !−−−−−−−−−−−−−−−−−−−−−−− r12 = ( ( x11−x21 ) * ( x11−x21 ) +( x12−x22 ) * ( x12−x22 ) ) **( −0.5 D0 ) r13 = ( ( x11−x31 ) * ( x11−x31 ) +( x12−x32 ) * ( x12−x32 ) ) **( −0.5 D0 ) r23 = ( ( x21−x31 ) * ( x21−x31 ) +( x22−x32 ) * ( x22−x32 ) ) **( −0.5 D0 ) !−−−−−−−−−−−−−−−−−−−−−−− energy = 0.5 D0*& ( v11 * v11+v12 * v12+v21 * v21+v22 * v22+v31 * v31+v32 * v32 ) energy = energy + k1 * ( r12+r13+r23 ) end f u n c t i o n energy In order to run the program and see the results look at the commands in the shell script in the file rkA_3pcb.csh. In order to run the script use 280 CHAPTER 5. PLANAR MOTION command > rkA_3pcb . csh −0.5 4000 1 . 5 −1 0 . 1 1 0 1 −0.1 −1 0 0.05 1 0 −1 which will run the program setting k1 = −0.5, ⃗r1 (0) = −x̂+0.1ŷ, ⃗v1 (0) = x̂, ⃗r2 (0) = x̂ − 0.1ŷ, ⃗v2 (0) = −x̂, ⃗r3 (0) = 0.05x̂ + ŷ, ⃗v3 (0) = −ŷ, Nt= 4000 and tf = 1.5. 5.6. PROBLEMS 281 5.6 Problems 5.1 Reproduce the results shown in figures 5.3 and 5.4. Compare your results to the known analytic solution. 5.2 Write a program for the force on a charged particle in a constant magnetic field B ⃗ = B k̂ and compute its trajectory for ⃗v (0) = v0x x̂ + v0y ŷ. Set x(0) = 1, y(0) = 0, v0y = 0 and calculate the resulting radius of the trajectory. Plot the relation between the radius and v0x . Compare your results to the known analytic solution. (assume non relativistic motion) 5.3 Consider the anisotropic harmonic oscillator ax = −ω12 x, ay = −ω22 y. Construct the Lissajous curves by setting x(0) = 0, y(0) = 1, vx (0) = 1, vy (0) = 0, tf = 2π, ω22 = 1, ω12 = 1, 2, 4, 9, 16, . . .. What happens when ω12 ̸= nω22 ? 5.4 Reproduce the results displayed in table 5.1 and figures 5.5 and 5.6. Plot ln a vs ln T and calculate the slope of the resulting straight line by using the linear least squares method. Is it what you expect? Calculate the intercept and compare your result with the expected one. 5.5 Calculate the angular momentum with respect to the center of the force at each integration step of the planetary motion and check whether it is conserved. Show analytically that conservation of angular momentum implies that the position vector sweeps areas at constant rate. 5.6 Calculate the escape velocity of a planet ve for GM = 10.0, y(0) = 0.0, x0 = x(0) = 1 using the following steps: First show that v02 = −GM (1/a) + ve2 . Then set vx (0) = 0, vy (0) = v0 . Vary vy (0) = v0 and measure the resulting semi-major axis a. Determine the intercept of the resulting straight line in order to calculate ve . 5.7 Repeat the previous problem for x0 = 0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0. From the ve = f (1/x0 ) plot confirm the relation (5.14). 5.8 Check that for the bound trajectory of a planet with GM = 10.0, x(0) = 1, y(0) = 0.0, vx (0) = 0 , vy (0) = 4 you obtain that F1 P + F2 P = 2a for each point P of the trajectory. The point F1 is the center of the force. After determining the semi-major axis a nu- merically, the point F2 will be taken symmetric to F1 with respect to the center of the ellipse. 282 CHAPTER 5. PLANAR MOTION 5.9 Consider the planetary motion studied in the previous problem. Apply a momentary push in the tangential direction after the planet has completed 1/4 of its elliptical orbit. How stable is the particle trajectory (i.e. what is the dependence of the trajectory on the magnitude and the duration of the push?)? Repeat the problem when the push is in the vertical direction. 5.10 Consider the scattering potential of the positron-hydrogen system given by equation (5.26). Plot the functions f (r) and V (r) for different values of a. Calculate the total cross section σtot numerically and show that it is equal to πa2 . 5.11 Consider the Morse potential of diatomic molecules: V (r) = D (exp(−2αr) − 2 exp(−αr)) (5.33) where D, α > 0. Compute the solutions of the problem numerically in one dimension and compare them to the known analytic solutions when E < 0: { √ √ } 1 D − D(D − |E|) sin(αt 2|E|/m + C) x(t) = ln , (5.34) α |E| where the integration constant as a function of the initial position and energy is given by [ ] D − |E|eαx0 C = sin−1 √ . (5.35) D(D − |E|) We obtain √ a periodic motion with an energy dependent period = (π/α) 2m/|E|. For E > 0 we obtain {√ √ } 1 D(D + E) cosh(αt 2E/m + C) − D x(t) = ln (5.36) α |E| whereas for E = 0 { } 1 1 Dα2 x(t) = ln + (t + C)2 . (5.37) α 2 m In these equations, the integration constant C is given by a different relation and not by equation (5.35). Compute the motion in phase space (x, ẋ) and study the transition from open to closed trajectories. 5.6. PROBLEMS 283 5.12 Consider the effective potential term Vef f (r) = l2 /2mr2 (l ≡ |L|) ⃗ in the previous problem. Plot the function Vtot (r) = V (r) + Vef f (r) for D = 20, α = 1, m = 1, l = 1, and of course for r > 0. Determine the equilibrium position and the ionization energy. Calculate the solutions x(t), y(t), y(x), r(t) on the plane for E > 0, E = 0, and E < 0 numerically. In the E < 0 case consider the scattering problem and calculate the functions b(θ), σ(θ) and the total cross section σtot . 5.13 Consider the potential of the molecular model given by the force F⃗ (r) = f (r) r̂ where f (r) = 24(2/r13 − 1/r7 ). Calculate the potential V (r) and plot the function Vtot (r) = V (r) + Vef f (r). Determine the equilibrium position and the ionization energy. Consider the problem of scattering and calculate b(θ), σ(θ) and σtot numerically. How much do your results depend on the minimum scattering angle? 5.14 Compute the trajectories of a particle under the influence of a force F⃗ = −k/r3 r̂. Determine appropriate initial conditions that give a spiral trajectory. 5.15 Compute the total cross section σtot for the Rutherford scattering both analytically and numerically. What happens to your numerical results as you vary the integration limits? 5.16 Write a program that computes the trajectory of a particle that moves on the plane in the static electric field of N static point charges. 5.17 Solve the three body problem described in the text in the case of three different electric charges by making the appropriate changes to the program in the file rkA_3cb.f90. 5.18 Two charged particles of equal mass and charge are moving on the xy plane in a constant magnetic field B ⃗ = B ẑ. Solve the equations of motion using a 4th order Runge–Kutta Method. Plot the resulting trajectories for the initial conditions that you will choose. 5.19 Three particles of equal mass m are connected by identical springs. The springs’ spring constant is equal to k and their equilibrium length is equal to l. The particles move without friction on a hori- zontal plane. Solve the equations of motion of the system numeri- cally by using a 4th order Runge–Kutta Method. Plot the resulting 284 CHAPTER 5. PLANAR MOTION trajectories for the initial conditions that you will choose. (Hint: Look in the files rkA_3hoc.f90, rkA_3hoc.csh.) Figure 5.18: Two identical particles are attached to thin weightless rods of length l and they are connected by an ideal weightless spring with spring constant k and equilibrium length l. The rods are hinged to the ceiling at points whose distance is l. (Problem 5.20). 5.20 Two identical particles are attached to thin weightless rods of length l and they are connected by an ideal weightless spring with spring constant k and equilibrium length l. The rods are hinged to the ceiling at points whose distance is l (see figure 5.18). Compute the Lagrangian of the system and the equations of motion for the degrees of freedom θ1 and θ2 . Solve these equations numerically by using a 4th order Runge–Kutta method. Plot the positions of the particles in a Cartesian coordinate system and the resulting tra- jectory. Study the normal modes for small angles θ1 ≲ 0.1 and compute the deviation of the solutions from the small oscillation approximation as the angles become larger. (Hint: Look in the files rk_cpend.f90, rk_cpend.csh) 5.21 Repeat the previous problem when the hinges of the rods slide without friction on the x axis. 5.22 Repeat problem 5.20 by adding a third pendulum to the right at distance l. Chapter 6 Motion in Space In this chapter we will study the motion of a particle in space (three dimensions). We will also discuss the case of the relativistic motion, which is important if one wants to consider the motion of particles moving with speeds comparable to the speed of light. This will be an opportunity to use an adaptive stepsize Runge-Kutta method for the numerical solution of the equations of motion. We will use the open source code rksuite¹ available at the Netlib² repository. Netlib is an open source, high quality repository for numerical analysis software. The software it contains is used by many researchers in their high performance computing programs and it is a good investment of time to learn how to use it. The technical skill that you will exercise in this chapter is looking for solutions to your numerical problems provided by software written by others. It is important to be able to locate the optimal solution to your problem, find the relevant functions, read the software’s documentation carefully and filter out the necessary information in order to call and link the functions to your program. ¹R.W. Brankin, I. Gladwell, and L.F. Shampine, RKSUITE: a suite of Runge-Kutta codes for the initial value problem for ODEs, Softreport 92-S1, Department of Mathe- matics, Southern Methodist University, Dallas, Texas, U.S.A, 1992. ²www.netlib.org 285 286 CHAPTER 6. MOTION IN SPACE 6.1 Adaptive Stepsize Control for Runge–Kutta Methods The three dimensional equation of motion of a particle is an initial value problem given by the equations (4.6) dx dvx = vx = ax (t, x, vx , y, vy , z, vz ) dt dt dy dvz = vy = ay (t, x, vx , y, vy , z, vz ) dt dt dz dvz = vz = az (t, x, vx , y, vy , z, vz ) . (6.1) dt dt For its numerical solution we will use an adaptive stepsize Runge– Kutta algorithm for increased performance and accuracy. Adaptive step- size is used in cases where one needs to minimize computational effort for given accuracy goal. The method frequently changes the time step during the integration process, so that it is set to be large through smooth intervals and small when there are abrupt changes in the values of the functions. This is achieved by exercising error control either by monitor- ing a conserved quantity or by computing the same solution using two different methods. In our case, two Runge-Kutta methods are used, one of order p and one of order p + 1, and the difference of the results is used as an estimate of the truncation error. If the error needs to be reduced, the step size is reduced and if it is satisfactorily small the step size is increased. For the details we refer the reader to [31]. Our goal is not to analyze and understand the details of the algorithm, but to learn how to find and use appropriate and high quality code written by others. The link http://www.netlib.org/ode/ reads lib rksuite alg Runge−Kutta for initial value problem for first order ordinary ←- differential equations . A suite of codes for solving IVPs in ODEs . A choice of RK methods , is available . Includes an error assessment facility and a sophisticated stiffness checker . Template programs and example results provided . Supersedes RKF 45 , DDERKF , D02PAF . ref RKSUITE , Softreport 92−S 1 , Dept of Math , SMU , Dallas , ←- Texas by R . W . Brankin ( NAG ) , I . Gladwell and L . F . Shampine ( SMU ) lang Fortran 6.1. ADAPTIVE STEPSIZE CONTROL FOR RUNGE–KUTTA METHODS287 prec double There, we learn that the package provides code for Runge–Kutta methods, whose source is open and written in the Fortran language. We also learn that the code is written for double precision variables, which is suitable for our problem. Last, but not least, we are also happy to learn that it is written by highly reputable people! We download the files rksuite.f, rksuite.doc, details.doc, templates, readme. In order to link the subroutines provided by the suite to our program we need to read the documentation carefully. In the general case, docu- mentation is available on the web (html, pdf, ...), bundled files with names like README, INSTALL, in whole directories with names like doc/, online help in man or info pages and finally in good old fashioned printed man- uals. Good quality software is also well documented inside the source code files, something that is true for the software at hand. In order to link the suite’s subroutines to our program we need the following basic information: • INPUT DATA: This is the necessary information that the program needs in order to perform the calculation. In our case, the mini- mal such information is the initial conditions, the integration time interval and the number of integration steps. The user should also provide the functions on the right hand side of (6.1). It might also be necessary to provide information about the desired accuracy goal, the scale of the problem, the hardware etc. • OUTPUT DATA: This is the information on how we obtain the results of the calculation for further analysis. Information whether the calculation was successful and error free could also be provided. • WORKSPACE: This is information on how we provide the necessary memory space used in the intermediate calculations. Such space needs to be provided by the user in programming languages where dynamical memory allocation is not possible, like in Fortran 77, and the size of workspace depends on the parameters of the calling program. It is easy to install the software. All the necessary code is in one file rksuite.f. The file rksuite.doc³ contains the documentation. There we read that we need to inform the program about the hardware dependent ³This is a simple text file which you can read with the command less rksuite.doc or with emacs. 288 CHAPTER 6. MOTION IN SPACE accuracy of floating point numbers. We need to set the values of three variables: ... RKSUITE requires three environmental constants OUTCH , MCHEPS , DWARF . When you use RKSUITE , you may need to know their values . You can obtain them by calling the subroutine ENVIRN in the suite : CALL ENVIRN ( OUTCH , MCHPES , DWARF ) returns values OUTCH − INTEGER Standard output channel on the machine being used . MCHEPS − DOUBLE PRECISION The unit of roundoff , that is , the largest positive number such that 1 . 0 D0 + MCHEPS = 1 . 0 D 0 . DWARF − DOUBLE PRECISION The smallest positive number on the machine being used . ... * * * * * * * * * * * * * * * * * * * * * * * * * * Installation Details * * * * * * * * * * * * All machine−dependent aspects of the suite have been isolated in the subroutine ENVIRN in the rksuite . for file . Certain environmental parameters must be specified in this subroutine . The values in the distribution version are those appropriate to the IEEE arithmetic standard . They must be altered , if necessary , to values appropriate to the computing system you are using before calling the codes of the suite . If the IEEE arithmetic standard values are not appropriate for your system , appropriate values can often be obtained by calling routines named in the Comments of ENVIRN . ... The variables OUTCH, MCHEPS, DWARF are defined in the subroutine ENVIRN. They are given generic default values but the programmer is free to change them by editing ENVIRN. We should identify the routine in the file rksuite.f and read the comments in it⁴: ... SUBROUTINE ENVIRN ( OUTCH , MCHEPS , DWARF ) ... ⁴These are lines that begin with a C as this is old fixed format Fortran code. 6.1. ADAPTIVE STEPSIZE CONTROL FOR RUNGE–KUTTA METHODS289 C The f o l l o w i n g s i x s t a t e m e n t s a r e t o be Commented out C a f t e r v e r i f i c a t i o n t h a t t h e machine and i n s t a l l a t i o n C dependent q u a n t i t i e s a r e s p e c i f i e d c o r r e c t l y . ... WRITE ( * , * ) ’ Before using RKSUITE , you must v e r i f y t h a t t h e ’ WRITE ( * , * ) ’ machine− and i n s t a l l a t i o n −dependent q u a n t i t i e s ’ WRITE ( * , * ) ’ s p e c i f i e d i n t h e s u b r o u t i n e ENVIRN a r e c o r r e c t , ’ WRITE ( * , * ) ’ and then Comment t h e s e WRITE s t a t e m e n t s and t h e ’ WRITE ( * , * ) ’ STOP s t a t e m e n t out o f ENVIRN . ’ STOP ... C The f o l l o w i n g v a l u e s a r e a p p r o p r i a t e t o IEEE C a r i t h m e t i c with t h e t y p i c a l standard output channel . C OUTCH = 6 MCHEPS = 1 . 1 1 D−16 DWARF = 2.23 D−308 All we need to do is to comment out the WRITE and STOP commands since we will keep the default values of the OUTCH, MCHEPS, DWARF variables: ... C WRITE ( * ,*) ’ Before using RKSUITE , you must v e r i f y t h a t t h e ’ C WRITE ( * ,*) ’ machine− and i n s t a l l a t i o n −dependent q u a n t i t i e s ’ C WRITE ( * ,*) ’ s p e c i f i e d i n t h e s u b r o u t i n e ENVIRN a r e c o r r e c t , ’ C WRITE ( * ,*) ’ and then Comment t h e s e WRITE s t a t e m e n t s and t h e ’ C WRITE ( * ,*) ’ STOP s t a t e m e n t out o f ENVIRN . ’ C STOP ... In order to check whether the default values are satisfactory, we can use the Fortran intrinsic functions EPSILON() and TINY(). In the file test_envirn.f90, we write a small test program program testme i m p l i c i t none i n t e g e r : : OUTCH r e a l ( 8 ) : : DWARF , MCHEPS real (8) : : x OUTCH = 6 ! This i s p r e t t y much a standard MCHEPS = e p s i l o n ( x ) / 2 . 0 D0 DWARF = tiny (x) w r i t e ( 6 , 1 0 1 ) OUTCH , MCHEPS , DWARF 101 format ( I4 , 2 E30 . 1 8 ) end program testme We compile and run the above program as follows: > g f o r t r a n test_envirn . f90 −o test_envirn 290 CHAPTER 6. MOTION IN SPACE > . / test_envirn 6 0.111022302462515654E−15 ←- 0.222507385850720138−307 We conclude that our choices are satisfactory. Next we need to learn how to use the subroutines in the suite. By carefully reading rksuite.doc we learn the following: The interface to the adaptive stepsize Runge–Kutta algorithm is the routine UT (UT = “Usual Task”). The routine can use a 2nd-3rd (RK23) order Runge-Kutta pair for error control (METHOD=1), a 4th-5th (RK45) order pair (METHOD=2) or a 7th-8th (RK78) order pair (METHOD=3). We will set METHOD=2 (RK45). The routine SETUP must be called before UT for initialization. The user should provide a function F that calculates the derivatives of the functions we integrate for, i.e. the right hand side of 6.1. The fastest way to learn how to use the above routines is “by exam- ple”. The suite include a templates package which can be unpacked by executing the commands in the file templates using the sh shell: > sh templates tmpl1 . out tmpl1a . f ... The file tmpl1a.f contains the solution of the simple harmonic oscillator and has many explanatory comments in it. We encourage the reader to study it carefully, run it and test its results. After we become wise enough, we write the driver for the integration routine UT, which can be found in the file rk3.f90: ! ======================================================== ! Program t o s o l v e a 6 ODE system using Runge−Kutta Method ! Output i s w r i t t e n i n f i l e rk3 . dat ! ======================================================== program rk3_solve i n c l u d e ’ rk3 . i n c ’ r e a l ( 8 ) : : T0 , TF , X10 , X20 , X30 , V10 , V20 , V30 r e a l ( 8 ) : : t , dt , tstep i n t e g e r : : STEPS integer : : i r e a l ( 8 ) : : energy ! Arrays / v a r i a b l e s needed by r k s u i t e : r e a l ( 8 ) TOL , THRES ( NEQ ) , WORK ( LENWRK ) , Y ( NEQ ) , YMAX ( NEQ ) ,& YP ( NEQ ) , YSTART ( NEQ ) , HSTART l o g i c a l ERRASS , MESSAGE 6.1. ADAPTIVE STEPSIZE CONTROL FOR RUNGE–KUTTA METHODS291 i n t e g e r UFLAG ! . . External Subroutines . . EXTERNAL F , SETUP , STAT , UT ! Input : p r i n t * , ’ Runge−Kutta Method f o r 6−ODEs I n t e g r a t i o n ’ p r i n t * , ’ Enter c o u p l i n g c o n s t a n t s k1 , k2 , k3 , k4 : ’ read * , k1 , k2 , k3 , k4 p r i n t * , ’ k1= ’ , k1 , ’ k2= ’ , k2 , ’ k3= ’ , k3 , ’ k4= ’ , k4 p r i n t * , ’ Enter STEPS , T0 , TF , X10 , X20 , X30 , V10 , V20 , V30 : ’ read * , STEPS , T0 , TF , X10 , X20 , X30 , V10 , V20 , V30 p r i n t * , ’No . S t e p s= ’ , STEPS p r i n t * , ’ Time : I n i t i a l T0 = ’ , T0 , ’ F i n a l TF= ’ , TF print * , ’ X1(T0)= ’ , X10 , ’ X2(T0)= ’ , X20 , ’ X3(T0)= ’ , X30 print * , ’ V1 (T0)= ’ , V10 , ’ V2(T0)= ’ , V20 , ’ V3(T0)= ’ , V30 ! I n i t i a l Conditions dt = ( TF−T0 ) / STEPS YSTART ( 1 ) = X10 YSTART ( 2 ) = X20 YSTART ( 3 ) = X30 YSTART ( 4 ) = V10 YSTART ( 5 ) = V20 YSTART ( 6 ) = V30 ! ! S e t e r r o r c o n t r o l parameters . ! TOL = 5.0 D−6 do i = 1 , NEQ THRES ( i ) = 1 . 0 D−10 enddo MESSAGE = .TRUE. ERRASS = . FALSE . HSTART = 0.0 D0 ! Initialization : c a l l SETUP ( NEQ , T0 , YSTART , TF , TOL , THRES , METHOD , ’ Usual Task ’ ,& ERRASS , HSTART , WORK , LENWRK , MESSAGE ) open ( u n i t =11 , f i l e = ’ rk3 . dat ’ ) w r i t e ( 1 1 , 1 0 0 ) T0 , YSTART ( 1 ) , YSTART ( 2 ) , YSTART ( 3 ) , YSTART ( 4 ) ,& YSTART ( 5 ) , YSTART ( 6 ) , energy ( T0 , YSTART ) ! Calculation : do i =1 , STEPS t = T0 + i * dt c a l l UT ( F , t , tstep , Y , YP , YMAX , WORK , UFLAG ) i f ( UFLAG . GT. 2 ) e x i t ! e x i t t h e loop : go a f t e r enddo w r i t e ( 1 1 , 1 0 0 ) tstep , Y ( 1 ) , Y ( 2 ) , Y ( 3 ) , Y ( 4 ) , Y ( 5 ) , Y ( 6 ) ,& energy ( tstep , Y ) enddo close (11) 100 format (8 E25 . 1 5 ) end program rk3_solve 292 CHAPTER 6. MOTION IN SPACE All common parameters and variables are declared in an include file rk3.inc. This is necessary in order for them to be accessible by the function F which calculates the derivatives. The contents of this file are substituted in each line containing the command include 'rk3.inc'. ! Basic d e f i n i t i o n s of v a r i a b l e s fo r the s u i t e r k s u i t e i m p l i c i t none !NEQ i s t h e number o f e q u a t i o n s , 6 i n 3 dimensions !METHOD=2 i s f o r RK45 . INTEGER NEQ , LENWRK , METHOD PARAMETER ( NEQ =6 , LENWRK =32*NEQ , METHOD =2) REAL *8 k1 , k2 , k3 , k4 ! f o r c e c o u p l i n g s COMMON / COUPLINGS / k1 , k2 , k3 , k4 The number of differential equations is set equal to NEQ=6. The integra- tion method is set by the choice METHOD=2. The variable LENWRK sets the size of the workspace needed by the suite for the intermediate calcula- tions. The main program starts with the user interface. The initial state of the particle is stored in the array YSTART in the positions 1 . . . 6. The first three positions are the coordinates of the initial position and the last three the components of the initial velocity. Then we set some vari- ables that determine the behavior of the integration program (see the file rksuite.doc for details) and call the subroutine SETUP. The main integration loop is: do i =1 , STEPS t = T0 + i * dt c a l l UT ( F , t , tstep , Y , YP , YMAX , WORK , UFLAG ) i f ( UFLAG . GT. 2 ) e x i t ! e x i t t h e loop : go a f t e r enddo w r i t e ( 1 1 , 1 0 0 ) tstep , Y ( 1 ) , Y ( 2 ) , Y ( 3 ) , Y ( 4 ) , Y ( 5 ) , Y ( 6 ) ,& energy ( tstep , Y ) enddo The function F is the subroutine that calculates the derivatives and it will be programmed by us later. The variable t stores the desired moment of time at which we want to calculate the functions. Because of the adaptive stepsize, it can be different than the one returned by the subroutine UT. The actual value of time that the next step lands⁵ on is tstep. The array Y stores the values of the functions. We choose the data structure to be such that x= Y(1), y= Y(2), z= Y(3) and vx = Y(4), vy = Y(5), vz = Y(6) ⁵When UGLAG ≤ 2, tstep=t and we will not worry about them being different with our program. 6.1. ADAPTIVE STEPSIZE CONTROL FOR RUNGE–KUTTA METHODS293 (the same sequence as in the array YSTART). The function energy(t,Y) returns the value of the mechanical energy of the particle and its code will be written in the same file as that of F. Finally, the variable UFLAG indicates the error status of the calculation by UT and if UFLAG> 2 we end the calculation. Our test code will be on the study of the motion of a projectile in a constant gravitational field, subject also to the influence of a dissipative force F⃗r = −mk⃗v . The program is in the file rk3_g.f90. We choose the parameters k1 and k2 so that ⃗g = -k1 k̂ and k = k2. !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− s u b r o u t i n e F ( T , Y , YP ) i n c l u d e ’ rk3 . i n c ’ real (8) : : t r e a l ( 8 ) : : Y ( * ) , YP ( * ) r e a l ( 8 ) : : x1 , x2 , x3 , v1 , v2 , v3 x1 = Y ( 1 ) ; v1 = Y ( 4 ) x2 = Y ( 2 ) ; v2 = Y ( 5 ) x3 = Y ( 3 ) ; v3 = Y ( 6 ) ! Velocities : d x _ i / dt = v _ i YP ( 1 ) = v1 YP ( 2 ) = v2 YP ( 3 ) = v3 ! A c c e l e r a t i o n : dv_i / dt = a _ i YP ( 4 ) = −k2 * v1 YP ( 5 ) = −k2 * v2 YP ( 6 ) = −k2 * v3−k1 end s u b r o u t i n e F !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− r e a l ( 8 ) f u n c t i o n energy ( T , Y ) i n c l u d e ’ rk3 . i n c ’ real (8) : : t , e real (8) : : Y ( * ) r e a l ( 8 ) : : x1 , x2 , x3 , v1 , v2 , v3 x1 = Y ( 1 ) ; v1 = Y ( 4 ) x2 = Y ( 2 ) ; v2 = Y ( 5 ) x3 = Y ( 3 ) ; v3 = Y ( 6 ) ! K i n e t i c Energy e = 0 . 5 * ( v1 * v1+v2 * v2+v3 * v3 ) ! P o t e n t i a l Energy e = e + k1 * x3 energy = e end f u n c t i o n energy For convenience we “translated” the values in the array Y(NEQ) into 294 CHAPTER 6. MOTION IN SPACE user-friendly variable names⁶. If the file rksuite.f is in the directory rksuite/, then the compilation, running and visualization of the results can be done with the commands: > gfortran rk3 . f90 rk3_g . f90 rksuite / rksuite . f −o rk3 > . / rk3 Runge−Kutta Method for 6−ODEs Integration Enter coupling constants k1 , k2 , k3 , k4 : 10 0 0 0 k1= 10.0000 k2= 0.0000 E+000 k3= 0.0000 E+000 k4= 0.0000 E+000 Enter STEPS , T0 , TF , X10 , X20 , X30 , V10 , V20 , V30 : 10000 0 3 0 0 0 1 1 1 No . Steps= 10000 Time : Initial T0 = 0.0000 E+000 Final TF= 3.0000 X1 ( T0 )= 0.0000 E+000 X2 ( T0 )= 0.0000 E+000 X3 ( T0 )= 0.0000 E+000 V1 ( T0 )= 1.0000 V2 ( T0 )= 1.0000 V3 ( T0 )= 1.0000 > gnuplot gnuplot > p l o t ” rk3 . dat ” using 1 : 2 with lines t i t l e ” x1 ( t ) ” gnuplot > p l o t ” rk3 . dat ” using 1 : 3 with lines t i t l e ” x2 ( t ) ” gnuplot > p l o t ” rk3 . dat ” using 1 : 4 with lines t i t l e ” x3 ( t ) ” gnuplot > p l o t ” rk3 . dat ” using 1 : 5 with lines t i t l e ” v1 ( t ) ” gnuplot > p l o t ” rk3 . dat ” using 1 : 6 with lines t i t l e ” v2 ( t ) ” gnuplot > p l o t ” rk3 . dat ” using 1 : 7 with lines t i t l e ” v3 ( t ) ” gnuplot > p l o t ” rk3 . dat ” using 1 : 8 with lines t i t l e ”E( t ) ” gnuplot > s e t t i t l e ” t r a j e c t o r y ” gnuplot > s p l o t ” rk3 . dat ” using 2 : 3 : 4 with lines notitle All the above commands can be executed together using the shell script in the file rk3.csh. The script uses the animation script rk3_animate.csh. The following command executes all the commands shown above: . / rk3 . csh −f 1 −− 10 0 . 0 0 0 0 0 1 1 1 10000 0 3 ⁶Note the declaration of the arrays Y, YP: real(8) :: Y(*),YP(*). These arrays are “assumed-size” arrays for the functions F, energy, i.e. arrays whose size is unknown to the procedure. For arrays of more than one dimension, only the last index is allowed to be *. In general it is recommended that assumed-size arrays be avoided and declare them as assumed-shape like in the program rkA.f90 of page 273. The declaration in this case is real(8) :: Y(:),YP(:) 6.2. MOTION OF A PARTICLE IN AN EM FIELD 295 6.2 Motion of a Particle in an EM Field In this section we study the non-relativistic motion of a charged particle in an electromagnetic (EM) field. The particle is under the influence of the Lorentz force: ⃗ + ⃗v × B) F⃗ = q(E ⃗ . (6.2) ⃗ = Ex x̂ + Ey ŷ + Ez ẑ, B Consider the constant EM field of the form E ⃗ = B ẑ. The components of the acceleration of the particle are: ax = (qEx /m) + (qB/m)vy ay = (qEy /m) − (qB/m)vx az = (qEz /m) . (6.3) This field is programmed in the file rk3_B.f90. We set k1 = qB/m, k2 = qEx /m, k3 = qEy /m and k4 = qEz /m: !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ! P a r t i c l e i n c o n s t a n t Magnetic and e l e c t r i c f i e l d ! q B/m = k1 z q E /m = k2 x + k3 y + k4 z s u b r o u t i n e F ( T , Y , YP ) i n c l u d e ’ rk3 . i n c ’ real (8) : : t r e a l ( 8 ) : : Y ( * ) , YP ( * ) r e a l ( 8 ) : : x1 , x2 , x3 , v1 , v2 , v3 x1 = Y ( 1 ) ; v1 = Y ( 4 ) x2 = Y ( 2 ) ; v2 = Y ( 5 ) x3 = Y ( 3 ) ; v3 = Y ( 6 ) ! Velocities : d x _ i / dt = v _ i YP ( 1 ) = v1 YP ( 2 ) = v2 YP ( 3 ) = v3 ! A c c e l e r a t i o n : dv_i / dt = a _ i YP ( 4 ) = k2 + k1 * v2 YP ( 5 ) = k3 − k1 * v1 YP ( 6 ) = k4 end s u b r o u t i n e F !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− r e a l ( 8 ) f u n c t i o n energy ( T , Y ) i n c l u d e ’ rk3 . i n c ’ real (8) : : t , e real (8) : : Y ( * ) r e a l ( 8 ) : : x1 , x2 , x3 , v1 , v2 , v3 x1 = Y ( 1 ) ; v1 = Y ( 4 ) x2 = Y ( 2 ) ; v2 = Y ( 5 ) x3 = Y ( 3 ) ; v3 = Y ( 6 ) 296 CHAPTER 6. MOTION IN SPACE ! K i n e t i c Energy e = 0 . 5 * ( v1 * v1+v2 * v2+v3 * v3 ) ! P o t e n t i a l Energy e = e − k2 * x1 − k3 * x2 − k4 * x3 energy = e end f u n c t i o n energy 3 2 1 0 1 1 2 0 x y 3 -1 Figure 6.1: The trajectory of a charged particle in a constant magnetic field B⃗ = B ẑ, where qB/m = 1.0, ⃗v (0) = 1.0ŷ + 0.1ẑ, ⃗r(0) = 1.0x̂. The integration of the equations of motion is performed using the RK45 method from t0 = 0 to tf = 40 with 1000 steps. We can also study space-dependent fields in the same way. The fields must satisfy Maxwell’s equations. We can study the confinement of a ⃗ = By ŷ + Bz ẑ particle in a region of space by a magnetic field by taking B with qBy /m = −k2 y, qBz /m = k1 + k2 z and qBy /m = k3 z, qBz /m = k1 + k2 y. Note that ∇ ⃗ ·B⃗ = 0. You may also want to calculate the current density from the equation ∇ ⃗ ×B⃗ = µ0⃗j. The results are shown in figures 6.1–6.4. 6.3 Relativistic Motion Consider a particle of non zero rest mass moving with speed comparable to the speed of light. In this case, it is necessary to study its motion using 6.3. RELATIVISTIC MOTION 297 z 4 3 2 1 0-5 1 -4 2 -3 3 -2 4 -1 5 x y 0 6 1 2 7 Figure 6.2: The trajectory of a charged particle in a constant magnetic field B⃗ = B ẑ, where qB/m = 1.0 and a constant electric field E ⃗ = Ex x̂+Ey ŷ με qEx /m = qEy /m = 0.1. ⃗v (0) = 1.0ŷ + 0.1ẑ, ⃗r(0) = 1.0x̂. The integration of the equations of motion is performed using the RK45 method from t0 = 0 to tf = 40 with 1000 steps. Each axis is on a different scale. the equations of motion given by special relativity⁷. In the equations below we√ set c = 1. The particle’s rest mass is m0 > 0, its mass is m = m0 / 1 √ − v 2 (where v < 1), its momentum is p⃗ = m⃗v and its energy is E = m = p2 + m20 . Then the equations of motion in a dynamic field F⃗ are given by: d⃗p = F⃗ . (6.4) dt In order to write a system of first order equations, we use the relations p⃗ p⃗ p⃗ ⃗v = = =√ . (6.5) m E p2 + m20 ⁷Of course for lower speeds, the special relativity equations of motion are a better ap- proximation to the particle’s motion, but the corrections to the non relativistic equations of motion are negligible. 298 CHAPTER 6. MOTION IN SPACE z 100 0 -100 3 2 -200 0 1 1 0 y 2 3 -1 x 4 5 6 -2 Figure 6.3: The trajectory of a charged particle in a magnetic field B⃗ = By ŷ + Bz ẑ with qBy /m = −0.02y, qBz /m = 1 + 0.02z, ⃗v (0) = 1.0ŷ + 0.1ẑ, ⃗r(0) = 1.0x̂. The integration of the equations of motion is performed using the RK45 method from t0 = 0 to tf = 500 with 10000 steps. Each axis is on a different scale. Using ⃗v = d⃗r/dt we obtain dx (px /m0 ) d(px /m0 ) Fx = √ , = dt 1 + (p/m0 )2 dt m0 dy (py /m0 ) d(py /m0 ) Fy = √ , = dt 1 + (p/m0 )2 dt m0 dz (pz /m0 ) d(pz /m0 ) Fz = √ , = , (6.6) dt 1 + (p/m0 )2 dt m0 which is a system of first order differential equations for the functions (x(t), y(t), z(t), (px /m0 )(t), (py /m0 )(t), (pz /m0 )(t)). Given the initial con- ditions (x(0), y(0), z(0), (px /m0 )(0), (py /m0 )(0), (pz /m0 )(0)) their solution is unique and it can be computed numerically using the 4th-5th order Runge–Kutta method according to the discussion of the previous section. 6.3. RELATIVISTIC MOTION 299 z 2 1 0 -1 -21 y 0 -1 -2 0 1 2 3 -1 x Figure 6.4: The trajectory of a charged particle in a magnetic field B⃗ = By ŷ + Bz ẑ with qBy /m = 0.08z, qBz /m = 1.4 + 0.08y, ⃗v (0) = 1.0ŷ + 0.1ẑ, ⃗r(0) = 1.0x̂. The integration of the equations of motion is performed using the RK45 method from t0 = 0 to tf = 3000 with 40000 steps. Each axis is on a different scale. By using the relations vx (px /m0 ) (px /m0 ) = √ vx = √ 1 − v2 1 + (p/m0 )2 vy (py /m0 ) (py /m0 ) = √ vy = √ 1 − v2 1 + (p/m0 )2 vz (pz /m0 ) (pz /m0 ) = √ vz = √ , 1 − v2 1 + (p/m0 )2 (6.7) we can use the initial conditions (x(0), y(0), z(0), vx (0), vy (0), vz (0)) in- stead. Similarly, from the solutions (x(t), y(t), z(t), (px /m0 )(t), (py /m0 )(t), (pz /m0 )(t)) we can calculate (x(t), y(t), z(t), vx (t), vy (t), vz (t)). We always have to check that v 2 = (vx )2 + (vy )2 + (vz )2 < 1 . (6.8) Since half of the functions that we integrate for are the momentum instead of the velocity components, we need to make some modifications to the 300 CHAPTER 6. MOTION IN SPACE program in the file rk3.f90. The main program can be found in the file sr.f90: ! ======================================================== ! Program t o s o l v e a 6 ODE system using Runge−Kutta Method ! Output i s w r i t t e n i n f i l e s r . dat ! I n t e r f a c e t o be used with r e l a t i v i s t i c p a r t i c l e s . ! ======================================================== program sr_solve include ’ sr . inc ’ r e a l ( 8 ) : : T0 , TF , X10 , X20 , X30 , V10 , V20 , V30 r e a l ( 8 ) : : P10 , P20 , P30 r e a l ( 8 ) : : P1 , P2 , P3 , V1 , V2 , V3 r e a l ( 8 ) : : t , dt , tstep i n t e g e r : : STEPS integer : : i r e a l ( 8 ) : : energy ! Arrays / v a r i a b l e s needed by r k s u i t e : r e a l ( 8 ) : : TOL , THRES ( NEQ ) , WORK ( LENWRK ) , Y ( NEQ ) , YMAX ( NEQ ) ,& YP ( NEQ ) , YSTART ( NEQ ) , HSTART l o g i c a l : : ERRASS , MESSAGE i n t e g e r : : UFLAG ! . . External Subroutines . . EXTERNAL F , SETUP , STAT , UT ! Input : p r i n t * , ’ Runge−Kutta Method f o r 6−ODEs I n t e g r a t i o n ’ print * , ’ Special R e l a t i v i s t i c Particle : ’ p r i n t * , ’ Enter c o u p l i n g c o n s t a n t s k1 , k2 , k3 , k4 : ’ read * , k1 , k2 , k3 , k4 p r i n t * , ’ k1= ’ , k1 , ’ k2= ’ , k2 , ’ k3= ’ , k3 , ’ k4= ’ , k4 p r i n t * , ’ Enter STEPS , T0 , TF , X10 , X20 , X30 , V10 , V20 , V30 : ’ read * , STEPS , T0 , TF , X10 , X20 , X30 , V10 , V20 , V30 c a l l momentum ( V10 , V20 , V30 , P10 , P20 , P30 ) p r i n t * , ’No . S t e p s= ’ , STEPS p r i n t * , ’ Time : I n i t i a l T0 = ’ , T0 , ’ F i n a l TF= ’ , TF print * , ’ X1(T0)= ’ , X10 , ’ X2(T0)= ’ , X20 , ’ X3(T0)= ’ , X30 print * , ’ V1 (T0)= ’ , V10 , ’ V2(T0)= ’ , V20 , ’ V3(T0)= ’ , V30 print * , ’ P1 (T0)= ’ , P10 , ’ P2 (T0)= ’ , P20 , ’ P3 (T0)= ’ , P30 ! I n i t i a l Conditions dt = ( TF−T0 ) / STEPS YSTART ( 1 ) = X10 YSTART ( 2 ) = X20 YSTART ( 3 ) = X30 YSTART ( 4 ) = P10 YSTART ( 5 ) = P20 YSTART ( 6 ) = P30 ! 6.3. RELATIVISTIC MOTION 301 ! S e t e r r o r c o n t r o l parameters . ! TOL = 5.0 D−6 do i = 1 , NEQ THRES ( i ) = 1 . 0 D−10 enddo MESSAGE = .TRUE. ERRASS = . FALSE . HSTART = 0.0 D0 ! Initialization : c a l l SETUP ( NEQ , T0 , YSTART , TF , TOL , THRES , METHOD , ’ Usual Task ’ ,& ERRASS , HSTART , WORK , LENWRK , MESSAGE ) open ( u n i t =11 , f i l e = ’ s r . dat ’ ) c a l l velocity ( YSTART ( 4 ) , YSTART ( 5 ) , YSTART ( 6 ) , V1 , V2 , V3 ) w r i t e ( 1 1 , 1 0 0 ) T0 , YSTART ( 1 ) , YSTART ( 2 ) , YSTART ( 3 ) ,& V1 , V2 , V3 ,& energy ( T0 , YSTART ) ,& YSTART ( 4 ) , YSTART ( 5 ) , YSTART ( 6 ) ! Calculation : do i =1 , STEPS t = T0 + i * dt c a l l UT ( F , t , tstep , Y , YP , YMAX , WORK , UFLAG ) i f ( UFLAG . GT. 2 ) e x i t c a l l velocity ( Y ( 4 ) , Y ( 5 ) , Y ( 6 ) , V1 , V2 , V3 ) w r i t e ( 1 1 , 1 0 0 ) tstep , Y ( 1 ) , Y ( 2 ) , Y ( 3 ) ,& V1 , V2 , V3 ,& energy ( tstep , Y ) ,& Y (4) , Y (5) , Y (6) enddo close (11) 100 format ( 1 1 E25 . 1 5 ) end program sr_solve ! ======================================================== ! momentum −> v e l o c i t y t r a n s f o r m a t i o n ! ======================================================== s u b r o u t i n e velocity ( p1 , p2 , p3 , v1 , v2 , v3 ) i m p l i c i t none r e a l ( 8 ) : : v1 , v2 , v3 , p1 , p2 , p3 , v , p , vsq , psq psq = p1 * p1+p2 * p2+p3 * p3 v1 = p1 / s q r t ( 1 . 0 D0+psq ) v2 = p2 / s q r t ( 1 . 0 D0+psq ) v3 = p3 / s q r t ( 1 . 0 D0+psq ) end s u b r o u t i n e velocity ! ======================================================== ! v e l o c i t y −> momentum t r a n s f o r m a t i o n ! ======================================================== s u b r o u t i n e momentum ( v1 , v2 , v3 , p1 , p2 , p3 ) 302 CHAPTER 6. MOTION IN SPACE i m p l i c i t none r e a l ( 8 ) : : v1 , v2 , v3 , p1 , p2 , p3 , v , p , vsq , psq vsq = v1 * v1+v2 * v2+v3 * v3 i f ( vsq . ge . 1 . 0 D0 ) s t o p ’ sub momentum : vsq >= 1 ’ p1 = v1 / s q r t ( 1 . 0 D0−vsq ) p2 = v2 / s q r t ( 1 . 0 D0−vsq ) p3 = v3 / s q r t ( 1 . 0 D0−vsq ) end s u b r o u t i n e momentum The subroutines momentum and velocity compute the transformations (6.7). In the subroutine momentum we check whether the condition (6.8) is satisfied. These functions are also used in the subroutine F that computes the derivatives of the functions. The test drive of the above program is the well known relativistic motion of a charged particle in a constant EM field. The acceleration of the particle is given by equations (6.3). The relativistic kinetic energy of the particle is ( ) (√ ) 1 T = √ − 1 m0 = 1 + (p/m0 )2 − 1 m0 (6.9) 1 − v2 These relations are programmed in the file sr_B.f90. The contents of the file sr_B.f90 are: ! ======================================================== ! P a r t i c l e i n c o n s t a n t Magnetic and e l e c t r i c f i e l d ! q B/m = k1 z q E /m = k2 x + k3 y + k4 z ! ======================================================== s u b r o u t i n e F ( T , Y , YP ) include ’ sr . inc ’ real (8) : : t r e a l ( 8 ) : : Y ( * ) , YP ( * ) r e a l ( 8 ) : : x1 , x2 , x3 , v1 , v2 , v3 , p1 , p2 , p3 x1 = Y ( 1 ) ; p1 = Y ( 4 ) x2 = Y ( 2 ) ; p2 = Y ( 5 ) x3 = Y ( 3 ) ; p3 = Y ( 6 ) c a l l velocity ( p1 , p2 , p3 , v1 , v2 , v3 ) ! now we can use a l l x1 , x2 , x3 , p1 , p2 , p3 , v1 , v2 , v3 YP ( 1 ) = v1 YP ( 2 ) = v2 YP ( 3 ) = v3 ! Acceleration : YP ( 4 ) = k2 + k1 * v2 YP ( 5 ) = k3 − k1 * v1 YP ( 6 ) = k4 6.3. RELATIVISTIC MOTION 303 end s u b r o u t i n e F ! ======================================================== ! Energy per u n i t r e s t mass ! ======================================================== r e a l ( 8 ) f u n c t i o n energy ( T , Y ) include ’ sr . inc ’ real (8) : : t , e real (8) : : Y ( * ) r e a l ( 8 ) : : x1 , x2 , x3 , v1 , v2 , v3 , p1 , p2 , p3 , psq x1 = Y ( 1 ) ; p1 = Y ( 4 ) x2 = Y ( 2 ) ; p2 = Y ( 5 ) x3 = Y ( 3 ) ; p3 = Y ( 6 ) psq= p1 * p1+p2 * p2+p3 * p3 ! K i n e t i c Energy / m_0 e = s q r t ( 1 . 0 D0+psq ) −1.0D0 ! P o t e n t i a l Energy / m_0 e = e − k2 * x1 − k3 * x2 − k4 * x3 energy = e end f u n c t i o n energy The results are shown in figures 6.5–6.6. z 2 1.6 1.2 0.8 0.4 0.4 0 0 y 1.2 x 1.6 -0.4 Figure 6.5: The trajectory of a relativistic charged particle in a magnetic field ⃗ = Bz ẑ with qBz /m0 = 10.0, ⃗v (0) = 0.95ŷ + 0.10ẑ, ⃗r(0) = 1.0x̂. The integration is B performed by using the RK45 method from t0 = 0 to tf = 20 with 1000 steps. Each axis is on a different scale. 304 CHAPTER 6. MOTION IN SPACE 0.4 0.3 0.2 0.1 0 -0.1 -0.2 -0.3 -0.4 0.9 1 1.1 1.2 1.3 1.4 1.5 1.6 1.7 Figure 6.6: Projection of the trajectory of a relativistic charged particle in a magnetic ⃗ = Bz ẑ with qBz /m0 = 10.0, on the xy plane. ⃗v (0) = 0.95ŷ + 0.10ẑ, ⃗r(0) = 1.0x̂. field B The integration is performed by using the RK45 method from t0 = 0 to tf = 20 with 1000 steps. Each axis is on a different scale. Now we can study a more interesting problem. Consider a simple model of the Van Allen radiation belt. Assume that the electrons are moving within the Earth’s magnetic field which is modeled after a mag- netic dipole field of the form: ( )3 [ ] RE ⃗ = B0 B 3(dˆ · r̂) r̂ − dˆ , (6.10) r where d⃗ = ddˆ is the magnetic dipole moment of the Earth’s magnetic field and ⃗r = rr̂. The parameter values are approximately equal to B0 = 3.5 × 10−5 T , r ∼ 2RE , where RE is the radius of the Earth. The typical energy of the moving√particles is ∼ 1 √MeV which corresponds to velocities of magnitude v/c = E − m0 /E ≈ 1 − 0.5122 /1 = 0.86. We choose the 2 2 coordinate axes so that dˆ = ẑ and we measure distance in RE units⁸. Then ⁸Since c = 1, the unit of time is the time that the light needs to travel distance equal to RE in the vacuum. 6.3. RELATIVISTIC MOTION 305 z 100 80 60 40 20 0.4 0 0 1.2 y x 1.6 -0.4 Figure 6.7: ⃗ The influence of an additional electric field q E/m0 = 1.0ẑ on the trajectory shown in figure 6.5. we obtain: 3xz Bx = B0 r5 3yz By = B0 5 (r ) 3zz 1 Bz = B0 − 3 (6.11) r5 r The magnetic dipole field is programmed in the file sr_Bd.f90: ! ======================================================== ! P a r t i c l e i n Magnetic d i p o l e f i e l d : ! q B_1 /m = k1 (3 x1 x3 ) / r ^5 ! q B_2 /m = k1 (3 x2 x3 ) / r ^5 ! q B_3 /m = k1 [ ( 3 x3 x3 ) / r ^5 −1/ r ^3] ! ======================================================== s u b r o u t i n e F ( T , Y , YP ) include ’ sr . inc ’ real (8) : : t r e a l ( 8 ) : : Y ( * ) , YP ( * ) r e a l ( 8 ) : : x1 , x2 , x3 , v1 , v2 , v3 , p1 , p2 , p3 306 CHAPTER 6. MOTION IN SPACE r e a l ( 8 ) : : B1 , B2 , B3 real (8) : : r x1 = Y ( 1 ) ; p1 = Y ( 4 ) x2 = Y ( 2 ) ; p2 = Y ( 5 ) x3 = Y ( 3 ) ; p3 = Y ( 6 ) c a l l velocity ( p1 , p2 , p3 , v1 , v2 , v3 ) ! now we can use a l l x1 , x2 , x3 , p1 , p2 , p3 , v1 , v2 , v3 YP ( 1 ) = v1 YP ( 2 ) = v2 YP ( 3 ) = v3 ! Acceleration : r = s q r t ( x1 * x1+x2 * x2+x3 * x3 ) i f ( r . g t . 0 . 0 D0 ) then B1 = k1 * ( 3.0 D0 * x1 * x3 ) / r * * 5 B2 = k1 * ( 3.0 D0 * x2 * x3 ) / r * * 5 B3 = k1 * ( ( 3 . 0 D0 * x3 * x3 ) / r **5 −1/ r * * 3 ) YP ( 4 ) = v2 * B3−v3 * B2 YP ( 5 ) = v3 * B1−v1 * B3 YP ( 6 ) = v1 * B2−v2 * B1 else YP ( 4 ) = 0.0 D0 YP ( 5 ) = 0.0 D0 YP ( 6 ) = 0.0 D0 endif end s u b r o u t i n e F ! ======================================================== ! Energy per u n i t r e s t mass ! ======================================================== r e a l ( 8 ) f u n c t i o n energy ( T , Y ) include ’ sr . inc ’ real (8) : : t , e real (8) : : Y ( * ) r e a l ( 8 ) : : x1 , x2 , x3 , v1 , v2 , v3 , p1 , p2 , p3 , psq x1 = Y ( 1 ) ; p1 = Y ( 4 ) x2 = Y ( 2 ) ; p2 = Y ( 5 ) x3 = Y ( 3 ) ; p3 = Y ( 6 ) psq= p1 * p1+p2 * p2+p3 * p3 ! K i n e t i c Energy / m_0 e = s q r t ( 1 . 0 D0+psq ) −1.0D0 energy = e end f u n c t i o n energy The results are shown in figure 6.8. The parameters have been exag- gerated in order to achieve an aesthetically pleasant result. In reality, the electrons are moving in very thin spirals and the reader is encouraged to use more realistic values for the parameters ⃗v0 , B0 , ⃗r0 . The problem of why the effect is not seen near the equator is left as an exercise. 6.4. PROBLEMS 307 2 1.6 1.2 0.8 0.4 0 0.004 0 -0.004 -0.008 0.02 0.012 0.016 -0.012 0 0.004 0.008 Figure 6.8: The trajectory of a charged particle in a magnetic dipole field given by equation (6.11). We used B0 = 1000, ⃗r = 0.02x̂ + 2.00ẑ, ⃗v = −0.99999ẑ. The integration was done from t0 = 0 to tf = 5 in 10000 steps. 6.4 Problems 6.1 Compute the trajectory of a projectile moving in space in a con- stant gravitational field and under the influence of an air resistance proportional to the square of its speed. 6.2 Two point charges are moving with non relativistic speeds in a constant magnetic field B ⃗ = B ẑ. Assume that their interaction is given by the Coulomb force only. Write a program that computes their trajectory numerically using the RK45 method. 6.3 Write a program that computes the trajectory of the anisotropic harmonic oscillator F⃗ = −kx xx̂ −ky y ŷ −kz z ẑ. Compute the three dimensional Lissajous curves which √ appear for √ appropriate√values of the angular frequencies ωx = kx /m, ωy = ky /m, ωz = kz /m. 6.4 Two particles of mass M are at the fixed positions ⃗r1 = aẑ and ⃗r2 = −aẑ. A third particle of mass m interacts with them via a Newtonian gravitational force and moves at non relativistic speeds. 308 CHAPTER 6. MOTION IN SPACE Compute the particle’s trajectory and find initial conditions that result in a planar motion. 6.5 Solve problem 5.19 of page 283 using the RK45 method. Choose initial conditions so that the system executes only translational mo- tion. Next, choose initial conditions so that the system executes small vibrations and its center of mass remains stationary. Find the normal modes of the system and choose appropriate initial condi- tions that put the system in each one of them. 6.6 Solve the previous problem by putting the system in a box |x| ≤ L and |y| ≤ L. Hint: Look in the file springL.f90. 6.7 Solve the problem 5.20 in page 284 by using the RK45 method. 6.8 Solve the problem 5.21 in page 284 by using the RK45 method. 6.9 The electric field of an electric dipole p⃗ = pẑ is given by: E⃗ = Eρ ρ̂ + Ez ẑ 1 3p sin θ cos θ Eρ = 4πϵ0 r3 1 p(3 cos2 θ − 1) Ez = (6.12) 4πϵ0 r3 √ where ρ = x2 + y 2 = r sin θ, Ex = Eρ cos ϕ, Ey = Eρ sin ϕ and (r, θ, ϕ) are the polar coordinates of the point where the electric field is calculated. Calculate the trajectory of a test charge moving in this field at non relativistic speeds. Calculate the deviation between the relativistic and the non relativistic trajectories when the initial speed is 0.01c, 0.1c, 0.5c, 0.9c respectively (ignore radiation effects). 6.10 Consider a linear charge distribution with constant linear charge density λ. The electric field is given by ⃗ = Eρ ρ̂ = 1 2λ E ρ̂ 4πϵ0 ρ Calculate the trajectories of two equal negative test charges that move at non relativistic speeds in this field. Consider only the electrostatic Coulomb forces and ignore anything else. 6.4. PROBLEMS 309 6.11 Consider a linear charge distribution on four straight lines parallel to the z axis. The linear charge density is λ and it is constant. The four straight lines intersect the xy plane at the points (0, 0), (0, a), (a, 0), (a, a). Calculate the trajectory of a non relativistic charge in this field. Next, compute the relativistic trajectories (ignore all radiation effects). 6.12 Three particles of mass m interact via their Newtonian gravitational force. Compute their (non relativistic) trajectories in space. 310 CHAPTER 6. MOTION IN SPACE Chapter 7 Electrostatics In this chapter we will study the electric field generated by a static charge distribution. First we will compute the electric field lines and the equipo- tential surfaces of the electric field generated by a static point charge dis- tribution on the plane. Then we will study the electric field generated by a continuous charge distribution on the plane. This requires the numer- ical solution of an elliptic boundary value problem which will be done using successive over-relaxation (SOR) methods. 7.1 Electrostatic Field of Point Charges Consider N point charges Qi which are located at fixed positions on the plane given by their position vectors ⃗ri , i = 1, . . . , N . The electric field is given by Coulomb’s law 1 ∑ Qi N ⃗ r) = E(⃗ ρ̂i (7.1) 4πϵ0 i=1 |⃗r − ⃗ri |2 where ρ̂i = (⃗r − ⃗ri )/|⃗r − ⃗ri | is the unit vector in the direction of ⃗r − ⃗ri . The components of the field are 1 ∑ N Qi (x − xi ) Ex (x, y) = 4πϵ0 i=1 ((x − xi )2 + (y − yi )2 )3/2 1 ∑ N Qi (y − yi ) Ey (x, y) = , (7.2) 4πϵ0 i=1 ((x − xi )2 + (y − yi )2 )3/2 311 312 CHAPTER 7. ELECTROSTATICS The electrostatic potential at ⃗r is 1 ∑ N Qi V (⃗r) = V (x, y) = , (7.3) 4πϵ0 i=1 ((x − xi )2 + (y − yi )2 )1/2 and we have that ⃗ r) = −∇V E(⃗ ⃗ (⃗r) . (7.4) The electric field lines are the integral curves of the vector field E, ⃗ i.e. the curves whose tangent lines at each point are parallel to the electric field at that point. The magnitude of the electric field is proportional to the density of the field lines (the number of field lines per perpendicular ∫ area). This means that the electric flux ΦE = S E ⃗ · dA ⃗ through a surface S is proportional to the number of field lines that cross the surface. Electric field lines of point charge distributions start from positive charges (sources), end in negative charges (sinks) or extend to infinity. The equipotential surfaces are the loci of the points of space where the electrostatic potential takes fixed values. Τhey are closed surfaces. Equation (7.4) tells us that a strong electric field at a point is equivalent to a strong spatial variation of the electric potential at this point, i.e. to dense equipotential surfaces. The direction of the electric field is perpendicular to the equipotential surfaces at each point¹, which is the direction of the strongest spatial variation of V , and it points in the direction of decreasing V . The planar cross sections of the equipotential surfaces are closed curves which are called equipotential lines. The computer cannot solve a problem in the continuum and we have to consider a finite discretization of a field line. A continuous curve is approximated by a large but finite number of small line segments. The basic idea is illustrated in figure 7.1: The small line segment ∆l is taken in the direction of the electric field and we obtain Ex Ey ∆x = ∆l , ∆y = ∆l , (7.5) E E √ where E ≡ |E|⃗ = Ex2 + Ey2 . In order to calculate the equipotential lines we use the property that they are perpendicular to the electric field at each point. Therefore, if (∆x, ∆y) is in the tangential direction of a field line, then (−∆y, ∆x) is ¹Since for every small displacement d⃗r along an equipotential surface the potential stays constant (dV = 0), we have that 0 = dV = ∇V ⃗ · d⃗r = −E ⃗ · d⃗r, which implies E ⊥ d⃗r. ⃗ 7.1. ELECTROSTATIC FIELD OF POINT CHARGES 313 y E Ey ∆l ∆y ∆x Ex x Figure 7.1: The electric field is tangent at each point of an electric field line and perpendicular to an equipotential line. By approximating the continuous curve by the line segment ∆l, we have that ∆y/∆x = Ey /Ex . in the perpendicular direction since (∆x, ∆y) · (−∆y, ∆x) = −∆x∆y + ∆y∆x = 0. Therefore the equations that give the equipotential lines are Ey Ex ∆x = −∆l , ∆y = ∆l . (7.6) E E The algorithm that will allow us to perform an approximate calcula- tion of the electric field lines and the equipotential lines is the following: Choose an initial point that belongs to the (unique) line that you want to draw. The electric field can be calculated from the known electric charge distribution and equation (7.2). By using a small enough step ∆l we move in the direction (∆x, ∆y) to the new position x → x + ∆x , y → y + ∆y , (7.7) where we use equations (7.5) or (7.6). The procedure is repeated until the drawing is finished. The programmer sets a criterion for that, e.g. when the field line steps out of the drawing area or approaches a charge closer than a minimum distance. 314 CHAPTER 7. ELECTROSTATICS 7.2 The Program – Appetizer and ... Desert The hurried, but slightly experienced reader may skip the details of this section and go directly to section 7.4. There she can find the final form of the program and brief usage instructions. In order to program the algorithm described in the previous section, we will separate the algorithmic procedures into four different but well defined tasks: • Main program: The data structure, which is given by the position of the charges stored in the arrays X(P), Y(P) and the charges stored in the array Q(P), is defined. It also contains the user interface which consists of reading data entered by the user, like the number of charges N, their positions and magnitude. Then the calculation of a group of field or equipotential lines is performed by calling the routines eline or epotline respectively. • subroutine eline(xin,yin,X,Y,Q,N): Calculates the electric field line passing through the point xin,yin. On entry, the user inputs the point xin,yin and the data N, X(N), Y(N), Q(N). On exit, the subroutine prints to the stdout the coordinates of the approximate electric field line. The line extends up to a point that is either too close to one of the point charges or until the line leaves the drawing area². It calls the subroutines efield for the calculation of the electric field and mdist for the calculation of the minimum and maximum distance of a point on the field line from all the point charges. • subroutine epotline(xin,yin,X,Y,Q,N): Calculates the equipoten- tial line passing through the point xin,yin. On entry, the user inputs the point xin,yin and the data N, X(N), Y(N), Q(N). On exit, the subroutine prints to the stdout the coordinates of the ap- proximate equipotential line. The subroutine stops calculating an equipotential line when it comes back close enough to the original point³ xin,yin or when it leaves the drawing area. It calls the sub- routines efield for the calculation of the electric field and mdist for the calculation of the minimum and maximum distance of a point on the equipotential line from all the point charges. ²Remember that field lines start at sources, end at sinks or extend to infinity. ³Remember that the equipotential lines are closed. 7.2. THE PROGRAM – APPETIZER AND ... DESERT 315 • subroutine efield(x0,y0,X,Y,Q,N,Ex,Ey): Calculates the electric field Ex, Ey at position x0, y0. On entry, the user provides the number of charges N, the position of charges X(N), Y(N), the charges Q(N) and the position x0, y0. On exit, the routine provides the values Ex, Ey. • subroutine mdist(x0,y0,X,Y,N,rmin,rmax): Calculates the maxi- mum and minimum distance of the point x0, y0 from all charges located at X(N), Y(N). On entry, the user provides the number of charges N, the position of charges X(N), Y(N) and the point x0, y0. On exit, the routine provides the minimum and maximum distances rmin,rmax. In the main program, the variables N, X(N), Y(N) and Q(N) must be set. These can be hard coded by the programmer or entered by the user interactively. The first choice is coded in the program listed below, which can be found in the file ELines.f90. This is version 1 of the main program: ! **************************************************** program Electric_Fields ! **************************************************** i m p l i c i t none i n t e g e r , parameter : : P=20 ! max number o f c h a r g e s r e a l , dimension ( P ) : : X , Y , Q integer :: N !−−−−−−−−−−−−− SET CHARGE DISTRIBUTION −−−− N = 2 X (1) = 1.0 Y ( 1 ) = 0.0 Q (1) = 1.0 X ( 2 ) = −1.0 Y ( 2 ) = 0.0 Q ( 2 ) = −1.0 !−−−−−−−−−−−−− DRAWING LINES −−−−−−−−−−−−− c a l l eline ( 0 . 0 , 0 . 5 , X , Y , Q , N ) c a l l eline ( 0 . 0 , 1 . 0 , X , Y , Q , N ) c a l l eline ( 0 . 0 , 1 . 5 , X , Y , Q , N ) c a l l eline ( 0 . 0 , 2 . 0 , X , Y , Q , N ) c a l l eline ( 0 . 0 , − 0 . 5 , X , Y , Q , N ) c a l l eline ( 0 . 0 , − 1 . 0 , X , Y , Q , N ) c a l l eline ( 0 . 0 , − 1 . 5 , X , Y , Q , N ) c a l l eline ( 0 . 0 , − 2 . 0 , X , Y , Q , N ) end program Electric_Fields 316 CHAPTER 7. ELECTROSTATICS The commands !−−−−−−−−−−−−− SET CHARGE DISTRIBUTION −−−− N = 2 X (1) = 1.0 Y ( 1 ) = 0.0 Q (1) = 1.0 X ( 2 ) = −1.0 Y ( 2 ) = 0.0 Q ( 2 ) = −1.0 define two opposite charges Q(1)= -Q(2)= 1.0 located at (1, 0) and (−1, 0) respectively. The next lines call the subroutine eline in order to per- form the calculation of 8 field lines passing through the points (0, ±1/2), (0, ±1), (0, ±3/2), (0, ±2): !−−−−−−−−−−−−− DRAWING LINES −−−−−−−−−−−−− c a l l eline ( 0 . 0 , 0 . 5 , X , Y , Q , N ) c a l l eline ( 0 . 0 , 1 . 0 , X , Y , Q , N ) c a l l eline ( 0 . 0 , 1 . 5 , X , Y , Q , N ) c a l l eline ( 0 . 0 , 2 . 0 , X , Y , Q , N ) c a l l eline ( 0 . 0 , − 0 . 5 , X , Y , Q , N ) c a l l eline ( 0 . 0 , − 1 . 0 , X , Y , Q , N ) c a l l eline ( 0 . 0 , − 1 . 5 , X , Y , Q , N ) c a l l eline ( 0 . 0 , − 2 . 0 , X , Y , Q , N ) These commands print the coordinates of the field lines to the stdout and the user can analyze them further. The program for calculating the equipotential lines is quite similar. The calls to the subroutine eline are substituted by calls to epotline. For the program to be complete, we must program the subroutines eline, efield, mdist. This will be done later, and you can find the full code in the file ELines.f90. For the moment, let’s copy the main program⁴ listed above into the file Elines.f90 and compile and run it with the commands: > g f o r t r a n ELines . f90 −o el > . / el > el . out The stdout of the program is redirected to the file el.out. We can plot the results with gnuplot: ⁴See the file ELines_version0.f90. 7.2. THE PROGRAM – APPETIZER AND ... DESERT 317 gnuplot > plot ” e l . out ” with dots The result is shown in figure 7.2. 2 1.5 1 0.5 0 -0.5 -1 -1.5 -2 -1.5 -1 -0.5 0 0.5 1 1.5 Figure 7.2: Some electric field lines of the electric field of two opposite charges calculated by the program ELines.f90 (version 1!). Let’s modify the program so that the user can enter the charge dis- tribution, as well as the number and position of the field lines that she wants to draw, interactively. The part of the code that we need to change is: !−−−−−−−−−−−−− SET CHARGE DISTRIBUTION −−−− p r i n t * , ’ # Enter number o f c h a r g e s : ’ read * , N p r i n t * , ’ # N= ’ , N do i =1 , N p r i n t * , ’ # Charge : ’ , i p r i n t * , ’ # P o s i t i o n and charge : (X, Y , Q) : ’ read * , X ( i ) , Y ( i ) , Q ( i ) p r i n t * , ’ # (X, Y)= ’ , X ( i ) , Y ( i ) , ’ Q= ’ , Q ( i ) enddo The first line asks the user to enter the number of charges in the distri- bution. It proceeds with reading it from the stdin and prints the result 318 CHAPTER 7. ELECTROSTATICS to the stdout. The following loop reads the positions and charges and stores them at the position i of the arrays X(i), Y(i), Q(i). The results are printed to the stdout so that the user can check the values read by the program. The drawing of the field lines is now done by modifying the code so that: !−−−−−−−−−−−−− DRAWING LINES −−−−−−−−−−−−− p r i n t * , ’ # How many l i n e s t o draw? ’ read * , draw do i =1 , draw p r i n t * , ’ # I n i t i a l p o i n t ( x0 , y0 ) : ’ read * , x0 , y0 c a l l eline ( x0 , y0 , X , Y , Q , N ) enddo As a test case, we run the program for one charge q = 1.0 located at the origin and we draw one field line passing through the point (0.1, 0.1). > gfortran ELines . f90 −o el > . / el # Enter number of charges : 1 # N= 1 # Charge : 1 # Position and charge : ( X , Y , Q ) : 0.0 0.0 1 . 0 # ( X , Y )= 0.000000 0.000000 Q= 1.000000 # How many lines to draw ? 1 # Initial point ( x 0 , y 0) : 0.1 0.1 9.2928931E−02 9.2928931E−02 8.5857861E−02 8.5857861E−02 7.8786790 E−02 7.8786790 E−02 .... For charge distributions with a large number of point charges, use an editor to record the charges, their positions and the points where the field lines should go through. 2 N : Number of Charges 1 . 0 0.0 1 . 0 ( X , Y , Q ) : Position and charge −1.0 0.0 −1.0 ( X , Y , Q ) : Position and charge 8 Number of lines to draw 7.2. THE PROGRAM – APPETIZER AND ... DESERT 319 0.0 0.5 x0 ,y 0: Initial point of line 0.0 1.0 x0 ,y 0: Initial point of line 0.0 1.5 x0 ,y 0: Initial point of line 0.0 2.0 x0 ,y 0: Initial point of line 0.0 −0.5 x0 ,y 0: Initial point of line 0.0 −1.0 x0 ,y 0: Initial point of line 0.0 −1.5 x0 ,y 0: Initial point of line 0.0 −2.0 x0 ,y 0: Initial point of line If the data listed above is written into a file, e.g. Input, then the com- mand . / el < Input > el . out reads the data from the file Input and redirects the data printed to the stdout to the file el.out. This way you can create a “library” of charge distributions and the field lines of their respective electric fields. The complete code (version 2) is listed below: ! **************************************************** program Electric_Fields ! **************************************************** i m p l i c i t none i n t e g e r , parameter : : P=20 ! max number o f c h a r g e s r e a l , dimension ( P ) : : X , Y , Q integer :: N integer : : i , j , draw real : : x0 , y0 !−−−−−−−−−−−−− SET CHARGE DISTRIBUTION −−−− p r i n t * , ’ # Enter number o f c h a r g e s : ’ read * , N p r i n t * , ’ # N= ’ , N do i =1 , N p r i n t * , ’ # Charge : ’ , i p r i n t * , ’ # P o s i t i o n and charge : (X, Y , Q) : ’ read * , X ( i ) , Y ( i ) , Q ( i ) p r i n t * , ’ # (X, Y)= ’ , X ( i ) , Y ( i ) , ’ Q= ’ , Q ( i ) enddo !−−−−−−−−−−−−− DRAWING LINES −−−−−−−−−−−−− p r i n t * , ’ # How many l i n e s t o draw? ’ read * , draw do i =1 , draw p r i n t * , ’ # I n i t i a l p o i n t ( x0 , y0 ) : ’ read * , x0 , y0 c a l l eline ( x0 , y0 , X , Y , Q , N ) enddo end program Electric_Fields 320 CHAPTER 7. ELECTROSTATICS If you did the exercises described above, you should have already realized that in order to draw a nice representative picture of the electric field can be time consuming. For field lines one can use simple physical intuition in order to automate the procedure. For distances close enough to a point charge the electric field is approximately isotropic. The number of field lines crossing a small enough curve which contains only the charge is proportional to the charge (Gauss’s law). Therefore we can draw a small circle centered around each charge and choose initial points isotropically distributed on the circle as initial points of the field lines. The code listed below (version 3) implements the idea for charges that are equal in magnitude. For charges different in magnitude, the program is left as an exercise to the reader. ! **************************************************** program Electric_Fields ! **************************************************** i m p l i c i t none i n t e g e r , parameter : : P=20 ! max number o f c h a r g e s r e a l , dimension ( P ) : : X , Y , Q integer :: N integer : : i , j , nd real : : x0 , y0 , theta r e a l , parameter : : PI= 3.14159265359 !−−−−−−−−−−−−− SET CHARGE DISTRIBUTION −−−− p r i n t * , ’ # Enter number o f c h a r g e s : ’ read * , N p r i n t * , ’ # N= ’ , N do i =1 , N p r i n t * , ’ # Charge : ’ , i p r i n t * , ’ # P o s i t i o n and charge : (X, Y , Q) : ’ read * , X ( i ) , Y ( i ) , Q ( i ) p r i n t * , ’ # (X, Y)= ’ , X ( i ) , Y ( i ) , ’ Q= ’ , Q ( i ) enddo !−−−−−−−−−−−−− DRAWING LINES −−−−−−−−−−−−− !We draw 2*nd f i e l d l i n e s around each charge nd = 6 do i = 1 , N do j = 1 , ( 2 * nd ) theta = ( PI / nd ) * j x0 = X ( i ) + 0 . 1 * c o s ( theta ) y0 = Y ( i ) + 0 . 1 * s i n ( theta ) c a l l eline ( x0 , y0 , X , Y , Q , N ) enddo enddo 7.2. THE PROGRAM – APPETIZER AND ... DESERT 321 end program Electric_Fields We set the number of field lines around each charge to be equal to 12 (nd=6). The initial points are taken on the circle whose center is (X(i),Y(i)) and its radius is 0.1. The 2*nd points are determined by the angle theta=(PI/nd)*j. We record the data of a charge distribution in a file, e.g. Input. Below, we list the example of four equal charges qi = ±1 located at the vertices of a square: 4 N : Number of charges 1 1 −1 ( X , Y , Q ) : Position and charge −1 1 1 ( X , Y , Q ) : Position and charge 1 −1 1 ( X , Y , Q ) : Position and charge −1 −1 −1 ( X , Y , Q ) : Position and charge Then we give the commands: > gfortran ELines . f90 −o el > . / el < Input > el . out > gnuplot gnuplot > p l o t ” e l . out ” with dots The results are shown in figures 7.3 and 7.4. The reader should deter- mine the charge distributions that generate those fields and reproduce the figures as an exercise. For the computation of the equipotential lines we can work in a similar way. We will follow a quick and dirty way which will not produce an accurate picture of the electric field and choose the initial points evenly spaced on an square lattice. For a better choice see problem 5. The listed code is in the file EPotential.f90: ! **************************************************** program Electric_Potential ! **************************************************** i m p l i c i t none i n t e g e r , parameter : : P=20 ! max number o f c h a r g e s r e a l , dimension ( P ) : : X , Y , Q integer :: N r e a l , parameter : : PI= 3.14159265359 integer : : i , j , nd real : : x0 , y0 , rmin , rmax , L p r i n t * , ’ # Enter number o f c h a r g e s : ’ 322 CHAPTER 7. ELECTROSTATICS 4 3 2 1 0 -1 -2 -3 -4 -4 -3 -2 -1 0 1 2 3 4 4 4 3 3 2 2 1 1 0 0 -1 -1 -2 -2 -3 -3 -4 -4 -4 -3 -2 -1 0 1 2 3 4 -4 -3 -2 -1 0 1 2 3 4 Figure 7.3: Field lines of a static charge distribution of point charges generated by the program ELines.f90. read * , N p r i n t * , ’ # N= ’ , N do i =1 , N p r i n t * , ’ # Charge : ’ , i p r i n t * , ’ # P o s i t i o n and charge : (X, Y , Q) : ’ read * , X ( i ) , Y ( i ) , Q ( i ) p r i n t * , ’ # (X, Y)= ’ , X ( i ) , Y ( i ) , ’ Q= ’ , Q ( i ) enddo !−−−−−−−−−−−−− DRAWING LINES −−−−−−−−−−−−− !We draw l i n e s p a s s i n g through an e q u a l l y ! spaced l a t t i c e o f N=(2*nd+1) x ( 2 * nd+1) p o i n t s ! i n t h e square −L<= x <= L , −L<= y <= L . nd = 4 L = 1.0 do i = −nd , nd do j = −nd , nd x0 = i * ( L / nd ) y0 = j * ( L / nd ) p r i n t * , ’ # @ ’ , i , j , L / nd , x0 , y0 c a l l mdist ( x0 , y0 , X , Y , N , rmin , rmax ) ! we avoid g e t t i n g t o o c l o s e t o a charge : i f ( rmin . g t . L / ( nd * 1 0 ) )& c a l l epotline ( x0 , y0 , X , Y , Q , N ) 7.3. THE PROGRAM – MAIN DISH 323 4 4 3 3 2 2 1 1 0 0 -1 -1 -2 -2 -3 -3 -4 -4 -4 -3 -2 -1 0 1 2 3 4 -4 -3 -2 -1 0 1 2 3 4 Figure 7.4: Field lines of a static charge distribution of point charges generated by the program ELines.f90. enddo enddo end program Electric_Potential The first and second part of the code is identical to the previous one. In the third part we call the subroutine epotline for drawing an equipo- tential line for each initial point. The initial points are on a square lattice with (2*nd+1)*(2*nd+1)= 81 points (nd=4). The lattice extends within the limits set by the square (1, 1), (−1, 1), (−1, −1), (1, −1) (L=1.0). For each point (x0,y0) we calculate the equipotential line that passes through it. We check that this point is not too close to one of the charges by calling the subroutine mdist. The call determines the minimum distance rmin of the point from all the charges which should be larger than L/(nd*10). You can run the program with the commands: > g f o r t r a n EPotential . f90 −o ep > . / ep < Input > ep . out > gnuplot gnuplot > p l o t ” ep . out ” with dots Some of the results are shown in figure 7.5. 7.3 The Program – Main Dish In this section we look under the hood and give the details of the inner parts of the program: The subroutines eline and epotline that calculate the field and equipotential lines, the subroutine efield that calculates the electric field at a point and the subroutine mdist that calculates the 324 CHAPTER 7. ELECTROSTATICS 1.5 1 0.5 0 -0.5 -1 -1.5 -2 -1.5 -1 -0.5 0 0.5 1 1.5 2 10 3 2 5 1 0 0 -1 -5 -2 -3 -10 -3 -2 -1 0 1 2 3 -10 -5 0 5 10 Figure 7.5: Equipotential lines of the electric field generated by a point charge distri- bution on the plane calculated by the program in EPotential.f90. Beware: the density of the lines is not correctly calculated and it is not proportional to the magnitude of the electric field. See problem 7.5. minimum and maximum distances of a point from the point charges. The subroutine eline is called by the command: call eline ( x0 , y0 , X , Y , Q , N ) The input to the routine is the initial point (x0,y0), the number of charges N, the positions of the charges (X(N),Y(N)) and the charges Q(N). The routine needs some parameters in order to draw the field line. These are “hard coded”, i.e. set to fixed values by the programmer that cannot be changed by the user that calls the routine in her program. One of them is the step ∆l of equation (7.5) which sets the discretization step of the field line. It also sets the minimum distance of approaching to a charge equal to 2∆l. The size of the drawing area of the curve is set by the parameter max_dist=20.0. We should also provide a check in the program that checks whether the electric field is zero, in which case the result of the calculation in equation (7.5) becomes indeterminate. By taking ∆l > 0, the motion is in the direction of the electric field, which ends on a negative charge or outside the drawing area (why?). In order 7.3. THE PROGRAM – MAIN DISH 325 to draw the line in both directions, set ∆l < 0 and repeat the calculation. The code is listed below: ! **************************************************** s u b r o u t i n e eline ( xin , yin , X , Y , Q , N ) ! **************************************************** i m p l i c i t none integer :: N r e a l , dimension ( N ) : : X , Y , Q real : : xin , yin , x0 , y0 r e a l , parameter : : step =0.01 r e a l , parameter : : max_dist =20.0 integer : : i , direction real : : rmin , rmax , r , dx , dy , dl real : : Ex , Ey , E do direction = −1 ,1 ,2 ! d i r e c t i o n = +/− 1 dl = direction * step x0 = xin y0 = yin dx = 0.0 dy = 0.0 c a l l mdist ( x0 , y0 , X , Y , N , rmin , rmax ) do while ( rmin . g t . ( 2 . 0 * step ) . and . rmax . l t . max_dist ) p r i n t * , x0 , y0 ! We e v a l u a t e t h e E−f i e l d a t t h e midpoint : This r e d u c e s ! systematic errors c a l l efield ( x0 +0.5* dx , y0 +0.5* dy , X , Y , Q , N , Ex , Ey ) E = s q r t ( Ex * Ex+Ey * Ey ) i f ( E . l e . 1 . 0 e−10 ) e x i t dx = dl * Ex / E dy = dl * Ey / E x0 = x0 + dx y0 = y0 + dy c a l l mdist ( x0 , y0 , X , Y , N , rmin , rmax ) enddo ! do while ( ) enddo ! do d i r e c t i o n = −1 ,1 ,2 end s u b r o u t i n e eline In the first part of the code we have the variable declarations. We only note the declaration r e a l , dimension ( N ) : : X , Y , Q which declares the dimension of the arrays to be N instead of their true dimension P. This is fine, as long as the programmer of the calling pro- gram has already checked that N ≤ P. The necessary memory for the 326 CHAPTER 7. ELECTROSTATICS arrays is allocated in the calling program and the declaration does not provide new storage space. The arrays X,Y, Q are passed to the sub- routine “by reference”, i.e. the routine learns about their position in the memory to which it can refer to, and not “by value”. The parameters ∆l = step and max_dist are fixed by the parameter attribute: r e a l , parameter : : step =0.01 r e a l , parameter : : max_dist =20.0 Their values should be the result of a careful study by the programmer since they determine the accuracy of the calculation. The outmost loop do direction = −1 ,1 ,2 dl = direction * step ... enddo sets the direction of motion on the field line (i.e. the sign of ∆l). The command do direction = -1,1,2 executes the loop twice by setting the variable direction to take values from −1 to 1 with step equal to 2. The commands x0 = xin, y0 = yin define the initial point on the field line. (x0, y0) is the current point on the field line which is printed to the stdout with the command print. The variables (dx, dy) set the step (x0, y0) → (x0+dx, y0+dy). The drawing of the field line is done in the inner loop c a l l mdist ( x0 , y0 , X , Y , N , rmin , rmax ) do while ( rmin . g t . ( 2 . 0 * step ) . and . rmax . l t . max_dist ) ... c a l l mdist ( x0 , y0 , X , Y , N , rmin , rmax ) enddo which is executed provided that the logical expression (rmin .gt. (2.0*step) .and. rmax .lt. max_dist) is .TRUE. This happens as long as the current point is at a distance greater than 2.0*step and the maximum distance from all charges is less than max_dist⁵. The minimum and maximum distances are calculated by calling the subroutine mdist. The electric field, needed in equation (7.5), is calculated by a call to efield(x0+0.5*dx,y0+0.5*dy,X,Y,Q,N,Ex,Ey). The first two arguments give the point at which we want to calculate the electric field, which is ⁵The choice is not unique of course, you may also try e.g. rmin .lt. max_dist. 7.3. THE PROGRAM – MAIN DISH 327 chosen to be the midpoint (x0+dx/2,y0+dy/2) instead of (x0,y0). This improves the stability and the accuracy of the algorithm. Equation (7.5) is coded in the commands E = s q r t ( Ex * Ex+Ey * Ey ) dx = dl * Ex / E dy = dl * Ey / E x0 = x0 + dx y0 = y0 + dy We also perform checks for the cases E=0.0 and dx=dy=0.0: i f ( E . l e . 1 . 0 e−10 ) e x i t When the magnitude of the electric field becomes too small we stop the calculation by exiting the loop with the command exit. The reader can improve the code by adding more checks of singular cases. The subroutine epotline is programmed in a similar way. The rele- vant code is listed below: ! **************************************************** s u b r o u t i n e epotline ( xin , yin , X , Y , Q , N ) ! **************************************************** i m p l i c i t none integer :: N r e a l , dimension ( N ) : : X , Y , Q real : : xin , yin , x0 , y0 r e a l , parameter : : step =0.02 r e a l , parameter : : max_dist =20.0 integer :: i real : : r , dx , dy , dl real : : Ex , Ey , E dl = step x0 = xin y0 = yin dx = 0.0 dy = 0.0 r = step ! i n order t o s t a r t loop do while ( r . g t . ( 0 . 9 * dl ) . and . r . l t . max_dist ) p r i n t * , x0 , y0 ! We e v a l u a t e t h e E−f i e l d a t t h e midpoint : This r e d u c e s ! systematic errors c a l l efield ( x0 +0.5* dx , y0 +0.5* dy , X , Y , Q , N , Ex , Ey ) E = s q r t ( Ex * Ex+Ey * Ey ) 328 CHAPTER 7. ELECTROSTATICS i f ( E . l e . 1 . 0 e−10 ) e x i t dx = dl * Ey / E dy = −dl * Ex / E x0 = x0 + dx y0 = y0 + dy r = s q r t ( ( x0−xin ) * * 2 + ( y0−yin ) * * 2 ) enddo ! do while ( ) end s u b r o u t i n e epotline The differences are minor: The equipotential lines are closed curves, therefore we only need to transverse them in one direction. The criterion for ending the calculation is to approach the initial point close enough or leave the drawing area: do while ( r . g t . ( 0 . 9 * dl ) . and . r . l t . max_dist ) ... enddo The values of dx, dy are calculated according to equation (7.6): dx = dl * Ey / E dy = −dl * Ex / E The subroutine efield is an application of equations⁶ (7.2): ! **************************************************** s u b r o u t i n e efield ( x0 , y0 , X , Y , Q , N , Ex , Ey ) ! **************************************************** i m p l i c i t none integer :: N r e a l , dimension ( N ) : : X , Y , Q real : : x0 , y0 , dx , dy , Ex , Ey integer :: i real : : r3 , xi , yi Ex = 0.0 Ey = 0.0 do i= 1 ,N xi = x0−X ( i ) yi = y0−Y ( i ) r3 = ( xi * xi+yi * yi ) * * ( − 1 . 5 ) Ex = Ex + Q ( i ) * xi * r3 Ey = Ey + Q ( i ) * yi * r3 enddo ⁶You may improve the program by checking whether ri = 0. 7.4. THE PROGRAM - CONCLUSION 329 end s u b r o u t i n e efield Finally, the subroutine mdist calculates the minimum and maximum distance rmin and rmax of a point (x0,y0) from all the point charges in the distribution: ! **************************************************** s u b r o u t i n e mdist ( x0 , y0 , X , Y , N , rmin , rmax ) ! **************************************************** i m p l i c i t none integer :: N r e a l , dimension ( N ) : : X , Y real : : x0 , y0 , rmin , rmax integer :: i real :: r rmax = 0.0 rmin = 1000.0 do i = 1 , N r = s q r t ( ( x0−X ( i ) ) * * 2 + ( y0−Y ( i ) ) * * 2 ) i f ( r . GT . rmax ) rmax = r i f ( r . LT . rmin ) rmin = r enddo end s u b r o u t i n e mdist The initial value of rmin depends of the limits of the drawing area (why?). 7.4 The Program - Conclusion In this section we list the programs discussed in the previous sections and provide short usage information for compiling, running and analyzing your results. You can jump into this section without reading the previous ones and go back to them if you need to clarify some points that you find hard to understand. First we list the contents of the file ELines.f90: ! **************************************************** program Electric_Fields ! **************************************************** i m p l i c i t none i n t e g e r , parameter : : P=20 ! max number o f c h a r g e s r e a l , dimension ( P ) : : X , Y , Q integer :: N integer : : i , j , nd 330 CHAPTER 7. ELECTROSTATICS real : : x0 , y0 , theta r e a l , parameter : : PI= 3.14159265359 !−−−−−−−−−−−−− SET CHARGE DISTRIBUTION −−−− p r i n t * , ’ # Enter number o f c h a r g e s : ’ read * , N p r i n t * , ’ # N= ’ , N do i =1 , N p r i n t * , ’ # Charge : ’ , i p r i n t * , ’ # P o s i t i o n and charge : (X, Y , Q) : ’ read * , X ( i ) , Y ( i ) , Q ( i ) p r i n t * , ’ # (X, Y)= ’ , X ( i ) , Y ( i ) , ’ Q= ’ , Q ( i ) enddo !−−−−−−−−−−−−− DRAWING LINES −−−−−−−−−−−−− !We draw 2*nd f i e l d l i n e s around each charge nd = 6 do i = 1 , N do j = 1 , ( 2 * nd ) theta = ( PI / nd ) * j x0 = X ( i ) + 0 . 1 * c o s ( theta ) y0 = Y ( i ) + 0 . 1 * s i n ( theta ) c a l l eline ( x0 , y0 , X , Y , Q , N ) enddo enddo end program Electric_Fields ! **************************************************** s u b r o u t i n e eline ( xin , yin , X , Y , Q , N ) ! **************************************************** i m p l i c i t none integer :: N r e a l , dimension ( N ) : : X , Y , Q real : : xin , yin , x0 , y0 r e a l , parameter : : step =0.01 r e a l , parameter : : max_dist =20.0 integer : : i , direction real : : rmin , rmax , r , dx , dy , dl real : : Ex , Ey , E do direction = −1 ,1 ,2 ! d i r e c t i o n = +/− 1 dl = direction * step x0 = xin y0 = yin dx = 0.0 dy = 0.0 c a l l mdist ( x0 , y0 , X , Y , N , rmin , rmax ) do while ( rmin . g t . ( 2 . 0 * step ) . and . rmax . l t . max_dist ) p r i n t * , x0 , y0 ! We e v a l u a t e t h e E−f i e l d a t t h e midpoint : This r e d u c e s ! systematic errors c a l l efield ( x0 +0.5* dx , y0 +0.5* dy , X , Y , Q , N , Ex , Ey ) E = s q r t ( Ex * Ex+Ey * Ey ) 7.4. THE PROGRAM - CONCLUSION 331 i f ( E . l e . 1 . 0 e−10 ) e x i t dx = dl * Ex / E dy = dl * Ey / E x0 = x0 + dx y0 = y0 + dy c a l l mdist ( x0 , y0 , X , Y , N , rmin , rmax ) enddo ! do while ( ) enddo ! do d i r e c t i o n = −1 ,1 ,2 end s u b r o u t i n e eline ! **************************************************** s u b r o u t i n e efield ( x0 , y0 , X , Y , Q , N , Ex , Ey ) ! **************************************************** i m p l i c i t none integer :: N r e a l , dimension ( N ) : : X , Y , Q real : : x0 , y0 , dx , dy , Ex , Ey integer :: i real : : r3 , xi , yi Ex = 0.0 Ey = 0.0 do i= 1 , N xi = x0−X ( i ) yi = y0−Y ( i ) ! E x e r c i s e : Improve code so t h a t x i * x i + y i * y i =0 i s taken c a r e o f r3 = ( xi * xi+yi * yi ) * * ( − 1 . 5 ) Ex = Ex + Q ( i ) * xi * r3 Ey = Ey + Q ( i ) * yi * r3 enddo end s u b r o u t i n e efield ! **************************************************** s u b r o u t i n e mdist ( x0 , y0 , X , Y , N , rmin , rmax ) ! **************************************************** i m p l i c i t none integer :: N r e a l , dimension ( N ) : : X , Y real : : x0 , y0 , rmin , rmax integer :: i real :: r rmax = 0.0 rmin = 1000.0 do i = 1 , N r = s q r t ( ( x0−X ( i ) ) * * 2 + ( y0−Y ( i ) ) * * 2 ) i f ( r . GT . rmax ) rmax = r i f ( r . LT . rmin ) rmin = r enddo end s u b r o u t i n e mdist 332 CHAPTER 7. ELECTROSTATICS Then we list the contents of the file EPotential.f90: ! **************************************************** program Electric_Potential ! **************************************************** i m p l i c i t none i n t e g e r , parameter : : P=20 ! max number o f c h a r g e s r e a l , dimension ( P ) : : X , Y , Q integer :: N r e a l , parameter : : PI= 3.14159265359 integer : : i , j , nd real : : x0 , y0 , rmin , rmax , L p r i n t * , ’ # Enter number o f c h a r g e s : ’ read * , N p r i n t * , ’ # N= ’ , N do i =1 , N p r i n t * , ’ # Charge : ’ , i p r i n t * , ’ # P o s i t i o n and charge : (X, Y , Q) : ’ read * , X ( i ) , Y ( i ) , Q ( i ) p r i n t * , ’ # (X, Y)= ’ , X ( i ) , Y ( i ) , ’ Q= ’ , Q ( i ) enddo !−−−−−−−−−−−−− DRAWING LINES −−−−−−−−−−−−− !We draw l i n e s p a s s i n g through an e q u a l l y ! spaced l a t t i c e o f N=(2*nd+1) x ( 2 * nd+1) p o i n t s ! i n t h e square −L<= x <= L , −L<= y <= L . nd = 4 L = 1.0 do i = −nd , nd do j = −nd , nd x0 = i * ( L / nd ) y0 = j * ( L / nd ) p r i n t * , ’ # @ ’ , i , j , L / nd , x0 , y0 c a l l mdist ( x0 , y0 , X , Y , N , rmin , rmax ) ! we avoid g e t t i n g t o o c l o s e t o a charge : i f ( rmin . g t . L / ( nd * 1 0 ) )& c a l l epotline ( x0 , y0 , X , Y , Q , N ) enddo enddo end program Electric_Potential ! **************************************************** s u b r o u t i n e epotline ( xin , yin , X , Y , Q , N ) ! **************************************************** i m p l i c i t none integer :: N r e a l , dimension ( N ) : : X , Y , Q real : : xin , yin , x0 , y0 r e a l , parameter : : step =0.02 7.4. THE PROGRAM - CONCLUSION 333 r e a l , parameter :: max_dist =20.0 integer :: i real :: r , dx , dy , dl real :: Ex , Ey , E dl = step x0 = xin y0 = yin dx = 0.0 dy = 0.0 r = step ! i n order t o s t a r t loop do while ( r . g t . ( 0 . 9 * dl ) . and . r . l t . max_dist ) p r i n t * , x0 , y0 ! We e v a l u a t e t h e E−f i e l d a t t h e midpoint : This r e d u c e s ! systematic errors c a l l efield ( x0 +0.5* dx , y0 +0.5* dy , X , Y , Q , N , Ex , Ey ) E = s q r t ( Ex * Ex+Ey * Ey ) i f ( E . l e . 1 . 0 e−10 ) e x i t dx = dl * Ey / E dy = −dl * Ex / E x0 = x0 + dx y0 = y0 + dy r = s q r t ( ( x0−xin ) * * 2 + ( y0−yin ) * * 2 ) enddo ! do while ( ) end s u b r o u t i n e epotline ... where ... are the subroutines efield and mdist which are identical to the ones in the file ELines.f90. In order to compile the program use the commands: > g f o r t r a n ELines . f90 −o el > g f o r t r a n EPotential . f90 −o ep Then, edit a file and name it e.g. Input and write the data that define a charge distribution. For example: 4 N : Number of charges 1 1 −1 ( X , Y , Q ) : Position and charge −1 1 1 ( X , Y , Q ) : Position and charge 1 −1 1 ( X , Y , Q ) : Position and charge −1 −1 −1 ( X , Y , Q ) : Position and charge The results are obtained with the commands: > . / el < Input > el . dat 334 CHAPTER 7. ELECTROSTATICS > . / ep < Input > ep . dat > gnuplot gnuplot > p l o t ” e l . dat ” with dots gnuplot > p l o t ” ep . dat ” with dots Have fun! 7.5 Electrostatic Field in the Vacuum Consider a time independent electric field in an area of space which is empty of electric charge. Maxwell’s equations are reduced to Gauss’s law ∂Ex ∂Ey ∂Ez ∇ ⃗ · E(x, ⃗ y, z) = + + = 0, (7.8) ∂x ∂y ∂z together with the equation that defines the electrostatic potential⁷ ⃗ E(x, y, z) = −∇V ⃗ (x, y, z) . (7.9) Equations (7.8) and (7.9) give the Laplace equation for the function V (x, y, z): ∂2V ∂ 2V ∂ 2V ∇2 V (x, y, z) = + + = 0. (7.10) ∂x2 ∂y 2 ∂z 2 The solution of the equation above is a boundary value problem: We are looking for the potential V (x, y, z) in a region of space S bounded by a closed surface ∂S. When the potential is known on ∂S the solution to (7.10) is unique and the potential and the electric field is determined everywhere in S. For simplicity consider the problem confined on a plane, therefore V = V (x, y). In this case the last term in equation (7.10) vanishes, the region S is a compact subset of the plane and ∂S is a closed curve. For the numerical solution of the problem, we approximate S by a discrete, square lattice. The potential is defined on the N sites of the lattice. We take S to be bounded by a square with sides of length l. The distance between the nearest lattice √ points is called the lattice constant a. Then l = (L − 1)a, where L = N is the number of lattice points on each side of the square. The continuous solution is approximated by the solution on the lattice, and the approximation becomes exact in the N → ∞ and a → 0 limits, so that the length l = (L−1)a remains constant. The curve ∂S is approximated by the lattice sites that are located on the ⁷Equivalent to the equation ∇ ⃗ ×E ⃗ = 0. 7.5. ELECTROSTATIC FIELD IN THE VACUUM 335 perimeter of the square and the loci in the square where the potential takes constant values. This is a simple model of a set of conducting surfaces (points where V = const. ̸= 0) in a compact region whose boundary is grounded (points where V = 0). An example is depicted in figure 7.6. 111 000 000111 000 000 11001100 11001100 11001100 11001100111 000 000111 000 1100 1100 1100111 000 000111 000 000111 000 111111 111000111 111000 000 1100 1100 1100111 111 111000 11001100 111 000 111 1100 000 111 1100 111 000 0011 111 000 0011 111 000 0011 0011 0011 000 111 1100 1100 1100 000 111 1100 1100 11001100 000 111 1100 1100 111 000 0011 0011 0011 111 000 0011 0011 0011 111 000 0011 0011 0011 000 111 1100 000 111 11001100 000 111 111000 000111 0011 0011 0011 0011000 111111 111000000 000 0011 0011 0011000 111 111000 111000 111 0011 Figure 7.6: A lattice which corresponds to a cross section of two parallel conducting planes inside a grounded cubic box. The black lattice sites are the points of constant, fixed potential whereas the white ones are sites in the vacuum. In order to derive a finite difference equation which approximates equation (7.10), we Taylor expand around a point (x, y) according to the equations: ∂V 1 ∂2V V (x + δx, y) = V (x, y) + δx + 2 (δx)2 + . . . ∂x 2 ∂x ∂V 1 ∂ 2V V (x − δx, y) = V (x, y) − δx + (δx)2 + . . . ∂x 2 ∂x2 ∂V 1 ∂ 2V V (x, y + δy) = V (x, y) + δy + 2 (δy)2 + . . . ∂y 2 ∂y ∂V 1 ∂ 2V V (x, y − δy) = V (x, y) − δy + 2 (δy)2 + . . . . ∂y 2 ∂y By summing both sides of the above equations, taking δx = δy and 336 CHAPTER 7. ELECTROSTATICS ignoring the terms implied by . . ., we obtain V (x + δx, y) + V (x − δx, y) + V (x, y + δy) + V (x, y − δy) ∂ 2V ∂ 2V = 4V (x, y) + (δx)2 ( 2 + ) + ... ∂x ∂y 2 ≈ 4V (x, y) , (7.11) The second term in the second line was eliminated by using equation (7.10). We map the coordinates of the lattice points to integers (i, j) such that xi = (i−1)a and yj = (j −1)a where i, j = 1, . . . , L. By taking δx = δy = a so that xi ± δx = xi ± a = (i − 1 ± 1)a = xi±1 and yj ± δy = yj ± a = (j − 1 ± 1)a = yj±1 , equation (7.11) becomes: 1 V (i, j) = (V (i − 1, j) + V (i + 1, j) + V (i, j − 1) + V (i, j + 1)) . (7.12) 4 The equation above states that the potential at the position (i, j) is the arithmetic mean of the potential of the nearest neighbors. We will de- scribe an algorithm which belongs to the class of “successive overrelax- ation methods” (SOR) whose basic steps are: 1. Set the size L of the square lattice. 2. Flag the sites that correspond to “conductors”, i.e. the sites where the potential remains fixed to the boundary conditions values. 3. Choose an initial trial function for V (x, y) on the vacuum sites. Of course it is not the solution we are looking for. A good choice will lead to fast convergence of the algorithm to the true solution. A bad choice may lead to slow convergence, no convergence or even convergence to the wrong solution. In our case the problem is easy and the simple choice V (x, y) = 0 will do. 4. Sweep the lattice and enforce equation (7.12) on each visited vacuum site. This defines the new value of the potential at this site. 5. Sweep the lattice repeatedly until two successive sweeps result in a very small change in the function V (x, y). A careful study of the above algorithm requires to test different criteria of “very small change” and test that different choices of the initial function V (x, y) result in the same solution. 7.5. ELECTROSTATIC FIELD IN THE VACUUM 337 We write a program that implements this algorithm in the case of a system which is the projection of two parallel conducting planes inside a grounded cubic box on the plane. The lattice is depicted in figure 7.6, where the black dots correspond to the conductors. All the points of the box have V = 0 and the two conductors are at constant potential V1 and V2 respectively. The user enters the values V1 and V2 , the lattice size L and the required accuracy interactively. The latter is determined by a small number ϵ. The convergence criterion that we set is that the maximum difference between the values of the potential between two successive sweeps should be less than ϵ. The data structure is very simple. We use a real array V(L,L) in order to store the values of the potential at each lattice site. A logical array isConductor(L,L) flags each site as a “conductor site” (= .TRUE.) or as a “vacuum site” (=.FALSE.). The main program reads in the data entered by the user and then calls three subroutines: 1. initialize_lattice(V,isConductor,L,V1,V2): The routine needs at its input the values of the potential V1 and V2 on the left and right plate respectively and the size of the lattice L. On exit it provides the initial values of the potential V(L,L) and the flags isConductor(L,L). The geometry of the setting is hard coded and the user needs to change this subroutine each time that she wants to study a different geometry. 2. laplace(V,isConductor,L,epsilon): This is the heart of the program. On entry we provide the initial- ized arrays V(L,L) and isConductor(L,L), the lattice size L, and the desired accuracy epsilon. On exit we obtain the final solution V(L,L). This subroutine calculates the arithmetic mean of the po- tential of the nearest neighbors Vav and the value V(i,j)=Vav is changed immediately⁸. The maximum change in the new value of the potential Vav from the old one V(i,j) is stored in the variable error. When error becomes smaller than epsilon we assume that convergence has been achieved. 3. print_results(V,L): This subroutine prints the potential V(L,L) to the file data. Each line contains the integers i, j and the value of the potential V(i,j). ⁸A different choice would have been to store the value Vav in a temporary array Vnew(i,j). After the sweep, the potential V(i,j)=Vnew(i,j) is changed to the new values. Which method do you expect to have better convergence properties? Try... 338 CHAPTER 7. ELECTROSTATICS We note that each time that the index i changes, the subroutine prints an extra empty line. This is done so that the output can be read easily by the three dimensional plotting function splot of gnuplot. The full program is listed below: ! ************************************************************* !PROGRAM LAPLACE_EM ! Computes t h e e l e c t r o s t a t i c p o t e n t i a l around c o n d u c t o r s . ! The computation i s performed on a square l a t t i c e o f l i n e a r ! dimension L . A r e l a x a t i o n method i s used t o converge t o t h e ! s o l u t i o n o f Laplace e q u a t i o n f o r t h e p o t e n t i a l . !DATA STRUCTURE: ! r e a l ( 8 ) V(L , L) : Value o f t h e p o t e n t i a l on t h e l a t t i c e s i t e s ! l o g i c a l i s C o n d u c t o r (L , L) : I f .TRUE. s i t e has f i x e d p o t e n t i a l ! I f . FALSE . s i t e i s empty sp a c e ! r e a l e p s i l o n : Determines t h e a c c u r a c y o f t h e s o l u t i o n ! The maximum d i f f e r e n c e o f t h e p o t e n t i a l on each s i t e between ! two c o n s e c u t i v e sweeps should be l e s s than e p s i l o n . !PROGRAM STRUCTURE ! main program : ! . Data Input ! . c a l l s u b r o u t i n e s f o r i n i t i a l i z a t i o n , computation and ! printing of r e s u l t s ! subroutine i n i t i a l i z e _ l a t t i c e : ! . I n i t i l i z a t i o n o f V(L , L) and i s C o n d u c t o r (L , L) ! subroutine laplace : ! . S o l v e s l a p l a c e e q u a t i o n using a r e l a x a t i o n method ! subroutine p r i n t _ r e s u l t s : ! . P r i n t s r e s u l t s f o r V(L , L) i n a f i l e . Uses format c o m p a t i b l e ! with s p l o t o f gnuplot . ! ************************************************************* program laplace_em i m p l i c i t none ! P d e f i n e s t h e s i z e o f t h e a r r a y s and i s equal t o L i n t e g e r , parameter : : P=31 l o g i c a l , dimension ( P , P ) : : isConductor r e a l ( 8 ) , dimension ( P , P ) : : V ! V1 and V2 a r e t h e v a l u e s o f t h e p o t e n t i a l on t h e i n t e r i o r ! conductors . epsilon i s the accuracy desired f o r the ! convergence o f t h e r e l a x a t i o n method i n s u b r o u t i n e ! laplace () real (8) : : V1 , V2 , e p s i l o n integer :: L !We ask t h e u s e r t o provide t h e n e c e s s a r y data : ! V1 , V2 and e p s i l o n 7.5. ELECTROSTATIC FIELD IN THE VACUUM 339 L = P p r i n t * , ’ Enter V1 , V2 : ’ read * , V1 , V2 p r i n t * , ’ Enter e p s i l o n : ’ read * , e p s i l o n p r i n t * , ’ S t a r t i n g Laplace : ’ p r i n t * , ’ Grid S i z e = ’ , L p r i n t * , ’ Conductors s e t a t V1= ’ , V1 , ’ V2= ’ , V2 p r i n t * , ’ R e l a x i n g with a c c u r a c y e p s i l o n = ’ , e p s i l o n ! The a r r a y s V and i s C o n d u c t o r a r e i n i t i a l i z e d c a l l initialize_lattice ( V , isConductor , L , V1 , V2 ) !We e n t e r i n i t i a l i z e d V , i s C o n d u c t o r . On e x i t t h e ! routine gives the s o l u t i o n V c a l l laplace ( V , isConductor , L , e p s i l o n ) !We p r i n t V i n a f i l e . c a l l print_results ( V , L ) end program laplace_em ! ************************************************************* ! subroutine i n i t i a l i z e _ l a t t i c e ! I n i t i a l i z e s a r r a y s V(L , L) and i s C o n d u c t o r (L , L) . !V(L , L)= 0.0 and i s C o n d u c t o r (L , L)= . FALSE . by d e f a u l t ! i s C o n d u c t o r ( i , j )= .TRUE. on boundary o f l a t t i c e where V=0 ! i s C o n d u c t o r ( i , j )= .TRUE. on s i t e s with i = L/ 3 + 1 , 5<= j <= L−5 ! i s C o n d u c t o r ( i , j )= .TRUE. on s i t e s with i =2*L/ 3 + 1 , 5<= j <= L−5 !V( i , j ) = V1 on a l l s i t e s with i = L/ 3 + 1 , 5<= j <= L−5 !V( i , j ) = V2 on a l l s i t e s with i =2*L/ 3 + 1 , 5<= j <= L−5 !V( i , j ) = 0 on boundary ( i =1 ,L and j =1 ,L) !V( i , j ) = 0 on i n t e r i o r s i t e s with i s C o n d u c t o r ( i , j )= . FALSE . ! INPUT : ! i n t e g e r L : Linear s i z e of l a t t i c e ! r e a l ( 8 ) V1 , V2 : Values o f p o t e n t i a l on i n t e r i o r c o n d u c t o r s !OUTPUT: ! r e a l ( 8 ) V(L , L) : Array provided by u s e r . Values o f p o t e n t i a l ! l o g i c a l i s C o n d u c t o r (L , L) : I f .TRUE. s i t e has f i x e d p o t e n t i a l ! I f . FALSE . s i t e i s empty s p a ce ! ************************************************************* s u b r o u t i n e initialize_lattice ( V , isConductor , L , V1 , V2 ) i m p l i c i t none integer :: L l o g i c a l , dimension ( L , L ) : : isConductor r e a l ( 8 ) , dimension ( L , L ) : : V real (8) : : V1 , V2 integer :: i,j ! I n i t i a l i z e t o 0 and . FALSE ( d e f a u l t v a l u e s f o r boundary and ! interior sites ) . V = 0.0 D0 isConductor = . FALSE . 340 CHAPTER 7. ELECTROSTATICS !We s e t t h e boundary t o be a conductor : (V=0 by d e f a u l t ) do i =1 , L isConductor ( 1 , i ) = .TRUE. isConductor ( i , 1 ) = .TRUE. isConductor ( L , i ) = .TRUE. isConductor ( i , L ) = .TRUE. enddo !We s e t two c o n d u c t o r s a t giv e n p o t e n t i a l V1 and V2 do i =5 ,L−5 V ( L / 3 + 1 , i ) = V1 isConductor ( L / 3 + 1 , i ) = .TRUE. V ( 2 * L / 3 + 1 , i ) = V2 isConductor ( 2 * L / 3 + 1 , i ) = .TRUE. enddo end s u b r o u t i n e initialize_lattice ! ************************************************************* ! subroutine laplace ! Uses a r e l a x a t i o n method t o compute t h e s o l u t i o n o f t h e ! Laplace e q u a t i o n f o r t h e e l e c t r o s t a t i c p o t e n t i a l ! on a 2 d i m e n s i o n a l s q u a r e l a t t i c e o f l i n e a r s i z e L . ! At eve ry sweep o f t h e l a t t i c e we compute t h e a v e r a g e ! Vav o f t h e p o t e n t i a l a t each s i t e ( i , j ) and we immediately ! update V( i , j ) . ! The computation c o n t i n u e s u n t i l Max | Vav−V( i , j ) | < e p s i l o n ! INPUT : ! i n t e g e r L : Li ne ar s i z e o f l a t t i c e ! r e a l ( 8 ) V(L , L) : Value o f t h e p o t e n t i a l a t each s i t e ! l o g i c a l i s C o n d u c t o r (L , L) : I f .TRUE. potential is fixed ! I f . FALSE . p o t e n t i a l i s updated ! r e a l ( 8 ) e p s i l o n : i f Max | Vav−V( i , j ) | < e p s i l o n r e t u r n t o ! callingprogram . !OUTPUT: ! r e a l ( 8 ) V(L , L) : The computed s o l u t i o n f o r t h e p o t e n t i a l ! ************************************************************* s u b r o u t i n e laplace ( V , isConductor , L , e p s i l o n ) i m p l i c i t none integer : : L l o g i c a l , dimension ( L , L ) : : isConductor r e a l ( 8 ) , dimension ( L , L ) : : V real (8) : : epsilon integer : : i , j , icount real (8) : : Vav , error , dV icount = 0 ! co un ts number o f sweeps do while ( . TRUE . ) ! an i n f i n i t e loop : error = 0.0 D0 ! E x i t when e r r o r < e p s i l o n do j =2 ,L−1 do i =2 ,L−1 7.6. RESULTS 341 !We change V only f o r non c o n d u c t o r s : i f ( .NOT. isConductor ( i , j ) ) then Vav = ( V ( i −1 , j )+V ( i +1 , j )+V ( i , j +1)+V ( i , j−1) ) * 0.25 D0 dV = DABS ( V ( i , j )−Vav ) i f ( error . LT . dV ) error = dV ! maximum e r r o r V ( i , j ) = Vav ! we immendiately update V( i , j ) endif enddo enddo icount = icount + 1 p r i n t * , icount , ’ e r r = ’ , error i f ( error . LT . e p s i l o n ) r e t u r n ! r e t u r n t o main program enddo end s u b r o u t i n e laplace ! ************************************************************* ! subroutine p r i n t _ r e s u l t s ! P r i n t s t h e a r r a y V(L , L) i n f i l e ” data ” ! The format o f t h e output i s a p p r o p r i a t e f o r t h e s p l o t f u n c t i o n ! o f gnuplot : Each time i changes an empty l i n e i s p r i n t e d . ! INPUT : ! i n t e g e r L: s i z e of array V ! r e a l ( 8 ) V(L , L) : a r r a y t o be p r i n t e d !OUTPUT: ! no output ! ************************************************************* s u b r o u t i n e print_results ( V , L ) i m p l i c i t none integer :: L r e a l ( 8 ) , dimension ( L , L ) : : V integer :: i,j open ( u n i t =11 , f i l e =” data ” ) do i =1 , L do j =1 , L write (11 ,*) i , j , V(i , j) enddo w r i t e ( 1 1 , * ) ’ ’ ! empty l i n e f o r gnuplot , s e p a r a t e i s o l i n e s enddo end s u b r o u t i n e print_results 7.6 Results The program in the previous section is written in the file LaplaceEq.f90. Compiling and running is done with the commands: 342 CHAPTER 7. ELECTROSTATICS > g f o r t r a n LaplaceEq . f90 −o lf > . / lf Enter V1 , V2 : 100 −100 Enter epsilon : 0.01 Starting Laplace : Grid Size= 31 Conductors s e t at V1= 100. V2= −100. Relaxing with accuracy epsilon= 0.01 1 err= 33.3333333 2 err= 14.8148148 3 err= 9.87654321 ....................... 110 err= 0.0106860904 111 err= 0.0101182476 112 err= 0.00958048937 In the example above, the program performs 112 sweeps until the error becomes 0.00958048937 < 0.01. The results are stored in the file data. We can make a three dimensional plot of the function V (i, j) with the gnuplot commands: gnuplot > s e t pm3d gnuplot > s e t hidden3d gnuplot > s e t s i z e ratio 1 gnuplot > s p l o t ” data ” with lines The results are shown in figure 7.7 7.7 Poisson Equation This section contains a short discussion of the case where the space is filled with a continuous static charge distribution given by the charge density function ρ(⃗r). In this case the Laplace equation becomes the Poisson equation: ∂ 2V ∂ 2V ∂2V ∇2 V = + + = −4πρ(x, y, z) (7.13) ∂x2 ∂y 2 ∂z 2 The equation on the lattice becomes 1 V (i, j) = (V (i−1, j)+V (i+1, j)+V (i, j −1)+V (i, j +1)+ ρ̃(i, j)) , (7.14) 4 7.7. POISSON EQUATION 343 "data" 100 100 50 50 0 0 -50 -50 -100 -100 35 30 25 0 20 5 15 10 15 10 20 25 5 30 35 0 Figure 7.7: The solution of the equation (7.10) computed by the program LaplaceEq.f90 for L= 31, V1=100, V2=-100, epsilon=0.01. where⁹ ρ̃(i, j) = 4πa2 ρ(i, j). The program in the file PoissonEq.f90 solves equation (7.14) for a uniform charge distribution (figure 7.10), where we have set a = 1. The reader is asked to reproduce this figure together with figures 7.8 and 7.9. ! ************************************************************* ! s e t t h e boundary o f a square t o giv e n p o t e n t i a l s ! ************************************************************* program poisson_eq i m p l i c i t none i n t e g e r , parameter : : P=51 l o g i c a l , dimension ( P , P ) : : isConductor r e a l ( 8 ) , dimension ( P , P ) : : V , rho real (8) : : V1 , V2 , V3 , V4 , Q , e p s i l o n integer :: L L = P p r i n t * , ’ Enter V1 , V2 , V3 , V4 : ’ read * , V1 , V2 , V3 , V4 ∫ ∑ ∑ ∑ ⁹Since Q = ρdA ≈ i,j ρa2 = (1/4π) i,j ρ̃. Therefore i,j ρ̃ ≈ 4πQ. 344 CHAPTER 7. ELECTROSTATICS "data" 800 800 700 700 600 600 500 500 400 400 300 300 200 200 100 100 0 0 0 10 20 50 60 30 30 40 40 50 20 600 10 Figure 7.8: The solution of the equation (7.13) by the program in the file Poisson.f90 for L= 51, V= 0 on the boundary and the charge 4πQ = 1000 all concentrated at one point. print * , ’ Enter 4* PI *Q: ’ read *, Q print * , ’ Enter e p s i l o n : ’ read * , epsilon print * , ’ S t a r t i n g Laplace : ’ print * , ’ Grid S i z e = ’ , L print * , ’ Boundaries s e t a t V1= ’ , V1 , ’ V2= ’ , V2 , ’ V3= ’ , V3 ,& ’ V4= ’ , V4 , ’ and Q= ’ , Q p r i n t * , ’ R e l a x i n g with a c c u r a c y e p s i l o n = ’ , e p s i l o n c a l l initialize_lattice ( V , isConductor , rho , L , V1 , V2 , V3 , V4 , Q ) c a l l laplace ( V , isConductor , rho , L , e p s i l o n ) c a l l print_results ( V , L ) end program laplace_sq ! ********************************************************** subroutine & initialize_lattice ( V , isConductor , rho , L , V1 , V2 , V3 , V4 , Q ) ! ********************************************************** 7.7. POISSON EQUATION 345 "data" 350 350 300 300 250 250 200 200 150 150 100 100 50 50 0 0 0 60 10 50 20 40 30 30 40 20 50 10 600 Figure 7.9: The solution of equation (7.13) by the program in the file Poisson.f90 for L= 51, V= 0 on the boundary and the charge 4πQ = 1000 uniformly distributed in a small square with sides made of 10 lattice sites. i m p l i c i t none integer :: L l o g i c a l , dimension ( L , L ) : : isConductor r e a l ( 8 ) , dimension ( L , L ) : : V , rho real (8) : : V1 , V2 , V3 , V4 , Q , Area integer : : i , j , L1 , L2 ! I n i t i a l i z e t o 0 and . FALSE . V = 0.0 D0 isConductor = . FALSE . rho = 0.0 D0 !We s e t t h e boundary t o be a conductor : do i =1 , L isConductor ( 1 , i ) = .TRUE. isConductor ( i , 1 ) = .TRUE. isConductor ( L , i ) = .TRUE. isConductor ( i , L ) = .TRUE. V ( 1 , i ) = V1 V ( i , L ) = V2 V ( L , i ) = V3 V ( i , 1 ) = V4 enddo !We s e t t h e p o i n t s with non−z e r o charge 346 CHAPTER 7. ELECTROSTATICS "data" 80 80 70 70 60 60 50 50 40 40 30 30 20 20 10 10 0 0 0 60 10 50 20 40 30 30 40 20 50 10 600 Figure 7.10: The solution of equation (7.13) by the program in the file Poisson.f90 for L= 51, V= 0 on the boundary and the charge 4πQ = 1000 uniformly distributed on all internal lattice sites. !A uniform d i s t r i b u t i o n a t a c e n t e r square L1 = ( L / 2 )−5 L2 = ( L / 2 ) +5 i f ( L1 . LT . 1 ) s t o p ’ a r r a y rho out o f bounds . Small L1 ’ i f ( L2 . GT . L ) s t o p ’ a r r a y rho out o f bounds . Large L2 ’ Area = ( L2−L1 +1) * ( L2−L1 +1) do j=L1 , L2 do i=L1 , L2 rho ( i , j ) = Q / Area ! rho i s \ t i l d e \rho i n n o t e s enddo ! so Q i s 4* PI *Q enddo end s u b r o u t i n e initialize_lattice ! ************************************************************* s u b r o u t i n e laplace ( V , isConductor , rho , L , e p s i l o n ) ! ************************************************************* i m p l i c i t none integer : : L l o g i c a l , dimension ( L , L ) : : isConductor r e a l ( 8 ) , dimension ( L , L ) : : V , rho real (8) : : epsilon integer : : i , j , icount 7.7. POISSON EQUATION 347 real (8) : : Vav , error , dV icount = 0 do while ( . TRUE . ) error = 0.0 D0 do j =2 ,L−1 do i =2 ,L−1 !We change t h e v o l t a g e only f o r non c o n d u c t o r s : i f ( .NOT. isConductor ( i , j ) ) then Vav = ( V ( i −1 , j )+V ( i +1 , j )+V ( i , j +1)+V ( i , j−1)+rho ( i , j ) )& * 0. 25 D0 dV = DABS ( V ( i , j )−Vav ) i f ( error . LT . dV ) error = dV ! maximum e r r o r V ( i , j ) = Vav endif enddo enddo icount = icount + 1 i f ( error . LT . e p s i l o n ) e x i t enddo p r i n t * , icount , ’ e r r = ’ , error end s u b r o u t i n e laplace ! ************************************************************* s u b r o u t i n e print_results ( V , L ) ! ************************************************************* i m p l i c i t none integer :: L r e a l ( 8 ) , dimension ( L , L ) : : V integer :: i,j open ( u n i t =11 , f i l e =” data ” ) do i =1 , L do j =1 , L write (11 ,*) i , j , V(i , j) enddo w r i t e ( 1 1 , * ) ’ ’ ! empty l i n e f o r gnuplot , s e p a r a t e i s o l i n e s enddo end s u b r o u t i n e print_results In the bibliography the algorithm described above is called the Gauss– Seidel method. In this method, the right hand side of equation (7.14) uses the updated values of the potential in the calculation of V (i, j) and V (i, j) is immediately updated. In contrast, the Jacobi method uses the old values of the potential in the right hand side of (7.14) and the new value computed is stored in order to be used in the next sweep. The Gauss–Seidel method is superior to the Jacobi method as far as speed of 348 CHAPTER 7. ELECTROSTATICS convergence is concerned. We can generalize Jacobi’s method by defining the residual Ri,j of equation (7.14) Ri,j = V (i + 1, j) + V (i − 1, j) + V (i, j + 1) + V (i, j − 1) − 4V (i, j) + ρ̃(i, j) , (7.15) which vanishes when V (i, j) is a solution of equation (7.14). Then, using Ri,j , Jacobi’s method can be formulated as 1 (n) V (n+1) (i, j) = V (n) (i, j) + Ri,j , (7.16) 4 where the quantities with index (n) refer to the values of the potential during the n-th sweep. The successive overrelaxation (SOR) method is given by: ω (n) V (n+1) (i, j) = V (n) (i, j) + Ri,j . (7.17) 4 When ω < 1 we have “underrelaxation” and we obtain slower conver- gence than the Jacobi method. When 1 < ω < 2 we have “overrelaxation” and an appropriate choice of ω can lead to an improvement compared to the Jacobi method. When ω > 2 SOR diverges. Further study of the SOR methods is left as an exercise to the reader. 7.8. PROBLEMS 349 7.8 Problems 7.1 Reproduce the figures with the electric field lines and equipotential lines shown in section 7.2. 7.2 Take the charge distributions that you used in the previous prob- lems, make all the charges to be positive and remake the figures of the field lines and the equipotential lines. Then repeat by taking half of the charges to be twice in magnitude than the others. 7.3 The program ELines.f90 gets stuck when you apply it on a charge distribution of four equal charges located at the vertices of a square. How can you correct this pathology? 7.4 Make the necessary changes to the program in the file ELines.f90 so that the number of field lines starting near a charge q is proportional to q. 7.5 Improve the program in EPotential.f90 so that the equipotential lines are drawn with a density proportional to the magnitude of the electric field. Hint: (a) Write a subroutine that calculates the potential V (x, y) at the point (x, y). (b) From each point charge draw a line in the radial direction and calculate the potential on points that are at small distance ∆l from each other. (c) Calculate the maximum/minimum value of the potential Vmax /Vmin and use them in order to choose the values of the potential on the equipotential lines that you plan to draw. If e.g. you choose to draw 5 equipotential lines, take δV = (Vmax − Vmin )/4 and Vi = Vmin + iδV i = 0, . . . , 4. (d) Repeat the second step. When the potential at a point takes approximately one of the values Vi chosen in the previous step, draw an equipotential line from that point. 7.6 Compute the electric potential using the program in the file LaplaceEq.f90 for (a) L= 31, V1=100, V2=100 (b) L= 31, V1=100, V2=0 350 CHAPTER 7. ELECTROSTATICS and construct the corresponding plot for V (i, j). 7.7 Compute the electric potential using the program in the file LaplaceEq.f90 for (a) V1=100, V2=100 (b) V1=100, V2=100 (c) V1=100, V2=0 for L=31,61,121,241,501 and construct the corresponding plot for V (i, j). Vary epsilon=0.1, 0.01, 0.001, 0.0001, 0.00001, 0.000001. What is the dependence of the number of sweeps N on epsilon? Make the plot of N (epsilon). Put the points and curves of N (epsilon) for all values of L on the same plot. 7.8 Compute the electrostatic potential of a square conductor when the potential on each side is V1, V2, V3, V4. Repeat what you did in the previous problem for (a) V1=10, V2=5, V3=10, V4= 5 (b) V1=10, V2=0, V3=0, V4= -10 (c) V1=10, V2=0, V3=0, V4= 0 7.9 Compute the electrostatic potential of a system of square conductors where the one is inside the other as shown in figure 7.11. The side of each conductor has L1, L2 sites respectively and the value of the potential is V1,V2 respectively. Take L2= L1/5 and repeat the steps in the previous problem for V1=10, V2=-10 and L1= 25, 50, 100, 200. 7.10 Perform a numerical computation of the capacitance C = Q/V of the system of conductors of the previous problem when V1 = V , V2 = −V . In order to calculate the charge Q, compute the surface charge density σ using the equation En σ= , 4π where En is the perpendicular component of the electric field on the surface. Use the approximation δV En = − , δr 7.8. PROBLEMS 351 111 000 000111 000 000 11001100 11001100 11001100 11001100111 000 000111 000 11001100 11001100 11001100111 000000 111000 111 11001100 111111 111000111 111000 000 111 000 111000 111000 111 000 111 1100 000 111 1100 111 000 0011 111 000 0011 000 111 11001100000 111000 111000 111 0011 1100 11001100 000 111 1100 000 111 1100 1100 1100 000 111 1100 1100 1100 111 000 0011 0011 0011 111 000 0011000 111000 111000 111 0011 0011 0011 111 000 0011 000 111 1100 000 111 11001100 000 111 111000 000111 0011 0011 0011 0011000 111111 111000000 000 0011 0011 0011000 111 111000 111000 111 0011 Figure 7.11: The square conductors described in problem 7.9. where δV is the potential difference between a point on the con- ductor and its nearest neighbor. By integrating (i.e. summing) you can estimate the total charge on each conductor. If these are opposite and their absolute value is Q, then the capacitance can be calculated from the equation C = Q/V . Perform the calculation described above for V = 10 and L1=25, 75. 7.11 In the system of the previous problem compute the function Q(V ). Verify that the capacitance is independent of V . Use L1=25,50, V1= -V2 =1, 2, 5, 10, 15, 20, 25. 7.12 Reproduce figures 7.8, 7.9 and 7.10. Compare the result of the first case with the known solution of a point charge in empty space. 7.13 Introduce the lattice spacing a in the corresponding equations in the program in the file PoissonEq.f90. Set the length of each side to be l = 1 and print the results in the file data as (xi , yi , V (xi , yi )) instead of (i, j, V (i, j)). Take L=51,101,151,201,251 and plot V (x, y) in the square 0 < x < 1, 0 < y < 1. Study the convergence of the solutions by plotting the section V (x, 1/2) for each L. 7.14 Write a program that implements the SOR algorithm given by equa- 352 CHAPTER 7. ELECTROSTATICS tion (7.16) for the problem solved in LaplaceEq.f90. Compare the speed of convergence of SOR with that of the Gauss-Seidel method for L = 51, ω = 1.0, 0.9, 0.8, 0.6, 0.4, 0.2. What happens when ω > 1? 7.15 Write a program that implements the SOR algorithm given by equa- tion (7.16) for the problem solved in PoissonEq.f90. Compare the speed of convergence of SOR with that of the Gauss-Seidel method for L = 51, ω = 1.0, 0.9, 0.8, 0.6, 0.4, 0.2. What happens when ω > 1? Chapter 8 Diffusion Equation 8.1 Introduction The diffusion equation is related to the study of random walks. Consider a particle moving on a line (one dimension) performing a random walk. The motion is stochastic and the kernel K(x, x0 ; t) , (8.1) is interpreted as the probability density to observe the particle at position x at time t if the particle is at x0 at t = 0. The equation that determines K(x, x0 ; t) is ∂K(x, x0 ; t) ∂ 2 K(x, x0 ; t) =D , (8.2) ∂t ∂x2 which is the diffusion equation. The coefficient D depends on the details of the system that is studied. For example, for the Brownian motion of a dust particle in a fluid which moves under the influence of random collisions with the fluid particles, we have that D = kT /γ, where T is the (absolute) temperature of the fluid, γ is the friction coefficient¹ of the particle in the fluid and k is the Boltzmann constant. Usually the initial conditions are chosen so that at t = 0 the particle is localized at one point x0 , i.e.² K(x, x0 ; 0) = δ(x − x0 ) . (8.3) ¹For a spherical particle of radius R in a Newtonian liquid with viscosity η we have that γ = 6πηR. ² δ(x − x0 ) is the Dirac delta “function”. It can be defined from the requirement ∫ +∞ that for every function f (x) we have that −∞ f (x)δ(x − x0 ) dx = f (x0 ). Obviously we ∫ +∞ also have that −∞ δ(x − x0 ) dx = 1. Intuitively one can think of it as a function that is almost zero everywhere except in an infinitesimal neighborhood of x0 . 353 354 CHAPTER 8. DIFFUSION EQUATION The interpretation of K(x, x0 ; t) as a probability density implies that for every t we should have that³ ∫ +∞ K(x, x0 ; t) dx = 1 . (8.4) −∞ It is not obvious that this relation can be imposed for every instant of time. Even if K(x, x0 ; t) is normalized so that (8.4) holds for t = 0, the time evolution of K(x, x0 ; t) is governed by equation (8.2) which can spoil equation (8.4) at later times. If we impose equation (8.4) at t = 0, then it will hold at all times if ∫ d +∞ K(x, x0 ; t)dx = 0 . (8.5) dt −∞ d ∫ +∞ ∫ +∞ ∂K(x,x0 ;t) By taking into account that dt −∞ K(x, x0 ; t)dx = −∞ ∂t dx and ∂K(x,x0 ;t) ∂ 2 K(x,x 0 ;t) that ∂t =D ∂x2 we obtain ∫ +∞ ∫ +∞ ( ) d ∂K(x, x0 ; t) ∂ K(x, x0 ; t)dx = D dx dt −∞ −∞ ∂x ∂x ∂K(x, x0 ; t) ∂K(x, x0 ; t) =D −D . (8.6) ∂x x→+∞ ∂x x→−∞ The above equation tells us that for functions for which the right hand side vanishes, the normalization condition will be valid for all t > 0. A careful analysis of equation (8.2) gives that the asymptotic behavior of K(x, x0 ; t) for small times is |x−x0 |2 e− 4Dt ∑ ∞ K(x, x0 ; t) ∼ ai (x, x0 )ti . (8.7) td/2 i=0 This relation shows that diffusion is isotropic (the same in all directions) and that the probability of detecting the particle drops exponentially with the distance squared from the initial position of the particle. This relation cannot hold for all times, since for large enough times the probability of detecting the particle will be the same everywhere⁴. ³Alternatively, if K(x, x0 ; t) is interpreted as e.g. the mass density of a drop of ink ∫ +∞ of mass mink inside a transparent liquid, we will have that −∞ K(x, x0 ; t) dx = mink and K(x, x0 ; 0) = mink δ(x − x0 ). ⁴Remember the analogy of an ink drop diffusing in a transparent liquid. After long enough time, the ink is homogeneously dissolved in the liquid. 8.2. HEAT CONDUCTION IN A THIN ROD 355 The return probability of the particle to its initial position is 1 ∑ ∞ PR (t) = K(x0 , x0 ; t) ∼ ai (x0 , x0 )ti . (8.8) td/2 i=0 The above relation defines the spectral dimension d of space. d = 1 in our case. The expectation value of the distance squared of the particle at time t is easily calculated⁵ ∫ +∞ ⟨r ⟩ = ⟨(x − x0 ) ⟩(t) = 2 2 (x − x0 )2 K(x, x0 ; t) dx ∼ 2Dt . (8.9) −∞ This equation is very important. It tells us that the random walk (Brow- nian motion) is not a classical motion but it can only be given a stochastic description: A classical particle moving with constant velocity v so that x − x0 ∼ vt results in r2 ∼ t2 . In the following sections we take⁶ D = 1 and define u(x, t) ≡ K(x − x0 , x0 ; t) . (8.10) 8.2 Heat Conduction in a Thin Rod Consider a thin rod of length L and let T (x, t) be the temperature dis- tribution within the rod at time t. The two ends of the rod are kept at constant temperature T (0, t) = T (L, t) = T0 . If the initial temperature distribution in the rod is T (x, 0), then the temperature distribution at all times is determined by the diffusion equation ∂T (x, t) ∂ 2 T (x, t) =α , (8.11) ∂t ∂x2 where α = k/(cp ρ) is the thermal diffusivity, k is the thermal conductivity, ρ is the density and cp is the specific heat of the rod. Define 2 T (xL, Lα t) − T0 u(x, t) = , (8.12) T0 where x ∈ [0, 1]. The function u(x, t), giving the fraction of the tempera- ture difference to the temperature at the ends of the rod, is dimensionless and u(0, t) = u(1, t) = 0 . (8.13) ∫∞ ⁵ 0 dr rn e−r /4Dt = 2n Γ( n+1 2 n+1 2 . 2 )(Dt) ⁶According to equation (8.2) this amounts to taking t → Dt. 356 CHAPTER 8. DIFFUSION EQUATION These are called Dirichlet boundary conditions⁷. Equation (8.11) becomes ∂u(x, t) ∂ 2 u(x, t) = (8.14) ∂t ∂x2 Equation (8.6) becomes ∫ d 1 ∂u ∂u u(x, t)dx = − (8.15) dt 0 ∂x x=1 ∂x x=0 The relation above cannot be equal to zero at all times due to the boundary conditions (8.13). This can be easily understood with an ex- ample. Suppose that u(x, 0) = sin(πx) , (8.16) then it is easy to confirm that the boundary conditions are satisfied and that the function u(x, t) = sin(πx)e−π t , 2 (8.17) is the solution to the diffusion equation. It is easy to see that ∫ 1 2 u(x, t)dx = e−π t 2 0 π drops exponentially with time and that ∫ d 1 u(x, t)dx = −2πe−π t , 2 dt 0 which is in agreement with equations (8.15). The exponential drop of the magnitude of u(x, t) is in agreement with the expectation that the rod will have constant temperature at long times, which will be equal to the temperature at its ends (limt→+∞ u(x, t) = 0). 8.3 Discretization The numerical solution of equation (8.14) will be computed in the interval x ∈ [0, 1] for t ∈ [0, tf ]. The problem will be defined on a two dimensional discrete lattice and the differential equation will be approximated by finite difference equations. ⁷If the derivative ∂u/∂x was given as a boundary condition instead, then we would have Neumann boundary conditions. 8.3. DISCRETIZATION 357 The lattice is defined by Nx spatial points xi ∈ [0, 1] xi = 0 + (i − 1)∆x i = 1, . . . , Nx , (8.18) where the Nx − 1 intervals have the same width 1−0 ∆x = , (8.19) Nx − 1 and by the Nt time points tj ∈ [0, tf ] tj = 0 + (j − 1)∆t j = 1, . . . , Nt , (8.20) where the Nt − 1 time intervals have the same duration tf − 0 ∆t = . (8.21) Nt − 1 We note that the ends of the intervals correspond to x1 = 0 , xNx = 1 , t1 = 0 , tNt = tf . (8.22) The function u(x, t) is approximated by its values on the Nx × Nt lattice ui,j ≡ u(xi , tj ) . (8.23) The derivatives are replaced by the finite differences ∂u(x, t) u(xi , tj + ∆t) − u(xi , tj ) 1 ≈ ≡ (ui,j+1 − ui,j ) , (8.24) ∂t ∆t ∆t ∂ 2 u(x, t) u(xi + ∆x, tj ) − 2u(xi , tj ) + u(xi − ∆x, tj ) 2 ≈ ∂x (∆x)2 1 ≡ (ui+1,j − 2ui,j + ui−1,j ) . (8.25) (∆x)2 By equating both sides of the above relations according to (8.14), we obtain the dynamic evolution of ui,j in time ∆t ui,j+1 = ui,j + (ui+1,j − 2ui,j + ui−1,j ) . (8.26) (∆x)2 This is a one step iterative relation in time. This is very convenient, because one does not need to store the values ui,j for all j in the computer memory. 358 CHAPTER 8. DIFFUSION EQUATION The second term (the “second derivative”) in (8.26) contains only the nearest neighbors ui±1,j of the lattice point ui,j at a given time slice tj . Therefore it can be used for all i = 2, . . . , Nx − 1. The relations (8.26) are not needed for the points i = 1 and i = Nx since the values u1,j = uNx ,j = 0 are kept constant. The parameter ∆t (8.27) (∆x)2 determines the time evolution in the algorithm. It is called the Courant parameter and in order to have a time evolution without instabilities it is necessary to have ∆t 1 2 < . (8.28) (∆x) 2 This condition will be checked in our analysis empirically. "d.dat" 1 0.9 1 0.8 0.9 0.7 0.8 0.6 0.7 0.5 u(x,t) 0.6 0.4 0.5 0.3 0.4 0.2 0.3 0.1 0.2 0 0.1 0 1 0.8 0 0.05 0.6 0.1 0.15 0.4 x 0.2 0.25 0.2 t 0.3 0.35 0.4 0 Figure 8.1: The function u(x, t) for Nx=10, Nt=100, tf= 0.4. 8.4 The Program The fact that equation (8.26) is a one time step iterative relation, leads to a substantial simplification of the structure of the program. Because of this, at each time step, it is sufficient to store the values of the second term (the “second derivative”) in one array. This array will be used in order 8.4. THE PROGRAM 359 to update the values of ui,j . Therefore we will define only two arrays ui , i = 1, . . . , Nx and (∂ 2 u/∂x2 )i , i = 1, . . . , Nx which store the values of ui,j and ∆t/(∆x)2 (ui+1,j − 2ui,j + ui−1,j ) at time tj respectively. In the program listed below, the names of these arrays are u(P) and d2udx2(P). The data is stored in the array positions u(1) ... u(Nx) and d2udx2(1) ... d2udx2(Nx) and the parameter P is taken large enough so that Nx is always smaller than P. The user enters the Nx = Nx, Nt =Nt and tf =tf interactively. The values of ∆x, ∆t and ∆t/∆x2 = courant are calculated during the ini- tialization. On exit, we obtain the results in the file d.dat which contains (tj , xi , ui,j ) in three columns. When a time slice is printed, the program prints an empty line so that the output is easily read by the three dimensional plotting function splot of gnuplot. The program is in the file diffusion.f90 and is listed below: ! ======================================================= ! 1−dimensional D i f f u s i o n Equation with simple ! D i r i c h l e t boundary c o n d i t i o n s u ( 0 , t )=u ( 1 , t ) =0 ! 0<= x <= 1 and 0<= t <= t f ! ! We s e t i n i t i a l c o n d i t i o n u ( x , t =0) t h a t s a t i s f i e s ! t h e g i ven boundary c o n d i t i o n s . ! Nx i s t h e number o f p o i n t s i n s p a t i a l l a t t i c e : ! x = 0 + ( j −1) * dx , j = 1 , . . . , Nx and dx = (1 −0) / ( Nx−1) ! Nt i s t h e number o f p o i n t s i n temporal l a t t i c e : ! t = 0 + ( j −1) * dt , j = 1 , . . . , Nt and dt = ( t f −0) / ( Nt −1) ! ! u(x , 0 ) = sin ( pi * x ) t e s t e d against a n a l y t i c a l solution ! u ( x , t ) = s i n ( p i * x ) * exp(− p i * p i * t ) ! ! ======================================================= program diffusion_1d i m p l i c i t none i n t e g e r , parameter : : P =100000 ! Max no o f p o i n t s r e a l ( 8 ) , parameter : : PI =3.1415926535897932 D0 r e a l ( 8 ) , dimension ( P ) : : u , d2udx2 r e a l ( 8 ) : : t , x , dx , dt , tf , courant i n t e g e r Nx , Nt , i , j ! −−− Input : p r i n t * , ’ # Enter : Nx , Nt , t f : ( P= ’ , P , ’ Nx must be < P ) ’ read * , Nx , Nt , tf i f ( Nx . ge . P ) s t o p ’Nx >= P ’ i f ( Nx . l e . 3) s t o p ’Nx <= 3 ’ i f ( Nt . l e . 2) s t o p ’ Nt <= 2 ’ 360 CHAPTER 8. DIFFUSION EQUATION ! −−− I n i t i a l i z e : dx = 1 . 0 D0 / ( Nx −1) dt = tf / ( Nt −1) courant = dt / dx * * 2 p r i n t * , ’ # 1d D i f f u s i o n Equation : 0<=x <=1 , 0<=t <= t f ’ p r i n t * , ’ # dx= ’ , dx , ’ dt= ’ , dt , ’ t f = ’ , tf p r i n t * , ’ # Nx= ’ , Nx , ’ Nt= ’ , Nt p r i n t * , ’ # Courant Number= ’ , courant i f ( courant . g t . 0.5 D0 ) p r i n t * , ’ # WARNING: c o u r a n t > 0.5 ’ open ( u n i t =11 , f i l e = ’d . dat ’ ) ! data f i l e ! −−− I n i t i a l c o n d i t i o n a t t =0 −−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ! u(x , 0 ) = sin ( pi x ) do i= 1 , Nx x = ( i−1) * dx u ( i ) = s i n ( PI * x ) enddo u ( 1 ) = 0.0 d0 u ( Nx ) = 0.0 d0 do i= 1 , Nx x = ( i−1) * dx w r i t e ( 1 1 , * ) 0.0 D0 , x , u ( i ) enddo write (11 ,*) ’ ’ ! −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ! −−− C a l c u l a t e time e v o l u t i o n : do j =2 , Nt t = ( j−1) * dt ! −−−−− second d e r i v a t i v e : do i =2 , Nx−1 d2udx2 ( i ) = courant * ( u ( i +1) −2.0D0 * u ( i )+u ( i−1) ) enddo ! −−−−− update : do i =2 , Nx−1 u ( i ) = u ( i ) + d2udx2 ( i ) enddo do i =1 , Nx x = ( i−1) * dx write (11 ,*) t , x , u(i) enddo write (11 ,*) ’ ’ enddo ! do j =2 , Nt close (11) end program diffusion_1d 8.5. RESULTS 361 8.5 Results The compilation and running of the program can be done with the com- mands: > g f o r t r a n diffusion . f90 −o d > echo ” 10 100 0.4 ” | . / d # Enter : Nx , Nt , t f : ( P= 100000 Nx must be < P ) # 1d D i f f u s i o n Equation : 0<=x <=1 , 0<=t <= t f # dx= 0 . 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 dt= 4.04040404040404040E−3 t f = 0.4 # Nx= 10 Nt= 100 # Courant Number= 0.32727272727272733 The input to the program ./d is read from the stdin and it is given by the stdout of the command echo through a pipe, as shown in the second line in the listing above. The lines that follow are the standard output stdout of the program. The three dimensional plot of the function u(x, t) can be made with the gnuplot commands: gnuplot > s e t pm3d gnuplot > s e t hidden3d gnuplot > s p l o t ”d . dat ” with lines gnuplot > unset pm3d In order to make the plot of u(x, t) for a fixed value of t we first note that an empty line in the file d.dat marks a change in time. The following awk program counts the empty lines of d.dat and prints only the lines when the number of empty lines that have been encountered so far is equal to 3. The counter n=0, 1, ..., Nt-1 determines the value of tj = tn−1 . We save the results in the file tj which can be plotted with gnuplot. We repeat as many times as we wish: > awk ’NF<3{n++}n==3 { p r i n t } ’ d . dat > tj gnuplot > p l o t ” t j ” using 2:3 with lines The above task can be completed without creating the intermediate file tj by using the awk filter within gnuplot. For example, the commands gnuplot > ! echo ”10 800 2” | . / d gnuplot > plot ”<awk ’NF<3{n++}n==3 { p r i n t } ’ d . dat ” u 2:3 w l gnuplot > replot ”<awk ’NF<3{n++}n==6 { p r i n t } ’ d . dat ” u 2:3 w l gnuplot > replot ”<awk ’NF<3{n++}n==10 { p r i n t } ’ d . dat ” u 2:3 w l 362 CHAPTER 8. DIFFUSION EQUATION gnuplot > replot ”<awk ’NF<3{n++}n==20 { p r i n t } ’ d . dat ” u 2:3 w l gnuplot > replot ”<awk ’NF<3{n++}n==30 { p r i n t } ’ d . dat ” u 2:3 w l gnuplot > replot ”<awk ’NF<3{n++}n==50 { p r i n t } ’ d . dat ” u 2:3 w l gnuplot > replot ”<awk ’NF<3{n++}n==100{ p r i n t } ’ d . dat ” u 2:3 w l run the program for Nx=10, Nt=800, tf= 2 and construct the plot in figure 8.2 ✂ ✁✡ ✁✠ ✁✟ ✎✕✔ ✁✞ ✓✒ ✑ ✁✝ ✎✏✍ ✌☞ ✁✆ ☛ ✁☎ ✁✄ ✁✂ ✁✄ ✁✆ ✁✞ ✁✠ ✂ ✖ Figure 8.2: The function u(x, t) for Nx=10, Nt=800, tf= 2 for different values of the time tj . We take j = 4, 7, 11, 21, 31, 51, 101 and observe that the function u(x, t) decreases then j increases. It is instructive to compare the results with the known solution u(x, t) = sin(πx)e−π t . We compute the relative error 2 ui,j − u(xi , tj ) , ui,j which can be done within gnuplot with the commands: gnuplot > du ( x , y , z ) = ( z − s i n ( pi * x ) * exp(−pi * pi * y ) ) / z gnuplot > p l o t ”<awk ’NF<3{n++}n==2 ’ d . dat ” u 2 : ( du ( $2 , $1 , $3 ) ) gnuplot > p l o t ”<awk ’NF<3{n++}n==6 ’ d . dat ” u 2 : ( du ( $2 , $1 , $3 ) ) gnuplot > p l o t ”<awk ’NF<3{n++}n==20 ’ d . dat ” u 2 : ( du ( $2 , $1 , $3 ) ) gnuplot > p l o t ”<awk ’NF<3{n++}n==200’ d . dat ” u 2 : ( du ( $2 , $1 , $3 ) ) gnuplot > p l o t ”<awk ’NF<3{n++}n==600’ d . dat ” u 2 : ( du ( $2 , $1 , $3 ) ) gnuplot > p l o t ”<awk ’NF<3{n++}n==780’ d . dat ” u 2 : ( du ( $2 , $1 , $3 ) ) The results can be seen in figure 8.3. 8.6. DIFFUSION ON THE CIRCLE 363 ✁✂ ☛✒ ✁ ✂ ☛☛ ☞ ☞✑ ✎✏✍ ✌☞ ☛ ✁ ✂ ✁ ✂ ✁✂ ✁✄ ✁☎ ✁✆ ✁✝ ✁✞ ✁✟ ✁✠ ✁✡ ✓ Figure 8.3: The absolute value of the relative error of the numerical computation for Nx=10, Nt=800, tf= 2 for different times tj . We take j = 3, 7, 21, 201, 601, 781 and observe that the relative error increases with j. 8.6 Diffusion on the Circle In order to study the kernel K(x, x0 ; t) for the diffusion, or random walk, problem, we should impose the normalization condition (8.4) for all times. In the case of the function u(x, t) defined for x ∈ [0, 1] the re- lation becomes ∫ 1 u(x, t) dx = 1 . (8.29) 0 In order to maintain this relation at all times, it is necessary that the right hand side of equation (8.15) is equal to 0. One way to impose this condition is to study the diffusion problem on the circle. If we parametrize the circle using the variable x ∈ [0, 1], then the points x = 0 and x = 1 are identified and we obtain ∂u(0, t) ∂u(1, t) u(0, t) = u(1, t) , = . (8.30) ∂x ∂x The second relation in the above equations makes the right hand side ∫1 of equation (8.15) to vanish. Therefore if 0 u(x, 0) dx = 1, we obtain ∫1 0 u(x, t) dx = 1, ∀t > 0. Using the above assumptions, the discretization of the differential equation is done exactly as in the problem of heat conduction. Instead 364 CHAPTER 8. DIFFUSION EQUATION of keeping the values u(0, t) = u(1, t) = 0, we apply equation (8.26) also for the points x1 , xNx . In order to take into account the cyclic topology we take ∆t u1,j+1 = u1,j + (u2,j − 2u1,j + uNx ,j ) , (8.31) (∆x)2 and ∆t uNx ,j+1 = ui,j + (u1,j − 2uNx ,j + uNx −1,j ) , (8.32) (∆x)2 since the neighbor to the right of the point xNx is the point x1 and the neighbor to the left of the point x1 is the point xNx . For the rest of the points i = 2, . . . , Nx − 1 equation (8.26) is applied normally. The program that implements the problem described above can be found in the file diffusionS1.f90. The boundary conditions (8.30) are enforced in the lines nnr = i+1 i f ( nnr . g t . Nx ) nnr = 1 nnl = i−1 i f ( nnl . l t . 1 ) nnl = Nx d2udx2 ( i ) = courant * ( u ( nnr ) −2.0D0 * u ( i )+u ( nnl ) ) The initial conditions at t = 0 are chosen so that the particle is located at xNx /2 . For each instant of time we perform measurements in order to verify the equations (8.4) and (8.9) and the fact that limt→+∞ u(x, t) = const. ∑ x The variable prob = N i=1 ui,j and we should check that its value is conserved and is always equal to 1. ∑ x The variable r2 = N i=1 (xi − xNx /2 ) ui,j is a discrete estimator of the 2 expectation value of the distance squared from the initial position. For small enough times it should follow the law given by equation (8.9). These variables are written to the file e.dat together with the values uNx /2,j , uNx /4,j and u1,j . The latter are measured in order to check if for large enough times they obtain the same constant value according to the expectation limt→+∞ u(x, t) = const. The full code is listed below: ! ======================================================= ! 1−dimensional D i f f u s i o n Equation with ! p e r i o d i c boundary c o n d i t i o n s u ( 0 , t )=u ( 1 , t ) ! 0<= x <= 1 and 0<= t <= t f ! ! We s e t i n i t i a l c o n d i t i o n u ( x , t =0) t h a t s a t i s f i e s 8.6. DIFFUSION ON THE CIRCLE 365 ! t h e g i ven boundary c o n d i t i o n s . ! Nx i s t h e number o f p o i n t s i n s p a t i a l l a t t i c e : ! x = 0 + ( j −1) * dx , j = 1 , . . . , Nx and dx = (1 −0) / ( Nx−1) ! Nt i s t h e number o f p o i n t s i n temporal l a t t i c e : ! t = 0 + ( j −1) * dt , j = 1 , . . . , Nt and dt = ( t f −0) / ( Nt −1) ! ! u ( x , 0 ) = \ d e l t a _ {x , 0 . 5 } ! ! ======================================================= program diffusion_1d i m p l i c i t none i n t e g e r , parameter : : P =100000 ! Max no o f p o i n t s r e a l ( 8 ) , parameter : : PI =3.1415926535897932 D0 r e a l ( 8 ) , dimension ( P ) : : u , d2udx2 r e a l ( 8 ) : : t , x , dx , dt , tf , courant , prob , r2 , x0 i n t e g e r Nx , Nt , i , j , nnl , nnr ! −−− Input : p r i n t * , ’ # Enter : Nx , Nt , t f : ( P= ’ , P , ’ Nx must be < P ) ’ read * , Nx , Nt , tf i f ( Nx . ge . P ) s t o p ’Nx >= P ’ i f ( Nx . l e . 3) s t o p ’Nx <= 3 ’ i f ( Nt . l e . 2) s t o p ’ Nt <= 2 ’ ! −−− I n i t i a l i z e : dx = 1 . 0 D0 / ( Nx −1) dt = tf / ( Nt −1) courant = dt / dx * * 2 p r i n t * , ’ # 1d D i f f u s i o n Equation on S1 : 0<=x <=1 , 0<=t <= t f ’ p r i n t * , ’ # dx= ’ , dx , ’ dt= ’ , dt , ’ t f = ’ , tf p r i n t * , ’ # Nx= ’ , Nx , ’ Nt= ’ , Nt p r i n t * , ’ # Courant Number= ’ , courant i f ( courant . g t . 0.5 D0 ) p r i n t * , ’ # WARNING: c o u r a n t > 0.5 ’ open ( u n i t =11 , f i l e = ’d . dat ’ ) ! data f i l e open ( u n i t =12 , f i l e = ’ e . dat ’ ) ! data f i l e ! −−− I n i t i a l c o n d i t i o n a t t =0 −−−−−−−−−−−−−−−−−−−−−−−−−−−−−− do i= 1 , Nx x = ( i−1) * dx u(i) = 0.0 D0 enddo u ( Nx / 2 ) = 1 . 0 D0 do i= 1 , Nx x = ( i−1) * dx w r i t e ( 1 1 , * ) 0.0 D0 , x , u ( i ) enddo write (11 ,*) ’ ’ ! −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ! −−− C a l c u l a t e time e v o l u t i o n : do j =2 , Nt t = ( j−1) * dt ! −−−−− second d e r i v a t i v e : 366 CHAPTER 8. DIFFUSION EQUATION do i =1 , Nx nnr = i+1 i f ( nnr . g t . Nx ) nnr = 1 nnl = i−1 i f ( nnl . l t . 1 ) nnl = Nx d2udx2 ( i ) = courant * ( u ( nnr ) −2.0D0 * u ( i )+u ( nnl ) ) enddo ! −−−−− update : prob = 0.0 D0 r2 = 0.0 D0 x0 = ( ( Nx / 2 ) −1) * dx ! o r i g i n a l p o s i t i o n do i =1 , Nx x = ( i−1) * dx u ( i ) = u ( i ) + d2udx2 ( i ) prob = prob + u ( i ) r2 = r2 + u ( i ) * ( x−x0 ) * ( x−x0 ) enddo do i =1 , Nx x = ( i−1) * dx write (11 ,*) t , x , u(i) enddo write (11 ,*) ’ ’ w r i t e ( 1 2 , * ) ’pu ’ , t , prob , r2 , u ( Nx / 2 ) , u ( Nx / 4 ) , u ( 1 ) enddo ! do j =2 , Nt close (11) end program diffusion_1d 8.7 Analysis For each moment of time, the program writes the following quantities to the file e.dat: ∑ Nx Uj = ui,j (8.33) i=1 which is an estimator of (8.29) and we expect to obtain Uj = 1 for all j, ∑ Nx ⟨r2 ⟩j = ui,j (xi − xNx /2 )2 (8.34) i=1 which is an estimator of (8.9) for which we expect to obtain ⟨r2 ⟩j ∼ 2tj , (8.35) for small times as well as the values of uNx /2,j , uNx /4,j , u1,j . 8.7. ANALYSIS 367 The values of tj , Uj , ⟨r2 ⟩j , uNx /2,j , uNx /4,j , u1,j are found in columns 2, 3, 4, 5, 6 and 7 respectively of the file e.dat. The gnuplot commands gnuplot > ! gfortran diffusionS1 . f90 −o d gnuplot > ! echo ” 10 100 0.4 ” | . / d compile and run the program within gnuplot. They set Nx = 10, Nt = 100, tf = 0.4, ∆x ≈ 0.111, ∆t ≈ 4.0404, ∆t/∆x2 ≈ 0.327. The gnuplot ✁✝✂ ✠✡☛☞✌✂ ✠✡☛☞✌✄ ✠✡✝ ✁✝ ✁ ✆ ✁ ☎ ✁ ✄ ✁ ✂ ✁ ✞ ✁✝ ✁✝✞ ✁✂ ✁✂✞ ✁✟ ✁✟✞ ✁✄ Figure 8.4: The functions uNx /2,j , uNx /4,j , u1,j are given as a function of tj for Nx = 10, Nt = 100, tf = 0.4. We observe that for large times they are consistent with uniform diffusion. commands gnuplot > p l o t ” e . dat ” u 2:5 w l gnuplot > r e p l o t ” e . dat ” u 2:6 w l gnuplot > r e p l o t ” e . dat ” u 2 : 7 w l construct the plot in figure 8.4. We observe that for large times we obtain uniform diffusion. The relation Uj = 1 can be easily confirmed by inspecting the values recorded in the file e.dat. The asymptotic relation ⟨r2 ⟩j ∼ 2tj can be confirmed with the com- mands 368 CHAPTER 8. DIFFUSION EQUATION ✁✝ ✁ ✆ ✁ ☎ ✁ ✄ ✁ ✂ ✠✡☛☞✌✍✎✏ ✂✍ ✁ ✞ ✁✝ ✁✝✞ ✁✂ ✁✂✞ ✁✟ ✁✟✞ ✁✄ Figure 8.5: The expectation value ⟨r2 ⟩j as a function of tj for Nx = 10, Nt = 100, tf = 0.4. For small values of tj we obtain ⟨r2 ⟩j ≈ 2tj . The solid line is the straight line 2t. gnuplot > p l o t [ : ] [ : 0 . 1 1 ] ” e . dat ” u 2 : 4 , 2 * x which construct the plot in figure 8.5. Finally we make a plot of the function u(x, t) with the commands gnuplot > ! echo ” 10 100 0.16 ” | . / d gnuplot > s e t pm3d gnuplot > s p l o t [ 0 : 0 . 1 6 ] [ 0 : 1 ] [ 0 : 1 ] ”d . dat ” w l gnuplot > s p l o t [ 0 : 0 . 1 6 ] [ 0 : 1 ] [ 0 : . 2 ] ”d . dat ” w l and the result is shown in figure 8.6. 8.7. ANALYSIS 369 ✝ ✝ ✁✆ ✁✆ ✁☎ ✁☎ ✁✄ ✁✄ ✁✂ ✁✂ ✝ ✁ ✂ ✁ ✄ ✁✆ ✁ ☎ ✁ ✆ ✁☎ ✁✄ ✁✝ ✁✝✂ ✁✂ ✁✝✄ ✁✝☎ ✆✂✝ ✆✂✡✠ ✆✂✝ ✆✂✡✟ ✆✂✡✞ ✆✂✡☛ ✆✂✡✝ ✆✂✡ ✆✂✡ ✆✂✆✠ ✆✂✆✟ ✆✂✆☛ ✆✂✆✞ ✆✂✆✝ ✆ ✆ ✡ ✆ ✆✂✠ ✆✂✆✝ ✆✂✟ ✆✂✆✞ ✆✂✆✟ ✆✂✞ ✆✂✆✠ ✆✂✡ ✆✂✝ ✆✂✡✝ ✁✂✁✄☎ ✆✂✡✞ ✆ ✆✂✡✟ Figure 8.6: The function u(x, t) for Nx = 10, Nt = 100, tf = 0.16. The second plot differs only in the scale of the z axis so that we can easily see the details of the diffusion away from the point x0 ≡ xNx /2 = x5 . 370 CHAPTER 8. DIFFUSION EQUATION 8.8 Problems 8.1 Reproduce the results in figure 8.3. 8.2 The temperature distribution u(x, t) in a thin rod satisfies equation (8.14) together with the boundary conditions (8.13) at the ends x = 0, 1. The initial temperature distribution at t = 0 is given by the function { 0.5 x ∈ [x1 , x2 ] u(x, 0) = , 0.3 x ∈/ [x1 , x2 ] where x1 = 0.25 and x2 = 0.75. (a) Calculate the temperature distribution u(x, tf ) for tf = 0.0001, 0.001, 0.01, 0.05. Take Nx = 100 and Nt = 1000. Do the same for tf = 0.1 by choosing appropriate Nx and keeping Nt = 1000. Plot the functions u(x, tf ) in the same plot. (b) Calculate the maximum value of the temperature graphically for tf = 0.0001, 0.001, 0.01, 0.05, 0.1, 0.15, 0.25. Take Nx = 100 and choose an appropriate value for the corresponding Nt . (c) Calculate the time at which the temperature of the rod becomes everywhere less than 0.1. Hint: Make your program print only the final temperature distri- bution u(x, tf ). 8.3 The temperature distribution u(x, t) in a thin rod satisfies the equa- tion ∂u ∂ 2u =α 2. ∂t ∂x The temperature at the ends of the rod is u(0, t) = u(1, t) = 0, and when t = 0 { [ ( )] 0.5 1 − cos 2πxb 0≤x<b u(x, 0) = . 0 b≤x≤1 (a) Calculate the temperature distribution u(x, tf ) for α = 0.5, b = 0.09 and for tf = 0.0001, 0.001, 0.01, by taking Nx = 300, Nt = 1000. Do the same for tf = 0.05 by choosing appropriate Nx . Plot the functions u(x, tf ) in the same plot. (b) Using the same parameters, calculate the time evolution of the values of the temperature distribution at the points x1 = 0.05, x2 = 0.50 and x3 = 0.95 for 0 ≤ t ≤ 0.05. Plot the functions u(x1,2,3 , t) in the same plot. 8.8. PROBLEMS 371 (c) Calculate the temperature distribution u(x, tf ) for b = 0.09 and α = 5, 2, 1 for tf = 0.001. Plot the functions u(x, tf ) in the same plot. Comment on the effect of the parameter α on your results. 8.4 The temperature distribution u(x, t) in a thin rod of length L satisfies equation ∂u ∂ 2u 4 ∂u = D(x) 2 − D(x) , ∂t ∂x L ∂x where D(x) = ae−4x/L is the x-dependent thermal diffusivity. The temperature of the rod at its ends is such that u(0, t) = u(L, t) = 0, and at time t = 0, the temperature distribution is u(x, 0) = Ce−(x−L/2) 2 /σ 2 . (a) Write a program where the user enters the parameters L, a, C, σ, Nx , Nt and tf interactively. On exit, the program calculates u(x, tf ) and writes the points (xi , u(xi , tf )) in two columns to a file d.dat. (b) Run the program for L = 4, a = 0.2, C = 1, σ = 1/2, Nx = 400, Nt = 20000 and calculate u(x, tf ) for tf = 0.05, 1.0, 5.0. Plot the functions u(x, tf ) in the same plot. (c) Using the same parameters, calculate the time evolution of the temperature distribution at the points x1 = 1 and x2 = 2 for 0 ≤ t ≤ 5. Plot the functions u(x1,2 , t) in the same plot. 8.5 Reproduce the results shown in figures 8.4 and 8.5. 372 CHAPTER 8. DIFFUSION EQUATION Chapter 9 The Anharmonic Oscillator In this chapter we will use matrix methods in order to compute the quantum mechanical energy spectrum of the anharmonic oscillator. This problem cannot be solved exactly and one has to resort to perturbative or other approximation methods. We will approach this problem numeri- cally by representing the Hamiltonian H as a real symmetric matrix in an appropriately chosen basis of the Hilbert space H of quantum mechani- cal states. The energy spectrum is obtained from the eigenvalues of this matrix and the numerical problem reduces to that of the diagonalization of a real symmetric matrix. Since the Hamiltonian is represented in H by an infinite size matrix, we have to restrict ourselves to a finite dimen- sional subspace HN of dimension N . In this space the Hamiltonian is represented by an N × N real symmetric matrix. The eigenvalues of this matrix will be calculated numerically using standard methods and the energy eigenvalues will be obtained in the N → ∞ limit. For the calculation of the eigenvalues we will use software that is found in the well known library Lapack which contains high quality, freely available, linear algebra software. Part of the goals of this chapter is to show to the reader how to link her programs with software libraries. In order to solve the same problem using Mathematica or Matlab see [40] and [41] respectively. 9.1 Introduction The Hamiltonian of the harmonic oscillator is given by p2 1 H0 = + mω 2 x2 . (9.1) 2m 2 373 374 CHAPTER 9. THE ANHARMONIC OSCILLATOR √ √ Define the position and momentum scales x0 = ℏ/(mω), p0 = ℏmω so that we can express the above equation using dimensionless terms: ( )2 ( )2 H0 1 p 1 x = + . (9.2) ℏω 2 p0 2 x0 If we take the units of energy, distance and momentum to be ℏω, x0 and p0 , then we obtain 1 1 H0 = p2 + x2 , (9.3) 2 2 where H0 , p and x are now dimensionless. The operator H0 can be diagonalized with the help of the creation and annihilation operators a and a† , defined by the relations: 1 i x = √ (a† + a) p = √ (a† − a) , (9.4) 2 2 or 1 1 a = √ (x + ip) a† = √ (x − ip) , (9.5) 2 2 which obey the commutation relation [a, a† ] = 1 , (9.6) which leads to 1 H0 = a† a + . (9.7) 2 The eigenstates |n⟩, n = 0, 1, 2, . . . of H0 span the Hilbert space of states H and satisfy the relations √ √ a† |n⟩ = n + 1 |n + 1⟩ a |n⟩ = n |n − 1⟩ a |0⟩ = 0 , (9.8) therefore a† a |n⟩ = n |n⟩ , (9.9) and 1 H0 |n⟩ = En |n⟩ , En = n + . (9.10) 2 The position representation of the eigenstates |n⟩ is given by the wave- functions: 1 e−x /2 Hn (x) , 2 ψn (x) = ⟨x|n⟩ = √ √ (9.11) 2n n! π where Hn (x) are the Hermite polynomials. 9.2. CALCULATION OF THE EIGENVALUES OF HN M (λ) 375 From equations (9.4) and (9.8) we obtain 1 √ 1 √ xnm = ⟨n| x |m⟩ = √ m + 1 δn,m+1 + √ m δn,m−1 (9.12) 2 2 1 √ = n + m + 1 δ|n−m|,1 (9.13) 2 i √ i √ pnm = ⟨n| p |m⟩ = √ m + 1 δn,m+1 − √ m δn,m−1 . (9.14) 2 2 From the above equations we can easily calculate the Hamiltonian of the anharmonic oscillator H(λ) = H0 + λx4 . (9.15) The matrix elements of H in this representation are: Hnm (λ) ≡ ⟨n| H(λ) |m⟩ = ⟨n| H0 |m⟩ + λ⟨n| x4 |m⟩ (9.16) 1 = (n + )δn,m + λ(x4 )nm (9.17) 2 where (x4 )nm can be calculated from equation (9.12): ∑ ∞ 4 (x )nm = xni1 xi1 i2 xi2 i3 xi3 m . (9.18) i1 ,i2 ,i3 =0 This relation computes the matrix elements of the matrix x4 from the matrix product of x with itself. The problem of the calculation of the energy spectrum has now been reduced to the problem of calculating the eigenvalues of the matrix Hnm . 9.2 Calculation of the Eigenvalues of Hnm(λ) We start by choosing the dimension N of the subspace HN of the Hilbert space of states H. We will restrict ourselves to states within this subspace and we will use the N dimensional representation matrices of x, H0 and H(λ) in HN . For example, when N = 4 we obtain 0 √12 0 0 √1 0 2 0 1 √ x= 0 1 0 3 (9.19) √ 2 3 0 0 2 0 376 CHAPTER 9. THE ANHARMONIC OSCILLATOR 1 0 0 02 0 3 0 0 H0 = 2 0 0 5 0 (9.20) 2 0 0 0 27 1 3λ 3λ √ + 0 0 2 4 2 √ 0 3 + 15λ 0 3 3 λ H(λ) = 2 4 2 3λ 5 (9.21) √ 0 + 27λ 0 2 √ 2 4 0 3 32 λ 0 7 2 + 15λ 4 Our goal is to write a program that calculates the eigenvalues En (N, λ) of the N × N matrix Hnm (λ). Instead of reinventing the wheel, we will use ready made routines that calculate eigenvalues and eigenvectors of matrices found in the Lapack library. This library can be found in the high quality numerical software repository Netlib and more specifically at http://www.netlib.org/lapack/. Documentation can be found at http://www.netlib.org/lapack/lug/, but it is also easily accessible on- line by a Google search or by using the man pages¹. As inexperienced users we will first look for driver routines that per- form a diagonalization process. Since our task is to diagonalize a real symmetric matrix, we pick the subroutine DSYEV (D = double precision, SY = symmetric, EV = eigenvalues with optional eigenvectors). If the documentation of the library is installed in our system, we may use the Linux man pages for accessing it:² > man dsyev From this page we learn how to use this subroutine: SUBROUTINE DSYEV ( JOBZ , UPLO , N , A , LDA , W , WORK , LWORK , INFO ) CHARACTER JOBZ , UPLO INTEGER INFO , LDA , LWORK , N DOUBLE PRECISION A ( LDA , * ) , W ( * ) , WORK ( * ) ARGUMENTS JOBZ ( input ) CHARACTER * 1 ¹The library can be easily installed in many Linux distributions. For example in Ubuntu or other Debian like systems you may use the command apt-get install liblapack3 liblapack-doc liblapack-dev. ²A Google search “dsyev” will easily take you to the same page. 9.2. CALCULATION OF THE EIGENVALUES OF HN M (λ) 377 = ’N ’ : Compute eigenvalues only ; = ’V ’ : Compute eigenvalues and eigenvectors . UPLO ( input ) CHARACTER * 1 = ’ U ’ : Upper triangle of A is stored ; = ’ L ’ : Lower triangle of A is stored . N ( input ) INTEGER The order of the matrix A . N >= 0 . A ( input / output ) DOUBLE PRECISION array , dimension ( LDA , N←- ) On entry , the symmetric matrix A . If UPLO = ’ U ’ , the leading N−by−N upper triangular part of A contains the upper triangular part of the matrix A . If UPLO = ’ L ’ , the leading N−by−N lower triangular part of A contains the lower triangular part of the matrix A . On exit , if JOBZ = ’ V ’ , then if INFO = 0 , A contains the orthonormal eigenvectors of the matrix A . If JOBZ = ’ N ’ , then on exit the lower triangle ( if UPLO = ’L←- ’) or the upper triangle ( if UPLO = ’U ’ ) of A , including the diagonal , is destroyed . LDA ( input ) INTEGER The leading dimension of the array A . LDA >= max ( 1 , N ) . W ( output ) DOUBLE PRECISION array , dimension ( N ) If INFO = 0 , the eigenvalues in ascending order . WORK ( workspace / output ) DOUBLE PRECISION array , dimension ( LWORK ) . On exit , if INFO = 0 , WORK ( 1 ) returns the optimal LWORK . LWORK ( input ) INTEGER The length of the array WORK . LWORK >= max ( 1 , 3 * N←- −1) . For optimal efficiency , LWORK >= ( NB +2) * N , where NB is the blocksize for DSYTRD returned by ILAENV . If LWORK = −1 , then a workspace query is assumed ; the routine only calculates the optimal size of the WORK array , returns this value as the first entry of the WORK array , and no error message related to LWORK is issued by XERBLA . INFO ( output ) INTEGER = 0 : successful exit < 0 : if INFO = −i , the i−th argument had an illegal ←- value 378 CHAPTER 9. THE ANHARMONIC OSCILLATOR > 0 : if INFO = i , the algorithm failed to converge ; ←- i off−diagonal elements of an intermediate tridiagonal form did not converge to zero . These originally cryptic pages contain all the necessary information and the reader should familiarize herself with its format. For a quick and dirty use of the routine, all we need to know is the types and usage of its arguments. These are classified as “input”, “output” and “working space” variables (some are in more than one classes). Input is the necessary data that the routine needs in order to perform the computation. Output is where the results of the computation are stored. And working space is the memory provided by the user to the routine in order to store intermediate results. From the information above we learn that the matrix to be diagonal- ized is A which is a rectangular matrix with the number of its rows and columns ≤ N . The number of rows LDA (LDA= “leading dimension of A”) can be larger than N is which case DSYEV will diagonalize the upper left N×N part of the matrix³. In our program we define a large matrix A(LDA,LDA) and diagonalize a smaller submatrix A(N,N). This way we can study many values of N using the same matrix. The subroutine can be used in two ways: • If JOBZ='N', it calculates only the eigenvalues of the matrix A(N,N) and stores them in the array W(N), sorted in ascending order. We have to be careful because, upon return, the routine destroys the upper (UPLO='U') or lower (UPLO='L') triangular part of A. Since A is symmetric, only this part is needed by DSYEV. If we need to reuse the matrix A, we have to make a backup copy before the call to DSYEV. • If JOBZ='V', it calculates both the eigenvalues and the eigenvectors of the matrix A(N,N). The eigenvalues are stored in the array W(N) as before, whereas the corresponding eigenvectors in the columns of the matrix A(N,N). In order to use the eigenvectors, we can use a statement like v = A(1:N,j) where the array v(N) stores the components of the j-th eigenvector of the matrix corresponding to the eigenvalue λj . The eigenvectors are normalized to unity, i.e. ∑N i=1 v(i)*v(i)= 1. The matrix A(N,N) is destroyed after the call ³The number LDA is necessary because the matrix element A(i,j) is found after i+(LDA-1)*j memory positions from A(1,1). 9.2. CALCULATION OF THE EIGENVALUES OF HN M (λ) 379 to DSYEV and if we need it we have to make a backup copy before the call. The reader should also familiarize herself with the use of the workspace array WORK. This is memory space given to the routine for all its interme- diate calculations. Determining the size of this array needs some care. This is given by LWORK and if performance is an issue the reader should read the documentation carefully for its optimal determination. We will make the simple choice LWORK=3*LDA-1. The variable INFO is used as a flag which informs the user whether the calculation was successful, in which case its value is set to 0. In our case, if INFO takes a non zero value, the program will abort the calculation. Before using the program in a complicated calculation, it is necessary to test its use in a simple, easily controlled problem. We will familiarize ourselves with the use of DSYEV by writing the following program: program test_evs i m p l i c i t none i n t e g e r , parameter : : P = 100 ! P= LDA i n t e g e r , parameter : : LWORK = 3* P−1 r e a l ( 8 ) : : A ( P , P ) , W ( P ) , WORK ( LWORK ) i n t e g e r : : N ! DSYEV d i a g o n a l i z e s A(N, N) integer : : i , j i n t e g e r : : LDA , INFO c h a r a c t e r ( 1 ) : : JOBZ , UPLO ! D e f i n e t h e * * symmetric * * matrix t o be d i a g o n a l i z e d ! The s u b r o u t i n e us e s t h e upper t r i a n g u l a r p a r t (UPLO= ’U’ ) ! t h e r e f o r e t h e lower t r i a n g u l a r p a r t needs not t o be d e f i n e d N=4 A ( 1 , 1 ) = −7.7; A ( 1 , 2 )= 2 . 1 ; A (2 ,2)= 8 . 3 ; A ( 1 , 3 ) = −3.7; A ( 2 , 3 ) = −16.; A ( 3 , 3 ) =−12. A ( 1 , 4 ) = 4 . 4 ; A ( 2 , 4 ) = 4 . 6 ; A ( 3 , 4 ) = −1.04; A ( 4 , 4 ) =−3.7 !We p r i n t t h e matrix A b e f o r e c a l l i n g DSYEV s i n c e i t i s ! destroyed a f t e r the c a l l . do i =1 , N do j=i , N p r i n t * , ’A( ’ , i , ’ , ’ , j , ’ )= ’ , A ( i , j ) enddo enddo !We ask f o r e i g e n v a l u e s AND e i g e n v e c t o r s ( JOBZ= ’V’ ) JOBZ= ’V ’ ; UPLO= ’U’ p r i n t * , ’COMPUTING WITH DSYEV: ’ LDA=P ! n o t i c e t h a t LDA−> P>N ! ! c a l l DSYEV ( JOBZ , UPLO , N , A , LDA , W , WORK , LWORK , INFO ) p r i n t * , ’DSYEV: DONE. CHECKING NOW: ’ 380 CHAPTER 9. THE ANHARMONIC OSCILLATOR ! I f INFO i s nonzero , then t h e r e i s an e r r o r : i f ( INFO . ne . 0) then p r i n t * , ’DSYEV FAILED . INF0= ’ , INFO stop endif ! P r i n t r e s u l t s : W( I ) has t h e e i g e n v a l u e s : p r i n t * , ’DSYEV: DONE . : ’ p r i n t * , ’EIGENVALUES OF MATRIX: ’ do i =1 , N p r i n t * , ’LAMBDA( ’ , i , ’ )= ’ , W ( i ) enddo ! E i g e n v e c t o r s a r e i n s t o r e d i n t h e columns o f A: p r i n t * , ’EIGENVECTORS OF MATRIX’ do J =1 , N p r i n t * , ’EIGENVECTOR ’ , j , ’ FOR EIGENVALUE ’ , W ( j ) do i =1 , N p r i n t * , ’V_ ’ , j , ’ ( ’ , i , ’ )= ’ , A ( i , j ) enddo enddo end program test_evs The next step is to compile and link the program. In order to link the program to Lapack we have to instruct the linker ld where to find the libraries Lapack and BLAS⁴ and link them to our program. A library contains compiled software in archives of object files. The convention for their names in a Unix environment is to start with the string “lib” fol- lowed by the name of the library and a .a or .so extension. For example, in our case the files we are interested in have the names liblapack.so and libblas.so which can be searched in the file system by the commands: > l o c a t e libblas > l o c a t e liblapack In order to see the files that they contain we give the commands⁵: > ar −t / usr / lib / libblas . so > ar −t / usr / lib / liblapack . so In the commands shown above you may have to substitute /usr/lib with the path appropriate for your system. If the program is in the file test.f90, the compilation/linking command is: ⁴The library BLAS contains the basic linear algebra subroutines used by Lapack. In some versions of the library, one has to only link to Lapack ignoring the link BLAS but in some other version, linking to BLAS is necessary. ⁵If the .so files don’t exist in your system, try ar -t /usr/lib/libblas.a etc. 9.2. CALCULATION OF THE EIGENVALUES OF HN M (λ) 381 > g f o r t r a n test . f90 −o test −L / usr / lib −llapack −lblas The option -L/usr/lib instructs the linker to look for libraries in the /usr/lib directory⁶, whereas the options -llapack -lblas instructs the linker to look for any unresolved symbols (i.e. names of external func- tions and subroutines not coded in our program) first in the library liblapack.a and then in the library libblas.a. The command shown above produces the executable file test which, when run, produces the result: EIGENVALUES OF MATRIX : LAMBDA ( 1 )= −21.4119907 LAMBDA ( 2)= −9.93394359 LAMBDA ( 3)= −2.55765591 LAMBDA ( 4)= 18.8035905 EIGENVECTORS OF MATRIX EIGENVECTOR 1 FOR EIGENVALUE −21.4119907 V_ 1 ( 1 )= −0.197845668 V_ 1 ( 2)= −0.464798676 V_ 1 ( 3)= −0.854691009 V_ 1 ( 4)= 0.119676904 EIGENVECTOR 2 FOR EIGENVALUE −9.93394359 V_ 2( 1 )= 0.824412399 V_ 2( 2)= −0.132429396 V_ 2( 3)= −0.191076519 V_ 2( 4)= −0.516039161 EIGENVECTOR 3 FOR EIGENVALUE −2.55765591 V_ 3( 1 )= 0.502684215 V_ 3( 2)= −0.247784372 V_ 3( 3)= 0.132853329 V_ 3( 4)= 0.817472616 EIGENVECTOR 4 FOR EIGENVALUE 18.8035905 V_ 4( 1 )= 0.168848655 V_ 4( 2)= 0.839659187 V_ 4( 3)= −0.464050682 V_ 4( 4)= 0.226096318 We are now ready to tackle the problem of computing the energy spec- trum of the anharmonic oscillator. The main program contains the user interface where the basic parameters for the calculation are read from the stdin. The user can specify the dimension DIM ≡ N of HN and the cou- pling constant λ. Then the program computes the eigenvalues En (N, λ) ⁶This is not necessary in our case, since /usr/lib is in the path that ld searches anyway. This option is useful for libraries located in non conventional paths. 382 CHAPTER 9. THE ANHARMONIC OSCILLATOR of the N × N matrix Hnm (λ), which represents the action of the operator H(λ) in the { |n⟩}n=0,1,...,N −1 representation in HN . The tasks are allocated to the subroutines calculate_X4, calculate_evs and calculate_H. The subroutine calculate_X4 calculates the N × N matrix (x4 )nm . First, the matrix xnm is calculated and then (x4 )nm is obtained by computing its fourth power. The matrix (x4 )nm can also be calculated analytically and this is left as an exercise to the reader. The subroutine calculate_H calcu- lates the matrix Hnm (λ) using the result for (x4 )nm given by calculate_X4. Finally the eigenvalues are calculated in the subroutine calculate_evs by a call to DSYEV, which are returned to the main program for printing to the stdout. The program is listed below and can be found in the file anharmonic.f90: ! ======================================================== program anharmonic_elevels ! ======================================================== i m p l i c i t none i n t e g e r , parameter :: P = 1000 i n t e g e r , parameter : : LWORK = 3* P−1 integer : : DIM r e a l ( 8 ) , dimension ( P , P ) : : H , X , X4 ! H a m i l t i o n i a n+ P o s i t i o n Ops r e a l ( 8 ) , dimension ( P ) :: E ! energy e i g e n v a l u e s r e a l ( 8 ) , dimension ( LWORK ) : : WORK real (8) : : lambda integer :: i print * , ’ # Enter H i l b e r t Space dimension : ’ read * ,DIM print * , ’ # Enter lambda : ’ read * , lambda print * , ’ # lambda= ’ , lambda ! Print Message : print * , ’ # ################################################ ’ print * , ’ # Energy spectrum o f anharmonic o s c i l l a t o r ’ print * , ’ # using matrix methods . ’ print * , ’ # H i l b e r t Space Dimension DIM = ’ ,DIM print * , ’ # lambda c o u p l i n g = ’ , lambda print * , ’ # ################################################ ’ print * , ’ # Outpout : DIM lambda E_0 E_1 . . . . E_{N−1} ’ print * , ’ # −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−’ ! C a l c u l a t e X^4 o p e r a t o r : c a l l calculate_X4 ( X , X4 , DIM) ! Calculate eigenvalues : c a l l calculate_evs ( H , X4 , E , WORK , lambda , DIM) w r i t e ( 6 , 1 0 0 ) ’EV ’ ,DIM, lambda , ( E ( i ) , i =1 ,DIM) 9.2. CALCULATION OF THE EIGENVALUES OF HN M (λ) 383 100 FORMAT( A3 , I8 ,20000 G25 . 1 5 ) end program anharmonic_elevels ! ======================================================== s u b r o u t i n e calculate_evs ( H , X4 , E , WORK , lambda , DIM) ! ======================================================== i m p l i c i t none i n t e g e r , parameter :: P = 1000 i n t e g e r , parameter : : LWORK = 3* P−1 r e a l ( 8 ) , dimension ( P , P ) : : H , X4 r e a l ( 8 ) , dimension ( P ) :: E r e a l ( 8 ) , dimension ( LWORK ) : : WORK integer : : DIM real (8) : : lambda character (1) : : JOBZ , UPLO integer : : LDA , INFO , i , j c a l l calculate_H ( H , X4 , lambda , DIM) JOBZ= ’V ’ ; UPLO= ’U’ c a l l DSYEV ( JOBZ , UPLO , DIM, H , P , E , WORK , LWORK , INFO ) p r i n t * , ’ # * * * * * * * * * * * * * * * * * * * * * * EVEC * * * * * * * * * * * * * * * * * * * ’ do j =1 ,DIM w r i t e ( 6 , 1 0 1 ) ’ # EVEC ’ , lambda , ( H ( i , j ) , i =1 ,DIM) enddo p r i n t * , ’ # * * * * * * * * * * * * * * * * * * * * * * EVEC * * * * * * * * * * * * * * * * * * * ’ 101 FORMAT( A7 , F15 .3 ,20000 G14 . 6 ) ! I f INFO i s nonzero then we have an e r r o r i f ( INFO . ne . 0) then p r i n t * , ’ dsyev f a i l e d . INFO= ’ , INFO stop endif end s u b r o u t i n e calculate_evs ! ======================================================== s u b r o u t i n e calculate_H ( H , X4 , lambda , DIM) ! ======================================================== i m p l i c i t none i n t e g e r , parameter : : P = 1000 r e a l ( 8 ) , dimension ( P , P ) : : H , X4 integer : : DIM real (8) : : lambda integer :: i,j do j =1 ,DIM do i =1 ,DIM H ( i , j )=lambda * X4 ( i , j ) enddo H ( j , j ) = H ( j , j ) + DBLE( j ) − 0.5 D0 ! E_n=n + 1 / 2 , n=j −1=>E_n=j −1/2 enddo 384 CHAPTER 9. THE ANHARMONIC OSCILLATOR print * , ’# * * * * * * * * * * * * * * * * * * * * * * H * * * * * * * * * * * * * * * * * * * ’ do j =1 ,DIM w r i t e ( 6 , 1 0 2 ) ’ # HH ’ , ( H ( i , j ) , i =1 ,DIM) enddo print * , ’# * * * * * * * * * * * * * * * * * * * * * * H * * * * * * * * * * * * * * * * * * * ’ 102 FORMAT( A5 ,20000 G20 . 6 ) end s u b r o u t i n e calculate_H ! ======================================================== s u b r o u t i n e calculate_X4 ( X , X4 , DIM) ! ======================================================== i m p l i c i t none i n t e g e r , parameter : : P=1000 r e a l ( 8 ) , dimension ( P , P ) : : X , X4 , X2 integer : : DIM integer :: i,j,m,n r e a l ( 8 ) , parameter : : isqrt2 =1.0 D0 / s q r t ( 2 . 0 D0 ) ! Compute t h e p o s i t i o n o p e r a t o r : X = 0.0 D0 ! Compute t h e nonzero e l e m e n t s do i =1 ,DIM n=i−1 ! i n d i c e s 0 , . . . , DIM−1 ! The d e l t a _ {n ,m+1} term , i . e . m=n−1 m=n−1 ! t h e energy l e v e l n −> i =n+1 , m−> j =m+1 j=m+1 i f ( j . ge . 1 ) X ( i , j )=isqrt2 * s q r t (DBLE( m +1) ) ! The d e l t a _ {n ,m−1} term , i . e . m=n+1 m=n+1 j=m+1 i f ( j . l e .DIM) X ( i , j )=isqrt2 * s q r t (DBLE( m ) ) enddo ! Compute t h e Hamiltonian o p e r a t o r : ! S t a r t with t h e X^4 o p e r a t o r : X2 = MATMUL( X , X ) ! f i r s t X2 , then X4 : X4 = MATMUL( X2 , X2 ) end s u b r o u t i n e calculate_X4 9.3 Results Compiling and running the program can be done with the commands: > g f o r t r a n −O2 anharmonic . f90 −o an −llapack −lblas > . / an # Enter H i l b e r t Space dimension : 4 # Enter lambda : 9.3. RESULTS 385 n=0 0.8 λ=0.9 λ=0.2 0.75 0.7 En 0.65 0.6 0.55 0.5 0 0.1 0.2 0.3 0.4 0.5 1/N Figure 9.1: The ground state energy E0 (λ) for λ = 0.2, 0.9 is calculated in the large N limit of the eigenvalues E0 (N, λ). Convergence is satisfactory for relatively small values of N and it is slightly faster for λ = 0.2 than it is for λ = 0.9. 0.0 ..... # ********************** H ******************* # HH 0.50 0.00 0.00 0.00 # HH 0.00 1.50 0.00 0.00 # HH 0.00 0.00 2.50 0.00 # HH 0.00 0.00 0.00 3.50 # ********************** H ******************* # * * * * * * * * * * * * * * * * * * * * * * EVEC * * * * * * * * * * * * * * * * # EVEC 0.000 1.00 0.00 0.00 0.00 # EVEC 0.000 0.00 1.00 0.00 0.00 # EVEC 0.000 0.00 0.00 1.00 0.00 # EVEC 0.000 0.00 0.00 0.00 1.00 # * * * * * * * * * * * * * * * * * * * * * * EVEC * * * * * * * * * * * * * * * * EV 4 0.000 0.50 1.50 2.50 3.50 In the above program we used N = 4 and λ = 0. The λ = 0 choice leads us to the simple harmonic oscillator and we obtain the expected solutions: Hnm = (n + 1/2)δn,m , E ∑n 3= (n + 1/2) and the eigenstates (eigenvectors of Hnm ) |n⟩λ=0 = |n⟩ = m=0 δn,m |m⟩. Similar results can be obtained for larger N . For non zero values of λ, the finite N calculation contains systematic errors from neglecting all the matrix elements Hnm (λ) for n ≥ N or m ≥ N . Our program calculates the eigenvalues En (N, λ) of the finite matrix Hnm (λ), m, n = 0, . . . , N − 1 and one expects that En (λ) = lim En (N, λ) , (9.22) N →∞ 386 CHAPTER 9. THE ANHARMONIC OSCILLATOR n=9 140 λ=0.9 120 λ=0.2 100 80 En 60 40 20 0 0 0.02 0.04 0.06 0.08 0.1 0.12 0.14 1/N Figure 9.2: The 9th excited state E9 (λ) for λ = 0.2, 0.9 is given by the large N limit of the eigenvalues E9 (N, λ). where H(λ) |n⟩λ = En (λ) |n⟩λ , (9.23) is the true n-th level eigenvalue of the Hamiltonian H(λ). In practice the limit 9.22 for given λ and n is calculated by computing En (N, λ) numerically for increasing values of N . If convergence to a desired level of accuracy is achieved for the accessible values of N , then the approached limit is taken as an approximation to En (λ). This process is shown graphically in figures 9.1-9.3 for λ = 0.2, 0.9. Convergence is satisfactory for quite small N for n = 0, 9 but larger values of N are needed for n = 20. Increasing the value of n for fixed λ makes the use of larger values of N necessary. Similarly for a given energy level n, increasing λ also makes the use of larger values of N necessary. A session that computes this limit for the ground level energy E0 (λ = 0.9) is shown below⁷: > tcsh > g f o r t r a n −O2 anharmonic . f90 −llapack −lblas −o an > f o r e a c h N (4 8 12 16 24 32) f o r e a c h ? ( echo $N ; echo 0 . 9 ) | . / an >> data f o r e a c h ? end > grep ^ EV data | awk ’{ p r i n t $2 , $4 } ’ 4 0.711467845686790 8 0.786328966767866 12 0.785237674919165 ⁷The foreach loop construct is special to the tcsh shell. This is why an explicit tcsh command is shown. For other shells use their corresponding syntax. 9.3. RESULTS 387 n = 20 500 λ=0.9 450 λ=0.2 400 350 300 En 250 200 150 100 50 0 0.01 0.015 0.02 0.025 0.03 0.035 0.04 0.045 0.05 1/N Figure 9.3: The 20th excited state E20 (λ) for λ = 0.2, 0.9 is given by the large N limit of the eigenvalues E20 (N, λ). Convergence has not been achieved for the displayed values of N ≤ 80. 16 0.784964461939594 24 0.785032515135677 32 0.785031492177730 > gnuplot gnuplot > plot ”<grep ^EV data | awk ’{ p r i n t 1 / $2 , $4 } ’ ” Further automation of this process can be found in the shell script file anharmonic.csh in the accompanying software. We note the large N convergence of E0 (N, 0.9) and that we can take E0 (0.9) ≈ 0.78503. For higher accuracy, a computation using larger N will be necessary. We can also compute the expectation values ⟨A⟩n (λ) of an operator A = A(p, q) when the anharmonic oscillator is in a state |n⟩λ : ⟨A⟩n (λ) = λ ⟨n| A |n⟩λ . (9.24) In practice, the expectation value will be computed from the limit ⟨A⟩n (λ) = lim ⟨A⟩n (N, λ) ≡ lim N,λ ⟨n| A |n⟩N,λ , (9.25) N →∞ N →∞ where |n⟩N,λ are the eigenvectors of the finite N × N matrix Hnm (λ) com- puted numerically by DSYEV. These are determined by their components cm (N, λ), where ∑ N −1 |n⟩N,λ = cm (N, λ) |m⟩ , (9.26) m=0 which are stored in the columns of the array H after the call to DSYEV: cm (N, λ) = H(m + 1, n + 1) . (9.27) 388 CHAPTER 9. THE ANHARMONIC OSCILLATOR Substituting equation (9.26) to (9.24) we obtain ∑ N −1 ⟨A⟩n (λ) = c∗m (N, λ)cm′ (N, λ)Amm′ , (9.28) m,m′ =0 and we can use (9.27) for the computation of the sum. As an application, consider the expectation values of the operators x2 , x4 and p2 . Taking √ ⟨x⟩n = ⟨p⟩n = 0, √ √into account that we obtain the uncertainties ∆xn ≡ ⟨x ⟩n − ⟨x⟩n = ⟨x ⟩n and ∆pn = ⟨p2 ⟩n . Their 2 2 2 product should satisfy Heisenberg’s uncertainty relation ∆xn · ∆pn ≳ 1/2. The results are shown in table 9.1 and in figures 9.4-9.5. The calculation is left as an exercise to the reader. 10 ∆X ∆P <X2>1/2 <P2>1/2 8 6 4 2 0 0 0.01 0.02 0.03 0.04 0.05 0.06 0.07 0.08 0.09 1/N Figure 9.4: The expectation values ⟨x2 ⟩1/2 2 1/2 n (λ), ⟨p ⟩n (λ) and the product of un- certainties ∆xn · ∆pn for n = 9 and λ = 0.5 calculated from the large N limits of 1/2 1/2 ⟨x2 ⟩n (N, λ), ⟨p2 ⟩n (N, λ). The physics of the anharmonic oscillator can be better understood by studying the large λ limit. As shown in figure 9.5, the term λx4 dominates in this limit and the expectation value ⟨x2 ⟩n (λ) decreases. This means that states that confine the oscillator to a smaller range of x are favored. This, using the uncertainty principle, implies that the typical momentum of the oscillator also increases in magnitude. This is confirmed in figure 9.5 where we observe the expectation value ⟨p2 ⟩n (λ) to increase with λ. In order to understand quantitatively these competing effects we will use a scaling argument due to Symanzik. We redefine x → λ−1/6 x, p → λ1/6 p in the Hamiltonian H(λ) = p2 /2 + x2 /2 + λx4 and for large enough λ we 9.3. RESULTS 389 14 12 10 8 ∆X ∆P <P2>1/2 <X2>1/2 6 4 2 0 0 20 40 60 80 100 λ Figure 9.5: The expectation values ⟨x2 ⟩1/2 2 1/2 n (λ), ⟨p ⟩n (λ) and the product of uncer- tainties ∆xn · ∆pn for n = 9. obtain⁸ the asymptotic behavior H(λ) ∼ λ1/3 h(1) , λ → ∞, (9.29) where h(λ) = p2 /2+λx4 is the Hamiltonian of the anharmonic “oscillator” with ω = 0. Since the operator h(1) is independent of λ, the energy spectrum will have the asymptotic behavior En (λ) ∼ Cn λ1/3 , λ → ∞. (9.30) In reference [42] it is shown that for λ > 100 we have that ( ) E0 (λ) = λ1/3 0.667 986 259 18 + 0.143 67λ−2/3 − 0.0088λ−4/3 + . . . , (9.31) 6 with an accuracy better than one part in 10 . For large values of n, the authors obtain the asymptotic behavior ( )4/3 1 En (λ) ∼ Cλ 1/3 n+ , λ → ∞,n → ∞, (9.32) 2 where C = 34/3 π 2 /Γ(1/4)8/3 ≈ 1.376 507 40. This relation is tested in figure 9.6 where we observe good agreement with our calculations. ⁸For x → λ−1/6 x, H → λ1/3 (p2 /2 + λ−2/3 x2 /2 + x4 ), therefore in the limit λ → ∞ the second term vanishes and we obtain equation (9.29). 390 CHAPTER 9. THE ANHARMONIC OSCILLATOR λ = 0.5 λ = 2.0 n ⟨x ⟩ 2 ⟨p ⟩ 2 ∆x · ∆p ⟨x ⟩ 2 ⟨p2 ⟩ ∆x · ∆p 0 0.305814 0.826297 0.502686 0.21223 1.19801 0.504236 1 0.801251 2.83212 1.5064 0.540792 4.21023 1.50893 2 1.15544 5.38489 2.49438 0.761156 8.15146 2.49089 3 1.46752 8.28203 3.48627 0.958233 12.6504 3.48166 4 1.75094 11.4547 4.47845 1.13698 17.596 4.47285 5 2.01407 14.8603 5.47079 1.30291 22.9179 5.46443 6 2.2617 18.4697 6.4632 1.45905 28.5683 6.45619 7 2.49696 22.2616 7.45562 1.60735 34.5124 7.44805 8 2.72198 26.2196 8.44804 1.74919 40.7234 8.43998 9 2.93836 30.3306 9.44045 1.88558 47.1801 9.43194 Table 9.1: The expectation values ⟨x2 ⟩, ⟨p2 ⟩, ∆x · ∆p for the√ anharmonic oscillator for √ |n⟩, n = 0, . . . , 9. We observe a decrease of ∆x = ⟨x ⟩ and an increase of the states 2 ∆p = ⟨p ⟩ as λ is increased. The product ∆x · ∆p seems to remain very close to the 2 values (n + 1/2) of the harmonic oscillator for both values of λ. 9.4 The Double Well Potential We can also use matrix methods in order to calculate the energy spectrum of a particle in a double well potential given by the Hamiltonian: p2 x2 x4 H= − +λ . (9.33) 2 2 4 The equilibrium points of the classical motion are located at the minima: 1 1 x0 = ± √ , Vmin = − . (9.34) λ 4λ When the well is very deep, then for the lowest energy levels the potential can be well approximated by that of a harmonic oscillator with angular frequency ω 2 = V ′′ (x0 ), therefore 1 Emin ≈ Vmin + ω . (9.35) 2 In this case the tunneling effect is very weak and the energy levels are arranged in almost degenerate pairs. The corresponding eigenstates are symmetric and antisymmetric linear combinations of states localized near the left and right minima of the potential. For example, for the two lowest Table 9.2: Numerical calculation of the energy levels of the anharmonic oscillator given in reference [42]. λ E0 E1 E2 E3 E4 0.002 0.501 489 66 1.507 419 39 2.519 202 12 3.536 744 13 4.559 955 56 0.006 0.504 409 71 1.521 805 65 2.555 972 30 3.606 186 33 4.671 800 37 0.01 0.507 256 20 1.535 648 28 2.590 845 80 3.671 094 94 4.774 913 12 0.05 0.532 642 75 1.653 436 01 2.873 979 63 4.176 338 91 5.549 297 81 0.1 0.559 146 33 1.769 502 64 3.138 624 31 4.628 882 81 6.220 300 90 0.3 0.637 991 78 2.094 641 99 3.844 782 65 5.796 573 63 7.911 752 73 0.5 0.696 175 82 2.324 406 35 4.327 524 98 6.578 401 95 9.028 778 72 0.7 0.743 903 50 2.509 228 10 4.710 328 10 7.193 265 28 9.902 610 70 1 0.803 770 65 2.737 892 27 5.179 291 69 7.942 403 99 10.963 5831 2 0.951 568 47 3.292 867 82 6.303 880 57 9.727 323 19 13.481 2759 50 2.499 708 77 8.915 096 36 17.436 9921 27.192 6458 37.938 5022 200 3.930 931 34 14.059 2268 27.551 4347 43.005 2709 60.033 9933 1000 3.694 220 85 23.972 2061 47.017 3387 73.419 1140 102.516 157 8000 13.366 9076 47.890 7687 93.960 6046 146.745 512 204.922 711 20000 18.137 2291 64.986 6757 127.508 839 199.145 124 278.100 238 λ E5 E6 E7 E8 0.002 5.588 750 05 6.623 044 60 7.662 759 33 8.707 817 30 9.4. THE DOUBLE WELL POTENTIAL 0.006 5.752 230 87 6.846 948 47 7.955 470 29 9.077 353 66 0.01 5.901 026 67 7.048 326 88 8.215 837 81 9.402 692 31 0.05 6.984 963 10 8.477 397 34 10.021 9318 11.614 7761 0.1 7.899 767 23 9.657 839 99 11.487 3156 13.378 9698 0.3 10.166 4889 12.544 2587 15.032 7713 17.622 4482 0.5 11.648 7207 14.417 6692 17.320 4242 20.345 1931 0.7 12.803 9297 15.873 6836 19.094 5183 22.452 9996 1 14.203 1394 17.634 0492 21.236 4362 24.994 9457 2 17.514 1324 21.790 9564 26.286 1250 30.979 8830 50 49.516 4187 61.820 3488 74.772 8290 88.314 3280 391 200 78.385 6232 97.891 3315 118.427 830 139.900 400 1000 133.876 891 167.212 258 202.311 200 239.011 580 8000 267.628 498 334.284 478 404.468 350 477.855 700 20000 363.201 843 453.664 875 548.916 140 648.515 330 392 CHAPTER 9. THE ANHARMONIC OSCILLATOR 1.41 n=1 n=2 n=5 1.405 n=9 n=20 C 1.4 En λ-1/3 (n+1/2)-4/3 1.395 1.39 1.385 1.38 1.375 0 500 1000 1500 2000 λ Figure 9.6: Test of the asymptotic relation (9.32). The vertical axis is En λ−1/3 (n + 1/2)−4/3 where for large enough n and λ should approach the value C = 34/3 π 2 /Γ(1/4)8/3 ≈ 1.376 507 40 (horizontal line). energy levels we expect that ∆ E0,1 ≈ Emin ± , (9.36) 2 where ∆ ≪ |Emin | and |+⟩ + |−⟩ |+⟩ − |−⟩ |0⟩λ ≈ √ , |1⟩λ ≈ √ , (9.37) 2 2 where the states |+⟩ and |−⟩ are localized to the left and right well of the potential respectively (see also figure 10.4 of chapter 10). We will use equations (9.12) in order to calculate the Hamiltonian (9.33). We need to make very small modifications to the code in the file anharmonic.f90. We will only add a routine that calculates the matrices pnm . The resulting program can be found in the file doublewell.f90: ! ======================================================== program doublewell_elevels ! ======================================================== ! H : Hamiltonian o p e r a t o r H0+( lambda / 4 ) *X^4 9.4. THE DOUBLE WELL POTENTIAL 393 1.5 λ=0.2 λ=0.1 1 0.5 0 V(x) -0.5 -1 -1.5 -2 -2.5 -4 -2 0 2 4 x Figure 9.7: The potential energy V (x) for the double well potential for λ = 0.1, 0.2. ! H0 : Hamiltonian H0=1/2 P^2 −1/2 X^2 ! X, X2 , X4 : P o s i t i o n o p e r a t o r and i t s powers ! iP : i P operator ! P2 : P^2 = −( i P ) ( i P ) o p e r a t o r ! E : Energy e i g e n v a l u e s ! WORK : Workspace f o r l a p a c k r o u t i n e DSYEV ! ======================================================== i m p l i c i t none i n t e g e r , parameter : : P=1000 i n t e g e r , parameter : : LWORK =3*P−1 r e a l ( 8 ) , dimension ( P , P ) : : H , H0 , X , X4 , X2 , iP , P2 r e a l ( 8 ) , dimension ( P ) :: E r e a l ( 8 ) , dimension ( LWORK ) : : WORK real (8) : : lambda , lambda0 , lambdaf , dlambda integer : : DIM0 , DIMF , dDIM , DIM integer :: i ! Minimum and maximum v a l u e s o f H i l b e r t sp a ce dimensions : p r i n t * , ’ Enter H i l b e r t Space dimensions (DIM0 , DIMF, DDIM) : ’ read * , DIM0 , DIMF , DDIM ! Minimum and maximum v a l u e s o f lambda ( s t e p dlambda ) : p r i n t * , ’ Enter lambda0 , lambdaf , dlambda : ’ read * , lambda0 , lambdaf , dlambda p r i n t * , ’ lambda0= ’ , lambda0 ! P r i n t Message : p r i n t * , ’ # ################################################ ’ p r i n t * , ’ # Energy l e v e l s o f double w e l l p o t e n t i a l ’ p r i n t * , ’ # using matrix methods . ’ p r i n t * , ’ # H i l b e r t Space Dimensions = ’ , DIM0 , ’ − ’ , DIMF ,& ’ s t e p= ’ , dDIM 394 CHAPTER 9. THE ANHARMONIC OSCILLATOR p r i n t * , ’ # lambda c o u p l i n g = ’ , lambda0 , ’ − ’ , lambdaf ,& ’ s t e p= ’ , dlambda p r i n t * , ’ # ################################################ ’ p r i n t * , ’ # Outpout : DIM lambda E_0 E_1 . . . . E_{N−1} ’ p r i n t * , ’ # −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−’ do DIM=DIM0 , DIMF , dDIM c a l l calculate_operators ( X , X2 , X4 , iP , P2 , H0 , DIM) lambda = lambda0 do while ( lambda . l e . lambdaf ) c a l l calculate_evs ( H , H0 , X4 , E , WORK , lambda , DIM) w r i t e ( 6 , 1 0 0 ) ’EV ’ ,DIM, lambda , ( E ( i ) , i =1 ,DIM) lambda = lambda+dlambda enddo enddo 100 FORMAT( A3 , I5 ,1000 G25 . 1 5 ) end program doublewell_elevels ! ======================================================== s u b r o u t i n e calculate_evs ( H , H0 , X4 , E , WORK , lambda , DIM) ! ======================================================== i m p l i c i t none i n t e g e r , parameter : : P=1000 i n t e g e r , parameter : : LWORK =3*P−1 r e a l ( 8 ) , dimension ( P , P ) : : H , H0 , X4 r e a l ( 8 ) , dimension ( P ) :: E r e a l ( 8 ) , dimension ( LWORK ) : : WORK integer : : DIM real (8) : : lambda character (1) : : JOBZ , UPLO integer : : LDA , INFO , i , j c a l l calculate_H ( H , H0 , X4 , lambda , DIM) JOBZ= ’V ’ ; UPLO= ’U’ c a l l DSYEV ( JOBZ , UPLO , DIM, H , P , E , WORK , LWORK , INFO ) p r i n t * , ’ # * * * * * * * * * * * * * * * * * * * * * * EVEC * * * * * * * * * * * * * * * * * * * ’ do j =1 ,DIM w r i t e ( 6 , 1 0 1 ) ’ # EVEC ’ ,DIM, lambda , ( H ( i , j ) , i =1 ,DIM) enddo p r i n t * , ’ # * * * * * * * * * * * * * * * * * * * * * * EVEC * * * * * * * * * * * * * * * * * * * ’ 101 FORMAT( A7 , I5 , F8 . 4 , 1 0 0 0 G14 . 6 ) i f ( INFO . ne . 0) then p r i n t * , ’ dsyev f a i l e d . INFO= ’ , INFO stop endif end s u b r o u t i n e calculate_evs 9.4. THE DOUBLE WELL POTENTIAL 395 ! ======================================================== s u b r o u t i n e calculate_H ( H , H0 , X4 , lambda , DIM) ! ======================================================== i m p l i c i t none i n t e g e r , parameter : : P=1000 r e a l ( 8 ) , dimension ( P , P ) : : H , H0 , X4 integer : : DIM real (8) : : lambda integer :: i,j do j =1 ,DIM do i =1 ,DIM H ( i , j )=H0 ( i , j ) +0.25 D0 * lambda * X4 ( i , j ) enddo enddo print * , ’# * * * * * * * * * * * * * * * * * * * * * * H * * * * * * * * * * * * * * * * * * * ’ do j =1 ,DIM w r i t e ( 6 , 1 0 2 ) ’ # HH ’ , ( H ( i , j ) , i =1 ,DIM) enddo print * , ’# * * * * * * * * * * * * * * * * * * * * * * H * * * * * * * * * * * * * * * * * * * ’ 102 FORMAT( A5 ,1000 G14 . 6 ) end s u b r o u t i n e calculate_H ! ======================================================== s u b r o u t i n e calculate_operators ( X , X2 , X4 , iP , P2 , H0 , DIM) ! ======================================================== i m p l i c i t none i n t e g e r , parameter : : P=1000 r e a l ( 8 ) , dimension ( P , P ) : : X , X4 , X2 , iP , P2 , H0 integer : : DIM integer :: i,j,m,n r e a l ( 8 ) , parameter : : isqrt2 =1.0 D0 / s q r t ( 2 . 0 D0 ) X =0.0 D0 ; X2 =0.0 D0 ; X4 =0.0 D0 iP =0.0 D0 ; P2 =0.0 D0 do i =1 ,DIM n=i−1 ! i n d i c e s 0 , . . . , DIM−1 ! The d e l t a _ {n ,m+1} term , i . e . m=n−1 m=n−1 ! energy l e v e l : n −> i =n+1 , m−> j =m+1 j=m+1 i f ( j . ge . 1 ) X ( i , j ) = isqrt2 * s q r t (DBLE( m +1) ) i f ( j . ge . 1 ) iP ( i , j ) = −isqrt2 * s q r t (DBLE( m +1) ) ! The d e l t a _ {n ,m−1} term , i . e . m=n+1 m=n+1 j=m+1 i f ( j . l e .DIM) X ( i , j ) = isqrt2 * s q r t (DBLE( m ) ) i f ( j . l e .DIM) iP ( i , j ) = isqrt2 * s q r t (DBLE( m ) ) 396 CHAPTER 9. THE ANHARMONIC OSCILLATOR enddo ! do i =1 ,DIM X2 = MATMUL( X , X ) P2 = −MATMUL( iP , iP ) X4 = MATMUL( X2 , X2 ) ! The H a m i l t i o n i a n : H0 = 0.5 D0 * ( P2−X2 ) end s u b r o u t i n e calculate_operators Where is the particle’s favorite place when it is in the states |+⟩ and |−⟩? The answer to this question is obtained from the study of the expectation value of the position operator ⟨x⟩ in each one of them. We know that when the particle is in one of the energy eigenstates, then we have that ⟨x⟩n (λ) = λ ⟨n| x |n⟩λ = 0 (9.38) because the potential V (x) = V (−x) is even. Therefore ⟨x⟩± (λ) = ⟨±| x |±⟩ 1 = √ (λ ⟨0| x |0⟩λ ± λ ⟨1| x |0⟩λ ± λ ⟨0| x |1⟩λ + λ ⟨1| x |0⟩λ ) 2 √ = ± 2⟨1| x |0⟩λ , (9.39) where in the last line we used the relation (9.38) λ ⟨0| x |0⟩λ = λ ⟨1| x |1⟩λ = 0 and that the amplitudes λ ⟨1| x |0⟩λ = λ ⟨0| x |1⟩λ . Also⁹ we have that ∑∞ (0) λ ⟨1| x |0⟩λ > 0. Therefore, if we have that |0⟩λ = m=0 cm |m⟩ and |1⟩λ = ∑∞ (1) m=0 cm |m⟩, we obtain √ ∑∞ (1) ⟨x⟩± (λ) = ± 2 c(0) m cm′ Xmm′ . (9.40) m,m′ =0 Given that for finite N , the subroutine DSYEV returns approximations to (n) (n) the coefficients cm in the columns of the matrix H(DIM,DIM) so that cm ≈ H(m+1,n+1), you√ may compare the value of ⟨x⟩± (λ) with the classical values x0 = ±1/ λ as λ is increased. ⁹You may convince yourselves by looking at the wave functions in figures 10.4 of chapter 10 and by computing the relevant integrals. 9.4. THE DOUBLE WELL POTENTIAL 397 1 0.01 0.0001 ∆n 1e-06 1e-08 1e-10 n=0 n=6 n=30 0.01 0.1 1 10 100 λ Figure 9.8: Calculation of the difference of the energy levels ∆n = En+1 − En for n = 0, 6, 30 for the double well potential from the program doublewell.f90. The difference vanishes√as the well becomes deeper with decreasing λ. The states |±⟩ = ( |n + 1⟩λ ± |n⟩λ )/ 2 are more and more localized to the right or left well respectively. 398 CHAPTER 9. THE ANHARMONIC OSCILLATOR 9.5 Problems 9.1 Calculate the matrix H(λ) for N = 2, 3 analytically. Calculate its eigenvalues for N = 2. Compare your results with the numerical values that you obtain from your program. 9.2 Add the necessary code to the program in the file test.f90 so that it checks that the eigenvectors satisfy their defining relations A vi = λi vi and that they form an orthonormal basis vi · vj = δij . 9.3 Calculate E5 (λ) and E9 (λ) for λ = 0.8, 1.2 with an accuracy better than 0.01%. 9.4 For how large n can you calculate En (λ) for λ = 1 with an accuracy better than 2% when N = 64? 9.5 Calculate E3 (λ) and E12 (λ) for 0 ≤ λ ≤ 4 with step δλ = 0.2 by achieving accuracy better than 0.01%. How large should N be taken in each case? 9.6 Calculate the expression that gives the matrix elements of the oper- ator x4 in the |n⟩ representation analytically. Modify the program in anharmonic.f90 in order to incorporate your calculation. Verify that the results are the same and test if it has an effect in the to- tal computation time with and without calculating the eigenvalues and eigenvectors of the Hamiltonian. Compute in each case the de- pendence of the cpu time on N by computing the exponent (cpu time)∼ N a for N = 40 − 1000. 9.7 Modify the code in the file anharmonic.f90 so that the arrays H, X, X4, E, WORK are ALLOCATABLE and their dimension is determined by the variable DIM read by the program interactively. (Hint: Look at the file anharmonicSPEED.f90.) 9.8 Make an attempt to reproduce the results of Hioe and Montroll [42] given in table 9.2 for n = 3 and n = 5. What is the largest value of λ that you can study given your computational resources? 9.9 Make an attempt to reproduce the results of Hioe and Montroll [42] given by equation (9.31). Calculate the ground state energy E0 for 200 < λ < 20000 and then fit your results to a function of the form λ1/3 (a + bλ−2/3 + cλ−4/3 ). What is the accuracy in the calculation of the coefficients a, b and c and how good is the agreement with equation (9.31)? 9.5. PROBLEMS 399 9.10 Modify the code in the file anharmonic.f90 so that it calculates the expectation values ⟨x2 ⟩n (N, λ), ⟨p2 ⟩n (N, λ) and the corresponding products ∆x · ∆p. (Hint: See the file anharmonicOBS.f90.) 9.11 Reproduce the results shown in figure 9.4. Repeat your calculation for λ = 2.0, 10.0, 100.0. Repeat your calculations for n = 20. 9.12 Reproduce the results shown in figure 9.5. Repeat your calculations for n = 20. 9.13 Reproduce the results shown in figure 9.6. Repeat your calculation for n = 3, 7, 12, 18, 24. 9.14 Write a program that calculates the energy levels of the anharmonic oscillator 1 1 H(λ, µ) = p2 + x2 + λx4 + µx6 . (9.41) 2 2 Calculate En (λ) for n = 0, 3, 8, 20, λ = 0.2 and µ = 0.2, 0.5, 1.0, 2.0, 10.0. 9.15 Modify the program of the previous problem so that it calculates the expectation values ⟨x2 ⟩n (N, λ), ⟨p2 ⟩n (N, λ) and the products ∆x · ∆p. Calculate the expectation values ⟨x2 ⟩n (λ), ⟨p2 ⟩n (λ) and ∆x · ∆p for n = 0, 3, 8, 20, λ = 0.2 and µ = 0.2, 0.5, 1.0, 2.0, 10.0. 9.16 Use the program doublewell.f90 in order to calculate the energy level pairs En , En+1 for n = 0, 4, 20 and λ = 0.2, 0.1, 0.05, 0.02. Cal- culate the difference ∆n = En+1 − En and comment on your results. 9.17 Define the energy values ( ) 1 1 ϵn = − + n + . 4λ 2 Compare the results for En , En+1 of the previous problem with ϵn − ∆n /2 and ϵn + ∆n /2 respectively. Explain your results. 9.18 Modify the program doublewell.f90, so that it calculates the ex- pectation values ⟨x⟩± (λ) given by equation √ (9.40). Compare ⟨x⟩± (λ) with the classical values x0 = ±1/ λ for λ = 0.2, 0.1, 0.05, 0.02, 0.01. √ 9.19 Repeat the previous problem when the states |±⟩ = (1/ 2)( |n⟩λ ± |n + 1⟩λ ) for n = 6 and n = 30. 400 CHAPTER 9. THE ANHARMONIC OSCILLATOR 9.20 For the simple harmonic oscillator, the energy levels are equidis- tant, i.e. ∆n = En+1 − En = 1, (∆n+2 − ∆n )/∆n = 0. Calculate these quantities for the anharmonic oscillator and the double well poten- tial for λ = 1, 10, 100, 1000 and n = 0, 8, 20. What do you conclude from your results? Chapter 10 Time Independent Schrödinger Equation In this chapter, we will study the time independent Schrödinger equation for a non relativistic particle of mass m, without spin, moving in one dimension, in a static potential V (x). We will only study bound states. The solutions in this case yield the discrete energy spectrum {En } as well as the corresponding eigenstates of the Hamiltonian {ψn (x)} in position representation. From a numerical analysis point of view, the problem consists of solving for the eigensystem of a differential equation with boundary con- ditions. Part of the solution is the energy eigenvalue which also needs to be determined. As an exercise, we will use two different methods, one that can be applied to a particle in an infinite well with V (x) = V (−x), and one that can be applied to more general cases. The first method is introduced only for educational purposes and the reader may skip section 10.2 to go directly to section 10.3. 10.1 Introduction The wave functions ψ(x), which are the position representation of the energy eigenstates, satisfy the Schrödinger equation ℏ2 ∂ 2 ψ(x) − + V (x)ψ(x) = Eψ(x) , (10.1) 2m ∂x2 401 402 CHAPTER 10. SCHRÖDINGER EQUATION with the normalization condition ∫ +∞ ⟨ψ|ψ⟩ = ψ ∗ (x)ψ(x) dx = 1 . (10.2) −∞ The Hamiltonian operator is given in position representation by ℏ2 ∂ 2 Ĥ = − + V (x̂) , (10.3) 2m ∂x2 and it is Hermitian, i.e. Ĥ † = Ĥ. Equation (10.1) is an eigenvalue problem Ĥψ(x) = Eψ(x) , (10.4) which, for bound states, has as solutions a discrete set of real functions ψn∗ (x) = ψn (x) such that Ĥψn (x) = En ψn (x). The numbers E0 ≤ E1 ≤ E2 ≤ . . . are real and they are the (bound) energy spectrum of the particle in the potential¹ V (x). The minimum energy E0 is called the ground state energy and the corresponding ground state is given by a non trivial function ψ0 (x). According to the Heisenberg uncertainty principle, in this state the uncertainties in momentum ∆p > 0 and position ∆x > 0 so that ∆p · ∆x ≥ ℏ/2. The eigenstates ψn (x) form an orthonormal basis ∫ +∞ ⟨ψn |ψm ⟩ = ψn∗ (x)ψm (x) dx = δn,m . (10.5) ∞ so that any (square integrable) wave function ϕ(x) which represents the state |ϕ⟩ is given by the linear combination ∑ ∞ ϕ(x) = cn ψn (x) . (10.6) n=0 ∫ +∞ The amplitudes cn = ⟨ψn |ϕ⟩ = −∞ ψn∗ (x)ϕ(x) dx are complex numbers that give the probability pn = |cn |2 to measure energy En in the state |ϕ⟩. For any state |ϕ⟩ the function pϕ (x) = |ϕ(x)|2 = ϕ∗ (x)ϕ(x) (10.7) ¹The fact that the energy spectrum of the particle is bounded from below depends on the form of the potential. We assume that V (x) is such that E0 is finite. Also, in one dimension, the energy spectrum of a particle for reasonable potentials is non degenerate (see, however, S. Kar, R. Parwani, arXiv:0706.1135.) 10.1. INTRODUCTION 403 is the probability density of finding the particle at position x, i.e. the probability of detecting the particle in the interval [x1 , x2 ] is given by ∫ x2 ∫ x2 Pϕ (x1 < x < x2 ) = pϕ (x) dx = ϕ∗ (x)ϕ(x) dx . (10.8) x1 x1 The normalization condition (10.2) reflects the conservation of probabil- ity (independent of time, respected by the time dependent Schrödinger equation) and the completeness (in this case the certainty that the particle will be observed somewhere on the x axis). The classical observables A(x, p) of this quantum mechanical system are functions of the position and the momentum and their quantum mechanical versions are given by operators Â(x̂, p̂). Their expectation values when the system in a state |ϕ⟩ are given by ∫ +∞ ⟨Â⟩ϕ = ⟨ϕ| Â |ϕ⟩ = ϕ∗ (x)Â(x̂, p̂)ϕ(x) dx . (10.9) −∞ From a numerical point of view, the eigenvalue problem (10.1) re- quires the solution of an ordinary second order differential equation. There are certain differences in this problem compared to the ones stud- ied in previous sections: • Instead of an initial value problem (i.e. the values of the function and its derivative are given at one point), we have a boundary value problem (values of the function or its derivative given at two different points). • The eigenvalue (energy) is unknown and should be determined as part of the solution. As an introduction to such classes of problems, we will present some simple methods which are special to one dimension. For the numerical solution of the above equation we renormalize x, the function ψ(x) and the parameters so that we deal only with dimensionless quantities. Equation (10.1) is rewritten as: d2 2m ψ(x) + 2 (E − V (x))ψ(x) = 0 . (10.10) dx 2 ℏ Then we choose a length scale L which is defined by the parameters of the problem² and we redefine x̃ = x/L. We define ψ̃(x̃) = ψ(x) ψ̃ ′ (x̃) = ²There are m, ℏ and the coupling constants in the function V (x). The range of the potential will determine L in some problems and it is given explicitly in potential wells. In potentials of real physical systems, however, this is also determined by the coupling constants. 404 CHAPTER 10. SCHRÖDINGER EQUATION dψ(x)/dx̃ = L dψ(x)/dx and we obtain ′′ 2mL2 ψ̃ (x̃) + (E − V (x̃L))ψ̃(x̃) = 0 . (10.11) ℏ2 We define v(x̃) = 2mL2 V (x)/ℏ2 = 2mL2 V (x̃L)/ℏ2 , ϵ = 2mL2 E/ℏ2 and change notation to x̃ → x, ψ̃ → ψ. We obtain ψ ′′ (x) = −(ϵ − v(x))ψ(x) . (10.12) The solutions of equation (10.1) can be obtained from those of equation (10.12) by using the following “dictionary”³: x ℏ2 ℏ2 x→ , E= ϵ , V (x) = v(x/L) . (10.13) L 2mL2 2mL2 The dimensionless momentum is defined as p̃ = −i∂/∂ x̃ = −iL∂/∂x and we obtain L p̃ = p . (10.14) ℏ The commutation relation [x, p] = iℏ becomes [x̃, p̃] = i. The kinetic p2 energy T = is given by 2m ℏ2 2 ℏ2 ∂ 2 T = p̃ = − , (10.15) 2mL2 2mL2 ∂ x̃2 and the Hamiltonian H = T + V ( ) ℏ2 ( 2 ) ℏ2 ∂2 H= p̃ + v(x̃) = − 2 + v(x̃) . (10.16) 2mL2 2mL2 ∂ x̃ In what follows, we will omit the tilde above the symbols and write x instead of x̃. 10.2 The Infinite Potential Well The simplest model for studying the qualitative features of bound states is the infinite potential well of width L where a particle is confined within the interval [−L/2, L/2]: { 0 |x| < 1 v(x) = (10.17) +∞ |x| ≥ 1 ³If we normalize the solutions ψ̃(x̃) of equation (10.12) according to the relation ∫ +∞ ∗ √ −∞ ψ̃ (x̃)ψ̃(x̃)dx̃ = 1, we should also take ψ(x) = (1/ L)ψ̃(x/L) in order to be prop- ∫ +∞ erly normalized −∞ ψ ∗ (x)ψ(x)dx = 1. 10.2. THE INFINITE POTENTIAL WELL 405 v v v v0 v0 −1 +1 −1 +1 −1 −a +a +1 x Figure 10.1: The potentials given by equations (10.17), (10.26) and (10.27). The length scale chosen here is L/2 and the dimensionless variable x corresponds to x/(L/2) when x is measured in length units. The solution of (10.12) can be easily computed. Due to the symmetry v(−x) = v(x) , (10.18) of the potential, the solutions have well defined parity. This property will be crucial to the method used below. The method discussed in the next section can also be used on non even potentials. The solutions are divided into two categories, one with even parity (+) (+) ψn (x) ≡ ψn (−x) = ψn (x) for n = 1, 3, 5, 7, . . . and one with odd parity (−) (−) ψn (x) ≡ −ψn (−x) = ψn (x) for n = 2, 4, 6, 8, . . .. { (+) ψn (x) = cos ( nπ 2 x) |x| < 1 n = 1, 3, 5, 7, . . . ψn (x) = (−) (10.19) ψn (x) = sin ( 2 x) |x| < 1 n = 2, 4, 6, 8, . . . nπ where ( nπ )2 ϵn = , (10.20) 2 ∫1 and the normalization has been chosen so that⁴ −1 (ψn (x))2 dx = 1. ⁴According to the dictionary mentioned in the previous section, for a potential well where x ∈ [−L/2, L/2] the dimensionless position variable has been chosen to be ℏ2 ℏ2 π 2 2 (+) √ x/(L/2) ∈ [−1, 1]. Then En = 2m(L/2)2 ϵn = 2mL2 n and ψn (x) = 2/L cos (nπx/L), (−) √ ψn (x) = 2/L sin (nπx/L). Note that ϵn = p2n according to equations (10.13) and (10.14). 406 CHAPTER 10. SCHRÖDINGER EQUATION The solutions can be found by using the parity of the wave functions. We note that for the positive parity solutions ψn(+) (0) = A ψn(+) ′ (0) = 0 , (10.21) whereas for the negative parity solutions ψn(−) (0) = 0 ψn(−) ′ (0) = A . (10.22) The constant A depends on the normalization of the wave function. Therefore we can set A = 1 originally and then renormalize the wave function so that equation (10.2) is satisfied. If the energy is known, the relations (10.21) and (10.22) can be taken as initial conditions in relation (10.12). By using a Runge–Kutta algorithm we can evolve the solution towards x = ±1. The problem is that the energy ϵ is unknown. If the en- ergy is not allowed by the quantum theory we will find that the boundary conditions ψn(±) (±1) = 0 (10.23) are violated. As we approach the correct value of the energy, we obtain (±) ψn (±1) → 0. 1 1 i= 0 i= 0 i= 1 i= 5 i= 2 i= 10 i= 3 i= 20 0.8 i= 5 0.01 i= 29 i= 12 0.6 0.0001 |ψi(x)-ψn=0(x)| ψi(x) 0.4 1e-06 0.2 1e-08 0 1e-10 -0.2 1e-12 0 0.2 0.4 0.6 0.8 1 0 0.2 0.4 0.6 0.8 1 x x Figure 10.2: Convergence of the solution ψi (x) of (10.12) with the potential (10.17) as a function of the number of iterations i in the program well.f90. Initially energy = 2.0 and parity = 1. After 29 iterations the solution converges to the ground state ψ1 (x) = cos (πx/2) with energy ϵ = (π/2)2 and with relative accuracy ∼ 10−9 . The bottom plot shows the error as a function of the number of iterations in a logarithmic scale. For i ≡iter = 1,2,3,5,10,12,20 we obtain energy = 2.4, 2.6, 2.4, 2.4625, 2.46875, 2.4673828125. Therefore we follow the steps described below: • We choose an initial value for the energy ϵ that is lower than the one we are looking for. We can use estimates from known solutions of 10.2. THE INFINITE POTENTIAL WELL 407 similar looking potential wells or simply start from a value slightly higher than the absolute minimum of the potential. • We choose the parity of the solution and we set initial conditions according to equations (10.21) and (10.22). • We evolve the solutions using a 4th order Runge-Kutta method from ⁵ x = 0 to x = +1. • If equation (10.23) is not satisfied, we increase the energy by δϵ and we repeat. (±) • We repeat until ψn (1) changes sign. Then we lower the energy by δϵ = −δϵ/2. (±) • The process is ended when |ψn (1)| < δ for appropriately chosen small δ. For the evolution of the solution from x = 0 to x = 1 we use the 4th order Runge-Kutta method programmed in the file rk.f90 of chapter 4. We copy the subroutine RKSTEP in a local file rk.f90. The integration of (10.12) can by done by using the function ϕ(x) ≡ ψ ′ (x) ψ ′ (x) = ϕ(x) ϕ′ (x) = (v(x) − ϵ)ψ(x) , (10.24) with the initial conditions ψ(0) = 1 , ϕ(0) ≡ ψ ′ (0) = 0 even parity ψ(0) = 0 , ϕ(0) ≡ ψ ′ (0) = 1 odd parity . (10.25) We use the notation ψ(x) → psi, ϕ(x) → psip. The functions f1 and f2 correspond to the right hand side of (10.24). They are the derivatives of ψ(x) and ϕ(x) respectively and f1=psip, f2=(V-energy)*psi. The code of f1 and f2 is put in a different file so that we can easily reuse the code for many different potentials v(x). The file wellInfSq.f90 contains the necessary program for the potential of equation (10.17): ! =========================================================== ! f i l e : wellInfSq . f ! ! Functions used i n RKSTEP r o u t i n e . Here : ⁵The function in [−1, 0) is determined by the parity of the solution. 408 CHAPTER 10. SCHRÖDINGER EQUATION ! f1 = psip ( x ) = psi ( x ) ’ ! f 2 = p s i p ( x ) ’= p s i ( x ) ’ ’ ! ! A l l one has t o s e t i s V , t h e p o t e n t i a l ! =========================================================== !−−−−−−−− t r i v i a l f u n c t i o n : d e r i v a t i v e o f p s i r e a l ( 8 ) f u n c t i o n f1 ( x , psi , psip ) r e a l ( 8 ) : : x , psi , psip f1=psip end f u n c t i o n f1 ! =========================================================== !−−−−−−−− t h e second d e r i v a t i v e o f wavefunction : ! p s i p ( x ) ’ = p s i ( x ) ’ ’ = −(E−V) p s i ( x ) r e a l ( 8 ) f u n c t i o n f2 ( x , psi , psip ) i m p l i c i t none r e a l ( 8 ) : : x , psi , psip , energy , V common / params / energy !−−−−−−− p o t e n t i a l , s e t here : V = 0.0 D0 !−−−−−−− S c h r o e d i n g e r eq : RHS f2 = ( V−energy ) * psi end f u n c t i o n f2 ! =========================================================== We stress that the energy ϵ = energy is put in a common block so that it can be accessed by the main program. The main program is in the file well.f90. The user enters the pa- rameters (energy, parity, Nx) and the loop do while ( iter . l t . 10000) ............ i f ( DABS ( psinew ) . l e . e p s i l o n ) EXIT i f ( psinew * psiold . l t . 0.0 D0 ) de = −0.5D0 * de energy = energy + de ............ enddo ! do while exits when ψ(1) =psinew has an absolute value which is less than epsilon, i.e. when the condition (10.23) is satisfied to the desired accuracy. The value of the energy increases up to the point where the sign of the wave function at x = 1 changes (psinew*psiold< 0). Then the value of the energy is overestimated and we change the sign of the step de and re- duce its magnitude by a half. The algorithm described on page 406 is implemented inside the loop. After exiting the loop, the energy has been determined with the desired accuracy and the rest of the program stores the solution in the array psifinal(STEPS). The results are written to the 10.2. THE INFINITE POTENTIAL WELL 409 file psi.dat. Note how the variable parity is used so that both cases parity= ±1 can be studied. The full program is listed below: ! =========================================================== ! f i l e : well . f ! ! Computation o f energy e i g e n v a l u e s and e i g e n f u n c t i o n s ! o f a p a r t i c l e i n an i n f i n i t e w e l l with V(−x )=V( x ) ! ! Input : energy : i n i t i a l guess f o r energy ! p a r i t y : d e s i r e d p a r i t y o f s o l u t i o n (+/ − 1 ) ! Nx−1 : Number o f RK4 s t e p s from x=0 t o x=1 ! Output : energy : energy e i g e n v a l u e ! p s i . dat : f i n a l p s i ( x ) ! a l l . dat : a l l p s i ( x ) f o r t r i a l e n e r g i e s ! =========================================================== program even_potential_well i m p l i c i t none i n t e g e r , parameter : : P=10000 r e a l ( 8 ) : : energy , dx , x , e p s i l o n , de common / params / energy i n t e g e r : : parity , Nx , iter , i r e a l ( 8 ) : : psi , psip , psinew , psiold r e a l ( 8 ) : : psifinal(−P : P ) , xstep(−P : P ) !−−−−−− Input : p r i n t * , ’ Enter energy , p a r i t y , Nx : ’ read * , energy , parity , Nx i f ( Nx . g t . P ) s t o p ’Nx > P ’ i f ( parity . g t . 0) then parity = 1 else parity = −1 endif p r i n t * , ’ # ####################################### ’ p r i n t * , ’ # E s t a r t = ’ , energy , ’ p a r i t y = ’ , parity dx = 1 . 0 D0 / ( Nx −1) e p s i l o n = 1 . 0 D−6 p r i n t * , ’ # Nx= ’ , Nx , ’ dx = ’ , dx , ’ eps= ’ , e p s i l o n p r i n t * , ’ # ####################################### ’ !−−−−− C a l c u l a t e : open ( u n i t =11 , f i l e = ’ a l l . dat ’ ) iter = 0 psiold = 0.0 D0 ! c a l c u l a t e d v a l u e s o f p s i a t x=1 psinew = 1 . 0 D0 de = 0 . 1 D0 * DABS ( energy ) ! o r i g i n a l change i n energy do while ( iter . l t . 10000) !−−−−−−−−−− I n i t i a l c o n d i t i o n s a t x=0 410 CHAPTER 10. SCHRÖDINGER EQUATION x = 0.0 D0 i f ( parity . eq . 1 ) then psi = 1 . 0 D0 psip = 0.0 D0 else psi = 0.0 D0 psip = 1 . 0 D0 endif w r i t e ( 1 1 , * ) iter , energy , x , psi , psip ! −−−−−−−−− Use Runge−Kutta t o forward t o x=1 do i =2 , Nx x = ( i−2) * dx c a l l RKSTEP ( x , psi , psip , dx ) w r i t e ( 1 1 , * ) iter , energy , x , psi , psip enddo ! do i =2 ,Nx psinew = psi p r i n t * , iter , energy , de , psinew ! −−−−−−−−− Stop i f v a l u e o f p s i c l o s e t o 0 i f ( DABS ( psinew ) . l e . e p s i l o n ) EXIT ! −−−−−−−−− Change d i r e c t i o n o f energy s e a r c h : i f ( psinew * psiold . l t . 0.0 D0 ) de = −0.5D0 * de energy = energy + de psiold = psinew iter = iter + 1 enddo ! do while close (11) !We found t h e s o l u t i o n : c a l c u l a t e i t once aga in and s t o r e i t i f ( parity . eq . 1 ) then psi = 1 . 0 D0 psip = 0.0 D0 node = 0 ! count number o f nodes o f f u n c t i o n else psi = 0.0 D0 psip = 1 . 0 D0 node = 1 endif x = 0.0 D0 xstep (0) = x psifinal ( 0 ) = psi ! a r r a y t h a t s t o r e s p s i ( x ) psiold = 0.0 D0 !−−−−−−− Use Runge−Kutta t o move t o x=1 do i =2 , Nx x = ( i−2) * dx c a l l RKSTEP ( x , psi , psip , dx ) xstep ( i−1) = x psifinal ( i−1) = psi ! −−−−−− Use p a r i t y t o compute p s i (−x ) xstep (1−i ) = −x psifinal(1−i ) = parity * psi 10.2. THE INFINITE POTENTIAL WELL 411 !−−−−−−− P r i n t f i n a l s o l u t i o n : open ( u n i t =11 , f i l e = ’ p s i . dat ’ ) p r i n t * , ’ F i n a l r e s u l t : E= ’ , energy , ’ n= ’ , node ,& ’ p a r i t y = ’ , parity w r i t e ( 1 1 , * ) ’ # E= ’ , energy , ’ n= ’ , node ,& ’ p a r i t y = ’ , parity do i=−(Nx −1) , ( Nx −1) w r i t e ( 1 1 , * ) xstep ( i ) , psifinal ( i ) enddo close (11) end program even_potential_well The compilation and running of the program can be done with the com- mands > gfortran well . f90 wellInfSq . f90 rk . f90 −o well > . / well Enter energy , parity , Nx : 2.0 1 400 # ####################################### # Estart= 2.0000000000000000 parity= 1 # Nx= 400 dx = 2.50626566416E−003 eps= 9.9999999999E−007 # ####################################### 0 2.0000000000000 0.200000000000 0.15594369476721 1 2.2000000000000 0.200000000000 8.74448016806986E−2 ............................................ 28 2.4674072265624 1.220703125000E−5 −1.95005436858826E−6 29 2.4674011230468 −6.103515625000E−6 −7.24621589476086E−9 Final result : E= 2.4674011230468746 parity= 1 The energy is determined to be ϵ =2.467401123 which can be compared to the exact value ϵ = (π/2)2 ≈ 2.467401100. The fractional error is ∼ 10−8 . The convergence can be studied graphically in figure 10.2. The calculation of the excited states is done by changing the parity and by choosing the initial energy slightly higher than the one determined in the previous step⁶. The results are in table 10.1. The agreement with the exact result ϵn = (nπ/2)2 is excellent. We close this section with two more examples. First, we study a potential well with triangular shape at its bottom { v0 |x| |x| < 1 v(x) = (10.26) +∞ |x| > 1 ⁶Careful: if the energy levels are too close, we should keep the initial energy constant and change the sign of parity. 412 CHAPTER 10. SCHRÖDINGER EQUATION n (nπ/2)2 Square Triangular Double Well 1 2.467401100 2.467401123 5.248626709 15.294378662 2 9.869604401 9.869604492 14.760107422 15.350024414 3 22.2066099 22.2066040 27.0690216 59.1908203 4 39.47841 39.47839 44.51092 59.96887 5 61.6850275 61.6850242 66.6384315 111.3247375 6 88.82643 88.82661 93.84588 126.37628 7 120.902653 120.902664 125.878830 150.745215 8 157.91367 157.91382 162.92569 194.07578 9 199.859489 199.859490 204.845026 235.017471 10 246.74011 246.74060 251.74813 275.67383 11 298.555533 298.555554 303.545814 331.428306 12 355.3057 355.3064 360.3107 388.7444 Table 10.1: Energy eigenvalues for the square, triangular and double well potentials (equations (10.17), (10.26) with v0 = 10 and equation (10.27) with v0 = 100, a = 0.3). The agreement of the results for the square potential with the exact ones is excellent. For the other potentials, we note that as we move further from the bottom of the well we obtain energy levels very close to those of the square well: The particle does not feel the influence of the details at the bottom of the well. For the double well potential we obtain E1 ≈ E2 and E3 ≈ E4 according to the analysis on page 413. 10.2. THE INFINITE POTENTIAL WELL 413 and then a double well potential with v0 |x| < a v(x) = 0 a < |x| < 1 (10.27) +∞ 1 < |x| where the parameters v0 , a are positive numbers. A qualitative plot of these functions is shown in figure 10.1. For the triangular potential we take v0 = 10, whereas for the double well potential v0 = 100 and a = 0.3. The code in wellInfSq.f90 is appro- priately modified and saved in the files wellInfTr.f90 and wellInfDbl.f90 respectively. All we have to do is to change the line computing the value of the potential in the function f2. For example the file wellInfTr.f90 contains the code !−−−−−−− p o t e n t i a l , s e t here : V = 10.0 D0 * DABS ( x ) whereas the file wellInfDbl.f90 contains the code !−−−−−−− p o t e n t i a l , s e t here : i f ( DABS ( x ) . l e . 0.3 D0 ) then V = 100.0 D0 else V = 0.0 D0 endif The analysis is performed in exactly the same way and the results are shown in table 10.1. Note that, for large enough n, the energy levels of all the potentials that we studied above tend to have identical values. This happens because, when the particle has energy much larger than v0 , the details of the potential at the bottom do not influence its dynamical properties very much. For the triangular potential, the energy levels have higher values than the corresponding ones of the square potential. This happens because, on the average, the potential energy is higher and the potential tends to confine the particle to a smaller region (∆x is decreased, therefore ∆p is increased). This can be seen in figure 10.3 where the wave functions of the particle in each of the two potentials are compared. Similar observations can be made for the double well potential. More- over, we note the approximately degenerate energy levels, something which is expected for potentials of this form. This can be understood in terms of the localized states given by the wave functions ψ+ (x) = 414 CHAPTER 10. SCHRÖDINGER EQUATION √ √ (1/ 2)(ψ1 (x) + ψ2 (x)) and ψ− (x) = (1/ 2)(ψ1 (x) − ψ2 (x)). The first one represents a state where the particle is localized in the left well and the second one in the right. This is shown in figure 10.4. As v0 → +∞ the two wells decouple and the wave functions ψ± (x) become equal to the en- ergy eigenstate wave functions of two particles in separate infinite square wells of width 1 − a with energy eigenvalues ϵ+,1 = ϵ−,1 = (π/(1 − a))2 . The difference of ϵ1 and ϵ2 from these two values is due to the finite v0 (see problem 4). 1.2 1.5 Square Square Triangle Triangle 1 1 0.8 0.5 0.6 ψ1(x) ψ2(x) 0 0.4 -0.5 0.2 -1 0 -0.2 -1.5 -1 -0.5 0 0.5 1 -1 -0.5 0 0.5 1 x x 1 1.5 Square Square Triangle Triangle 1 0.5 0.5 0 ψ3(x) ψ4(x) 0 -0.5 -0.5 -1 -1 -1.5 -1.5 -1 -0.5 0 0.5 1 -1 -0.5 0 0.5 1 x x 1.5 1.5 Square Square Triangle Triangle 1 1 0.5 0.5 ψ12(x) ψ8(x) 0 0 -0.5 -0.5 -1 -1 -1.5 -1.5 -1 -0.5 0 0.5 1 -1 -0.5 0 0.5 1 x x Figure 10.3: The wave functions of the energy eigenstates of the infinite square and triangular well potentials for n = 1, 2, 3, 4, 8, 12 given by equations (10.17) and (10.26) with v0 = 10. We observe the influence of the shape of the potential on the wave functions with small n, while for n ≥ 8 the influence becomes weaker. We will now discuss the limitations of this method. First, the method can be used only on potential wells that are even, i.e. v(x) = v(−x). We used this assumption in equations (10.21) and (10.22) giving the initial conditions for states of well defined parity. When the potential is even, the energy eigenstates have definite parity. The other problem can be 10.3. BOUND STATES 415 2 2 ψ+(x) ψ-(x) ψ1(x) ψ1(x) ψ2(x) ψ2(x) 1.5 1.5 1 1 0.5 0.5 0 0 -0.5 -0.5 -1 -1 -1.5 -1.5 -1 -0.5 0 0.5 1 -1 -0.5 0 0.5 1 x x 2 2 ψ+(x) ψ-(x) ψ3(x) ψ3(x) ψ4(x) ψ4(x) 1.5 1.5 1 1 0.5 0.5 0 0 -0.5 -0.5 -1 -1 -1.5 -1.5 -2 -2 -1 -0.5 0 0.5 1 -1 -0.5 0 0.5 1 x x 1.5 1.5 ψ+(x) ψ-(x) ψ5(x) ψ5(x) ψ6(x) ψ6(x) 1 1 0.5 0.5 0 0 -0.5 -0.5 -1 -1 -1.5 -1.5 -1 -0.5 0 0.5 1 -1 -0.5 0 0.5 1 x x √ Figure 10.4: The functions ψ± (x) = (1/ 2)(ψn (x) ± ψn+1 (x)) for n = 1, 3, 5 for the double well potential (equation (10.27) with v0 = 100, a = 0.3) are plotted using bold red lines. We observe that the more degenerate the states, the stronger the localization of the particle to the left or right well. The other plots are those of the energy eigenfunctions for n = 1, 2, 3, 4, 5, 6. understood by solving problem 4: When v(0) ≫ ϵ, the wave function is almost zero around x = 0 and the integration from x = 0 to x = 1 will be dominated by numerical errors. The same is true when the particle has to go through high potential barriers. This method can also we used on potential wells that are not infinite. In that case we can add infinite walls at points that are far enough so that the wave function is practically zero there. Then the influence of this artificial wall will be negligible (see problem 3). 10.3 Bound States A serious problem with the method discussed in the previous section is that it is numerically unstable. You should have already realized that if you tried to solve problem 3. In that problem, when the walls are moved 416 CHAPTER 10. SCHRÖDINGER EQUATION Figure 10.5: Integration of Schrödinger’s equation by the use of the algorithm of section 10.3. The wave functions and their derivatives are given small trial values at xmin and xmax which are in the classically forbidden regions of x. The point xm is calculated from the equation v(xm ) = ϵ. The wave functions are evolved to xm according to (10.24) and we obtain the solutions ψ (+) (x) and ψ (−) (x). We renormalize ψ (−) (x) so that ψ (+) (xm ) = ψ (−) (xm ) and we vary the energy until the derivatives ψ (+)′ (xm ) ≈ ψ (−)′ (xm ). further than |x| = 3, the convergence of the algorithm becomes harder. You can understand this by realizing that in the integration process the solution is evolved from the classically allowed into the classically forbid- den region so that an oscillating solution changes into an exponentially damped one. But as |x| → +∞ there are two solutions, one that is phys- ically acceptable ψ(x) ∼ e−k|x| and one that is diverging ψ(x) ∼ e+k|x| which is not acceptable due to (10.2). Therefore, in order to achieve con- vergence to the physically acceptable solution, the energy has to be finely tuned, especially when we integrate towards large |x|. For this reason it is preferable to integrate from the exponentially damped region towards the oscillating region. The idea is to start integrating from these regions and try to match the solutions and their derivatives at appropriately cho- sen matching points. The matching is achieved at a point xm by trying to determine the value of the energy that sets the ratio ψ (+)′ (xm )/ψ (+) (xm ) − ψ (−)′ (xm )/ψ (−) (xm ) f (ϵ) = (10.28) ψ (+)′ (xm )/ψ (+) (xm ) + ψ (−)′ (xm )/ψ (−) (xm ) 10.3. BOUND STATES 417 equal to zero, within the attainable numerical accuracy. It is desirable to choose a point xm within the classical region (ϵ > v(x)) and usually we pick a turning point ϵ = v(x). By renormalizing ψ (±) (x) we can always set ψ (+) (xm ) = ψ (−) (xm ), therefore f (ϵ) ≪ 1 means that ψ (+)′ (xm ) ≈ ψ (−)′ (xm ). The denominator of (10.28) sets the scale of the desired accuracy⁷ The idea is depicted in figure 10.5. The algorithm is the following: • Choose the integration interval [xmin,xmax]. • Choose the initial conditions ψ (−) (xmin), ψ (−)′ (xmin), ψ (+) (xmax), ψ (+)′ (xmax). This choice depends on the potential v(x). Usually we take xmin and xmax deep enough in the classically forbidden region and choose the values ψ (−) (xmin), ψ (+) (xmax) to be zero or exponentially small (e.g. ∼ e−k|x| , k 2 = v(x)−ϵ). The corresponding values of the derivatives ψ (−)′ (xmin), ψ (+)′ (xmax) are also taken to be small. The arbitrary normalization of ψ(x) allows these initial val- ues to be chosen in a crude way. The relative sign of the derivatives at large |x| (determined e.g. by the parity of the wave function for even potentials) is also taken care by the renormalization of ψ (−) (x) when applying the matching condition. For an infinite well, the points xmin,xmax are the ones where the potential becomes infinite and ψ (−) (xmin) = ψ (+) (xmax) = 0. • Choose the initial value of the energy ϵ and of the energy variation step δϵ. • Calculate xm from the initial value of the energy and the solution of v(x) = ϵ. Choose the solution that is at the left most side⁸. • Evolve the equations (10.24) from xmin to xm and obtain the solu- tions ψ (−) (x),ψ (−)′ (x). • Evolve the equations (10.24) from xmax to xm and obtain the solu- tions ψ (+) (x),ψ (+)′ (x). ( ) • Renormalize ψ (−) (x) → ψ (−) (x) ψ (+) (xm)/ψ (−) (xm) , so that ψ (+) (xm) = ψ (−) (xm). • Compute the ratio f (ϵ) of equation (10.28). ⁷If we are unlucky enough to pick a point where ψ ′ (xm ) = 0, this criterion will fail. ⁸Note that this point changes when we vary ϵ 418 CHAPTER 10. SCHRÖDINGER EQUATION • If |f (ϵ)| < δ for appropriately chosen δ > 0, the calculation ends. The result for the energy eigenvalue and eigenfunction is considered to be determined with adequate accuracy and we may proceed with the analysis of the results. • If f (ϵ) changes sign it means that we have crossed the energy eigen- value. Reverse the direction of search by taking δϵ → −δϵ/2. • Change the energy ϵ → ϵ+δϵ and repeat by going back to the fourth step. When we exit the above loop, the current wave function is a good ap- proximation to the eigenfunction ψn (x) corresponding to the eigenvalue ϵn . We normalize the wave function according to equation (10.2) and we calculate the expectation values according to (10.9). It is also interest- ing to determine the number of nodes⁹ n0 of the wave function which is related to n by n = n0 + 1. Our program needs to implement the Runge–Kutta algorithm. We use the routine RKSTEP (see page 209) which performs a 4th order Runge– Kutta step. Its code is copied to the file rk.f90. The potential v(x) is coded in the function V(x). The boundary condi- tions are programmed in the subroutine boundary(xmin, xmax, psixmin, psipxmin, psixmax, psipxmax) which returns the values of psixmin = ψ (−) (xmin), psipxmin = ψ (−)′ (xmin), psixmax = ψ (+) (xmax), psipxmax = ψ (−)′ (xmax) to the calling program. These routines are put in a separate file for each potential that we want to study. The name of the file is related to the form of the potential, e.g. we choose schInfSq.f90 for the infinite potential well of (10.17). The same file contains the code for the functions f1, f2: ! =========================================================== ! f i l e : schInfSq . f ! ! Functions used i n RKSTEP r o u t i n e . Here : ! f1 = psip ( x ) = psi ( x ) ’ ! f 2 = p s i p ( x ) ’= p s i ( x ) ’ ’ ! ! One has t o s e t : ! 1 . V( x ) , t h e p o t e n t i a l ! 2 . The boundary c o n d i t i o n s f o r p s i , p s i p a t x=xmin and x=xmax ! ⁹The number of points x for which ψ(x) = 0 and xmin < x < xmax. The relation n = n0 + 1 sets ϵ1 to be the ground state for which n0 = 0. 10.3. BOUND STATES 419 ! =========================================================== !−−−−− p o t e n t i a l : real (8) function V(x) i m p l i c i t none real (8) : : x V = 0.0 D0 end f u n c t i o n V !−−−−− boundary c o n d i t i o n s : subroutine & boundary ( xmin , xmax , psixmin , psipxmin , psixmax , psipxmax ) i m p l i c i t none r e a l ( 8 ) : : xmin , xmax , psixmin , psipxmin , psixmax , psipxmax , V ! f o r i n f i n i t e square w e l l we s e t p s i =0 a t boundary ! and p s i p =+/−1 psixmin = 0.0 D0 psipxmin = 1 . 0 D0 psixmax = 0.0 D0 psipxmax = −1.0D0 !−−−−− I n i t i a l v a l u e s a t xmin and xmax end s u b r o u t i n e boundary ! =========================================================== ! =========================================================== !−−−−− t r i v i a l f u n c t i o n : d e r i v a t i v e o f p s i r e a l ( 8 ) f u n c t i o n f1 ( x , psi , psip ) r e a l ( 8 ) : : x , psi , psip f1=psip end f u n c t i o n f1 ! =========================================================== !−−−−− t h e second d e r i v a t i v e o f wavefunction : ! p s i p ( x ) ’ = p s i ( x ) ’ ’ = −(E−V) p s i ( x ) r e a l ( 8 ) f u n c t i o n f2 ( x , psi , psip ) i m p l i c i t none r e a l ( 8 ) : : x , psi , psip , energy , V common / params / energy !−−−−− S c h r o e d i n g e r eq : RHS f2 = ( V ( x )−energy ) * psi end f u n c t i o n f2 ! =========================================================== We note that if the potential becomes infinite for x < xmin and/or x >xmax, then this will be determined by the boundary conditions at xmin and/or xmax. The main program is in the file sch.f90. The code is listed below and it includes the function integrate(psi, dx, Nx) used for the nor- malization of the wave function. It performs a numerical integration of the square of a function whose values psi(i) i=1,...,Nx are given at an odd number of Nx equally spaced points by a distance dx using Simpson’s 420 CHAPTER 10. SCHRÖDINGER EQUATION rule. ! =========================================================== ! ! F i l e : sch . f90 ! ! I n t e g r a t e 1d S c h r o d i n g e r e q u a t i o n from xmin t o xmax . ! Determine energy e i g e n v a l u e and e i g e n f u n c t i o n by matching ! e v o l v i n g s o l u t i o n s from xmin and from xmax a t a p o i n t xm. ! Matching done by e q u a t i n g v a l u e s o f f u n c t i o n s and t h e i r ! d e r i v a t i v e s a t xm. The p o i n t xm chosen a t t h e l e f t most ! t u r n i n g p o i n t o f t h e p o t e n t i a l a t any gi v e n v a l u e o f t h e ! energy . The p o t e n t i a l and boundary c o n d i t i o n s chosen i n ! different file . ! −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ! Input : energy : T r i a l v a l u e o f energy ! de : energy s t e p , i f matching f a i l s de −> e+de , i f ! l o g d e r i v a t i v e changes s i g n de −> −de / 2 ! xmin , xmax , Nx ! −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ! Output : F i n a l v a l u e o f energy , number o f nodes o f ! wavefunction i n s t d o u t ! F i n a l e i g e n f u n c t i o n i n f i l e p s i . dat ! A l l t r i a l f u n c t i o n s and e n e r g i e s i n f i l e a l l . dat ! =========================================================== program schroedinger_equation_1D i m p l i c i t none i n t e g e r , parameter : : P=20001 i n t e g e r : : Nx , NxL , NxR r e a l ( 8 ) : : psi ( P ) , psip ( P ) r e a l ( 8 ) : : dx r e a l ( 8 ) : : xmin , xmax , xm ! l e f t / r i g h t / matching p o i n t s r e a l ( 8 ) : : psixmin , psipxmin , psixmax , psipxmax r e a l ( 8 ) : : psileft , psiright , psistep , psinorm r e a l ( 8 ) : : psipleft , psipright , psipstep r e a l ( 8 ) : : energy , de , e p s i l o n , integrate common / params / energy r e a l ( 8 ) : : matchlogd , matchold , psiold , norm , x i n t e g e r : : iter , i , imatch , nodes real (8) : : V !−−−−−−−−−− Input : p r i n t * , ’ # Enter energy , de , xmin , xmax , Nx ’ read * , energy , de , xmin , xmax , Nx !−−− need even i n t e r v a l s f o r n o r m a l i z a t i o n i n t e g r a t i o n i f ( mod( Nx , 2 ) . eq . 0 ) Nx=Nx+1 i f ( Nx . g t . P ) s t o p ’ F a t a l Error : Nx>P ’ i f ( xmin . ge . xmax ) s t o p ’ Error : xmin >= xmax ’ dx = ( xmax − xmin ) / ( Nx −1) 10.3. BOUND STATES 421 e p s i l o n = 1 . 0 D−6 c a l l boundary ( xmin , xmax , psixmin , psipxmin , psixmax , psipxmax ) p r i n t * , ’ # ####################################### ’ p r i n t * , ’ # E s t a r t = ’ , energy , ’ de= ’ , de p r i n t * , ’ # Nx= ’ , Nx , ’ eps= ’ , e p s i l o n p r i n t * , ’ # xmin= ’ , xmin , ’ xmax= ’ , xmax , ’ dx= ’ , dx p r i n t * , ’ # p s i ( xmin )= ’ , psixmin , ’ p s i p ( xmin )= ’ , psipxmin p r i n t * , ’ # p s i ( xmax )= ’ , psixmax , ’ p s i p ( xmax )= ’ , psipxmax p r i n t * , ’ # ####################################### ’ !−−−−− C a l c u l a t e : open ( u n i t =11 , f i l e = ’ a l l . dat ’ ) matchold = 0.0 d0 do iter =1 ,10000 !−−−−− Determine matching p o i n t a t t u r n i n g p o i n t from t h e l e f t : imatch = −1 do i =1 , Nx x = xmin + ( i−1) * dx i f ( imatch . l t . 0 . and . ( energy−V ( x ) ) . g t . 0.0 D0 ) imatch = i enddo i f ( imatch . l e . 100 . or . imatch . ge . Nx −100) imatch = Nx / 5 xm = xmin + ( imatch −1) * dx NxL = imatch NxR = Nx−imatch+1 !−−−−− Evolve wavefunction from t h e l e f t : psi ( 1 ) = psixmin psip ( 1 ) = psipxmin psistep = psixmin psipstep = psipxmin do i =2 , NxL x = xmin + ( i−2) * dx ! t h i s i s x b e f o r e t h e s t e p c a l l RKSTEP ( x , psistep , psipstep , dx ) psi ( i ) = psistep psip ( i ) = psipstep enddo ! use t h i s t o normalize e i g e n f u n c t i o n t o match a t xm psinorm = psistep psipleft = psipstep !−−−−− Evolve wavefunction from t h e r i g h t : psi ( Nx ) = psixmax psip ( Nx ) = psipxmax psistep = psixmax psipstep = psipxmax do i =2 , NxR x = xmax − ( i−2) * dx c a l l RKSTEP ( x , psistep , psipstep ,−dx ) psi ( Nx−i +1) = psistep psip ( Nx−i +1) = psipstep enddo psinorm = psistep / psinorm 422 CHAPTER 10. SCHRÖDINGER EQUATION psipright = psipstep !−−−−− Renormalize p s i l so t h a t p s i l (xm)= p s i r (xm) do i =1 , NxL−1 psi ( i ) = psinorm * psi ( i ) psip ( i ) = psinorm * psip ( i ) enddo psipleft = psinorm * psipleft !−−−−− p r i n t c u r r e n t s o l u t i o n : do i =1 , Nx x = xmin + ( i−1) * dx w r i t e ( 1 1 , * ) iter , energy , x , psi ( i ) , psip ( i ) enddo !−−−−− matching using d e r i v a t i v e s : ! C a r e f u l : t h i s can f a i l i f p s i ’ (xm) = 0 ! ! ( use a l s o | de | < 1 e−6 ! criterion ) matchlogd = & ( psipright−psipleft ) / ( DABS ( psipright )+DABS ( psipleft ) ) p r i n t * , ’ # i t e r , energy , de , xm, logd : ’ ,& iter , energy , de , xm , matchlogd !−−−−− E x i t c o n d i t i o n : i f ( DABS ( matchlogd ) . l e . e p s i l o n . or . DABS ( de / energy ) . l t . 1 . 0 D−12)& EXIT i f ( matchlogd * matchold . l t . 0.0 D0 ) de = −0.5D0 * de energy = energy + de matchold = matchlogd enddo ! do i t e r =1 ,10000 close (11) !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− !−−−−− S o l u t i o n has been found and now i t i s s t o r e d : norm = integrate ( psi , dx , Nx ) norm = 1 . 0 D0 / s q r t ( norm ) do i =1 , Nx psi ( i ) = norm * psi ( i ) enddo !−−−−− Cound number o f z e r o e s , add one and g e t energy l e v e l : nodes = 1 psiold = psi ( 1 ) do i =2 , Nx−1 ! should be 0 w i t h i n e p s i l o n i f ( DABS ( psi ( i ) ) . g t . e p s i l o n ) then i f ( psiold * psi ( i ) . l t . 0 . 0 D0 ) nodes = nodes+1 psiold = psi ( i ) endif enddo ! i =2 ,Nx−1 !−−−−−−− P r i n t f i n a l s o l u t i o n : open ( u n i t =11 , f i l e = ’ p s i . dat ’ ) p r i n t * , ’ F i n a l r e s u l t : E= ’ , energy , ’ n= ’ , nodes ,& ’ norm = ’ , norm i f ( DABS ( matchlogd ) . g t . e p s i l o n ) p r i n t *& 10.3. BOUND STATES 423 , ’ F i n a l r e s u l t : SOS : logd > e p s i l o n . logd= ’ , matchlogd w r i t e ( 1 1 , * ) ’ # E= ’ , energy , ’ n= ’ , nodes ,& ’ norm = ’ , norm do i =1 , Nx x = xmin + ( i−1) * dx w r i t e ( 1 1 , * ) x , psi ( i ) enddo close (11) end program schroedinger_equation_1D ! =========================================================== ! Simpson ’ s r u l e t o i n t e g r a t e p s i ( x ) * p s i ( x ) f o r proper ! n o r m a l i z a t i o n . For n i n t e r v a l s o f width dx ( n even ) ! Simpson ’ s r u l e i s : ! i n t ( f ( x ) dx ) = ! ( dx / 3 ) * ( f ( x_0 ) +4 f ( x_1 ) +2 f ( x_2 ) + . . . + 4 f ( x_ {n−1})+ f ( x_n ) ) ! ! Input : D i s c r e t e v a l u e s o f f u n c t i o n p s i (Nx) ! I n t e g r a t i o n s t e p dx ! Returns : I n t e g r a l ( p s i ( x ) p s i ( x ) dx ) ! =========================================================== r e a l ( 8 ) f u n c t i o n integrate ( psi , dx , Nx ) i m p l i c i t none i n t e g e r : : Nx !−−−−−−−−−−−−− Note : we need P due t o geometry o f a r r a y r e a l ( 8 ) : : psi ( Nx ) , dx !−−−−−−−−−−−−− real (8) : : int integer : : i !−−−−− z e r o t h order p o i n t : i = 1 i n t = psi ( i ) * psi ( i ) !−−−−− odd order p o i n t s ( i =k+1 i s even ) : do i =2 , Nx −1 ,2 i n t = i n t + 4.0 D0 * psi ( i ) * psi ( i ) enddo !−−−−− even order p o i n t s : do i =3 , Nx −2,2 i n t = i n t + 2.0 D0 * psi ( i ) * psi ( i ) enddo !−−−−− l a s t p o i n t : i = Nx i n t = i n t + psi ( i ) * psi ( i ) !−−−−− measure n o r m a l i z a t i o n : i n t = i n t * dx / 3 . 0 D0 !−−−−− f i n a l r e s u l t : integrate = i n t end f u n c t i o n integrate ! =========================================================== 424 CHAPTER 10. SCHRÖDINGER EQUATION The reproduction of the results of the previous section for the infinite potential well is left as an exercise. The compilation and running of the program can be done with the commands: > g f o r t r a n sch . f90 schInfSq . f90 rk . f90 −o s > ./s # Enter energy , de , xmin , xmax , Nx 1 0.5 −1 1 2000 # ####################################### # Estart= 1.000 de= 0.5 # Nx= 2001 eps= 1 . 0E−006 # xmin= −1.000 xmax= 1.000 dx= 1.000E−003 # p s i ( xmin )= 0.000 p s i p ( xmin )= 1.000 # p s i ( xmax )= 0.000 p s i p ( xmax )= −1.000 # ####################################### # i t e r , energy , de , xm, logd : 1 1.0000 0.500 −0.601 −0.9748 # i t e r , energy , de , xm, logd : 2 1.5000 0.500 −0.601 −0.6412 ..... # i t e r , energy , de , xm, logd : 30 2.4674 −3.815E−6 −0.601 −1.0E−6 # i t e r , energy , de , xm, logd : 31 2.4674 1 . 9 0 7E−6 −0.601 2 . 7E−7 Final result : E= 2.467401504516602 n= 1 norm = 1.5707965025 We set xmin= -1, xmax = 1, Nx= 2000 and ϵ = 1, δϵ = 0.5. The energy of the ground state is found to be ϵ1 = 2.4674015045166016. The wave function is stored in the file psi.dat and can be plotted with the gnuplot command gnuplot > p l o t ” p s i . dat ” using 1 : 2 with lines The functions computed during the iterations of the algorithm are stored in the file all.dat. The first column is the iteration number (here we have iter = 0, ... 31) and we can easily filter each one of them with the commands gnuplot > plot ”<awk ’ $1 ==1’ all . dat ” using 3:4 w l t ” i t e r =1” gnuplot > replot ”<awk ’ $1 ==2’ all . dat ” using 3:4 w l t ” i t e r =2” gnuplot > replot ”<awk ’ $1 ==3’ all . dat ” using 3:4 w l t ” i t e r =3” gnuplot > replot ”<awk ’ $1 ==4’ all . dat ” using 3:4 w l t ” i t e r =4” ..... which reproduce figure 10.6. 10.4. MEASUREMENTS 425 1 iter=1 0.9 iter=2 iter=3 0.8 iter=4 0.7 0.6 ψ(x) 0.5 0.4 0.3 0.2 0.1 0 -1 -0.5 0 0.5 1 x Figure 10.6: The convergence of the solutions to the solution of Schrödinger’s equa- tion for the ground state of the infinite potential well according to the discussion on page 424. 10.4 Measurements The action of an operator Â(x̂, p̂) on a state |ψ⟩ can be easily calculated in the position representation by its action on the corresponding wave function ψ(x). The action of the operators ∂ x̂ψ(x) = xψ(x) p̂ψ(x) = −i ψ(x) (10.29) ∂x yield¹⁰ ∂ Â(x̂, p̂)ψ(x) = A(x, −i )ψ(x) . (10.30) ∂x Using equation (10.9) we can calculate the expectation value ⟨A⟩ of the operator A when the system is at the state |ψ⟩. Interesting examples are the observables “position” x, “position squared” x2 , “momentum” p, “momentum squared” p2 , “kinetic energy” T , “potential energy” V , “energy” or “Hamiltonian” H = T + V whose expectation values are ¹⁰We do not consider ordering problems of operators formed by products of non commuting operators, e.g. xp2 . 426 CHAPTER 10. SCHRÖDINGER EQUATION given by the relations ∫ +∞ ⟨x⟩ = ψ ∗ (x) x ψ(x) dx −∞ ∫ +∞ ⟨x2 ⟩ = ψ ∗ (x) x2 ψ(x) dx −∞ ∫ +∞ ( ) ∗ ∂ ⟨p⟩ = ψ (x) −i ψ(x) dx −∞ ∂x ∫ +∞ ( ) ∗ ∂2 ⟨p2 ⟩ = ψ (x) − 2 ψ(x) dx −∞ ∂x ∫ +∞ ( ) ℏ 2 ∗ ∂2 ⟨T ⟩ = ψ (x) − 2 ψ(x) dx 2mL2 −∞ ∂x ∫ +∞ ℏ 2 ⟨V ⟩ = ψ ∗ (x) v(x) ψ(x) dx 2mL2 −∞ ∫ +∞ ( ) ℏ2 ∗ ∂2 ⟨H⟩ = ψ (x) − 2 + v(x) ψ(x) dx . (10.31) 2mL2 −∞ ∂x We remind the reader that we used the dimensionless x, p as well as equations (10.15) and (10.16). Especially interesting are the “uncertain- ties” ∆x2 = ⟨x2 ⟩ − ⟨x⟩2 , ∆p2 = ⟨p2 ⟩ − ⟨p⟩2 that satisfy the inequality (“Heisenberg’s uncertainty relation”) 1 ∆x · ∆p ≥ . (10.32) 2 In the previous section we described how to calculate numerically the eigenfunctions of the Hamiltonian. If Ĥψ(x) = Eψ(x), we obtain that ⟨H⟩ = (1/2mL2 )ϵ. Other operators need a numerical approximation for the calculation of their expectation values. If the values of the wave function are given at N equally spaced points x1 , x2 , . . . , xN , then we obtain ∂ψ(xi ) ψ(xi+1 ) − ψ(xi−1 ) ≈ (10.33) ∂x 2h where h = xi+1 − xi and ∂ 2 ψ(xi ) ψ(xi+1 ) − 2ψ(xi ) + ψ(xi−1 ) 2 ≈ . (10.34) ∂x h2 Both equations entail an error of the order of O(h2 ). Special care should be taken at the endpoints of the interval [x1 , xN ]. As a first approach we 10.4. MEASUREMENTS 427 will use the naive approximations¹¹ ∂ψ(x1 ) ψ(x2 ) − ψ(x1 ) ≈ ∂x h ∂ψ(xN ) ψ(xN ) − ψ(xN −1 ) ≈ (10.35) ∂x h and ∂ 2 ψ(x1 ) ψ(x3 ) − 2ψ(x2 ) + ψ(x1 ) 2 ≈ ∂x h2 2 ∂ ψ(xN ) ψ(xN ) − 2ψ(xN −1 ) + ψ(xN −2 ) ≈ . (10.36) ∂x2 h2 The relevant program that calculates ⟨x⟩, ⟨x2 ⟩, ⟨p⟩, ⟨p2 ⟩, ∆x, ∆p can be found in the file observables.f90 and is listed below: ! =========================================================== ! ! F i l e o b s e r v a b l e s . f90 ! Compile : g f o r t r a n o b s e r v a b l e s . f90 −o o ! Usage : . / o < p s i . dat > ! ! Read i n a f i l e with a wavefunction i n t h e format o f p s i . dat : ! # E= <energy > . . . . ! x1 p s i ( x1 ) ! x2 p s i ( x2 ) ! ............ ! ! Outputs e x p e c t a t i o n v a l u e s : ! n o r m a l i z a t i o n Energy <x> <p> <x^2> <p^2> Dx Dp DxDp ! where Dx = s q r t ( < x^2>−<x >^2) Dp = s q r t ( <p^2>−<p>^2) ! DxDp = Dx * Dp ! ! =========================================================== program observables_expectation i m p l i c i t none i n t e g e r , parameter : : P=50000 i n t e g e r Nx , i r e a l ( 8 ) : : xstep ( P ) , psi ( P ) , obs ( P ) r e a l ( 8 ) : : xav , pav , x2av , p2av , Dx , Dp , DxDp , energy , h , norm r e a l ( 8 ) : : integrate ¹¹See the files observables.f90, Derivatives.nb of the accompanying software. There you can find formulas that have errors of O(h2 ). In the examples discussed below, the influence of the O(h) error on the results is approximately at the fourth significant digit. 428 CHAPTER 10. SCHRÖDINGER EQUATION c h a r a c t e r (20) : : psifile , scratch ! t h e f i r s t argument o f t h e command l i n e must be t h e path ! t o t h e f i l e with t h e wavefunction . (GNU f o r t r a n e x t e n s i o n . . . ) i f ( iargc ( ) . ne . 1 ) s t o p ’ Usage : o < f i l e n a m e > ’ c a l l getarg ( 1 , psifile ) ! I f t h e f i l e does not e x i s t , we go t o l a b e l 100 ( s t o p ) : open ( u n i t =11 , f i l e =psifile , s t a t u s = ’OLD’ , e r r =100) p r i n t * , ” # r e a d i n g wavefunction from f i l e : ” , psifile ! we read t h e f i r s t comment l i n e from t h e f i l e : read ( 1 1 , * ) scratch , scratch , energy !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ! Input data : p s i ( x ) Nx = 1 do while ( . TRUE . ) i f ( Nx . ge . P ) s t o p ’Too many p o i n t s ’ read ( 1 1 , * , end =101) xstep ( Nx ) , psi ( Nx ) Nx = Nx+1 enddo ! do while ( . TRUE . ) 101 c o n t i n u e Nx = Nx − 1 i f (mod( Nx , 2 ) . eq . 0) Nx = Nx − 1 h = ( xstep ( Nx )−xstep ( 1 ) ) / ( Nx −1) !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ! Calculate : !−−−−−−−−−− norm : do i =1 , Nx obs ( i ) = psi ( i ) * psi ( i ) enddo norm = integrate ( obs , h , Nx ) !−−−−−−−−−− <x> : do i =1 , Nx obs ( i ) = xstep ( i ) * psi ( i ) * psi ( i ) enddo xav = integrate ( obs , h , Nx ) / norm !−−−−−−−−−− <p > / i : obs ( 1 ) = psi ( 1 ) * ( psi ( 2 )−psi ( 1 ) ) / h do i =2 , Nx−1 obs ( i ) = psi ( i ) * ( psi ( i +1)−psi ( i−1) ) / ( 2 . 0 D0 * h ) enddo obs ( Nx ) = psi ( Nx ) * ( psi ( Nx )−psi ( Nx −1) ) / h pav = −integrate ( obs , h , Nx ) / norm !−−−−−−−−− <x^2> do i =1 , Nx obs ( i ) = xstep ( i ) * xstep ( i ) * psi ( i ) * psi ( i ) enddo x2av = integrate ( obs , h , Nx ) / norm !−−−−−−−− <p^2> obs ( 1 ) = psi ( 1 ) * ( psi ( 3 ) −2.0D0 * psi ( 2 ) +psi ( 1 ) ) / ( h * h ) 10.4. MEASUREMENTS 429 do i =2 , Nx−1 obs ( i ) = psi ( i ) * ( psi ( i +1) −2.0D0 * psi ( i )+psi ( i−1) ) / ( h * h ) enddo obs ( Nx ) = psi ( Nx ) *& ( psi ( Nx ) −2.0D0 * psi ( Nx −1)+psi ( Nx−2) ) / ( h * h ) p2av = −integrate ( obs , h , Nx ) / norm !−−−−−−−− Dx Dx = s q r t ( x2av − xav * xav ) !−−−−−−−− Dp Dp = s q r t ( p2av − pav * pav ) !−−−−−−−− Dx . Dp DxDp = Dx * Dp ! print results : p r i n t * , ’ # norm E <x> <p > / i <x^2> <p^2> Dx Dp DxDp ’ p r i n t ’ (10G25 . 1 7 ) ’ , norm , energy , xav , pav , x2av , p2av , Dx , Dp , DxDp s t o p ! normal e x e c u t i o n ends here . Error messages f o l l o w 100 s t o p ’ Cannot open f i l e ’ end program observables_expectation ! =========================================================== ! ! Simpson ’ s r u l e t o i n t e g r a t e p s i ( x ) . ! For n i n t e r v a l s o f width dx ( n even ) ! Simpson ’ s r u l e i s : ! i n t ( f ( x ) dx ) = ! ( dx / 3 ) * ( f ( x_0 ) +4 f ( x_1 ) +2 f ( x_2 ) + . . . + 4 f ( x_ {n−1})+ f ( x_n ) ) ! ! Input : D i s c r e t e v a l u e s o f f u n c t i o n p s i (Nx) ! I n t e g r a t i o n s t e p dx ! Returns : I n t e g r a l ( p s i ( x ) p s i ( x ) dx ) ! =========================================================== r e a l ( 8 ) f u n c t i o n integrate ( psi , dx , Nx ) i m p l i c i t none i n t e g e r : : Nx r e a l ( 8 ) : : psi ( Nx ) , dx real (8) : : int integer i !−−−−− z e r o t h order p o i n t : i = 1 i n t = psi ( i ) !−−−−− odd order p o i n t s ( i =k+1 i s even ) : do i =2 , Nx −1 ,2 i n t = i n t + 4.0 D0 * psi ( i ) enddo !−−−−− even order p o i n t s : do i =3 , Nx −2,2 i n t = i n t + 2.0 D0 * psi ( i ) enddo !−−−−− l a s t p o i n t : i = Nx 430 CHAPTER 10. SCHRÖDINGER EQUATION i n t = i n t + psi ( i ) !−−−−− measure n o r m a l i z a t i o n : i n t = i n t * dx / 3 . 0 D0 !−−−−− f i n a l r e s u l t : integrate = i n t end f u n c t i o n integrate ! =========================================================== The program needs to read in the wave function at the points x1 , . . . , xNx in the format produced by the program in sch.f90. The first line should have the energy written at the 3rd column, whereas from the 2nd line and on there should be two columns with the (xi , ψ(xi )) pairs. It is not necessary to have the wave function properly normalized, the program will take care of it. If this data is stored in a file psi.dat, then the program can be used by running the commands > g f o r t r a n observables . f90 −o obs > . / obs psi . dat The program prints the normalization constant of ψ(x), the value of the energy¹², ⟨x⟩, ⟨x2 ⟩, ⟨p⟩/i, ⟨p2 ⟩, ∆x, ∆p and ∆x · ∆p to the stdout. Some details about the program: In order to read in the data from the file psi.dat we use the functions iargc(), getarg(n,string). The for- mer returns the number of arguments of the command line and the latter stores the n-th argument to the CHARACTER variable string. Therefore, the statements c h a r a c t e r (20) : : psifile , scratch i f ( iargc ( ) . ne . 1 ) s t o p ’ Usage : o <filename > ’ c a l l getarg ( 1 , psifile ) stop the program if the command line does not have exactly one argument and store the first argument to the variable file. The command open ( u n i t =11 , f i l e =psifile , s t a t u s = ’OLD’ , e r r =100) 100 s t o p ’ Cannot open f i l e ’ opens a file which should already exist (status='OLD'), otherwise an error message is issued. The option err=100 transfers the control of the program to the statement labeled '100'. In the example shown above, ¹²The one read from the file. It is not calculated from the data. 10.5. THE ANHARMONIC OSCILLATOR - AGAIN... 431 the program stops and prints an error message 'Cannot open filename' to the stdout. The commands Nx = 1 do while ( . TRUE . ) read ( 1 1 , * , end =101) xstep ( Nx ) , psi ( Nx ) Nx = Nx+1 enddo ! do while ( . TRUE . ) 101 c o n t i n u e read the opened file line by line. The option end=101 at the statement read(11,*,end=101) transfers the control of the program to the labeled statement with label 101 (i.e. outside the do loop) when we reach the end of file. The rest of the commands are applications of equations (10.33), (10.34), (10.35) and (10.36) to the formulas (10.31) and the reader is asked to study them carefully. The program uses the function integrate in order to perform the necessary integrals. 10.5 The Anharmonic Oscillator - Again... In the previous chapter 9 we studied the quantum mechanical harmonic and anharmonic oscillator in the representation of the energy eigenstates of the harmonic oscillator |n⟩. In this section we will revisit the problem by using the position representation. We will calculate the eigenfunctions ψn,λ (x) that diagonalize the Hamiltonian (9.15), √ which are the solutions of the Schrödinger equation. By setting L = ℏ/mω in equation (10.13), equation (10.12) becomes ψ ′′ (x) = −(ϵ − v(x))ψ(x) , (10.37) where v(x) = x2 + 2λx4 . For λ = 0 we obtain the harmonic oscillator with ( ) 1 −x2 /2 1 ψn (x) = √ √ e Hn (x) , ϵn = 2 n + , (10.38) 2n n! π 2 where Hn (x) are the Hermite polynomials. We start with the simple harmonic oscillator where the exact solution is known. The potential and the initial conditions are programmed in the file schHOC.f90. The changes that we need to make concern the functions V(x), boundary(xmin, xmax, psixmin, psipxmin, psixmax, psipxmax): 432 CHAPTER 10. SCHRÖDINGER EQUATION ! =========================================================== ! f i l e : schHOC . f ! .............. !−−−−− p o t e n t i a l : real (8) function V(x) i m p l i c i t none real (8) : : x V = x*x end f u n c t i o n V !−−−−− boundary c o n d i t i o n s : subroutine & boundary ( xmin , xmax , psixmin , psipxmin , psixmax , psipxmax ) i m p l i c i t none r e a l ( 8 ) : : xmin , xmax , psixmin , psipxmin , psixmax , psipxmax , V psixmin = exp ( −0.5 D0 * xmin * xmin ) psipxmin = −xmin * psixmin psixmax = exp ( −0.5 D0 * xmax * xmax ) psipxmax = −xmax * psixmax end s u b r o u t i n e boundary ! =========================================================== ................. The code omitted at the dots is identical to the one discussed in the previous section. The initial conditions are inspired by the asymptotic behavior of the solutions to Schrödinger’s¹³ equation ψ0 (x) ∼ e−x /2 , 2 ψn′ (x) ∼ −xψn (x). You are encouraged to test the influence of other choices on the results. The results are depicted in figure 10.7 where, be- sides the qualitative agreement, their difference from the known values (10.38) is also shown. This difference turns out to be of the order of 10−11 –10−7 . The values of the energy ϵn for n ≤ 14 are in agreement with (10.38) with relative accuracy better than 10−9 . Then we calculate the expectation values ⟨x⟩, ⟨x2 ⟩, ⟨p⟩, ⟨p2 ⟩, ∆x and ∆p. These are easily calculated √ using equations (9.4) √ and (9.8). We see that ⟨x⟩ = ⟨n| (a† + a)/ 2 |n⟩ = 0, ⟨p⟩ = ⟨n| i(a† − a)/ 2 |n⟩ = 0, whereas ( ) 1 † † 1 ⟨x ⟩ = ⟨p ⟩ = ⟨n| (a a + aa ) |n⟩ = n + 2 2 . (10.39) 2 2 The program observables.f90 calculates ⟨x⟩ = 0 with accuracy ∼ 10−6 and ⟨p⟩ = 0 with accuracy ∼ 10−11 . The expectation values ⟨x2 ⟩, ⟨p2 ⟩ are shown in table 10.2. ¹³In fact ψn (x) ∼ xn e−x /2 which we neglect. This does not influence the results for 2 the values of n studied here. Examine if this is necessary for larger values of n. 10.5. THE ANHARMONIC OSCILLATOR - AGAIN... 433 0.8 3e-11 ε0=1 0.7 2.5e-11 2e-11 0.6 1.5e-11 0.5 1e-11 ∆ψ0(x) ψ0(x) 0.4 5e-12 0.3 0 -5e-12 0.2 -1e-11 0.1 -1.5e-11 0 -2e-11 -6 -4 -2 0 2 4 6 -6 -4 -2 0 2 4 6 x x 0.6 1.2e-07 ε0=19 1e-07 0.4 8e-08 6e-08 0.2 4e-08 ∆ψ9(x) ψ9(x) 0 2e-08 0 -0.2 -2e-08 -4e-08 -0.4 -6e-08 -0.6 -8e-08 -8 -6 -4 -2 0 2 4 6 8 -8 -6 -4 -2 0 2 4 6 8 x x Figure 10.7: The eigenfunctions ψ0 (x), ψ9 (x) calculated by the program in sch.f90, schHOC.f90. The plot to the right shows the difference of the results from the known values (10.38). Next, the calculation is repeated for the anharmonic oscillator for λ = 0.5, 2.0. We copy the file schHOC.f90 to schUOC.f90 and change the potential in the function V(x): ! =========================================================== ! f i l e : schUOC . f ! ................... !−−−−− p o t e n t i a l : real (8) function V(x) i m p l i c i t none r e a l ( 8 ) : : x , lambda lambda = 2.0 D0 V = x * x +2.0 D0 * lambda * x * x * x * x end f u n c t i o n V .................... The wave functions are plotted in figure 10.8. We see that by increasing λ the particle becomes more confined in space as expected. In table 10.3 we list the values of the energy ϵn for n = 0, ..., 9. By increasing λ, ϵn (λ) is increased. Table 10.4 lists the expectation values ⟨x2 ⟩, ⟨p2 ⟩ and ∆x·∆p for 434 CHAPTER 10. SCHRÖDINGER EQUATION n ⟨x2 ⟩ ⟨p2 ⟩ ∆x · ∆p 0 0.500000000 0.4999977 0.4999989 1 1.500000284 1.4999883 1.4999943 2 2.499999747 2.4999711 2.4999854 3 3.499999676 3.4999441 3.4999719 4 4.499999607 4.4999082 4.4999539 5 5.499999520 5.4998633 5.4999314 6 6.499999060 6.4998098 6.4999044 7 7.499999642 7.4995484 7.4997740 8 8.499999715 8.4994203 8.4997100 9 9.499999837 9.4992762 9.4996380 10 10.500000012 10.4991160 10.4995580 11 11.499999542 11.4994042 11.4997019 12 12.499999610 12.4992961 12.4996479 13 13.499999705 13.4991791 13.4995894 14 14.499999835 14.4990529 14.4995264 Table 10.2: The expectation values ⟨x2 ⟩, ⟨p2 ⟩ and the product ∆x · ∆p for the simple harmonic oscillator for the states |n⟩, n = 0, . . . , 14. n ϵn ϵn,λ=0.5 ϵn,λ=2.0 0 1.0000 1.3924 1.9031 1 3.0000 4.6488 6.5857 2 5.0000 8.6550 12.6078 3 7.0000 13.1568 19.4546 4 9.0000 18.0576 26.9626 5 11.0000 23.2974 35.0283 6 13.0000 28.8353 43.5819 7 15.0000 34.6408 52.5723 8 17.0000 40.6904 61.9598 9 19.0000 46.9650 71.7129 Table 10.3: The values of the energy ϵn for the harmonic and anharmonic oscillator for λ = 0.5, 2.0. The values of the corresponding energy levels are increased with increasing λ. 10.6. THE LENNARD–JONES POTENTIAL 435 1 1 λ=0.0 λ=0.0 0.9 λ=0.5 0.8 λ=0.5 λ=2.0 λ=2.0 0.8 0.6 0.7 0.4 0.6 0.2 ψ0(x) ψ1(x) 0.5 0 0.4 -0.2 0.3 -0.4 0.2 -0.6 0.1 -0.8 0 -1 -6 -4 -2 0 2 4 6 -6 -4 -2 0 2 4 6 x x 1 0.8 λ=0.0 λ=0.0 0.8 λ=0.5 0.6 λ=0.5 λ=2.0 λ=2.0 0.6 0.4 0.4 0.2 0.2 ψ2(x) ψ3(x) 0 0 -0.2 -0.2 -0.4 -0.4 -0.6 -0.6 -0.8 -0.8 -6 -4 -2 0 2 4 6 -6 -4 -2 0 2 4 6 x x 0.8 0.8 λ=0.0 λ=0.0 0.6 λ=0.5 0.6 λ=0.5 λ=2.0 λ=2.0 0.4 0.4 0.2 0.2 ψ4(x) ψ5(x) 0 0 -0.2 -0.2 -0.4 -0.4 -0.6 -0.6 -0.8 -0.8 -6 -4 -2 0 2 4 6 -6 -4 -2 0 2 4 6 x x Figure 10.8: The wave functions of the anharmonic oscillator ψn,λ (x) for n = 0, 1, 2, 3, 4, 5 and λ = 0.5, 2.0 compared to the respective ones of the simple harmonic oscillator. Increasing λ yields stronger confinement of the particle in space. the anharmonic √ oscillator for the states√|n⟩, n = 0, . . . , 9. By increasing λ, ∆x = ⟨x ⟩ is decreased and ∆p = ⟨p2 ⟩ is increased. The product 2 of the uncertainties ∆x · ∆p seems to be quite close to the corresponding values for the harmonic oscillator. The results should be compared with the ones obtained in table 9.1 of chapter 9. 10.6 The Lennard–Jones Potential The Lennard–Jones potential is a simple phenomenological model of the interaction between two neutral atoms in a diatomic molecule. This is given by {( ) } σ 12 ( σ )6 V (x) = 4V0 − . (10.40) x x 436 CHAPTER 10. SCHRÖDINGER EQUATION λ = 0.5 λ = 2.0 n ⟨x ⟩ 2 ⟨p ⟩ 2 ∆x · ∆p ⟨x ⟩ 2 ⟨p2 ⟩ ∆x · ∆p 0 0.3058 0.8263 0.5027 0.2122 1.1980 0.5042 1 0.8013 2.8321 1.5064 0.5408 4.2102 1.5089 2 1.1554 5.3848 2.4944 0.7612 8.1513 2.4909 3 1.4675 8.2819 3.4862 0.9582 12.6501 3.4816 4 1.7509 11.4545 4.4784 1.1370 17.5955 4.4728 5 2.0141 14.8599 5.4707 1.3029 22.9169 5.4643 6 2.2617 18.4691 6.4631 1.4590 28.5668 6.4560 7 2.4970 22.2607 7.4555 1.6074 34.5103 7.4478 8 2.7220 26.2184 8.4478 1.7492 40.7206 8.4397 9 2.9384 30.3289 9.4402 1.8856 47.1762 9.4316 Table 10.4: The expectation values ⟨x2 ⟩, ⟨p2 ⟩ and the product ∆x · ∆p for √ the anhar- √ states |n⟩, n = 0, . . . , 9. Note the decrease of ∆x = ⟨x ⟩ and monic oscillator for the 2 the increase of ∆p = ⟨p ⟩ with increasing λ. The uncertainty product ∆x · ∆p seems 2 to take values close to the corresponding ones of the harmonic oscillator for both values of λ. Compare the results in this table with the ones in table 9.1. The repulsive term describes the Pauli interaction due to the overlapping of the electron orbitals, whereas the attractive term describes the Van der Waals force. The first one dominates at short distances and the latter at long distances. We choose L = σ in (10.13) and define v0 = 2mσ 2 V0 /ℏ2 . Equation (10.40) becomes {( ) ( )6 } 12 1 1 v(x) = 4v0 − , (10.41) x x whereas the eigenvalues ϵn are related to the energy values En by ( ) En ϵn = 4v0 . (10.42) V0 The plot of the potential is shown in figure 10.5 for v0 = 250. The minimum is located at xm = 21/6 ≈ 1.12246 and its value is −v0 . The code for this potential is in the file schLJ.f90. The necessary changes to the code discussed in the previous sections are listed below: ! =========================================================== ! f i l e : schLJ . f90 ( Lennard−J o n e s ) ! .................. 10.6. THE LENNARD–JONES POTENTIAL 437 n ϵn ⟨x⟩ ⟨p⟩ ⟨x2 ⟩ ⟨p2 ⟩ ∆x ∆p ∆x · ∆p 0 -173.637 1.186 1.0e-10 1.415 34.193 0.091 5.847 0.534 1 -70.069 1.364 6.0e-11 1.893 56.832 0.178 7.539 1.338 2 -18.191 1.699 -4.5e-08 2.971 39.480 0.291 6.283 1.826 3 -1.317 2.679 -2.6e-08 7.586 9.985 0.638 3.160 2.016 Table 10.5: The results for the Lennard-Jones potential with v0 = 250. We find 4 bound states. !−−−−− p o t e n t i a l : real (8) function V(x) i m p l i c i t none r e a l ( 8 ) : : x , V0 V0 = 250.0 D0 V = 4.0 D0 * V0 * ( 1 . 0 D0 / x **12 −1.0 D0 / x * * 6 ) end f u n c t i o n V !−−−−− boundary c o n d i t i o n s : subroutine & boundary ( xmin , xmax , psixmin , psipxmin , psixmax , psipxmax ) i m p l i c i t none r e a l ( 8 ) : : xmin , xmax , psixmin , psipxmin , psixmax , psipxmax , V r e a l ( 8 ) : : energy common / params / energy !−−−−− I n i t i a l v a l u e s a t xmin and xmax psixmin = exp(−xmin * s q r t ( DABS ( energy−V ( xmin ) ) ) ) psipxmin = s q r t ( DABS ( energy−V ( xmin ) ) ) * psixmin psixmax = exp(−xmax * s q r t ( DABS ( energy−V ( xmax ) ) ) ) psipxmax = −s q r t ( DABS ( energy−V ( xmax ) ) ) * psixmax end s u b r o u t i n e boundary ............................ For the integration we choose v0 = 250 and xmin = 0.7, 4 <xmax < 10. The results are plotted in figure 10.9. There are four bound states. The first two ones are quite confined within the potential well whereas the last ones begin to “spill” out of it. Table 10.5 lists the results. We observe that ⟨p⟩ = 0 within the attained accuracy as expected for real, bound states¹⁴. ¹⁴For ψ(+∞) = ψ(0) = 0 and ψ ∗ (x) = ψ(x) we have that i⟨p⟩/ℏ = ∫ +∞ ∫ +∞ 0 ψ(x)(d/dx)ψ(x) dx = − 0 (d/dx)ψ(x)ψ(x) dx = 0. 438 CHAPTER 10. SCHRÖDINGER EQUATION 2.5 v(x)/v0 2 ε1/v0 ε2/v0 1.5 ε3/v0 ε4/v0 ψ1(x) 1 ψ2(x) ψ3(x) 0.5 ψ4(x) 0 -0.5 -1 -1.5 1 2 3 4 5 6 7 x Figure 10.9: The four bound states for the Lennard-Jones potential with v0 = 250. The bold red line is the potential v(x)/v0 . We plot the energy levels ϵn /v0 and the corresponding wave functions. 10.7 Problems 10.1 Add the necessary code to the program in the file well.f90 so that the final wave function printed in the file psi.dat is properly ∫1 normalized. The integral −1 ψ(x)ψ(x) dx can be computed using the Simpson rule ∫ b f (x) dx = (h/3) (f (x0 ) + 4f (x1 ) + 2f (x2 ) + . . . a +2f (xn−2 ) + 4f (xn−1 ) + f (xn ) .) The interval [a, b] is discretized by n points x0 = a, x1 , x2 , . . . , xn = b where n is even. Each interval [xi , xi+1 ] has width h. 10.2 Add the necessary code to the program in the file well.f90 in order to calculate the number of nodes (zeroes) of the wave function. Us- ing this result, the program should print the level n of the calculated wave function ψn (x). 10.7. PROBLEMS 439 1 mat 0.8 mat ψ1 sch(x) ψ6 sch(x) 0.8 ψ1 (x) 0.6 ψ6 (x) 0.6 0.4 0.4 0.2 0.2 0 0 -0.2 -0.2 -0.4 -0.4 -0.6 -0.8 -0.6 -1 -0.8 -6 -4 -2 0 2 4 6 -6 -4 -2 0 2 4 6 x x 0.8 mat 1.2 mat ψ9 sch(x) ψ14 (x) 0.6 ψ9 (x) 1 0.4 0.8 0.2 0.6 0 0.4 -0.2 0.2 -0.4 0 -0.6 -0.2 -0.8 -0.4 -6 -4 -2 0 2 4 6 -8 -6 -4 -2 0 2 4 6 8 x x Figure 10.10: Comparison of the results of the calculation of the wave functions ψn,λ (x) of the anharmonic oscillator for λ = 2.0 using the methods described in problem 12. The wave functions ψ sch (x) are the wave functions ψn,λ (x) calculated using the methods described in this chapter. The wave functions ψ mat (x) are the wave functions ψn,λ (x) calculated using the methods described in chapter 9 for Hilbert space dimension N = 40. Note the difference at large x. This is because the amplitudes ψn,λ (x) = ⟨x|n⟩λ for large x receive contributions from states |m⟩ with large m (why?). 10.3 Calculate the wave functions of the energy eigenstates for the po- tential (10.27) with v0 < 0. This is the problem of the (finite) potential well. Solve the problem for v0 = −100 and a = 0.3. How many bound states do you find? Next study the influence of the wall on the solutions. Introduce a parameter b so that v(x ≥ b) = +∞ and study the dependence of the solutions on b. Take b = 0.35, 0.4, 0.5, 0.6, 0.8, 1.0, 1.5, 2.0, 2.5, 3.0 and compute the difference of the first two energy eigenvalues. Estimate the accuracy of the method. Next lower the value of |v0 | until there is no bound state. What is the relation between a and v0 when this happens? Compare with the analytic result which you know from your quan- tum mechanics course. Hint: For the largest values of b, take Nx > 1000. When convergence is not achieved decrease epsilon. 440 CHAPTER 10. SCHRÖDINGER EQUATION 10.4 Set v0 = 1000, 5000 to the double well potential. Observe √ the (almost) degenerate states and plot the wave functions ψ±,n = (1/ 2)(ψn (x)± ψn+1 (x)), where n is odd. Compare the results with the correspond- ing energy levels and eigenfunctions of the infinite square well. Increase v0 to the point where you cannot solve the problem nu- merically. Hint: For large v0 the numerical effort is increased. For |x| < a the wave function is almost zero and it is hard to obtain the non trivial wave function for a < |x| < 1. As the accuracy deteriorates, you should increase epsilon in the program so that convergence is achieved relatively fast. 10.5 Repeat problems 3 and 4 using the program sch.f90. Compare the results. 10.6 Study the bound states in the potentials 0 a < |x| v(x) = −V0 b < |x| < a −V1 |x| < b for a = 1, b = 0.2, V0 = 100, V1 = 0, 50 and V1 x < 0 v(x) = −V0 0 < x < a 0 a<x for a = 1, V0 = 100, V1 = +∞, 10, 100 and V1 a < |x| −V0 b < |x| < a v(x) = 0 c < |x| < b −V0 |x| < c for a = 1, b = 0.7, c = 0.6, 0.3, V0 = 100, V1 = +∞, 10, 0. In each case calculate ⟨x⟩, ⟨x2 ⟩, ⟨p⟩, ⟨p2 ⟩, ∆x, ∆p, ∆x · ∆p. 10.7 Write a program that calculates the probability that a particle is found in an interval [x1 , x2 ] given the wave function calculated by the program in the file sch.f90. Apply your program on the results of the previous problem and calculate the intervals [−x1 , x1 ] where the probability to find the particle inside them is equal to 1/3. 10.8 Fill the tables 10.3 and 10.4 with the results for λ = 0.2, 0.7, 1.0, 1.3, 1.6, 2.5, 3.0 and plot each expectation value as a function of λ. 10.7. PROBLEMS 441 10.9 A particle is under the influence of a potential { } ℏ2 2 1 1 V (x) = α λ(λ − 1) − . 2m 2 cosh2 (αx) The energy spectrum is given by { } ℏ2 2 λ(λ − 1) En = α − (λ − 1 − n)2 2m 2 for the values of n = 0, 1, 2, . . . for which En > Vmin . Calculate the energy levels ϵn of the bound states numerically by setting L = 1/α in equation (10.13) and λ = 4. Plot the potential v(x) and the corresponding eigenfunctions. Calculate the expectation values of the position and momentum, the uncertainties in position and momentum and their product. Repeat for λ = 2, 6, 8, 10. 10.10 Write a program that reads in a wavefunction and calculates the expectation value of the Hamiltonian ∫ +∞ ( ) ℏ2 ∂ 2 ⟨Ĥ⟩ = ψ(x) − + V (x) ψ(x) dx , −∞ 2m ∂x2 by assuming that ψ(x) is real. Calculate ψn (x) for the harmonic oscillator for n = 1, . . . , 10 and show (numerically) that ⟨Ĥ⟩n = En . 10.11 Consider a particle in the Morse potential {( )2 } V (x) = De 1 − e−a(r−re ) − 1 . Calculate the energy spectrum of the bound states. Choose L = 1/a, x = ar, xe = are , λ2 = 2mDe /a2 ℏ2 and obtain ( ) v(x) = λ2 e−2(x−xe ) − 2e−(x−xe ) . Compare your results with the known analytic solutions ( )2 1 ϵn = λ − n − 2 ψn (z) = Nn z λ−n−1/2 e−z/2 Ln2λ−2n−1 (z) √ where z = 2λe−(x−xe ) , Nn = n! (2λ − 2n − 1)/(Γ(n + 1)Γ(2λ − n)), and Lαn (z) is a Laguerre polynomial given by Lαn (z) = (z −α ez /n!)(dn /dz n )(z n+α e−z ) = (Γ(α + 2)/(Γ(n + 2)Γ(α − n + 2))1 F1 (−n, α + 1, z). You can take λ = 4, xe = 1 and calculate ⟨x⟩, ⟨x2 ⟩, ⟨p⟩, ⟨p2 ⟩, ∆x, ∆p, ∆x · ∆p. 442 CHAPTER 10. SCHRÖDINGER EQUATION 10.12 Calculate the wave functions of the eigenstates of the Hamiltonian for the anharmonic oscillator for λ = 2.0 and n = 0, . . . , 15. Calculate the wavefunctions using the program anharmonic.f90 of chapter 9 for N = 15, 40, 100 and compare the two results. Hint: Write a program that calculates the energy eigenfunctions of the simple harmonic oscillator 1 e−x /2 Hn (x) 2 ψn (x) = √ √ 2n n! π where the Hermite polynomials satisfy the relations Hn+1 (x) = 2xHn (x) − 2nHn−1 (x), H0 (x) = 1, H1 (x) = 2x . The program anharmonic.f90 calculates the eigenstates of the an- harmonic oscillator ∑ N −1 |n⟩λ = H(m + 1, n + 1) |m⟩ m=0 by storing the coefficients of the linear expansion in the elements of the array H(N,N). The same relation holds for the corresponding wave functions ψn,λ (x), ψn (x). From ψn (x) and H(i,j) calculate ψn,λ (x) for −8 < x < 8 and determine the accuracy achieved by the calculation for each N . For which values of x do you obtain large discrepancies between your results? Remember that for large x, the states of high energy contribute more than for small x. Figure 10.10 can help you understanding this statement. Chapter 11 The Random Walker In this chapter we will study the typical path followed by a ... drunk when he decides to start walking from a given position. Because of his drunkenness, his steps are in random directions and uncorrelated. These are the basic properties of the models that we are going to study. These models are related to specific physical problems like the Brownian motion, the diffusion, the motion of impurities in a lattice, the large distance properties of macromolecules etc. In the physics of elementary particles random walks describe the propagation of free scalar particles and they most clearly arise in the Feynman path integral formulation of the euclidean quantum field theory. Random walks are precursors to the theory of random surfaces which is related to the theory of two dimensional “soft matter” membranes, two dimensional quantum gravity and string theory [44]. The geometry of a typical path of a simple random walk is not classical and this can be seen from two of its non classical properties. First, the average distance traveled by the random walker is proportional to the square root of the time traveled, i.e. the classical relation r = vt does not apply. Second, the geometry of the path of the random walker has fractal dimension which is larger than one¹. Similar structures arise in the study of quantum field theories and random surfaces, where the non classical properties of a typical configuration can be described by appropriate generalizations of these concepts. For further study we refer to [7, 43, 44, 45]. In order to simulate a stochastic system on the computer, it is neces- sary to use random number generators. In most of the cases, these are deterministic algorithms that generate a sequence of pseudorandom num- ¹More precisely, the Hausdorff dimension of the simple random walk is dH = 2. 443 444 CHAPTER 11. THE RANDOM WALKER bers distributed according to a desired distribution. The heart of these algorithms generate numbers distributed uniformly from which we can generate any other complex distribution. In this chapter we will study simple random number generators and learn how to use high quality, research grade, portable, random number generators. 11.1 (Pseudo)Random Numbers The production of pseudorandom² numbers is at the heart of a Monte Carlo simulation. The algorithm used in their production is deterministic: The generator is put in an initial state and the sequence of pseudorandom numbers is produced during its “time evolution”. The next number in the sequence is determined from the current state of the generator and it is in this sense that the generator is deterministic. Same initial conditions result in exactly the same sequence of pseudorandom numbers. But the “time evolution” is chaotic and “neighboring” initial states result in very different, uncorrelated, sequences. The chaotic properties of the generators is the key to the pseudorandomness of the numbers in the sequence: the numbers in the sequence decorrelate exponentially fast with “time”. But this is also the weak point of the pseudorandom number generators. Bad generators introduce subtle correlations which produce systematic errors. Truly random numbers (useful in cryptography) can be generated by using special devices based on e.g. radioactive decay or atmospheric noise³. Almost random numbers are produced by the special files /dev/random and /dev/urandom available on unix systems, which read bits from an entropy pool made up from several external sources (computer temperature, device noise etc). Pseudorandom number generators, however, are the source of ran- dom numbers of choice when efficiency is important. The most popular generators are the modulo generators (D.H. Lehmer, 1951) because of their simplicity. Their state is determined by only one integer xi−1 from which the next one xi is generated by the relation xi = a xi−1 + c (mod m) (11.1) ²We can’t define what a random process is, only what it isn’t. Outcomes which lack discernable patterns are assumed to be random. If there is no way to predict an event, we say it is random...Thus, there is no definition of what randomness is, only definitions of what it isn’t. See Chris Wetzel, “Can you behave randomly?”, http://faculty.rhodes.edu/wetzel/random/level23intro.html. ³There are online services which provide such sequences like www.random.org, www.fourmilab.ch/hotbits/ and others. 11.1. (PSEUDO)RANDOM NUMBERS 445 for appropriately chosen values of a, c and m. In the bibliography, there is a lot of discussion on the good and bad choices of a, c and m, which depend on the programming language and whether we are on a 32–bit or 64–bit systems. For details see the chapter on random numbers in [8]. The value of the integer m determines the maximum period of the sequence. It is obvious that if the sequence encounters the same num- ber after k steps, then the exact same sequence will be produced and k will be the period of the sequence. Since there are at most m different numbers, the period is at most equal to m. For a bad choice of a, c and m the period will be much smaller. But m cannot be arbitrarily large since there is a maximum number of bits that computers use for the storage of integers. For 4-byte (32 bit) unsigned integers the maximum number is 232 − 1, whereas for signed integers 231 − 1. One can prove⁴ that a good choice of a, c and m results in a sequence which is a permu- tation {π1 , π2 , . . . , πm } of the numbers 1, 2, . . . , m. This is good enough for simple applications that require fast random number generation but for serious calculations one has to carefully balance efficiency with qual- ity. Good quality random generators are more complicated algorithms and their states are determined by more than one integer. If you need the source code for such generators you may look in the bibliography, like in e.g. [4], [5], [8], [47]. If portability is an issue, we recommend the RANLUX random number generator [47] or the Marsaglia, Zaman and Tsang generator. The Fortran code for RANLUX can also be found in the accompanying software, whereas the MZT generator can be found in Berg’s book/site [5]. In order to understand the use of random number generators, but also in order to get a feeling of the problems that may arise, we list the code of the two functions naiveran() and drandom(). The first one is obviously problematic and we will use it in order to study certain type of correlations that may exist in the generated sequences of random numbers. The second one is much better and can be used in non–trivial applications, like in the random walk generation or in the Ising model simulations studied in the following chapters. The function naiveran() is a simple application of equation (11.1) with a = 1277, c = 0 and m = 217 : ! ============================================= ! F i l e : n a i v e r a n . f90 ! Program t o demonstrate t h e usage o f a modulo ⁴See Knuth [46]. 446 CHAPTER 11. THE RANDOM WALKER ! g e n e r a t o r with a bad c h o i c e o f c o n s t a n t s ! r e s u l t i n g i n s t r o n g p a i r c o r r e l a t i o n s between ! g e n e r a t e d numbers ! ============================================= r e a l ( 8 ) f u n c t i o n naiveran ( ) i m p l i c i t none integer : : iran =13337 common / naiveranpar / iran i n t e g e r , parameter : : m = 131072 ! equal t o 2 * * 1 7 i n t e g e r , parameter : : a = 1277 iran = a * iran iran = MOD( iran , m ) naiveran = iran /DBLE( m ) end f u n c t i o n naiveran The function drandom() is also an application of the same equation, but now we set a = 75 , c = 0 and m = 231 − 1. This is the choice of Lewis, Goodman and Miller (1969) and provides a generator that passes many tests and, more importantly, it has been used countless of times successfully. One technical problem is that, when we multiply xi−1 by a, we may obtain a number which is outside the range of 4-byte integers and this will result in an “integer overflow”. In order to have a fast and portable code, it is desirable to stay within the range of the 231 − 1 positive, 32-bit (4 byte), signed integers. Schrage has proposed to use the relation [ ] a (xi−1 mod q) − r xi−1 if it is ≥ 0 (axi−1 ) mod m = [ q ] a (xi−1 mod q) − r xi−1 + m if it is < 0 q (11.2) where m = aq + r, q = [m/a] and r = m mod a. One can show that if r < q and if 0 < xi−1 < m − 1, then 0 ≤ a(xi−1 mod q) ≤ m − 1, 0 ≤ r[xi−1 /q] ≤ m−1 and that (11.2) is valid. The period of the generator is 231 −2 ≈ 2×109 . The proof of the above statements is left as an exercise to the reader. ! ==================================================== ! F i l e : drandom . f90 ! Implementation o f t h e Schrage a l g o r i t h m f o r a ! p o r t a b l e modulo g e n e r a t o r f o r 32 b i t s i g n e d i n t e g e r s ! ( from numerical r e c i p e s ) ! 11.1. (PSEUDO)RANDOM NUMBERS 447 ! r e t u r n s uniformly d i s t r i b u t e d pseudorandom numbers ! 0.0 < x < 1 . 0 (0 and 1 excluded ) ! ==================================================== r e a l ( 8 ) f u n c t i o n drandom ( ) i m p l i c i t none i n t e g e r , parameter : : a = 16807 ! a = 7**5 i n t e g e r , parameter : : m = 2147483647 ! m = a * q+r = 2**31 −1 i n t e g e r , parameter : : q = 127773 ! q = [m/ a ] i n t e g e r , parameter : : r = 2836 ! r = MOD(m, a ) r e a l ( 8 ) , parameter : : f = ( 1 . 0 D0 / m ) integer :: p integer : : seed real (8) : : dr common / randoms / seed 101 c o n t i n u e p = seed / q ! = [ seed / q ] seed = a * ( seed− q * p ) − r * p ! = a *MOD( seed , q )−r * [ seed / q ] i f ( seed . l t . 0) seed = seed + m dr = f * seed i f ( dr . l e . 0.0 D0 . or . dr . ge . 1 . 0 D0 ) goto 101 drandom = dr end f u n c t i o n drandom The line that checks the result produced by the generator is necessary in order to check for the number 0 which appears once in the sequence. This adds a 10 − 20% overhead, depending on the compiler. If you don’t care about that, you may remove the line. Note that the number seed is put in a common block so it can be accessed by other parts of the program. Now we will write a program in order to test the problem of correla- tions in the sequence of numbers produced by naiveran(). The program will produce pairs of integers (i, j), where 0 ≤ i, j < 10000, which are sub- sequently mapped on the plane. This is done by taking the integer part of the numbers L u with L = 10000 and 0 ≤ u < 1 is the random number produced by the generator: ! ========================================================== ! Program t h a t produces N random p o i n t s ( i , j ) with ! 0<= i , j < 10000. Simple q u a l i t a t i v e t e s t o f s e r i a l ! c o r r e l a t i o n s o f random number g e n e r a t o r s on t h e plane . ! ! compile : ! g f o r t r a n c o r r e l a t i o n s 2 r a n . f90 n a i v e r a n . f90 drandom . f90 ! ========================================================== program correlations2 448 CHAPTER 11. THE RANDOM WALKER i m p l i c i t none i n t e g e r , parameter : : L = 10000 integer :: i,N character (10) : : arg real (8) : : naiveran , drandom integer : : seed common / randoms / seed ! Read t h e number o f p o i n t s from f i r s t command argument i f ( IARGC ( ) .EQ. 1 ) then c a l l GETARG ( 1 , arg ) ; read ( arg , * ) N ! c o n v e r t s t r i n g −> i n t e g e r e l s e ! d e f a u l t value , i f no N g iven by u s e r : N=1000 endif seed = 348325 do i =1 , N p r i n t * , INT ( L * naiveran ( ) ) , INT ( L * naiveran ( ) ) ! p r i n t * , INT (L * drandom ( ) ) , INT (L * drandom ( ) ) enddo end program correlations2 The program can be found in the file correlations2ran.f90. In order to test naiveran() we compile with the command > g f o r t r a n correlations2ran . f90 naiveran . f90 −o naiveran whereas in order to test drandom() we uncomment the print lines as follows ! p r i n t * , INT (L * n a i v e r a n ( ) ) , INT (L * n a i v e r a n ( ) ) p r i n t * , INT ( L * drandom ( ) ) , INT ( L * drandom ( ) ) and recompile: > g f o r t r a n correlations2ran . f90 drandom . f90 −o drandom These commands result in two executable files naiveran and drandom. In order to see the results we run the commands > . / naiveran 100000 > naiveran . out > . / drandom 100000 > drandom . out > gnuplot gnuplot > p l o t ” n a i v e r a n . out ” using 1 : 2 with dots gnuplot > p l o t ”drandom . out ” using 1 : 2 with dots 11.1. (PSEUDO)RANDOM NUMBERS 449 which produce 105 points used in the plots in figures 11.1 and 11.2. In the plot of figure 11.1, we see the pair correlations between the num- bers produced by naiveran(). Figure 11.2 shows the points produced by drandom(), and we can see that the correlations shown in figure 11.1 have vanished. The plot in figure 11.2 is qualitative, and a detailed, quantitative, study of drandom() shows that the pairs (ui , ui+1 ) that it produces, do not pass the χ2 test when we have more than 107 points, which is much less than the period of the generator. In order to avoid such problems, there are many solutions that have been proposed and the simplest among them “shuffle” the results so that the low order se- rial correlations vanish. Such generators will be discussed in the next section. The uniform distribution of the random numbers produced 10000 9000 8000 7000 6000 5000 4000 3000 2000 1000 0 0 1000 2000 3000 4000 5000 6000 7000 8000 9000 10000 Figure 11.1: Pairs of pseudorandom numbers produced by the function naiveran(). The correlations among pairs of such numbers show in the distribution of such pairs on a clearly seen lattice. can be examined graphically by constructing a histogram of the relative frequency of their appearance. In order to construct the histograms we use the script histogram which is written in the awk language⁵ as shown ⁵See the accompanying software in the Tools directory. Give the command histogram -- -h which prints short usage instructions. I hope you remember how to make the file histogram executable and put it in your path... 450 CHAPTER 11. THE RANDOM WALKER 10000 9000 8000 7000 6000 5000 4000 3000 2000 1000 0 0 1000 2000 3000 4000 5000 6000 7000 8000 9000 10000 Figure 11.2: Pairs of pseudorandom numbers produced by the function drandom(). These points have a random distribution on the plane compared to those generated by naiveran(). below: > histogram −v f =0.01 drandom . out > drandom . hst > gnuplot gnuplot > p l o t ”drandom . h s t ” using 1 : 3 with histeps gnuplot > p l o t [ : ] [ 0 : ] ”drandom . h s t ” using 1 : 3 with histeps The command histogram -v f=0.01 constructs a histogram of the data so that the bin width is 1/0.01 = 100. The reciprocal of the number following the option -v f=0.01 defines the bin width. The histogram is saved in the file drandom.out. The results are shown in figures 11.3 and 11.4. Next, we study the variance of the measurements, shown in figure 11.3. The variance is decreased with the size of the sample of the collected random numbers. This is seen in the histogram of figure 11.5. For a quantitative study of the dependence of the variance on the size n of the sample, we calculate 11.1. (PSEUDO)RANDOM NUMBERS 451 0.012 0.01 0.008 0.006 0.004 0.002 0 0 2000 4000 6000 8000 10000 Figure 11.3: The relative frequency distribution of the pseudorandom numbers gen- erated by drandom(). The distribution is uniform within (0, 1) and we see the deviations from the average value. the standard deviation v u u ( )2 1 1 ∑ 2 1∑ n n u , σ=t x − xi (11.3) n − 1 n i=1 i n i=1 where {xi } is the sequence of random numbers. Figure 11.6 plots this relation. By fitting 1 ln σ ∼ ln(n) , (11.4) 2 to a straight line, we see that 1 σ∼√ . (11.5) n If we need to generate random numbers which are distributed accord- ing to the probability density f (x) we can use a sequence of uniformly distributed random numbers in the interval (0, 1) as follows: Consider the cumulative distribution function ∫ x 0 ≤ u ≡ F (x) = f (x′ ) dx′ ≤ 1 , (11.6) −∞ 452 CHAPTER 11. THE RANDOM WALKER 0.0108 0.0106 0.0104 0.0102 0.01 0.0098 0.0096 0.0094 0.0092 0 1000 2000 3000 4000 5000 6000 7000 8000 9000 10000 Figure 11.4: Same as in figure 11.3, but with the scale enlarged, so that the dispersion of the histogram values is clearly seen. which is equal to the area under the curve f (x) in the interval (−∞, x] and it is equal to the probability P (x′ < x). If u is uniformly distributed in the interval (0, 1) then we have that P (u′ < u) = u. Therefore x = F −1 (u) is such that P (x′ < x) = u = F (x) and follows the f (x) distribution. There- fore, if ui form a sequence of uniformly distributed random numbers, then the numbers xi = F −1 (ui ) (11.7) form a sequence of random numbers distributed according to f (x). Consider for example the Cauchy distribution 1 c f (x) = c > 0. (11.8) π c2 + x2 Then ∫ x ( ) 1 1′ −1 x ′ F (x) = f (x ) dx = + tan . (11.9) −∞ 2 π c According to the previous discussion, the random number generator is given by the equation xi = c tan (πui − π/2) (11.10) 11.1. (PSEUDO)RANDOM NUMBERS 453 0.018 100000 10000 0.016 1000 0.014 0.012 0.01 0.008 0.006 0.004 0.002 0 1000 2000 3000 4000 5000 6000 7000 8000 9000 10000 Figure 11.5: The relative frequency distribution of the pseudorandom numbers gen- erated by drandom() as a function of the sample size n for n = 1000, 10000, 100000. or equivalently (for a more efficient generation) xi = c tan (2πui ) . (11.11) The generator of Gaussian random numbers is found in many appli- cations. The Gaussian distribution is given by the probability density 1 e−x /(2σ ) 2 2 g(x) = √ (11.12) 2π σ The cumulative distribution function is ∫ x ( ) ′ ′ 1 1 x G(x) = g(x ) dx = + erf √ (11.13) −∞ 2 2 2σ ∫x where erf(x) = −∞ exp{−(x′ )2 } dx′ is the error function. The error func- tion, as well as its inverse, can be calculated numerically, but this would result in a slow computation. A trick to make a more efficient calculation is to consider the probability density ρ(x, y) of two independent Gaussian random variables x and y 1