PROGRAM PARGEN C C....................................................................... C AN INTERACTIVE PREPROCESSOR TO HELP THE C O N F P A C K USER C GENERATE THE FORTRAN CODE DEFINING THE BOUNDARY PARAMETRISATION C AND ITS DERIVATIVE. C C THE FOLLOWING CONVENTIONS ARE ASSUMED: C C ** IF A QUESTION REQUIRES A YES OR NO ANSWER, THE DETECTION OF 'Y' OR C 'y' IN THE FIRST 6 INPUT CHARACTERS IS TAKEN AS YES, ANYTHING ELSE C AS NO. C C ** WHEN ASKED FOR COORDINATES, THIS ALWAYS MEANS CARTESIAN COORDIN- C ATES AND THESE SHOULD BE SUPPLIED AS TWO REAL NUMBERS, AS EITHER C C X,Y OR X Y C C WITHOUT PARENTHESES. C C ** FOUR TYPES OF ARCS ARE CURRENTLY TREATED, WITH NUMERICAL CODES TO C DENOTE THE TYPE AS FOLLOWS: C 1:= LINE SEGMENT. C 2:= CIRCULAR ARC SEGMENT. C CONVENTIONS: C 1 - THE ANGLE SUBTENDED AT THE CENTRE IS POSITIVE FOR C ANTICLOCKWISE TRAVERSAL OF THE ARC AND NEGATIVE FOR C CLOCKWISE TRAVERSAL. C 3:= THE USER IS ASKED TO SUPPLY THE FORTRAN 77 ARITHMETIC C EXPRESSIONS WHICH DEFINE THE CARTESIAN PARAMETRIC FUNCTION C AND THE DERIVATIVE OF THIS FUNCTION. C CONVENTIONS: C 1 - THE PARAMETER MUST BE DENOTED BY T. C 2 - THE REAL CONSTANT PI=3.14159.. AND THE COMPLEX CONSTANT C UI=(0.0,1.0) MAY BE USED IN THE ARITHMETIC EXPRESSIONS. C 4:= THE USER IS ASKED TO SUPPLY THE FORTRAN 77 ARITHMETIC C EXPRESSIONS WHICH DEFINE THE POLAR COORDINATE AS A FUNCTION C OF POLAR ANGLE AND THE DERIVATIVE OF THIS FUNCTION. C CONVENTIONS: C 1 - THE POLAR ANGLE MUST BE DENOTED BY T. C 2 - THE REAL CONSTANT PI=3.14159.. MAY BE USED IN THE ARITH- C METIC EXPRESSIONS. C 3 - PARGEN ASSIGNS THE EXPRESSION FOR THE RADIUS TO THE C COMPLEX VARIABLE ZRAD; IF REQUIRED THE USER MAY THERE- C FORE USE THE VARIABLE ZRAD IN THE EXPRESSION FOR THE C DERIVATIVE OF THE RADIUS WRT POLAR ANGLE C IN ADDITION, FOR TYPES 3 AND 4, THE FOLLOWING CONVENTIONS HOLD: C 1 - ONLY USE UP TO 66 CHARACTERS PER LINE. C 2 - IF THE EXPRESSION OCCUPIES MORE THAN ONE LINE THEN THERE C IS NO NEED TO SUPPLY ANY CONTINUATION CHARACTER. C 3 - ONLY USE THOSE FORTRAN 77 INTRINSIC MATHS FUNCTIONS C WHICH ACCEPT COMPLEX ARGUMENTS AND ARE ANALYTIC; I.E., C IN STANDARD FORTRAN, C SQRT, EXP, LOG, SIN, COS C 4 - THE WHOLE EXPRESSION SHOULD BE TERMINATED WITH A C REPEATED DIVISION SIGN, I.E. //. C C ** THE CODE ISN'T VERY ROBUST IN THAT THERE IS LITTLE PROVISION FOR C INTERACTIVE CORRECTION OF ERRORS. HOWEVER, ALL THE USER'S INPUT C IS AUTOMATICALLY OUTPUT TO A FILE NAMED pgenin. IF THE USER C REALISES THAT AN ITEM HAS BEEN INPUT INCORRECTLY, THE BEST POLICY C IS TO CARRY ON TO THE END OF THE INPUT PHASE AND THEN TERMINATE C THE EXECUTION; THE FILE pgenin CAN BE EDITED, RENAMED AND C SUBMITTED AS STANDARD INPUT FOR A SECOND RUN OF PARGEN. C (THE SUGGESTION TO RENAME IS TO AVOID ANY POSSIBLE DIFFICULTY C ARISING FROM READING THE FILE AS STANDARD INPUT WHILST ALSO C WRITING OUTPUT TO THE SAME FILE.) C IF THE USER REALISES ONLY AT A LATER STAGE (E.G. IN PLOTTING THE C BOUNDARY) THAT AN ITEM HAS BEEN INPUT INCORRECTLY THEN pgenin C MAY STILL BE AVAILABLE FOR RE-USE AS ABOVE. C C SUBROUTINES OR FUNCTIONS NEEDED C - THE CONFPACK LIBRARY. C - THE REAL FUNCTION R1MACH. C C....................................................................... C AUTHOR: DAVID HOUGH, COVENTRY POLYTECHNIC, UK C LAST UPDATE: 15 FEB 1991 C....................................................................... C C LOCAL VARIABLES C INTEGER CHIN,CHNL,GMCO,IA,I,IER,J,L,MNARC,NARCS,ORDRG,ORDSG,SW, +TXCO,TYPE REAL ALPHA,EPS,PI,R1MACH,X,Y COMPLEX CENSY,RTUNI,U2 LOGICAL CHRIN,REFLN,SYMTY,CHCK CHARACTER TXT*72,TABC*6,FORTFL*72,CH*2,SIG(10)*2,WID(10)*2,REDD*6, +FMT1*8,FMT2*9 C PARAMETER (MNARC=100,TABC=' +',CHNL=20,CHIN=21) INTEGER ARCTY(MNARC),PGM(MNARC),PTX(MNARC*2),NTX(MNARC*2) REAL RGM(3*MNARC) COMPLEX STAPT(MNARC) LOGICAL NUMDER(MNARC) CHARACTER DEFN(MNARC*2)*72 C EXTERNAL CHRIN,HEADER,R1MACH,SYINF1,WRFUN1,WRFUN2,WRHEAD,WRSYM1, +WRSYM2,WRSYM3,WRTAIL C DATA +SIG/'7','8','9','10','11','12','13','14','15','16'/ +WID/'15','16','17','18','19','20','21','22','23','24'/ C CALL WRHEAD(6,0) C PI=4E+0*ATAN(1E+0) OPEN(CHIN,FILE='pgenin') C C**** DETERMINE NUMBER OF SIGNIFICANT FIGURES REQUIRED TO MATCH MACHINE C**** PRECISION AND SET UP POINTER SW TO SIG AND WID C EPS=R1MACH(4) SW=INT(-LOG10(EPS))+2 IF (SW.LE.7) THEN SW=1 ELSE IF (SW.GE.16) THEN SW=10 ELSE SW=SW-6 ENDIF C C**** SET UP THE EDIT DESCRIPTOR AND FORMAT SPECIFICATION FOR FLOATING C**** POINT OUTPUT C REDD='E'//WID(SW)//'.'//SIG(SW) FMT1='('//REDD//')' FMT2='(2'//REDD//')' C WRITE(*,*) 'FILENAME TO RECEIVE OUTPUT FORTRAN CODE?' READ(*,'(A)') FORTFL WRITE(CHIN,'(A)') FORTFL C WRITE(*,*) 'DOES THE DOMAIN HAVE ANY SYMMETRY?' SYMTY=CHRIN('Y','y') IF (SYMTY) THEN WRITE(CHIN,*) 'Y',' ..SYMMETRY' ELSE WRITE(CHIN,*) 'N',' ..SYMMETRY' ENDIF IF (SYMTY) THEN WRITE(*,*) 'ARE THERE ANY REFLECTIONAL SYMMETRIES?' REFLN=CHRIN('Y','y') IF (REFLN) THEN WRITE(CHIN,*) 'Y',' ..REFLECTIONAL SYMMETRY' ELSE WRITE(CHIN,*) 'N',' ..REFLECTIONAL SYMMETRY' ENDIF WRITE(*,*) 'WHAT ARE THE COORDINATES OF THE CENTRE OF SYMMETRY?' READ(*,*) X,Y WRITE(CHIN,FMT2) X,Y CENSY=CMPLX(X,Y) WRITE(*,*) 'HOW MANY ARCS ARE THERE ON THE FUNDAMENTAL BOUNDARY +SECTION?' READ(*,*) NARCS WRITE(CHIN,*) NARCS,' ..NUMBER OF ARCS ON FBS' ELSE WRITE(*,*) 'HOW MANY ARCS ARE THERE ON THE BOUNDARY?' READ(*,*) NARCS WRITE(CHIN,*) NARCS,' ..NUMBER OF ARCS ON BOUNDARY' ENDIF C IF (NARCS.GT.MNARC-1) THEN IER=58 GOTO 999 ENDIF C GMCO=0 TXCO=0 C DO 100 IA=1,NARCS NUMDER(IA)=.FALSE. 5 CONTINUE WRITE(*,'(//A,I2,A)') 'TYPE OF ARC ',IA,'?' READ(*,*) TYPE WRITE(CHIN,*) TYPE,' ..TYPE FOR ARC',IA IF (TYPE.EQ.1) THEN ARCTY(IA)=TYPE WRITE(*,*) 'COORDINATES OF INITIAL POINT ON LINE?' READ(*,*) X,Y WRITE(CHIN,FMT2) X,Y STAPT(IA)=CMPLX(X,Y) ELSE IF (TYPE.EQ.2) THEN ARCTY(IA)=TYPE WRITE(*,*) 'COORDINATES OF INITIAL POINT ON CIRCLE?' READ(*,*) X,Y WRITE(CHIN,FMT2) X,Y STAPT(IA)=CMPLX(X,Y) WRITE(*,*) 'COORDINATES OF CENTRE OF CIRCLE?' READ(*,*) X,Y WRITE(CHIN,FMT2) X,Y WRITE(*,*)'SIGNED ANGLE SUBTENDED AT CENTRE (IN UNITS OF PI)?' READ(*,*) ALPHA WRITE(CHIN,FMT1) ALPHA GMCO=GMCO+1 PGM(IA)=GMCO RGM(GMCO)=X GMCO=GMCO+1 RGM(GMCO)=Y GMCO=GMCO+1 RGM(GMCO)=ALPHA*PI ELSE IF (TYPE.EQ.3 .OR. TYPE.EQ.4) THEN ARCTY(IA)=TYPE WRITE(*,*) 'COORDINATES OF INITIAL POINT ON CURVE?' READ(*,*) X,Y WRITE(CHIN,FMT2) X,Y STAPT(IA)=CMPLX(X,Y) IF (TYPE.EQ.3) THEN WRITE(*,*) 'INITIAL AND FINAL PARAMETER VALUES?' ELSE WRITE(*,*)'INITIAL AND FINAL POLAR ANGLES (IN UNITS OF PI)?' ENDIF READ(*,*) X,Y WRITE(CHIN,FMT2) X,Y GMCO=GMCO+1 PGM(IA)=GMCO IF (TYPE.EQ.4) THEN RGM(GMCO)=X*PI GMCO=GMCO+1 RGM(GMCO)=Y*PI ELSE RGM(GMCO)=X GMCO=GMCO+1 RGM(GMCO)=Y ENDIF DO 50 J=1,2 IF (J.EQ.1 .AND. TYPE.EQ.3) THEN WRITE(*,*) 'FORTRAN EXPRESSION FOR PARFUN?' ELSE IF (J.EQ.2 .AND. TYPE.EQ.3) THEN WRITE(*,*) 'FORTRAN EXPRESSION FOR DPARFN?' ELSE IF (J.EQ.1 .AND. TYPE.EQ.4) THEN WRITE(*,*) 'FORTRAN EXPRESSION FOR RADIUS?' ELSE WRITE(*,*) 'FORTRAN EXPRESSION FOR RADIUS DERIVATIVE?' ENDIF C TXCO=TXCO+1 PTX(IA+(J-1)*MNARC)=TXCO I=1 C 10 CONTINUE READ(*,'(A72)') TXT WRITE(CHIN,'(A72)') TXT L=INDEX(TXT,'//') IF (L.EQ.0) THEN IF (TXT(67:72) .NE. ' ') THEN WRITE(*,*) 'THIS LINE IS MORE THAN 66CH LONG.' WRITE(*,*) 'PLEASE SPLIT AND ENTER AS SEPERATE LINES.' GOTO 10 ENDIF DEFN(TXCO)=TABC//TXT I=I+1 TXCO=TXCO+1 GOTO 10 ELSE IF (L.GT.67) THEN WRITE(*,*) 'THIS LINE IS MORE THAN 66CH LONG.' WRITE(*,*) 'PLEASE SPLIT AND ENTER AS SEPERATE LINES.' GOTO 10 ENDIF NTX(IA+(J-1)*MNARC)=I IF (L.EQ.1) THEN DEFN(TXCO)=TABC NUMDER(IA)=.TRUE. ELSE DEFN(TXCO)=TABC//TXT(1:L-1) ENDIF ENDIF IF (J.EQ.1 .AND. TYPE.EQ.4) THEN WRITE(*,*) '(... = ZRAD)' ENDIF 50 CONTINUE ELSE WRITE(*,*) 'TYPE MUST BE EITHER 1,2,3 OR 4' GOTO 5 ENDIF 100 CONTINUE C IF (SYMTY) THEN WRITE(*,*) 'COORDINATES OF FINAL POINT ON THIS ARC?' READ(*,*) X,Y WRITE(CHIN,FMT2) X,Y STAPT(NARCS+1)=CMPLX(X,Y) ELSE STAPT(NARCS+1)=STAPT(1) ENDIF C C**** CHECK WITH THE USER THAT THE INPUT DATA IS OK C IER=0 WRITE(*,*) WRITE(*,*) 'END OF INPUT PHASE; CONTINUE WITH PROCESSING?' CHCK=CHRIN('Y','y') IF (.NOT.CHCK) THEN WRITE(CHIN,*) 'N',' ..CONTINUE PROCESSING' GOTO 999 ELSE WRITE(CHIN,*) 'Y',' ..CONTINUE PROCESSING' ENDIF CLOSE(CHIN) C C**** WRITE THE SOURCE CODE FOR PARFUN C OPEN(CHNL,FILE=FORTFL) CALL HEADER('PARFUN',REDD,CHNL) IF (SYMTY) THEN CALL SYINF1(ORDRG,ORDSG,RTUNI,U2,REFLN,CENSY,STAPT(1), + STAPT(NARCS+1),IER) IF (IER.GT.0) GOTO 999 WRITE(*,'(/A,I3)') 'N O T E : THE ORDER OF THE SYMMETRY GROUP IS +',ORDSG IF (REFLN) THEN WRITE(*,*) ' ISYGP = ',-ORDSG ELSE WRITE(*,*) ' ISYGP = ',ORDSG ENDIF CALL WRSYM1(NARCS,ORDRG,ORDSG,RTUNI,U2,CENSY,REFLN,.TRUE.,REDD, + CHNL) IF (REFLN) THEN CH='TS' ELSE CH='TT' ENDIF CALL WRFUN1(NARCS,STAPT,ARCTY,PGM,RGM,PTX,NTX,DEFN,CHNL, + 'IB',CH,'ZETA ',REDD) CALL WRSYM2(NARCS,ORDRG,CENSY,REFLN,CHNL) ELSE CALL WRFUN1(NARCS,STAPT,ARCTY,PGM,RGM,PTX,NTX,DEFN,CHNL, + 'IA','TT','PARFUN',REDD) ENDIF C WRITE(CHNL,'(A1)') 'C' WRITE(CHNL,'(A9)') ' END' C C**** WRITE THE SOURCE CODE FOR DPARFN C WRITE(CHNL,'(A40)') 'C...........................................' CALL HEADER('DPARFN',REDD,CHNL) IF (SYMTY) THEN CALL WRSYM1(NARCS,ORDRG,ORDSG,RTUNI,U2,CENSY,REFLN,.FALSE.,REDD, + CHNL) IF (REFLN) THEN CH='TS' ELSE CH='TT' ENDIF CALL WRFUN2(NARCS,MNARC,STAPT,ARCTY,PGM,RGM,PTX,NTX,DEFN, + CHNL,'IB',CH,'ZETA ',NUMDER,REDD) CALL WRSYM3(NARCS,ORDRG,REFLN,CHNL) ELSE CALL WRFUN2(NARCS,MNARC,STAPT,ARCTY,PGM,RGM,PTX,NTX,DEFN, + CHNL,'IA','TT','DPARFN',NUMDER,REDD) ENDIF C WRITE(CHNL,'(A1)') 'C' WRITE(CHNL,'(A9)') ' END' CLOSE(CHNL) C 999 CONTINUE CALL WRTAIL(6,0,IER) C END C COMPLEX FUNCTION PARFUN(I,T) INTEGER I COMPLEX T C C DUMMY FUNCTION TO AID LINK-LOADING OF PARGEN C PARFUN=(1.0,0.0) END C COMPLEX FUNCTION DPARFN(I,T) INTEGER I COMPLEX T C C DUMMY FUNCTION TO AID LINK-LOADING OF PARGEN C DPARFN=(1.0,0.0) END .