[19895] | 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 | # }}}
|
---|