100% found this document useful (2 votes)
34 views

PDF Introduction to Programming with Fortran Chivers download

Programming

Uploaded by

kamburjailma
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
100% found this document useful (2 votes)
34 views

PDF Introduction to Programming with Fortran Chivers download

Programming

Uploaded by

kamburjailma
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 65

Experience Seamless Full Ebook Downloads for Every Genre at textbookfull.

com

Introduction to Programming with Fortran Chivers

https://textbookfull.com/product/introduction-to-
programming-with-fortran-chivers/

OR CLICK BUTTON

DOWNLOAD NOW

Explore and download more ebook at https://textbookfull.com


Recommended digital products (PDF, EPUB, MOBI) that
you can download immediately if you are interested.

Introduction to Programming with Fortran Ian Chivers

https://textbookfull.com/product/introduction-to-programming-with-
fortran-ian-chivers/

textboxfull.com

Fortran 2018 with Parallel Programming 1st Edition Subrata


Ray (Author)

https://textbookfull.com/product/fortran-2018-with-parallel-
programming-1st-edition-subrata-ray-author/

textboxfull.com

Introduction to Scientific Programming with Python Joakim


Sundnes

https://textbookfull.com/product/introduction-to-scientific-
programming-with-python-joakim-sundnes/

textboxfull.com

Introduction to Programming with C 1st Edition Nhce

https://textbookfull.com/product/introduction-to-programming-
with-c-1st-edition-nhce/

textboxfull.com
Introduction to Linear Programming with MATLAB 1st Edition
Shashi Kant Mishra

https://textbookfull.com/product/introduction-to-linear-programming-
with-matlab-1st-edition-shashi-kant-mishra/

textboxfull.com

Introduction to Computation and Programming Using Python


with Application to Understanding Data Guttag

https://textbookfull.com/product/introduction-to-computation-and-
programming-using-python-with-application-to-understanding-data-
guttag/
textboxfull.com

Programming for beginners The fundamentals Basic


introduction to programming concepts with fractals Bjørn I
F Westerheim
https://textbookfull.com/product/programming-for-beginners-the-
fundamentals-basic-introduction-to-programming-concepts-with-fractals-
bjorn-i-f-westerheim/
textboxfull.com

Learning Java An Introduction to Real World Programming


with Java Marc Loy

https://textbookfull.com/product/learning-java-an-introduction-to-
real-world-programming-with-java-marc-loy/

textboxfull.com

Modern Fortran Explained: Incorporating Fortran 2018


Michael Metcalf

https://textbookfull.com/product/modern-fortran-explained-
incorporating-fortran-2018-michael-metcalf/

textboxfull.com
Ian Chivers · Jane Sleightholme

Introduction to
Programming
with Fortran
Fourth Edition
Introduction to Programming with Fortran
Ian Chivers Jane Sleightholme

Introduction to Programming
with Fortran
Fourth Edition

123
Ian Chivers Jane Sleightholme
Rhymney Consulting Fortranplus
London London
UK UK

ISBN 978-3-319-75501-4 ISBN 978-3-319-75502-1 (eBook)


https://doi.org/10.1007/978-3-319-75502-1
Library of Congress Control Number: 2018942915

1st and 2nd edition: © Springer-Verlag London Limited 2006, 2012


3rd edition: © Springer International Publishing Switzerland 2015
4th edition: © Springer International Publishing AG, part of Springer Nature 2018
This work is subject to copyright. All rights are reserved by the Publisher, whether the whole or part
of the material is concerned, specifically the rights of translation, reprinting, reuse of illustrations,
recitation, broadcasting, reproduction on microfilms or in any other physical way, and transmission
or information storage and retrieval, electronic adaptation, computer software, or by similar or dissimilar
methodology now known or hereafter developed.
The use of general descriptive names, registered names, trademarks, service marks, etc. in this
publication does not imply, even in the absence of a specific statement, that such names are exempt from
the relevant protective laws and regulations and therefore free for general use.
The publisher, the authors and the editors are safe to assume that the advice and information in this
book are believed to be true and accurate at the date of publication. Neither the publisher nor the
authors or the editors give a warranty, express or implied, with respect to the material contained herein or
for any errors or omissions that may have been made. The publisher remains neutral with regard to
jurisdictional claims in published maps and institutional affiliations.

Printed on acid-free paper

This Springer imprint is published by the registered company Springer International Publishing AG
part of Springer Nature
The registered company address is: Gewerbestrasse 11, 6330 Cham, Switzerland
The Yorkshire connection dedicates the book
to Steve, Mark and Jonathan. The Welsh
connection dedicates the book to Joan,
Martin and Jenny.
Acknowledgements

The material in the book has evolved first


• from our combined experience of working in Computing Services within the
University of London at
– King’s College, IDC (1986–2002) and JS (1985–2008)
– Chelsea College, JS (1978–1985)
– Imperial College, IDC (1978–1986)
in the teaching, advice and support of Fortran and related areas, and second
• in the provision of commercial training courses. The following are some of the
organisations we’ve provided training for:
– AMEC, Warrington
– Aveva, Cambridge
– AWE, Aldermaston
– Centre for Ecology and Hydrology, Wallingford
– DTU—Danish Technical University
– Environment Agency, Worthing
– Esso Petroleum, Fawley
– JET—Joint European Torus
– The Met Office, Bracknell and Exeter
– National Nuclear Laboratory
– Natural Resources Canada, Ottawa
– Petroleum Geo-Services (PGS), Houston and Weybridge
– QinetiQ, Farnborough
– RAF Waddington
– Ricardo Software
– Risk Management Solutions
– Rolls Royce, Derby
– SHMU, Slovak Hydrometeorological Institute, Bratislava, Slovakia
– University of Ulster, Jordanstown, Northern Ireland

vii
viii Acknowledgements

– VCS, Germany
– Veritas DGC Ltd., Crawley
– Westland Helicopters, Yeovil.
Thanks are due to:
• The staff and students at King’s College, Chelsea College and Imperial College.
• The people who have attended the commercial courses. It has been great fun
teaching you and things have been very lively at times.
• The people on the Fortran 90 list and comp.lang.fortran. Access to the expertise
of several hundred people involved in the use and development of Fortran on a
daily basis across a wide range of disciplines is inestimable.
• The people at NAG for the provision of beta test versions of their Fortran
compilers and technical help and support.
• The people at Intel for the provision of beta test versions of their Fortran
compilers and technical help and support.
• The people running the Archer service for their help.
• The people at Oracle who helped with the C Interop examples.
• The staff and facilities at PTR Associates. It is a pleasure training there.
• Helmut Michels at the Max Planck Institute for permission to use the dislin
library.
• The patience of our families during the time required to develop the courses
upon which this book is based and whilst preparing the camera-ready copy.
• Helen Desmond and Nancy Wade-Jones at Springer for their enthusiasm and
encouragement when things were going wrong!
Our Fortran home page is:
https://www.fortranplus.co.uk/
All of the programme examples can be found there.
If you would like to contact us, our email addresses are:
Ian Chivers: ian@rhymneyconsulting.co.uk
Jane Sleightholme: jane@fortranplus.co.uk
The manuscript was produced using Springer’s LATEX style sheet. We used
proTEXt, MiKTEX and TEXnicCentre on the Windows platform. The graphs and
plots were produced using the dislin graphics library. We started using TEX at
Imperial College on several CDC systems in the 1980s. TEX and LATEX have come a
long way since then and plain TEX seems a distant memory.
Contents

1 Overview . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.2 Program Examples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.3 Web Addresses . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2 Introduction to Problem Solving . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.2 Natural Language . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.3 Artificial Language . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.3.1 Notations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.4 Resume . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.5 Algorithms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.5.1 Top-Down . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
2.5.2 Bottom-Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
2.5.3 Stepwise Refinement . . . . . . . . . . . . . . . . . . . . . . . . 11
2.6 Modular Programming . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.7 Object Oriented Programming . . . . . . . . . . . . . . . . . . . . . . . . 12
2.8 Systems Analysis and Design . . . . . . . . . . . . . . . . . . . . . . . . 12
2.8.1 Problem Definition . . . . . . . . . . . . . . . . . . . . . . . . . 12
2.8.2 Feasibility Study and Fact Finding . . . . . . . . . . . . . . 13
2.8.3 Analysis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.8.4 Design . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.8.5 Detailed Design . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.8.6 Implementation . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.8.7 Evaluation and Testing . . . . . . . . . . . . . . . . . . . . . . 14
2.8.8 Maintenance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.9 Unified Modelling Language - UML . . . . . . . . . . . . . . . . . . . 14
2.10 Conclusions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
2.11 Problems . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
2.12 Bibliography . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15

ix
x Contents

3 Introduction to Programming Languages . . . . . . . . . . . . . . . . . . . . 19


3.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
3.2 Some Early Theoretical Work . . . . . . . . . . . . . . . . . . . . . . . . 20
3.3 What Is a Programming Language? . . . . . . . . . . . . . . . . . . . . 20
3.4 Program Language Development and Engineering . . . . . . . . . . 20
3.5 The Early Days . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
3.5.1 Fortran’s Origins . . . . . . . . . . . . . . . . . . . . . . . . . . 21
3.5.2 Fortran 77 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
3.5.3 Cobol . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
3.5.4 Algol . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
3.6 Chomsky and Program Language Development . . . . . . . . . . . 23
3.7 Lisp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
3.8 Snobol . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
3.9 Second-Generation Languages . . . . . . . . . . . . . . . . . . . . . . . . 24
3.9.1 PL/1 and Algol 68 . . . . . . . . . . . . . . . . . . . . . . . . . 24
3.9.2 Simula . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
3.9.3 Pascal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
3.9.4 APL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
3.9.5 Basic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
3.9.6 C. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
3.10 Some Other Strands in Language Development . . . . . . . . . . . . 27
3.10.1 Abstraction, Stepwise Refinement and Modules . . . . 27
3.10.2 Structured Programming . . . . . . . . . . . . . . . . . . . . . 27
3.10.3 Data Structuring and Procedural Programming . . . . . 27
3.10.4 Standardisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
3.11 Ada . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
3.12 Modula . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
3.13 Modula 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
3.14 Other Language Developments . . . . . . . . . . . . . . . . . . . . . . . 30
3.14.1 Logo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
3.14.2 Postscript, TEX and LATEX . . . . . . . . . . . . . . . . . . . . 30
3.14.3 Prolog . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
3.14.4 SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
3.14.5 ICON . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
3.15 Object Oriented Programming . . . . . . . . . . . . . . . . . . . . . . . . 32
3.15.1 Simula . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
3.15.2 Smalltalk . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
3.15.3 Oberon and Oberon 2 . . . . . . . . . . . . . . . . . . . . . . . 33
3.15.4 Eiffel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
3.15.5 C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
3.15.6 Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
3.15.7 C# . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
3.15.8 Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
Contents xi

3.16 Back to Fortran! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38


3.16.1 Fortran 90 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
3.16.2 Fortran 95 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
3.16.3 ISO Technical Reports TR15580 and TR15581 . . . . 39
3.16.4 Fortran 2003 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
3.16.5 DTR 19767 Enhanced Module Facilities . . . . . . . . . 41
3.16.6 Fortran 2008 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
3.16.7 TS 29113 Further Interoperability of Fortran
with C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
3.16.8 Fortran 2018 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
3.17 Fortran Discussion Lists . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
3.18 ACM Fortran Forum . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
3.19 Other Sources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
3.20 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
3.21 Bibliography . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
4 Introduction to Programming . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
4.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
4.2 Language Strengths and Weaknesses . . . . . . . . . . . . . . . . . . . 56
4.3 Elements of a Programming Language . . . . . . . . . . . . . . . . . . 56
4.3.1 Data Description Statements . . . . . . . . . . . . . . . . . . 57
4.3.2 Control Structures . . . . . . . . . . . . . . . . . . . . . . . . . . 57
4.3.3 Data-Processing Statements . . . . . . . . . . . . . . . . . . . 57
4.3.4 Input and Output (I/O) Statements . . . . . . . . . . . . . . 57
4.4 Example 1: Simple Text I/O . . . . . . . . . . . . . . . . . . . . . . . . . 58
4.5 Variables — Name, Type and Value . . . . . . . . . . . . . . . . . . . 59
4.6 Example 2: Simple Numeric I/O and Arithmetic . . . . . . . . . . . 60
4.7 Some More Fortran Rules . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
4.8 Fortran Character Set . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
4.9 Good Programming Guidelines . . . . . . . . . . . . . . . . . . . . . . . 64
4.10 Compilers Used . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
4.11 Compiler Documentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
4.11.1 gfortran . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
4.11.2 IBM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
4.11.3 Intel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
4.11.4 Nag . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
4.11.5 Oracle/Sun . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
4.12 Program Development . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
4.13 Problems . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
5 Arithmetic . . . . . . . . . . . . . . .............................. 71
5.1 Introduction . . . . . . . .............................. 72
5.2 The Fortran Operators and the Arithmetic Assignment
Statement . . . . . . . . . .............................. 72
xii Contents

5.3 Example 1: Simple Arithmetic Expressions in Fortran . . . . . . . 73


