[12842] | 1 | import numpy
|
---|
| 2 | import os
|
---|
| 3 | from pairoptions import *
|
---|
| 4 | from MatlabFuncs import *
|
---|
| 5 |
|
---|
| 6 | def 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:
|
---|
[13043] | 145 | if len(numpy.shape(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 |
|
---|