## *TEST* ## 'awk' PROGRAM NAME: feinp_generic2stl_awkprogTESTctetra ## ## 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' CTETRA RECORDS ## into an STL file. ## ## ** This awk-program READs a 'GENERIC' FE input file and ## ** EXTRACTs data from 'generic' GRID and 'generic' ELEMENT records ## ** (CTETRA 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 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 file is created in (and 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: ## - CTETRA ######################################################################## ## MAINTENANCE HISTORY: ## Written by: B.Montandon O06 16Aug2000 'nasinp2stl_TESTctetra(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_TESTctetra' ## into this awkprog file. ######################################################################## ######################################################################### ## awk-prog to TRANSLATE a 'GENERIC' CTETRA 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 INPUT FOR TESTING: # FILEIN="/apps/nns_com/fea/demos_nas2stl/ctetras_1.dat" # FILEIN="/apps/nns_com/fea/demos_nas2stl/ctetras_1b.dat" # FILEIN="/apps/nns_com/fea/demos_nas2stl/ctetras_5.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, ## in a more descriptively named variable. ######################################################## Ngrid=i ################################################################################ ## LOOK FOR 'CTETRA' IN THE FIRST FIELD. ## INCREMENT THE ELEMENT-REC COUNT, j. ################################################################################ if ($1=="CTETRA" || $1=="ctetra") {j++ ####################################################################### ## STORE THE 'CETRA' ELEMENT-ID IN THE e VAR. ## STORE THE 4th, 5th, 6th FIELDS (3 grid ids) ## IN THE g1, g2, e3 VARS. ####################################################################### e=$2; g1=$4; g2=$5; e3=$6; e4=$7 ## *FOR TESTING* -- show the just-captured 'CTETRA' 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="e" g1="g1" g2="g2" e3="e3" e4="e4 } ####################################################################### ## 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 CTETRA "e"." } ## *FOR TESTING* -- show the just-captured 'CTETRA' 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 CTETRA "e"." } ## *FOR TESTING* -- show the just-captured 'CTETRA' 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 e3. ## 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]==e3) { x3=gx[k] ; y3=gy[k] ; z3=gz[k]; xyz3="FOUND" } } if ( xyz3=="NOT FOUND" ) { print "*ERROR: NO GRID COORDS FOUND for GRID "e3" of CTETRA "e"." } ## *FOR TESTING* -- show the just-captured 'CTETRA' 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 } ############################################################## ## SCAN THE g[.] GRID-ID array FOR A MATCH, g[k], WITH e4. ## 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]==e4) { x4=gx[k] ; y4=gy[k] ; z4=gz[k]; xyz4="FOUND" } } if ( xyz4=="NOT FOUND" ) { print "*ERROR: NO GRID COORDS FOUND for GRID "e4" of CTETRA "e"." } ## *FOR TESTING* -- show the just-captured 'CTETRA' data: ## (Option: Do not direct awk stdout into a file; ## allow stdout to go to screen.) if (DEBUG==1) { print "k="k" x4="x4" y4="y4" z4="z4 } ############################################################## ## CALCULATE THE FACET NORMAL of 'FACE1' OF THE CURRENT ## 'CTETRA' ELEMENT --- using xyz1,xyz2,xyz3. ############################################################## 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 cx=-cx cy=-cy cz=-cz ############################################################## ## OUTPUT THE SET OF STL RECS CORRESPONDING TO 'FACE1' OF ## THE CURRENT 'CTETRA' 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" ############################################################## ## CALCULATE THE FACET NORMAL of 'FACE2' OF THE CURRENT ## 'CTETRA' ELEMENT --- using xyz1,xyz2,xyz4. ############################################################## ax=x2-x1; ay=y2-y1; az=z2-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 'FACE2' OF ## THE CURRENT 'CTETRA' ELEMENT. ############################################################## print "facet normal "cx" "cy" "cz print " outer loop" print " vertex "x1" "y1" "z1 print " vertex "x2" "y2" "z2 print " vertex "x4" "y4" "z4 print " endloop" print "endfacet" ############################################################## ## CALCULATE THE FACET NORMAL of 'FACE3' OF THE CURRENT ## 'CTETRA' ELEMENT --- using xyz1,xyz3,xyz4. ############################################################## ax=x3-x1; ay=y3-y1; az=z3-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 cx=-cx cy=-cy cz=-cz ############################################################## ## OUTPUT THE SET OF STL RECS CORRESPONDING TO 'FACE3' OF ## THE CURRENT 'CTETRA' ELEMENT. ############################################################## print "facet normal "cx" "cy" "cz print " outer loop" print " vertex "x1" "y1" "z1 print " vertex "x3" "y3" "z3 print " vertex "x4" "y4" "z4 print " endloop" print "endfacet" ############################################################## ## CALCULATE THE FACET NORMAL of 'FACE4' OF THE CURRENT ## 'CTETRA' ELEMENT --- using xyz2,xyz3,xyz4. ############################################################## ax=x3-x2; ay=y3-y2; az=z3-z2 bx=x4-x2; by=y4-y2; bz=z4-z2 cx=ay*bz-az*by cy=az*bx-ax*bz cz=ax*by-ay*bx ############################################################## ## OUTPUT THE SET OF STL RECS CORRESPONDING TO 'FACE4' OF ## THE CURRENT 'CTETRA' ELEMENT. ############################################################## print "facet normal "cx" "cy" "cz print " outer loop" print " vertex "x2" "y2" "z2 print " vertex "x3" "y3" "z3 print " vertex "x4" "y4" "z4 print " endloop" print "endfacet" } ## END OF if ($1=="CTETRA" || $1=="ctetra") ## END OF awk prog } END { printf ("ENDSOLID - created via $FEDIR/scripts/feinp_generic2stl_awkprogTESTctetra\n") }