5.4 The Fortran Rules for Arithmetic . . . . . . . . . . . . . . . . . . . . . . 74
5.5 Expression Equivalence . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
5.6 Rounding and Truncation . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
5.7 Example 2: Type Conversion and Assignment . . . . . . . . . . . . 77
5.8 Example 3: Integer Division and Real Assignment . . . . . . . . . 78
5.9 Example 4: Time Taken for Light to Travel from
the Sun to Earth . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
5.10 The Parameter Attribute . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
5.11 Round Off Errors and Computer Arithmetic . . . . . . . . . . . . . . 81
5.12 Relative and Absolute Errors . . . . . . . . . . . . . . . . . . . . . . . . . 82
5.13 Example 5: Relative and Absolute Error . . . . . . . . . . . . . . . . . 83
5.14 Range, Precision and Size of Numbers . . . . . . . . . . . . . . . . . . 84
5.15 Overflow and Underflow . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
5.15.1 Example 6: Overflow . . . . . . . . . . . . . . . . . . . . . . . 85
5.15.2 Example 7: Underflow . . . . . . . . . . . . . . . . . . . . . . 86
5.16 Health Warning: Optional Reading, Beginners Are Advised
to Leave Until Later . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
5.16.1 Positional Number Systems . . . . . . . . . . . . . . . . . . . 87
5.16.2 Fortran Representational Models . . . . . . . . . . . . . . . 87
5.17 Kind Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
5.17.1 Example 8: Testing What Kind Types Are
Available . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. 89
5.18 Testing the Numerical Representation of Different Kind
Types on a System . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. 90
5.19 Example 9: Using the Numeric Inquiry Functions with
Integer Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. 91
5.20 Example 10: Using the Numeric Inquiry Functions
with Real Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
5.21 gfortran Support for Intel Extended (80 bit) Precision . . . . . . . 97
5.22 Example 11: Literal Real Constants in a Calculation . . . . . . . . 97
5.23 Summation and Finite Precision . . . . . . . . . . . . . . . . . . . . . . . 98
5.23.1 Example 12: Rounding Problem . . . . . . . . . . . . . . . 99
5.24 Example 13: Binary Representation of Different Integer
Kind Type Numbers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. 99
5.25 Example 14: Binary Representation of a Real Number . . . . . . 101
5.26 Example 15: Initialisation of Physical Constants,
Version 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
5.27 Example 16: Initialisation of Physical Constants,
Version 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
5.28 Example 17: Initialisation of Physical Constants,
Version 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
5.29 Summary of How to Select the Appropriate Kind Type . . . . . . 105
Contents xiii

5.30 Variable Status . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106


5.31 Fortran and the IEEE 754 Standard . . . . . . . . . . . . . . . . . . . . 106
5.32 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
5.33 Bibliography . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
5.34 Problems . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
6 Arrays 1: Some Fundamentals . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
6.1 Tables of Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
6.1.1 Telephone Directory . . . . . . . . . . . . . . . . . . . . . . . . 114
6.1.2 Book Catalogue . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
6.1.3 Examination Marks or Results . . . . . . . . . . . . . . . . . 115
6.1.4 Monthly Rainfall . . . . . . . . . . . . . . . . . . . . . . . . . . 115
6.2 Arrays in Fortran . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116
6.2.1 The Dimension Attribute . . . . . . . . . . . . . . . . . . . . . 116
6.2.2 An Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116
6.2.3 Control Structure . . . . . . . . . . . . . . . . . . . . . . . . . . 116
6.3 Example 1: Monthly Rainfall . . . . . . . . . . . . . . . . . . . . . . . . . 117
6.4 Possible Missing Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
6.5 Example 2: People’s Weights and Setting the Array
Size With a Parameter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
6.6 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
6.7 Problems . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123
7 Arrays 2: Further Examples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127
7.1 Varying the Array Size at Run Time . . . . . . . . . . . . . . . . . . . 128
7.1.1 Example 1: Allocatable Arrays . . . . . . . . . . . . . . . . 128
7.2 Higher-Dimension Arrays . . . . . . . . . . . . . . . . . . . . . . . . . . . 129
7.2.1 Example 2: Two Dimensional Arrays
and a Map . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129
7.2.2 Example 3: Sensible Tabular Output . . . . . . . . . . . . 131
7.2.3 Example 4: Average of Three Sets of Values . . . . . . 132
7.2.4 Example 5: Booking Arrangements in a Theatre
or Cinema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
7.3 Additional Forms of the Dimension Attribute and Do Loop
Statement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134
7.3.1 Example 6: Voltage from –20 to þ 20 Volts . . . . . . 134
7.3.2 Example 7: Longitude from –180 to þ 180 . . . . . . . 135
7.3.3 Notes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136
7.4 The Do Loop and Straight Repetition . . . . . . . . . . . . . . . . . . . 136
7.4.1 Example 8: Table of Liquid Conversion
Measurements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136
7.4.2 Example 9: Means and Standard Deviations . . . . . . . 137
xiv Contents

7.5 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138


7.6 Problems . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139
8 Whole Array and Additional Array Features . . . . . . . . . . . . . . . . . 143
8.1 Terminology . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143
8.2 Array Element Ordering . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144
8.3 Whole Array Manipulation . . . . . . . . . . . . . . . . . . . . . . . . . . 144
8.4 Assignment . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144
8.5 Expressions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145
8.6 Example 1: Rank 1 Whole Arrays in Fortran . . . . . . . . . . . . . 146
8.7 Example 2: Rank 2 Whole Arrays in Fortran . . . . . . . . . . . . . 147
8.8 Array Sections . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148
8.8.1 Example 3: Rank 1 Array Sections . . . . . . . . . . . . . 148
8.8.2 Example 4: Rank 2 Array Sections . . . . . . . . . . . . . 149
8.9 Array Constructors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150
8.9.1 Example 5: Rank 1 Array Initialisation — Explicit
Values . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150
8.9.2 Example 6: Rank 1 Array Initialisation Using
an Implied Do Loop . . . . . . . . . . . . . . . . . . . . . . . . 151
8.9.3 Example 7: Rank 1 Arrays and the dot_product
Intrinsic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152
8.9.4 Initialising Rank 2 Arrays . . . . . . . . . . . . . . . . . . . . 152
8.9.5 Example 8: Initialising a Rank 2 Array . . . . . . . . . . 153
8.10 Miscellaneous Array Examples . . . . . . . . . . . . . . . . . . . . . . . 154
8.10.1 Example 9: Rank 1 Arrays and a Stride of 2 . . . . . . 154
8.10.2 Example 10: Rank 1 Array and the Sum Intrinsic
Function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155
8.10.3 Example 11: Rank 2 Arrays and the Sum Intrinsic
Function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156
8.10.4 Example 12: Masked Array Assignment and the
where Statement . . . . . . . . . . . . . . . . . . . . . . . . . . 157
8.10.5 Notes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158
8.11 Array Element Ordering in More Detail . . . . . . . . . . . . . . . . . 159
8.11.1 Example 13: Array Element Ordering . . . . . . . . . . . 159
8.12 Physical and Virtual Memory . . . . . . . . . . . . . . . . . . . . . . . . 160
8.13 Type Declaration Statement Summary . . . . . . . . . . . . . . . . . . 161
8.14 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161
8.15 Problems . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162
8.16 Bibliography . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162
8.16.1 DEC Alpha . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162
8.16.2 AMD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162
8.16.3 Intel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163
Contents xv

9 Output of Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165


9.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166
9.2 Integers and the i Format or Edit Descriptor . . . . . . . . . . . . . 166
9.2.1 Example 1: Twelve Times Table . . . . . . . . . . . . . . . 166
9.2.2 Example 2: Integer Overflow and the i Edit
Descriptor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167
9.3 Reals and the f Edit Descriptor . . . . . . . . . . . . . . . . . . . . . . . 168
9.3.1 Example 3: Imperial Pints and US Pints . . . . . . . . . . 168
9.3.2 Example 4: Imperial Pints and Litres . . . . . . . . . . . . 169
9.3.3 Example 5: Narrow Field Widths and the f Edit
Descriptor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170
9.3.4 Example 6: Overflow and the f Edit Descriptor . . . . 171
9.4 Reals and the e Edit Descriptor . . . . . . . . . . . . . . . . . . . . . . . 171
9.4.1 Example 7: Simple e Edit Descriptor Example . . . . . 172
9.5 Reals and the g Edit Descriptor . . . . . . . . . . . . . . . . . . . . . . . 173
9.5.1 Example 8: Simple g Edit Descriptor Example . . . . . 173
9.6 Spaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174
9.6.1 Example 9: Three Ways of Generating Spaces . . . . . 174
9.7 Characters — a Format or Edit Descriptor . . . . . . . . . . . . . . . 175
9.7.1 Example 10: Character Output and the Edit
Descriptor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175
9.7.2 Example 11: Character, Integer and Real Output
in a Format Statement . . . . . . . . . . . . . . . . . . . . . . . 176
9.8 Common Mistakes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177
9.9 Files in Fortran . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177
9.9.1 The open Statement . . . . . . . . . . . . . . . . . . . . . . . . 177
9.9.2 The close Statement . . . . . . . . . . . . . . . . . . . . . . 178
9.9.3 Example 12: Open and Close Usage . . . . . . . . . . . . 178
9.9.4 Example 13: Timing of Writing Formatted Files . . . . 179
9.9.5 Example 14: Timing of Writing Unformatted
Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181
9.10 Example 15: Implied Do Loops and Array Sections
for Array Output . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182
9.11 Example 16: Repetition and Whole Array Output . . . . . . . . . . 184
9.12 Example 17: Choosing the Decimal Symbol . . . . . . . . . . . . . . 184
9.13 Example 18: Alternative Format Specification
Using a String . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185
9.14 Example 19: Alternative Format Specification Using a
Character Variable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186
9.15 The Remaining Control and Data Edit Descriptors . . . . . . . . . 186
9.16 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187
9.17 Problems . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188
xvi Contents

10 Reading in Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191


10.1 Reading from Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191
10.2 Example 1: Reading Integer Data . . . . . . . . . . . . . . . . . . . . . . 192
10.3 Example 2: Reading Real Data . . . . . . . . . . . . . . . . . . . . . . . 194
10.4 Met Office Historic Station Data . . . . . . . . . . . . . . . . . . . . . . 195
10.5 Example 3: Reading One Column of Data from a File . . . . . . 196
10.6 Example 4: Skipping Lines in a File . . . . . . . . . . . . . . . . . . . 198
10.7 Example 5: Reading from Several Files Consecutively . . . . . . 199
10.8 Example 6: Reading Using Array Sections . . . . . . . . . . . . . . . 201
10.9 Example 7: Reading Using Internal Files . . . . . . . . . . . . . . . . 203
10.10 Example 8: Timing of Reading Formatted Files . . . . . . . . . . . 204
10.11 Example 9: Timing of Reading Unformatted Files . . . . . . . . . 205
10.12 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206
10.13 Problems . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207
11 Summary of I/O Concepts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209
11.1 I/O Concepts and Statements . . . . . . . . . . . . . . . . . . . . . . . . . 209
11.2 Records . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210
11.3 File Access . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210
11.4 The open Statement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210
11.5 Data Transfer Statements . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211
11.6 The inquire Statement . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212
11.7 Error, End of Record and End of File . . . . . . . . . . . . . . . . . . 213
11.7.1 Error Conditions and the err= Specifier . . . . . . . . . 214
11.7.2 End-of-File Condition and the end= Specifier . . . . . 214
11.7.3 End-of-Record Condition and the eor= Specifier . . . 214
11.7.4 iostat= Specifier . . . . . . . . . . . . . . . . . . . . . . . . . 214
11.7.5 iomsg= Specifier . . . . . . . . . . . . . . . . . . . . . . . . . . 215
11.8 Examples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215
11.8.1 Example 1: Simple Use of the read, write,
open, close, unit Features . . . . . . . . . . . . . . . . 215
11.8.2 Example 2: Using iostat to Test for Errors . . . . . 216
11.8.3 Example 3: Use of newunit and lentrim . . . . . . 217
11.9 Unit Numbering . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219
11.10 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219
11.11 Problems . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219
12 Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ..... . . . . 221
12.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . ..... . . . . 221
12.2 An Introduction to Predefined Functions and Their Use . . . . . . 222
12.2.1 Example 1: Simple Function Usage . . . . ..... . . . . 223
12.3 Generic Functions . . . . . . . . . . . . . . . . . . . . . . . . ..... . . . . 224
12.3.1 Example 2: The abs Generic Function . ..... . . . . 224
Contents xvii

12.4 Elemental Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 224


12.4.1 Example 3: Elemental Function Use . . . . . . . . . . . . 224
12.5 Transformational Functions . . . . . . . . . . . . . . . . . . . . . . . . . . 225
12.5.1 Example 4: Simple Transformational Use . . . . . . . . . 225
12.5.2 Example 5: Intrinsic dot_product Use . . . . . . . . 225
12.6 Notes on Function Usage . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226
12.7 Example 6: Easter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226
12.8 Intrinsic Procedures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 228
12.9 Supplying Your Own Functions . . . . . . . . . . . . . . . . . . . . . . . 229
12.9.1 Example 7: Simple User Defined Function . . . . . . . . 229
12.10 An Introduction to the Scope of Variables, Local Variables
and Interface Checking . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 231
12.11 Recursive Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232
12.11.1 Example 8: Recursive Factorial Evaluation . . . . . . . . 232
12.12 Example 9: Recursive Version of gcd . . . . . . . . . . . . . . . . . . 234
12.13 Example 10: gcd After Removing Recursion . . . . . . . . . . . . . 235
12.14 Internal Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236
12.14.1 Example 11: Stirling’s Approximation . . . . . . . . . . . 236
12.15 Pure Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237
12.15.1 Pure Constraints . . . . . . . . . . . . . . . . . . . . . . . . . . . 238
12.16 Elemental Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238
12.17 Resume . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239
12.18 Formal Syntax . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239
12.19 Rules and Restrictions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240
12.20 Problems . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241
12.21 Bibliography . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241
12.21.1 Recursion and Problem Solving . . . . . . . . . . . . . . . . 242
13 Control Structures and Execution Control . . . . . . . . . . . . . . . . . . . 243
13.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244
13.2 Selection Among Courses of Action . . . . . . . . . . . . . . . . . . . . 244
13.3 The Block If Statement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245
13.3.1 Example 1: Quadratic Roots . . . . . . . . . . . . . . . . . . 247
13.3.2 Example 2: Date Calculation . . . . . . . . . . . . . . . . . . 248
13.4 The Case Statement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 249
13.4.1 Example 3: Simple Calculator . . . . . . . . . . . . . . . . . 250
13.4.2 Example 4: Counting Vowels, Consonants, etc. . . . . 251
13.5 The Various Forms of the Do Statement . . . . . . . . . . . . . . . . . 252
13.5.1 Example 5: Sentinel Usage . . . . . . . . . . . . . . . . . . . 253
13.5.2 Cycle and Exit . . . . . . . . . . . . . . . . . . . . . . . . . . . . 254
xviii Contents

13.5.3 Example 6: The Evaluation of e**x . . . . . . . . . . . . . 254


