## *TEST* ## 'awk' PROGRAM NAME: feinp_generic2stl_awkprogTESTchexa ## ## in $FEDIR/scripts ## where FEDIR=/apps/nns_com/fea ## ## *** NEEDS TO BE MADE SIMILAR TO 'feinp_generic2stl_awkprog'. ## ######################################################################## ## PURPOSE: FOR TESTING OF REFORMATTING OF 'GENERIC' CHEXA RECORDS ## into an STL file. ## ## ** This awk-program READs a 'GENERIC' FE input file and ## ** EXTRACTs data from 'generic' GRID and 'generic' ELEMENT records ## ** (CHEXA only -- for test) into an STL output file. ## ## Each 'generic' ELEMENT record is expected to be a single ## 'free-format' record [fields are space(s)-separated], ## generally of the form ## elname eid pid g1 g2 g3 ... ## where elname is an element name like CHEXA ## eid = element-id (an integer) ## pid = property id, usually (an integer) ## gi's are ids of grid/node points (integers). ######################################################################### ## CALLED BY: TEST SCRIPT 'feinp_nas2stl_nogui_TESTawkprogs' ## in $FEDIR/scripts. ## ## *** To prepare for incorporation into ## 'feinp_generic2stl_awkprog' ## which is called in 'feinp_nas2stl_bygui' ## ## which is a "NASTRAN-to-STL" file creation utility. ## ## *** COMPARE THIS AWK-PROG WITH 'feinp_generic2stl_awkprog'. ## ## The 'generic' ELEMENT-info file is created in (and is used as input ## in) 'feinp_nas2stl_bygui'. See that script for more info. ## Or see 'feinp_nas2stl_nogui_TESTawkprogs'. ######################################################################## ## INPUT: GENERIC-FE input filename ## OUTPUT: stdout ######################################################################## ## TEST FILES: Test NASTRAN files with various elements are ## in directory /apps/nns_com/fea/demos_nas2stl. ## Some of these NASTRAN input files are from ## /apps/msc/msc70/msc70/nast/demo ## and /apps/msc/msc70/msc70/nast/tpl. ## Others may be from NNS NASTRAN users. ######################################################################## ## SUPPORTED ELEMENT RECORD TYPES BELOW: ## - CHEXA ######################################################################## ## MAINTENANCE HISTORY: ## Written by: B.Montandon O06 16Aug2000 'nasinp2stl_TESTchexa(X)' ## test script+awkprog was created ## based on 'nasinp2stl_awkprog' ## and 'nasinp2stl_bygui' ## in $FEDIR/scripts ## Updated by: B.Montandon O06 13Sep2000 Extracted awkprog from ## 'nasinp2stl_TESTchexa' ## into this awkprog file. ######################################################################## ######################################################################### ## awk-prog to TRANSLATE a 'GENERIC' CHEXA file to an STL file. ######################################################################### ## THIS LOGIC FOR LOOKING UP GRID INFO ## ASSUMES *ALL* THE generic 'GRID' RECORDS ARE BEFORE ## THE 'element-connectivity' RECORDS --- and are sorted by gridid. ######################################################################### ## SAMPLE NASTRAN INPUT FOR CONVERSION TO A 'GENERIC' FE FILE FOR TESTING: # FILEIN="/apps/nns_com/fea/demos_nas2stl/chexas_1_free.dat" BEGIN { printf ("SOLID - FROM NASTRAN INPUT %-65s\n",FILE_IN); ## i is a GRID rec counter; j is an element rec counter. i=0; j=0; DEBUG=0 } { ############################################################################## ## REPLACE ADJACENT COMMAS IN NASTRAN RECS (ESP. GRID & element RECS) ## BY TWO COMMAS SEPARATED BY A DUMMY STRING --- ## I.E. IN *FREE-FORMAT* RECS REPLACE SUCCESSIVE COMMAS BY SOMETHING. ############################################################################## ## NEEDS TESTING ################ gsub(/,,/,",dummy,") ############################################################################## ## REPLACE EACH COMMA IN NASTRAN RECS (ESP. GRID & element RECS) BY A BLANK --- ## I.E. IN *FREE-FORMAT* RECS REPLACE EACH COMMA BY A BLANK. ############################################################################## gsub(/,/," ") ############################################################################## ## LOOK FOR *GRID* IN THE FIRST FIELD. INCREMENT THE GRID-REC COUNT, i. ############################################################################## # if ($1=="GRID") # if ($1=="GRID" || $1=="grid") if ($1=="GRID" || $1=="grid") {i++ ## EXIT, WITH MSG TO OUTFILE, IF AN ELEMENT REC HAS BEEN ENCOUNTERED. if (j>0) { print "*ERROR: There are ELEMENT recs before GRID recs." print "*ERROR: *ALL* GRID recs must be before *ALL* element recs." exit } ## SEPARATE *SCRUNCHED-TOGETHER* GRID COORDS --- I.E. SEPARATE ## ANY OCCURRENCES OF A MINUS-SIGN IMMEDIATELY FOLLOWING A NUMERIC CHAR. gsub(/0-/,"0 -") gsub(/1-/,"1 -") gsub(/2-/,"2 -") gsub(/3-/,"3 -") gsub(/4-/,"4 -") gsub(/5-/,"5 -") gsub(/6-/,"6 -") gsub(/7-/,"7 -") gsub(/8-/,"8 -") gsub(/9-/,"9 -") ## EXIT, WITH MSG TO OUTFILE, IF A GRID REC HAS LESS THAN 6 FIELDS. if (NF<6) { print "*ERROR: There must be at least 6 fields in GRID recs:" print "*ERROR: *GRID*, two integers, and 3 x,y,z coordinates." exit } ####################################### ## STORE THE GRID-ID in the g[.] array. ####################################### g[i]=$2 ################################################################ ## STORE THE 4th,5th,6th FIELDS IN THE gx[.],gy[.],gz[.] arrays. ################################################################ gx[i]=$4; gy[i]=$5; gz[i]=$6 ## *FOR TESTING* -- show the just-captured GRID data: ## (Option: Do not direct awk stdout into a file; ## allow stdout to go to screen.) if (DEBUG==1) { print "DEBUG: i="i" g[i]="g[i]" gx[i]="gx[i]" gy[i]="gy[i]" gz[i]="gz[i] } } ######################################################## ## STORE THE TOTAL NUMBER OF GRID RECS PROCESSED SO FAR. ######################################################## Ngrid=i ################################################################################ ## LOOK FOR *CHEXA* IN THE FIRST FIELD. ## INCREMENT THE CHEXA-REC COUNT, j. ################################################################################ if ($1=="CHEXA" || $1=="chexa") {j++ ################################################################ ## STORE THE *CHEXA* ELEMENT-ID IN THE e VAR. ## STORE THE 4th, 5th, 6th, 7th, 8th, 9th FIELDS (4 grid ids) ## IN THE g1, g2, g3, g4, g5, g6 VARS. ################################################################ e=$2; g1=$4; g2=$5; g3=$6; g4=$7; g5=$8; g6=$9 ## *FOR TESTING* -- show the just-captured *CHEXA* data: ## (Option: Do not direct awk stdout into a file; ## allow stdout to go to screen.) if (DEBUG==1) { print "DEBUG: j=element-count="j" e=element-id="e" g1="g1" g2="g2" g3="g3" g4="g4" g5="g5" g6="g6 } ## FOR TESTING: # print "Number of fields in CHEX rec (NF): "NF # if (NF > 9) {print "CHEXA rec: "; print $0} # if (NF > 9) {getline; print "CHEXA Continuation rec: "; print $0} ## END OF TESTING SECTION. ################################################################ ## GET THE CONTINUATION RECORD OF THE *CHEXA* REC AND ## STORE THE 2nd, 3rd FIELDS (2 grid ids) ## IN THE g7, g8 VARS. ################################################################ getline gsub(/,,/,",dummy,") gsub(/,/," ") g7=$2; g8=$3 ## *FOR TESTING* -- show the just-captured *CHEXA* data: ## (Option: Do not direct awk stdout into a file; ## allow stdout to go to screen.) if (DEBUG==1) { print "DEBUG: g7="g7" g8="g8 } ################################################################################################## ################################################################ ## SCAN THE g[.] GRID-ID array FOR A MATCH, g[k], WITH g1. ## FOR A MATCH, SET x1,y1,z1 to gz[k],gy[k],gz[k]. ################################################################ xyz1="NOT FOUND" for (k=1; k<=Ngrid ; k++) { if (g[k]==g1) { x1=gx[k] ; y1=gy[k] ; z1=gz[k]; xyz1="FOUND" } } if ( xyz1=="NOT FOUND" ) { print "*ERROR: NO GRID COORDS FOUND for GRID "g1" of CHEXA "e"." } ## *FOR TESTING* -- show the just-captured *CHEXA* data: ## (Option: Do not direct awk stdout into a file; ## allow stdout to go to screen.) if (DEBUG==1) { print "DEBUG: k="k" x1="x1" y1="y1" z1="z1 } ################################################################ ## SCAN THE g[.] GRID-ID array FOR A MATCH, g[k], WITH g2. ## FOR A MATCH, SET x2,y2,z2 to gx[k],gy[k],gz[k]. ################################################################ xyz2="NOT FOUND" for (k=1; k<=Ngrid ; k++) { if (g[k]==g2) { x2=gx[k] ; y2=gy[k] ; z2=gz[k]; xyz2="FOUND" } } if ( xyz2=="NOT FOUND" ) { print "*ERROR: NO GRID COORDS FOUND for GRID "g2" of CHEXA "e"." } ## *FOR TESTING* -- show the just-captured *CHEXA* data: ## (Option: Do not direct awk stdout into a file; ## allow stdout to go to screen.) if (DEBUG==1) { print "DEBUG: k="k" x2="x2" y2="y2" z2="z2 } ################################################################ ## SCAN THE g[.] GRID-ID array FOR A MATCH, g[k], WITH g3. ## FOR A MATCH, SET x3,y3,z3 to gx[k],gy[k],gz[k]. ################################################################ xyz3="NOT FOUND" for (k=1; k<=Ngrid ; k++) { if (g[k]==g3) { x3=gx[k] ; y3=gy[k] ; z3=gz[k]; xyz3="FOUND" } } if ( xyz3=="NOT FOUND" ) { print "*ERROR: NO GRID COORDS FOUND for GRID "g3" of CHEXA "e"." } ## *FOR TESTING* -- show the just-captured *CHEXA* data: ## (Option: Do not direct awk stdout into a file; ## allow stdout to go to screen.) if (DEBUG==1) { print "DEBUG: k="k" x3="x3" y3="y3" z3="z3 } ################################################################ ## SCAN THE g[.] GRID-ID array FOR A MATCH, g[k], WITH g4. ## FOR A MATCH, SET x4,y4,z4 to gx[k],gy[k],gz[k]. ################################################################ xyz4="NOT FOUND" for (k=1; k<=Ngrid ; k++) { if (g[k]==g4) { x4=gx[k] ; y4=gy[k] ; z4=gz[k]; xyz4="FOUND" } } if ( xyz4=="NOT FOUND" ) { print "*ERROR: NO GRID COORDS FOUND for GRID "g4" of CHEXA "e"." } ## *FOR TESTING* -- show the just-captured *CHEXA* data: ## (Option: Do not direct awk stdout into a file; ## allow stdout to go to screen.) if (DEBUG==1) { print "DEBUG: k="k" x4="x4" y4="y4" z4="z4 } ################################################################ ## SCAN THE g[.] GRID-ID array FOR A MATCH, g[k], WITH g5. ## FOR A MATCH, SET x1,y1,z1 to gz[k],gy[k],gz[k]. ################################################################ xyz5="NOT FOUND" for (k=1; k<=Ngrid ; k++) { if (g[k]==g5) { x5=gx[k] ; y5=gy[k] ; z5=gz[k]; xyz5="FOUND" } } if ( xyz5=="NOT FOUND" ) { print "*ERROR: NO GRID COORDS FOUND for GRID "g5" of CHEXA "e"." } ## *FOR TESTING* -- show the just-captured *CHEXA* data: ## (Option: Do not direct awk stdout into a file; ## allow stdout to go to screen.) if (DEBUG==1) { print "DEBUG: k="k" x5="x5" y5="y5" z5="z5 } ################################################################ ## SCAN THE g[.] GRID-ID array FOR A MATCH, g[k], WITH g6. ## FOR A MATCH, SET x2,y2,z2 to gx[k],gy[k],gz[k]. ################################################################ xyz6="NOT FOUND" for (k=1; k<=Ngrid ; k++) { if (g[k]==g6) { x6=gx[k] ; y6=gy[k] ; z6=gz[k]; xyz6="FOUND" } } if ( xyz6=="NOT FOUND" ) { print "*ERROR: NO GRID COORDS FOUND for GRID "g6" of CHEXA "e"." } ## *FOR TESTING* -- show the just-captured *CHEXA* data: ## (Option: Do not direct awk stdout into a file; ## allow stdout to go to screen.) if (DEBUG==1) { print "DEBUG: k="k" x6="x6" y6="y6" z6="z6 } ################################################################ ## SCAN THE g[.] GRID-ID array FOR A MATCH, g[k], WITH g7. ## FOR A MATCH, SET x3,y3,z3 to gx[k],gy[k],gz[k]. ################################################################ xyz7="NOT FOUND" for (k=1; k<=Ngrid ; k++) { if (g[k]==g7) { x7=gx[k] ; y7=gy[k] ; z7=gz[k]; xyz7="FOUND" } } if ( xyz7=="NOT FOUND" ) { print "*ERROR: NO GRID COORDS FOUND for GRID "g7" of CHEXA "e"." } ## *FOR TESTING* -- show the just-captured *CHEXA* data: ## (Option: Do not direct awk stdout into a file; ## allow stdout to go to screen.) if (DEBUG==1) { print "DEBUG: k="k" x7="x7" y7="y7" z7="z7 } ################################################################ ## SCAN THE g[.] GRID-ID array FOR A MATCH, g[k], WITH g8. ## FOR A MATCH, SET x4,y4,z4 to gx[k],gy[k],gz[k]. ################################################################ xyz8="NOT FOUND" for (k=1; k<=Ngrid ; k++) { if (g[k]==g8) { x8=gx[k] ; y8=gy[k] ; z8=gz[k]; xyz8="FOUND" } } if ( xyz8=="NOT FOUND" ) { print "*ERROR: NO GRID COORDS FOUND for GRID "g8" of CHEXA "e"." } ## *FOR TESTING* -- show the just-captured *CHEXA* data: ## (Option: Do not direct awk stdout into a file; ## allow stdout to go to screen.) if (DEBUG==1) { print "DEBUG: k="k" x8="x8" y8="y8" z8="z8 } ################################################################################################## ################################################################################################## ## WE NOW MAKE THE HEX-BOX (six sides) OUT OF 12 TRIANGLES. ################################################################################################## ################################################################################################## ################################################################ ## CALCULATE THE FACET NORMAL OF TRIANGLE#1 (using pts 1,3,2) ## of THE CURRENT *CHEXA* ELEMENT. ################################################################ ax=x3-x1; ay=y3-y1; az=z3-z1 bx=x2-x1; by=y2-y1; bz=z2-z1 cx=ay*bz-az*by cy=az*bx-ax*bz cz=ax*by-ay*bx ##################### ## TO FLIP THE NORMAL, ## if necessary. ##################### # cx=-cx # cy=-cy # cz=-cz ################################################################ ## OUTPUT THE SET OF STL RECS CORRESPONDING TO TRIANGLE#1 ## of THE CURRENT *CHEXA* ELEMENT. ################################################################ print "facet normal "cx" "cy" "cz print " outer loop" print " vertex "x1" "y1" "z1 print " vertex "x3" "y3" "z3 print " vertex "x2" "y2" "z2 print " endloop" print "endfacet" ################################################################ ## CALCULATE THE FACET NORMAL OF TRIANGLE#2 (using pts 1,4,3) ## of THE CURRENT *CHEXA* ELEMENT. ################################################################ ax=x4-x1; ay=y4-y1; az=z4-z1 bx=x3-x1; by=y3-y1; bz=z3-z1 cx=ay*bz-az*by cy=az*bx-ax*bz cz=ax*by-ay*bx ################################################################ ## OUTPUT THE SET OF STL RECS CORRESPONDING TO TRIANGLE#2 ## of THE CURRENT *CHEXA* ELEMENT. ################################################################ print "facet normal "cx" "cy" "cz print " outer loop" print " vertex "x1" "y1" "z1 print " vertex "x4" "y4" "z4 print " vertex "x3" "y3" "z3 print " endloop" print "endfacet" ################################################################ ## CALCULATE THE FACET NORMAL OF TRIANGLE#3 (using pts 5,6,7) ## of THE CURRENT *CHEXA* ELEMENT. ################################################################ ax=x6-x5; ay=y6-y5; az=z6-z5 bx=x7-x5; by=y7-y5; bz=z7-z5 cx=ay*bz-az*by cy=az*bx-ax*bz cz=ax*by-ay*bx ################################################################ ## OUTPUT THE SET OF STL RECS CORRESPONDING TO TRIANGLE#3 ## of THE CURRENT *CHEXA* ELEMENT. ################################################################ print "facet normal "cx" "cy" "cz print " outer loop" print " vertex "x5" "y5" "z5 print " vertex "x6" "y6" "z6 print " vertex "x7" "y7" "z7 print " endloop" print "endfacet" ################################################################ ## CALCULATE THE FACET NORMAL OF TRIANGLE#4 (using pts 5,7,8) ## of THE CURRENT *CHEXA* ELEMENT. ################################################################ ax=x7-x5; ay=y7-y5; az=z7-z5 bx=x8-x5; by=y8-y5; bz=z8-z5 cx=ay*bz-az*by cy=az*bx-ax*bz cz=ax*by-ay*bx ################################################################ ## OUTPUT THE SET OF STL RECS CORRESPONDING TO TRIANGLE#4 ## of THE CURRENT *CHEXA* ELEMENT. ################################################################ print "facet normal "cx" "cy" "cz print " outer loop" print " vertex "x5" "y5" "z5 print " vertex "x7" "y7" "z7 print " vertex "x8" "y8" "z8 print " endloop" print "endfacet" ################################################################ ## CALCULATE THE FACET NORMAL OF TRIANGLE#5 (using pts 1,2,6) ## of THE CURRENT *CHEXA* ELEMENT. ################################################################ ax=x2-x1; ay=y2-y1; az=z2-z1 bx=x6-x1; by=y6-y1; bz=z6-z1 cx=ay*bz-az*by cy=az*bx-ax*bz cz=ax*by-ay*bx ################################################################ ## OUTPUT THE SET OF STL RECS CORRESPONDING TO TRIANGLE#5 ## of THE CURRENT *CHEXA* ELEMENT. ################################################################ print "facet normal "cx" "cy" "cz print " outer loop" print " vertex "x1" "y1" "z1 print " vertex "x2" "y2" "z2 print " vertex "x6" "y6" "z6 print " endloop" print "endfacet" ################################################################ ## CALCULATE THE FACET NORMAL OF TRIANGLE#6 (using pts 1,6,5) ## of THE CURRENT *CHEXA* ELEMENT. ################################################################ ax=x6-x1; ay=y6-y1; az=z6-z1 bx=x5-x1; by=y5-y1; bz=z5-z1 cx=ay*bz-az*by cy=az*bx-ax*bz cz=ax*by-ay*bx ################################################################ ## OUTPUT THE SET OF STL RECS CORRESPONDING TO TRIANGLE#6 ## of THE CURRENT *CHEXA* ELEMENT. ################################################################ print "facet normal "cx" "cy" "cz print " outer loop" print " vertex "x1" "y1" "z1 print " vertex "x6" "y6" "z6 print " vertex "x5" "y5" "z5 print " endloop" print "endfacet" ################################################################ ## CALCULATE THE FACET NORMAL OF TRIANGLE#7 (using pts 3,4,8) ## of THE CURRENT *CHEXA* ELEMENT. ################################################################ ax=x4-x3; ay=y4-y3; az=z4-z3 bx=x8-x3; by=y8-y3; bz=z8-z3 cx=ay*bz-az*by cy=az*bx-ax*bz cz=ax*by-ay*bx ################################################################ ## OUTPUT THE SET OF STL RECS CORRESPONDING TO TRIANGLE#7 ## of THE CURRENT *CHEXA* ELEMENT. ################################################################ print "facet normal "cx" "cy" "cz print " outer loop" print " vertex "x3" "y3" "z3 print " vertex "x4" "y4" "z4 print " vertex "x8" "y8" "z8 print " endloop" print "endfacet" ################################################################ ## CALCULATE THE FACET NORMAL OF TRIANGLE#8 (using pts 3,8,7) ## of THE CURRENT *CHEXA* ELEMENT. ################################################################ ax=x8-x3; ay=y8-y3; az=z8-z3 bx=x7-x3; by=y7-y3; bz=z7-z3 cx=ay*bz-az*by cy=az*bx-ax*bz cz=ax*by-ay*bx ################################################################ ## OUTPUT THE SET OF STL RECS CORRESPONDING TO TRIANGLE#8 ## of THE CURRENT *CHEXA* ELEMENT. ################################################################ print "facet normal "cx" "cy" "cz print " outer loop" print " vertex "x3" "y3" "z3 print " vertex "x8" "y8" "z8 print " vertex "x7" "y7" "z7 print " endloop" print "endfacet" ################################################################ ## CALCULATE THE FACET NORMAL OF TRIANGLE#9 (using pts 1,5,8) ## of THE CURRENT *CHEXA* ELEMENT. ################################################################ ax=x5-x1; ay=y5-y1; az=z5-z1 bx=x8-x1; by=y8-y1; bz=z8-z1 cx=ay*bz-az*by cy=az*bx-ax*bz cz=ax*by-ay*bx ################################################################ ## OUTPUT THE SET OF STL RECS CORRESPONDING TO TRIANGLE#9 ## of THE CURRENT *CHEXA* ELEMENT. ################################################################ print "facet normal "cx" "cy" "cz print " outer loop" print " vertex "x1" "y1" "z1 print " vertex "x5" "y5" "z5 print " vertex "x8" "y8" "z8 print " endloop" print "endfacet" ################################################################ ## CALCULATE THE FACET NORMAL OF TRIANGLE#10 (using pts 1,8,4) ## of THE CURRENT *CHEXA* ELEMENT. ################################################################ ax=x8-x1; ay=y8-y1; az=z8-z1 bx=x4-x1; by=y4-y1; bz=z4-z1 cx=ay*bz-az*by cy=az*bx-ax*bz cz=ax*by-ay*bx ################################################################ ## OUTPUT THE SET OF STL RECS CORRESPONDING TO TRIANGLE#10 ## of THE CURRENT *CHEXA* ELEMENT. ################################################################ print "facet normal "cx" "cy" "cz print " outer loop" print " vertex "x1" "y1" "z1 print " vertex "x8" "y8" "z8 print " vertex "x4" "y4" "z4 print " endloop" print "endfacet" ################################################################ ## CALCULATE THE FACET NORMAL OF TRIANGLE#11 (using pts 2,3,7) ## of THE CURRENT *CHEXA* ELEMENT. ################################################################ ax=x3-x2; ay=y3-y2; az=z3-z2 bx=x7-x2; by=y7-y2; bz=z7-z2 cx=ay*bz-az*by cy=az*bx-ax*bz cz=ax*by-ay*bx ################################################################ ## OUTPUT THE SET OF STL RECS CORRESPONDING TO TRIANGLE#11 ## of THE CURRENT *CHEXA* ELEMENT. ################################################################ print "facet normal "cx" "cy" "cz print " outer loop" print " vertex "x2" "y2" "z2 print " vertex "x3" "y3" "z3 print " vertex "x7" "y7" "z7 print " endloop" print "endfacet" ################################################################ ## CALCULATE THE FACET NORMAL OF TRIANGLE#12 (using pts 2,7,6) ## of THE CURRENT *CHEXA* ELEMENT. ################################################################ ax=x7-x2; ay=y7-y2; az=z7-z2 bx=x6-x2; by=y6-y2; bz=z6-z2 cx=ay*bz-az*by cy=az*bx-ax*bz cz=ax*by-ay*bx ################################################################ ## OUTPUT THE SET OF STL RECS CORRESPONDING TO TRIANGLE#12 ## of THE CURRENT *CHEXA* ELEMENT. ################################################################ print "facet normal "cx" "cy" "cz print " outer loop" print " vertex "x2" "y2" "z2 print " vertex "x7" "y7" "z7 print " vertex "x6" "y6" "z6 print " endloop" print "endfacet" } ## END OF if ($1=="CHEXA" || $1=="chexa") ## END OF main-section of awk-prog } END { printf ("ENDSOLID - created via $HOME/Dscrtest/test_nasinp2stl_chexa\n") } ## END OF awk prog