blob: c86ce69c5582fcd6b7e99644b74494dda852d02d [file] [log] [blame]
#*******************************************************************************
#* Copyright (c) 2011 Forschungszentrum Juelich GmbH.
#* All rights reserved. This program and the accompanying materials
#* are made available under the terms of the Eclipse Public License v1.0
#* which accompanies this distribution, and is available at
#* http://www.eclipse.org/legal/epl-v10.html
#*
#* Contributors:
#* Wolfgang Frings (Forschungszentrum Juelich GmbH)
#*******************************************************************************/
package LML_gen_nodedisplay;
my($debug)=0;
my($generateusage)=1;
use strict;
use Time::Local;
use Time::HiRes qw ( time );
use Data::Dumper;
###############################################
# PBS related
###############################################
sub _get_system_size_pbs {
my($self) = shift;
my($indataref) = $self->{INDATA};
my($numnodes);
my ($key,$ref,$name,$ncores);
keys(%{$self->{LMLFH}->{DATA}->{OBJECT}}); # reset iterator
while(($key,$ref)=each(%{$self->{LMLFH}->{DATA}->{OBJECT}})) {
next if($ref->{type} ne 'node');
$name=$ref->{name};
$ncores=$self->{LMLFH}->{DATA}->{INFODATA}->{$key}->{ncores};
if(!defined($ncores)) {
print "_get_system_size_cluster: suspect node: $name, assuming 1 cores\n" if($self->{VERBOSE});
$ncores=1;
}
if($ncores<0) {
print "_get_system_size_cluster: suspect node: $name negative number of cores, assuming 1 cores\n" if($self->{VERBOSE});
$ncores=1;
}
push(@{$self->{NODESIZES}->{$ncores}},$name);
}
$numnodes=0;
foreach $ncores (sort {$a <=> $b} keys %{$self->{NODESIZES}}) {
foreach $name (@{$self->{NODESIZES}->{$ncores}}) {
# register new node
if(!exists($self->{NODEMAPPING}->{$name})) {
$self->{NODEMAPPING}->{$name}=sprintf($self->{NODENAMENAMASK},$numnodes);
# print "_get_system_size_cluster: remap '$name' -> '$self->{NODEMAPPING}->{$name}'\n";
$numnodes++;
} else {
print "ERROR: _get_system_size_cluster: duplicate node '$name' -> '$self->{NODEMAPPING}->{$name}'\n";
}
}
printf("_get_system_size_cluster: found %4d nodes of size: %d\n", scalar @{$self->{NODESIZES}->{$ncores}},$ncores)
if($self->{VERBOSE});
}
printf("_get_system_size_cluster: Cluster found of size: %d\n",$numnodes) if($self->{VERBOSE});
return($numnodes);
}
sub _init_trees_pbs_from_scheme {
my($self) = shift;
my($treenode, $child);
my $schemeroot=$self->{SCHEMEROOT};
$schemeroot->copy_tree($self->{SCHEMEFROMREQUEST});
return(1);
}
sub _init_trees_pbs {
my($self) = shift;
my($id,$subid,$treenode,$schemeroot,$ncores,$numnodes,$start);
$schemeroot=$self->{SCHEMEROOT};
$start=0;
foreach $ncores (sort {$a <=> $b} keys %{$self->{NODESIZES}}) {
$numnodes=scalar @{$self->{NODESIZES}->{$ncores}};
$treenode=$schemeroot;
$treenode=$treenode->new_child();
$treenode->add_attr({ tagname => 'node',
min => $start,
max => $start+$numnodes-1,
mask => $self->{NODENAMENAMASK} });
$treenode=$treenode->new_child();
$treenode->add_attr({ tagname => 'core',
min => 0,
max => $ncores-1,
mask => '-c%02d' });
# insert first element in data section
$treenode=$self->{DATAROOT};
$treenode=$treenode->new_child();
$treenode->add_attr({ min => $start,
max => $start+$numnodes-1,
oid => 'empty' });
$start+=$numnodes;
}
return(1);
}
sub _adjust_layout_pbs {
my($self) = shift;
my($numnodes)=@_;
my($id,$subid,$treenode,$child,$ncores,$start,$numchilds);
my $rc=1;
my $default_nodes_per_row=8;
$treenode=$self->{LAYOUT}->{tree};
$numchilds=scalar @{$treenode->{_childs}};
if($numchilds==1) {
$child=$treenode->{_childs}->[0];
if( ($child->{ATTR}->{rows} eq 0) && ($child->{ATTR}->{cols} eq 0)) {
$child->{ATTR}->{rows}=$default_nodes_per_row;
$child->{ATTR}->{cols}=int($numnodes/$default_nodes_per_row)+1;
} elsif($child->{ATTR}->{cols} eq 0) {
$child->{ATTR}->{cols}=int($numnodes/$child->{ATTR}->{rows})+1;
} elsif($child->{ATTR}->{rows} eq 0) {
$child->{ATTR}->{rows}=int($numnodes/$child->{ATTR}->{cols})+1;
}
if(!exists($child->{ATTR}->{maxlevel})) {
$child->{ATTR}->{maxlevel}=2;
}
} else {
# more sophisticated layout, tbd
}
return($rc);
}
1;