! +++
! su_exnmg
! _________
!
! Store a VARKON CUB_SUR surface as a NMG bicubic surface.
!
! Output: A text file surname.F07 in the bicubic F07 (NMG) format
!
! ----- Description of the data in the F07 file -------------------
!
! The order of the patches:
! -------------------------
!
! IU=1,IV=NV IU=NU,IV=NV
!
-----------------------------------------
! !
! ! !
! ! !
! ! 13
! 14 ! 15 ! 16
! 17 ! 18 !
! -----------------------------------------
! !
! ! !
! ! !
! !
7 ! 8
! 9 ! 10
! 11 ! 12 !
!
----------------------------------------
! !
! ! !
! ! !
! !
1 ! 2
! 3 !
4 ! 5
! 6 !
!
----------------------------------------
!
! IU=1,IV=1 IU=NU,IV=1
!
! (
!
! Surface data header:
! -------------------
!
! Surface name Total_number_of_patches (Line 1)
! YTA/1 594 ( Ex. )
!
! Patch data header:
! ------------------
!
! I1
I2 I3 I4
I5 I6 I7
I8 I9 I10
(Line 2)
! 1 48 1 0 1001 0 0 34 19 0 ( Ex. )
!
! where
! I1 = 1 (always one)
! I2 = Number of records (coefficients) = 48 for bicubic patch
! I3 = Patch number in file
! I4 = 0 (always zero)
! I5 = Surface type = 1001 for bicubic surface
! I6 = 0
! I7 = 0
! I8 = Number of U lines in the surface
! I9 = Number of V lines in the surface
! I10 = 0 (always zero)
!
!
! The order of the coefficients for a patch:
! -----------------------------------------
!
! Line Coefficients ( for ) Coefficients ( for )
!
! 1 a00x a00y a00z (1.0 * 1.0 ) a10x a10y a10z (U * 1.0 )
! 2 a20x a20y a20z (U**2 * 1.0 ) a30x a30y a30z (U**3 * 1.0 )
! 3 a01x a01y a01z (1.0 * V ) a11x a11y a11z (U * V )
! 4 a21x a21y a21z (U**2 * V ) a31x a31y a31z (U**3 * V )
! 5 a02x a02y a02z (1.0 * V**2) a12x a12y a12z (U * V**2)
! 6 a22x a22y a22z (U**2 * V**2) a32x a32y a32z (U**3 * V**2)
! 7 a03x a03y a03z (1.0 * V**3) a13x a13y a13z (U * V**3)
! 8 a23x a23y a23z (U**2 * V**3) a33x a33y a34z (U**3 * V**3)
! ... empty line (no data) ...
!
! Order of coefficients in VARKON's GETCUBP output vector
! _______________________________________________________
!
! data( 1) = a00x data( 2) = a00y data( 3) = a00z
! data( 4) = a01x data( 5) = a01y data( 6) = a01z
! data( 7) = a02x data( 8) = a02y data( 9) = a02z
! data(10) = a03x data(11) = a03y data(12) = a03z
!
! data(13) = a10x data(14) = a10y data(15) = a10z
! data(16) = a11x data(17) = a11y data(18) = a11z
! data(19) = a12x data(20) = a12y data(21) = a12z
! data(22) = a13x data(23) = a13y data(24) = a13z
!
! data(25) = a20x data(26) = a20y data(27) = a20z
! data(28) = a21x data(29) = a21y data(30) = a21z
! data(31) = a22x data(32) = a22y data(33) = a22z
! data(34) = a23x data(35) = a23y data(36) = a23z
!
! data(37) = a30x data(38) = a30y data(39) = a30z
! data(40) = a31x data(41) = a31y data(42) = a31z
! data(43) = a32x data(44) = a32y data(45) = a32z
! data(46) = a33x data(47) = a33y data(48) = a33z
!
! The function checks that there are no NULL patches in the surface.
! The parameterization is also checked. Global parameters shall be
! integers defined by the patch adress IU,IV.
!
! ---
!
! Author:
Gunnar Liden
!
! Revisions
! ---------
!
!
2006-03-28 Gunnar Liden
!********************************************************************
GLOBAL GEOMETRY MODULE su_exnmg (
REF s_id >"@t16 Select a CUB_SUR surface";
STRING surname*24:="MySurf" >
"Surface name (will also be file name with .F07 added)" );
!sdesce Store a CUB_SUR surface as NMG bicubic surface
! Internal variables
FILE dat; ! Output (F07) file
INT typ; ! Type of surface
INT npatu; ! No patches in U direction
INT npatv; ! No patches in V direction
INT nopat; ! Patch number in file
STRING ermess1*40; ! Error message
STRING ermess2*40; ! Error message
STRING ermess3*40; ! Error message
STRING ermess4*40; ! Error message
STRING ermess5*50; ! Error message
STRING ermess6*50; ! Error message
STRING ermess7*50; ! Error message
STRING ermess8*50; ! Error message
STRING ermess9*50; ! Error message
STRING ermess10*50; ! Error message
STRING message1*50; ! PSH_PMT message
INT no_c; ! Number of characters
INT i_c; !
STRING rad*132; ! Line
INT iu; !
INT iv; !
FLOAT pdat(48); ! Patch data
FLOAT offset; ! Offset for patch
INT p_typ; ! Patch type
FLOAT u1; ! Start U value patch
FLOAT u2; ! End U value patch
FLOAT v1; ! Start V value patch
FLOAT v2; ! End V value patch
STRING s*1; ! For debug printout to screen
BEGINMODULE
! +++
! Algorithm
! ---
! +++
! 1. Initializations and check of input data
! ---
ermess1:=surname+".F07 exists";
ermess2:="Open "+surname+
".F07failed";
ermess3:=" ";
ermess4:="Not a"+
" CUB_SUR surface";
ermess5:="Not a"+
" CUB_PAT patch. Type= ";
ermess6:="Parameterization "+
" not OK. ustart= ";
ermess7:="Parameterization "+
" not OK. uend= ";
ermess8:="Parameterization "+
" not OK. vstart= ";
ermess9:="Parameterization "+
" not OK. vend= ";
ermess10:="Offset patch cannot"
+ "be exported. Offset= ";
message1:="su_exnmg "+
" Creating ";
! +++
! Open file. Exit with error if file already exists on
! the active JOB directory
! ---
! Check if file already exists
OPEN(dat,"r",act_jobdir()
+surname+".F07");
IF (IOSTAT(dat) <> 0 ) THEN
! OK, file does not exist
;
ELSE
CLOSE(dat);
EXIT("su_exnmg " + ermess1 );
ENDIF;
! Message to screen
PSH_PMT(message1+ACT_JOBDIR()+surname+".F07");
! Open output .DAT (F07) file
OPEN(dat,"w",act_jobdir()+
surname+".F07");
IF (IOSTAT(dat) <> 0 ) THEN
EXIT("su_exnmg " + ermess2 );
ENDIF;
! +++
! Retrieve surface type and number of patches in U and V direction
! ---
GETSURH(s_id,"SUR_TYPE",typ);
GETSURH(s_id,"NPATU",npatu);
GETSURH(s_id,"NPATV",npatv);
! A CUB_SUR surface?
IF typ <> 1 THEN
CLOSE(dat);
POP_PMT();
EXIT("su_exnmg " + ermess4 );
ENDIF;
! +++
! Write header
! ---
no_c := LENGTH(surname); ! Number of characters in surname
rad:= " " + surname; ! Two blanks and surname
FOR i_c:= 2+no_c
TO 30 DO ! Add blanks
rad:= rad + " "; !
ENDFOR; !
rad:=rad+STR(npatu*npatv,6,0);! Add total number of patches
OUTSTR(dat,rad); ! Write line 1
OUTLIN(dat); ! End Of Line
! +++
! Write patch data
! ---
nopat := 0; ! Initialize number of patches
FOR iv:= 1 TO npatv DO ! Start loop V patches
FOR iu:= 1 TO npatu DO ! Start loop U patches
nopat:= nopat+1; ! An additional patch
rad:= " "; ! Patch data header (Line 2)
rad:= rad+STR(
1 ,5,0); !
rad:= rad+STR( 48 ,5,0);
!
rad:= rad+STR(nopat,5,0); !
rad:= rad+STR( 0 ,5,0);
!
rad:= rad+STR( 1001,5,0); !
rad:= rad+STR( 0 ,5,0);
!
rad:= rad+STR( 0 ,5,0);
!
rad:= rad+STR(npatu+1,5,0); !
rad:= rad+STR(npatv+1,5,0); !
rad:= rad+STR( 0 ,5,0);
!
OUTSTR(dat,rad); ! Write line 2
OUTLIN(dat); ! End Of Line
GETTOPP(s_id,iu,iv,p_typ, ! Get topological data
u1,u2,v1,v2); !
IF p_typ <> 1 THEN ! Check for NULL patch
CLOSE(dat); !
POP_PMT(); !
EXIT("su_exnmg " + !
ermess5 + !
STR(p_typ,-1,0) ); !
ENDIF; !
IF ABS(iu+0-u1)>0.0001 THEN ! Check parameterization
CLOSE(dat); !
POP_PMT(); !
EXIT("su_exnmg " +
!
ermess6 + !
STR(u1,-12,8) );
!
ENDIF; !
IF ABS(iu+1-u2)>0.0001 THEN !
CLOSE(dat); !
POP_PMT(); !
EXIT("su_exnmg " + !
ermess7 + !
STR(u2,-12,8) ); !
ENDIF; !
IF ABS(iv+0-v1)>0.0001 THEN ! Check parameterization
CLOSE(dat); !
POP_PMT(); !
EXIT("su_exnmg " + !
ermess8 + !
STR(v1,-12,8) ); !
ENDIF; !
IF ABS(iv+1-v2)>0.0001 THEN !
CLOSE(dat); !
POP_PMT(); !
EXIT("su_exnmg " + !
ermess9 + !
STR(v2,-12,8) ); !
ENDIF; !
GETCUBP(s_id,iu,iv,pdat, ! Get patch data
offset); !
IF ABS(offset) >0.0001 THEN !
CLOSE(dat); !
POP_PMT(); !
EXIT("su_exnmg " + !
ermess10 + !
STR(offset,-12,8) ); !
ENDIF; !
rad:= STR(pdat( 1),12,5);! a00x (Line 1)
rad:=rad+STR(pdat( 2),12,5);! a00y
rad:=rad+STR(pdat( 3),12,5);! a00z
rad:=rad+STR(pdat(13),12,5);! a10x
rad:=rad+STR(pdat(14),12,5);! a10y
rad:=rad+STR(pdat(15),12,5);! a10z
OUTSTR(dat,rad); ! Write line
OUTLIN(dat); ! End Of Line
rad:= STR(pdat(25),12,5);! a20x (Line 2)
rad:=rad+STR(pdat(26),12,5);! a20y
rad:=rad+STR(pdat(27),12,5);! a20z
rad:=rad+STR(pdat(37),12,5);! a30x
rad:=rad+STR(pdat(38),12,5);! a30y
rad:=rad+STR(pdat(39),12,5);! a30z
OUTSTR(dat,rad); ! Write line
OUTLIN(dat); ! End Of Line
rad:= STR(pdat( 4),12,5);! a01x (Line 3)
rad:=rad+STR(pdat( 5),12,5);! a01y
rad:=rad+STR(pdat( 6),12,5);! a01z
rad:=rad+STR(pdat(16),12,5);! a11x
rad:=rad+STR(pdat(17),12,5);! a11y
rad:=rad+STR(pdat(18),12,5);! a11z
OUTSTR(dat,rad); ! Write line
OUTLIN(dat); ! End Of Line
rad:= STR(pdat(28),12,5);! a21x (Line 4)
rad:=rad+STR(pdat(29),12,5);! a21y
rad:=rad+STR(pdat(30),12,5);! a21z
rad:=rad+STR(pdat(40),12,5);! a31x
rad:=rad+STR(pdat(41),12,5);! a31y
rad:=rad+STR(pdat(42),12,5);! a31z
OUTSTR(dat,rad); ! Write line
OUTLIN(dat); ! End Of Line
rad:= STR(pdat( 7),12,5);! a02x (Line 5)
rad:=rad+STR(pdat( 8),12,5);! a02y
rad:=rad+STR(pdat( 9),12,5);! a02z
rad:=rad+STR(pdat(19),12,5);! a12x
rad:=rad+STR(pdat(20),12,5);! a12y
rad:=rad+STR(pdat(21),12,5);! a12z
OUTSTR(dat,rad); ! Write line
OUTLIN(dat); ! End Of Line
rad:= STR(pdat(31),12,5);! a22x (Line 6)
rad:=rad+STR(pdat(32),12,5);! a22y
rad:=rad+STR(pdat(33),12,5);! a22z
rad:=rad+STR(pdat(43),12,5);! a32x
rad:=rad+STR(pdat(44),12,5);! a32y
rad:=rad+STR(pdat(45),12,5);! a32z
OUTSTR(dat,rad); ! Write line
OUTLIN(dat); ! End Of Line
rad:= STR(pdat(10),12,5);! a03x (Line 7)
rad:=rad+STR(pdat(11),12,5);! a03y
rad:=rad+STR(pdat(12),12,5);! a03z
rad:=rad+STR(pdat(22),12,5);! a13x
rad:=rad+STR(pdat(23),12,5);! a13y
rad:=rad+STR(pdat(24),12,5);! a13z
OUTSTR(dat,rad); ! Write line
OUTLIN(dat); ! End Of Line
rad:= STR(pdat(34),12,5);! a23x (Line 8)
rad:=rad+STR(pdat(35),12,5);! a23y
rad:=rad+STR(pdat(36),12,5);! a23z
rad:=rad+STR(pdat(46),12,5);! a33x
rad:=rad+STR(pdat(47),12,5);! a33y
rad:=rad+STR(pdat(48),12,5);! a33z
OUTSTR(dat,rad); ! Write line
OUTLIN(dat); ! End Of Line
OUTLIN(dat); ! Empty Line
ENDFOR; ! End loop U patches
ENDFOR; ! End loop V patches
! +++
! Close output file
! ---
CLOSE(dat);
! Erase message on screen
POP_PMT();
ENDMODULE