13.5.4 Example 7: Wave Breaking on an Offshore Reef . . . 256
13.6 Do Concurrent . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 257
13.7 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 260
13.7.1 Control Structure Formal Syntax . . . . . . . . . . . . . . . 260
13.8 Problems . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261
13.9 Bibliography . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263
14 Characters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 265
14.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 265
14.2 Character Input . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 266
14.2.1 Example 1: The * Edit Descriptor . . . . . . . . . . . . . . 267
14.2.2 Example 2: The a Edit Descriptor . . . . . . . . . . . . . . 267
14.3 Character Operators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 268
14.4 Character Substrings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 269
14.4.1 Example 3: Stripping Blanks from a String . . . . . . . 270
14.5 Character Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 270
14.5.1 Example 4: The index Character Function . . . . . . . 270
14.5.2 The len and len_trim Functions . . . . . . . . . . . . 271
14.5.3 Example 5: Using len and len_trim . . . . . . . . . . 271
14.6 Collating Sequence . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272
14.7 Example 6: Finding Out About the Character Set
Available . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273
14.8 The scan Function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 275
14.8.1 Example 7: Using the scan Function . . . . . . . . . . . 275
14.9 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 276
14.10 Problems . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 277
15 Complex . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281
15.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281
15.2 Example 1: Use of cmplx, aimag and conjg . . . . . . . . . . . 282
15.3 Example 2: Polar Coordinate Example . . . . . . . . . . . . . . . . . . 283
15.4 Complex and Kind Type . . . . . . . . . . . . . . . . . . . . . . . . . . . . 284
15.5 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 284
15.6 Problem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 284
16 Logical . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 287
16.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 287
16.2 I/O . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 290
16.3 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291
16.4 Problems . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291
17 Introduction to Derived Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . 293
17.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 293
17.2 Example 1: Dates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 294
Contents xix

17.3 Type Definition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 295


17.4 Variable Definition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 295
17.4.1 Example 2: Variant of Example 1 Using
Modules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 295
17.5 Example 3: Address Lists . . . . . . . . . . . . . . . . . . . . . . . . . . . 296
17.6 Example 4: Nested User Defined Types . . . . . . . . . . . . . . . . . 298
17.7 Problem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 300
18 An Introduction to Pointers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 301
18.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 301
18.2 Example 1: Illustrating Some Basic Pointer Concepts . . . . . . . 302
18.3 Example 2: The associated Intrinsic Function . . . . . . . . . . 304
18.4 Example 3: Referencing Pointer Variables Before
Allocation or Pointer Assignment . . . . . . . . . . . . . . . . . . . . . . 304
18.4.1 gfortran . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 305
18.4.2 Intel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 305
18.4.3 Nag . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 306
18.5 Example 4: Pointer Allocation and Assignment . . . . . . . . . . . . 306
18.6 Memory Leak Examples . . . . . . . . . . . . . . . . . . . . . . . . . . . . 307
18.6.1 Example 5: Simple Memory Leak . . . . . . . . . . . . . . 307
18.6.2 Example 6: More Memory Leaks . . . . . . . . . . . . . . 308
18.7 Non-standard Pointer Example . . . . . . . . . . . . . . . . . . . . . . . . 309
18.7.1 Example 7: Using the C loc Function . . . . . . . . . . 309
18.8 Problems . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 310
19 Introduction to Subroutines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313
19.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313
19.2 Example 1: Roots of a Quadratic Equation . . . . . . . . . . . . . . . 314
19.2.1 Referencing a Subroutine . . . . . . . . . . . . . . . . . . . . 316
19.2.2 Dummy Arguments or Parameters and Actual
Arguments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 317
19.2.3 The intent Attribute . . . . . . . . . . . . . . . . . . . . . . 317
19.2.4 Local Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . 317
19.2.5 Local Variables and the save Attribute . . . . . . . . . . 317
19.2.6 Scope of Variables . . . . . . . . . . . . . . . . . . . . . . . . . 318
19.2.7 Status of the Action Carried Out
in the Subroutine . . . . . . . . . . . . . . . . . . . . . . . . . . 318
19.2.8 Modules ‘Containing’ Procedures . . . . . . . . . . . . . . 318
19.3 Why Bother with Subroutines? . . . . . . . . . . . . . . . . . . . . . . . 319
19.4 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 319
19.5 Problems . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 320
xx Contents

20 Subroutines: 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 321
20.1 More on Parameter Passing . . . . . . . . . . . . . . . . . . . . . . . . . . 321
20.1.1 Assumed-Shape Array . . . . . . . . . . . . . . . . . . . . . . . 321
20.1.2 Deferred-Shape Array . . . . . . . . . . . . . . . . . . . . . . . 322
20.1.3 Automatic Arrays . . . . . . . . . . . . . . . . . . . . . . . . . . 322
20.1.4 Allocatable Dummy Arrays . . . . . . . . . . . . . . . . . . . 322
20.1.5 Keyword and Optional Arguments . . . . . . . . . . . . . . 322
20.2 Example 1: Assumed Shape Parameter Passing . . . . . . . . . . . . 323
20.2.1 Notes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 325
20.3 Example 2: Character Arguments and Assumed-Length
Dummy Arguments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 325
20.4 Example 3: Rank 2 and Higher Arrays as Parameters . . . . . . . 327
20.4.1 Notes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 328
20.5 Example 4: Automatic Arrays and Median Calculation . . . . . . 329
20.5.1 Internal Subroutines and Scope . . . . . . . . . . . . . . . . 332
20.6 Example 5: Recursive Subroutines – Quicksort . . . . . . . . . . . . 332
20.6.1 Note — Recursive Subroutine . . . . . . . . . . . . . . . . . 335
20.6.2 Note — Flexible Design . . . . . . . . . . . . . . . . . . . . . 335
20.7 Example 6: Allocatable Dummy Arrays . . . . . . . . . . . . . . . . . 336
20.8 Example 7: Elemental Subroutines . . . . . . . . . . . . . . . . . . . . . 339
20.9 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 340
20.10 Problems . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 340
20.11 Bibliography . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 342
20.12 Commercial Numerical and Statistical Subroutine Libraries . . . 342
21 Modules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 343
21.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 343
21.2 Basic Module Syntax . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 344
21.3 Modules for Global Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . 344
21.4 Example 1: Modules for Precision Specification and Constant
Definition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 345
21.5 Example 2: Modules for Globally Sharing Data . . . . . . . . . . . 347
21.6 Modules for Derived Data Types . . . . . . . . . . . . . . . . . . . . . . 349
21.7 Example 3: Person Data Type . . . . . . . . . . . . . . . . . . . . . . . . 350
21.8 Example 4: A Module for Simple Timing of a Program . . . . . 352
21.9 private, public and protected Attributes . . . . . . . . . . 353
21.10 The use Statement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 354
21.11 Notes on Module Usage and Compilation . . . . . . . . . . . . . . . . 354
21.12 Example 5: Modules and Include Statements . . . . . . . . . . . . . 354
21.13 Formal Syntax . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 355
21.13.1 Interface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 355
21.13.2 Implicit and Explicit Interfaces . . . . . . . . . . . . . . . . 356
21.13.3 Explicit Interface . . . . . . . . . . . . . . . . . . . . . . . . . . 356
Contents xxi

21.14 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 356


21.15 Problems . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 357
22 Data Structuring in Fortran . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 359
22.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 359
22.2 Example 1: Singly Linked List: Reading an Unknown
Amount of Text . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 359
22.3 Example 2: Reading in an Arbitrary Number of Reals
Using a Linked List and Copying to an Array . . . . . . . . . . . . 363
22.4 Example 3: Ragged Arrays . . . . . . . . . . . . . . . . . . . . . . . . . . 365
22.5 Example 4: Ragged Arrays and Variable Sized Data Sets . . . . 366
22.6 Example 5: Perfectly Balanced Tree . . . . . . . . . . . . . . . . . . . . 369
22.7 Example 6: Date Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 372
22.7.1 Notes: DST in the USA . . . . . . . . . . . . . . . . . . . . . 383
22.8 Example 7: Date Data Type with USA and ISO Support . . . . . 383
22.9 Bibliography . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 388
22.10 Problems . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 389
23 An Introduction to Algorithms and the Big O Notation . . . . . . . . . 391
23.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 391
23.2 Basic Background . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 392
23.3 Brief Explanation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 392
23.4 Example 1: Order Calculations . . . . . . . . . . . . . . . . . . . . . . . 393
23.5 Sorting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 394
23.6 Basic Array and Linked List Performance . . . . . . . . . . . . . . . 395
23.7 Bibliography . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 395
24 Operator Overloading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 397
24.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 397
24.2 Other Languages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 397
24.3 Example 1: Overloading the Addition (+) Operator . . . . . . . . . 398
24.4 Problem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 399
25 Generic Programming . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 401
25.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 401
25.2 Generic Programming and Other Languages . . . . . . . . . . . . . . 401
25.3 Example 1: Sorting Reals and Integers . . . . . . . . . . . . . . . . . . 402
25.3.1 Generic Quicksort in C++ . . . . . . . . . . . . . . . . . . . . 410
25.3.2 Generic Quicksort in C# . . . . . . . . . . . . . . . . . . . . . 411
25.4 Example 2: Generic Statistics Module . . . . . . . . . . . . . . . . . . 413
25.5 Problems . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 419
25.6 Bibliography . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 420
25.6.1 Generic Programming References . . . . . . . . . . . . . . 420
25.6.2 Generic Programming and C++ . . . . . . . . . . . . . . . . 420
25.6.3 Generic Programming and C# . . . . . . . . . . . . . . . . . 420
xxii Contents

26 Mathematical and Numerical Examples . . . . . . . . . . . . . . . . . . . . . 421


26.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 422
26.2 Example 1: Using Linked Lists for Sparse Matrix
Problems . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 422
26.2.1 Inner Product of Two Sparse Vectors . . . . . . . . . . . . 422
26.3 Example 2: Solving a System of First-Order Ordinary
Differential Equations Using Runge–Kutta–Merson . . . . . . . . . 427
26.3.1 Note: Alternative Form of the Allocate
Statement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 434
26.3.2 Note: Automatic Arrays . . . . . . . . . . . . . . . . . . . . . 434
26.3.3 Note: Subroutine as a Dummy Procedure
Argument: . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 435
26.3.4 Note: Compilation When Using Modules . . . . . . . . . 435
26.3.5 Keyword and Optional Argument Variation . . . . . . . 436
26.4 Example 3: A Subroutine to Extract the Diagonal Elements
of a Matrix . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 437
26.5 Example 4: The Solution of Linear Equations Using Gaussian
Elimination . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 438
26.5.1 Notes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 443
26.6 Example 5: Allocatable Function Results . . . . . . . . . . . . . . . . 444
26.7 Example 6: Elemental e**x Function . . . . . . . . . . . . . . . . . . . 445
26.8 Example 7: Absolute and Relative Errors Involved in
Subtraction Using 32 bit Reals . . . . . . . . . . . . . . . . . . . . . . . . 447
26.9 Example 8: Absolute and Relative Errors Involved in
Subtraction Using 64 bit Reals . . . . . . . . . . . . . . . . . . . . . . . . 448
26.10 Problems . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 450
26.11 Bibliography . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 450
27 Parameterised Derived Types (PDTs) in Fortran . . . . . . . . . . . . . . 453
27.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 453
27.2 Example 1: Linked List Parameterised by Real Kind . . . . . . . . 454
27.3 Example 2: Ragged Array Parameterised by Real
Kind Type . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 456
27.4 Example 3: Specifying len in a PDT . . . . . . . . . . . . . . . . . . 457
27.5 Problems . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 460
28 Introduction to Object Oriented Programming . . . . . . . . . . . . . . . . 461
28.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 461
28.2 Brief Review of the History of Object Oriented
Programming . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 461
28.3 Background Technical Material . . . . . . . . . . . . . . . . . . . . . . . 462
28.3.1 The Concept of Type . . . . . . . . . . . . . . . . . . . . . . . 463
28.3.2 Type Classification . . . . . . . . . . . . . . . . . . . . . . . . . 463
28.3.3 Set of Values . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 463
Contents xxiii

28.3.4 Type . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 463


28.3.5 Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 463
28.3.6 Attributes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 464
28.3.7 Passed Object Dummy Arguments . . . . . . . . . . . . . . 464
28.3.8 Derived Types and Structure Constructors . . . . . . . . 465
28.3.9 Structure Constructors and Generic Names . . . . . . . . 465
28.3.10 Assignment . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 466
28.3.11 Intrinsic Assignment Statement . . . . . . . . . . . . . . . . 466
28.3.12 Defined Assignment Statement . . . . . . . . . . . . . . . . 466
28.3.13 Polymorphic Variables . . . . . . . . . . . . . . . . . . . . . . 467
28.3.14 Executable Constructs Containing Blocks . . . . . . . . . 467
28.3.15 The associate Construct . . . . . . . . . . . . . . . . . . 467
28.3.16 The select type Construct . . . . . . . . . . . . . . . . . 467
28.4 Example 1: The Basic Shape Class . . . . . . . . . . . . . . . . . . . . 468
28.4.1 Key Points . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 470
28.4.2 Notes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 473
28.5 Example 2: Base Class with Private Data . . . . . . . . . . . . . . . . 473
28.6 Example 3: Using an Interface to Use the Class Name
for the Structure Constructor . . . . . . . . . . . . . . . . . . . . . . . . . 475
28.6.1 Public and Private Accessibility . . . . . . . . . . . . . . . . 477
28.7 Example 4: Simple Inheritance . . . . . . . . . . . . . . . . . . . . . . . . 478
28.7.1 Base Shape Class . . . . . . . . . . . . . . . . . . . . . . . . . . 478
28.7.2 Circle - Derived Type 1 . . . . . . . . . . . . . . . . . . . . . 478
28.7.3 Rectangle - Derived Type 2 . . . . . . . . . . . . . . . . . . 481
28.7.4 Simple Inheritance Test Program . . . . . . . . . . . . . . . 483
28.8 Example 5: Polymorphism and Dynamic Binding . . . . . . . . . . 485
28.8.1 Base Shape Class . . . . . . . . . . . . . . . . . . . . . . . . . . 485
28.8.2 Circle - Derived Type 1 . . . . . . . . . . . . . . . . . . . . . 487
28.8.3 Rectangle - Derived Type 2 . . . . . . . . . . . . . . . . . . 488
28.8.4 Shape Wrapper Module . . . . . . . . . . . . . . . . . . . . . . 488
28.8.5 Display Subroutine . . . . . . . . . . . . . . . . . . . . . . . . . 488
28.8.6 Test Program for Polymorphism and Dynamic
Binding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 489
28.9 Fortran 2008 and Polymorphic Intrinsic Assignment . . . . . . . . 492
28.10 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 494
28.11 Problems . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 494
28.12 Further Reading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 495
29 Additional Object Oriented Examples . . . . . . . . . . . . . . . . . . . . . . . 497
29.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 497
29.2 The Date Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 498
29.3 Example 1: The Base Date Class . . . . . . . . . . . . . . . . . . . . . . 498
29.3.1 Day and Month Name Module . . . . . . . . . . . . . . . . 500
xxiv Contents

