source: issm/trunk/src/m/consistency/checkfield.py@ 16137

Last change on this file since 16137 was 16137, checked in by Mathieu Morlighem, 12 years ago

merged trunk-jpl and trunk for revision 16135

File size: 6.0 KB
Line 
1import numpy
2import os
3from pairoptions import *
4from MatlabFuncs import *
5
6def checkfield(md,fieldname,*args):
7 """
8 CHECKFIELD - check field consistency
9
10 Used to check model consistency.
11 Available options:
12 - NaN: 1 if check that there is no NaN
13 - size: [lines cols], NaN for non checked dimensions
14 - >: greater than provided value
15 - >=: greater or equal to provided value
16 - <: smallerthan provided value
17 - <=: smaller or equal to provided value
18 - < vec: smallerthan provided values on each vertex
19 - forcing: 1 if check forcing consistency (size and time)
20 - values: cell of strings or vector of acceptable values
21 - numel: list of acceptable number of elements
22 - cell: 1 if check that is cell
23 - empty: 1 if check that non empty
24 - message: overloaded error message
25
26 Usage:
27 md = checkfield(md,fieldname,options);
28
29 Example:
30 md = checkfield(md,'mesh.elementonbed','size',[md.mesh.numberofelements 1],'values',[0 1]);
31 """
32
33 #get options
34 options=pairoptions(*args)
35
36 #get field from model
37# field=getattr(md,fieldname)
38 exec("field=md.%s" % fieldname)
39 if isinstance(field,(bool,int,long,float)):
40 field=numpy.array([field])
41
42 #check empty
43 if options.exist('empty'):
44 if not field:
45 md = md.checkmessage(options.getfieldvalue('message',\
46 "field '%s' is empty" % fieldname))
47
48 #Check size
49 if options.exist('size'):
50 fieldsize=options.getfieldvalue('size')
51 if len(fieldsize) == 1:
52 if numpy.isnan(fieldsize[0]):
53 pass
54 elif not numpy.size(field,0)==fieldsize[0]:
55 md = md.checkmessage(options.getfieldvalue('message',\
56 "field '%s' size should be %d" % (fieldname,fieldsize[0])))
57 elif len(fieldsize) == 2:
58 if numpy.isnan(fieldsize[0]):
59 if not numpy.size(field,1)==fieldsize[1]:
60 md = md.checkmessage(options.getfieldvalue('message',\
61 "field '%s' should have %d columns" % (fieldname,fieldsize[1])))
62 elif numpy.isnan(fieldsize[1]):
63 if not numpy.size(field,0)==fieldsize[0]:
64 md = md.checkmessage(options.getfieldvalue('message',\
65 "field '%s' should have %d lines" % (fieldname,fieldsize[0])))
66 else:
67 if (not numpy.size(field,0)==fieldsize[0]) or (not numpy.size(field,1)==fieldsize[1]):
68 md = md.checkmessage(options.getfieldvalue('message',\
69 "field '%s' size should be %d x %d" % (fieldname,fieldsize[0],fieldsize[1])))
70
71 #Check numel
72 if options.exist('numel'):
73 fieldnumel=options.getfieldvalue('numel')
74 if numpy.size(field) not in fieldnumel:
75 if len(fieldnumel)==1:
76 md = md.checkmessage(options.getfieldvalue('message',\
77 "field '%s' size should be %d" % (fieldname,fieldnumel)))
78 elif len(fieldnumel)==2:
79 md = md.checkmessage(options.getfieldvalue('message',\
80 "field '%s' size should be %d or %d" % (fieldname,fieldnumel[0],fieldnumel[1])))
81 else:
82 md = md.checkmessage(options.getfieldvalue('message',\
83 "field '%s' size should be %s" % (fieldname,fieldnumel)))
84
85 #check NaN
86 if options.getfieldvalue('NaN',0):
87 if numpy.any(numpy.isnan(field)):
88 md = md.checkmessage(options.getfieldvalue('message',\
89 "NaN values found in field '%s'" % fieldname))
90
91 #check cell
92 if options.getfieldvalue('cell',0):
93 if not isinstance(field,(tuple,list,dict)):
94 md = md.checkmessage(options.getfieldvalue('message',\
95 "field '%s' should be a cell" % fieldname))
96
97 #check values
98 if options.exist('values'):
99 fieldvalues=options.getfieldvalue('values')
100 if False in ismember(field,fieldvalues):
101 if len(fieldvalues)==1:
102 md = md.checkmessage(options.getfieldvalue('message',\
103 "field '%s' value should be '%s'" % (fieldname,fieldvalues[0])))
104 elif len(fieldvalues)==2:
105 md = md.checkmessage(options.getfieldvalue('message',\
106 "field '%s' values should be '%s' or '%s'" % (fieldname,fieldvalues[0],fieldvalues[1])))
107 else:
108 md = md.checkmessage(options.getfieldvalue('message',\
109 "field '%s' should have values in %s" % (fieldname,fieldvalues)))
110
111 #check greater
112 if options.exist('>='):
113 lowerbound=options.getfieldvalue('>=')
114 if numpy.any(field<lowerbound):
115 md = md.checkmessage(options.getfieldvalue('message',\
116 "field '%s' should have values above %d" % (fieldname,lowerbound)))
117 if options.exist('>'):
118 lowerbound=options.getfieldvalue('>')
119 if numpy.any(field<=lowerbound):
120 md = md.checkmessage(options.getfieldvalue('message',\
121 "field '%s' should have values above %d" % (fieldname,lowerbound)))
122
123 #check smaller
124 if options.exist('<='):
125 upperbound=options.getfieldvalue('<=')
126 if numpy.any(field>upperbound):
127 md = md.checkmessage(options.getfieldvalue('message',\
128 "field '%s' should have values below %d" % (fieldname,upperbound)))
129 if options.exist('<'):
130 upperbound=options.getfieldvalue('<')
131 if numpy.any(field>=upperbound):
132 md = md.checkmessage(options.getfieldvalue('message',\
133 "field '%s' should have values below %d" % (fieldname,upperbound)))
134
135 #check file
136 if options.getfieldvalue('file',0):
137 if not os.path.exists(field):
138 md = md.checkmessage("file provided in '%s': '%s' does not exist" % (fieldname,field))
139
140 #Check forcings (size and times)
141 if options.getfieldvalue('forcing',0):
142 if numpy.size(field,0)==md.mesh.numberofvertices:
143 if numpy.ndim(field)>1 and not numpy.size(field,1)==1:
144 md = md.checkmessage(options.getfieldvalue('message',\
145 "field '%s' should have only one column as there are md.mesh.numberofvertices lines" % fieldname))
146 elif numpy.size(field,0)==md.mesh.numberofvertices+1:
147 if not all(field[-1,:]==numpy.sort(field[-1,:])):
148 md = md.checkmessage(options.getfieldvalue('message',\
149 "field '%s' columns should be sorted chronologically" % fieldname))
150 if any(field[-1,0:-1]==field[-1,1:]):
151 md = md.checkmessage(options.getfieldvalue('message',\
152 "field '%s' columns must not contain duplicate timesteps" % fieldname))
153 else:
154 md = md.checkmessage(options.getfieldvalue('message',\
155 "field '%s' should have md.mesh.numberofvertices or md.mesh.numberofvertices+1 lines" % fieldname))
156
157 return md
158
Note: See TracBrowser for help on using the repository browser.