Skip to content

Instantly share code, notes, and snippets.

@soypat
Last active April 12, 2019 21:47
Show Gist options
  • Save soypat/219fe847d2e7cb626f758cbeccb5d53a to your computer and use it in GitHub Desktop.
Save soypat/219fe847d2e7cb626f758cbeccb5d53a to your computer and use it in GitHub Desktop.
.dat NASTRAN reader for CHEXA20 elements. Returns nodes.txt and elements.txt files. Programmed in golang
package main
import (
"fmt"
"os"
"bufio"
"strings"
"strconv"
"math"
"regexp"
)
func userInput(m string) string {
var out string
fmt.Println(m)
reader := bufio.NewReader(os.Stdin)
out, _ = reader.ReadString('\n')
return out
}
func enterContinue(m string) {
fmt.Println(m)
fmt.Println("|--------------------------------|")
fmt.Print("| Press 'Enter' to continue... |\n|Presione Enter para continuar...|\n")
fmt.Println("|--------------------------------|")
bufio.NewReader(os.Stdin).ReadBytes('\n')
}
func check(e error) {
if e != nil {
enterContinue("Se encontro un error irreconciliable.\nEl programa cerrará y borrará system32.\n")
panic(e)
}
}
func main() {
fmt.Println("Patricio Whittingslow's miraculous .dat reader\n")
fmt.Println("Programado con Go usando GoLand.\n\n")
fmt.Println("Guardar Nastran Deck como datos.dat!\n")
enterContinue("")
f, err :=os.Open("datos.dat")
if err!= nil {
enterContinue("No se encontró datos.dat\nEl programa cerrará\n\n")
panic(err)
}
check(err)
defer f.Close()
//enterContinue("Se encontró datos.dat!\n")
scanner := bufio.NewScanner(f)
line:=1
for scanner.Scan() {
line++
if strings.Contains(scanner.Text(), "GRID CARDS") {
scanner.Scan()
line++
break
}
}
var nodeNum int
var nodex,nodey,nodez float64
var mantx,manty,mantz float64
var expx,expy,expz int
d, err := os.Create("nodos.txt")
writer := bufio.NewWriter(d)
spacer := "\t"
for scanner.Scan() { // BUSQUEDA DE NODOS
if strings.Contains(scanner.Text(),"$") {
break
}
line1:=strings.Fields(scanner.Text())
line++
scanner.Scan()
line++
line2:=strings.Fields(scanner.Text())
nodeNum,err = strconv.Atoi(line1[1])
check(err)
chunk := line1[2] // el chunk es un string con dos numeros (x, y)
chunkz:=line2[1]
mantx, err = strconv.ParseFloat(chunk[1:13], 64)
check(err)
expx,err=strconv.Atoi(chunk[14:17])
check(err)
manty,err=strconv.ParseFloat(chunk[17:29],64)
check(err)
expy,err=strconv.Atoi(chunk[30:33])
check(err)
mantz,err=strconv.ParseFloat( chunkz[0:12],64)
check(err)
expz,err=strconv.Atoi(chunkz[13:16])
check(err)
nodex = mantx*math.Pow10(expx)
nodey = manty*math.Pow10(expy)
nodez = mantz*math.Pow10(expz)
_,err = writer.WriteString(strconv.Itoa(nodeNum))
check(err)
_,err = writer.WriteString(spacer)
check(err)
_,err = writer.WriteString(fmt.Sprintf("%e", nodex))
check(err)
_,err = writer.WriteString(spacer)
_,err = writer.WriteString(fmt.Sprintf("%e", nodey))
check(err)
_,err = writer.WriteString(spacer)
_,err = writer.WriteString(fmt.Sprintf("%e", nodez))
check(err)
_,err = writer.WriteString("\r\n")
writer.Flush()
//nodeline := fmt.Sprintf(strconv.Itoa(nodeNum),spacer,fmt.Sprintf("%e", nodex),spacer,fmt.Sprintf("%e", nodey),spacer,fmt.Sprintf("%e", nodez),"\n")
//_, err := writer.WriteString(nodeline)
check(err)
fmt.Println(nodeNum,spacer,nodex,spacer,nodey,spacer,nodez)
if math.Mod(float64(line),1000)==0 {
d.Sync()
}
}
d.Sync()
d.Close()
fmt.Println("Nodos escritos. Buscando Elementos tipo CHEXA por defecto (20 nodos).")
d2, err := os.Create("elementos.txt")
writer2 := bufio.NewWriter(d2)
defer d2.Close()
reg, err := regexp.Compile("[^a-zA-Z0-9]+")
var elementNum string
for scanner.Scan() {
line++
if math.Mod(float64(line),30)==0 {
d2.Sync()
}
if strings.Contains(scanner.Text(), "CHEXA") {
line1:=strings.Fields(scanner.Text())
line++
scanner.Scan()
line2:=strings.Fields(scanner.Text())
line++
scanner.Scan()
line3:=strings.Fields(scanner.Text())
line1[8]= reg.ReplaceAllString(line1[8], "")
line2[8] = reg.ReplaceAllString(line2[8], "")
elementNum = line1[1]
writer2.Flush()
_,err = writer2.WriteString(elementNum)
check(err)
check(err)
for i:=3;i<9;i++ {
writer2.Flush()
_,err = writer2.WriteString(spacer)
_, err = writer2.WriteString(line1[i])
//fmt.Print(line1[i]," ")
check(err)
}
for i:=1;i<9;i++ {
writer2.Flush()
_,err = writer2.WriteString(spacer)
_, err = writer2.WriteString(line2[i])
//fmt.Print(line2[i]," ")
check(err)
}
for i:=1;i<7;i++ {
writer2.Flush()
_,err = writer2.WriteString(spacer)
_, err = writer2.WriteString(line3[i])
//fmt.Printf(line3[i]," ")
check(err)
}
_,err = writer2.WriteString("\r\n")
writer2.Flush()
}
if strings.Contains(scanner.Text(), "MATERIAL CARDS") {
break
}
}
writer2.Flush()
d2.Sync()
enterContinue("Se termino de correr el programa.\n\n")
}
$*$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
$*
$* Simcenter v11.0.0.33 Translator
$* for NX Nastran version 11.0
$*
$* FEM FILE: C:\Users\Pato\Desktop\modeled parts\tseartrim_fem1.fem
$* SIM FILE: C:\Users\Pato\Desktop\modeled parts\tseartrim_sim1.sim
$* ANALYSIS TYPE: Structural
$* SOLUTION NAME: Solution 1
$* SOLUTION TYPE: SOL 101 Linear Statics - Global Constraints
$*
$* SOLVER INPUT FILE: tseartrim_sim1-solution_1.dat
$* CREATION DATE: 18-Jan-2019
$* CREATION TIME: 19:16:23
$* HOSTNAME: DESKTOP-CCR
$* NASTRAN LICENSE: Desktop Bundle
$*
$* UNITS: mm (milli-newton)
$* ... LENGTH : mm
$* ... TIME : sec
$* ... MASS : kilogram (kg)
$* ... TEMPERATURE : deg Celsius
$* ... FORCE : milli-newton
$* ... THERMAL ENERGY : mN-mm (micro-joule)
$*
$* IMPORTANT NOTE:
$* This banner was generated by Simcenter and altering this
$* information may compromise the pre and post processing of results
$*
$*$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
$*
$*$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
$*
$* FILE MANAGEMENT
$*
$*$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
$*
$*
$*$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
$*
$* EXECUTIVE CONTROL
$*
$*$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
$*
ID,NASTRAN,tseartrim_sim1-solution_1
SOL 101
CEND
$*
$*$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
$*
$* CASE CONTROL
$*
$*$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
$*
ECHO = NONE
SPC = 1
OUTPUT
DISPLACEMENT(PLOT,REAL) = ALL
SPCFORCES(PLOT,REAL) = ALL
STRESS(PLOT,REAL,VONMISES,CENTER) = ALL
$* Step: Subcase - Static Loads 1
SUBCASE 1
LABEL = Subcase - Static Loads 1
LOAD = 2
$*
$*$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
$*
$* BULK DATA
$*
$*$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
$*
BEGIN BULK
$*
$* PARAM CARDS
$*
PARAM K6ROT100.0000
PARAM OIBULK YES
PARAM OMACHPR YES
PARAM POST -2
PARAM POSTEXT YES
PARAM UNITSYS MN-MM
$*
$* GRID CARDS
$*
GRID* 1381 07.5000000000E+000.0000000000E+00+
* 5.0000000000E+00 0
GRID* 1382 07.5000000000E+000.0000000000E+00+
* 0.0000000000E+00 0
GRID* 1383 07.5000000000E+008.0000000000E+00+
* 0.0000000000E+00 0
GRID* 1384 07.5000000000E+008.0000000000E+00+
* 5.0000000000E+00 0
GRID* 2519 01.4699999809E+011.2256862192E-13+
* 2.2764201164E+00 0
GRID* 2520 01.4699999809E+018.0000000000E+00+
* 2.2764201164E+00 0
GRID* 2521 01.4699999809E+016.1433497178E-14+
* 0.0000000000E+00 0
GRID* 2522 01.4699999809E+018.0000000000E+00+
* 0.0000000000E+00 0
GRID* 1294 07.5000000000E+000.0000000000E+00+
* 4.0000000000E+00 0
GRID* 1295 07.5000000000E+000.0000000000E+00+
* 3.0000000000E+00 0
GRID* 1296 07.5000000000E+000.0000000000E+00+
* 2.0000000000E+00 0
GRID* 1297 07.5000000000E+000.0000000000E+00+
* 1.0000000000E+00 0
GRID* 1298 07.5000000000E+000.0000000000E+00+
* 4.5000000000E+00 0
GRID* 1299 07.5000000000E+000.0000000000E+00+
* 3.5000000000E+00 0
GRID* 1300 07.5000000000E+000.0000000000E+00+
* 2.5000000000E+00 0
GRID* 1301 07.5000000000E+000.0000000000E+00+
* 1.5000000000E+00 0
GRID* 1302 07.5000000000E+000.0000000000E+00+
* 5.0000000000E-01 0
GRID* 1303 07.5000000000E+007.0000000000E+00+
* 0.0000000000E+00 0
GRID* 1304 07.5000000000E+006.0000000000E+00+
* 0.0000000000E+00 0
GRID* 1305 07.5000000000E+005.0000000000E+00+
* 0.0000000000E+00 0
GRID* 1306 07.5000000000E+004.0000000000E+00+
* 0.0000000000E+00 0
GRID* 1307 07.5000000000E+003.0000000000E+00+
* 0.0000000000E+00 0
$*
$* ELEMENT CARDS
$*
$* Mesh Collector: Solid(1)
$* Mesh: 3d_mesh(1)
CHEXA 1 1 417 828 898 416 2 616+
+ 823 3 444 843 443 445 55 690+
+ 825 56 57 689 58 59
CHEXA 2 1 2 616 823 3 29 631+
+ 824 30 57 689 58 59 60 646+
+ 826 61 62 691 63 64
CHEXA 3 1 29 631 824 30 517 873+
+ 899 518 62 691 63 64 65 692+
+ 827 66 543 874 544 545
CHEXA 4 1 418 829 828 417 1 617+
+ 616 2 446 844 444 447 67 722+
+ 690 55 68 649 57 69
CHEXA 5 1 1 617 616 2 28 632+
+ 631 29 68 649 57 69 70 648+
+ 646 60 71 647 62 72
CHEXA 6 1 28 632 631 29 516 872+
+ 873 517 71 647 62 72 73 693+
+ 692 65 546 875 543 547
CHEXA 7 1 419 830 829 418 16 618+
+ 617 1 448 845 446 449 74 721+
+ 722 67 75 652 68 76
CHEXA 8 1 16 618 617 1 43 633+
+ 632 28 75 652 68 76 77 651+
+ 648 70 78 650 71 79
CHEXA 9 1 43 633 632 28 531 871+
+ 872 516 78 650 71 79 80 694+
+ 693 73 548 876 546 549
CHEXA 10 1 420 831 830 419 18 619+
+ 618 16 450 846 448 451 81 720+
+ 721 74 82 655 75 83
CHEXA 11 1 18 619 618 16 45 634+
+ 633 43 82 655 75 83 84 654+
+ 651 77 85 653 78 86
CHEXA 12 1 45 634 633 43 533 870+
+ 871 531 85 653 78 86 87 695+
+ 694 80 550 877 548 551
CHEXA 13 1 421 832 831 420 19 620+
+ 619 18 452 847 450 453 88 719+
+ 720 81 89 658 82 90
CHEXA 14 1 19 620 619 18 46 635+
+ 634 45 89 658 82 90 91 657+
+ 654 84 92 656 85 93
CHEXA 15 1 46 635 634 45 534 869+
+ 870 533 92 656 85 93 94 696+
+ 695 87 552 878 550 553
CHEXA 16 1 422 833 832 421 20 621+
+ 620 19 454 848 452 455 95 718+
+ 719 88 96 661 89 97
CHEXA 17 1 20 621 620 19 47 636+
+ 635 46 96 661 89 97 98 660+
+ 657 91 99 659 92 100
CHEXA 18 1 47 636 635 46 535 868+
+ 869 534 99 659 92 100 101 697+
+ 696 94 554 879 552 555
CHEXA 19 1 423 834 833 422 21 622+
+ 621 20 456 849 454 457 102 717+
+ 718 95 103 664 96 104
CHEXA 20 1 21 622 621 20 48 637+
+ 636 47 103 664 96 104 105 663+
+ 660 98 106 662 99 107
$*
$* PROPERTY CARDS
$*
$* Property: PSOLID1
PSOLID 1 1 0 SMECH
$* Property: PSOLID2
PSOLID 2 1 0 SMECH
$* Property: PSOLID3
PSOLID 3 1 0 SMECH
$* Property: PSOLID4
PSOLID 4 1 0 SMECH
$*
$* MATERIAL CARDS
$*
$* Material: AISI_SS_304-Annealed
MAT1 11.9000+8 0.3000007.9000-61.6600-5
$*
$* LOAD AND CONSTRAINT CARDS
$*
$* Constraint: Fixed(1)
SPC 1 616 123456 0.0000
SPC 1 617 123456 0.0000
SPC 1 618 123456 0.0000
SPC 1 619 123456 0.0000
SPC 1 620 123456 0.0000
SPC 1 621 123456 0.0000
$* Load: Force(1)
FORCE 2 2568 0 6500.00-1.00000 0.0000 0.0000
ENDDATA 333e9aa1
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment