Last active
April 12, 2019 21:47
-
-
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
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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") | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
$*$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ | |
$* | |
$* 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