source: issm/trunk-jpl/src/py3/classes/qmu.py@ 19895

Last change on this file since 19895 was 19895, checked in by bdef, 9 years ago

NEW:Adding directory to hold the python 3 implementation of the interface

File size: 5.8 KB
RevLine 
[19895]1import numpy
2from project3d import project3d
3from collections import OrderedDict
4from fielddisplay import fielddisplay
5from EnumDefinitions import *
6from checkfield import checkfield
7from WriteData import WriteData
8import MatlabFuncs as m
9
10class qmu(object):
11 """
12 QMU class definition
13
14 Usage:
15 qmu=qmu();
16 """
17
18 def __init__(self): # {{{
19 self.isdakota = 0
20 self.variables = OrderedDict()
21 self.responses = OrderedDict()
22 self.method = OrderedDict()
23 self.params = OrderedDict()
24 self.results = OrderedDict()
25 self.partition = float('NaN')
26 self.numberofpartitions = 0
27 self.numberofresponses = 0
28 self.variabledescriptors = []
29 self.responsedescriptors = []
30 self.mass_flux_profile_directory = float('NaN')
31 self.mass_flux_profiles = float('NaN')
32 self.mass_flux_segments = []
33 self.adjacency = float('NaN')
34 self.vertex_weight = float('NaN')
35
36 #set defaults
37 self.setdefaultparameters()
38
39 #}}}
40 def __repr__(self): # {{{
41 s =' qmu parameters:\n'
42
43 s+="%s\n" % fielddisplay(self,'isdakota','is qmu analysis activated?')
44 for i,variable in enumerate(self.variables.items()):
45 s+=" variables%s: (arrays of each variable class)\n" % \
46 string_dim(self.variables,i)
47 fnames=vars(variable)
48 maxlen=0
49 for fname in fnames:
50 maxlen=max(maxlen,len(fname))
51
52 for fname in fnames:
53 s+="' %-*s: [%ix%i] '%s'\n" % \
54 (maxlen+1,fname,size(getattr(variable,fname)),type(getattr(variable,fname)))
55
56 for i,response in enumerate(self.responses.items()):
57 s+=" responses%s: (arrays of each response class)\n" % \
58 string_dim(self.responses,i)
59 fnames=vars(response)
60 maxlen=0
61 for fname in fnames:
62 maxlen=max(maxlen,len(fname))
63
64 for fname in fnames:
65 s+=" %-*s: [%ix%i] '%s'\n" % \
66 (maxlen+1,fname,size(getattr(response,fname)),type(getattr(response,fname)))
67
68 s+="%s\n" % fielddisplay(self,'numberofresponses','number of responses')
69
70 for i,method in enumerate(self.method.items()):
71 if isinstance(method,'dakota_method'):
72 s+=" method%s : '%s'\n" % \
73 (string_dim(method,i),method.method)
74
75 for i,param in enumerate(self.params.items()):
76 s+=" params%s: (array of method-independent parameters)\n" % \
77 string_dim(self.params,i)
78 fnames=vars(param)
79 maxlen=0
80 for fname in fnames:
81 maxlen=max(maxlen,len(fname))
82
83 for fname in fnames:
84 s+=" %-*s: %s\n" % \
85 (maxlen+1,fname,any2str(getattr(param,fname)))
86
87 for i,result in enumerate(self.results.items()):
88 s+=" results%s: (information from dakota files)\n" % \
89 string_dim(self.results,i)
90 fnames=vars(result)
91 maxlen=0
92 for fname in fnames:
93 maxlen=max(maxlen,len(fname))
94
95 for fname in fnames:
96 s+=" %-*s: [%ix%i] '%s'\n" % \
97 (maxlen+1,fname,size(getattr(result,fname)),type(getattr(result,fname)))
98
99 s+="%s\n" % fielddisplay(self,'partition','user provided mesh partitioning, defaults to metis if not specified')
100 s+="%s\n" % fielddisplay(self,'numberofpartitions','number of partitions for semi-discrete qmu')
101 s+="%s\n" % fielddisplay(self,'variabledescriptors','')
102 s+="%s\n" % fielddisplay(self,'responsedescriptors','')
103 s+="%s\n" % fielddisplay(self,'method','array of dakota_method class')
104 s+="%s\n" % fielddisplay(self,'mass_flux_profile_directory','directory for mass flux profiles')
105 s+="%s\n" % fielddisplay(self,'mass_flux_profiles','list of mass_flux profiles')
106 s+="%s\n" % fielddisplay(self,'mass_flux_segments','')
107 s+="%s\n" % fielddisplay(self,'adjacency','')
108 s+="%s\n" % fielddisplay(self,'vertex_weight','weight applied to each mesh vertex')
109
110 return s
111 # }}}
112 def extrude(self,md): # {{{
113 self.partition=project3d(md,'vector',numpy.transpose(self.partition),'type','node')
114 return self
115 #}}}
116 def setdefaultparameters(self): # {{{
117 return self
118 #}}}
119 def checkconsistency(self,md,solution,analyses): # {{{
120
121 #Early return
122 if not md.qmu.isdakota:
123 return
124
125 if not md.qmu.params.evaluation_concurrency==1:
126 md.checkmessage("concurrency should be set to 1 when running dakota in library mode")
127 if md.qmu.partition:
128 if not numpy.size(md.qmu.partition)==md.mesh.numberofvertices:
129 md.checkmessage("user supplied partition for qmu analysis should have size md.mesh.numberofvertices x 1")
130 if not min(md.qmu.partition)==0:
131 md.checkmessage("partition vector not indexed from 0 on")
132 if max(md.qmu.partition)>=md.qmu.numberofpartitions:
133 md.checkmessage("for qmu analysis, partitioning vector cannot go over npart, number of partition areas")
134
135 if not m.strcmpi(md.cluster.name,'none'):
136 if not md.settings.waitonlock:
137 md.checkmessage("waitonlock should be activated when running qmu in parallel mode!")
138
139 return md
140 # }}}
141 def marshall(self,md,fid): # {{{
142 WriteData(fid,'object',self,'fieldname','isdakota','format','Boolean')
143 if not self.isdakota:
144 WriteData(fid,'data',False,'enum',QmuMassFluxSegmentsPresentEnum(),'format','Boolean');
145 return
146 WriteData(fid,'object',self,'fieldname','partition','format','DoubleMat','mattype',2)
147 WriteData(fid,'object',self,'fieldname','numberofpartitions','format','Integer')
148 WriteData(fid,'object',self,'fieldname','numberofresponses','format','Integer')
149 WriteData(fid,'object',self,'fieldname','variabledescriptors','format','StringArray')
150 WriteData(fid,'object',self,'fieldname','responsedescriptors','format','StringArray')
151 if not self.mass_flux_segments:
152 WriteData(fid,'data',self.mass_flux_segments,'enum',MassFluxSegmentsEnum(),'format','MatArray');
153 flag=True;
154 else:
155 flag=False;
156 WriteData(fid,'data',flag,'enum',QmuMassFluxSegmentsPresentEnum(),'format','Boolean');
157 # }}}
Note: See TracBrowser for help on using the repository browser.