source: XIOS/dev/dev_ym/XIOS_COUPLING/xios_test_suite/TEST_SUITE/step1.py @ 2301

Last change on this file since 2301 was 2301, checked in by jderouillat, 2 years ago

Enable scalar mask in the test suite

File size: 13.9 KB
Line 
1import glob
2import sys
3import subprocess
4import os
5import json
6import itertools
7import copy
8
9param_list =       ["DomMask",    "AxisMask", "ScalarMask", "Domain", "UseServer2", "NumberClients", "NumberServers", "PctServer2", "Duration", "OneSided", "NonDistTran"]
10param_short_list = ["DomMask",    "AxisMask", "ScaMask",    "Dom",    "Srv2",       "NbClnt",        "NbSrv",         "PctSrv2",    "Duration", "OneSided", "NDtTr"]
11
12mode=os.getenv("mode")
13arch=os.getenv("arch")
14enable_mem_track=os.getenv("enable_mem_track")
15machine=os.getenv("xios_machine_name")
16svnR=os.getenv("svnR")
17user_acct=os.getenv("user_account")
18
19nb_proc_irene=40 # this must be >= NumberClients+NumberServers for all configs for all test folders
20nb_proc_jz=40 # to run completly in parallel, this must be set to 40 for the moment
21              # otherwise, jobs should be regrouped by test folder. jobs in folder are parallel, folders are sequential
22              # in this case,nb_proc_jz >= sum(NumberClients+NumberServers) for each test folder
23
24def OSinfo(runthis):
25    red = lambda text: '\033[0;31m' + text + '\033[0m'
26    osstdout = subprocess.Popen(runthis, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, close_fds=True)
27    theInfo, theErr = osstdout.communicate()
28    #print( theInfo )
29    if theErr:
30        print(red(runthis+" FAILED"))
31        print(theErr)
32        sys.exit()
33
34def product_dict(**kwargs):
35    keys = kwargs.keys()
36    vals = kwargs.values()
37    for instance in itertools.product(*vals):
38        yield dict(zip(keys, instance))
39
40def get_default_param():
41    f=open("default_param.json", 'r')
42    default_param = json.load(f)
43    f.close()
44    l = list(default_param[0].items())
45    l.sort()
46    def_param=dict(l)
47    return def_param
48
49def get_test_type():
50    test_type = "basic"
51    if ( machine == "irene" ):
52        test_type = "advanced"
53    return test_type
54
55def generate_job(fn, n):
56    if machine=="irene":
57        with open(fn, "w") as fh:
58            fh.write("#!/bin/bash\n")
59            fh.write("#====================================================\n")
60            fh.write("# Generated by step1.py\n")
61            fh.write("# Called by my_run.sh -> run_test -> run_test_irene\n")
62            fh.write("# For Irene\n")
63            fh.write("#====================================================\n")
64            fh.write("#MSUB -r XIOS\n")
65            fh.write("#MSUB -eo\n")
66            fh.write("#MSUB -o client_output.out\n")
67            fh.write("#MSUB -e client_error.out\n")
68            fh.write("#MSUB -c 1\n")
69            fh.write("#MSUB -n "+str(n)+"\n")
70            fh.write("#MSUB -X\n")
71            fh.write("#MSUB -x\n")
72            fh.write("#MSUB -T 1800\n")
73            fh.write("#MSUB -q skylake\n")     
74            fh.write("#MSUB -A "+user_acct+"\n")
75            fh.write("#MSUB -Q test\n")
76            fh.write("#MSUB -m work,scratch\n")
77            fh.write("cp ../../build_"+arch+"_"+mode+"/bin/generic_testcase.exe ./\n")
78            fh.write("source ../../build_"+arch+"_"+mode+"/arch.env\n")
79            fh.write("ccc_mprun -n "+str(n)+" generic_testcase.exe\n")
80
81    if machine=="jeanzay":
82        with open(fn, "w") as fh:
83            fh.write("#!/bin/bash\n")
84            fh.write("#====================================================\n")
85            fh.write("# Generated by step1.py\n")
86            fh.write("# Called by my_run.sh -> run_test -> run_test_jeanzay\n")
87            fh.write("# For Jean-Zay\n")
88            fh.write("#====================================================\n")
89            fh.write("#SBATCH --ntasks="+str(n)+"\n")
90            fh.write("#SBATCH --hint=nomultithread\n")
91            fh.write("#SBATCH -o output.out\n")
92            fh.write("#SBATCH -e error.out\n")
93            fh.write("#SBATCH -t 00:10:00\n")
94            fh.write("#SBATCH --account="+user_acct+"\n")
95            fh.write("#SBATCH --exclusive\n")
96            fh.write("ulimit -c 0\n")
97            fh.write("cd ${SLURM_SUBMIT_DIR}\n")
98            fh.write("cp ../../build_"+arch+"_"+mode+"/bin/generic_testcase.exe ./\n")
99            fh.write("source ../../build_"+arch+"_"+mode+"/arch.env\n")
100            #fh.write("source $I_MPI_ROOT/intel64/bin/mpivars.sh release_mt\n")
101            fh.write("srun generic_testcase.exe")
102
103
104def update_full_job(location, n):
105    global my_counter
106    if machine=="irene":
107        with open("full_job_"+arch+"_"+mode+".sh", "a") as fh:
108            fh.write("\ncd ${location}/"+location+"; ccc_mprun -E \'--exclusive\' -n "+str(n)+" generic_testcase.exe > output_"+arch+"_"+mode+".out 2> error_"+arch+"_"+mode+".out &\n")
109            fh.write("PIDS+=($!)\n")
110            fh.write("CONFIGS+=("+location+")\n")
111    if machine=="jeanzay":
112        with open("full_job_"+arch+"_"+mode+".sh", "a") as fh:
113            fh.write("\ncd ${location}/"+location+"; srun --exclusive -n "+str(n)+" generic_testcase.exe > output_"+arch+"_"+mode+".out 2> error_"+arch+"_"+mode+".out &\n")
114
115def main():
116
117    if machine=="irene":
118        with open("full_job_"+arch+"_"+mode+".sh", "w") as fh:
119            fh.write("#!/bin/bash\n")
120            fh.write("#====================================================\n")
121            fh.write("# Generated by step1.py\n")
122            fh.write("# Called by my_run.sh -> run_test -> run_test_irene\n")
123            fh.write("#====================================================\n")
124            fh.write("#MSUB -r XIOS_rev"+svnR+"\n")
125            fh.write("#MSUB -eo\n")
126            fh.write("#MSUB -o output_"+arch+"_"+mode+".out\n")
127            fh.write("#MSUB -e error_"+arch+"_"+mode+".err\n")
128            fh.write("#MSUB -c 1\n")
129            fh.write("#MSUB -n "+str(nb_proc_irene)+"\n")
130            fh.write("#MSUB -X\n")
131            fh.write("#MSUB -x\n")
132            fh.write("#MSUB -T 1800\n")
133            fh.write("#MSUB -q skylake\n")     
134            fh.write("#MSUB -A "+user_acct+"\n")
135            fh.write("#MSUB -Q test\n")
136            fh.write("#MSUB -m work,scratch\n")
137            fh.write("export location="+os.getcwd()+"\n")
138            fh.write("export log_location="+os.getcwd()+"\n")
139            fh.write("source build_"+arch+"_"+mode+"/arch.env\n")
140            fh.write("echo \"parallel launch arch="+arch+" mode="+mode+"\" >> ${log_location}/Log.txt\n")
141            fh.write("date >> ${log_location}/Log.txt\n")
142     
143    if machine=="jeanzay":
144        with open("full_job_"+arch+"_"+mode+".sh", "w") as fh:
145            fh.write("#!/bin/bash\n")
146            fh.write("#====================================================\n")
147            fh.write("# Generated by step1.py\n")
148            fh.write("# Called by my_run.sh -> run_test -> run_test_jeanzay\n")
149            fh.write("#====================================================\n")
150            fh.write("#SBATCH --ntasks="+str(nb_proc_jz)+"\n")
151            fh.write("#SBATCH -o output_"+arch+"_"+mode+".out\n")
152            fh.write("#SBATCH -e error_"+arch+"_"+mode+".out\n")
153            fh.write("#SBATCH --hint=nomultithread\n")
154            fh.write("#SBATCH -t 00:10:00\n")
155            fh.write("#SBATCH --account="+user_acct+"\n")
156            fh.write("#SBATCH --job-name=XIOS_rev"+svnR+"\n")
157            fh.write("#SBATCH --exclusive\n")
158            fh.write("ulimit -c 0\n")
159            fh.write("cd ${SLURM_SUBMIT_DIR}\n")
160            fh.write("source build_"+arch+"_"+mode+"/arch.env\n")
161            #fh.write("source $I_MPI_ROOT/intel64/bin/mpivars.sh release_mt\n")
162            fh.write("export location="+os.getcwd()+"\n")
163            fh.write("export log_location="+os.getcwd()+"\n")
164            fh.write("echo \"parallel launch arch="+arch+" mode="+mode+"\" >> ${log_location}/Log.txt\n")
165            fh.write("date >> ${log_location}/Log.txt\n")
166
167
168
169    test_folder_list = glob.glob('test_*')
170    #all_config=dict()
171
172    default_param = get_default_param()
173    #print(default_param)
174
175    # default = basic, function( machine, arch, mode )
176    test_type = get_test_type()
177
178    for test_folder in test_folder_list:
179        # check if test concerns xios features (NetCDF), or memory consumption (mem files)
180        files_list=""
181        flist = open(test_folder+"/checkfile.def", 'r')
182        files_list = flist.read()
183        flist.close()
184        if ( enable_mem_track==None ) and ( not('.mem' in files_list) ) :
185            print( "test_folder = ", test_folder, " : launch std run")
186        elif ( enable_mem_track=='--memtrack full' ) and ( '.mem' in files_list ) :
187            print( "test_folder = ", test_folder, " : launch mem run")           
188        else :
189            continue
190
191        config_list=[]
192        config_name=[]
193        with open(test_folder+"/user_param_"+test_type+".json", "r") as f:
194            config_dict = json.load(f)
195
196        for i in range(len(config_dict)):
197            config_list.extend(list(product_dict(**config_dict[i])))
198            #print(config_list)
199        for i in range(len(config_list)):
200            # print(config_list[i])
201            keylist = list(config_list[i].keys())
202            # print(keylist)
203            full_config = copy.deepcopy(default_param)
204            for j in range(len(keylist)):
205                full_config[ keylist[j] ] = config_list[i][keylist[j]]
206
207            #print(full_config)
208            mystr = str(full_config)
209            mystr = mystr.replace("{", "")
210            mystr = mystr.replace("}", "")
211            mystr = mystr.replace("[", "")
212            mystr = mystr.replace("]", "")
213            mystr = mystr.replace(",", "")
214            mystr = mystr.replace(":", "")
215            mystr = mystr.replace("u'", "")
216            mystr = mystr.replace("b'", "")
217            mystr = mystr.replace("'", "")
218            mystr = mystr.replace(" ", "_")
219            for j in range(len(param_list)):
220                mystr = mystr.replace(param_list[j], param_short_list[j])
221            if not mystr in config_name:
222                config_name.append(mystr)
223            #print(mystr)
224            if ( os.path.isdir( test_folder+"/CONFIG_"+mystr ) ) :
225                OSinfo("rm -rf "+test_folder+"/CONFIG_"+mystr)
226            OSinfo("mkdir -p "+test_folder+"/CONFIG_"+mystr)
227            OSinfo("cp build_"+arch+"_"+mode+"/bin/generic_testcase.exe "+test_folder+"/CONFIG_"+mystr)
228            OSinfo("cp iodef.xml "+test_folder+"/CONFIG_"+mystr+"/iodef.xml.tmp")
229            OSinfo("cp "+test_folder+"/context_atm.xml "+test_folder+"/CONFIG_"+mystr+"/context_atm.xml.tmp")
230
231            with open(test_folder+"/CONFIG_"+mystr+"/iodef.xml.tmp", "r") as f:
232                lines = f.readlines()
233                for i in range(len(lines)):
234                    if "XIOS::" in lines[i]:
235                        config_keys = list(full_config.keys())
236                        for idx in range(len(config_keys)):
237                            lines[i] = lines[i].replace("XIOS::"+config_keys[idx], str(full_config[config_keys[idx]]))
238                with open(test_folder+"/CONFIG_"+mystr+"/iodef.xml", "w") as g:
239                    for line in lines:
240                        g.write(line)
241
242            with open(test_folder+"/CONFIG_"+mystr+"/context_atm.xml.tmp", "r") as f:
243                lines = f.readlines()
244                for i in range(len(lines)):
245                    if "XIOS::" in lines[i]:
246                        config_keys = list(full_config.keys())
247                        for idx in range(len(config_keys)):
248                            lines[i] = lines[i].replace("XIOS::"+config_keys[idx], str(full_config[config_keys[idx]]))
249                with open(test_folder+"/CONFIG_"+mystr+"/context_atm.xml", "w") as g:
250                    for line in lines:
251                        g.write(line)
252
253
254            OSinfo("rm -f "+test_folder+"/CONFIG_"+mystr+"/iodef.xml.tmp")
255            OSinfo("rm -f "+test_folder+"/CONFIG_"+mystr+"/context_atm.xml.tmp")
256            OSinfo("cp context_grid_dynamico.xml "+test_folder+"/CONFIG_"+mystr+"/")
257            OSinfo("cp dynamico_grid.nc "+test_folder+"/CONFIG_"+mystr+"/")
258            OSinfo("cp "+test_folder+"/checkfile.def "+test_folder+"/CONFIG_"+mystr+"/")
259            with open(test_folder+"/CONFIG_"+mystr+"/param.def", "w") as fh:
260                fh.write("&params_run\n")
261                fh.write("duration=\'"+full_config["Duration"]+"\'\n")
262                fh.write("nb_proc_atm="+str(full_config["NumberClients"])+"\n")
263                fh.write("/\n")
264            with open(test_folder+"/CONFIG_"+mystr+"/all_param.def", "w") as fh:
265                fh.write("&params_run\n")
266                for param in param_list:
267                    fh.write(param+"="+str(full_config[param])+"\n")
268                fh.write("/\n")
269
270            generate_job(test_folder+"/CONFIG_"+mystr+"/job_"+arch+"_"+mode+".sh", full_config['NumberClients']+full_config['NumberServers'])
271            update_full_job(test_folder+"/CONFIG_"+mystr, full_config['NumberClients']+full_config['NumberServers'])
272
273        #if machine=="jeanzay":
274        #    with open("full_job_"+arch+"_"+mode+".sh", "a") as fh:
275        #        fh.write("wait\nwait\n")
276        #        fh.write("echo \"tests in "+test_folder+" finished\"\n")
277        #all_config[test_folder] = config_name
278 
279
280    if machine=="irene":
281        with open("full_job_"+arch+"_"+mode+".sh", "a") as fh:
282            #fh.write("\nfor pid in ${PIDS[@]}; do\n")
283            #fh.write("wait ${pid}\n")
284            #fh.write("STATUS+=($?)\ndone\n")
285            #fh.write("\ni=0\n")
286            #fh.write("#for st in ${STATUS[@]}; do\n")
287            #fh.write("#if [[ ${st} -ne 0 ]]; then\n")
288            #fh.write("#echo \"${CONFIGS[${i}]} -1\" >> ${location}/plain_report.txt\n")
289            #fh.write("#else\n")
290            #fh.write("#echo \"${CONFIGS[${i}]} 1\" >> ${location}/plain_report.txt\n")
291            #fh.write("#fi\n")
292            #fh.write("#((i+=1))\n")
293            #fh.write("#done\n\n")
294            fh.write("wait\nwait\n")
295            fh.write("date >> ${log_location}/Log.txt\n")
296    if machine=="jeanzay":
297        with open("full_job_"+arch+"_"+mode+".sh", "a") as fh:
298            fh.write("wait\nwait\n")
299            fh.write("date >> ${log_location}/Log.txt\n")
300
301
302if __name__== "__main__":
303  main()
Note: See TracBrowser for help on using the repository browser.