29.3.2 Date Module . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 500


29.3.3 Diff Output Between Original Module and New oo
Module . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 507
29.3.4 Main Program . . . . . . . . . . . . . . . . . . . . . . . . . . . . 515
29.3.5 Diff Output Between Original Program and New oo
Test Program . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 518
29.4 Example 2: Simple Inheritance Based on an ISO Date
Format . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 523
29.4.1 ISO Date Module . . . . . . . . . . . . . . . . . . . . . . . . . . 523
29.4.2 ISO Test Program . . . . . . . . . . . . . . . . . . . . . . . . . . 527
29.5 Example 3: Using the Two Date Formats and Showing
Polymorphism and Dynamic Binding . . . . . . . . . . . . . . . . . . . 531
29.5.1 Date Wrapper Module . . . . . . . . . . . . . . . . . . . . . . . 531
29.5.2 Polymorphic and Dynamic Binding
Test Program . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 532
29.6 Dates, Date Validity and Calendars . . . . . . . . . . . . . . . . . . . . 533
29.6.1 Calendars . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 533
29.6.2 Date Formats . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 534
29.6.3 Other Calendar Systems . . . . . . . . . . . . . . . . . . . . . 535
29.6.4 Proleptic Gregorian Calendar . . . . . . . . . . . . . . . . . . 535
29.6.5 References . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 535
29.7 An Abstract Base Class in Fortran . . . . . . . . . . . . . . . . . . . . . 536
29.8 Problems . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 540
29.9 Bibliography . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 542
30 Introduction to Submodules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 543
30.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 543
30.2 Brief Technical Background . . . . . . . . . . . . . . . . . . . . . . . . . 544
30.3 Example 1: Rewrite of the Date Class Using Submodules . . . . 546
30.4 Example 2: Rewrite of the First Order RKM ODE Solver
Using Modules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 560
30.5 Problems . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 566
30.6 Bibliography . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 566
31 Introduction to Parallel Programming . . . . . . . . . . . . . . . . . . . . . . 567
31.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 567
31.2 Parallel Computing Classification . . . . . . . . . . . . . . . . . . . . . . 569
31.3 Amdahl’s Law . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 569
31.3.1 Amdahl’s Law Graph 1–8 Processors or Cores . . . . . 570
31.3.2 Amdahl’s Law Graph 2–64 Processors or Cores . . . . 570
31.4 Gustafson’s Law . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 571
31.4.1 Gustafson’s Law Graph 1–64 Processors
or Cores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 571
31.5 Memory Access . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 571
Contents xxv

31.6 Cache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 572


31.7 Bandwidth and Latency . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 572
31.8 Flynn’s Taxonomy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 573
31.9 Consistency Models . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 573
31.10 Threads and Threading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 573
31.11 Threads and Processes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 574
31.12 Data Dependencies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 574
31.13 Race Conditions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 574
31.14 Mutual Exclusion - Mutex . . . . . . . . . . . . . . . . . . . . . . . . . . . 574
31.15 Monitors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 574
31.16 Locks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 574
31.17 Synchronization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 575
31.18 Granularity and Types of Parallelism . . . . . . . . . . . . . . . . . . . 575
31.19 Partitioned Global Address Space - PGAS . . . . . . . . . . . . . . . 575
31.20 Fortran and Parallel Programming . . . . . . . . . . . . . . . . . . . . . 575
31.21 MPI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 576
31.22 OpenMP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 577
31.23 Coarray Fortran . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 578
31.24 Other Parallel Options . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 578
31.24.1 PVM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 579
31.24.2 HPF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 579
31.25 Top 500 Supercomputers . . . . . . . . . . . . . . . . . . . . . . . . . . . . 579
31.26 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 580
32 MPI - Message Passing Interface . . . . . . . . . . . . . . . . . . . . . . . . . . 581
32.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 581
32.2 MPI Programming . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 581
32.3 Compiler and Implementation Combination . . . . . . . . . . . . . . 582
32.4 Individual Implementation . . . . . . . . . . . . . . . . . . . . . . . . . . . 582
32.4.1 MPICH2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 582
32.4.2 Open MPI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 583
32.5 Compiler and MPI Combinations Used in the Book . . . . . . . . 583
32.5.1 Cray Archer System . . . . . . . . . . . . . . . . . . . . . . . . 583
32.6 The MPI Memory Model . . . . . . . . . . . . . . . . . . . . . . . . . . . . 584
32.7 Example 1: Hello World . . . . . . . . . . . . . . . . . . . . . . . . . . . . 584
32.8 Example 2: Hello World Using Send and Receive . . . . . . . . . 586
32.9 Example 3: Serial Solution for pi Calculation . . . . . . . . . . . . . 590
32.10 Example 4: Parallel Solution for pi Calculation . . . . . . . . . . . . 594
32.11 Example 5: Work Sharing Between Processes . . . . . . . . . . . . . 600
32.12 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 604
32.13 Problem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 604
xxvi Contents

33 OpenMP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 605
33.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 605
33.2 OpenMP Memory Model . . . . . . . . . . . . . . . . . . . . . . . . . . . . 606
33.3 Example 1: Hello World . . . . . . . . . . . . . . . . . . . . . . . . . . . . 607
33.4 Example 2: Hello World Using Default Variable Data
Scoping . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 610
33.5 Example 3: Hello World with Private
thread number variable . . . . . . . . . . . . . . . . . . . . . . . 612
33.6 Example 4: Parallel Solution for pi Calculation . . . . . . . . . . . . 613
33.7 Example 5: Comparing the Timing of Whole Array Syntax,
Simple Do Loops, Do Concurrent and an OpenMP
Solution . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 616
33.8 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 619
33.9 Problem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 619
34 Coarray Fortran . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 621
34.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 621
34.2 Some Basic Coarray Terminology . . . . . . . . . . . . . . . . . . . . . 622
34.3 Example 1: Hello World . . . . . . . . . . . . . . . . . . . . . . . . . . . . 623
34.4 Example 2: Broadcasting Data . . . . . . . . . . . . . . . . . . . . . . . . 624
34.5 Example 3: Parallel Solution for pi Calculation . . . . . . . . . . . . 625
34.6 Example 4: Work Sharing . . . . . . . . . . . . . . . . . . . . . . . . . . . 628
34.7 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 632
34.8 Problem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 632
35 C Interop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 633
35.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 633
35.2 The iso_c_binding Module . . . . . . . . . . . . . . . . . . . . . . . 633
35.3 Named Constants and Derived Types in the Module . . . . . . . . 634
35.4 Character Interoperability . . . . . . . . . . . . . . . . . . . . . . . . . . . . 635
35.5 Procedures in the Module . . . . . . . . . . . . . . . . . . . . . . . . . . . 635
35.6 Interoperability of Intrinsic Types . . . . . . . . . . . . . . . . . . . . . 635
35.7 Other Aspects of Interoperability . . . . . . . . . . . . . . . . . . . . . . 636
35.7.1 Interoperability with C Pointer Types . . . . . . . . . . . . 636
35.7.2 Interoperability of Scalar Variables . . . . . . . . . . . . . 636
35.7.3 Interoperability of Array Variables . . . . . . . . . . . . . . 636
35.7.4 Interoperability of Procedures and Procedure
Interfaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 636
35.7.5 Interoperation with C Global Variables . . . . . . . . . . 636
35.7.6 Binding Labels for Common Blocks
and Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 637
35.7.7 Interoperation with C Functions . . . . . . . . . . . . . . . . 637
35.8 Compilers Used in the Examples . . . . . . . . . . . . . . . . . . . . . . 637
35.9 Example 1: Kind Type Support . . . . . . . . . . . . . . . . . . . . . . . 638
Contents xxvii

35.10 Example 2: Fortran Calling a C Function . . . . . . . . . . . . . . . . 640


35.11 Example 3: C Calling a Fortran Function . . . . . . . . . . . . . . . . 641
35.12 Example 4: C++ Calling a Fortran Function . . . . . . . . . . . . . . 642
35.13 Example 5: Passing an Array from Fortran to C . . . . . . . . . . . 643
35.14 Example 6: Passing an Array from C to Fortran . . . . . . . . . . . 644
35.15 Example 7: Passing an Array from C++ to Fortran . . . . . . . . . 645
35.16 Example 8: Passing a Rank 2 Array from Fortran to C . . . . . . 646
35.17 Example 9: Passing a Rank 2 Array from C to Fortran . . . . . . 647
35.18 Example 10: Passing a Rank 2 Array from C++ to Fortran . . . 649
35.19 Example 11: Passing a Rank 2 Array from C++ to
Fortran and Taking Care of Array Storage . . . . . . . . . . . . . . . 651
35.19.1 Compiler Switches . . . . . . . . . . . . . . . . . . . . . . . . . 653
35.20 Example 12: Passing a Rank 2 Array from C to Fortran
and Taking Care of Array Storage . . . . . . . . . . . . . . . . . . . . . 654
35.20.1 Compiler Switches . . . . . . . . . . . . . . . . . . . . . . . . . 656
35.21 Example 13: Passing a Fortran Character Variable to C . . . . . . 657
35.22 Example 14: Passing a Fortran Character Variable to C++ . . . 660
35.23 c_loc Examples on Our Web Site . . . . . . . . . . . . . . . . . . . . 662
35.23.1 c_loc(x) Description . . . . . . . . . . . . . . . . . . . . . 662
35.24 Problem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 664
36 IEEE Arithmetic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 665
36.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 665
36.2 History . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 665
36.3 IEEE Specifications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 667
36.4 Floating Point Formats . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 669
36.5 Procedure Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 669
36.6 General Comments About the Standard . . . . . . . . . . . . . . . . . 671
36.7 Resume . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 672
36.8 Fortran Support for IEEE Arithmetic . . . . . . . . . . . . . . . . . . . 673
36.9 Derived Types and Constants Defined in the Modules . . . . . . . 673
36.9.1 ieee_exceptions . . . . . . . . . . . . . . . . . . . . . . . 673
36.9.2 ieee_arithmetic . . . . . . . . . . . . . . . . . . . . . . . 674
36.9.3 ieee_features . . . . . . . . . . . . . . . . . . . . . . . . . 675
36.9.4 Further Information . . . . . . . . . . . . . . . . . . . . . . . . . 675
36.10 Example 1: Testing IEEE Support . . . . . . . . . . . . . . . . . . . . . 675
36.11 Example 2: Testing What Flags Are Supported . . . . . . . . . . . . 676
36.12 Example 3: Overflow . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 678
36.13 Example 4: Underflow . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 678
36.14 Example 5: Inexact Summation . . . . . . . . . . . . . . . . . . . . . . . 679
36.15 Example 6: NAN and Other Specials . . . . . . . . . . . . . . . . . . . 682
36.16 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 683
36.17 Bibliography . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 684
xxviii Contents

36.17.1 Web-Based Sources . . . . . . . . . . . . . . . . . . . . . . . . 684


36.17.2 Hardware Sources . . . . . . . . . . . . . . . . . . . . . . . . . . 685
36.17.3 Operating Systems . . . . . . . . . . . . . . . . . . . . . . . . . 686
36.18 Problem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 687
37 Derived Type I/O . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 689
37.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 689
37.2 User-Defined Derived-Type Editing . . . . . . . . . . . . . . . . . . . . 691
37.3 Example 1: Basic Syntax, No Parameters in Call . . . . . . . . . . 691
37.4 Example 2: Extended Syntax, Passing Parameters . . . . . . . . . . 694
37.5 Example 3: Basic Syntax with Timing . . . . . . . . . . . . . . . . . . 699
37.6 Example 4: Extended Syntax with Timing . . . . . . . . . . . . . . . 701
37.7 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 702
37.8 Problem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 702
38 Sorting and Searching . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 703
38.1 Example 1: Generic Recursive Quicksort Example
with Timing Details . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 703
38.2 Example 2: Non Recursive Quicksort Example
with Timing Details . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 708
38.2.1 Notes - Version Control Systems . . . . . . . . . . . . . . . 714
38.3 Subroutine and Function Libraries . . . . . . . . . . . . . . . . . . . . . 715
38.4 The Nag Library for SMP and Multicore . . . . . . . . . . . . . . . . 715
38.5 Example 3: Calling the Nag m01caf Sorting Routine . . . . . . . 715
38.6 Example 4: Sorting an Array of a Derived Type . . . . . . . . . . . 718
38.6.1 Compare Function . . . . . . . . . . . . . . . . . . . . . . . . . 719
38.6.2 Fortran Sources . . . . . . . . . . . . . . . . . . . . . . . . . . . 719
38.6.3 Date Module . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 719
38.6.4 Sort Module . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 725
38.6.5 Main Program . . . . . . . . . . . . . . . . . . . . . . . . . . . . 726
38.7 Example 5: Binary Search Example . . . . . . . . . . . . . . . . . . . . 728
38.8 Problems . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 732
39 Handling Missing Data in Statistics Calculations . . . . . . . . . . . . . . 733
39.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 733
39.2 Example 1: Program to Download and Save the Data
Files Locally . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 733
39.3 Example 2: The Sed Script and Command File That
Converts the Missing Values . . . . . . . . . . . . . . . . . . . . . . . . . 736
39.4 Example 3: The Program to Do the Statistics Calculations . . . . 737
39.5 Example 4: Met Office Utility Program . . . . . . . . . . . . . . . . . 746
39.6 Bibliography . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 751
39.7 Problem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 752
Contents xxix

40 Converting from Fortran 77 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 753


