Changeset 24173


Ignore:
Timestamp:
09/27/19 16:44:53 (5 years ago)
Author:
schlegel
Message:

CHG: added v and e partitions

Location:
issm/trunk-jpl/src/m
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • issm/trunk-jpl/src/m/classes/qmu.m

    r24168 r24173  
    6666                                end
    6767                        end
    68                         if ~isempty(md.qmu.vpartition),
    69                                 if numel(md.qmu.vpartition)~=md.mesh.numberofvertices
     68                        if ~isempty(md.qmu.vpartition) & ~any(isnan(md.qmu.vpartition)),
     69                                if numel(md.qmu.vpartition)~=md.mesh.numberofvertices  
    7070                                        md = checkmessage(md,['user supplied vertex partition for qmu analysis should have size md.mesh.numberofvertices x 1']);
    7171                                end
     
    7777                                end
    7878                        end
    79                         if ~isempty(md.qmu.epartition),
     79                        if ~isempty(md.qmu.epartition) & ~any(isnan(md.qmu.epartition)),
    8080                                if numel(md.qmu.epartition)~=md.mesh.numberofelements,
    8181                                        md = checkmessage(md,['user supplied element partition for qmu analysis should have size md.mesh.numberofelements x 1']);
     
    8888                                end
    8989                        end
    90                         if isempty(md.qmu.vpartition) & isempty(md.qmu.epartition),
    91                                         md = checkmessage(md,['for qmu analysis, at least one of element and partitioning vectors need to be supplied!']);
    92                         end
     90                        if isempty(md.qmu.vpartition) | any(isnan(md.qmu.vpartition)) | isempty(md.qmu.epartition) | any(isnan(md.qmu.epartition)),
     91                                md = checkmessage(md,['for qmu analysis, both an element and partitioning vectors need to be supplied with no nan values! One can be defaulted to all zeros.']);
     92                        end
     93
    9394                end % }}}
    9495                function disp(self) % {{{
  • issm/trunk-jpl/src/m/classes/qmu.py

    r24162 r24173  
    2525                self.params                      = OrderedStruct()
    2626                self.results                     = OrderedDict()
    27                 self.partition                   = float('NaN')
     27                self.vpartition                  = float('NaN')
     28                self.epartition                  = float('NaN')
    2829                self.numberofpartitions          = 0
    2930                self.numberofresponses           = 0
     
    107108                                s+="            %-*s:    [%ix%i]    '%s'\n" % (maxlen+1,fname,a,b,type(getattr(result,fname)))
    108109
    109                 s+="%s\n" % fielddisplay(self,'partition','user provided mesh partitioning, defaults to metis if not specified')
     110                s+="%s\n" % fielddisplay(self,'vpartition','user provided mesh partitioning (vertex based)')
     111                s+="%s\n" % fielddisplay(self,'epartition','user provided mesh partitioning (element based)')
    110112                s+="%s\n" % fielddisplay(self,'numberofpartitions','number of partitions for semi-discrete qmu')
    111113                s+="%s\n" % fielddisplay(self,'variabledescriptors','')
     
    152154                                md.checkmessage('in parallel library mode, the requirement is for md.cluster.np = md.qmu.params.processors_per_evaluation * number_of_slaves, where number_of_slaves will automatically be determined by Dakota. Modify md.cluster.np accordingly')
    153155               
    154                 if np.size(md.qmu.partition) > 0:
    155                         if (np.size(md.qmu.partition)!=md.mesh.numberofvertices and np.size(md.qmu.partition) != md.mesh.numberofelements) or np.size(md.qmu.partition,1) != 1:
    156                                 md.checkmessage("user supplied partition for qmu analysis should have size (md.mesh.numberofvertices x 1) or (md.mesh.numberofelements x 1)")
    157                         if not min(md.qmu.partition.flatten())==0:
    158                                 md.checkmessage("partition vector not indexed from 0 on")
    159                         if max(md.qmu.partition.flatten())>=md.qmu.numberofpartitions:
    160                                 md.checkmessage("for qmu analysis, partitioning vector cannot go over npart, number of partition areas")
     156                if np.size(md.qmu.vpartition) > 0:
     157                        if np.size(md.qmu.vpartition)!=md.mesh.numberofvertices:
     158                                md.checkmessage("user supplied vertex partition for qmu analysis should have size (md.mesh.numberofvertices x 1)")
     159                        if not min(md.qmu.vpartition.flatten())==0:
     160                                md.checkmessage("vertex partition vector not indexed from 0 on")
     161                        if max(md.qmu.vpartition.flatten())>=md.qmu.numberofpartitions:
     162                                md.checkmessage("for qmu analysis, vertex partitioning vector cannot go over npart, number of partition areas")
     163
     164                if np.size(md.qmu.epartition) > 0:
     165                        if np.size(md.qmu.epartition) != md.mesh.numberofelements:
     166                                md.checkmessage("user supplied element partition for qmu analysis should have size (md.mesh.numberofelements x 1)")
     167                        if not min(md.qmu.epartition.flatten())==0:
     168                                md.checkmessage("elememtn partition vector not indexed from 0 on")
     169                        if max(md.qmu.epartition.flatten())>=md.qmu.numberofpartitions:
     170                                md.checkmessage("for qmu analysis, element partitioning vector cannot go over npart, number of partition areas")
     171
     172                if np.size(md.qmu.vpartition) == 0 or np.any(np.isnan(md.qmu.vpartition)) or np.size(md.qmu.epartition) == 0 or np.any(np.isnan(md.qmu.epartition)):
     173                        md.checkmessage("for qmu analysis, both an element and partitioning vectors need to be supplied with no nan values! One can be defaulted to all zeros.")
    161174
    162175                return md
     
    167180                        WriteData(fid,prefix,'data',False,'name','md.qmu.mass_flux_segments_present','format','Boolean');
    168181                        return
    169                 WriteData(fid,prefix,'object',self,'fieldname','partition','format','DoubleMat','mattype',2)
     182                WriteData(fid,prefix,'object',self,'fieldname','vpartition','format','DoubleMat','mattype',2)
     183                WriteData(fid,prefix,'object',self,'fieldname','epartition','format','DoubleMat','mattype',2)
    170184                WriteData(fid,prefix,'object',self,'fieldname','numberofpartitions','format','Integer')
    171185                WriteData(fid,prefix,'object',self,'fieldname','numberofresponses','format','Integer')
  • issm/trunk-jpl/src/m/partition/partitioner.m

    r24161 r24173  
    99%   section:  1 by defaults(1=bisection, 2=quadrisection, 3=octasection)
    1010%   recomputeadjacency:  'on' by default (set to 'off' to compute existing one)
     11%   type: 'node' or 'element' partition vector (default to 'node')
    1112%   Output: md.qmu.partition recover the partition vector
    1213%   
     
    2425options=addfielddefault(options,'section',1);
    2526options=addfielddefault(options,'recomputeadjacency','on');
     27options=addfielddefault(options,'type','node');
    2628
    2729%get package:
     
    2931npart=getfieldvalue(options,'npart');
    3032recomputeadjacency=getfieldvalue(options,'recomputeadjacency');
     33vectortype=getfieldvalue(options,'type');
    3134
    3235if(dimension(md.mesh)==3),
     
    5356if strcmpi(package,'chaco'),
    5457
    55         %  default method (from chaco.m)
    56         method=[1 1 0 0 1 1 50 0 .001 7654321]';
    57         method(1)=3;    %  global method (3=inertial (geometric))
    58         method(3)=0;    %  vertex weights (0=off, 1=on)
     58        if strcmpi(vectortype,'element')
     59                error(['partitioner error message: package ' package ' does not allow element partitions.']);
     60        else
    5961
    60         %specify bisection
    61         method(6)=getfieldvalue(options,'section');%  ndims (1=bisection, 2=quadrisection, 3=octasection)
     62                %  default method (from chaco.m)
     63                method=[1 1 0 0 1 1 50 0 .001 7654321]';
     64                method(1)=3;    %  global method (3=inertial (geometric))
     65                method(3)=0;    %  vertex weights (0=off, 1=on)
    6266
    63         %are we using weights?
    64         if strcmpi(getfieldvalue(options,'weighting'),'on'),
    65                 weights=floor(md.qmu.vertex_weight/min(md.qmu.vertex_weight));
    66                 method(3)=1;
    67         else
    68                 weights=[];
    69         end
     67                %specify bisection
     68                method(6)=getfieldvalue(options,'section');%  ndims (1=bisection, 2=quadrisection, 3=octasection)
    7069
    71         %  partition into nparts
    72         if isa(md.mesh,'mesh2d'),
    73                 part=Chaco(md.qmu.adjacency,weights,[],md.mesh.x, md.mesh.y,zeros(md.mesh.numberofvertices,1),method,npart,[])'+1; %index partitions from 1 up. like metis.
    74         else
    75                 part=Chaco(md.qmu.adjacency,weights,[],md.mesh.x, md.mesh.y,md.mesh.z,method,npart,[])'+1; %index partitions from 1 up. like metis.
     70                %are we using weights?
     71                if strcmpi(getfieldvalue(options,'weighting'),'on'),
     72                        weights=floor(md.qmu.vertex_weight/min(md.qmu.vertex_weight));
     73                        method(3)=1;
     74                else
     75                        weights=[];
     76                end
     77
     78                %  partition into nparts
     79                if isa(md.mesh,'mesh2d'),
     80                        part=Chaco(md.qmu.adjacency,weights,[],md.mesh.x, md.mesh.y,zeros(md.mesh.numberofvertices,1),method,npart,[])'+1; %index partitions from 1 up. like metis.
     81                else
     82                        part=Chaco(md.qmu.adjacency,weights,[],md.mesh.x, md.mesh.y,md.mesh.z,method,npart,[])'+1; %index partitions from 1 up. like metis.
     83                end
     84
    7685        end
    7786
    7887elseif strcmpi(package,'scotch'),
    7988
    80         %are we using weights?
    81         if strcmpi(getfieldvalue(options,'weighting'),'on'),
    82                 weights=floor(md.qmu.vertex_weight/min(md.qmu.vertex_weight));
     89        if strcmpi(vectortype,'element')
     90                error(['partitioner error message: package ' package ' does not allow element partitions.']);
    8391        else
    84                 weights=[];
     92                %are we using weights?
     93                if strcmpi(getfieldvalue(options,'weighting'),'on'),
     94                        weights=floor(md.qmu.vertex_weight/min(md.qmu.vertex_weight));
     95                else
     96                        weights=[];
     97                end
     98                maptab=Scotch(md.qmu.adjacency,[],weights,[],'cmplt',[npart]);
     99
     100                part=maptab(:,2)+1;%index partitions from 1 up. like metis.
    85101        end
    86         maptab=Scotch(md.qmu.adjacency,[],weights,[],'cmplt',[npart]);
    87 
    88         part=maptab(:,2)+1;%index partitions from 1 up. like metis.
    89102
    90103elseif strcmpi(package,'linear'),
    91104
    92         if npart==md.mesh.numberofelements | md.qmu.numberofpartitions==md.mesh.numberofelements
     105        if strcmpi(vectortype,'element')
    93106                part=1:1:md.mesh.numberofelements;
    94107                disp('Linear partitioner requesting partitions on elements');
     
    99112elseif strcmpi(package,'metis'),
    100113
    101         [element_partitioning,part]=MeshPartition(md,md.qmu.numberofpartitions);
     114        if strcmpi(vectortype,'element')
     115                error(['partitioner error message: package ' package ' does not allow element partitions.']);
     116        else
     117                [element_partitioning,part]=MeshPartition(md,md.qmu.numberofpartitions);
     118        end
    102119
    103120else
     
    112129        md3d.qmu.adjacency=md.qmu.adjacency;
    113130        md=md3d;
    114         part=project3d(md,'vector',part','type','node');
     131        if strcmpi(vectortype,'element')
     132                part=project3d(md,'vector',part','type','element');
     133        else
     134                part=project3d(md,'vector',part','type','node');
     135        end
    115136end
    116137
     
    118139        part=part';
    119140end
    120 md.qmu.partition=part;
     141
     142if strcmpi(vectortype,'element')
     143        md.qmu.epartition=part;
     144        if isempty(md.qmu.vpartition) | (prod(size(md.qmu.vpartition))==1 & isnan(md.qmu.vpartition))
     145                md.qmu.vpartition=zeros(md.mesh.numberofvertices,1);
     146        end
     147else
     148        md.qmu.vpartition=part;
     149        if isempty(md.qmu.epartition) | (prod(size(md.qmu.epartition))==1 & isnan(md.qmu.epartition))
     150                md.qmu.epartition=zeros(md.mesh.numberofelements,1);
     151        end
     152end
  • issm/trunk-jpl/src/m/partition/partitioner.py

    r24161 r24173  
    2121   section:  1 by defaults(1=bisection, 2=quadrisection, 3=octasection)
    2222   recomputeadjacency:  'on' by default (set to 'off' to compute existing one)
     23   type: 'node' or 'element' partition vector (default to 'node')
    2324   Output: md.qmu.partition recover the partition vector
    2425   
     
    3637        options.addfielddefault('section',1)
    3738        options.addfielddefault('recomputeadjacency','on')
     39        options.addfielddefault('type','node')
    3840
    3941        #get package:
     
    4143        npart=options.getfieldvalue('npart')
    4244        recomputeadjacency=options.getfieldvalue('recomputeadjacency')
     45        vectortype=options.getfieldvalue('type')
     46
     47        if m.strcmpi(vectortype,'element') and not m.strcmpi(package,'linear'):
     48                raise RuntimeError('partitioner error message: package '+str(package)+' does not allow element partitions.')
    4349
    4450        if(md.mesh.dimension()==3):
     
    121127                md3d.qmu.adjacency=md.qmu.adjacency
    122128                md=md3d
    123                 part=project3d(md,'vector',np.squeeze(part),'type','node')
     129                if m.strcmpi(vectortype,'element'):
     130                    part=project3d(md,'vector',np.squeeze(part),'type','element')
     131                else:
     132                    part=project3d(md,'vector',np.squeeze(part),'type','node')
    124133
    125134        part=part.reshape(-1,1)
    126         md.qmu.partition=part
     135
     136        if m.strcmpi(vectortype,'element'):
     137                md.qmu.epartition=part
     138                if np.size(md.qmu.vpartition) == 0 or (np.size(md.qmu.vpartition) == 1 and np.isnan(md.qmu.vpartition)):
     139                    md.qmu.vpartition=np.zeros((md.mesh.numberofvertices,1))
     140
     141        else:
     142                md.qmu.vpartition=part
     143                if np.size(md.qmu.epartition) == 0 or (np.size(md.qmu.epartition) == 1 and np.isnan(md.qmu.epartition)):
     144                    md.qmu.epartition=np.zeros((md.mesh.numberofelements,1))
    127145
    128146        return md
  • issm/trunk-jpl/src/m/qmu/importancefactors.m

    r13646 r24173  
    4444        factors=importancefactors;
    4545        return;
     46elseif count==max(md.qmu.epartition+1)
     47        %distribute importance factor
     48        factors=importancefactors(md.qmu.epartition'+1); %md.qmu.partition was created to index "c" style
    4649else
    4750        %distribute importance factor
    48         factors=importancefactors(md.qmu.partition'+1); %md.qmu.partition was created to index "c" style
     51        factors=importancefactors(md.qmu.vpartition'+1); %md.qmu.partition was created to index "c" style
    4952end
    5053
  • issm/trunk-jpl/src/m/qmu/importancefactors.py

    r23095 r24173  
    4343                factors=importancefactors
    4444                return factors
     45        elif count==np.max(md.qmu.epartition+1):
     46                #distribute importance factor
     47                factors=importancefactors[(md.qmu.epartition.conj().T).flatten().astype(int)]
     48                #md.qmu.partition was created to index "c" style
    4549        else:
    4650                #distribute importance factor
    47                 factors=importancefactors[(md.qmu.partition.conj().T).flatten().astype(int)]
     51                factors=importancefactors[(md.qmu.vpartition.conj().T).flatten().astype(int)]
    4852                #md.qmu.partition was created to index "c" style
    4953
Note: See TracChangeset for help on using the changeset viewer.