xref: /phasta/phSolver/common/dtn.f (revision 7acde132a6def0fe2daaec0d1a712dff0e5c6636)
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