## *TEST* ## 'awk' PROGRAM NAME: feinp_generic2stl_awkprogTESTctriaxs ## ## 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' CTRIAx RECORDS ## into an STL file. ## ## ** This awk-program READs a 'GENERIC' FE input file and ## ** EXTRACTs data from 'generic' GRID and 'generic' ELEMENT records ## ** (CTRIAx only -- for isolated 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 CBEAM ## 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 output file is used as input in ## 'feinp_nas2stl_bygui'. See that script for more info. ## ######################################################################## ## 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: ## - CTRIA3/CTRIA6/CTRIAR ######################################################################## ## MAINTENANCE HISTORY: ## Written by: B.Montandon O06 16Aug2000 'nasinp2stl_TESTctriaxs' ## 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_TESTctriaxs' ## into this awkprog file. ######################################################################## ######################################################################### ## awk-prog to TRANSLATE the 'GENERIC' (NASTRAN-converted) file ## into an STL file. ######################################################################### ## THIS LOGIC ASSUMES *ALL* THE 'GRID' RECORDS ARE BEFORE ## THE 'element-connectivity' RECORDS. ######################################################################### BEGIN { printf ("SOLID - FROM NASTRAN INPUT %-65s\n",FILE_IN); i=0; j=0; DEBUG=0 ## i is a GRID rec counter; j is an element rec counter. } { ############################################################################## ## 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, ## in a more descriptively named variable. ######################################################## Ngrid=i ################################################################################ ## LOOK FOR 'CTRIA3' or 'CTRIA6' or 'CTRIAR' IN THE FIRST FIELD. ## INCREMENT THE ELEMENT-REC COUNT, j. ################################################################################ if ($1=="CTRIA3" || $1=="ctria3" || $1=="CTRIA6" || $1=="ctria6" || \ $1=="CTRIAR" || $1=="ctriar") {j++ ################################################################ ## STORE THE 'CTRIA3' ELEMENT-ID IN THE e VAR. ## STORE THE 4th, 5th, 6th FIELDS (3 grid ids) ## IN THE g1, g2, g3 VARS. ################################################################ e=$2; g1=$4; g2=$5; g3=$6 ## *FOR TESTING* -- show the just-captured 'CTRIA3' 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 } ################################################################ ## SCAN THE g[.] GRID-ID array FOR A MATCH, g[k], WITH g1. ## FOR A MATCH, SET x1,y1,z1 to gx[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 CTRIA3 "e"." } ## *FOR TESTING* -- show the just-captured 'CTRIA3' 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 CTRIA3 "e"." } ## *FOR TESTING* -- show the just-captured 'CTRIA3' 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 CTRIA3 "e"." } ## *FOR TESTING* -- show the just-captured 'CTRIA3' data: ## (Option: Do not direct awk stdout into a file; ## allow stdout to go to screen.) if (DEBUG==1) { print "k="k" x3="x3" y3="y3" z3="z3 } ################################################################ ## CALCULATE THE FACET NORMAL of THE CURRENT 'CTRIAx' ELEMENT. ################################################################ ax=x2-x1; ay=y2-y1; az=z2-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 ## THE CURRENT 'CTRIAx' ELEMENT. ################################################################ print "facet normal "cx" "cy" "cz print " outer loop" print " vertex "x1" "y1" "z1 print " vertex "x2" "y2" "z2 print " vertex "x3" "y3" "z3 print " endloop" print "endfacet" } ## END OF if ($1=="CTRIA3" || ... ) } END { printf ("ENDSOLID - created via $FEDIR/scripts/feinp_generic2stl_awkprogTESTctriaxs\n") }