internal compiler error: in instantiate_virtual_regs_lossage, at function c:3476
The command line is simply a "return" at the end of a subroutine (line:561). It is followed by an "end" on the next line. c c c ************************************** c ************ pltlib ****************** c ************************************** c c c the following collection of subroutines is designed c to aid in constructing graphic outputs from fortran c programs. these subroutines are designed to run on c a sun under openwindows and drive a postscript printer. c the user only needs to designate the destination device c in subroutine initpt--all other routines function as c nearly identically as possible on all devices. c c**************************************************************************** c c copyright 1991,1992 by h. j. melosh. all rights reserved. c c this code is provided by the author to designated users for c the purpose of cooperative research. it may not be distributed c to other users without the express consent of the author. c c under no circumstances is this code to be used for commercial c purposes without the author's written consent. c c ***legal notice*** c c this code was written as part of the research of h. j. melosh and his c collaborators. none of these authors make any warranty, express or c implied, or assumes any legal liability or responsibility for the c accuracy, completeness or usefulness of this code or its results, c or represents that its use would not infringe privately owned rights. c c c c***************************************************************************** c c the subroutines are self documenting--the user is advised c to study the comments in the fortran listing of each c routine. the routines that are availabe for the user are: c c plotxy--draws a complete x,y plot, either line or scatter c contur--draws a complete x,y,z contour plot c axis--draws a labeled axis c initpt--initializes the graphic device c legend--writes a label or ascii string on the plot c line--draws a continuous line between points c newpen--chooses a pen c number--writes a floating point number on the plot c offset--shifts the coordinate zero and scale c scale--scales an array in rational units. use as input c for axis or arbgrd c symbol--draws one of 16 symbols on the plot c arbgrd--draws a contour plot on an irregular grid: specialized for c finite element codes. c c written by h.j.melosh, july, 1985. modified for the mac ii c october, 1987. plot routines improved january, 1989 c contouring improved march 1992 c c adapted for the sun using pgplot by h. j. melosh, may 1992 c c subroutine plotxy(xl,xu,labelx,labely,xarray,yarray, & npts,irep,isym) c c program to produce an x-y line or scatter plot of arrays (xarray) and c (yarray). the user specifies the coordinates (xl(1),xl(2)) c of the bottom left corner of the plot and coordinates (xu(1), c xu(2)) of the upper right corner. the axes are labeled, c respectively, 'labelx' and 'labely'. (npts) is the number of c points plotted. c c xarray and yarray are not altered by this routine. c c the switch irep has the following effects: c c irep=0: the coordinate axes are scaled to accomodate the full c range of xarray and yarray. the axes are plotted, c then the logical coordinates are shifted and scaled to c accomodate the arrays, which are then plotted. c scales are returned to their default values when the c plot is complete. this is the normal mode for a c single line or scatter plot. c c irep=1: same as irep=0 except that the scales are not returned c to their default values after plotting. this is the c normal mode for the first plot in a sequence of overlaid c plots. c c irep>1: only the arrays are plotted, using a previously set c scale. this mode is used for the second and subsequent c plots in a sequence of overlaid plots. c c irep<0: same as irep>1, except that the scales are returned to c their default values after the plot is complete. used c to terminate a sequence of overlaid plots. c alternatively, the user may make a call to offset c with parameters offset(0.,0.,1.,1.) to perform this c function after the last plot with irep>1. c c the zero axes are drawn as a dashed line if they fall within c the plot area. c c a line plot is produced if isym=0. if isym is between 1 and 16 a c scatter plot is generated using the symbol corresponding to isym. c see subroutine symbol for a description of the available symbols. c c data on numerical labeling of axes is transmitted in the labeled c common /ticdat/. see the description of axis for an explanation. c data on pen number and linetype is transmitted via the labeled c common /lindat/. these commons and /scales/ (below) may be defined c in the calling program. if they are not defined, default values are c assigned. c c user defined scale parameters may be transmitted c through the labeled common /scales/. firsx and firsy are the values c of the variable at the beginning of the x and y axes, respectively. c similarly, enx and eny are the variable values at the end of each axis. c dimension xl(2),xu(2),zero(2),endpt(2),xarray(npts),yarray(npts) character*(*) labelx,labely logical flip common/ticdat/ndecx,nticx,nlticx,ndecy,nticy,nlticy common/lindat/ipen,iline common/scales/firsx,enx,firsy,eny save /ticdat/,/lindat/,/scales/ data zero/0.,0./ if(ipen.eq.0) ipen=1 if(iline.eq.0) iline=1 flip=(xu(1).lt.xl(1)) c if(irep.eq.1) goto 100 if(irep) 200,100,200 c 100 call newpen(1) rotx=0. ncharx=nchar(labelx) nchary=nchar(labely) if(flip) then rotx=90. xlen=abs(xu(2)-xl(2)) ylen=abs(xu(1)-xl(1)) else xlen=abs(xu(1)-xl(1)) ylen=abs(xu(2)-xl(2)) endif if(enx-firsx) 300,310,300 310 call scale(xarray,npts,xlen,firstx,endx,deltax) goto 400 300 firstx=firsx endx=enx deltax=xlen/(enx-firsx) 400 if(eny-firsy) 500,510,500 510 call scale(yarray,npts,ylen,firsty,endy,deltay) goto 600 500 firsty=firsy endy=eny deltay=ylen/(eny-firsy) 600 if(nticx) 50,50,60 50 nticx=(ifix(xlen*40.+.0001))+1 nlab=ifix(12.*xlen)-1 if(nlab.le.0) nlab=0 if(nlab.ne.0) nlticx=nticx/nlab if(nlab.eq.0) nlticx=nticx ndecx=-4 60 call axis(xl(1),xl(2),labelx,ncharx,-1,rotx,xlen,firstx,endx, & ndecx,nticx,nlticx) roty=rotx+90. if(nticy) 70,70,80 70 nticy=(ifix(ylen*40.+.0001))+1 nlab=ifix(12.*ylen)-1 if(nlab.le.0) nlab=0 if(nlab.ne.0) nlticy=nticy/nlab if(nlab.eq.0) nlticy=nticy ndecy=-4 80 call axis(xl(1),xl(2),labely,nchary,1,roty,ylen,firsty,endy, & ndecy,nticy,nlticy) xof=xl(1)-firstx*deltax yof=xl(2)-firsty*deltay call offset(xof,yof,deltax,deltay) xof=xl(1)+firsty*deltay yof=xl(2)-firstx*deltax if(flip) call offset(xof,yof,-deltay,deltax) if(firstx*endx) 10,20,20 10 endpt(1)=firsty endpt(2)=endy if(nlticx.ge.0) then if(.not.flip) call line(zero,endpt,2,3) if(flip) call line(endpt,zero,2,3) endif 20 if(firsty*endy) 30,200,200 30 endpt(1)=firstx endpt(2)=endx if(nlticy.ge.0) then if(.not.flip) call line(endpt,zero,2,3) if(flip) call line(zero,endpt,2,3) endif 200 call newpen(ipen) if (isym.ne.0) goto 700 if(.not.flip) call line(xarray,yarray,npts,iline) if(flip) call line(yarray,xarray,npts,iline) if(irep.le.0) call offset(0.,0.,1.,1.) return 700 if(.not.flip) call scater(xarray,yarray,npts,isym) if(flip) call scater(yarray,xarray,npts,isym) if(irep.le.0) call offset(0.,0.,1.,1.) return end c c subroutine contur(xl,xu,labelx,labely,ptitle, & xarray,yarray,zarray,nx,ny,nctrs) c c program to produce a contour plot of array zarray(i,j) which c is defined at points (x,y) given in arrays xarray(i,j) and yarray(i,j). c these arrays are handled here as vectors, assuming normal fortran c array subscript rules. c the user specifies the coordinates (xl(1),xl(2)) c of the bottom left corner of the plot and coordinates (xu(1), c xu(2)) of the upper right corner. the axes are labeled, c respectively, 'labelx' and 'labely'. nx is the maximum value of i c and ny is the maximum value of j. c c nctrs is the number of coutours desired c c xarray, yarray and zarray are not altered by this routine. c c c data on numerical labeling of axes is transmitted in the labeled c common /ticdat/. see the description of axis for an explanation. c data on linetype is transmitted via the labeled c common /lindat/. these commons and /scales/ (below) may be defined c in the calling program. if they are not defined, default values are c assigned. c c user defined scale parameters may be transmitted c through the labeled common /scales/. firsx and firsy are the values c of the variable at the beginning of the x and y axes, respectively. c similarly, enx and eny are the variable values at the end of each axis. c c the contour values are computed in the subroutine setctr. the user may c override this subroutine by setting icontur=1 in a labeled common c /contourdat/. the contour values are then carried in the array zc(99). c the contour values are printed to a file named 'contour.dat'. c c this routine defines a scratch array ien(4,numel), where c numel=2*(nx-1)*(ny-1). the dimensions of the array in this routine c must be at least as large as numel. c dimension xl(2),xu(2),xarray(*),yarray(*),zarray(*), & ien(4,10000),zc(99) character*(*) labelx,labely,ptitle character*32 title logical flip common/ticdat/ndecx,nticx,nlticx,ndecy,nticy,nlticy common/lindat/ipen,iline common/scales/firsx,enx,firsy,eny common/grd/lgrid,xlngth,ylngth,xmin,xmax,ymin,ymax,title common/conturdat/icontur,zc save /ticdat/,/lindat/,/scales/,/grd/,/conturdat/ title=ptitle lgrid=0 nfreq=50 if(iline.eq.0) iline=1 flip=(xu(1).lt.xl(1)) c c construct ien array and temporary arrays for plotting c call newpen(1) call triien(ien,nx,ny,numel) rotx=0. ncharx=nchar(labelx) nchary=nchar(labely) if(flip) then rotx=90. xlen=abs(xu(2)-xl(2)) ylen=abs(xu(1)-xl(1)) else xlen=abs(xu(1)-xl(1)) ylen=abs(xu(2)-xl(2)) endif if(enx-firsx.eq.0.) then call scale(xarray,nx*ny,xlen,firstx,endx,deltax) else firstx=firsx endx=enx deltax=xlen/(enx-firsx) endif if(eny-firsy.eq.0.) then call scale(yarray,nx*ny,ylen,firsty,endy,deltay) else firsty=firsy endy=eny deltay=ylen/(eny-firsy) endif if(nticx.le.0) then nticx=(ifix(xlen*40.+.0001))+1 nlab=ifix(12.*xlen)-1 if(nlab.le.0) nlab=0 if(nlab.ne.0) nlticx=nticx/nlab if(nlab.eq.0) nlticx=nticx ndecx=-4 endif call axis(xl(1),xl(2),labelx,ncharx,-1,rotx,xlen,firstx,endx, & ndecx,nticx,nlticx) roty=rotx+90. if(nticy.le.0) then nticy=(ifix(ylen*40.+.0001))+1 nlab=ifix(12.*ylen)-1 if(nlab.le.0) nlab=0 if(nlab.ne.0) nlticy=nticy/nlab if(nlab.eq.0) nlticy=nticy ndecy=-4 endif call axis(xl(1),xl(2),labely,nchary,1,roty,ylen,firsty,endy, & ndecy,nticy,nlticy) xof=xl(1)-firstx*deltax yof=xl(2)-firsty*deltay call offset(xof,yof,deltax,deltay) xof=xl(1)+firsty*deltay yof=xl(2)-firstx*deltax if(flip) call offset(xof,yof,-deltay,deltax) if(.not.flip) call & arbgrd(nx*ny,ien,numel,nctrs,nfreq,xarray,yarray,zarray, &'contur output') if(flip) call & arbgrd(nx*ny,ien,numel,nctrs,nfreq,xarray,yarray,zarray, &'contur output') return end c c subroutine scater(xarray,yarray,npts,isym) c c program to produce a scatter plot of arrays xarray and yarray c using the symbol routine. c dimension xarray(npts),yarray(npts) c do 10 i=1,npts call symbol(xarray(i),yarray(i),-1.,0.,isym) 10 continue return end c c c subroutine axis(xstart,ystart,label,nents,lblpos,angle,axlen, &firstv,alastv,ndec,ntic,nltic) c c program to draw a labeled axis of length (axlen) starting at c position (xstart,ystart), all in logical units. the axis is c plotted at (angle) degrees counterclockwise from the x-axis. c the label is contained in the ascii string 'label' of length c (nents). it is centered c below the axis if (lblpos <0 ) and above it if (lblpos >0). c c the first and last points of the axis are ticked and labeled c with numbers in the format specified by (ndec)--see the comments c for subroutine number. the extreme ends of the axis are c assigned the values (firstv)--the minimum, and (alastv)--the c maximum. the total number of ticks is (ntic) (.ge. 2). c however, only every (nltic)'th tick is labeled (nltic =0 or 1 c labels all tics). c c if (nltic) < 0 a logarithmic axis with ntic decade labels c is drawn and labeled. intermediate short tics are drawn between c the decades. the user must ensure that the labeled tics correspond c to simple powers of ten. c dimension x(2),y(2) character*(*) label common/coord/x0,y0,ang,sinang,cosang save /coord/ x0=xstart y0=ystart if(ntic.lt.2) ntic=2 ang=0.0174533*angle sinang=sin(ang) cosang=cos(ang) c x(2)=xstart y(2)=ystart call rotate(axlen,0.,x(1),y(1)) call line(x,y,2,1) call tic(0.,0,firstv,alastv,axlen,angle,ndec,lblpos,nltic) tpos=0. nloop=ntic-1 if(nloop.le.0) nloop=1 nskip=nltic if(nltic.le.0) nskip=1 deltic=axlen/float(nloop) do 10 ii=1,nloop i=ii mode=mod(i,nskip) if(i.eq.nloop) mode=0 if(nltic) 20,30,30 20 do 40 j=1,8 dtpos=tpos+deltic*alog10(float(j+1)) call tic(dtpos,1,firstv,alastv,axlen,angle,ndec,lblpos,nltic) 40 continue 30 tpos=deltic*float(i) call tic(tpos,mode,firstv,alastv,axlen,angle,ndec,lblpos,nltic) 10 continue c ylb=sign(0.06,float(lblpos)) strl=0.01*float(nents) xlb=0.5*(axlen-strl) call rotate(xlb,ylb,x(1),y(1)) call legend(x(1),y(1),0.015,label,nents,angle) return end c c subroutine rotate(dx,dy,rax,ray) c c program to apply a coordinate rotation around the center c (x0,y0) by an angle (ang) radians counterclockwise from c the x axis. the initial coordinates (dx,dy) are relative c to the origin. they are converted to absolute rotated c coordinates (rax,ray). c common/coord/x0,y0,ang,sinang,cosang save /coord/ c rax=x0+dx*cosang-dy*sinang ray=y0+dx*sinang+dy*cosang return end c c subroutine tic(xtic,mode,firstv,alastv,axlen,angle,ndec, &lblpos,nltic) c c program to draw a tic mark at position (xtic) relative to c the beginning of the axis. if (mode) .ne. 0 a short, c unlabeled tic is produced. if (mode)=0 a longer, labeled c tic is produced. lblpos controls whether the label is c above (lblpos>0) or below (lblpos<0) the axis. c dimension x(2),y(2) c call rotate(xtic,0.,x(1),y(1)) if(mode.ne.0) ticl=0.005 if(mode.eq.0) ticl=0.01 delty=-sign(ticl,float(lblpos)) call rotate(xtic,delty,x(2),y(2)) call line(x,y,2,1) if(mode.ne.0) return c prop=xtic/axlen valtic=firstv+(alastv-firstv)*prop if(nltic) 10,20,20 10 af=firstv al=alastv valtic=10.**(af+(al-af)*prop) 20 ynum=sign(0.025,float(lblpos)) xnum=xtic-0.01 call rotate(xnum,ynum,xnr,ynr) call number(xnr,ynr,0.01,valtic,ndec,angle) return end c c subroutine number(x,y,height,fpn,ndec,angle) c c program to plot a single precision floating point number c fpn. (x,y) are the lower left coordinates of the character c that begins the string and height is its size, all in c logical units. the number is drawn at (angle) degrees c counterclockwise from the x-axis. c c ndec is the number (0 to 6) of digits to the right of the c decimal point. if ndec=-1 the decimal and all subsequent c digits are suppressed. if ndec is (-2 to -8) the number c plotted in exponential format with abs(ndec)-2 digits to c the right of the decimal. c c inspired by a copyrighted hewlett-packard program c character numb(20),nml(10) data nml/'0','1','2','3','4','5','6','7','8','9'/ nd=ndec fpv=fpn ieptr=0 iptr=1 if((nd.lt.-8).or.(nd.gt.6)) nd=-5 c c process floating point string c if(fpv) 10,20,20 10 numb(iptr)='-' iptr=iptr+1 fpv=-fpv 20 mn=-nd if(nd+1) 200,30,40 30 mn=mn-1 40 fpv=fpv+0.5*10.**mn i=alog10(fpv)+1.0 ilp=i if(ilp) 60,60,70 60 numb(iptr)=nml(1) iptr=iptr+1 goto 90 70 do 80 j=1,ilp k=fpv*10.**(j-ilp) numb(iptr)=nml(k+1) iptr=iptr+1 fpv=fpv-(float(k)*10.**(ilp-j)) 80 continue 90 if(nd.eq.-1) goto 300 numb(iptr)='.' iptr=iptr+1 if(nd.eq.0) goto 300 do 100 j=1,nd k=fpv*10. numb(iptr)=nml(k+1) iptr=iptr+1 fpv=fpv*10.-float(k) 100 continue goto 300 c c process exponent string c 200 if(fpv) 204,201,204 201 nd=1 goto 20 204 i=alog10(fpv) iep=i if(i.le.0) iep=iep-1 fpv=fpv*10.**(-iep) nd=iabs(nd)-2 mn=-nd fpv=fpv+0.5*10.**mn if(10.-fpv) 205,205,207 205 iep=iep+1 fpv=fpv*0.1 207 ieptr=iptr+nd+2 numb(ieptr)='e' ieptr=ieptr+1 if(iep) 210,220,220 210 numb(ieptr)='-' ieptr=ieptr+1 iep=-iep 220 if(iep-9) 240,240,230 230 k=(0.1*float(iep)) numb(ieptr)=nml(k+1) ieptr=ieptr+1 iep=iep-10*k 240 numb(ieptr)=nml(iep+1) ilp=1 goto 70 c c print out final string c 300 nents=iptr-1 if(ieptr.ne.0) nents=ieptr call legend(x,y,height,numb,nents,angle) return end c c subroutine legend(x,y,height,string,nents,angle) c c program to draw an ascii string contained in the array 'label' c starting at (x,y) on the plot. the coordinates are of the lower c left corner of the first character. height is the size of the c character in logical units (height<0 draws a default size), angle c is the angle the string is drawn at, reckoned in degrees counter- c clockwise from the x-axis. Characters are always drawn with the c default line width. c c character*80 string data ifont/1/,fjust/0.0/ if(height.lt.0.0) then size=1.0 else size=amax1(0.7,height*50.) endif c call PGQLW(iwide) call PGSLW(1) call PGSCF(ifont) call PGSCH(size) call PGPTEXT(x,y,angle,fjust,string(1:nents)) call PGSCH(1.0) call PGSLW(iwide) c return end c c subroutine symbol(xsym,ysym,size,angle,isym) c c program to plot one of sixteen (isym) centered symbols. c the symbols are plotted at location (xsym,ysym), rotated c at (angle) degrees counterclockwise from the x-axis. c the symbol's maximum dimension is set by parameter c (size) in logical units. if (size)<0., a default size is used. c___________________________________________________________________ c the symbols available are: c c symbol# description symbol# description c____________________________________________________________________ c c 1 square with tic 9 hourglass c 2 octagon with tic 10 narrow hourglass c 3 triangle with tic 11 line segment c 4 diamond with tic 12 plus sign c 5 star with tic 13 asterisk c 6 tail-centered arrow 14 letter x c 7 head-centered arrow 15 letter y c 8 x bridged on top 16 letter z c_____________________________________________________________________ c logical showpen dimension nsym(16,24) common/ofset/xoff,yoff,xscale,yscale,yfac save/ofset/ c c symbol # 1 data (nsym(1,i),i=1,24) &/6,110,0,8,6,8,6,-8,-6,-8,-6,8,0,8,10*0/ c symbol # 2 data (nsym(2,i),i=1,24) &/10,110,0,8,3,8,6,3,6,-3,3,-8,-3,-8,-6,-3,-6,3,-3,8,0,8,0,0/ c symbol # 3 data (nsym(3,i),i=1,24) &/4,110,0,8,6,-8,-6,-8,0,8,14*0/ c symbol # 4 data (nsym(4,i),i=1,24) &/5,110,0,8,6,0,0,-8,-6,0,0,8,12*0/ c symbol # 5 data (nsym(5,i),i=1,24) &/10,110,0,8,6,-4,-6,-4,0,8,-110,6,4,110,0,-8,-6,4,6,4,4*0/ c symbol # 6 data (nsym(6,i),i=1,24) &/4,110,0,8,2,4,-2,4,0,8,14*0/ c symbol # 7 data (nsym(7,i),i=1,24) &/6,0,8,110,0,0,2,4,-2,4,0,0,12*0/ c symbol # 8 data (nsym(8,i),i=1,24) &/5,6,-8,110,-6,8,6,8,-6,-8,14*0/ c symbol # 9 data (nsym(9,i),i=1,24) &/5,110,6,8,-6,8,6,-8,-6,-8,0,0,12*0/ c symbol # 10 data (nsym(10,i),i=1,24) &/5,110,3,8,-3,8,3,-8,-3,-8,0,0,12*0/ c symbol # 11 data (nsym(11,i),i=1,24) &/3,0,-8,110,0,8,18*0/ c symbol # 12 data (nsym(12,i),i=1,24) &/7,0,8,110,0,-8,-110,-6,0,110,6,0,12*0/ c symbol # 13 data (nsym(13,i),i=1,24) &/15,0,-8,110,0,8,-110,6,8,110,-6,-8,-110,6,-8,110,-6,8,-110,-6,0 &,110,6,0/ c symbol # 14 data (nsym(14,i),i=1,24) &/7,6,8,110,-6,-8,-110,6,-8,110,-6,8,12*0/ c symbol # 15 data (nsym(15,i),i=1,24) &/8,6,8,110,0,0,0,-8,-110,-6,8,110,0,0,10*0/ c symbol # 16 data (nsym(16,i),i=1,24) &/9,-6,8,110,6,8,-6,-8,6,-8,-110,3,0,110,-3,0,8*0/ c c radang=0.0174533*angle csang=cos(radang) snang=sin(radang) hgt=size if(size.lt.0.0) hgt=0.01 redfac=hgt/16. nents=nsym(isym,1) iptr=2 showpen=.false. c call PGMOVE(xsym,ysym) if(nsym(isym,iptr).gt.99) then showpen=.true. iptr=iptr+1 endif do 100 i=1,nents if(nsym(isym,iptr).gt.99) then showpen=.true. iptr=iptr+1 else if(nsym(isym,iptr).lt.-99) then showpen=.false. iptr=iptr+1 else rx=float(nsym(isym,iptr)) ry=float(nsym(isym,iptr+1)) rx=redfac*rx/xscale ry=redfac*ry*yfac/yscale temp=rx rx=rx*csang-ry*snang ry=temp*snang+ry*csang if(showpen) call PGDRAW(xsym+rx,ysym+ry) if(.not.showpen) call PGMOVE(xsym+rx,ysym+ry) iptr=iptr+2 endif 100 continue return end c c subroutine initpt(idev) c c program to initialize the graphic device and set up c its initial parameters. The paramter idev determines c which device will be used. Currently available devices c are: c c idev = -1 prompt user at runtime c idev = 0 null device (for debugging) c idev = 1 postscript printer, landscape mode c idev = 2 postscript printer, portrait mode c idev = 3 xwindows screen c c c character*8 devlst(5) common/exec/kexec common/devices/iidev save /exec/,/devices/ data devlst/'?','/NULL','/PS','/VPS','/XWINDOW'/ c c make a call to PGBEGIN on first plot only c iidev=idev if((idev.lt.-1).or.(idev.gt.3)) iidev=-1 if(kexec.ne.1) then call PGBEGIN(0,devlst(iidev+2),1,1) kexec=1 endif c c reset window at each call to initpt c call PGPAGE call PGVSTAND call offset(0.,0.,1.,1.) return end c c subroutine newpen(ipen) c c program to set the width of the line drawn. c the default width is 1. pen 1 is twice as wide c if(ipen.eq.0) return ipwide=1 if(ipen.eq.1) ipwide=2 call PGSLW(ipwide) return end c c subroutine offset(xof,yof,xscl,yscl) c c program to shift plotting zero and scale coordinates for c subsequent plotting. c dimension ratio(5) common/devices/iidev common/ofset/xoff,yoff,xscale,yscale,yfac save /ofset/,/devices/ data ratio/1.0,1.0,0.681,1.12,0.726/ c yfac=ratio(iidev+2) xoff=xof yoff=yof xscale=xscl yscale=yscl xmin=-xoff/xscale xmax=(1.0-xoff)/xscale ymin=-yoff/yscale ymax=(yfac-yoff)/yscale call PGWINDOW(xmin,xmax,ymin,ymax) return end c c c subroutine line(xarray,yarray,npts,iline) c c program to draw a line of specified type, iline(1-5) connecting c the npts pairs of points contained in (xarray,yarray). c c if npts = 1 nothing is drawn. c c the currently available line types are: c c iline c c 1 solid c 2 dashed c 3 dot-dash-dot-dash c 4 dotted c 5 dash-dot-dot-dot c dimension xarray(npts),yarray(npts) lintyp=iline if((lintyp.lt.1).or.(lintyp.gt.5)) lintyp=2 call PGSLS(lintyp) call PGLINE(npts,xarray,yarray) call PGSLS(1) return end c c subroutine scale(array,npts,axlen,firstv,alastv,deltav) c c program to establish scaling factors for a vector array c containing npts values. the user specifies the axis c length axlen in logical units (0. to 1.0) and the program c returns a rationalized beginning value for the axis, c firstv and its last value, alastv, in the same units c as array, and a scaling factor deltav that compresses c all values in array into the axis length. c c values of array are not altered by this routine. c c patterned after a copyrighted hewlett-packard program in c hpispp. c dimension array(npts),save(7) data save/1.,2.,4.,5.,8.,10.,20./ fad=0.01 c axl=axlen if (axl .le. 0.0) axl=0.1 if (axl .gt. 0.98) axl=0.98 c y0=array(1) yn=y0 c c**** find minimum and maximum values among data points to be scaled c do 40 i = 1,npts ys=array(i) if (y0-ys) 20,20,10 10 y0=ys go to 40 20 if (ys-yn) 40,40,30 30 yn=ys 40 continue firstv=y0 if (y0) 50,60,60 50 fad=fad-1.0 c c**** calculate the number of data units per logical unit c 60 deltav=(yn-firstv)/axl if (deltav) 180,180,70 70 i=alog(deltav)*0.4343+1000.0 p=10.0**(i-1000) deltav=deltav/p-0.01 do 80 i = 1,6 is=i if (save(i)-deltav) 80,90,90 80 continue c c**** calculate the adjusted delta value c 90 deltav=save(is)*p firstv=deltav*aint(y0/deltav+fad) t=firstv+(axl+0.01)*deltav if (t-yn) 100,120,120 c c**** calculate the adjusted minimum value c 100 firstv=p*aint(y0/p+fad) t=firstv+(axl+.01)*deltav if (t-yn) 110,120,120 110 is=is+1 go to 90 120 firstv=firstv-aint((axl+(firstv-yn)/deltav)/2.0)*deltav if (y0*firstv) 130,130,140 130 firstv=0.0 140 alastv=firstv+deltav*axlen deltav=1./deltav return c 180 deltav=2.0*firstv deltav=abs(deltav/axl)+1. go to 70 end c c subroutine arbgrd(numnp,ien,numel,nctrs,nfreq,xx,yy,zz,pname) c c program to produce a contour map on an irregular grid. c designed to work with finite element routines, it requires c a mesh of coordinates where the contoured function is known c and a connectivity matrix ien(number of elements,4). c c originally written by p. jungels at caltech to drive a c calcomp plotter. modified by h. j. melosh, april,1986. c c numnp = number of points at which data is supplied c numel = number of elements (3 or 4 node) connecting points c nctrs = number of contours plotted c nfreq = interval between plotting contour labels c xx(numnp) = x coordinates of node points c yy(numnp) = y coordinates of node points c zz(numnp) = values to be contoured at each point c ien(4,numel) = node numbers in each element, numbered c counterclockwise around element. c if ien(3,n)=ien(4,n), then element has 3 nodes c lgrid = 0, no grid lines are plotted c = 1, grid lines are plotted in addition to contours c /grd/ = labeled common with data on grid dimensions. c must be defined in the calling program c /window/ = labeled common defining a window outside of c which contour points are ignored. if not user c defined, default values (maximum open) are used. c c note that contour values may be defined by the user by altering the c routine setctr c dimension ien(4,numel),xx(*),yy(*),zz(*),zc(99) character title*32,pname*70 c common/grd/lgrid,xlngth,ylngth,xmin,xmax,ymin,ymax,title common/window/xwmin,xwmax,ywmin,ywmax common/conturdat/icontur,zc common/lindat/ipen,iline save /lindat/,/grd/,/window/,/conturdat/ c if(((xwmin-xwmax).eq.0.).or.((ywmin-ywmax).eq.0.)) then xwmin=-1.7e38 xwmax= 1.7e38 ywmin=xwmin ywmax=xwmax endif if (lgrid .ne. 0) then c c draw the grid if requested c call newpen(4) iline=1 do 120 i = 1,numel do 110 j = 1,4 jj=j k = ien(j,i) l = mod(jj,4)+1 l = ien(l,i) if(k.eq.l) goto 110 call draw(xx(k),yy(k),xx(l),yy(l)) 110 continue 120 continue endif c c define the contour values and send them to a file named c "contour.dat" c open(12,file="contour.dat") if(icontur.eq.0) call setctr(numnp,xx,yy,zz,nctrs,zc) write(12,100) pname write(12,300) title write(12,510) (i,zc(i), i = 1,nctrs) write(12,200) 100 format(//1x,a70) 200 format(///) 300 format(/1x,a32) 510 format(/1x,'legends for contour values'//(1x,'k = ', i2,2x, &'c = ',1pe12.4)) c c draw the contours c call newpen(3) call contr(xx,yy,zz,zc,nctrs,nfreq,icontur,ien,numel,numnp) return end c c subroutine contr(xx,yy,zz,zc,nctrs,nfreq,icontur,ien,numel,numnp) c c program to locate the contours, plot and label them c common/grd/lgrid,xlngth,ylngth,xmin,xmax,ymin,ymax,title(8) common/lindat/ipen,iline save /lindat/,/grd/ dimension xx(1),yy(1),zz(1),ien(4,numel) dimension xl(4),yl(4),zl(4),zc(1) nn=0 if(zc(2).eq.zc(1)) goto 90 c c loop over elements c do 70 i=1,numel c c localize nodal coordinates c ii=i nenp=4 if(ien(3,ii).eq.ien(4,ii)) nenp=3 do 101 j=1,nenp nnode=ien(j,ii) xl(j)=xx(nnode) yl(j)=yy(nnode) zl(j)=zz(nnode) 101 continue c do 70 n=1,nctrs mn=n c c plot the contours that fall in an element c call detcon(xl,yl,zl,zc(n),nn,mn,nenp,nfreq) c 70 continue iline=1 c c label plot with max and min values c only print contour interval for values generated c by setcontr c 90 continue call newpen(2) call offset (0.,0.,1.,1.) dc = zc(2) - zc(1) call legend(.12,.651,.015,title,32,0.) call legend(.06,.01,.01,'cmin= ',6,0.) call number(.15,.01,.01,zc(1),-6,0.) call legend(.37,.01,.01,'cmax= ',6,0.) call number(.46,.01,.01,zc(nctrs),-6,0.) if(icontur.eq.0) call legend(.63,.01,.01,'delc= ',6,0.) if(icontur.eq.0) call number(.72,.01,.01,dc,-6,0.) return end c c subroutine detcon(x,y,z,zc,nn,mm,nenp,nfreq) c c seek contours in a given element and draw them c common/lindat/ipen,iline save /lindat/ dimension x(4), y(4), z(4), xc(4), yc(4) iline=1 if(zc.lt.0.0) iline=2 l = 0 do 30 n = 1,nenp i = n j = mod(i,nenp) + 1 if(zc .ge. z(i)) go to 20 if(zc .ge. z(j)) go to 25 go to 30 20 if(zc.le. z(j)) go to 25 go to 30 c c interpolate c 25 l = l + 1 call zint(i,j,xcs,ycs,x,y,z,zc) xc(l)=xcs yc(l)=ycs 30 continue if (l.eq. 0) go to 50 c c plot interpolated points c do 40 n = 1,l np=n nn = nn + 1 j = mod(np,l) + 1 call draw(xc(n),yc(n),xc(j),yc(j)) if(mod(nn,nfreq).eq.0) call lblcon(xc(n),yc(n),mm) if(l.eq. 2) go to 50 40 continue 50 return end c c subroutine draw(x1,y1,x2,y2) c c draw a line from one point to another c dimension xnn(2),ynn(2) common/window/xwmin,xwmax,ywmin,ywmax common/lindat/ipen,iline save /window/,/lindat/ if((x1.lt.xwmin).or.(x1.gt.xwmax)) return if((x2.lt.xwmin).or.(x2.gt.xwmax)) return if((y2.lt.ywmin).or.(y2.gt.ywmax)) return if((y1.lt.ywmin).or.(y1.gt.ywmax)) return xnn(1)=x1 xnn(2)=x2 ynn(1)=y1 ynn(2)=y2 call line(xnn,ynn,2,iline) return end c c subroutine lblcon(x,y,k) c c label the contours c common/window/xwmin,xwmax,ywmin,ywmax save /window/ if((x.lt.xwmin).or.(x.gt.xwmax)) return if((y.lt.ywmin).or.(y.gt.ywmax)) return ak=float(k) call number(x,y,.008,ak,-1,0.) return end c c subroutine setctr(numnp,xx,yy,zz,nctrs,zc) c c define contour values inside the window--this routine c may be altered by the user to obtain desired contour c intervals c common/window/xwmin,xwmax,ywmin,ywmax save /window/ dimension xx(1),yy(1),zz(1),zc(1) zmin=1.e32 zmax=-1.e32 do 30 j=1,numnp if((xx(j).lt.xwmin).or.(xx(j).gt.xwmax)) goto 30 if((yy(j).lt.ywmin).or.(yy(j).gt.ywmax)) goto 30 if(zz(j).gt.zmax) zmax=zz(j) if(zz(j).lt.zmin) zmin=zz(j) 30 continue if(nctrs.lt.2) go to 50 dc = (zmax-zmin)/float(nctrs+1) do 40 i = 1,nctrs zc(i) = zmin+dc*float(i) 40 continue 50 return end c c subroutine zint(i,j,xc,yc,x,y,z,zc) c c c do linear interpolation to find point where c contour line crosses side i,j. c dimension x(4),y(4),z(4) if(z(i) .eq. z(j)) go to 10 zsl=(zc-z(i))/(z(j)-z(i)) xc=x(i)+(x(j)-x(i))*zsl yc=y(i)+(y(j)-y(i))*zsl return 10 xc = x(i) yc = y(i) return end c c subroutine triien(ien,nx,ny,numel) c c program to construct the ien array for a rectangular grid c nx points long and ny points high. assumes three node triangular c elements. this routine also returns numel, the number of c elements for use in the contouring routine. the use of c triangular elements resolves any ambiguity in contour positions. c c note: numel=2*(nx-1)*(ny-1) and the node number nn for x(nn) is c determined from an array xx(i,j) is nn = i+(j-1)*nx c (normal fortran storage order) c c dimension ien(4,*) numel=0 do 100 j=1,ny-1 do 100 i=1,nx-1 numel=numel+1 ncornr=i+(j-1)*nx ien(1,numel)=ncornr ien(2,numel)=ncornr+nx+1 ien(3,numel)=ncornr+nx ien(4,numel)=ien(3,numel) numel=numel+1 ien(1,numel)=ncornr ien(2,numel)=ncornr+1 ien(3,numel)=ncornr+nx+1 ien(4,numel)=ien(3,numel) 100 continue return end c c function nchar(string) c c determines the minimum nonblank length of a string c character*(*) string character blank data blank/' '/ nmax=len(string) nchar=0 do 10 i=1,nmax itest=nmax-i+1 if(string(itest:itest).ne.blank) then nchar=itest return endif 10 continue return end c c function nnblnk(string) c c determines the position of the first nonblank entry c of a string (returns 1 if the first character is c not blank) c character*(*) string character blank data blank/' '/ nmax=len(string) nnblnk=nmax do 10 i=1,nmax if(string(i:i).ne.blank) then nnblnk=i return endif 10 continue return end c c block data inital c c program to initialize labeled commons in pltlib c common/ticdat/ndecx,nticx,nlticx,ndecy,nticy,nlticy common/lindat/ipen,iline common/scales/firsx,enx,firsy,eny common/grd/lgrid,xlngth,ylngth,xmin,xmax,ymin,ymax,title(8) common/window/xwmin,xwmax,ywmin,ywmax common/exec/kexec common/conturdat/icontur,zc(99) save /ticdat/,/lindat/,/scales/,/grd/,/window/ data ndecx,nticx,nlticx,ndecy,nticy,nlticy/6*0/ data ipen,iline/2*0/ data kexec/0/,icontur/0/ data firsx,enx,firsy,eny/4*0.e0/ data lgrid,xlngth,ylngth,xmin,xmax,ymin,ymax,title & /0,14*0.e0/ data xwmin,xwmax,ywmin,ywmax/-1.e32,1.e32,-1.e32,1.e32/ end -- Summary: internal compiler error: in instantiate_virtual_regs_lossage ERROR 1 Product: gcc Version: 4.0.1 Status: UNCONFIRMED Severity: normal Priority: P3 Component: libfortran AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: hcolella at gmail dot com http://gcc.gnu.org/bugzilla/show_bug.cgi?id=42763