Difference between revisions of "Guide for good coding"
Romain.vande (talk | contribs) (→How to create a new module/subroutine) |
Romain.vande (talk | contribs) (→How to pass variable to subroutine (by argument or by module)) |
||
Line 120: | Line 120: | ||
== How to pass variable to subroutine (by argument or by module) == | == How to pass variable to subroutine (by argument or by module) == | ||
+ | |||
+ | Define when we should use argument and when to use modules | ||
== Naming variables convention == | == Naming variables convention == |
Revision as of 12:11, 5 January 2023
Contents
How to create a new module/subroutine
Subroutines should be integrated inside a module. A good writing habit is to add the line "IMPLICIT NONE", in the beginning of the module and subroutine.
First you can define all the variable that belongs to the module and could be used at another place. A good thing is also to create a subroutine that allocate and initialise module variables. If the variable is only modified inside the module it should be taged as protected. If the variable belongs only to the module it can be specified to be private.
You can now start the definition of the subroutine. Start by variable and function from other module if necessary. Comment the purpose of the subroutine directly. Declare the variables, first the one pass in arguments. Use the intent to specify the status of the variable inside the subroutine. Continue with the local and saved variables. Then you can define local variables. Remember to comment all of them, you can specify the dimension if the variable is an allocatable variable as well as the units and everything that seems appropriate.
You can finally write the code.
1 MODULE aquarium_mod
2
3 IMPLICIT NONE
4
5 INTEGER :: water ! Define what is the variable, the dimension, units (°) etc...
6 REAL,SAVE,ALLOCATABLE,DIMENSION(:) :: kre1 ! Another comment
7
8 CONTAINS
9
10 c===== subroutine 1
11
12 SUBROUTINE ini_aquarium(ngrid)
13 c=======================================================================
14 c Initialise module s variable
15 c=======================================================================
16 IMPLICIT NONE
17 INTEGER, INTENT(IN) :: ngrid
18
19 allocate(kre1(ngrid+1))
20
21 END SUBROUTINE ini_aquarium
22
23 c===== subroutine 2
24
25 SUBROUTINE end_aquarium
26 c=======================================================================
27 c Deallocate module s variable
28 c=======================================================================
29
30 IMPLICIT NONE
31
32 IF (allocated(kre1)) deallocate(kre1)
33
34 END SUBROUTINE end_aquarium
35
36 c===== subroutine 3
37
38 SUBROUTINE aquarium(kre, grass, other_things
39 & really_anything)
40
41 use another_module_mod, only: fct, variable
42
43 c=======================================================================
44 c subject:
45 c --------
46 c What is the subroutine doing
47 c
48 c author: Someone smart
49 c ------
50 c update: Someone smarter, march 2012:
51 c - I change something here
52 c
53 c=======================================================================
54
55 IMPLICIT NONE
56
57 c-----------------------------------------------------------------------
58 c
59 c Declarations :
60 c --------------
61 c
62 c Input/Output
63 c ------------
64
65 REAL, INTENT(IN) :: something(ngrid,nlayer) ! 2D tabular used as an input only (W/m^2)
66 REAL, INTENT(OUT) :: kre(ngrid) ! 1D tabular output by the subroutine
67 REAL, INTENT(INOUT) :: grass(ngrid,nlayer) ! Variable that is modified by the subroutine
68 ! it is an input and output
69 LOGICAL,INTENT(IN) :: really_anything ! Boolean variable
70
71 c Local saved variables :
72 c -----------------
73 INTEGER, PARAMETER :: nb_kre = 6 ! Number of kre
74 INTEGER, SAVE :: rock ! Another variable
75 LOGICAL,SAVE :: firstcall=.true. ! Another variable
76
77 c Local variables :
78 c -----------------
79 REAL tabular(ngrid) ! Local var
80 INTEGER i ! Loop var
81
82 c Beginning of the code :
83 c -----------------
84
85 IF (firstcall) THEN
86 ! identify where are the kre
87 DO i=1,nb_kre
88 kre(i)=i
89 write(*,*) "the Kre ", i, "is behind the rock"
90 ENDDO !end of the loop nb_kre
91 ENDIF !end firstcall
92
93 END SUBROUTINE aeropacity
94
95 END MODULE aeropacity_mod
How to pass variable to subroutine (by argument or by module)
Define when we should use argument and when to use modules