New URL for NEMO forge!   http://forge.nemo-ocean.eu

Since March 2022 along with NEMO 4.2 release, the code development moved to a self-hosted GitLab.
This present forge is now archived and remained online for history.
create_templates.py in utils/tools/SIREN/templates – NEMO

source: utils/tools/SIREN/templates/create_templates.py @ 12080

Last change on this file since 12080 was 12080, checked in by jpaul, 4 years ago

update nemo trunk

File size: 3.5 KB
Line 
1#!/usr/bin/python
2# -*- coding:Utf-8 -*-
3"""
4This script create template of namelist for Siren.
5
6see create_templates.py --help
7"""
8import os
9import argparse
10import re
11
12def get_default(i,var):
13    """
14    Parameters
15    ----------
16    i: str
17       input filename
18    var: str
19       variable name
20    """
21    with open(i) as f:
22        for line in f:
23            line=line.strip()
24            if re.match('.*::.*'+var+'.*', line):
25                return line.split("::")[1].split("=")[1]
26
27
28def get_nam(i,o,d):
29    """
30    Copy input file in output file, line by line.
31   
32    If line contains filterlist parameter and src:
33        - copy the line without the src option
34        - copy the file to be include line by line
35
36    Parameters
37    ----------
38    i: str
39       input filename
40    o: str
41       output filename
42    d: bool
43       added default value
44    """
45    with open(i) as f:
46        inRecordingMode = False
47        for line in f:
48            line=line.strip()
49            if not inRecordingMode:
50                if line.startswith('NAMELIST'):
51                    inRecordingMode = True
52                    nam='&'+line.split('/')[1]
53                    cmt=''
54                    if re.match('^.*!<.*$', line):
55                        cmt='!< '+line.split('!<')[1]
56                    print("{0:10} {1}".format(nam,cmt),file=o)
57            else:
58                if line.startswith('NAMELIST') or not line:
59                    inRecordingMode = False
60                    print("/",file=o)
61                else:
62                    if not line.startswith('!'):
63                        var=line.split('&')[1].split(',')[0].split()[0]
64                        if re.match('^.*!<.*$', line):
65                            cmt='!< '+line.split('!<')[1]
66                        if d:
67                            val=get_default(i,var)
68                            print("\t {0:12} = {1:30} {2}".format(var,val,cmt),file=o)
69                        else:
70                            print("\t {0:12} = {1:30} {2}".format(var,"",cmt),file=o)
71
72
73
74def main():
75    """
76    Read Fortran src file and create template of namelist from it.
77    """
78    # define parser
79    parser = argparse.ArgumentParser(
80        prog="create_templates.py", description="Create template of namelist from Fortran src."
81    )
82    # positional arguments
83    parser.add_argument("input" , type=str, help="Fortran filename, to be read in Siren/src directory")
84    parser.add_argument("output", type=str, help="Output  filename, to be written in Siren/templates directory")
85    # optional arguments
86    parser.add_argument("-v", "--verbose", action="store_true", help="show more things")
87    parser.add_argument("-d", "--default", action="store_true", help="add default value for some variables")
88
89    # parse arguments
90    args = parser.parse_args()
91
92    if re.match('.*/.*', args.output):
93        raise NameError(
94                "Output filename must not be a path (should not contains /)."
95                )
96        print(args.output.split("/")[1])
97    fin=os.path.abspath(os.path.join("../src",args.input))
98    fout=os.path.abspath(os.path.join("../templates",args.output))
99    if args.verbose:
100        print("Input  file : {0}".format(fin))
101        print("Output file : {0}".format(fout))
102        if args.default:
103            print("\nAdd default value to some variables")
104
105    if not os.path.isfile(fin):
106        raise NameError(
107                "Can not find {0} in src directory".format(os.path.basename(fin))
108        )
109
110    with open(args.output,'w') as fout:
111        get_nam(fin,fout,args.default)
112
113if __name__ == "__main__":
114        main()
Note: See TracBrowser for help on using the repository browser.