40.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 753
40.2 Deleted Features from Fortran 90 . . . . . . . . . . . . . . . . . . . . . . 754
40.3 Deleted Features from Fortran 2008 . . . . . . . . . . . . . . . . . . . . 755
40.4 Obsolescent Features . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 755
40.4.1 Alternate Return . . . . . . . . . . . . . . . . . . . . . . . . . . . 756
40.4.2 Computed GO TO Statement . . . . . . . . . . . . . . . . . . 756
40.4.3 Statement Functions . . . . . . . . . . . . . . . . . . . . . . . . 756
40.4.4 DATA Statements Among Executables . . . . . . . . . . 756
40.4.5 Assumed Character Length Functions . . . . . . . . . . . 757
40.4.6 Fixed Form Source . . . . . . . . . . . . . . . . . . . . . . . . . 757
40.4.7 CHARACTER* Form of CHARACTER
Declaration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 757
40.4.8 ENTRY Statements . . . . . . . . . . . . . . . . . . . . . . . . . 757
40.4.9 Label DO Statement . . . . . . . . . . . . . . . . . . . . . . . . 758
40.4.10 COMMON and EQUIVALENCE Statements
and the Block Data Program Unit . . . . . . . . . . . . . . 758
40.4.11 Specific Names for Intrinsic Functions . . . . . . . . . . . 758
40.4.12 FORALL Construct and Statement . . . . . . . . . . . . . 758
40.5 Better Alternatives . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 758
40.6 Free and Commercial Conversion Tools . . . . . . . . . . . . . . . . . 759
40.6.1 Convert . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 760
40.6.2 Forcheck . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 760
40.6.3 Nag Compiler Polish Tool . . . . . . . . . . . . . . . . . . . . 760
40.6.4 Plusfort . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 761
40.7 Example 1: Using the plusFORT Tool Suite from Polyhedron
Software . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 761
40.7.1 Original Fortran 66 . . . . . . . . . . . . . . . . . . . . . . . . . 761
40.7.2 Fortran 77 Version . . . . . . . . . . . . . . . . . . . . . . . . . 762
40.7.3 Fortran 90 Version . . . . . . . . . . . . . . . . . . . . . . . . . 762
40.8 Example 2: Leaving as Fortran 77 . . . . . . . . . . . . . . . . . . . . . 763
40.9 Example 3: Simple Conversion to Fortran 90 . . . . . . . . . . . . . 764
40.10 Example 4: Simple Syntax Conversion to Modern Fortran . . . . 769
40.11 Example 5: Date Case Study . . . . . . . . . . . . . . . . . . . . . . . . . 775
40.12 Example 6: Creating 64 Bit Integer and 128 Bit Real Sorting
Subroutines from the Netlib Sorting Routines . . . . . . . . . . . . . 784
40.13 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 796
40.14 Problems . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 796
41 Graphics Libraries - Simple Dislin Usage . . . . . . . . . . . . . . . . . . . . 797
41.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 797
41.2 The Dislin Graphics Library . . . . . . . . . . . . . . . . . . . . . . . . . 797
41.3 Example 1: Using Dislin to Plot Amdahl’s Law Graph 1–8
Processors or Cores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 798
xxx Contents

41.4 Example 2: Using Dislin to Plot Amdahl’s Law Graph 2–64


