Changeset 24173


Ignore:
Timestamp:
Sep 27, 2019, 4:44:53 PM (7 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.