1 | import numpy
|
---|
2 | from project3d import project3d
|
---|
3 | from collections import OrderedDict
|
---|
4 | from fielddisplay import fielddisplay
|
---|
5 | from EnumDefinitions import *
|
---|
6 | from checkfield import checkfield
|
---|
7 | from WriteData import WriteData
|
---|
8 | import MatlabFuncs as m
|
---|
9 |
|
---|
10 | class 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 | # }}}
|
---|