subroutine funcs(x,a,y,dyda,na,mmax,ndat,maxnd,mfit,lista) c c Subroutine to provide the Levenberg-Marquardt routines with c the necessary information. It uses common blocks to get its information c from the main program without putting it through the L-M routines. c include 'constnts.inc' include 'data.inc' include 'model.inc' c integer*4 na,ndat,mfit,first,mmax,maxnd real*8 x(ndat),y(maxnd),a(na),dyda(maxnd,mmax) real*8 ylo,yhi integer*4 lista(mfit) c real*8 modvish(mxrec,mxfilt),modvisl(mxrec,mxfilt) real*8 modphas(mxrec,mxfilt) real*8 seprad,parad real*8 deltaa(mxparm) logical decstep data first/0/ c if(first.eq.0)then write(outc,'(a,a)')'Derivatives are calculated ', & 'initially using the following increments:' deltaa(1)=0.01D0 ! Diameters [mas] deltaa(2)=deltaa(1) do 70 l=3,6 70 deltaa(l)=0.01D0 ! Diameter ratios deltaa(7)=0.001D0 ! Mag. differences deltaa(8)=deltaa(7) deltaa(9)=deltaa(8) deltaa(10)=0.001D0 ! a_true [mas] deltaa(11)=0.0001D0 ! e_true deltaa(12)=period/10000.D0 ! period [days] deltaa(13)=period/10000.D0 ! epoch [days] deltaa(14)=0.01D0 ! inclination [degrees] deltaa(15)=0.01D0 ! asc_node [degrees] deltaa(16)=0.01D0 ! arg_peri [degrees] write(outc,'(a,a)')'diams ,-rat.,m-diffs.,a_true,', & 'e_true,period,epoch,inclin.,asc_node,arg_peri' write(outc,71)deltaa(1),(deltaa(j),j=6,7),(deltaa(j),j=10,16) 71 format(1x,f5.3,2x,f5.3,2x,f5.3,4x,f5.3,2x, & f6.4,2x,f5.3,1x,f5.3,2x,f5.3,3x,f5.3,3x,f5.3) write(outc,*) first=1 endif c diam(1,1)=a(1) diam(2,1)=a(2) dratio(1,2)=a(3) dratio(1,3)=a(4) dratio(2,2)=a(5) dratio(2,3)=a(6) delmag(2,1)=a(7) delmag(2,2)=a(8) delmag(2,3)=a(9) a_true=a(10) e_true=a(11) period=a(12) epoch=a(13) inclin=a(14) asc_node=a(15) arg_peri=a(16) call cadjmod mode=0 call binavis(ndata,nfilt,mxrec,mxfilt,date,baseline,hours, & lambda0,dlambda0,modvish,modphas,udata,vdata, & seprad,parad,mode,ftcurve) do i=1,ndat id=i-((i-1)/ndata)*ndata ig=(i-1)/ndata+1 y(i)=modvish(id,ig) enddo c Now calculate derivatives (numerically) do j=1,mfit k=lista(j) decstep=.false. goto (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16)k 1 diam(1,1)=a(1)-deltaa(1) goto 100 2 diam(2,1)=a(2)-deltaa(2) goto 100 3 dratio(1,2)=a(3)-deltaa(3) goto 100 4 dratio(1,3)=a(4)-deltaa(4) goto 100 5 dratio(2,2)=a(5)-deltaa(5) goto 100 6 dratio(2,3)=a(6)-deltaa(6) goto 100 7 delmag(2,1)=a(7)-deltaa(7) goto 100 8 delmag(2,2)=a(8)-deltaa(8) goto 100 9 delmag(2,3)=a(9)-deltaa(9) goto 100 10 a_true=a(10)-deltaa(10) goto 100 11 e_true=a(11)-deltaa(11) goto 100 12 period=a(12)-deltaa(12) goto 100 13 epoch=a(13)-deltaa(13) goto 100 14 inclin=a(14)-deltaa(14) goto 100 15 asc_node=a(15)-deltaa(15) goto 100 16 arg_peri=a(16)-deltaa(16) goto 100 100 call cadjmod call binavis(ndata,nfilt,mxrec,mxfilt,date,baseline,hours, & lambda0,dlambda0,modvisl,modphas,udata,vdata, & seprad,parad,mode,ftcurve) goto (21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36)k 21 diam(1,1)=a(1)+deltaa(1) goto 110 22 diam(2,1)=a(2)+deltaa(2) goto 110 23 dratio(1,2)=a(3)+deltaa(3) goto 110 24 dratio(1,3)=a(4)+deltaa(4) goto 110 25 dratio(2,2)=a(5)+deltaa(5) goto 110 26 dratio(2,3)=a(6)+deltaa(6) goto 110 27 delmag(2,1)=a(7)+deltaa(7) goto 110 28 delmag(2,2)=a(8)+deltaa(8) goto 110 29 delmag(2,3)=a(9)+deltaa(9) goto 110 30 a_true=a(10)+deltaa(10) goto 110 31 e_true=a(11)+deltaa(11) goto 110 32 period=a(12)+deltaa(12) goto 110 33 epoch=a(13)+deltaa(13) goto 110 34 inclin=a(14)+deltaa(14) goto 110 35 asc_node=a(15)+deltaa(15) goto 110 36 arg_peri=a(16)+deltaa(16) goto 110 110 call cadjmod call binavis(ndata,nfilt,mxrec,mxfilt,date,baseline,hours, & lambda0,dlambda0,modvish,modphas,udata,vdata, & seprad,parad,mode,ftcurve) goto 41 41 diam(1,1)=a(1) diam(2,1)=a(2) dratio(1,2)=a(3) dratio(1,3)=a(4) dratio(2,2)=a(5) dratio(2,3)=a(6) delmag(2,1)=a(7) delmag(2,2)=a(8) delmag(2,3)=a(9) a_true=a(10) e_true=a(11) period=a(12) epoch=a(13) inclin=a(14) asc_node=a(15) arg_peri=a(16) goto 120 120 call cadjmod do i=1,ndat id=i-((i-1)/ndata)*ndata ig=(i-1)/ndata+1 yhi=modvish(id,ig) ylo=modvisl(id,ig) dyda(i,k)=(yhi-ylo)/(2.D0*deltaa(k)) if(abs(yhi-ylo).gt.0.001D0)decstep=.true. enddo if(decstep)deltaa(k)=deltaa(k)/2.d0 enddo goto 200 200 return end