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