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

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

merged trunk-jpl and trunk for revision 14066

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