Course Unit Page

Academic Year 2018/2019

Learning outcomes

At the end of the course the student will learn the basic concepts of programming and modern scientific computation, as they are currently used in the Applied Physics field. He/she will have an understanding of the major software development techniques and strategies and an understanding of the various computational frameworks, database, data maintenance and collection. The student will be able to solve advanced problems in scientific software design that will be developed as small group projects addressing real word problems in the Applied Physics field.

Course contents


Styles and standards of programming. Software development and design. Techniques and paradigms of programming. Programming languages. Interpreted and compiled languages. Object Oriented Programming. Functional Programming. Strenght, weaknesses, domains of application and metodologies of variuos programming languages (commonly used in modern physics). The example of python, applications to multi-language environments. How to write, debug, document, share and maintain a software project (software versioning, testing, life-cycle modeling, software maintenance, selected software engineering methods and tools)

Computational infrastructures and resources. Relational Databases. Data management: formats, duplication, manipulation and reduction. File systems. From single machines to medium-large computing farms. HTC distributed computing and grid computing. Cloud. Vectorization and parallelization, GPU use and general concepts of HPC. General concepts of: Big data, data analytics, machine learning, deep learning, artificial intelligence, computational algebra systems and applications to deep learning.


Algorithms random-based and their use for simulating physical systems and data generation mechanisms. Examples of frequentist and Bayesian statistics applications. Markovian random models (systems with memory).

Optimization by stochastic explorations (such as genetic algorithms). Ordinary differential equation integration, sensitivity analysis and error propagation by montecarlo simulations. Data fitting for complex systems, application to instrument calibration.


Reading material available in a public repository, and free online resources to focus on speficic topics among those presented in class.

Teaching methods

The course will use frontal lessons, with active partecipation from the students.
During classes the students will be guided in the implementation and practice of the discussed concepts.
Optional seminars will be organized to focus on specific topics of interest.

Assessment methods

Students will be evaluated on a programming project.
This project needs to be hosted on a public repository.
The student is free to choose the programming language of the project.
Accepted control version systems are git and fossil.
The evalaution method is the following:
clarity of the repository commit history (6 point)
clarity and completeness of the documentation and source code (12 point)
presence and executability of test routines (12 point)

Optionally, the evaluation will be improved on the basis of the following topics:
Usage of innovative technologies and libraries (up to 3 points)
Contribution to open source projects (up to 6 points)

Teaching tools

Course notes, available on public repositories, and open source projects used as teaching examples.

Office hours

See the website of Enrico Giampieri