159599516SKenneth E. Jansen module dtnmod 259599516SKenneth E. Jansen integer, allocatable :: ifeature(:) 359599516SKenneth E. Jansen end module 459599516SKenneth E. Jansen 559599516SKenneth E. Jansen 659599516SKenneth E. Jansen subroutine initDtN 759599516SKenneth E. Jansen use dtnmod 859599516SKenneth E. Jansen include "common.h" 959599516SKenneth E. Jansen allocate (ifeature(nshg)) 1059599516SKenneth E. Jansen end 1159599516SKenneth E. Jansen 126b966dd8SCameron Smith subroutine finalizeDtN 136b966dd8SCameron Smith use dtnmod 146b966dd8SCameron Smith include "common.h" 15*766bc785SCameron Smith if( allocated(ifeature) ) then 166b966dd8SCameron Smith deallocate(ifeature) 17*766bc785SCameron Smith endif 186b966dd8SCameron Smith end 1959599516SKenneth E. Jansen 2059599516SKenneth E. Jansen subroutine DtN(iBC,BC,y) 2159599516SKenneth E. Jansen use dtnmod 2259599516SKenneth E. Jansen include "common.h" 2359599516SKenneth E. Jansen real*8 BC(nshg,ndofBC),y(nshg,ndof),tmp(nsclr) 2459599516SKenneth E. Jansen integer iBC(nshg) 2559599516SKenneth E. Jansen do i=1,nshg 2659599516SKenneth E. Jansen itype=ifeature(i) 2759599516SKenneth E. Jansen if(btest(iBC(i),13)) then 2859599516SKenneth E. Jansen do j=1,nsclr 2959599516SKenneth E. Jansen tmp(j)=y(i,5+j) 3059599516SKenneth E. Jansen end do 3159599516SKenneth E. Jansen call Dirichlet2Neumann(nsclr, itype, tmp) 3259599516SKenneth E. Jansenc 3359599516SKenneth E. Jansenc put the value in the position a Dirichlet value would be in BC. 3459599516SKenneth E. Jansenc later we will localize this value to the BCB array. 3559599516SKenneth E. Jansenc this is not dangerous because we should NEVER need to set Dirichlet 3659599516SKenneth E. Jansenc on the same node as a DtN condition 3759599516SKenneth E. Jansenc 3859599516SKenneth E. Jansen do j=1,nsclr 3959599516SKenneth E. Jansen BC(i,6+j)=-tmp(j) 4059599516SKenneth E. Jansen end do 4159599516SKenneth E. Jansen endif 4259599516SKenneth E. Jansen end do 4359599516SKenneth E. Jansen return 4459599516SKenneth E. Jansen end 4559599516SKenneth E. Jansen 4659599516SKenneth E. Jansen subroutine Dirichlet2Neumann_faux(nscalar, itype, tmp) 4759599516SKenneth E. Jansenc 4859599516SKenneth E. Jansenc This is a fake routine, designed to do nothing but feed back 4959599516SKenneth E. Jansenc fluxes as if there were a fast reaction at the surface and the 5059599516SKenneth E. Jansenc thickness of the stagnant BL were given by "distance". 5159599516SKenneth E. Jansenc It can handle up to 24 different scalars. 5259599516SKenneth E. Jansenc 5359599516SKenneth E. Jansenc If itype is zero, the flux is arbitrarily set to half what it would 5459599516SKenneth E. Jansenc be for any other itype. 5559599516SKenneth E. Jansenc 5659599516SKenneth E. Jansenc The assumption of "units" is that the initial concentrations are in 5759599516SKenneth E. Jansenc moles/cubic-meter and the fluxes are in moles/(sec square-meter) 5859599516SKenneth E. Jansenc 5959599516SKenneth E. Jansenc The listed diffusivities are characteristic of metal-ions in room 6059599516SKenneth E. Jansenc temperature water, in units of square-meter/sec. 6159599516SKenneth E. Jansenc 6259599516SKenneth E. Jansenc 6359599516SKenneth E. Jansen integer itype, nscalar 6459599516SKenneth E. Jansen real*8 tmp(nscalar) 6559599516SKenneth E. Jansen 6659599516SKenneth E. Jansen integer i 6759599516SKenneth E. Jansen real*8 distance 6859599516SKenneth E. Jansen real*8 units 6959599516SKenneth E. Jansen 7059599516SKenneth E. Jansenc Completely fake diffusivities 7159599516SKenneth E. Jansen real*8 D(24) 7259599516SKenneth E. Jansen data D/ 7359599516SKenneth E. Jansen & 5.0d-05, 1.0d-5, 8.0d-10, 7.0d-10, 6.0d-10, 5.0d-10, 7459599516SKenneth E. Jansen & 4.0d-10, 3.0d-10, 2.0d-10, 1.0d-10, 0.9d-10, 0.8d-10, 7559599516SKenneth E. Jansen & 1.0d-10, 9.0d-10, 8.0d-10, 7.0d-10, 6.0d-10, 5.0d-10, 7659599516SKenneth E. Jansen & 4.0d-10, 3.0d-10, 2.0d-10, 1.0d-10, 0.9d-10, 0.8d-10/ 7759599516SKenneth E. Jansen 7859599516SKenneth E. Jansen do i=1,nscalar 7959599516SKenneth E. Jansen tmp(i) = 0.0d0 8059599516SKenneth E. Jansen enddo 8159599516SKenneth E. Jansen return 8259599516SKenneth E. Jansen distance = 10.0d-03 8359599516SKenneth E. Jansen units = 1.0d-3 8459599516SKenneth E. Jansen units = 1.0 8559599516SKenneth E. Jansen if(nscalar.gt.24) then 8659599516SKenneth E. Jansen write(*,*) 'Problem in Dir2Neu: nscalar larger than 24!' 8759599516SKenneth E. Jansen stop 8859599516SKenneth E. Jansen endif 8959599516SKenneth E. Jansen 9059599516SKenneth E. Jansen do i=1,nscalar 9159599516SKenneth E. Jansen tmp(i) = D(i) * ( tmp(i) - 0.0 ) / distance * units 9259599516SKenneth E. Jansen if(itype.eq.2) tmp(i) = tmp(i) / 2.0d+00 9359599516SKenneth E. Jansen enddo 9459599516SKenneth E. Jansenc tmp(1)=1.0d-5 9559599516SKenneth E. Jansen return 9659599516SKenneth E. Jansen end 9759599516SKenneth E. Jansen 9859599516SKenneth E. Jansen 9959599516SKenneth E. Jansen 10059599516SKenneth E. Jansen 10159599516SKenneth E. Jansen 10259599516SKenneth E. Jansen 10359599516SKenneth E. Jansen 10459599516SKenneth E. Jansen 10559599516SKenneth E. Jansen 10659599516SKenneth E. Jansen subroutine dtnl(iBC,BC,ienb,iBCB,BCB) 10759599516SKenneth E. Jansen include "common.h" 10859599516SKenneth E. Jansen integer ienb(npro,nshl), iBC(nshg),iBCB(npro,ndiBCB) 10959599516SKenneth E. Jansen real*8 BCB(npro,nshlb,ndBCB), tmpBCB(npro,nshlb,nsclr), 11059599516SKenneth E. Jansen & BC(nshg,ndofBC), tmpBC(nshg,nsclr) 11159599516SKenneth E. Jansen 11259599516SKenneth E. Jansen nstart=ndofBC-nsclr 11359599516SKenneth E. Jansenc tmpBC=zero 11459599516SKenneth E. Jansenc do i=1,nshg 11559599516SKenneth E. Jansenc if(btest(iBC(i),13)) then 11659599516SKenneth E. Jansen do j=1,nsclr 11759599516SKenneth E. Jansenc tmpBC(i,j)=BC(i,nstart+j) 11859599516SKenneth E. Jansen tmpBC(:,j)=BC(:,nstart+j) 11959599516SKenneth E. Jansen enddo 12059599516SKenneth E. Jansenc endif 12159599516SKenneth E. Jansenc enddo 12259599516SKenneth E. Jansen 12359599516SKenneth E. Jansen call localb(tmpBC,tmpBCB,ienb,nsclr,'gather ') 12459599516SKenneth E. Jansen 12559599516SKenneth E. Jansen do i=1,npro 12659599516SKenneth E. Jansen do j=1,nsclr 12759599516SKenneth E. Jansen if(iBCB(i,2).lt.0) then !this is a face with dtn 12859599516SKenneth E. Jansen do k=1,nshlb 12959599516SKenneth E. Jansen BCB(i,k,6+j)=tmpBCB(i,k,j) 13059599516SKenneth E. Jansen enddo 13159599516SKenneth E. Jansen endif 13259599516SKenneth E. Jansen enddo 13359599516SKenneth E. Jansen enddo 13459599516SKenneth E. Jansen return 13559599516SKenneth E. Jansen end 13659599516SKenneth E. Jansen 13759599516SKenneth E. Jansenc 13859599516SKenneth E. Jansenc This routine just calls the appropriate version of D2N for the number 13959599516SKenneth E. Jansenc of scalars used 14059599516SKenneth E. Jansenc 14159599516SKenneth E. Jansen subroutine Dirichlet2Neumann(nscalar, itype, tmp) 14259599516SKenneth E. Jansen integer nscalar, itype 14359599516SKenneth E. Jansen real*8 tmp(nscalar),foo 14459599516SKenneth E. Jansen 14559599516SKenneth E. Jansenc Just short circuit the routine for a little bit. 14659599516SKenneth E. Jansenc tmp(1)=0.0d0 14759599516SKenneth E. Jansenc return 14859599516SKenneth E. Jansen if(nscalar .eq. 1) then 14959599516SKenneth E. Jansenc write(*,*) 'Entering D2N1' 15059599516SKenneth E. Jansenc foo= rand(0) 15159599516SKenneth E. Jansen call Dirichlet2Neumann_1(nscalar,itype,tmp) 15259599516SKenneth E. Jansenc write(*,*) 'Returning from D2N after DTN1' 15359599516SKenneth E. Jansenc return 15459599516SKenneth E. Jansen elseif(nscalar.eq.2) then 15559599516SKenneth E. Jansen call Dirichlet2Neumann_2(nscalar,itype,tmp) 15659599516SKenneth E. Jansen else 15759599516SKenneth E. Jansen write(*,*) 'FATAL ERROR: cannont handle ',nscalar,' scalars' 15859599516SKenneth E. Jansen stop 15959599516SKenneth E. Jansen endif 16059599516SKenneth E. Jansen 16159599516SKenneth E. Jansen return 16259599516SKenneth E. Jansen end 16359599516SKenneth E. Jansen 16459599516SKenneth E. Jansen subroutine Dirichlet2Neumann_2(nscalar, itype, tmp) 16559599516SKenneth E. Jansenc 16659599516SKenneth E. Jansenc This is an interface routine, designed to call return a value for 16759599516SKenneth E. Jansenc the flux to a point on the wafer due to electrochemical deposition 16859599516SKenneth E. Jansenc to Ken Jansen's PHASTA given a boundary conditions and an index for 16959599516SKenneth E. Jansenc a particular feature. 17059599516SKenneth E. Jansenc 17159599516SKenneth E. Jansenc There is an inherent assumption that we are going to be doing 17259599516SKenneth E. Jansenc electroplating. This routine sets up the filenames and the 17359599516SKenneth E. Jansenc top-of-the-domain boundary conditions. 17459599516SKenneth E. Jansenc 17559599516SKenneth E. Jansen implicit none 17659599516SKenneth E. Jansen 17759599516SKenneth E. Jansen integer maxdata,maxtypes 17859599516SKenneth E. Jansen parameter(maxdata=100,maxtypes=5) 17959599516SKenneth E. Jansen 18059599516SKenneth E. Jansen integer itype, nscalar 18159599516SKenneth E. Jansen real*8 tmp(nscalar) 18259599516SKenneth E. Jansenc For each table up to maxtypes, we have 4 pieces of data--two independent, 18359599516SKenneth E. Jansenc two dependent--for each point, up to maxdata+1. 18459599516SKenneth E. Jansen real*8 table(4,0:maxdata,0:maxdata,maxtypes) 18559599516SKenneth E. Jansen save table 18659599516SKenneth E. Jansen 18759599516SKenneth E. Jansen integer i,j,n 18859599516SKenneth E. Jansen logical readfile(maxtypes) 18959599516SKenneth E. Jansen save readfile 19059599516SKenneth E. Jansen data (readfile(i),i=1,maxtypes) / maxtypes*.false./ 19159599516SKenneth E. Jansen 19259599516SKenneth E. Jansen real*8 dx(2,maxtypes) 19359599516SKenneth E. Jansen integer numdata(2,maxtypes) 19459599516SKenneth E. Jansen save dx 19559599516SKenneth E. Jansen save numdata 19659599516SKenneth E. Jansen 19759599516SKenneth E. Jansen real*8 x,y, z(3,2) 19859599516SKenneth E. Jansenc We can only deal with two parameter models for now. 19959599516SKenneth E. Jansen if(nscalar .ne. 2) then 20059599516SKenneth E. Jansen write(*,*) 'Sorry, Dirichlet2Neumann handles 2 scalars!' 20159599516SKenneth E. Jansen write(*,*) 'You asked for ', nscalar 20259599516SKenneth E. Jansen write(*,*) 'STOPPING...' 20359599516SKenneth E. Jansen stop 20459599516SKenneth E. Jansen endif 20559599516SKenneth E. Jansen 20659599516SKenneth E. Jansenc If we haven't read in our parameters for this featuretype yet... 20759599516SKenneth E. Jansen 20859599516SKenneth E. Jansen if( .not. readfile(itype)) then 20959599516SKenneth E. Jansen readfile(itype) = .true. 21059599516SKenneth E. Jansen call readtable_2(itype,table,numdata,dx, 21159599516SKenneth E. Jansen & maxdata,maxtypes) 21259599516SKenneth E. Jansen endif 21359599516SKenneth E. Jansen 21459599516SKenneth E. Jansen x = tmp(1) 21559599516SKenneth E. Jansen y = tmp(2) 21659599516SKenneth E. Jansen 21759599516SKenneth E. Jansen if(.false.) then 21859599516SKenneth E. Jansen if( x .gt. table(1,0,0,itype) .or. 21959599516SKenneth E. Jansen & x .lt. table(1,numdata(1,itype)-1,0,itype) ) then 22059599516SKenneth E. Jansen write(*,*) 'Sorry, concentration 1 asked for: ', x 22159599516SKenneth E. Jansen write(*,*) ' is out of the table bounds.' 22259599516SKenneth E. Jansen write(*,*) '#1 [ ',table(1,0,0,itype), ' , ', 22359599516SKenneth E. Jansen & table(1,numdata(1,itype)-1,0,itype), ' ] ', 22459599516SKenneth E. Jansen & numdata(1,itype)-1 22559599516SKenneth E. Jansen 22659599516SKenneth E. Jansen write(*,*) ' STOPPING...' 22759599516SKenneth E. Jansen stop 22859599516SKenneth E. Jansen endif 22959599516SKenneth E. Jansen if( y .gt. table(2,0,0,itype) .or. 23059599516SKenneth E. Jansen & y .lt. table(2,0,numdata(2,itype)-1,itype) ) then 23159599516SKenneth E. Jansen write(*,*) 'Sorry, concentration 2 asked for: ', y 23259599516SKenneth E. Jansen write(*,*) ' is out of the table bounds.' 23359599516SKenneth E. Jansen write(*,*) '#2 [ ',table(2,0,0,itype), ' , ', 23459599516SKenneth E. Jansen & table(2,0,numdata(2,itype)-1,itype), ' ] ', 23559599516SKenneth E. Jansen & numdata(2,itype)-1 23659599516SKenneth E. Jansen write(*,*) ' STOPPING...' 23759599516SKenneth E. Jansen stop 23859599516SKenneth E. Jansen endif 23959599516SKenneth E. Jansen endif 24059599516SKenneth E. Jansen 24159599516SKenneth E. Jansen i = int ( (x - table(1,0,0,itype) ) / dx(1,itype)) 24259599516SKenneth E. Jansen j = int ( (y - table(2,0,0,itype) ) / dx(2,itype)) 24359599516SKenneth E. Jansenc write(*,*) 'i,j,x,y: ',i,j,x,y 24459599516SKenneth E. Jansen if(i .lt. 0) then 24559599516SKenneth E. Jansen i = 0 24659599516SKenneth E. Jansenc x = table(1,0,0,itype) 24759599516SKenneth E. Jansenc write(*,*) 'Reseting i low: ',i,j,x,y 24859599516SKenneth E. Jansen endif 24959599516SKenneth E. Jansen if(j .lt. 0) then 25059599516SKenneth E. Jansen j = 0 25159599516SKenneth E. Jansen y = table(2,0,0,itype) 25259599516SKenneth E. Jansenc write(*,*) 'Reseting j low: ',i,j,x,y 25359599516SKenneth E. Jansen endif 25459599516SKenneth E. Jansen if(i .ge. numdata(1,itype)) then 25559599516SKenneth E. Jansen i = numdata(1,itype)-2 25659599516SKenneth E. Jansenc x = table(1,i+1,0,itype) 25759599516SKenneth E. Jansenc write(*,*) 'Reseting i high: ',i,j,x,y 25859599516SKenneth E. Jansen endif 25959599516SKenneth E. Jansen if(j .ge. numdata(2,itype)) then 26059599516SKenneth E. Jansen j = numdata(2,itype)-2 26159599516SKenneth E. Jansen y = table(1,0,j+1,itype) 26259599516SKenneth E. Jansenc write(*,*) 'Reseting j high: ',i,j,x,y 26359599516SKenneth E. Jansen endif 26459599516SKenneth E. Jansen 26559599516SKenneth E. Jansen do n=3,4 26659599516SKenneth E. Jansen 26759599516SKenneth E. Jansen z(1,1) = table(n,i,j,itype) 26859599516SKenneth E. Jansen z(3,1) = table(n,i+1,j,itype) 26959599516SKenneth E. Jansen z(1,2) = table(n,i,j+1,itype) 27059599516SKenneth E. Jansen z(3,2) = table(n,i+1,j+1,itype) 27159599516SKenneth E. Jansen 27259599516SKenneth E. Jansen z(2,1) = (z(3,1) - z(1,1)) / dx(1,itype) 27359599516SKenneth E. Jansen & *(x-table(1,i,j,itype)) + z(1,1) 27459599516SKenneth E. Jansen z(2,2) = (z(3,2) - z(1,2)) / dx(1,itype) 27559599516SKenneth E. Jansen & *(x-table(1,i,j,itype)) + z(1,2) 27659599516SKenneth E. Jansen tmp(n-2) = (z(2,2) - z(2,1))/dx(2,itype) 27759599516SKenneth E. Jansen & *(y-table(2,i,j,itype)) + z(2,1) 27859599516SKenneth E. Jansen 27959599516SKenneth E. Jansen enddo 28059599516SKenneth E. Jansenc write(*,*) 'Interpolation from ',x,y,' to:', tmp(1),tmp(2) 28159599516SKenneth E. Jansen return 28259599516SKenneth E. Jansen 28359599516SKenneth E. Jansen end 28459599516SKenneth E. Jansenc-------------------------------------------------------------------- 28559599516SKenneth E. Jansen 28659599516SKenneth E. Jansen subroutine readtable_2(islot,table,numdata,dx,maxdata,maxslots) 28759599516SKenneth E. Jansenc 28859599516SKenneth E. Jansenc Read a table of ordered quadruplets and place them into the slot in 28959599516SKenneth E. Jansenc TABLE that is assosciated with ISLOT. Store the number of 29059599516SKenneth E. Jansenc data in NUMDATA and the spacing in DX. The file to be read 29159599516SKenneth E. Jansenc is 'TABLE.[islot]' The data but be in a rectangular regular grid. 29259599516SKenneth E. Jansenc 29359599516SKenneth E. Jansenc AUTHOR: Max Bloomfield, May 2000 29459599516SKenneth E. Jansenc 29559599516SKenneth E. Jansen implicit none 29659599516SKenneth E. Jansenc 29759599516SKenneth E. Jansen integer islot 29859599516SKenneth E. Jansen integer maxslots,numdata(2,maxslots), maxdata 29959599516SKenneth E. Jansenc 30059599516SKenneth E. Jansen real*8 table(4,0:maxdata,0:maxdata,maxslots), dx(2,maxslots) 30159599516SKenneth E. Jansen real*8 x1,x2,y1,y2,x2old 30259599516SKenneth E. Jansenc 30359599516SKenneth E. Jansen character*250 linein,filename 30459599516SKenneth E. Jansenc 30559599516SKenneth E. Jansen integer i,j,k 30659599516SKenneth E. Jansen logical verbose 30759599516SKenneth E. Jansen 30859599516SKenneth E. Jansen verbose = .true. 30959599516SKenneth E. Jansen 31059599516SKenneth E. Jansen i=0 31159599516SKenneth E. Jansen j=0 31259599516SKenneth E. Jansen write(filename,1066) islot 31359599516SKenneth E. Jansen 1066 format('TABLE.',i1) 31459599516SKenneth E. Jansen 31559599516SKenneth E. Jansen open(file=filename,unit=1066) 31659599516SKenneth E. Jansen 31759599516SKenneth E. Jansen write(*,*) 'Opening ', filename 31859599516SKenneth E. Jansen 31959599516SKenneth E. Jansen 1 continue 32059599516SKenneth E. Jansen read (unit=1066,fmt='(a)',end=999) linein 32159599516SKenneth E. Jansen 32259599516SKenneth E. Jansen if (linein(1:1).eq.'#') then 32359599516SKenneth E. Jansen write (*,'(a)') linein 32459599516SKenneth E. Jansen goto 1 32559599516SKenneth E. Jansen endif 32659599516SKenneth E. Jansenc 32759599516SKenneth E. Jansen if (i.gt.maxdata**2+maxdata+1) then 32859599516SKenneth E. Jansen write(*,*) 32959599516SKenneth E. Jansen & 'reached the maximum number of data points allowed' 33059599516SKenneth E. Jansen write(*,*) 'FATAL ERROR: stopping' 33159599516SKenneth E. Jansen stop 33259599516SKenneth E. Jansen endif 33359599516SKenneth E. Jansenc 33459599516SKenneth E. Jansen read (linein,*) x1,x2,y1,y2 33559599516SKenneth E. Jansen if(i .gt. 0 .and. x2 .ne. x2old) then 33659599516SKenneth E. Jansenc increment the outer index in this nested loop. That is, go on 33759599516SKenneth E. Jansenc to the next "row" (not in fortran speak, but in table speak.) 33859599516SKenneth E. Jansen j = j + 1 33959599516SKenneth E. Jansen i=0 34059599516SKenneth E. Jansen endif 34159599516SKenneth E. Jansen 34259599516SKenneth E. Jansen table(1,i,j,islot) = x1*1.d-0 34359599516SKenneth E. Jansen table(2,i,j,islot) = x2*1.d-0 34459599516SKenneth E. Jansen table(3,i,j,islot) = y1*1.d-0 34559599516SKenneth E. Jansen table(4,i,j,islot) = y2*1.d-0 34659599516SKenneth E. Jansenc 34759599516SKenneth E. Jansen i=i+1 34859599516SKenneth E. Jansen x2old = x2 34959599516SKenneth E. Jansen 35059599516SKenneth E. Jansen goto 1 35159599516SKenneth E. Jansenc 35259599516SKenneth E. Jansen 999 continue 35359599516SKenneth E. Jansenc 35459599516SKenneth E. Jansen numdata(1,islot) = I 35559599516SKenneth E. Jansen numdata(2,islot) = j+1 35659599516SKenneth E. Jansenc 35759599516SKenneth E. Jansen dx(1,islot) = table(1,2,1,islot) - table(1,1,1,islot) 35859599516SKenneth E. Jansen dx(2,islot) = table(2,1,2,islot) - table(2,1,1,islot) 35959599516SKenneth E. Jansen 36059599516SKenneth E. Jansen if(verbose) then 36159599516SKenneth E. Jansen write(*,*) 'Table is ',i,' by ',j+1 36259599516SKenneth E. Jansen 36359599516SKenneth E. Jansen write(*,*) 'there are ',i*(j+1),' flux data points' 36459599516SKenneth E. Jansen write(*,*) 'closing unit 1066' 36559599516SKenneth E. Jansen close(1066) 36659599516SKenneth E. Jansenc 36759599516SKenneth E. Jansen write(*,*) 'The abscissa are ', 36859599516SKenneth E. Jansen & dx(1,islot),' and ',dx(2,islot),' apart.' 36959599516SKenneth E. Jansen 37059599516SKenneth E. Jansen write(*,*) 'the flux data are ' 37159599516SKenneth E. Jansen do i=0,numdata(1,islot)-1 37259599516SKenneth E. Jansen do j=0,numdata(2,islot)-1 37359599516SKenneth E. Jansen write(*,*) i,j,(table(k,i,j,islot), k=1,4) 37459599516SKenneth E. Jansen end do 37559599516SKenneth E. Jansen end do 37659599516SKenneth E. Jansen 37759599516SKenneth E. Jansen endif 37859599516SKenneth E. Jansen return 37959599516SKenneth E. Jansen end 38059599516SKenneth E. Jansen 38159599516SKenneth E. Jansen 38259599516SKenneth E. Jansen 38359599516SKenneth E. Jansen subroutine Dirichlet2Neumann_1(nscalar, itype, tmp) 38459599516SKenneth E. Jansenc 38559599516SKenneth E. Jansenc This is an interface routine, designed to call return a value for 38659599516SKenneth E. Jansenc the flux to a point on the wafer due to electrochemical deposition 38759599516SKenneth E. Jansenc to Ken Jansen's PHASTA given a boundary conditions and an index for 38859599516SKenneth E. Jansenc a particular feature. 38959599516SKenneth E. Jansenc 39059599516SKenneth E. Jansenc There is an inherent assumption that we are going to be doing 39159599516SKenneth E. Jansenc electroplating. This routine sets up the filenames and the 39259599516SKenneth E. Jansenc top-of-the-domain boundary conditions. 39359599516SKenneth E. Jansenc 39459599516SKenneth E. Jansen implicit none 39559599516SKenneth E. Jansen 39659599516SKenneth E. Jansen integer maxdata,maxtypes 39759599516SKenneth E. Jansen parameter(maxdata=200,maxtypes=2) 39859599516SKenneth E. Jansen 39959599516SKenneth E. Jansen integer itype, nscalar 40059599516SKenneth E. Jansen real*8 tmp(nscalar) 40159599516SKenneth E. Jansen real*8 table(0:maxdata,2,maxtypes) 40259599516SKenneth E. Jansen save table 40359599516SKenneth E. Jansen 40459599516SKenneth E. Jansen integer i 40559599516SKenneth E. Jansen logical readfile(maxtypes) 40659599516SKenneth E. Jansen save readfile 40759599516SKenneth E. Jansen data (readfile(i),i=1,maxtypes) / maxtypes*.false./ 40859599516SKenneth E. Jansen 40959599516SKenneth E. Jansen real*8 dx(maxtypes) 41059599516SKenneth E. Jansen save dx 41159599516SKenneth E. Jansen integer numdata(maxtypes) 41259599516SKenneth E. Jansen save numdata 41359599516SKenneth E. Jansen 41459599516SKenneth E. Jansen real*8 dt, conc_BC, flux_BC 41559599516SKenneth E. Jansenc We can only deal with one parameter models for now. 41659599516SKenneth E. Jansen 41759599516SKenneth E. Jansen if(nscalar .ne. 1) then 41859599516SKenneth E. Jansen write(*,*) 'Sorry, Dirichlet2Neumann can only handle 1 scalar!' 41959599516SKenneth E. Jansen write(*,*) 'You asked for ', nscalar 42059599516SKenneth E. Jansen write(*,*) 'STOPPING...' 42159599516SKenneth E. Jansen stop 42259599516SKenneth E. Jansen endif 42359599516SKenneth E. Jansen 42459599516SKenneth E. Jansenc If we haven't read in our parameters for this featuretype yet... 42559599516SKenneth E. Jansen 42659599516SKenneth E. Jansen if( .not. readfile(itype)) then 42759599516SKenneth E. Jansen readfile(itype) = .true. 42859599516SKenneth E. Jansen call readtable_1(itype,table,numdata(itype),dx(itype), 42959599516SKenneth E. Jansen & maxdata,maxtypes) 43059599516SKenneth E. Jansenc write(*,*) 'back from readtable' 43159599516SKenneth E. Jansen if(dx(itype) .eq. 0.0d0) then 43259599516SKenneth E. Jansen write(*,*) 'DX for table ',itype,' is zero (I think!)' 43359599516SKenneth E. Jansen stop 43459599516SKenneth E. Jansen endif 43559599516SKenneth E. Jansen endif 43659599516SKenneth E. Jansenc write(*,*) 'returning from D2N' 43759599516SKenneth E. Jansen 43859599516SKenneth E. Jansen conc_BC = tmp(1) 43959599516SKenneth E. Jansen 44059599516SKenneth E. Jansenc if( conc_BC .lt. table(0,1,itype) .or. 44159599516SKenneth E. Jansenc & conc_BC .gt. table(numdata(itype),1,itype) ) then 44259599516SKenneth E. Jansenc write(*,*) 'Sorry, concentration asked for: ', conc_BC 44359599516SKenneth E. Jansenc write(*,*) ' is out of the table bounds.' 44459599516SKenneth E. Jansenc write(*,*) '[',table(0,1,itype),', 44559599516SKenneth E. Jansenc & ',table(numdata(itype),1,itype),']' 44659599516SKenneth E. Jansenc write(*,*) ' STOPPING...' 44759599516SKenneth E. Jansenc stop 44859599516SKenneth E. Jansenc endif 44959599516SKenneth E. Jansen 45059599516SKenneth E. Jansen i = int ( (conc_BC - table(0,1,itype) ) / dx(itype)) 45159599516SKenneth E. Jansen 45259599516SKenneth E. Jansen if( conc_BC .lt. table(0,1,itype))then 45359599516SKenneth E. Jansen i = 0 45459599516SKenneth E. Jansen conc_BC = table(i,1,itype) 45559599516SKenneth E. Jansen elseif( conc_BC .gt. table(numdata(itype),1,itype)) then 45659599516SKenneth E. Jansen i = numdata(itype) 45759599516SKenneth E. Jansen conc_BC = table(i,1,itype) 45859599516SKenneth E. Jansen endif 45959599516SKenneth E. Jansen 46059599516SKenneth E. Jansen 46159599516SKenneth E. Jansen dt = conc_BC - table(i,1,itype) 46259599516SKenneth E. Jansen flux_BC = dt * (table(i+1,2,itype) - table(i,2,itype)) + 46359599516SKenneth E. Jansen & table(i,2,itype) 46459599516SKenneth E. Jansen 46559599516SKenneth E. Jansen 46659599516SKenneth E. Jansen tmp(1) = flux_BC 46759599516SKenneth E. Jansen 46859599516SKenneth E. Jansen 46959599516SKenneth E. Jansen end 47059599516SKenneth E. Jansenc-------------------------------------------------------------------- 47159599516SKenneth E. Jansen 47259599516SKenneth E. Jansen subroutine readtable_1(islot,table,numdata,dx,maxdata,maxslots) 47359599516SKenneth E. Jansenc 47459599516SKenneth E. Jansenc Read a table of ordered pairs and place them into the slot in 47559599516SKenneth E. Jansenc TABLE that is assosciated with ISLOT. Store the number of 47659599516SKenneth E. Jansenc data in NUMDATA and the spacing in DX. The file to be read 47759599516SKenneth E. Jansenc is 'TABLE.[islot]' 47859599516SKenneth E. Jansenc 47959599516SKenneth E. Jansenc AUTHOR: Max Bloomfield, May 2000 48059599516SKenneth E. Jansenc 48159599516SKenneth E. Jansen implicit none 48259599516SKenneth E. Jansenc 48359599516SKenneth E. Jansen integer islot 48459599516SKenneth E. Jansen integer numdata, maxdata, maxslots 48559599516SKenneth E. Jansenc 48659599516SKenneth E. Jansen real*8 table(0:maxdata,2,maxslots),dx 48759599516SKenneth E. Jansenc 48859599516SKenneth E. Jansen character*80 linein,filename 48959599516SKenneth E. Jansenc 49059599516SKenneth E. Jansen integer i,j 49159599516SKenneth E. Jansen logical verbose 49259599516SKenneth E. Jansen verbose = .true. 49359599516SKenneth E. Jansen 49459599516SKenneth E. Jansen i=-1 49559599516SKenneth E. Jansen 49659599516SKenneth E. Jansen write(filename,1066) islot 49759599516SKenneth E. Jansen 1066 format('TABLE.',i1) 49859599516SKenneth E. Jansen open(file=filename,unit=1066) 49959599516SKenneth E. Jansen if(verbose) write(*,*) 'Opening ', filename 50059599516SKenneth E. Jansen 50159599516SKenneth E. Jansen 1 continue 50259599516SKenneth E. Jansen read (unit=1066,fmt='(a)',end=999) linein 50359599516SKenneth E. Jansen 50459599516SKenneth E. Jansen if (linein(1:1).eq.'#') then 50559599516SKenneth E. Jansen write (*,'(a)') linein 50659599516SKenneth E. Jansen goto 1 50759599516SKenneth E. Jansen endif 50859599516SKenneth E. Jansenc 50959599516SKenneth E. Jansen i=i+1 51059599516SKenneth E. Jansen if (i.ge.maxdata) then 51159599516SKenneth E. Jansen write(*,*) 51259599516SKenneth E. Jansen & 'reached the maximum number of data points allowed' 51359599516SKenneth E. Jansen write(*,*) 'FATAL ERROR: stopping' 51459599516SKenneth E. Jansen stop 51559599516SKenneth E. Jansen endif 51659599516SKenneth E. Jansenc 51759599516SKenneth E. Jansen read (linein,*) table(i,1,islot), table(i,2,islot) 51859599516SKenneth E. Jansen table(i,1,islot)= table(i,1,islot)*1.0d-0 51959599516SKenneth E. Jansen table(i,2,islot)= table(i,2,islot)*1.0d-0 52059599516SKenneth E. Jansenc 52159599516SKenneth E. Jansen goto 1 52259599516SKenneth E. Jansenc 52359599516SKenneth E. Jansen 999 continue 52459599516SKenneth E. Jansenc 52559599516SKenneth E. Jansen numdata = i 52659599516SKenneth E. Jansen dx = table(1,1,islot)-table(0,1,islot) 52759599516SKenneth E. Jansenc 52859599516SKenneth E. Jansen if(verbose) then 52959599516SKenneth E. Jansen write(*,*) 'there are ',numdata,' flux data points' 53059599516SKenneth E. Jansen write(*,*) 'closing unit 1066' 53159599516SKenneth E. Jansen close(1066) 53259599516SKenneth E. Jansenc 53359599516SKenneth E. Jansen write(*,*) 'the flux data are ' 53459599516SKenneth E. Jansen do 101 j=0,i 53559599516SKenneth E. Jansen write(*,*) j,table(j,1,islot), table(j,2,islot) 53659599516SKenneth E. Jansen 101 continue 53759599516SKenneth E. Jansen endif 53859599516SKenneth E. Jansen return 53959599516SKenneth E. Jansen end 540