xref: /phasta/phSolver/common/dtn.f (revision 595995161822a203c8467e0e4a253d7bd7d6df32)
1*59599516SKenneth E. Jansen      module dtnmod
2*59599516SKenneth E. Jansen      integer, allocatable :: ifeature(:)
3*59599516SKenneth E. Jansen      end module
4*59599516SKenneth E. Jansen
5*59599516SKenneth E. Jansen
6*59599516SKenneth E. Jansen      subroutine initDtN
7*59599516SKenneth E. Jansen      use dtnmod
8*59599516SKenneth E. Jansen      include "common.h"
9*59599516SKenneth E. Jansen      allocate (ifeature(nshg))
10*59599516SKenneth E. Jansen      end
11*59599516SKenneth E. Jansen
12*59599516SKenneth E. Jansen
13*59599516SKenneth E. Jansen      subroutine DtN(iBC,BC,y)
14*59599516SKenneth E. Jansen      use dtnmod
15*59599516SKenneth E. Jansen      include "common.h"
16*59599516SKenneth E. Jansen      real*8 BC(nshg,ndofBC),y(nshg,ndof),tmp(nsclr)
17*59599516SKenneth E. Jansen      integer iBC(nshg)
18*59599516SKenneth E. Jansen      do i=1,nshg
19*59599516SKenneth E. Jansen         itype=ifeature(i)
20*59599516SKenneth E. Jansen         if(btest(iBC(i),13)) then
21*59599516SKenneth E. Jansen            do j=1,nsclr
22*59599516SKenneth E. Jansen               tmp(j)=y(i,5+j)
23*59599516SKenneth E. Jansen            end do
24*59599516SKenneth E. Jansen            call Dirichlet2Neumann(nsclr, itype, tmp)
25*59599516SKenneth E. Jansenc
26*59599516SKenneth E. Jansenc  put the value in the position a Dirichlet value would be in BC.
27*59599516SKenneth E. Jansenc  later we will localize this value to the BCB array.
28*59599516SKenneth E. Jansenc  this is not dangerous because we should NEVER need to set Dirichlet
29*59599516SKenneth E. Jansenc  on the same node as a DtN condition
30*59599516SKenneth E. Jansenc
31*59599516SKenneth E. Jansen            do j=1,nsclr
32*59599516SKenneth E. Jansen               BC(i,6+j)=-tmp(j)
33*59599516SKenneth E. Jansen            end do
34*59599516SKenneth E. Jansen         endif
35*59599516SKenneth E. Jansen      end do
36*59599516SKenneth E. Jansen      return
37*59599516SKenneth E. Jansen      end
38*59599516SKenneth E. Jansen
39*59599516SKenneth E. Jansen      subroutine Dirichlet2Neumann_faux(nscalar, itype, tmp)
40*59599516SKenneth E. Jansenc
41*59599516SKenneth E. Jansenc This is a fake routine, designed to do nothing but feed back
42*59599516SKenneth E. Jansenc fluxes as if there were a fast reaction at the surface and the
43*59599516SKenneth E. Jansenc thickness of the stagnant BL were given by "distance".
44*59599516SKenneth E. Jansenc It can handle up to 24 different scalars.
45*59599516SKenneth E. Jansenc
46*59599516SKenneth E. Jansenc If itype is zero, the flux is arbitrarily set to half what it would
47*59599516SKenneth E. Jansenc be for any other itype.
48*59599516SKenneth E. Jansenc
49*59599516SKenneth E. Jansenc The assumption of "units" is that the initial concentrations are in
50*59599516SKenneth E. Jansenc moles/cubic-meter and the fluxes are in moles/(sec square-meter)
51*59599516SKenneth E. Jansenc
52*59599516SKenneth E. Jansenc The listed diffusivities are characteristic of metal-ions in room
53*59599516SKenneth E. Jansenc temperature water, in units of square-meter/sec.
54*59599516SKenneth E. Jansenc
55*59599516SKenneth E. Jansenc
56*59599516SKenneth E. Jansen      integer itype, nscalar
57*59599516SKenneth E. Jansen      real*8 tmp(nscalar)
58*59599516SKenneth E. Jansen
59*59599516SKenneth E. Jansen      integer i
60*59599516SKenneth E. Jansen      real*8 distance
61*59599516SKenneth E. Jansen      real*8 units
62*59599516SKenneth E. Jansen
63*59599516SKenneth E. Jansenc  Completely fake diffusivities
64*59599516SKenneth E. Jansen      real*8 D(24)
65*59599516SKenneth E. Jansen      data D/
66*59599516SKenneth E. Jansen     &       5.0d-05, 1.0d-5, 8.0d-10, 7.0d-10, 6.0d-10, 5.0d-10,
67*59599516SKenneth E. Jansen     &       4.0d-10, 3.0d-10, 2.0d-10, 1.0d-10, 0.9d-10, 0.8d-10,
68*59599516SKenneth E. Jansen     &       1.0d-10, 9.0d-10, 8.0d-10, 7.0d-10, 6.0d-10, 5.0d-10,
69*59599516SKenneth E. Jansen     &       4.0d-10, 3.0d-10, 2.0d-10, 1.0d-10, 0.9d-10, 0.8d-10/
70*59599516SKenneth E. Jansen
71*59599516SKenneth E. Jansen      do i=1,nscalar
72*59599516SKenneth E. Jansen         tmp(i) = 0.0d0
73*59599516SKenneth E. Jansen      enddo
74*59599516SKenneth E. Jansen      return
75*59599516SKenneth E. Jansen      distance = 10.0d-03
76*59599516SKenneth E. Jansen      units = 1.0d-3
77*59599516SKenneth E. Jansen      units = 1.0
78*59599516SKenneth E. Jansen      if(nscalar.gt.24) then
79*59599516SKenneth E. Jansen         write(*,*) 'Problem in Dir2Neu: nscalar larger than 24!'
80*59599516SKenneth E. Jansen         stop
81*59599516SKenneth E. Jansen      endif
82*59599516SKenneth E. Jansen
83*59599516SKenneth E. Jansen      do i=1,nscalar
84*59599516SKenneth E. Jansen         tmp(i) = D(i) * ( tmp(i) - 0.0 ) / distance  * units
85*59599516SKenneth E. Jansen         if(itype.eq.2) tmp(i) = tmp(i) / 2.0d+00
86*59599516SKenneth E. Jansen      enddo
87*59599516SKenneth E. Jansenc      tmp(1)=1.0d-5
88*59599516SKenneth E. Jansen      return
89*59599516SKenneth E. Jansen      end
90*59599516SKenneth E. Jansen
91*59599516SKenneth E. Jansen
92*59599516SKenneth E. Jansen
93*59599516SKenneth E. Jansen
94*59599516SKenneth E. Jansen
95*59599516SKenneth E. Jansen
96*59599516SKenneth E. Jansen
97*59599516SKenneth E. Jansen
98*59599516SKenneth E. Jansen
99*59599516SKenneth E. Jansen      subroutine dtnl(iBC,BC,ienb,iBCB,BCB)
100*59599516SKenneth E. Jansen      include "common.h"
101*59599516SKenneth E. Jansen      integer ienb(npro,nshl), iBC(nshg),iBCB(npro,ndiBCB)
102*59599516SKenneth E. Jansen      real*8  BCB(npro,nshlb,ndBCB), tmpBCB(npro,nshlb,nsclr),
103*59599516SKenneth E. Jansen     &        BC(nshg,ndofBC),        tmpBC(nshg,nsclr)
104*59599516SKenneth E. Jansen
105*59599516SKenneth E. Jansen      nstart=ndofBC-nsclr
106*59599516SKenneth E. Jansenc      tmpBC=zero
107*59599516SKenneth E. Jansenc      do i=1,nshg
108*59599516SKenneth E. Jansenc         if(btest(iBC(i),13)) then
109*59599516SKenneth E. Jansen            do j=1,nsclr
110*59599516SKenneth E. Jansenc               tmpBC(i,j)=BC(i,nstart+j)
111*59599516SKenneth E. Jansen               tmpBC(:,j)=BC(:,nstart+j)
112*59599516SKenneth E. Jansen            enddo
113*59599516SKenneth E. Jansenc         endif
114*59599516SKenneth E. Jansenc      enddo
115*59599516SKenneth E. Jansen
116*59599516SKenneth E. Jansen      call localb(tmpBC,tmpBCB,ienb,nsclr,'gather  ')
117*59599516SKenneth E. Jansen
118*59599516SKenneth E. Jansen      do i=1,npro
119*59599516SKenneth E. Jansen         do j=1,nsclr
120*59599516SKenneth E. Jansen            if(iBCB(i,2).lt.0) then  !this is a face with dtn
121*59599516SKenneth E. Jansen               do k=1,nshlb
122*59599516SKenneth E. Jansen                  BCB(i,k,6+j)=tmpBCB(i,k,j)
123*59599516SKenneth E. Jansen               enddo
124*59599516SKenneth E. Jansen            endif
125*59599516SKenneth E. Jansen         enddo
126*59599516SKenneth E. Jansen      enddo
127*59599516SKenneth E. Jansen      return
128*59599516SKenneth E. Jansen      end
129*59599516SKenneth E. Jansen
130*59599516SKenneth E. Jansenc
131*59599516SKenneth E. Jansenc This routine just calls the appropriate version of D2N for the number
132*59599516SKenneth E. Jansenc of scalars used
133*59599516SKenneth E. Jansenc
134*59599516SKenneth E. Jansen      subroutine Dirichlet2Neumann(nscalar, itype, tmp)
135*59599516SKenneth E. Jansen      integer nscalar, itype
136*59599516SKenneth E. Jansen      real*8 tmp(nscalar),foo
137*59599516SKenneth E. Jansen
138*59599516SKenneth E. Jansenc Just short circuit the routine for a little bit.
139*59599516SKenneth E. Jansenc      tmp(1)=0.0d0
140*59599516SKenneth E. Jansenc      return
141*59599516SKenneth E. Jansen      if(nscalar .eq. 1) then
142*59599516SKenneth E. Jansenc         write(*,*) 'Entering D2N1'
143*59599516SKenneth E. Jansenc          foo= rand(0)
144*59599516SKenneth E. Jansen         call Dirichlet2Neumann_1(nscalar,itype,tmp)
145*59599516SKenneth E. Jansenc         write(*,*) 'Returning from D2N after DTN1'
146*59599516SKenneth E. Jansenc         return
147*59599516SKenneth E. Jansen      elseif(nscalar.eq.2) then
148*59599516SKenneth E. Jansen         call Dirichlet2Neumann_2(nscalar,itype,tmp)
149*59599516SKenneth E. Jansen      else
150*59599516SKenneth E. Jansen         write(*,*) 'FATAL ERROR: cannont handle ',nscalar,' scalars'
151*59599516SKenneth E. Jansen         stop
152*59599516SKenneth E. Jansen      endif
153*59599516SKenneth E. Jansen
154*59599516SKenneth E. Jansen      return
155*59599516SKenneth E. Jansen      end
156*59599516SKenneth E. Jansen
157*59599516SKenneth E. Jansen      subroutine Dirichlet2Neumann_2(nscalar, itype, tmp)
158*59599516SKenneth E. Jansenc
159*59599516SKenneth E. Jansenc This is an interface routine, designed to call return a value for
160*59599516SKenneth E. Jansenc the flux to a point on the wafer due to electrochemical deposition
161*59599516SKenneth E. Jansenc to Ken Jansen's PHASTA given a boundary conditions and an index for
162*59599516SKenneth E. Jansenc a particular feature.
163*59599516SKenneth E. Jansenc
164*59599516SKenneth E. Jansenc There is an inherent assumption that we are going to be doing
165*59599516SKenneth E. Jansenc electroplating. This routine sets up the filenames and the
166*59599516SKenneth E. Jansenc top-of-the-domain boundary conditions.
167*59599516SKenneth E. Jansenc
168*59599516SKenneth E. Jansen      implicit none
169*59599516SKenneth E. Jansen
170*59599516SKenneth E. Jansen      integer maxdata,maxtypes
171*59599516SKenneth E. Jansen      parameter(maxdata=100,maxtypes=5)
172*59599516SKenneth E. Jansen
173*59599516SKenneth E. Jansen      integer itype, nscalar
174*59599516SKenneth E. Jansen      real*8 tmp(nscalar)
175*59599516SKenneth E. Jansenc For each table up to maxtypes, we have 4 pieces of data--two independent,
176*59599516SKenneth E. Jansenc two dependent--for each point, up to maxdata+1.
177*59599516SKenneth E. Jansen      real*8 table(4,0:maxdata,0:maxdata,maxtypes)
178*59599516SKenneth E. Jansen      save table
179*59599516SKenneth E. Jansen
180*59599516SKenneth E. Jansen      integer i,j,n
181*59599516SKenneth E. Jansen      logical readfile(maxtypes)
182*59599516SKenneth E. Jansen      save readfile
183*59599516SKenneth E. Jansen      data (readfile(i),i=1,maxtypes) / maxtypes*.false./
184*59599516SKenneth E. Jansen
185*59599516SKenneth E. Jansen      real*8  dx(2,maxtypes)
186*59599516SKenneth E. Jansen      integer numdata(2,maxtypes)
187*59599516SKenneth E. Jansen      save dx
188*59599516SKenneth E. Jansen      save numdata
189*59599516SKenneth E. Jansen
190*59599516SKenneth E. Jansen      real*8  x,y, z(3,2)
191*59599516SKenneth E. Jansenc We can only deal with two parameter models for now.
192*59599516SKenneth E. Jansen      if(nscalar .ne. 2) then
193*59599516SKenneth E. Jansen         write(*,*) 'Sorry, Dirichlet2Neumann handles 2 scalars!'
194*59599516SKenneth E. Jansen         write(*,*) 'You asked for ', nscalar
195*59599516SKenneth E. Jansen         write(*,*) 'STOPPING...'
196*59599516SKenneth E. Jansen         stop
197*59599516SKenneth E. Jansen      endif
198*59599516SKenneth E. Jansen
199*59599516SKenneth E. Jansenc If we haven't read in our parameters for this featuretype yet...
200*59599516SKenneth E. Jansen
201*59599516SKenneth E. Jansen      if( .not. readfile(itype)) then
202*59599516SKenneth E. Jansen         readfile(itype) = .true.
203*59599516SKenneth E. Jansen         call readtable_2(itype,table,numdata,dx,
204*59599516SKenneth E. Jansen     &        maxdata,maxtypes)
205*59599516SKenneth E. Jansen      endif
206*59599516SKenneth E. Jansen
207*59599516SKenneth E. Jansen      x = tmp(1)
208*59599516SKenneth E. Jansen      y = tmp(2)
209*59599516SKenneth E. Jansen
210*59599516SKenneth E. Jansen      if(.false.) then
211*59599516SKenneth E. Jansen         if( x .gt. table(1,0,0,itype) .or.
212*59599516SKenneth E. Jansen     &        x .lt. table(1,numdata(1,itype)-1,0,itype) ) then
213*59599516SKenneth E. Jansen            write(*,*) 'Sorry, concentration 1 asked for: ', x
214*59599516SKenneth E. Jansen            write(*,*) '  is out of the table bounds.'
215*59599516SKenneth E. Jansen            write(*,*)  '#1  [ ',table(1,0,0,itype), ' , ',
216*59599516SKenneth E. Jansen     &           table(1,numdata(1,itype)-1,0,itype), ' ] ',
217*59599516SKenneth E. Jansen     &           numdata(1,itype)-1
218*59599516SKenneth E. Jansen
219*59599516SKenneth E. Jansen            write(*,*) '  STOPPING...'
220*59599516SKenneth E. Jansen            stop
221*59599516SKenneth E. Jansen         endif
222*59599516SKenneth E. Jansen         if( y .gt. table(2,0,0,itype) .or.
223*59599516SKenneth E. Jansen     &        y .lt. table(2,0,numdata(2,itype)-1,itype) ) then
224*59599516SKenneth E. Jansen            write(*,*) 'Sorry, concentration 2 asked for: ', y
225*59599516SKenneth E. Jansen            write(*,*) '  is out of the table bounds.'
226*59599516SKenneth E. Jansen            write(*,*)  '#2   [ ',table(2,0,0,itype), ' , ',
227*59599516SKenneth E. Jansen     &           table(2,0,numdata(2,itype)-1,itype), ' ] ',
228*59599516SKenneth E. Jansen     &           numdata(2,itype)-1
229*59599516SKenneth E. Jansen            write(*,*) '  STOPPING...'
230*59599516SKenneth E. Jansen            stop
231*59599516SKenneth E. Jansen         endif
232*59599516SKenneth E. Jansen      endif
233*59599516SKenneth E. Jansen
234*59599516SKenneth E. Jansen      i = int ( (x - table(1,0,0,itype) ) / dx(1,itype))
235*59599516SKenneth E. Jansen      j = int ( (y - table(2,0,0,itype) ) / dx(2,itype))
236*59599516SKenneth E. Jansenc      write(*,*) 'i,j,x,y: ',i,j,x,y
237*59599516SKenneth E. Jansen      if(i .lt. 0) then
238*59599516SKenneth E. Jansen         i = 0
239*59599516SKenneth E. Jansenc         x = table(1,0,0,itype)
240*59599516SKenneth E. Jansenc         write(*,*) 'Reseting i low: ',i,j,x,y
241*59599516SKenneth E. Jansen      endif
242*59599516SKenneth E. Jansen      if(j .lt. 0) then
243*59599516SKenneth E. Jansen         j = 0
244*59599516SKenneth E. Jansen         y = table(2,0,0,itype)
245*59599516SKenneth E. Jansenc         write(*,*) 'Reseting j low: ',i,j,x,y
246*59599516SKenneth E. Jansen      endif
247*59599516SKenneth E. Jansen      if(i .ge. numdata(1,itype)) then
248*59599516SKenneth E. Jansen         i = numdata(1,itype)-2
249*59599516SKenneth E. Jansenc         x = table(1,i+1,0,itype)
250*59599516SKenneth E. Jansenc         write(*,*) 'Reseting i high: ',i,j,x,y
251*59599516SKenneth E. Jansen      endif
252*59599516SKenneth E. Jansen      if(j .ge. numdata(2,itype)) then
253*59599516SKenneth E. Jansen         j = numdata(2,itype)-2
254*59599516SKenneth E. Jansen         y = table(1,0,j+1,itype)
255*59599516SKenneth E. Jansenc         write(*,*) 'Reseting j high: ',i,j,x,y
256*59599516SKenneth E. Jansen      endif
257*59599516SKenneth E. Jansen
258*59599516SKenneth E. Jansen      do n=3,4
259*59599516SKenneth E. Jansen
260*59599516SKenneth E. Jansen         z(1,1) = table(n,i,j,itype)
261*59599516SKenneth E. Jansen         z(3,1) = table(n,i+1,j,itype)
262*59599516SKenneth E. Jansen         z(1,2) = table(n,i,j+1,itype)
263*59599516SKenneth E. Jansen         z(3,2) = table(n,i+1,j+1,itype)
264*59599516SKenneth E. Jansen
265*59599516SKenneth E. Jansen         z(2,1) = (z(3,1) - z(1,1)) / dx(1,itype)
266*59599516SKenneth E. Jansen     &        *(x-table(1,i,j,itype)) + z(1,1)
267*59599516SKenneth E. Jansen         z(2,2) = (z(3,2) - z(1,2)) / dx(1,itype)
268*59599516SKenneth E. Jansen     &        *(x-table(1,i,j,itype)) + z(1,2)
269*59599516SKenneth E. Jansen         tmp(n-2) = (z(2,2) - z(2,1))/dx(2,itype)
270*59599516SKenneth E. Jansen     &        *(y-table(2,i,j,itype)) + z(2,1)
271*59599516SKenneth E. Jansen
272*59599516SKenneth E. Jansen      enddo
273*59599516SKenneth E. Jansenc      write(*,*) 'Interpolation from ',x,y,' to:', tmp(1),tmp(2)
274*59599516SKenneth E. Jansen      return
275*59599516SKenneth E. Jansen
276*59599516SKenneth E. Jansen      end
277*59599516SKenneth E. Jansenc--------------------------------------------------------------------
278*59599516SKenneth E. Jansen
279*59599516SKenneth E. Jansen      subroutine readtable_2(islot,table,numdata,dx,maxdata,maxslots)
280*59599516SKenneth E. Jansenc
281*59599516SKenneth E. Jansenc    Read a table of ordered quadruplets and place them into the slot in
282*59599516SKenneth E. Jansenc    TABLE that is assosciated with ISLOT. Store the number of
283*59599516SKenneth E. Jansenc    data in NUMDATA and the spacing in DX.  The file to be read
284*59599516SKenneth E. Jansenc    is 'TABLE.[islot]' The data but be in a rectangular regular grid.
285*59599516SKenneth E. Jansenc
286*59599516SKenneth E. Jansenc     AUTHOR: Max Bloomfield, May 2000
287*59599516SKenneth E. Jansenc
288*59599516SKenneth E. Jansen      implicit none
289*59599516SKenneth E. Jansenc
290*59599516SKenneth E. Jansen      integer islot
291*59599516SKenneth E. Jansen      integer maxslots,numdata(2,maxslots), maxdata
292*59599516SKenneth E. Jansenc
293*59599516SKenneth E. Jansen      real*8 table(4,0:maxdata,0:maxdata,maxslots), dx(2,maxslots)
294*59599516SKenneth E. Jansen      real*8 x1,x2,y1,y2,x2old
295*59599516SKenneth E. Jansenc
296*59599516SKenneth E. Jansen      character*250 linein,filename
297*59599516SKenneth E. Jansenc
298*59599516SKenneth E. Jansen      integer i,j,k
299*59599516SKenneth E. Jansen      logical verbose
300*59599516SKenneth E. Jansen
301*59599516SKenneth E. Jansen      verbose = .true.
302*59599516SKenneth E. Jansen
303*59599516SKenneth E. Jansen      i=0
304*59599516SKenneth E. Jansen      j=0
305*59599516SKenneth E. Jansen      write(filename,1066) islot
306*59599516SKenneth E. Jansen 1066 format('TABLE.',i1)
307*59599516SKenneth E. Jansen
308*59599516SKenneth E. Jansen      open(file=filename,unit=1066)
309*59599516SKenneth E. Jansen
310*59599516SKenneth E. Jansen      write(*,*) 'Opening ', filename
311*59599516SKenneth E. Jansen
312*59599516SKenneth E. Jansen 1    continue
313*59599516SKenneth E. Jansen      read (unit=1066,fmt='(a)',end=999) linein
314*59599516SKenneth E. Jansen
315*59599516SKenneth E. Jansen      if (linein(1:1).eq.'#') then
316*59599516SKenneth E. Jansen         write (*,'(a)') linein
317*59599516SKenneth E. Jansen         goto 1
318*59599516SKenneth E. Jansen      endif
319*59599516SKenneth E. Jansenc
320*59599516SKenneth E. Jansen      if (i.gt.maxdata**2+maxdata+1) then
321*59599516SKenneth E. Jansen         write(*,*)
322*59599516SKenneth E. Jansen     &        'reached the maximum number of data points allowed'
323*59599516SKenneth E. Jansen         write(*,*) 'FATAL ERROR: stopping'
324*59599516SKenneth E. Jansen         stop
325*59599516SKenneth E. Jansen      endif
326*59599516SKenneth E. Jansenc
327*59599516SKenneth E. Jansen      read (linein,*) x1,x2,y1,y2
328*59599516SKenneth E. Jansen      if(i .gt. 0 .and. x2 .ne. x2old) then
329*59599516SKenneth E. Jansenc        increment the outer index in this nested loop. That is, go on
330*59599516SKenneth E. Jansenc        to the next "row" (not in fortran speak, but in table speak.)
331*59599516SKenneth E. Jansen         j = j + 1
332*59599516SKenneth E. Jansen         i=0
333*59599516SKenneth E. Jansen      endif
334*59599516SKenneth E. Jansen
335*59599516SKenneth E. Jansen      table(1,i,j,islot) = x1*1.d-0
336*59599516SKenneth E. Jansen      table(2,i,j,islot) = x2*1.d-0
337*59599516SKenneth E. Jansen      table(3,i,j,islot) = y1*1.d-0
338*59599516SKenneth E. Jansen      table(4,i,j,islot) = y2*1.d-0
339*59599516SKenneth E. Jansenc
340*59599516SKenneth E. Jansen      i=i+1
341*59599516SKenneth E. Jansen      x2old = x2
342*59599516SKenneth E. Jansen
343*59599516SKenneth E. Jansen      goto 1
344*59599516SKenneth E. Jansenc
345*59599516SKenneth E. Jansen 999  continue
346*59599516SKenneth E. Jansenc
347*59599516SKenneth E. Jansen      numdata(1,islot) = I
348*59599516SKenneth E. Jansen      numdata(2,islot) = j+1
349*59599516SKenneth E. Jansenc
350*59599516SKenneth E. Jansen      dx(1,islot) = table(1,2,1,islot) - table(1,1,1,islot)
351*59599516SKenneth E. Jansen      dx(2,islot) = table(2,1,2,islot) - table(2,1,1,islot)
352*59599516SKenneth E. Jansen
353*59599516SKenneth E. Jansen      if(verbose) then
354*59599516SKenneth E. Jansen         write(*,*) 'Table is ',i,' by ',j+1
355*59599516SKenneth E. Jansen
356*59599516SKenneth E. Jansen         write(*,*) 'there are ',i*(j+1),' flux data points'
357*59599516SKenneth E. Jansen         write(*,*) 'closing unit 1066'
358*59599516SKenneth E. Jansen         close(1066)
359*59599516SKenneth E. Jansenc
360*59599516SKenneth E. Jansen         write(*,*) 'The abscissa are ',
361*59599516SKenneth E. Jansen     &        dx(1,islot),' and ',dx(2,islot),' apart.'
362*59599516SKenneth E. Jansen
363*59599516SKenneth E. Jansen         write(*,*) 'the flux data are '
364*59599516SKenneth E. Jansen         do i=0,numdata(1,islot)-1
365*59599516SKenneth E. Jansen            do j=0,numdata(2,islot)-1
366*59599516SKenneth E. Jansen               write(*,*) i,j,(table(k,i,j,islot), k=1,4)
367*59599516SKenneth E. Jansen            end do
368*59599516SKenneth E. Jansen         end do
369*59599516SKenneth E. Jansen
370*59599516SKenneth E. Jansen      endif
371*59599516SKenneth E. Jansen      return
372*59599516SKenneth E. Jansen      end
373*59599516SKenneth E. Jansen
374*59599516SKenneth E. Jansen
375*59599516SKenneth E. Jansen
376*59599516SKenneth E. Jansen      subroutine Dirichlet2Neumann_1(nscalar, itype, tmp)
377*59599516SKenneth E. Jansenc
378*59599516SKenneth E. Jansenc This is an interface routine, designed to call return a value for
379*59599516SKenneth E. Jansenc the flux to a point on the wafer due to electrochemical deposition
380*59599516SKenneth E. Jansenc to Ken Jansen's PHASTA given a boundary conditions and an index for
381*59599516SKenneth E. Jansenc a particular feature.
382*59599516SKenneth E. Jansenc
383*59599516SKenneth E. Jansenc There is an inherent assumption that we are going to be doing
384*59599516SKenneth E. Jansenc electroplating. This routine sets up the filenames and the
385*59599516SKenneth E. Jansenc top-of-the-domain boundary conditions.
386*59599516SKenneth E. Jansenc
387*59599516SKenneth E. Jansen      implicit none
388*59599516SKenneth E. Jansen
389*59599516SKenneth E. Jansen      integer maxdata,maxtypes
390*59599516SKenneth E. Jansen      parameter(maxdata=200,maxtypes=2)
391*59599516SKenneth E. Jansen
392*59599516SKenneth E. Jansen      integer itype, nscalar
393*59599516SKenneth E. Jansen      real*8 tmp(nscalar)
394*59599516SKenneth E. Jansen      real*8 table(0:maxdata,2,maxtypes)
395*59599516SKenneth E. Jansen      save table
396*59599516SKenneth E. Jansen
397*59599516SKenneth E. Jansen      integer i
398*59599516SKenneth E. Jansen      logical readfile(maxtypes)
399*59599516SKenneth E. Jansen      save readfile
400*59599516SKenneth E. Jansen      data (readfile(i),i=1,maxtypes) / maxtypes*.false./
401*59599516SKenneth E. Jansen
402*59599516SKenneth E. Jansen      real*8  dx(maxtypes)
403*59599516SKenneth E. Jansen      save dx
404*59599516SKenneth E. Jansen      integer numdata(maxtypes)
405*59599516SKenneth E. Jansen      save numdata
406*59599516SKenneth E. Jansen
407*59599516SKenneth E. Jansen      real*8 dt, conc_BC, flux_BC
408*59599516SKenneth E. Jansenc We can only deal with one parameter models for now.
409*59599516SKenneth E. Jansen
410*59599516SKenneth E. Jansen      if(nscalar .ne. 1) then
411*59599516SKenneth E. Jansen         write(*,*) 'Sorry, Dirichlet2Neumann can only handle 1 scalar!'
412*59599516SKenneth E. Jansen         write(*,*) 'You asked for ', nscalar
413*59599516SKenneth E. Jansen         write(*,*) 'STOPPING...'
414*59599516SKenneth E. Jansen         stop
415*59599516SKenneth E. Jansen      endif
416*59599516SKenneth E. Jansen
417*59599516SKenneth E. Jansenc If we haven't read in our parameters for this featuretype yet...
418*59599516SKenneth E. Jansen
419*59599516SKenneth E. Jansen      if( .not. readfile(itype)) then
420*59599516SKenneth E. Jansen         readfile(itype) = .true.
421*59599516SKenneth E. Jansen         call readtable_1(itype,table,numdata(itype),dx(itype),
422*59599516SKenneth E. Jansen     &        maxdata,maxtypes)
423*59599516SKenneth E. Jansenc         write(*,*) 'back from readtable'
424*59599516SKenneth E. Jansen         if(dx(itype) .eq. 0.0d0) then
425*59599516SKenneth E. Jansen            write(*,*) 'DX for table ',itype,' is zero (I think!)'
426*59599516SKenneth E. Jansen            stop
427*59599516SKenneth E. Jansen         endif
428*59599516SKenneth E. Jansen      endif
429*59599516SKenneth E. Jansenc      write(*,*) 'returning from D2N'
430*59599516SKenneth E. Jansen
431*59599516SKenneth E. Jansen      conc_BC = tmp(1)
432*59599516SKenneth E. Jansen
433*59599516SKenneth E. Jansenc      if( conc_BC .lt. table(0,1,itype) .or.
434*59599516SKenneth E. Jansenc     &    conc_BC .gt. table(numdata(itype),1,itype) ) then
435*59599516SKenneth E. Jansenc         write(*,*) 'Sorry, concentration asked for: ', conc_BC
436*59599516SKenneth E. Jansenc         write(*,*) '  is out of the table bounds.'
437*59599516SKenneth E. Jansenc         write(*,*) '[',table(0,1,itype),',
438*59599516SKenneth E. Jansenc     &        ',table(numdata(itype),1,itype),']'
439*59599516SKenneth E. Jansenc         write(*,*) '  STOPPING...'
440*59599516SKenneth E. Jansenc         stop
441*59599516SKenneth E. Jansenc      endif
442*59599516SKenneth E. Jansen
443*59599516SKenneth E. Jansen      i = int ( (conc_BC - table(0,1,itype) ) / dx(itype))
444*59599516SKenneth E. Jansen
445*59599516SKenneth E. Jansen      if( conc_BC .lt. table(0,1,itype))then
446*59599516SKenneth E. Jansen         i = 0
447*59599516SKenneth E. Jansen         conc_BC =  table(i,1,itype)
448*59599516SKenneth E. Jansen      elseif( conc_BC .gt. table(numdata(itype),1,itype)) then
449*59599516SKenneth E. Jansen         i = numdata(itype)
450*59599516SKenneth E. Jansen         conc_BC =  table(i,1,itype)
451*59599516SKenneth E. Jansen      endif
452*59599516SKenneth E. Jansen
453*59599516SKenneth E. Jansen
454*59599516SKenneth E. Jansen      dt = conc_BC - table(i,1,itype)
455*59599516SKenneth E. Jansen      flux_BC = dt * (table(i+1,2,itype) - table(i,2,itype)) +
456*59599516SKenneth E. Jansen     &     table(i,2,itype)
457*59599516SKenneth E. Jansen
458*59599516SKenneth E. Jansen
459*59599516SKenneth E. Jansen      tmp(1) = flux_BC
460*59599516SKenneth E. Jansen
461*59599516SKenneth E. Jansen
462*59599516SKenneth E. Jansen      end
463*59599516SKenneth E. Jansenc--------------------------------------------------------------------
464*59599516SKenneth E. Jansen
465*59599516SKenneth E. Jansen      subroutine readtable_1(islot,table,numdata,dx,maxdata,maxslots)
466*59599516SKenneth E. Jansenc
467*59599516SKenneth E. Jansenc     Read a table of ordered pairs and place them into the slot in
468*59599516SKenneth E. Jansenc     TABLE that is assosciated with ISLOT. Store the number of
469*59599516SKenneth E. Jansenc     data in NUMDATA and the spacing in DX.  The file to be read
470*59599516SKenneth E. Jansenc     is 'TABLE.[islot]'
471*59599516SKenneth E. Jansenc
472*59599516SKenneth E. Jansenc     AUTHOR: Max Bloomfield, May 2000
473*59599516SKenneth E. Jansenc
474*59599516SKenneth E. Jansen      implicit none
475*59599516SKenneth E. Jansenc
476*59599516SKenneth E. Jansen      integer islot
477*59599516SKenneth E. Jansen      integer numdata, maxdata, maxslots
478*59599516SKenneth E. Jansenc
479*59599516SKenneth E. Jansen      real*8 table(0:maxdata,2,maxslots),dx
480*59599516SKenneth E. Jansenc
481*59599516SKenneth E. Jansen      character*80 linein,filename
482*59599516SKenneth E. Jansenc
483*59599516SKenneth E. Jansen      integer i,j
484*59599516SKenneth E. Jansen      logical verbose
485*59599516SKenneth E. Jansen      verbose = .true.
486*59599516SKenneth E. Jansen
487*59599516SKenneth E. Jansen      i=-1
488*59599516SKenneth E. Jansen
489*59599516SKenneth E. Jansen      write(filename,1066) islot
490*59599516SKenneth E. Jansen 1066 format('TABLE.',i1)
491*59599516SKenneth E. Jansen      open(file=filename,unit=1066)
492*59599516SKenneth E. Jansen      if(verbose) write(*,*) 'Opening ', filename
493*59599516SKenneth E. Jansen
494*59599516SKenneth E. Jansen 1    continue
495*59599516SKenneth E. Jansen      read (unit=1066,fmt='(a)',end=999) linein
496*59599516SKenneth E. Jansen
497*59599516SKenneth E. Jansen      if (linein(1:1).eq.'#') then
498*59599516SKenneth E. Jansen         write (*,'(a)') linein
499*59599516SKenneth E. Jansen         goto 1
500*59599516SKenneth E. Jansen      endif
501*59599516SKenneth E. Jansenc
502*59599516SKenneth E. Jansen      i=i+1
503*59599516SKenneth E. Jansen      if (i.ge.maxdata) then
504*59599516SKenneth E. Jansen         write(*,*)
505*59599516SKenneth E. Jansen     &        'reached the maximum number of data points allowed'
506*59599516SKenneth E. Jansen         write(*,*) 'FATAL ERROR: stopping'
507*59599516SKenneth E. Jansen         stop
508*59599516SKenneth E. Jansen      endif
509*59599516SKenneth E. Jansenc
510*59599516SKenneth E. Jansen      read (linein,*) table(i,1,islot), table(i,2,islot)
511*59599516SKenneth E. Jansen      table(i,1,islot)= table(i,1,islot)*1.0d-0
512*59599516SKenneth E. Jansen      table(i,2,islot)= table(i,2,islot)*1.0d-0
513*59599516SKenneth E. Jansenc
514*59599516SKenneth E. Jansen      goto 1
515*59599516SKenneth E. Jansenc
516*59599516SKenneth E. Jansen 999  continue
517*59599516SKenneth E. Jansenc
518*59599516SKenneth E. Jansen      numdata = i
519*59599516SKenneth E. Jansen      dx = table(1,1,islot)-table(0,1,islot)
520*59599516SKenneth E. Jansenc
521*59599516SKenneth E. Jansen      if(verbose) then
522*59599516SKenneth E. Jansen         write(*,*) 'there are ',numdata,' flux data points'
523*59599516SKenneth E. Jansen         write(*,*) 'closing unit 1066'
524*59599516SKenneth E. Jansen         close(1066)
525*59599516SKenneth E. Jansenc
526*59599516SKenneth E. Jansen         write(*,*) 'the flux data are '
527*59599516SKenneth E. Jansen         do 101 j=0,i
528*59599516SKenneth E. Jansen            write(*,*) j,table(j,1,islot), table(j,2,islot)
529*59599516SKenneth E. Jansen 101     continue
530*59599516SKenneth E. Jansen      endif
531*59599516SKenneth E. Jansen      return
532*59599516SKenneth E. Jansen      end
533