Brillouin diagrams are plots of resonant frequencies as a function of the phase in periodic structures. GdfidL allows computation with specified phase shifts in x- y- and z-direction simultaneously. So we can compute Brillouin diagrams in 3D periodic structures, where the plane normals of the planes of periodicity are in x- y- and z-direction simultaneously.
The following inputfile defines an elemental cell of such a periodic structure.
# /usr/local/gd1/examples-from-the-manual/brillo.gdf # # Assign a value to "PHASE", if it is not yet defined # via "gd1 -DPHASE=XX" # if (! defined(PHASE) ) then define(PHASE, 45) endif # # What part of the Brillouin-diagram do we want to compute? # # # part==1 : from Gamma to H : 0<kx<pi/d, ky=0, kz=0 # part==2 : from H to N : kx=pi/d, 0<ky<pi/d, kz=0 # part==3 : from N to P : kx=pi/d, ky=pi/d, 0<kz<pi/d # part==4 : from P to Gamma : 0 < (kx=ky=kz) < pi/d # # # get the value of PART by inclusion of a file: # the content of the file is simply # "define(PART, 1)" # or "define(PART, 2)" # or "define(PART, 3)" # or "define(PART, 4)" include(this-part-of-brillo) if ( PART == 1 ) then define(XPHASE, PHASE) define(YPHASE, 000) define(ZPHASE, 000) endif if ( PART == 2 ) then define(XPHASE, 180) define(YPHASE, PHASE) define(ZPHASE, 000) endif if ( PART == 3 ) then define(XPHASE, 180) define(YPHASE, 180) define(ZPHASE, PHASE) endif if ( PART == 4 ) then define(XPHASE, PHASE) define(YPHASE, PHASE) define(ZPHASE, PHASE) endif define(INF, 10000.0 *@clight) define(MAG, 2) define(EL, 1) ## ## Geometry definitions ## define(LATTICE_D, @clight/2 ) define(RADIUS, LATTICE_D * 0.375 ) # # default mesh spacing # define(STPSZE, RADIUS/10 ) ############## ############## ############## ############## ############## -general outfile= /tmp/UserName/outfile scratchbase= /tmp/UserName/delete-me- text()= lattice constant d= LATTICE_D text()= radius of the spheres= RADIUS text()= r/d = eval(RADIUS/LATTICE_D) text()= 2r/d = eval(2*RADIUS/LATTICE_D) text()= stpsze= STPSZE text()= xphase: XPHASE text()= yphase: YPHASE text()= zphase: ZPHASE -mesh spacing= STPSZE graded= yes, dmaxgraded= 10*STPSZE qfgraded= 1.3 perfectmesh= yes pxlow= -0.5*LATTICE_D, pxhigh= 0.5*LATTICE_D pylow= -0.5*LATTICE_D, pyhigh= 0.5*LATTICE_D pzlow= -0.5*LATTICE_D, pzhigh= 0.5*LATTICE_D xperiodic= yes, xphase= XPHASE yperiodic= yes, yphase= YPHASE zperiodic= yes, zphase= ZPHASE do ii= -1, 1, 1 xfixed( 2, ii*LATTICE_D-RADIUS, ii*LATTICE_D+RADIUS ) xfixed( 2, (ii-0.1)*LATTICE_D, (ii+0.1)*LATTICE_D ) yfixed( 2, ii*LATTICE_D-RADIUS, ii*LATTICE_D+RADIUS ) yfixed( 2, (ii-0.1)*LATTICE_D, (ii+0.1)*LATTICE_D ) zfixed( 2, ii*LATTICE_D-RADIUS, ii*LATTICE_D+RADIUS ) zfixed( 2, (ii-0.1)*LATTICE_D, (ii+0.1)*LATTICE_D ) enddo ############## -brick # # Fill the universe with vacuum # material= 0 volume= (-INF,INF, -INF,INF, -INF,INF) doit define(M3, 1) # # define square lattice # Only a part of these spheres end up being within # computational volume # do iz= 0, 1, 1 do ix= 0, 1, 1 do iy= 0, 1, 1 # # a sphere with center at # ( ix*LATTICE_D, iy*LATTICE_D, iz*LATTICE_D ) # -gbor material= M3 origin= ( ix*LATTICE_D, \ iy*LATTICE_D, \ iz*LATTICE_D ) rprimedirection= ( 1, 0, 0 ) zprimedirection= ( 0, 0, 1 ) range= ( 0, 360 ) clear point= ( -RADIUS, 0 ) arc, radius= RADIUS, type= clockwise, size= small point= ( RADIUS, 0) doit enddo enddo enddo # # the connecting rods in x-direction # do iz= 0, 1, 1 do iy= 0, 1, 1 -gccylinder material= M3 radius= 0.1*LATTICE_D length= INF origin= ( -INF/2, \ iy*LATTICE_D, \ iz*LATTICE_D ) direction= ( 1, 0, 0 ) doit enddo enddo # # the connecting rods in y-direction # do iz= 0, 1, 1 do ix= 0, 1, 1 -gccylinder material= M3 radius= 0.1*LATTICE_D length= INF origin= ( ix*LATTICE_D, \ -INF/2, \ iz*LATTICE_D ) direction= ( 0, 1, 0 ) doit enddo enddo # # the connecting rods in z-direction # do ix= 0, 1, 1 do iy= 0, 1, 1 -gccylinder material= M3 radius= 0.1*LATTICE_D length= INF origin= ( ix*LATTICE_D, \ iy*LATTICE_D, \ -INF/2 ) direction= ( 0, 0, 1 ) doit enddo enddo # # definition of the material properties # -material material= M3, type= electric # # what does the materialdistribution look like? # -volumeplot ## doit ################# # # computation of the eigenvalues # -eigenvalues solutions= 20 estimation= 2.8 pfac2= 1e-2 passes= 2 doit endIn order to compute the four parts of the Brillouin diagram, we use a shell-script. This shell script starts a program four times. That program starts gd1 several times to compute the frequencies for different phase shifts. This is the shell-script:
#!/bin/sh # # Compile the program which starts "gd1" several times # f77 brillo.f -o brillo.a.out for part in 1 2 3 4 do # # (re)create the file that defines which part of the # Brillouin diagram is to be computed: # echo "define(PART, $part)" > this-part-of-brillo # # compute.. ./brillo.a.out # # save the result, and display # cp brillo.mtv brillo.part=$part.mtv mymtv brillo.part=$part.mtv & done # # compile the program that combines the four parts # to a single Brillouin diagram of a 3D structure, # execute it, # and display the result.. # f90 a3dbrillo.f cat brillo.part=[1-4].mtv | a.out mymtv2 3D-brillo.mtv &
The following is the source of the program that starts gd1 several times to compute the frequencies for different phase shifts:
* * /usr/local/gd1/examples-from-the-manual/brillo.f * * this is compilable with g77 * PROGRAM Bla CHARACTER*400 cmd * DIMENSION f0(300,1 000), ph0(1 000) i11= 11 i19= 19 OPEN (UNIT= i19 1 , FILE= 'brillo.mtv') * WRITE (UNIT= i19, FMT= 9000) 9000 FORMAT( 1 '$ DATA= CURVE2D NAME= "Brillouin-Diagramm"',/, 2 '% linetype= 0',/, 3 '% markertype= 3',/ 4 '% equalscale= false',/, 5 '% fitpage= false',/, 6 '% xyratio= 3',/, 7 '% xlabel= "Phase-shift"',/, 8 '% ylabel= "Frequency"',/, 1 '% comment= "no comment"',/ 4 ) * af= 0. ap= 0. * NMode= 15 * * p0: First Phase * p1: Last Phase * np: Number of Phases * p0= 0. p1= 180. np= 41 * DO 10 ip= 1, np, 1 phase= p0+(ip-1)*(p1-p0)/FLOAT(np-1) ph0(ip)= phase WRITE (UNIT= cmd, FMT= 8010) phase 8010 FORMAT( 1 ' gd1 "-DPHASE=',F8.2,'"< brillo.gdf ' 3 ,'| tee brillo.tmp | grep "for me" > brillo.out' 9 ) write (0,*) ' cmd:',cmd(1:120) CALL system(cmd) OPEN (UNIT= i11 1 , FILE= 'brillo.out') mode= 0 100 CONTINUE READ (UNIT= i11, FMT= *, ERR= 199, END= 199) idum,f,acc IF (acc .LT. 0.5) THEN mode= mode+1 IF (mode .LE. NMode) f0(mode,ip)= f WRITE (UNIT= i19, FMT= 7010) phase,f write (0,*) phase,f,acc af= MAX(af,f) ap= MAX(ap,phase) ENDIF GOTO 100 199 CONTINUE CLOSE (UNIT= i11) 10 CONTINUE * 7010 FORMAT( 1 '@ point x1=',E12.6,' y1=',E12.6,' z1= 0 markertype=1', 2 ' markersize= 1') * DO mode= 1, NMode, 1 WRITE (UNIT= i19, FMT= *) DO ip= 1, np, 1 WRITE (UNIT= i19, FMT= *) ph0(ip),f0(mode,ip) ENDDO ENDDO WRITE (UNIT= i19, FMT= *) WRITE (UNIT= i19, FMT= 9900) 0.,0.,0.,af,ap,af 9900 FORMAT(3(1H ,2(E12.6,' ')/),/) * * ** * ** write the uninterpreted data * ** * DO ip= 1, np, 1 WRITE (UNIT= i19, FMT= '(//,A,F14.2)') ' # phase:',ph0(ip) DO mode= 1, NMode, 1 WRITE (UNIT= i19, FMT= '(A,1X,E20.7)') '#',f0(mode,ip) ENDDO ENDDO * ENDThe resulting plots are presented in figure 5.9.
The following is the source of the program that combines the four parts of the Brillouin diagram to a single plot:
* * /usr/local/gd1/examples-from-the-manual/a3dbrillo.f * * usage: * * cat brillo.part=[1-4].mtv | a.out * mymtv2 3D-brillo.mtv * * DIMENSION f0(300,1 000), ph0(1 000) REAL, DIMENSION(100) :: Phase0, scale CHARACTER(LEN=1000) :: str * i11= 11 i19= 19 OPEN (UNIT= i19 1 , FILE= '3D-brillo.mtv') * WRITE (UNIT= i19, FMT= 9000) 9000 FORMAT( 1 '$ DATA= CURVE2D NAME= "Brillouin-Diagramm"',/, 2 '% linetype= 0',/, 3 '% markertype= 3',/ 4 '% equalscale= false',/, 5 '% fitpage= false',/, 6 '% xyratio= 3',/, 7 '% xlabel= "normalised Phase-shift"',/, 8 '% ylabel= "Frequency"',/, 9 '% comment= "no comment"',/ x ) * af= 0. ap= 0. * NMode= 10 * phase0(1:4)= (/ 0.0, 1 1.0, 2 2.0, 3 4.0 /) scale(1:4)= (/ 1./180.0, !! Gamma to H 2 1./180.0, !! H to N 3 1./180.0, !! N to P 4 -1./180.0 /) !! P to Gamma * Phase Last= 0. np= 1 str= ' ' DO DO IF (INDEX(str, '# phase:') .NE. 0) THEN jj= INDEX(str, '# phase:')+LEN('# phase:') READ (UNIT= str(jj:), FMT= *) phase IF (phase .LT. Phase Last) THEN np= np+1 ENDIF Phase Last= phase EXIT ENDIF READ (UNIT= *, FMT= '(A)', END= 10) str ENDDO write (*,*) ' phase:', phase pp= Phase0(np) ph0(np)= pp+phase*scale(np) * mode= 0 DO mode= 1, NMode, 1 READ (UNIT= *, FMT= '(A)', END= 10) str READ (UNIT= str(2:), FMT= *, IOSTAT= iostat) f IF (iostat .NE. 0) EXIT write (*,*) ' pp, f:', pp+phase*scale(np), f f0(mode,np)= f WRITE (UNIT= i19, FMT= 7010) pp+phase*scale(np),f af= MAX(af,f) ap= MAX(ap,pp+phase*scale(np)) ENDDO ENDDO 10 CONTINUE * 7010 FORMAT( 1 '@ point x1=',E12.6,' y1=',E12.6,' z1= 0 markertype=1', 2 ' markersize= 1') * WRITE (UNIT= i19, FMT= *) WRITE (UNIT= i19, FMT= 9900) 0.,0.,0.,af,ap,af 9900 FORMAT(3(' ',2(E12.6,' ')/),/) * ENDThe resulting plot is presented in figure 5.10.
This is the end of this document