Next: Recent changes
Up: FG-User-Routines
Previous: Overview
PROGRAM UFEM C U F E M C ======= C C ****************************************************************** C * C * PURPOSE :- OPEN A FEMGEN DATABASE, SCAN IT, AND WRITE OUT C * MODEL DATA TO FILE. C * C ****************************************************************** C C --- SUBROUTINES CALLED C EXTERNAL USTRT2,USLCHA,UWRITE,UREAD,UDECOD,UA1CHA,USIZE,UNAMG2, + UTITLE,UNODE,UGELEM,UELEM,JAPRE,UCSYS2,UPNT2,UCOCYL, + UCONS3,UMAT3,UPHYS3,ULOAD3,UNODEG,ULOADE,UELEMG,UFACEG, + UCLOS, UMATE, UPHYSE, URBEAM, UCONCT, URBODY, UBDRY3, + UEQUA, ULEVAL, UCURVT, UPRESC, UEFACE C C --- LOCAL VARIABLES C PARAMETER(IWDIM=100000, IWDIM2=1000, LU1=1, MAXNAM=20) DIMENSION IWORK(IWDIM), WORK(IWDIM2), IBUF(16), IMAP(20), IPNE(9) DIMENSION NCONST(20), IPRMPT(80), IREPLY(80), COORD(3), IELEM(27) DIMENSION IELEM2(27), AXES(6), AXES2(6), P1(3),P2(3), ICONST(16) DIMENSION LNAMES(MAXNAM), U(3), V(3), AXESO(3,3) CHARACTER ANAME*8, FNAME*79, TNAME*20, CTYPE*8, TCNAM*8, CNAME*8 CHARACTER*80 CNAMES(MAXNAM) DIMENSION IDOF1(16), IDOF2(16), IDOFM(16), IDOFS(16) DIMENSION IDOFL(16,100), COEFFS(100) C C --- LOCAL DATA C DATA IMAP/0,0,3,0,4,0,3,0,4,4,2,0,2,2,2,0,2,0,0,0/ C C ****************************************************************** C * * C * CODE STARTS * C * * C ****************************************************************** C C ------------------------------------------------------------------ C *** OPEN FEMGEN DATABASE *** C ------------------------------------------------------------------ C C --- PROMPT USER FOR DATABASE NAME C 10 FNAME = ' ' WRITE(*,*) WRITE(*,'(A$)') ' ENTER FULL NAME OF FEMGEN DATABASE >' READ(*,'(A)',ERR=10) FNAME C C --- OPEN DATABASE C CALL USTRT2(FNAME,IWORK,IWDIM,IERR) IF( IERR.EQ.1 ) THEN WRITE(*,'(A)') 'ERROR: DATABASE DOES NOT EXIST' GOTO 10 ELSEIF( IERR.EQ.2 ) THEN WRITE(*,'(A)') 'ERROR: FILE IS NOT A FEMGEN DATABASE' GOTO 10 ELSEIF( IERR.EQ.9 ) THEN WRITE(*,'(A)') 'ERROR: IWORK ARRAY IS TOO SMALL' GOTO 9999 ENDIF C C --- OUTPUT TEXT. NOTE THAT THE FEMGEN DIALOG ROUTINES CAN ONLY BE C USED AFTER THE CALL TO USTRT2 WHICH ALSO INITIALISES CERTAIN C INTERNAL COMMON BLOCKS. C CALL USLCHA(' *.',1,IPRMPT,ILAST) CALL UWRITE(IPRMPT,ILAST) CALL USLCHA('FEMGEN DATABASE OPENED ...*.',1,IPRMPT,ILAST) CALL UWRITE(IPRMPT,ILAST) CALL USLCHA('*.',1,IPRMPT,ILAST) CALL UWRITE(IPRMPT,ILAST) C C ------------------------------------------------------------------ C *** OPEN ANALYSIS INPUT FILE *** C ------------------------------------------------------------------ C C --- INITIALISE PROMPT FOR QUESTION C 20 CALL USLCHA('ENTER ANALYSIS INPUT FILE NAME >*.',1,IPRMPT,ILAST) C C --- ASK QUESTION AND PERFORM SIMPLE DECODE OF REPLY BASED ON IEXIT C CALL UREAD(IPRMPT,ILAST,0,1,IREPLY,IEXIT) IF( IEXIT.EQ.0 ) GOTO 20 IF( IEXIT.EQ.-1 ) GOTO 9100 C C --- DECODE REPLY BY LOOKING FOR FILE NAME C IWANT = 1 CALL UDECOD(IREPLY,1,80,IWANT,IGOT,IFIRST,ILAST,IVAL,RVAL) IF( IGOT.NE.IWANT ) GOTO 20 C C --- CONVERT REPLY TO CHARACTER FORMAT C FNAME = ' ' CALL UA1CHA(IREPLY,ILAST,FNAME) C C --- OPEN ANALYSIS INPUT FILE C OPEN(UNIT=LU1,FILE=FNAME,FORM='FORMATTED',STATUS='NEW',ERR=20) C C ------------------------------------------------------------------ C *** GET MODEL SIZE PARAMETERS *** C ------------------------------------------------------------------ C CALL USIZE(NCONST) NN = NCONST(6) NE = NCONST(8) NMA = NCONST(10) NPH = NCONST(11) NCO = NCONST(12) NLOAD = NCONST(13) NTC = NCONST(14) NCOSYS = NCONST(16) NNBAS = NCONST(17) NEBAS = NCONST(18) NEGRMX = NCONST(19) NLOCAS = NCONST(20) C C ------------------------------------------------------------------ C *** MODEL NAME AND DESCRIPTION *** C ------------------------------------------------------------------ C CALL UNAMG2(0,0,ANAME,IERR) CALL UTITLE(TNAME) WRITE(LU1,'(A,A)') ' MODEL NAME :',ANAME WRITE(LU1,'(A,A)') ' MODEL TITLE:',TNAME C C ------------------------------------------------------------------ C *** NODAL COORDINATES *** C ------------------------------------------------------------------ C WRITE(LU1,*) 'NODAL COORDINATES ...' I2D3D = 0 DO 100 I=1+NNBAS,NN+NNBAS C C --- GET NODAL COORDINATES C CALL UNODE(I,COORD,IERR) IF( IERR.NE.0 ) GOTO 100 C C --- OUTPUT NODAL COORDINATES C WRITE(LU1,'(1X,I5,3(1X,E14.7))') I,COORD C C --- SET 2D/3D INDICATOR C IF( COORD(3).NE.0.0 ) I2D3D = 1 C 100 CONTINUE C C ------------------------------------------------------------------ C *** ELEMENT TOPOLOGY (IN ASCENDING ELEMENT ORDER) *** C ------------------------------------------------------------------ C WRITE(LU1,*) 'ELEMENT TOPOLOGY IN ASCENDING ELEMENT ORDER ...' DO 200 I=1+NEBAS,NE+NEBAS C C --- GET INFORMATION FOR ELEMENT C CALL UGELEM(I,IPATY,IPANO,IFGELT,IELVAR,IMID,IPID,IELGR,IERR) IF( IERR.NE.0 ) GOTO 200 C C --- GET ELEMENT NODES C CALL UELEM(I,IELEM,NNODE,IERR) C C --- CHECK AND CORRECT ELEMENT JACOBIAN C ( NOTE THAT FOR SHELL ELEMENT VARIANTS A JACOBIAN CHECK IS C MEANINGLESS AND JAPRE SHOULD NOT BE CALLED ) C CALL JAPRE(IFGELT,IELEM,NNODE,I2D3D,IELEM2,IFFLIP) C C --- OUTPUT ELEMENT INFORMATION C WRITE(LU1,'(16I5)') I,IFGELT,IELVAR,IMID,IPID, + (IELEM2(J),J=1,NNODE) C 200 CONTINUE C C ------------------------------------------------------------------ C *** ELEMENT TOPOLOGY (BY ELEMENT PROPERTY GROUPS) *** C ------------------------------------------------------------------ C WRITE(LU1,*) 'ELEMENT TOPOLOGY (BY ELEMENT PROPERTY GROUPS) ...' DO 400 IG=1,NEGRMX IFIRST = 0 DO 300 I=1+NEBAS,NE+NEBAS C C --- GET INFORMATION FOR ELEMENT C CALL UGELEM(I,IPATY,IPANO,IFGELT,IELVAR,IMID,IPID,IELGR, + IERR) IF( IERR.NE.0 ) GOTO 300 C C --- ELEMENT IS NOT IN CURRENT ELEMENT PROPERTY GROUP ... SKIP IT C IF( IELGR.NE.IG ) GOTO 300 C C --- GET ELEMENT NODES C CALL UELEM(I,IELEM,NNODE,IERR) IF( IERR.NE.0 ) GOTO 300 C C --- CHECK AND CORRECT ELEMENT JACOBIAN C ( NOTE THAT FOR SHELL ELEMENT VARIANTS A JACOBIAN CHECK IS C MEANINGLESS AND JAPRE SHOULD NOT BE CALLED ) C CALL JAPRE(IFGELT,IELEM,NNODE,I2D3D,IELEM2,IFFLIP) C C --- OUTPUT ELEMENT INFORMATION C IF( IFIRST.EQ.0 ) THEN WRITE(LU1,*) 'ELEMENT PROPERTY GROUP ',IG WRITE(LU1,*) 'ELEMENT TYPE ',IFGELT, + ' ELEMENT VARIANT',IELVAR, + ' MATERIAL ID',IMID, + ' PHYSICAL ID',IPID IFIRST = 1 ENDIF WRITE(LU1,'(16I5)') I,(IELEM2(J),J=1,NNODE) C 300 CONTINUE 400 CONTINUE C C ------------------------------------------------------------------ C *** LOCAL COORDINATE SYSTEMS *** C ------------------------------------------------------------------ C WRITE(LU1,*) 'LOCAL COORDINATE SYSTEMS ...' C DO 500 I=1,NCOSYS C CALL UCSYS2(I,ITYPE,AXES,IP1,IP2,IP3,NSEL,IWORK,IWDIM,IERR) IF( IERR.NE.0 ) GOTO 500 C C --- GET SYSTEM NAME C CALL UNAMG2(25,I,ANAME,IERR) WRITE(LU1,'(A,A)') 'LOCAL COORDINATE SYSTEM ',ANAME C C --- RECTANGULAR SYSTEM - ALL NODES HAVE SAME AXES C IF( ITYPE.EQ.1 ) THEN WRITE(LU1,'(6(1X,E14.7))') AXES WRITE(LU1,'(16I5)') (IWORK(J),J=1,NSEL) C C --- CYLINDRICAL OR SPHERICAL SYSTEM - ALL NODES HAVE DIFFERENT AXES C ELSE CALL UPNT2(IP1,ANAME,P1,IERR) DO 490 J=1,NSEL INODE = IWORK(J) CALL UNODE(INODE,P2,IERR) CALL UCOCYL(ITYPE,AXES,P1,P2,AXES2) WRITE(LU1,'(I5,6(1X,E14.7))') INODE,AXES2 490 CONTINUE ENDIF C 500 CONTINUE C C ------------------------------------------------------------------ C *** SINGLE POINT CONSTRAINTS *** C ------------------------------------------------------------------ C WRITE(LU1,*) 'RIGID CONSTRAINTS ...' DO 600 I=1+NNBAS,NN+NNBAS C C --- GET NODAL CONSTRAINTS C CALL UCONS3(I,ICONST,ISYST,IESUPP,IERR) IF( IERR.NE.0 ) GOTO 600 C C --- OUTPUT NODAL CONSTRAINTS C WRITE(LU1,'(I5,16I2)') I,ICONST C 600 CONTINUE C C ------------------------------------------------------------------ C *** MULTI-POINT CONSTRAINTS *** C ------------------------------------------------------------------ C C --- LOOP OVER ALL CONSTRAINTS C DO 610 ICO=1,NCO CALL UBDRY3(ICO,CNAME,ICOTYP,IPART1,IDOF1,IPART2,IDOF2,V,IERR) C C --- CONSTRAINT DOES NOT EXIST, SKIP IT C IF( IERR.NE.0 ) GOTO 610 C C ------------------------------------ C C --- GET INFORMATION FOR MPC RBEAM (1 MASTER, MANY SLAVES) C IF( ICOTYP.EQ.5 ) THEN CALL URBEAM(ICO,IWORK,IWDIM,IDOF1,IERR) IF( IERR.NE.0 ) GOTO 610 C C ------------------------------------ C C --- GET INFORMATION FOR MPC RBODY C ELSEIF( ICOTYP.EQ.6 ) THEN CALL URBODY(ICO,IWORK,IWDIM,IM,IDOFM,COEF,NSLAVE,IDOFL,IERR) IF( IERR.NE.0 ) GOTO 610 C C ------------------------------------ C C --- GET INFORMATION FOR MPC RCONNECT (CAN BE MANY THINGS) C ELSEIF( ICOTYP.EQ.7 ) THEN CALL UCONCT(ICO,IWORK,IWDIM,IDOF1,IERR) IF( IERR.NE.0 ) GOTO 610 C C ------------------------------------ C C --- GET INFORMATION FOR MPC EQUA C ELSEIF( ICOTYP.EQ.8 ) THEN CALL UEQUA(ICO,IWORK,IWDIM,IS,IDOFS,COEF,NMASTR,IDOFL, + COEFFS,RHS,IERR) IF( IERR.NE.0 ) GOTO 610 ELSE C C ------------------------------------ C GOTO 610 ENDIF C C ------------------------------------------------------------------ C C --- OUTPUT MPC DATA C =============== C C --- RBEAM AND RCONNECT C IF( (ICOTYP.EQ.5).OR.(ICOTYP.EQ.7) ) THEN C WRITE(LU1,'(A,A,A,I5)') 'CONSTRAINT ',CNAME,' TYPE ',ICOTYP WRITE(LU1,'(A)') ' SLAVE MASTER(S)' C IP1 = 1 IP2 = 2 620 IS = IWORK(IP1) NM = IWORK(IP2) IF( IS.NE.0 ) THEN WRITE(LU1,'(I5,2X,3I5)') IS,(IWORK(IP2+I),I=1,NM) IP1 = IP1 + 2 + NM IP2 = IP2 + 2 + NM GOTO 620 ENDIF C C ------------------------------------ C C --- RBODY C ELSEIF( ICOTYP.EQ.6 ) THEN C WRITE(LU1,'(A,A,A,I5)') 'CONSTRAINT ',CNAME,' TYPE ',ICOTYP WRITE(LU1,'(A,I5,1X,16I2,G14.7)') + 'MASTER:',IM,IDOFM,COEF C IP = 1 DO 630 I=1,NSLAVE C WRITE(LU1,'(A,16I2)') 'SLAVES: ',(IDOFL(K,I),K=1,16) NS1 = IWORK(IP) WRITE(LU1,'(16I5)') (IWORK(K),K=IP+1,IP+NS1) IP = IP + 1 + NS1 630 CONTINUE C C --- EQUA C ELSEIF( ICOTYP.EQ.8 ) THEN C WRITE(LU1,'(A,A,A,I5)') 'CONSTRAINT ',CNAME,' TYPE ',ICOTYP WRITE(LU1,'(A,G14.7)') 'RHS =',RHS WRITE(LU1,'(A,I5,1X,16I2,G14.7)') + 'SLAVE:',IS,IDOFS,COEF C IP = 1 DO 640 I=1,NMASTR WRITE(LU1,'(A,16I2,G14.7)') 'MASTERS: ', + (IDOFL(K,I),K=1,16),COEFFS(I) NS1 = IWORK(IP) WRITE(LU1,'(16I5)') (IWORK(K),K=IP+1,IP+NS1) IP = IP + 1 + NS1 640 CONTINUE ENDIF C 610 CONTINUE C C ------------------------------------------------------------------ C *** MATERIAL PROPERTIES *** C ------------------------------------------------------------------ C WRITE(LU1,*) 'MATERIAL PROPERTIES ...' DO 700 I=1,NMA C C --- GET MATERIAL DATA C CALL UMAT3(I,ANAME,CTYPE,IMTYPE,NVALS,WORK,IWDIM2,IERR) IF( IERR.NE.0 ) GOTO 700 C C --- OUTPUT INTERNAL MATERIAL DATA C IF( IMTYPE.EQ.1 ) THEN WRITE(LU1,'(4A)') ' MATERIAL ',ANAME,' TYPE ',CTYPE WRITE(LU1,'(5(1X,E14.7))') (WORK(J),J=1,NVALS) C C --- OUTPUT EXTERNAL MATERIAL NAMES C ELSE CALL UMATE(WORK,IWDIM2,MAXNAM,NNAMES,LNAMES,CNAMES,IERR) IF( NNAMES.GT.0 ) THEN WRITE(LU1,'(3A)') ' MATERIAL ',ANAME,' TYPE: EXTERNAL' DO 690 J=1,NNAMES WRITE(LU1,'(A)') CNAMES(J) 690 CONTINUE ENDIF ENDIF C 700 CONTINUE C C ------------------------------------------------------------------ C *** PHYSICAL PROPERTIES *** C ------------------------------------------------------------------ C WRITE(LU1,*) 'PHYSICAL PROPERTIES ...' DO 800 I=1,NPH C C --- GET PHYSICAL DATA C CALL UPHYS3(I,ANAME,CTYPE,IPTYPE,IFORI,IFOFF,NVALS,WORK, + IWDIM2,IERR) IF( IERR.NE.0 ) GOTO 800 C C --- OUTPUT INTERNAL PHYSICAL DATA C NOTE THAT THE PROPERTY TYPE (IE THE PRESENCE OF ORIENTATION AND C OFFSET DEFINITIONS WILL AFFECT THE POSITION OF THE OTHER PROPERTY C DATA. C IF( IPTYPE.EQ.1 ) THEN WRITE(LU1,'(4A)') ' PHYSICAL ',ANAME,' TYPE ',CTYPE IF( (IFORI.EQ.1).AND.(IFOFF.EQ.1) ) THEN WRITE(LU1,'(A,3(1X,E14.7))') ' ORIENTATION ',(WORK(J),J=1,3) WRITE(LU1,'(A,3(1X,E14.7))') ' OFFSET1 ',(WORK(J),J=4,6) WRITE(LU1,'(A,3(1X,E14.7))') ' OFFSET2 ',(WORK(J),J=7,9) WRITE(LU1,'(5(1X,E14.7))') (WORK(J),J=10,NVALS) ELSEIF( (IFORI.EQ.1).AND.(IFOFF.EQ.0) ) THEN WRITE(LU1,'(A,3(1X,E14.7))') ' ORIENTATION ',(WORK(J),J=1,3) WRITE(LU1,'(5(1X,E14.7))') (WORK(J),J=4,NVALS) ELSEIF( (IFORI.EQ.0).AND.(IFOFF.EQ.1) ) THEN WRITE(LU1,'(A,3(1X,E14.7))') ' OFFSET1 ',(WORK(J),J=1,3) WRITE(LU1,'(A,3(1X,E14.7))') ' OFFSET2 ',(WORK(J),J=4,6) WRITE(LU1,'(5(1X,E14.7))') (WORK(J),J=7,NVALS) ELSEIF( (IFORI.EQ.0).AND.(IFOFF.EQ.0) ) THEN WRITE(LU1,'(5(1X,E14.7))') (WORK(J),J=1,NVALS) ENDIF C C --- OUTPUT EXTERNAL PHYSICAL NAMES C ELSE CALL UPHYSE(WORK,IWDIM2,MAXNAM,NNAMES,LNAMES,CNAMES,IERR) IF( NNAMES.GT.0 ) THEN WRITE(LU1,'(3A)') ' PHYSICAL ',ANAME,' TYPE: EXTERNAL' DO 790 J=1,NNAMES WRITE(LU1,'(A)') CNAMES(J) 790 CONTINUE ENDIF ENDIF C 800 CONTINUE C C ------------------------------------------------------------------ C *** TIME CURVES *** C ------------------------------------------------------------------ C WRITE(LU1,*) 'TIME CURVES FOR LOAD AMPLITUDE DEFINITION ...' C C --- LOOP ON NUMBER OF TIME CURVES C DO 750 ITC=1,NTC C IEVAL = 1 CALL UCURVT(ITC,IEVAL,TCNAM,ITTYPE,SMOOTH,ICYCLE,IWORK, + IWDIM,WORK,IWDIM2,NVAL,IERR) IF( IERR.NE.0 ) GOTO 750 C C --- OUTPUT TIME CURVE FOR USE AS AMPLITUDE REFERENCE IN LOADS C WRITE(LU1,'(A,A)') ' TIME CURVE',TCNAM NPAIR = NVAL/2 IP = 0 DO 749 IC=1,NPAIR C IP = IP + 1 T = WORK(IP) IP = IP + 1 VAL = WORK(IP) WRITE(LU1,*) T,VAL C 749 CONTINUE 750 CONTINUE C C ------------------------------------------------------------------ C *** LOADS *** C ------------------------------------------------------------------ C WRITE(LU1,*) 'LOADS IN ASCENDING LOADCASE NUMBER ...' C DO 1000 ILOCAS=1,NLOCAS IFIRST = 0 DO 900 ILOAD=1,NLOAD C CALL ULOAD3(ILOAD,ANAME,CTYPE,LCAS,IAPPL,ITC,ISC,ILM,ICS, + IPAT,IPAN,NVALS,WORK,IWDIM2,IERR) IF( IERR.NE.0 ) GOTO 900 C IF( IFIRST.EQ.0 ) THEN WRITE(LU1,*) 'LOADS FOR LOADCASE ',ILOCAS IFIRST = 1 ENDIF C C --- INTERPRET LOAD: THIS CAN BE DONE IN EITHER A GENERAL WAY BY C EXAMINING THE PARAMETERS RETURNED BY ULOAD3, OR C DIRECTLY IF AN ANALYSIS ENVIRONMENT WAS SPECIFIED USING A USERIQ C ROUTINE. THE FOLLOWING EXAMPLES ASSUME THAT THE FEMGEN NEUTRAL C ENVIRONMENT HAS BEEN LOADED (WHICH IT IS BY DEFAULT). C C ------------------------------------------------------------------ C C --- FORCE LOADS: APPLIED TO NODES C =============================== C IF( CTYPE.EQ.'FORCE ' ) THEN CALL UNODEG(IPAT,IPAN,NSEL,IWORK,IWDIM,IERR) IF( IERR.EQ.0 ) THEN WRITE(LU1,'(A,A,A,A)') ' LOAD ',ANAME,' TYPE ',CTYPE C C --- TIME CURVE HAS BEEN ATTACHED C IF( ITC.NE.0 ) THEN CALL UNAMG2(39,ITC,TCNAM,IERR) WRITE(LU1,'(2A)') ' AMPLITUDE VARIATION ',TCNAM ENDIF C C --- LOOP OVER LOADS TO EVALUATE C VLOAD = WORK(1) IDOF = IFIX(WORK(2)) C IFIRST = 0 DO 860 IC=1,NSEL IN = IWORK(IC) CALL UNODE(IN,COORD,IERR) CALL ULEVAL(IFIRST,ILM,ISC,ICS,COORD,IPAT,IPAN, + ISTAT,VALUE,AXESO, + IWORK(IWDIM-10000),10000,IERR) IF( IERR.NE.0 ) GOTO 860 C C --- IN OR OUT OF LOAD MASK ? C IF( ISTAT.NE.1 ) GOTO 860 C C --- MODIFY LOAD VALUE FOR SPACE CURVE C U(1) = 0.0 U(2) = 0.0 U(3) = 0.0 U(IDOF) = VLOAD * VALUE C C --- MODIFY LOAD FOR LOCAL AXIS SYSTEM C V(1)=AXESO(1,1)*U(1)+AXESO(1,2)*U(2)+AXESO(1,3)*U(3) V(2)=AXESO(2,1)*U(1)+AXESO(2,2)*U(2)+AXESO(2,3)*U(3) V(3)=AXESO(3,1)*U(1)+AXESO(3,2)*U(2)+AXESO(3,3)*U(3) C C --- AND OUTPUT C WRITE(LU1,'(I8,3G13.6)') IN,(V(K),K=1,3) 860 CONTINUE ENDIF ENDIF C C ------------------------------------------------------------------ C C --- GRAVITY LOADS: APPLIED TO WHOLE ELEMENTS C ======================================== C IF( CTYPE.EQ.'GRAVITY ' ) THEN WRITE(LU1,'(A,A,A,A)') ' LOAD ',ANAME,' TYPE ',CTYPE WRITE(LU1,'(A,E14.7)') ' GRAVITY =',WORK(1) WRITE(LU1,'(A,I5)') ' DIRECTION =',IFIX(WORK(2)) C C --- LOOP OVER PART INDEX POINTERS C DO 890 IPOINT=IPAT,IPAN CALL ULOADE(IPOINT,IPATY,IPANO,IFATYP,IERR) IF( IERR.NE.0 ) GOTO 890 C C --- IF FACE TYPE IS RELEVANT FOR A GRAVITY LOAD (IE WHOLE ELEMENTS C MUST BE LOADED AND NOT FACES) THEN PROCEED C IF( (IFATYP.LE.1).OR.(IFATYP.EQ.3) ) THEN C C --- GET ELEMENTS ON PART TYPE IPATY, PART NUMBER IPANO C CALL UELEMG(IPATY,IPANO,NE0,NE1,IELT,IVAR,IMID, + IPID,IELGR,IERR) C C --- NO ELEMENTS ON PART ... SKIP TO NEXT ONE C IF( IERR.NE.0 ) GOTO 890 C C --- LOOP OVER ELEMENTS ON PART TO CHECK THAT THEY EXIST C (SOME MAY HAVE BEEN DELETED) AND OUTPUT IN BLOCKS OF 16. C NBUF = 0 DO 880 IE=NE0,NE1 CALL UELEM(IE,IELEM,NNODE,IERR) IF( IERR.NE.0 ) GOTO 880 NBUF = NBUF + 1 IBUF(NBUF) = IE IF( NBUF.EQ.16 ) THEN WRITE(LU1,'(16I5)') IBUF NBUF = 0 ENDIF 880 CONTINUE IF( NBUF.NE.0 ) + WRITE(LU1,'(16I5)') (IBUF(K),K=1,NBUF) ENDIF 890 CONTINUE ENDIF C C ------------------------------------------------------------------ C C --- PRESSURE LOADS: APPLIED TO ELEMENT FACE/EDGES C ============================================= C IF( CTYPE.EQ.'PRESSURE' ) THEN WRITE(LU1,'(A,A,A,A)') ' LOAD ',ANAME,' TYPE ',CTYPE WRITE(LU1,'(A,E14.7)') ' PRESSURE =',WORK(1) WRITE(LU1,'(A,I5)') ' DIRECTION =',IFIX(WORK(2)) C C --- LOOP OVER PART INDEX POINTERS C DO 870 IPOINT=IPAT,IPAN CALL ULOADE(IPOINT,IPATY,IPANO,IFATYP,IERR) IF( IERR.NE.0 ) GOTO 870 C C --- NO ELEMENTS ON PART ... SKIP TO NEXT ONE C IF( IERR.NE.0 ) GOTO 870 C C --- GET ELEMENTS ON LOADED FACE/EDGE AND THE EDGE/FACE IDENTIFIER C CALL UFACEG(IPATY,IPANO,IPATY2,IPANO2,NNEF,IPNE, + IFACE,JAC,NELO,IWORK,IWDIM,IERR) C C --- UNABLE TO DETERMINE LOADED FACE/ELEMENTS ON PART ... SKIP C IF( IERR.NE.0 ) GOTO 870 C C --- GET ELEMENT TYPE C CALL UELEMG(IPATY,IPANO,NE0,NE1,IFGELT,IELVAR, + IMID,IPID,IG,IERR) IF( IERR.NE.0 ) GOTO 870 C C --- LOOP OVER ELEMENTS ON PART C DO 865 IP=1,NELO IE = IWORK(IP) C C --- GET FACE NUMBER FOR CURRENT ELEMENT C IWOFF = NELO IWDIM3 = IWDIM - NELO CALL UEFACE(IE,IFGELT,IPATY,IPANO,IFATYP,NNEF, + IWORK,IWDIM3,IWOFF,IEFACE,IERR) IF( IERR.NE.0 ) GOTO 865 IFACE = IEFACE C C --- CHECK JACOBIAN ON ELEMENT: IF PARAMETER IFFLIP INDICATES C THAT THE ELEMENT HAD A NEGATIVE JACOBIAN THEN THE LOADED C FACE ID MUST BE CHANGED TO REFLECT THE FACT THAT THE ELEMENT C DEFINITION WAS FLIPPED AT THE ELEMENT TOPOLOGY STAGE. C C WHERE THE ANALYSIS PACKAGE DEFINES ELEMENT FACES BY THE C FACE NODES AND NOT A FACE IDENTIFIER THIS WILL NOT BE NECESSARY. C CALL UELEM(IE,IELEM,NNODE,IERR) CALL JAPRE(IFGELT,IELEM,NNODE,I2D3D,IELEM2, + IFFLIP) C IF( IFFLIP.EQ.1 ) THEN NBAS = IMAP(IFGELT) IF( IFGELT.GE.11 ) THEN IF( IFGELT.EQ.12.OR.IFGELT.EQ.16 ) THEN IF( IFACE.EQ.2 ) NBAS=2 IF( IFACE.EQ.4 ) NBAS=-2 IFACE=IFACE+NBAS ELSEIF( IFACE.LT.3 ) THEN IFACE=-IFACE+NBAS+1 ENDIF ELSE IFACE=-IFACE+NBAS+1 ENDIF ENDIF C WRITE(LU1,'(A,I5,A,I2,A,9I5)') + ' ELEMENT ',IE,' FACE ',IFACE,' NODES ', + (IELEM(IPNE(J)),J=1,NNEF) C 865 CONTINUE 870 CONTINUE ENDIF C C ------------------------------------------------------------------ C 900 CONTINUE 1000 CONTINUE C C ------------------------------------------------------------------ C *** PRESCRIBED VALUES *** C ------------------------------------------------------------------ C WRITE(LU1,*) 'PRESCRIBED VALUES ...' C DO 1100 ICO=1,NCO C CALL UPRESC(ICO,ANAME,IPATY,IPANO,IDOF,VALUE,LCAS,IERR) IF( IERR.NE.0 ) GOTO 1100 C CALL UNAMG2(IPATY,IPANO,ANAME,IERR) C WRITE(LU1,*) ANAME,IDOF,VALUE C 1100 CONTINUE C C ------------------------------------------------------------------ C *** CLOSE DATABASE *** C ------------------------------------------------------------------ C 9100 CALL UCLOS CALL USLCHA(' *.',1,IPRMPT,ILAST) CALL UWRITE(IPRMPT,ILAST) CALL USLCHA('FEMGEN DATABASE CLOSED*.',1,IPRMPT,ILAST) CALL UWRITE(IPRMPT,ILAST) C C ****************************************************************** C * * C * END OF CODE * C * * C ****************************************************************** C 9999 CONTINUE END SUBROUTINE XINIT RETURN END