*********************************************************************** program CutDrift *********************************************************************** c c cuts cylindrical drift from TOUGH2 mesh. c version 1.0, 9/8/2000 c c S. Finsterle c parameter (maxel=200000) character*5 elem,elem1,elem2,cavit,cmat,cdum character*10 caht,cpermmod character*40 filein,fileout character*80 line dimension elem(maxel) dimension icavity(maxel) data cavit/'DRIij'/ data icavity/maxel*0/ write(*,*) write(*,*) ' Cut Cylindrical Cavity' write(*,*) ' **********************' write(*,*) write(*,*) ' Input MESH file : ? ' read(*,'(a)')filein open(1,file=filein, status='old') write(*,*) ' Output MESH file : ? ' read(*,'(a)')fileout open(2,file=fileout,status='unknown') write(*,*) ' Volume of drift element : ? ' read(*,*) volume write(*,*) ' Nodal distance from drift wall : ? ' read(*,*) distance write(*,*) ' Cosine multiplication factor ' write(*,*) ' (set to 1 to keep gravity) ? ' read(*,*) cosine write(*,*) ' Drift geometry (xcenter,zcenter,radius) ' write(*,*) ' (drift axis is assumed parallel to Y-axis):' write(*,*) ' Xcenter : ? ' read(*,*) xcenter write(*,*) ' Zcenter : ? ' read(*,*) zcenter write(*,*) ' Radius : ? ' read(*,*) radius open(3,file='drift.con',status='unknown') 1000 continue read(1,7000,end=9000) line 7000 format(a) call lenos(line,ll) write(2,7000) line(:ll) if (line(1:5).ne.'ELEME') goto 1000 iel=0 2001 continue c c --- elements iel=iel+1 if (mod(iel,1000).eq.1) & write(*,*) ' Working on element ',max(1,iel-1) read(1,7001) elem(iel),cmat,vol,caht,cpermmod,x,y,z 7001 format(a5,10x,a5,e10.4,2a10,3e10.4) if (elem(iel).eq.' ') goto 2002 call cavity(x,y,z,xcenter,zcenter,radius,icavity(iel)) if (icavity(iel).le.0) then read(caht,'(e10.4)',iostat=ios) aht if (abs(aht).lt.1.0e-10) caht=' ' write(2,7001) elem(iel),cmat,vol,caht,cpermmod,x,y,z endif goto 2001 2002 continue iel=iel-1 cavit(4:5)='98' write(2,7001) cavit,'DRIFT',volume/2.0,' ',' ', & xcenter,0.0,zcenter cavit(4:5)='99' write(2,7001) cavit,'DRIFT',volume/2.0,' ',' ', & xcenter,0.0,zcenter c c --- connections read(1,7000) cdum write(2,7000) ' ' write(2,7000) 'CONNE' 2003 continue icon=icon+1 if (mod(icon,1000).eq.1) & write(*,*) ' Working on connection ',max(1,icon-1) read(1,7002) elem1,elem2,isot,d1,d2,areax,betax 7002 format(2a5,15x,i5,4e10.4) if (elem1.eq.' '.or.elem1.eq.'+++ ') then write(2,7000) ' ' if (elem1.eq.'+++ ') goto 9000 goto 2007 endif do 1001 i=1,iel if (elem1.eq.elem(i)) goto 2004 1001 continue 2004 continue do 1002 j=1,iel if (elem2.eq.elem(j)) goto 2005 1002 continue 2005 continue if (i.gt.iel.or.j.gt.iel) goto 2003 if (icavity(i).eq.1) then elem1=cavit d1=distance betax=betax*cosine endif if (icavity(j).eq.1) then elem2=cavit d2=distance betax=betax*cosine endif if (icavity(i)+icavity(j).lt.2) then if (icavity(j).eq.1) then cdum=elem1 elem1=elem2 elem2=cdum d=d1 d1=d2 d2=d betax=-betax endif if (icavity(i).eq.1.or.icavity(j).eq.1) then if (isot.eq.1) then elem1(4:5)='98' else elem1(4:5)='99' endif cdum=elem2 if (elem2(4:4).eq.' ') cdum(4:4)='_' if (cdum(1:3).ne.'BOT') write(3,7003) elem1,cdum 7003 format(9x,a5,1x,a5,2x,'&') endif write(2,7002) elem1,elem2,isot,d1,d2,areax,betax endif goto 2003 c c --- write rest of file 2007 continue read(1,7000,end=9000) line call lenos(line,ll) write(2,7000) line(:ll) goto 2007 9000 continue close(1) close(2) close(3) call lenos(fileout,lf) write(*,*) ' CutDrift terminated.' write(*,*) ' Result on file ',fileout(:lf) write(*,*) ' File drift.con contains a list of connections ' write(*,*) ' to the drift element to be imported into iTOUGH2.' end c --- end of CutDrift *********************************************************************** subroutine cavity(x,y,z,xcenter,zcenter,radius,ini) *********************************************************************** ini=0 c c --- cut out cylindrical drift r=(x-xcenter)*(x-xcenter)+(z-zcenter)*(z-zcenter) if (sqrt(r).le.radius) ini=1 end c --- end of cavity *********************************************************************** subroutine lenos(string,lstr) *********************************************************************** character string*(*) lstr=1 ilenstr=len(string) if (ilenstr.eq.0) return do 1000 i=ilenstr,1,-1 if (string(i:i).ne.char(9).and.string(i:i).ne.' ') then lstr=i return endif 1000 continue end c --- end of lenos