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