Processors or Cores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 800
41.5 Example 3: Using Dislin to Plot Gustafson’s Law Graph
1–64 Processors or Cores . . . . . . . . . . . . . . . . . . . . . . . . . . . 802
41.6 Example 4: Using Dislin to Plot Tsunami Events . . . . . . . . . . 804
41.7 Example 5: Using Dislin to Plot the Met Office Data . . . . . . . 811
41.8 Graphics Production Notes . . . . . . . . . . . . . . . . . . . . . . . . . . 814
41.9 Bibliography . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 814
41.10 Problems . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 815
42 Abstract Interfaces and Procedure Pointers . . . . . . . . . . . . . . . . . . 817
42.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 817
42.2 Example 1: Abstract Interfaces and Procedure Pointers . . . . . . 817
42.3 Problem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 820
Appendix A: Glossary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 821
Appendix B: Attribute Declarations and Specifications . . . . . . . . . . . . . . 833
Appendix C: Compatibility . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 835
Appendix D: Intrinsic Functions and Procedures . . . . . . . . . . . . . . . . . . . 841
Appendix E: Text Extracts, English, Latin and coded . . . . . . . . . . . . . . . 911
Appendix F: Formal syntax . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 913
Appendix G: Compiler Options . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 917
Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 933
Another Random Scribd Document
with Unrelated Content
yeux brillants et un peu de leur nez rosé par l'air vif apparaissaient
entre la fourrure, la toque de castor et le bonnet de tricot blanc
enfoncés sur leur front.
Leur babil, leurs rires frais et joyeux éveillaient un vague sourire sur
les lèvres d'Emile, qui les écoutait sans les regarder, le masque
immobile, attentif à sa direction.
Un passe-montagne, une pelisse, des gants de fourrure en faisaient
une masse quasi animale, surmontée d'un visage franc et gai, de
type très français, avec son nez droit, ses yeux gris, son teint clair
un peu rougi par la continuelle exposition à l'air, et ses longues
moustaches blondes retombantes. Il dédaignait l'usage des lunettes,
prétendant avec une certaine coquetterie que ses cils roux, longs et
drus, suffisaient à préserver ses yeux du vent.
Dans l'intérieur de la voiture, Paulette, la femme de chambre, se
prélassait seule, revêtue des plus riches atours de sa patronne, la
demi-mondaine: immense chapeau empanaché d'autruche,
splendide pelisse de loutre garnie de skungs sur une merveilleuse
robe de velours souple géranium brodée de cabochons de rubis et
de vieil or.
Précisément, Georges expliquait la raison de cette tenue inusitée à
Cady abasourdie.
—Maman l'a permis... C'est elle qui prête ses affaires à Paulette pour
pas qu'elle manque le bon chopin... une veine qu'elle a eue... c'est
tout plein rigolo... un vieux birbe qu'habite la campagne—juste où
nous allons, tu saisis? Alors, qu'il a rencontré un jour Paulette qui se
promenait habillée très bath... Et qu'il lui a dit que si elle était une
baronne, elle lui ferait bien plaisir de lui rendre visite.
Cady pouffa.
—Paulette, une baronne?
—Oh! il n'était pas si gourde que de le croire, mais il s'en fichait...
Qu'il lui a dit: «Je ne m'occupe pas de ce que vous pouvez être en
réalité, mais dites-moi ça qui me fait plaisir, et que je vous traiterai
toujours avec les égards dus à votre rang.» Et alors, il lui a encore
dit qu'elle viendrait une fois tous les mois à sa maison et qu'il fallait
qu'elle soit superbement habillée, et qu'il lui donnerait deux cents
francs chaque fois, et que si elle arrivait dans une belle auto—pas un
locatis—il donnerait cent francs au chauffeur.
Cady s'adressa à Emile, admirative:
—C'est vrai qu'il vous donne cent francs?
Le chauffeur sourit et inclina la tête.
—Pour sûr, et un déjeuner au champagne... C'est un ancien
négociant en vins, et ce qu'il en a, du liquide soigné, dans ses
caves!...
—Il s'appelle comment?
—Ma foi, je n'en sais rien, c'est pas ça qui me tracasse.
Georges reprit:
—Tu verras ses magnes, c'est rien tordant!... Quand l'auto stoppe
devant son perron, y se précipite, le crâne à nu, y se courbe, avec
des bras arrondis. «Madame la baronne, qu'il dit, je suis confus de
l'honneur que vous me faites en venant me voir.» Tu sais, à toutes
les fois, c'est la même comédie, les mêmes mots... Et puis, il faut
que Paulette fasse sa pimbêche, le nez relevé, et qu'elle le rudoie,
qu'elle le traite de vieux clampin qui n'est pas capable de se
déranger, et qu'elle est trop bonne de venir trouver dans son sale
trou... Et toujours qu'il se confond en excuses... Et puis alors, ils
entrent dans la maison et on ne voit plus ce qu'ils font, mais paraît
que c'est à l'instar... Ça a fait bien rire Paulette au commencement...
Maintenant, ça la barbe, parce que c'est toujours la même chose.
Seulement, tu comprends, elle est contente de palper les deux cents
francs... et pendant les minutes où elle se rase, elle tâche de ne
penser qu'à la galette.
Cady déclara:
—Deux cents francs, cela vaut de s'embêter un peu.
—Oui, mais tu sais, c'est pas toujours commode de lui causer, à ce
vieux, il est vétilleux!... Un jour que Paulette lui a dit «M...» il s'a
foutu dans une colère!...
Cady interrogea.
—Alors, tu viens toujours?
—Des fois pas. Quand il pleut, c'est moche la campagne... Mais,
quand il y a du soleil, j'aime bien. Tu verras, c'est joli.
—C'est un château.
—Oh! non, une petite maison, mais gentille, et puis surtout que c'est
au bord de l'eau.
—Une rivière?
—Oui, une rivière.
—Quelle rivière?
—Ah! je ne sais pas... y a des canards.
Emile glissa:
—C'est la Seine, parbleu.
Cady reprit au bout d'un instant:
—Et qu'est-ce qu'il dit, le type, de te voir?
—Paulette lui a raconté que j'étais son neveu. Il m'a salué un jour en
m'appelant M. le marquis... Si y demande, on dira que tu es ma
sœur.
Un rire secoua Cady.
—Oh! oh! alors, je serai la marquise?
—Pour le moins.
Emile avertit tout à coup:
—Fermez... Nous arrivons.
A une allure ralentie, l'auto traversa la rue d'un village, puis fila
pendant quelques minutes le long de propriétés aux murs moussus,
surmontés de vieux arbres fort élevés. De temps en temps, une
grille ou une ouverture aménagée dans la clôture laissait voir une
échappée de pelouses semées de feuilles mortes, de corbeilles vides,
d'arbustes soigneusement empaillés pour la saison rude. Ensuite,
c'étaient entre les massifs des pignons ou des façades de maisons
inhabitées, aux persiennes closes, revêtues de rosiers ou de glycine
dénudés. Parfois, un lierre mettait une note verte luisante et intense
dans la tonalité grise de l'ensemble.
L'auto stoppa en ronflant devant une lourde porte cochère encastrée
dans un haut mur sur lequel retombaient les branches dépouillées de
frênes pleureurs et d'acacias.
Emile fit deux ou trois fois résonner la trompe. Les deux battants de
l'entrée s'ouvrirent en silence; il lança rapidement sa machine dans
une allée qui contournait une pelouse.
Cady aperçut une vieille bonne à l'air revêche, qui se hâtait de clore
la grand'porte, comme si elle l'eût refermée sur un scandale vivant.
Puis elle se vit devant un perron de pierre occupant toute la façade
de l'habitation, beaucoup trop grandiose pour la maison à un seul
étage, banale, couronnée d'un maigre toit d'ardoises.
La porte centrale s'ouvrit précipitamment, et le propriétaire du lieu
parut. Cady retint à grand'peine un rire devant cette silhouette falote
de petit homme court et ventru, qui faisait songer à ces jouets
composés de deux boules d'inégale grosseur représentant une tête
et un corps piqués d'allumettes qui sont les membres.
Une énorme chaîne d'or brinqueballant sur sa panse, il dégringolait
les degrés, l'œil inquiet, la lèvre tremblotante, la figure parsemée
d'une barbe si rare et si pâle, que tout d'abord on la croyait glabre
comme son crâne.
—Madame la baronne, vous me voyez confus de l'honneur que vous
me faites en venant me visiter, bégaya-t-il à demi prosterné en
ouvrant la portière de l'auto.
Paulette jaillit de la voiture, insolente et superbe.
—Ne me parlez pas! Je suis excédée, furieuse! L'on n'a pas idée de
faire courir ainsi une femme comme il faut!... Vous pouvez vous le
dire, c'est bien la dernière fois que je mets les pieds ici!...
Et passant dédaigneusement devant le bras que l'homme incliné lui
tendait, elle franchit les marches du perron d'un pas de reine
outragée. Il suivait, titubant, balbutiant d'humbles excuses. La porte
se referma derrière eux.
—Et voilà, conclut Emile en remettant l'auto en marche. La séance
ne finira que vers quatre heures.
Cady trépignait, gagnée par une folle hilarité.
—Oh! ce vieux! ce vieux!... Et Paulette! Que c'est farce!...
Georges se dégagea impatiemment de la couverture.
—Va-t-on bientôt déjeuner? J'ai faim.
Ils étaient arrivés auprès des communs. Emile remisa l'auto, se
débarrassa de ses peaux et alluma une cigarette.
—On peut toujours aller voir du côté de la cuisine, observa-t-il.
Sur le seuil de la petite porte vitrée conduisant au sous-sol, la vieille
femme de l'entrée, les poings sur les hanches, considérait les
visiteurs avec malveillance.
—Alors, fit-elle agressive, ce n'était pas assez du petit, en voilà une
autre?... Ça sera bientôt une pension qu'on m'amènera. Si vous
croyez que je supporterai cela!...
Emile conseilla en riant, avec tranquillité:
—Taisez-vous donc, la vieille!... Vous avez vos ordres, n'est-ce pas?
—Pour sûr que je les ai!... Sans cela, pensez-vous que je vous
nourrirais, vous, la traînée de là-haut et toute sa séquelle de
gosses?... Ah! Seigneur, si ce n'est pas une désolation que de voir
des infamies pareilles!... Si j'aurais cru ça de monsieur, un homme
qui a été si rangé des vingt ans durant... Et voilà que ça le travaille,
à cette heure!
Le chauffeur s'esclaffa.
—Oh! bien, voyons, faut pas vous manger le sang... Une fois par
mois, ça ne vous fait pas trop de dérangement.
Elle hocha la tête:
—Vous croyez ça?... Plus de huit jours avant ces tragédies, et plus
de huit jours après, il en est tout retourné, le pauvre cher homme!...
C'est pire qu'une maladie.
Emile haussa les épaules:
—Et puis, que voulez-vous que j'y fasse? Ça ne me regarde pas.
Voulez-vous, oui ou non, nous donner à manger?... Si c'est non, on
va aller au café du bourg et on fera porter la note à votre monsieur...
Je m'en fous, moi!
La vieille se radoucit, jetant d'un ton à peine rogue:
—Qui est-ce qui vous parle de cela?... Entrez, c'est prêt... Y a des
œufs frits, du poulet et des salsifis... avec une crème au chocolat
pour le gosse.
Georges battit des mains:
—Veine!... Faut que je vous embrasse, mère la Chouette!
Et, d'un élan, il se jeta au cou de la vieille femme, qui l'embrassa en
dissimulant un sourire.
—Mauvaise graine!... Allons, venez...
Mais Emile secoua la tête, en désignant Cady:
—Mademoiselle ne doit pas manger à la cuisine. Servez-nous en
haut.
Cette fois, la cuisinière pensa suffoquer d'indignation:
—Dans ma salle à manger?... Vous autres? Ah bien! il faudrait voir
ça!...
—C'est tout vu!
—Jamais de la vie!
Cady s'interposa en riant:
—Mais, Emile, ça m'est bien égal de manger à la cuisine.
—Du tout, ça ne se fera pas.
La vieille fonça tout à coup sur la jeune fille, d'un air terrible.
—Vous êtes donc une vraie baronne vous?
—Pas le moins du monde! avoua Cady, qui s'amusait
prodigieusement.
La bonne femme agita les bras, grommela des paroles inintelligibles,
les yeux attentivement attachés sur la fillette. Puis, soudain, elle
tourna le dos.
—C'est bon! fit-elle, calmée, on vous servira dans le cabinet de
monsieur.
C'était, au rez-de-chaussée une petite pièce close, bien chauffée et
sentant un peu le moisi et le vieux papier. Pendant que Georges
s'installait au bureau, couvrant le papier de correspondance d'affreux
bonshommes informes tracés à l'encre, Cady s'asseyait dans un
grand fauteuil où elle avait eu la joie de découvrir un chat gris qui se
pelotonna immédiatement contre elle en ronronnant.
—Quel amour!
Emile, enchanté, aidait la gouvernante à apporter une table de
l'antichambre, disposait la nappe et surtout comptait et étudiait les
bouteilles de vieux vin que la vieille avait montées de la cave à son
intention. Au fond et malgré ses injures, elle avait un faible pour lui.
—C'est du choix! constata-t-il avec satisfaction.
La vieille remarqua, de son ton rude habituel:
—Oui... oui... Si vous vous piquez le nez, ça ne sera pas avec de la
rinçure de pot de chambre, pour une fois!
Et elle descendit chercher les œufs, puis le poulet, la salade et les
légumes. Les enfants dévoraient avec appétit; Emile vidait verre sur
verre, les pommettes peu à peu allumées. Georges réclama du
champagne.
La gouvernante déposa la crème sur la table, ainsi que deux
dernières bouteilles.
—Tiens, mauvais moucheron, voilà plus qu'il n'en faut pour te
pocharder!
De fait, dix minutes plus tard, le petit garçon étourdi, assommé par
le liquide capiteux trop rapidement absorbé, s'affaissait sur la table,
la figure dans ses mains, ses boucles blondes allongées sur la
nappe.
Cady s'inquiéta.
—Tu es malade?
Emile rit, la parole un peu empâtée.
—Mais non, il est rond... Laissez-le dormir... Dans une heure, il n'y
paraîtra plus. Ça n'a jamais fait de mal, voyez-vous, un verre de
trop.
A ce moment, Cady fut distraite par un grand tapage venant de
l'étage supérieur. Dans un bouleversement de meubles, on
distinguait la voix faussement colère de Paulette et les supplications,
le chevrotement sénile de son hôte.
La fillette partit d'un éclat de rire et fit le geste de courir à la porte.
—Oh! que c'est amusant! Je voudrais les voir!
Mais, la main du chauffeur s'abattit sur son bras et la ramena
presque brutalement sur son siège.
—Bougez pas, n.. de Dieu!... C'est pas un spectacle pour vous!...
Elle se rassit, interdite, examinant le jeune homme avec de grands
yeux, étonnée de cette sortie indignée, inattendue.
Il poursuivit, le regard un peu trouble, évidemment sous l'influence
de tout ce qu'il avait ingurgité et qui donnait l'essor à ses sentiments
intimes.
—Ah! si vous seriez à moi, je vous fous mon billet que vous ne
traîneriez pas comme cela dans les jupes d'une Margot et que vous
ne feriez pas votre société de types comme moi pendant des
journées!... Je vous respecte, ça va bien, mais il y a des camarades
qui n'en feraient pas autant!... Et je vous le demande, c'est-il une
place pour une demoiselle que d'être ici, derrière les cloisons de ce
vieux malpropre qui s'en donne avec ce torche-cuvette de poupée à
quatre sous!... Non, mais c'est à faire bouillir le sang que de penser
que vous avez des parents honorables et qu'ils ne sont pas fichus de
vous surveiller!... Qu'est-ce qu'elle fout, votre mère?... Je ne serais
pas fâché de le savoir!... Non, vraiment, dites-le moi, où est-elle? De
quoi qu'elle s'occupe, pendant que vous vadrouillez avec le tiers et le
quart?
Cady se renversa sur sa chaise avec un petit rire contraint.
—Ma mère?... Est-ce que je sais, moi, ce qu'elle fait... Je ne la vois
pas souvent, allez!... Probable que je l'embête.
Il laissa rudement tomber son poing sur la table dont les verres et
les bouteilles s'entrechoquèrent bruyamment.
—Misère!... Voilà comment sont les bourgeois! Ils méprisent le
peuple, ils ne voudraient pas serrer la main d'un prolétaire ni
coucher dans son lit, la sueur du travailleur les dégoûte... Et, à côté
de ça, ils flanquent leurs enfants à élever à ce qu'il y a de moins
propre!... Tout cela pour ne pas se donner la peine de les éduquer
eux-mêmes... Flemme et compagnie, c'est ça le grand monde!
Il saisit une bouteille, emplit un verre qu'il vida d'un trait. Puis il
reprit avec un attendrissement croissant, s'enfonçant dans ses
ressouvenirs personnels, sans songer à la crudité de ses paroles, aux
aperçus réalistes qu'il apportait à ce jeune cerveau que, pourtant, il
eût sincèrement voulu défendre des mauvaises ambiances.
—Moi, ce que j'en dis... C'est pas que je les déteste, les bourgeois.
J'en ai du sang dans les veines... Ma mère était fille d'un jardinier,
elle a été remarquée par le garçon des patrons... Naturellement, y
se sont fréquentés et j'ai été fait... Mon grand-père avait la main
lourde... Quand la chose a paru, il a si fort maltraité ma pauvre mère
qu'elle s'a jetée dans une pièce d'eau qui était pour l'agrément de la
propriété... On l'a retirée à temps, mais tout ça lui avait porté un
coup, elle n'a fait que végéter jusqu'à ma naissance et après,
bonsoir, elle s'a éteinte... Eh bien! que voulez-vous, je n'ai pas à me
plaindre de mon père... Il n'a tenu qu'à moi d'entrer dans
l'administration, de devenir officier... Mais quoi, j'avais la tête d'un
paysan... A la pension où on m'avait mis, ma cervelle pétait... Alors,
on m'a laissé bricoler selon mes idées. Je suis parti pour le service, y
avait un officier qui faisait de l'auto, ça m'a donné du goût pour la
mécanique, et voilà, je me tire d'affaire... Je suis un garçon sérieux,
et c'est pas parce que vous me voyez chez des poupées que je
m'oublie pour ça. Ça ne serait pas malin, voyez-vous, et un type qui
tient à sa peau et qui n'a pas envie d'aller crever pourri à l'hôpital, y
se garde de ces fumelles, je vous en fous mon billet!...
Il but encore, et regardant Cady qui l'écoutait en silence avec
intérêt, les yeux attachés sur lui, il haussa les épaules, fronça les
sourcils et, avec un effort, rappela ses pensées un peu vagabondes.
—Qu'est-ce que je vous raconte?... Mon histoire, ça n'est pas pour
vous amuser... et puis, ce n'est pas ça que je voulais vous dire...
Voyez-vous, faudrait pas vous familiariser avec du monde que vos
parents ne connaissent pas... Oui, il y a longtemps que ça me
démange de vous parler, parce que vous êtes une gentille demoiselle
et une bonne fille... et que ça me retourne de penser qu'un jour ou
l'autre il vous arrivera malheur dans ces fréquentations.
Il eut un geste, désignant le petit Georges, toujours étendu sur la
table, dormant profondément.
—Tenez, le gosse que voici... C'est peut-être la plus fichue amitié
que vous pouvez avoir... Ça sort de nourrice et c'est déjà pourri... Ça
a le vice dans le sang...
Cady s'impatienta brusquement, un éclair farouche dans ses yeux
noircis par ses pupilles dilatées.
—Ah! laissez-moi donc tranquille à la fin!... Si Georges est comme il
est, est-ce que c'est sa faute?... Et si je suis comme je suis, est-ce
ma faute aussi?...
Et vaincue soudain par une émotion qui s'élançait des tréfonds les
plus obscurs de son être, elle se leva de table et alla se jeter dans le
grand fauteuil, toute ramassée sur elle-même, le visage caché dans
ses mains, secouée de sanglots déchirants.
Emile resta saisi, balancé entre la pitié, le remords, et la conscience
d'avoir accompli un devoir en exprimant sa pensée sans
ménagement.
—Pauvre mioche! murmura-t-il, navré, avec l'envie de prendre
l'enfant pleurante dans ses bras de la câliner tendrement, et retenu
par la conviction que ce ne serait pas convenable de sa part.
La marque de sympathie que l'homme n'osait lui accorder lui vint
d'un animal. Le chat gris, après avoir dévoré la carcasse du poulet,
au grand dommage du parquet, s'était livré ensuite à une toilette
minutieuse; puis, il avait rodé autour de Cady, guettant l'instant
favorable pour regagner son giron. Le désespoir de sa nouvelle amie
l'émotionna et lui fit oublier toutes ses instinctives précautions. D'un
bond, il fut sur les genoux de la fillette, et, s'allongeant, il appuya
ses deux pattes de devant sur la poitrine de Cady, tendant son
museau grave, intelligent, fixant son regard angoissé sur le visage
humain contracté par le chagrin qui l'intéressait passionnément.
Elle tressaillit sous le léger contact, écarta ses mains, vit le geste
expressif de la bête, et cette pitié qu'elle inspirait inonda son cœur
esseulé d'une chaude reconnaissance.
—Oh! minet... minet! balbutia-t-elle en recommençant à pleurer, ses
bras enveloppant l'animal et serrant contre elle avec une tendresse
émue ce petit corps vivant, tout tressaillant d'affection spontanée.
Mais ses pleurs n'avaient plus autant d'amertume que naguère.
XX
Mme Darquet était absente pour quarante-huit heures, devant
assister au mariage d'une parente à Nancy.
Après le repas, que l'institutrice et son élève avaient pris dans la
salle de bains, le député dînant dehors, Mlle Armande s'adressa à
Cady, d'un air à la fois résolu et gêné, le regard fuyant.
—Ma chérie, si cela ne vous ennuie pas de rester seule ce soir, j'ai
affaire à sortir... Une conférence par un de mes anciens maîtres de
l'Université, à laquelle je désire vivement assister.
Cady ne la regarda même pas, répondant froidement:
—Bien, mademoiselle.
—Il va sans dire que vous me garderez le secret?... Je ne fais rien de
mal, mais madame votre mère pourrait se choquer de cette sortie
sans sa permission...
La fillette haussa les épaules sans desserrer les dents. Les niaiseries
hypocrites de Mlle Lavernière l'excédaient.
Du reste, ce soir-là elle ne ressentait contre la maîtresse de son père
nulle animosité, nulle curiosité; seulement, une lassitude extrême
l'accablait.
Tournant le dos aux apprêts de toilette minutieux de l'institutrice,
elle s'enfonça dans la lecture d'une livraison de Buffalo Bill, dont le
style baroque et les répétitions oiseuses l'exaspéraient, quoique le
fond lui plût, de ces contes de rudes et sanglantes aventures et de
libre vie sauvage. A son insu, cette atmosphère naïve, primitive,
saine en sa violence, dans laquelle la lecture la transportait en
imagination, la soulageait de celle, compliquée et mauvaise, où son
adolescence croissait en réalité.
Elle ne parut point entendre l'adieu timide de Mlle Armande et
demeura immobile, le front dans ses mains, les yeux et le cerveau
captivés par ces lignes, qui mettaient en elle une sorte d'ivresse
brutale, mais salubre.
Cependant, arrivée à la fin du récit, elle referma la brochure avec
regret, se redressa et se détira longuement, regardant autour d'elle,
comme surprise de se retrouver dans ce cadre banal, après son
hallucinante vision de la forêt vierge, des prairies presque inviolées,
où courent les «mustangs» indomptés, où se cachent les jaguars, où
rampent les Sioux peints en guerre et traînant des queues de loup
attachées à leurs talons.
La porte s'ouvrit brusquement; sa jeune sœur Jeanne dévala dans la
chambre en dansant joyeusement.
—Tu viens, Cady? C'est la fête à Miss, et Clémence paie un chouette
gueuleton dans la salle à manger! cria l'enfant d'une petite voix
argentine où l'argot apportait une étrange fausse note.
Et, agrippée aux mains de son aînée indécise, elle l'entraînait.
—Viens, on va rigoler!... Y a Maria, y a Valentin, et puis deux bonnes
de la maison, et puis le gros maître d'hôtel du premier, et puis tout
plein d'autres!...
Cady la suivit, un peu choquée.
—Dans la salle à manger?... Eh bien! ils en ont du culot!...
Elles arrivèrent au moment où on s'attablait, toute l'électricité
étincelant sur la profusion des surtouts, des jardinières de fleurs
entassées sur la nappe, que maculait déjà le contenu d'une bouteille
de vin brisée.
Clémence, la grosse cuisinière, blafarde, aux chairs flasques, aux
yeux impertinents, en trou de vrille, le nez retroussé, canaille,
relevant la lèvre violacée au-dessus de la brèche des dents,
Clémence trônait au milieu du couvert, en face de l'héroïne de la
fête, l'Anglaise de Baby.
Celle-ci, trop grande, plate, dégingandée, avec de gros os, une tête
de cheval, les pommettes rougies et les yeux éraillés par l'alcool dont
elle abusait, montrait, dans le décolletage d'une robe de crêpe de
Chine bleu fripée, une chair fine, remarquablement blanche.
—Entrez, les gosses, et venez baffrer! Pour une fois, vous aurez du
bon! cria Valentin très excité.
C'était en habit noir, cravaté de blanc et le chapeau à haute forme
sur la tête qu'il avait reçu les invités, avec mille singeries pour
blaguer les gens du monde, et quelques obscénités afin de faire rire
les convives.
Puis, pour se mettre à table, il avait retiré son habit qui lui «déchirait
les entournures». Le chapeau sur le fond de la tête, en manches de
chemise, il gesticulait et pinçait galamment ses voisines, l'Anglaise et
Paulette, la femme de chambre de la «cocotte d'en face», tandis que
Maria le regardait jalousement, s'abandonnant, sans y penser, aux
entreprises sournoises du concierge et du gros maître d'hôtel, entre
lesquels elle se trouvait.
Le service était fait par la femme de ménage qui nettoyait les
escaliers, louée pour la circonstance, ces messieurs et ces dames
voulant se payer, pour un soir, l'illusion d'être les maîtres du logis.
Jeanne se glissa auprès du petit groom louche de l'entresol, et Cady
se plaça, l'air froid et détaché, à côté de la concierge, une femme
douce et comme il faut, qui portait sur elle et en elle le deuil éternel
des quatre enfants qu'elle avait perdus.
Le menu était copieux, les mets fins, les vins abondants; et, même
avant que les têtes fussent réellement échauffées, tous riaient et
parlaient fort haut pour se prouver à eux-mêmes qu'ils s'amusaient.
Et, dans le décousu des conversations, des lieux communs, des
plaisanteries vulgaires, des «bateaux» que l'on échangeait, un même
thème s'imposait, interminable et obsédant. Les uns et les autres
revenaient invinciblement au ressassage de leurs griefs, de leurs
rancunes contre leurs patrons. Tous, à tour de rôle ou
simultanément, détaillaient les tours joués, les hypocrites
représailles, remâchaient leur fiel, exhalaient leur mépris, leur
dégoût, leur haine envers ceux qui les payaient, et à l'ombre
desquels ils devaient vivre, aveugles, sourds, en rouages silencieux
et actifs, plutôt que comme des êtres humains...
Après la vindicte exprimée en termes généraux, pleins d'une
emphase redondante, pittoresquement mêlée de termes platement
grossiers, chacun arrivait au déshabillage de son propre patron, qu'il
peignait en gros par brèves phrases typiques ou par anecdotes
innombrables, complaisamment allongées.
—C'est tous des cochons! déclarait péremptoirement le maître
d'hôtel glabre et obèse, aux yeux vicieux dans la peau au grain si
gros qu'on l'eût dit marquée de petite vérole. Et quant à leurs
gonzesses, avec toutes leurs simagrées, c'est plus chaud que des
chattes... Y a pas de saloperies qu'elles ne fassent si elles en
trouvent l'occasion.
La femme de chambre du second sur la cour ricana.
—Vous parlez des quatre filles de ma boîte!... Les parents n'osent
plus engager de valet de chambre, rapport à ce qu'elles en flambent
de suite... Même que l'aînée se serait fait pincer, à ce que l'on dit, et
que si le docteur Trajan ne l'aurait pas soulagée à temps, ça aurait
fait un joli raffut!...
Le valet du premier, aux quarante ans replets, le profil bourbonien,
prit un air noble.
—C'est pas des choses à faire pour un type qui sait vivre!... Une
pucelle est toujours une pucelle; c'est pas parce que c'est la fille des
patrons pour qu'un homme propre lui fasse un enfant... On peut
s'amuser sans causer de lardon,—à moins, comme de juste, qu'on
n'ait son idée à soi. S'il s'agit de la patronne, c'est une autre affaire.
Si elle encaisse, elle a son mari pour endosser.
La femme de chambre du troisième jeta aigrement:
—Avec cela que les vieilles et les jeunes sont si ragoûtantes!... On
voit bien que vous ne les guettez pas comme nous dans leurs
cabinets, ça vous en rassasierait!...
Le valet sourit avec une condescendance avertie.
—C'est vrai, en général, mais il y a des exceptions, et j'ai vu des fois
des gamines sur lesquelles on n'avait pas envie de cracher. Tenez, il
y a de ça six ans, je me trouvais chez des nobles, à la campagne.
Oui, une place au vert que j'avais prise pour me refaire. J'étais un
peu vanné par Clara Desbords...
—La chanteuse des Ambass'? questionna le cuisinier intéressé.
—Précisément, j'ai été chez elle durant un an. Un record, mon cher,
personne n'y a résisté plus de six mois!... On peut dire qu'elle a la
passion de la livrée, cette femelle-là!... Ah! une rude femme!... Vous
parlez d'un corps!... Et un de ces tempéraments! Donc, j'étais à la
campagne, et chez mes patrons, vous trouviez une fille unique, une
grande jument blonde qui ne manquait pas d'allure. Elle était fiancée
à un marin qui naviguait dans les mers de Chine à l'époque... Ah! j'ai
été vite fixé!... La première fois que j'ai fait le salon, elle rappliquait:
«Ludovic, ne brouillez pas ma musique.» «Ludovic, prenez garde
que mon perroquet s'envole!» Trois jours plus tard, nous en causions
de son perroquet, au fond de son alcôve!...
Maria lança furieusement:
—Des chipies!... et avec cela vicieuses, pire que des singes!... Et qui
vous considèrent vous autres plus bas que des nègres!... Faut que
vous ayez guère de cœur pour marcher avec elles!...
—Bast! ça vaut tout de même la peine! Quant à moi, j'en connais
une que je m'enverrai un jour! déclara Valentin en clignant de l'œil
du côté de Cady. Mais il faut qu'elle ait dix-huit ans et qu'elle soit
remplumée... C'est core trop maigre!...
—Tu as peut-être bien déjà tâté? insinua le cuisinier en s'esclaffant.
Le maître d'hôtel ricana.
—Hé, hé, les fruits verts ont du bon!
Bien qu'elle ne perdît pas un mot de cet entretien, Cady restait
imperturbable, la pensée planant au-dessus de ces vulgarités et de
ces grossièretés. Même, l'allusion personnelle qu'elle saisit
parfaitement ne la toucha guère. Elle se contenta de jeter un regard
dédaigneux au jeune valet, qui ne le remarqua pas. Il s'adressait à
présent à l'Anglaise, la main audacieusement fourrée dans son
corsage.
—Mâtin, c'est doux!
Elle bégaya, demi-saoule:
—Oh! vilain sale! voulez-vous bien pas toucher mon peau!...
Il se pencha et cueillit un baiser sur ses lèvres.
—Ton pot?... De quel pot parles-tu, mon ange?
—Oh! vous embrassez joliment, master Valentin!
—N'est-ce pas? fit le jeune homme avec une emphase comique. Et
au lit, tu parles que c'est mieux encore!...
—Oh, vraiment? soupira la miss, avec un hoquet d'ivrogne.
Le maître d'hôtel eut un gros rire et fit un geste.
—Allons, mes enfants, essayez de suite! La carrée des patrons est
par là!
Par plaisanterie, Valentin se leva, arrondissant le bras vers l'Anglaise.
—Je t'attends, ma chérie.
Comme l'autre, étourdie, se soulevait sur sa chaise, Maria se récria
avec colère:
—Tu n'as pas honte, Valentin!... Cette soulaude!... On n'a pas encore
mangé le rôti et elle en a déjà par-dessus la bonde!...
La miss gesticula, très digne.
—Vous, impolie!... Vous, chameau de Française!...
Maria se leva violemment.
—Ah! sortez-la!... Vous n'allez pas me laisser insulter par cette
roupie anglaise!...
Valentin la calma du geste.
—Allons, voyons, pas tant de foin, tu nous barbes!
Et, pesant sur l'épaule de l'Anglaise, il la fit se rasseoir.
—Crie: «Vive la France!» et qu'il n'en soit plus question.
Sans prêter attention au tumulte, Clémence, la cuisinière, tout en
sirotant du bourgogne auquel elle ajoutait un petit verre de cognac,
déversait dans le sein du concierge, qui ne l'écoutait que de temps à
autre, ses rancœurs et ses ressouvenirs:
—Treize ans que je suis dans la maison, monsieur, cela peut
compter!... Et vous pourriez croire qu'on a des égards?... Pas le
moindre! J'en suis encore à exiger un congé pour revoir ma famille
qui s'a éteinte sans que j'assiste jamais à aucun enterrement. Mais
je suis trop bonne, et ce serait à croire que «Julienne» a le mauvais
œil, tant elle m'interloque... Et pourtant, Dieu sait si je pourrais
marcher dessus et lui faire baisser les yeux!... Vous pensez si j'en
sais long... et le pourquoi et le comment de toutes choses!... Une
créature qui a fait la vie autrefois, pire qu'une traînée! Mais quoi, ça
avait le sac et tous ces salaupiauds se traînaient à genoux devant
elle!... Après la noce, ne croyez pas qu'elle se soit refroidie de
suite... Et la grande qui est là ne sort pas de la fabrique du mari, je
vous l'affirme!... Une histoire pas propre... Un petit jeune homme
que le mari s'en servait pour ses élections, pendant que la femme
s'en régalait... et, un beau jour, je te plaque!... si bien que lui en est
devenu loufoque et qu'il a ingurgité une mauvaise drogue dont il a
passé!...
Cady, sur laquelle jusqu'alors coulait le verbiage de la cuisinière sans
qu'elle parût l'entendre, tourna la tête et ses yeux assombris
s'attachèrent avidement sur la bavarde.
Celle-ci poursuivit, buvant toujours son mélange à petits coups;
tandis que sa voix s'empâtait peu à peu:
—Ensuite, ça a été un autre jeune homme, et puis un ministre...
Lorsque, tout à coup, elle a dételé, croyez bien que c'est parce
qu'elle était trop esquintée pour risquer le coup... Un jour, elle s'a
fait faire un affront, dont elle n'est pas revenue... Et c'est pour lors
qu'elle n'a plus trotté après les hommes... Mais, ce qu'elle s'en est
appuyé, la salope!...
Lentement, la tête de Cady s'était courbée. Du doigt, elle traçait
inconsciemment des dessins sur la nappe. Elle se sentait
singulièrement étourdie, avec une sorte de nausée.
La femme du concierge toucha doucement son coude, murmurant
avec timidité:
—Si vous n'avez plus faim, mademoiselle, vous feriez peut-être
mieux d'aller vous coucher.
Cady ne répondit pas, ne bougea pas, paralysée par une invincible
inertie.
Cependant, le repas s'avançait. Une des jeunes femmes de chambre
s'étira.
—Ah! on a assez mangé!... Si on danserait?
—Et la musique?
L'Anglaise se jeta un verre de champagne dans le gosier et se
dressa, inspirée:
—Oui, la gigue!...
Le maître d'hôtel rit.
—L'ont-ils dans le sang, leur danse, ces Angliches!
Le cuisinier, qui avait fait des saisons à Morgate, se mit à siffler un
«hornpipe» célèbre.
Des applaudissements éclatèrent.
—Bravo!... La gigue, l'Anglaise!...
Valentin avait couru à la cuisine et rapporté deux poêles et des
cuillers de bois.
—V'là l'accompagnement!...
Le gros valet et le maître d'hôtel s'emparèrent des poêles sur
lesquelles ils frappèrent à tour de bras, pendant que le cuisinier
dirigeait le rythme de son sifflet aigu.
Comme irrésistiblement emportée, l'Anglaise bondit au milieu de la
pièce et se mit à se démener.
—Cré bon Dieu! elle en a tout de même du nerf! constata avec
stupéfaction le valet de chambre replet.
En face de la miss, Valentin, toujours coiffé de son haut de forme,
gigotait de son mieux.
—Ça va-t-il?
—Bravo!
—Ah! bon sang, ce qu'on sue!
Et le jeune homme retira sa chemise, aux applaudissements et aux
rires énervés de l'assistance féminine, restant le torse complètement
nu, blanc et imberbe.
Très allumé, le maître d'hôtel brailla:
—A toi, l'Anglaise!
L'ivrognesse entendit, et, en une seconde déchira, arracha ses
vêtements, sans cesser de danser, apparut entièrement nue, tandis
que de véritables hurlements joyeux et des tempêtes de rire
éclataient.
Debout, droite, les mains nouées derrière le dos, Cady contemplait,
impassible, ce spectacle: la nudité épileptique de l'Anglaise, celle à
peine plus décente du valet, ainsi que les faces congestionnées
d'hystérie et de lubricité des spectateurs.
La concierge répéta de nouveau près d'elle, d'une douce voix
suppliante:
—Mademoiselle, allez-vous-en!...
Mais, sans l'écouter, frappée par un fait inattendu, qui la fit
subitement sortir de son apparente indifférence, la fillette eut un
tressaillement violent et s'élança en avant avec un cri d'indignation.
—Baby!... Que fais-tu, Baby!
Grisée, folle, la petite Jeanne, par esprit d'imitation, venait de
dégrafer sa robe, et, aux côtés de sa gouvernante, agitait de toutes
ses forces ses petits membres nus sous la chemise courte.
—La gigue!... Je veux danser la gigue avec Miss! bégayait-elle en
titubant, les yeux troubles.
Personne ne l'écoutait ni ne la remarquait. Le sifflet du cuisinier
claironnait l'air monotone, les poêles heurtées résonnaient de plus
en plus fort, des houles de rires et d'encouragements aux danseurs
emplissaient la pièce.
Cady bondit sur sa sœur, et, malgré la résistance de l'enfant, l'enleva
dans ses bras et fuit en l'emportant, tout son être soulevé de colère
et d'horreur. Une sorte d'instinct maternel se levait en elle pour
préserver sa jeune sœur, alors que pour elle-même, elle demeurait
indifférente, déjà blasée.
Précisément à cette minute, l'Anglaise s'effondrait à terre, sa gorge
s'écrasant sur le tapis, vomissant des flots de boisson avec d'atroces
haut-le-cœur.
Des cris de protestation s'élevèrent.
—En voilà un choléra! s'écria Maria en se bouchant le nez.
Ce fut une débandade générale. La femme de ménage resta seule
pour réparer le désastre, ranger la pièce et traîner péniblement le
corps de la gouvernante jusqu'à sa chambre.
XXI
Tandis que Cady se réveillait difficilement, toute courbaturée, la
pensée vague, noyée en cette onde imprécise de tristesse et de
souffrance qui suit les sommeils agités d'impressions et de
ressouvenirs pénibles, Mlle Armande sauta à bas de son lit et
s'habilla en chantonnant, alerte, radieuse.
—Comme vous êtes paresseuse, Cady!
Et, tout de suite, elle lui annonça une bonne nouvelle, sans se
préoccuper des réflexions et des déductions que pourrait faire la
jeune fille.
—Votre père va vous donner un piano pour vous toute seule, sur
lequel vous jouerez tant que cela vous fera plaisir.
Ces paroles inattendues eurent raison de l'apathie de Cady. Elle se
souleva dans sa couchette, ses deux bras nus allongés sur la
couverture.
—Un piano pour moi?... Et, où sera-t-il?
—Ici, naturellement. Ah! il faut que je vous aime bien, Cady!... Car,
je déteste la musique, et vous allez me donner d'affreuses
migraines!...
Cady se balançait dans son lit comme un jeune ours.
—Un piano ici, pour moi? répéta-t-elle incrédule. Et je pourrai
étudier quand je voudrai?... C'est papa qui vous a dit cela?
L'institutrice hocha la tête triomphalement, tâtant, pour la dixième
fois depuis cinq minutes, au fond de sa poche, le petit carnet de cuir
fauve qui contenait le billet de cinq cents francs que le député lui
avait remis la nuit précédente.
—Oui, votre père lui même... Ah! il est généreux quand il s'y met!...
Elle délirait, entrevoyant un avenir doré, échafaudant des projets,
des rêves sans nombre.
Gagnée à présent d'une fébrilité, Cady s'habilla rapidement.
—Et où est-il le piano?
Mlle Armande éclata de rire.
—Chez le marchand, pardi!...
—Et quand l'aurai-je?
—Ah! je ne sais pas!... Bientôt.
Et, elle reprit vivement:
—N'allez pas en parler à votre père. Je ne suis pas censée le savoir.
Cady fronça les sourcils, froissée à vif par un enchaînement de
pensées. D'ailleurs, ce malaise s'effaça vite. Elle questionna:
—C'est vous qui lui avez demandé ce piano pour moi?
—C'est-à-dire que, je ne sais à propos de quoi, j'ai dit à votre père
combien vous aviez du talent pour votre âge, et quel chagrin c'était
pour vous de ne pouvoir travailler que chez votre professeur, puisque
votre maman ne vous permet pas de jouer sur le piano du salon.
Alors, comme probablement il était très content à ce moment-là, il
s'est écrié: «Eh bien! je vais lui en payer un, à ma petite fille, elle
l'aura chez elle, et tapera dessus à sa fantaisie!»
Jetant alors les yeux sur la physionomie ambiguë de Cady,
l'institutrice ajouta, d'un accent dépité:
—Vous pourriez me dire merci!
La fillette tressaillit et prononça du bout des lèvres!
—Je vous remercie.
—Quel ton!... Quelle enfant désagréable vous faites!... Si j'avais su,
je vous réponds que je n'aurais pas pris cette peine!
Un éclair de colère étincela dans le regard de Cady. Elle fit un grand
geste et cria d'une voix stridente:
—Faut-il aussi que je vous remercie parce que vous couchez avec
papa?
Mlle Armande, cramoisie, furibonde, s'élança vers elle, menaçante.
—Petit monstre!... Petite grossière!... Petite menteuse!...
La porte du cabinet de toilette se ferma à un doigt de son nez et l'on
entendit Cady se verrouiller sauvagement à l'intérieur.
Mlle Armande revint se jeter dans le fauteuil, toute haletante.
—Ah Dieu! faut-il en supporter! gémit-elle, en frappant furieusement
ses talons sur le sol.

