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