Personal tools
You are here: Home / Members / taus007's Home / CreateXDAmesh
Navigation
Log in


Forgot your password?
 

CreateXDAmesh

A new file for creating an xda mesh from exelem and exnode files. See wiki for exactly how to do this.

Plain Text icon CreateXDAmesh.pl — Plain Text, 2 KB (2867 bytes)

File contents

#!/usr/bin/perl

use locale;

# This perl script reads in an exelem file and exnode file and creates a mesh 
# in the libmesh xda format so that we can run problems meshed by cm in libmesh.
# The exnode file must come from a grid-based cmiss problem and then exported as:
#
#     'fem export point;FILENAME grid offset 0'
#
# The exelem file must come from the same type of problem (a grid-based FEM problem
# uses hexahedral elements) and then exported as
#
#     'fem export grid:FILENAME libmesh'
#
# where the libmesh is necessary to only print out some of the information and also
# to get the right ordering.
#
#
# Run it as: ./CreateXDAmesh.pl FILE.exnode FILE.exelem NEWMESH.xda ElemType
  

#
# (1) Read in node file and strip out node vertices
#


open(INND,$ARGV[0]);

$TmpNodOut = "tmpnode.out";
open(TNO,">",$TmpNodOut); 

#
# Read in Node and Write to tmpnod.out
#
my $flag = 0;
while (<INND>) {

    chomp $_;
    @foo = split(/\s+/,$_);
    if ($foo[1] eq 'Node:') {
	$flag = 1;
    }

    if( $flag == 1 ) {
	if( $foo[1] ne 'Node:') {
	    print TNO " $foo[1]  $foo[2]  $foo[3] \n";
	} else {
	    $nnodes = $foo[2];
	}
	
    } 
}

print "Number of total nodes = ",$nnodes,"\n";

close(INND);
close(TNO);
                
open(INEL,$ARGV[1]);
                                 
$TmpElOut = "tmpelem.out";
open(TEO,">",$TmpElOut);
 
#
# Read in Elem and Write to tmpelem.out
#
my $flag = 0;
my $nelems = 0;

$prevline = "Nonsense";
$prntnxtline = 0;

$tmp=0;

while (<INEL>) {

    chomp $_;
    @foo = split(/\s+/,$_);
    #print $foo[1]," \n";
    if ($foo[1] eq 'Nodes:') {
	$flag = 1;
    }

    if( $flag eq 1 ) {
	if($foo[1] eq 'Nodes:') {
            $prntnxtline = 1;
	}

	if($prntnxtline == 1 && $foo[1] ne 'Nodes:') {
	    for(my $i=0; $i < 8; $i++) {
                $foo[$i+1] = int($foo[$i+1])-1;
		print TEO "$foo[$i+1] ";
	    }
	    print TEO "\n";
	    $prntnxtline = 0;
	    $tmp = $tmp + 1;
	}

	if($foo[1] eq 'Element:') {
	    $nelems = $foo[2];
	}
    } 

}

print "Number of elements = ",$nelems,"\n";

close(TEO);
close(INEL);

#
# Create the new libmesh xda file format
#

# First open file

open(XDA,">","temp.xda");

$elemwts = $nelems*8;

print XDA "DEAL \n";
print XDA "$nelems                # Num. Elements\n";
print XDA "$nnodes                # Num. Nodes\n";
print XDA "$elemwts               # Sum of Element Weights\n";
print XDA "1                  # Num. Boundary Conditions\n";
print XDA "65536              # String Size (ignored)\n";
print XDA "1                  # Num. Element Blocks (ignored)\n";
print XDA "$ARGV[3]           # Element types in each block.\n";
print XDA "$nelems            # Num. of elements in each block.\n";
print XDA "Id String\n";
print XDA "Title String\n";

close(XDA);

system("cat temp.xda tmpelem.out tmpnode.out  > $ARGV[2]");
system("rm -f temp.xda tmpelem.out tmpnode.out");