Après le dîner tout intime, où assistaient seulement Listonnet et


Malifer, les deux secrétaires politiques du député, le peintre Jacques
Laumière, et Maurice Deber, le fonctionnaire colonial à la veille de
son départ pour l'Indo-Chine, Cyprien Darquet arrêta sa fille au
moment où elle disparaissait discrètement, accompagnée de son
institutrice.
—Reste, Cady.
Le cœur tressautant, car elle devinait qu'il serait question du piano,
la fillette s'immobilisa. Mlle Armande hésita sur le seuil; puis, comme
aucune invitation pour elle ne suivait, elle acheva de sortir, rouge et
vexée.
Le député attira sa fille qui approchait à petits pas, les yeux brillants
et interrogateurs.
—Dis-moi, tu étudies toujours le piano?
—Oui, papa.
—Cela t'amuse?
—Oh! oui, s'écria l'enfant ardemment.
—Cela te ferait plaisir d'avoir un instrument chez toi?
La réalisation de son rêve, de l'espoir qui l'avait bouleversée pendant
toute la journée suffoqua la fillette, qui ne répondit que par un
balbutiement inintelligible.
Mme Darquet abandonna sa conversation avec Laumière pour jeter
d'un air alarmé:
—Vous êtes fou, Cyprien?... Vous savez bien que je ne puis
supporter les études de piano!
—Aussi, répliqua M. Darquet, s'agit-il de placer un piano chez Cady.
Son appartement est suffisamment séparé des nôtres pour que le
bruit ne vous gêne pas.
Mme Darquet insista, contrariée.
—Cela n'est pas sûr!... Les domestiques sont si négligents... Les
portes de communication ne sont que trop souvent ouvertes.
D'ailleurs, Cady est une élève déplorable et des leçons au dehors,
constamment surveillées, lui sont infiniment plus profitables.
Malgré l'indignation, la révolte et la douleur bouillonnant en elle,
Cady se taisait, sans une objection. Mais son regard ému et
suppliant s'attachait avec une telle éloquence sur son père que celui-
ci sourit, caressant la fillette de sa grosse main lourde qui faisait plier
le corps frêle sous son poids amical.
—Rassure-toi, Cady, tu l'auras, ton instrument... Ah! si, toutefois, tu
peux me jouer quelque chose de passable... Allons! mets-toi au
piano et barbotte...
Cady se sentit défaillir. Une sueur froide humectait ses tempes et ses
paumes.
Jouer!... Jouer devant «du monde»!... Jouer pour cet auditoire froid,
indifférent, incompréhensif!...
—Jouer quoi?... balbutia-t-elle, éperdue.
—N'importe!... une bêtise quelconque. Tu sais bien quelque chose
par cœur?
—Non, non! rien par cœur, je joue toujours avec la musique! dit
Cady précipitamment.
Mme Darquet intervint encore, avec mécontentement:
—Voilà qui est absurde!... Je dirai à Mlle Lavernière qu'elle veille à ce
que tu exécutes tous tes morceaux de mémoire... C'est
indispensable. Te vois-tu, plus tard, dans le monde, apportant ta
musique, comme une artiste, ou alors incapable de jouer!... A quoi
bon travailler, si l'on ne peut pas se produire?...
La tête basse, Cady retenait les paroles passionnées qui faisaient
frémir ses lèvres.
Jouer, mon Dieu?... Mais l'on jouait d'abord et surtout pour soi!...
Cependant, comme M. Darquet faisait mine de se fâcher, elle
rassembla tout son courage et courut au casier de musique, avec le
rappel de certain cahier...
Elle annonça, un peu rassérénée, plaçant le volume sur le pupitre:
—Papa, si tu veux, je te jouerai une Romance sans paroles, de
Mendelssohn?
Maurice Deber, qui écoutait en buvant son café, sourit:
—Rien que cela, miss Cady!... Vous avez de l'ambition!...
Mme Darquet se leva avec ennui.
—Si nous faisions un bridge dans votre cabinet, mon ami?
Cyprien acquiesça avec empressement.
—Excellente idée!... Venez-vous, Deber?
Le jeune homme se récusa:
—Je vous avoue que je n'y entends rien... Et, si vous le permettez,
je resterai à écouter Mlle Cady.
Quant à Laumière, il eut un geste d'effroi simulé:
—Un bridge!... Le cauchemar des salons!... Vous ne voulez pas ma
mort, chère madame?... D'ailleurs, vous voyez comme je suis
agréablement occupé.
Dînant chaque quinzaine chez les Darquet, le jeune peintre, très
curieux de littérature et de publications nouvelles, fouillait en toute
liberté dans le tas de volumes, de revues, de brochures que le
député recevait, sans jamais y jeter un coup d'œil. Laumière passait
sa soirée à parcourir ce butin et faisait son choix, qu'il emportait
ensuite.
C'était chose convenue; aussi n'insista-t-on point pour le distraire; et
la partie s'organisa entre les maîtres de la maison et les deux
secrétaires.
Soulagée par la fuite de son auditoire, Cady ouvrit le piano et
l'essaya en sourdine.
—Quel sabot, fit-elle avec une grimace.
Deber s'était installé près d'elle, dans un fauteuil.
—Allons, miss Cady, décidez-vous, fit-il en souriant avec indulgence.
Je suppose que je ne vous intimide pas?
—Oh! mon Dieu, non! répondit-elle en riant.
Et elle attaqua très doucement le morceau choisi.
C'était une pièce d'une sentimentalité passablement vulgaire, mais
Cady la jouait avec une simplicité, une discrétion, qui en faisaient
une chose vraiment charmante.
Deber écoutait, surpris et séduit, les yeux attachés sur le visage de
la pianiste qui, dans l'immobilité et l'application, reprenait toute la
juvénilité fuyant parfois cette physionomie de petite Parisienne
précoce.
Quand elle s'arrêta et se détourna lentement, il dit malgré lui:
—Qui vous a appris à jouer ce morceau de cette façon?
Elle secoua la tête.
—Personne.
Il l'examinait curieusement.
—Comment, à votre âge, savez-vous lui donner cette expression?
Le rire de Cady fusa.
—Oh! ça, je ne sais pas!... Je fais les notes, voilà tout!...
Il l'étudiait intensément, de plus en plus intéressé.
—Non, non, murmura-t-il. La musique ce n'est pas simplement «faire
les notes».
Et, presque durement:
—A quoi songez-vous quand vous jouez?
La fillette lui lança un regard énigmatique.
—Moi?... A rien... Je vis dans la musique, c'est bien assez.
Il répéta, frappé:
—«Je vis dans la musique.» Savez-vous que c'est très profond ce
que vous venez de dire là, petite fille!...
Mais Cady, préoccupée, ne l'écoutait plus.
—Papa, est-ce bien?
La voix indifférente de Cyprien traversa le salon.
—Très bien, mignonne... Tu auras ton joujou. Dès demain, tu
viendras le choisir avec moi.
A ces mots consacrant définitivement une joie dont elle avait
toujours douté, Cady fauchée par l'émotion s'abattit sur le clavier, la
figure cachée dans ses mains, en poussant une série de petits cris
inarticulés.
—Vous êtes contente? demanda Deber.
Elle releva un visage radieux.
—Vous voyez bien!... Quand je fais le petit cochon joyeux, c'est que
je ne sais plus exprimer combien je suis heureuse.
Les yeux du jeune homme ne la quittaient pas.
—Quelle nature curieuse et attachante! laissa-t-il tomber
involontairement.
Elle lui jeta un regard vif.
—Je croyais que vous me trouviez insupportable? Vous m'avez
appelée «jeune monstre sans aucun intérêt».
Il rit.
—Vous vous souvenez de cela?
—On se souvient toujours des choses désagréables.
Il fit un geste.
—Bah! que vous importe le jugement d'un individu qui part dans
trois jours pour six ans! Quand je reviendrai, je serai pour de bon un
«vieux monsieur grognon», ajouta-t-il en citant les paroles que Cady
avait eues pour lui naguère.
Elle l'examinait avec attention.
—Non, vous n'avez pas l'air vieux... Et, ce soir, vous n'êtes point
grognon.
Il salua.
—Enchanté de votre nouvelle appréciation! Alors, nous nous
séparerons avec, mutuellement, une meilleure impression que lors
de notre première entrevue?
Elle demanda, coquettement:
—Vous penserez à moi, là-bas?
Son ton déplut au jeune homme, qui fronça les sourcils et répondit
sèchement:
—Ma foi, il est probable que j'aurai d'autres occupations!...
Puis, il se radoucit et prit la main de la fillette amicalement.
—Savez-vous ce que je vous souhaite pendant ces six ans?
—Non.
—Eh bien, de rajeunir... Afin que je retrouve non pas une petite
poupée truquée comme à présent, mais une vraie jeune fille.
Elle questionna, avec un rappel soudain.
—Quand vous reviendrez, voudrez-vous m'apporter un diamant dans
sa gangue comme celui de papa?
Il la regarda fixement et dit avec lenteur:
—Oui... Je vous apporterai un diamant... Mais un diamant
débarrassé de sa vilaine enveloppe... Et je vous promets qu'il sera à
vous... si, vous aussi, vous avez rejeté votre gangue.
Elle fit un geste d'impatience.
—Vous parlez déjà chinois, monsieur Deber.
Il sourit.
—Tant mieux si vous ne me comprenez pas... C'est signe que vous
êtes heureusement plus enfant que vous n'en avez l'air.
Jacques Laumière, ayant achevé son choix de livres, approcha.
—Que jabotez-vous tous deux? Vous êtes donc réconciliés?
—Oui, répondit Maurice.
Cady fit la moue.
—On verra cela dans six ans.
—Diable! pourquoi ce long terme?
—Lorsqu'il reviendra d'Indo-Chine.
Laumière fit un grand geste.
—Six ans! Que serons-nous devenus, grand Dieu, dans six ans! Toi,
Cady, tu seras mariée.
Welcome to our website – the ideal destination for book lovers and
knowledge seekers. With a mission to inspire endlessly, we offer a
vast collection of books, ranging from classic literary works to
specialized publications, self-development books, and children's
literature. Each book is a new journey of discovery, expanding
knowledge and enriching the soul of the reade

Our website is not just a platform for buying books, but a bridge
connecting readers to the timeless values of culture and wisdom. With
an elegant, user-friendly interface and an intelligent search system,
we are committed to providing a quick and convenient shopping
experience. Additionally, our special promotions and home delivery
services ensure that you save time and fully enjoy the joy of reading.

Let us accompany you on the journey of exploring knowledge and


personal growth!

textbookfull.com

You might also like