forked from DHI-GRAS/qgis-processing-swat
-
Notifications
You must be signed in to change notification settings - Fork 0
/
MDWF_Sensan_b.py
117 lines (110 loc) · 5.89 KB
/
MDWF_Sensan_b.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
"""
***************************************************************************
MDWF_Sensan_b.py
-------------------------------------
Copyright (C) 2014 TIGER-NET (www.tiger-net.org)
***************************************************************************
* This plugin is part of the Water Observation Information System (WOIS) *
* developed under the TIGER-NET project funded by the European Space *
* Agency as part of the long-term TIGER initiative aiming at promoting *
* the use of Earth Observation (EO) for improved Integrated Water *
* Resources Management (IWRM) in Africa. *
* *
* WOIS is a free software i.e. you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published *
* by the Free Software Foundation, either version 3 of the License, *
* or (at your option) any later version. *
* *
* WOIS is distributed in the hope that it will be useful, but WITHOUT ANY *
* WARRANTY; without even the implied warranty of MERCHANTABILITY or *
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License *
* for more details. *
* *
* You should have received a copy of the GNU General Public License along *
* with this program. If not, see <http://www.gnu.org/licenses/>. *
***************************************************************************
"""
import os
from PyQt4 import QtGui
from processing.core.GeoAlgorithmExecutionException import GeoAlgorithmExecutionException
from processing.core.parameters import *
from SWATAlgorithm import SWATAlgorithm
from SWAT_SENSAN_specs import SWAT_SENSAN_specs
from ModelFile import ModelFile
from ParVarFile import ParVarFile
class MDWF_Sensan_b(SWATAlgorithm):
MODEL_FILE = "MODEL_FILE"
SRC_FOLDER = "SRC_FOLDER"
PARVAR = "PARVAR"
SWAT_EXE = "SWAT_EXE"
def __init__(self):
super(MDWF_Sensan_b, self).__init__(__file__)
def defineCharacteristics(self):
self.name = "5.4 - Sensitivity analysis and calibration of SWAT model with PEST (MDWF) - generate SENSAN control file"
self.group = "Model development workflow (MDWF)"
self.addParameter(ParameterFile(MDWF_Sensan_b.MODEL_FILE, "Model description file", False, False))
self.addParameter(ParameterFile(MDWF_Sensan_b.SRC_FOLDER, "Select model source folder", True))
self.addParameter(ParameterFile(MDWF_Sensan_b.PARVAR, "Parameter variation file", False, False))
self.addParameter(ParameterFile(MDWF_Sensan_b.SWAT_EXE, "SWAT executable", False, False))
def processAlgorithm(self, progress):
sensanspecs = SWAT_SENSAN_specs()
MODEL_FILE = self.getParameterValue(MDWF_Sensan_b.MODEL_FILE)
SRC_FOLDER = self.getParameterValue(MDWF_Sensan_b.SRC_FOLDER)
PARVAR_FILE = self.getParameterValue(MDWF_Sensan_b.PARVAR)
SWAT_EXE = self.getParameterValue(MDWF_Sensan_b.SWAT_EXE)
model = ModelFile(MODEL_FILE)
ctlfilename = SRC_FOLDER + os.sep + model.desc['ModelName'] + '.sns'
ctlfile = open(ctlfilename,'w')
ctlfile.writelines(sensanspecs.CFfirstline + '\n')
ctlfile.writelines('* control data\n')
ctlfile.writelines(str(sensanspecs.SCREENDISP).ljust(10)+'\n')
#find number of parameters
filelist = os.listdir(SRC_FOLDER)
NPAR = 0
PARBLOCK = []
for f in filelist:
if '.pbf' in f:
NPAR = NPAR + 1
#verify parameter variation file
ParVarFile(PARVAR_FILE, NPAR)
#find number of observations
OBSBLOCK = []
for f in filelist:
if 'observation_block.obf' in f:
cobsblock = open(SRC_FOLDER + os.sep + f).readlines()
for i in range(0,len(cobsblock)):
OBSBLOCK.append(cobsblock[i])
NOBS = len(OBSBLOCK)
if NPAR > 0 and NOBS > 0:
ctlfile.writelines(str(NPAR).ljust(4) + str(NOBS).ljust(7) + '\n')
else:
raise GeoAlgorithmExecutionException('Number of observations and number of parameters must be larger than zero')
#find number of template files and prepare template block
NTPLFLE = 0
TPLBLOCK = []
for f in filelist:
if '.tpl' in f:
TPLBLOCK.append(f + ' ' + f.split('.')[0].split('_')[0] + '.' + f.split('.')[0].split('_')[1] + '\n')
NTPLFLE = NTPLFLE + 1
#find number of instruction files and prepare instruction block
NINSFLE = 0
INSBLOCK = []
for f in filelist:
if '.ins' in f:
INSBLOCK.append(f + ' output.rch\n')
NINSFLE = NINSFLE + 1
if NTPLFLE > 0 and NINSFLE > 0:
ctlfile.writelines(str(NTPLFLE).ljust(4) + str(NINSFLE).ljust(4) + str(sensanspecs.PRECIS).ljust(7) + str(sensanspecs.DPOINT).ljust(8) + '\n')
else:
raise GeoAlgorithmExecutionException('Number of template files and number of instruction files must be larger than zero')
ctlfile.writelines('* sensan files\n')
ctlfile.writelines(os.path.split(PARVAR_FILE)[1] + '\n')
ctlfile.writelines(str(sensanspecs.ABSFLE) + '\n')
ctlfile.writelines(str(sensanspecs.RELFLE) + '\n')
ctlfile.writelines(str(sensanspecs.SENSFLE) + '\n')
ctlfile.writelines('* model command line\n')
ctlfile.writelines(SWAT_EXE + '> nul\n')
ctlfile.writelines('* model input/output\n')
ctlfile.writelines(TPLBLOCK)
ctlfile.writelines(INSBLOCK)
ctlfile.close()