diff --git a/conda/pypi-build-py310.yml b/conda/pypi-build-py310.yml index 8f71cd5..cecfbbb 100644 --- a/conda/pypi-build-py310.yml +++ b/conda/pypi-build-py310.yml @@ -5,9 +5,9 @@ channels: - conda-forge dependencies: - - m2w64-toolchain_win-64=5.3.0 # [win] - - gfortran=13.2.0 # [linux] + - m2w64-toolchain_win-64=2.5.0 # [win] + - gfortran=13.2.0 # [linux or osx] - python=3.10.* - - numpy>=1.22.* + - numpy==2.0.* - pre-commit - pytest diff --git a/conda/recipe/meta.yaml b/conda/recipe/meta.yaml index cb80bb1..0d403bc 100644 --- a/conda/recipe/meta.yaml +++ b/conda/recipe/meta.yaml @@ -1,13 +1,13 @@ {% set name = "quasielasticbayes" %} -{% set version = "0.2.0" %} +{% set version = "0.2.2" %} package: name: {{ name|lower }} version: {{ version }} source: - url: https://pypi.io/packages/source/{{ name[0] }}/{{ name }}/{{ name }}-{{ version }}.b6.tar.gz - sha256: 1aa89b704b0bce81749b576b633f87f1c746d05c4d54591f6f65f3ccf0b045b8 + url: https://pypi.io/packages/source/{{ name[0] }}/{{ name }}/{{ name }}-{{ version }}.tar.gz + sha256: 980313e642b0d5efcda7f37528d8ded2d28b577887122a9c1d4158cef61de058 build: skip: True # [py<310 or py>310] @@ -17,17 +17,16 @@ build: requirements: build: - - {{ fortran_compiler }} - python # [build_platform != target_platform] - cross-python_{{ target_platform }} # [build_platform != target_platform] - numpy # [build_platform != target_platform] + - {{ fortran_compiler }} host: - python - setuptools - numpy run: - python - - {{ pin_compatible('numpy') }} test: imports: diff --git a/quasielasticbayes/Bayes.f90 b/quasielasticbayes/Bayes.f90 index fdc540e..228ba0e 100644 --- a/quasielasticbayes/Bayes.f90 +++ b/quasielasticbayes/Bayes.f90 @@ -1,567 +1,567 @@ -C***************************************************** - SUBROUTINE DATIN(IREAD,DTNORM,IDUF) - INCLUDE 'mod_files.f90' - INCLUDE 'mod_data.f90' - COMMON /DATCOM/ XDAT(m_d),DAT(m_d),SIG(m_d),NDAT - REAL DTNORM(m_sp) - IDUF=0 - SMALL=1.0E-10 - DSUM=0.0 - COS2TH=2.0*COS(theta(IREAD)*3.14159265/180.0) - QQ=efix+efix-COS2TH*SQRT(efix*efix) - QAVRG(IREAD)=0.69469*SQRT(QQ) - OPEN(UNIT=53,FILE=lptfile,STATUS='old',FORM='formatted', - 1 access='append') - WRITE(53,*)' ----------------------------------------------------' - write(53,1001)IREAD,theta(IREAD),QAVRG(IREAD) -1001 format(' Group ',i2,' : theta = ',f10.5,' Q = ',f10.5) - WRITE(53,*)' ----------------------------------------------------' - DTNRM=DTNORM(IREAD) - NDAT=ntc-1 - do I=1,NDAT - XDAT(I)=xin(I) - DAT(I)=yin(I)*DTNRM - SIG(I)=ein(I)*DTNRM - IF (SIG(I).GT.SMALL) THEN - SIG(I)=SIG(I)*SIG(I) - DSUM=DSUM+DAT(I) - ELSE - SIG(I)=0.0 - ENDIF - end do - IF (DSUM.LT.SMALL) IDUF=1 - CALL DATIN1 - close(unit=53) - END -C --------------------------------------------------------- - SUBROUTINE DATIN1 - INCLUDE 'res_par.f90' - INCLUDE 'mod_files.f90' - INCLUDE 'options.f90' - COMMON /DATCOM/ XDAT(m_d),DAT(m_d),SIG(m_d),NDAT - COMMON/ModPars/NBIN,IMIN,IMAX,RSCL,BNORM - SMALL=1.0E-20 - if (ABS(RSCL-1.0).GT.0.01)then - OPEN(UNIT=53,FILE=lptfile,STATUS='old',FORM='formatted', - 1 access='append') - WRITE(53,*) ' DATIN1; Data error-bars multiplied by: ',RSCL - close(unit=53) - endif - RSCL=RSCL*RSCL - N=0 - do I=IMIN,IMAX,NBIN - N=N+1 - XXD=0.0 - DD=0.0 - EE=0.0 - K=0 - do J=0,NBIN-1 - XXD=XXD+XDAT(I+J) - IF (SIG(I+J).GT.SMALL) THEN - K=K+1 - DD=DD+DAT(I+J) - EE=EE+SIG(I+J) - ENDIF - end do - XDAT(N)=BNORM*XXD - IF (K.GT.0) THEN - DAT(N)=BNORM*DD - SIG(N)=2.0*FLOAT(K*K)/(EE*RSCL) - ELSE - DAT(N)=0.0 - SIG(N)=0.0 - ENDIF - end do - NDAT=N - END -C ------------------ - FUNCTION FCTNLG(N) - A=0.0 - do I=1,N - A=A+LOG10(FLOAT(I)) - end do - FCTNLG=A - END -C ---------------------------------------------- - SUBROUTINE CXSHFT(RK,DX,TWOPIK,RKEXP,RKEXP2,N) - COMPLEX RK(*),RKEXP(*),RKEXP2(*),XC - REAL TWOPIK(*) - do I=1,N - XX=TWOPIK(I)*DX - XC=CMPLX(COS(XX),SIN(XX)) - RKEXP(I)=RK(I)*XC - end do - CALL VMLTRC(TWOPIK,RKEXP,N,RKEXP2) - CALL VMLTIC(RKEXP2,N,RKEXP2) - END -C --------------------------- - SUBROUTINE VMLTRC(R,C,N,CC) - REAL R(*) - COMPLEX C(*),CC(*) - do I=1,N - A=R(I)*REAL(C(I)) - B=R(I)*AIMAG(C(I)) - CC(I)=CMPLX(A,B) - end do - END -C ------------------------- - SUBROUTINE VMLTIC(C,N,CI) - COMPLEX C(*),CI(*) - do J=1,N - A=REAL(C(J)) - B=AIMAG(C(J)) - CI(J)=CMPLX(-B,A) - end do - END -C --------------------------- - SUBROUTINE MLTMXV(P,OP,N,D) - REAL P(*),OP(N,N),D(*) - do K=1,N - SM=0.0 - do J=1,N - SM=SM+OP(J,K)*P(J) - end do - D(K)=SM - end do - END -C --------------------------------------------- - SUBROUTINE DEGRID(YGRD,YDAT) - INCLUDE 'res_par.f90' - COMMON /DATCOM/ XDAT(m_d),DAT(m_d),SIG(m_d),NDAT - COMMON /DINTRP/ IPDAT(m_d),XPDAT(m_d) - REAL YGRD(*),YDAT(*) - do I=1,NDAT - J=IPDAT(I) - YDAT(I)=YGRD(J)+XPDAT(I)*(YGRD(J+1)-YGRD(J)) - end do - END -C -------------------------------------------- - SUBROUTINE GRADPR(GRAD,RESID,NDAT,NP,SCLVEC) - INCLUDE 'res_par.f90' - COMMON /GRDCOM/ DDDPAR(m_d,m_p),FR2PIK(m_d2,2) - REAL GRAD(*),RESID(*),SCLVEC(*) - do I=1,NP - CALL VRDOTR(RESID,DDDPAR(1,I),NDAT,SM) - GRAD(I)=SCLVEC(I)*SM - end do - END -C -------------------------- - SUBROUTINE VRDOTR(A,B,N,C) - REAL A(*),B(*) - C=0.0 - do I=1,N - C=C+A(I)*B(I) - end do - END -C ------------------------------------------------ - SUBROUTINE HESS0(HESS,NP,RESID,NDAT,DDDPAR,AJ,J) - REAL HESS(NP,*),RESID(*),DDDPAR(*) - SM=0.0 - do I=1,NDAT - SM=SM-RESID(I)*DDDPAR(I) - DDDPAR(I)=-AJ*DDDPAR(I) - end do - HESS(J,J+1)=SM - HESS(J+1,J)=SM - END -C ---------------------------------- - SUBROUTINE ERRBAR(COVAR,NP,SIGPAR) - REAL COVAR(NP,*),SIGPAR(*) - SMALL=1.0E-20 - do I=1,NP - SIGPAR(I)=SQRT(2.0*ABS(COVAR(I,I))+SMALL) - end do - END -C ---------------------------------------- - SUBROUTINE DPINIT - INCLUDE 'res_par.f90' - COMMON /FFTCOM/ FRES(m_d2),FWRK(m_d2),XJ(m_d),TWOPIK(m_d1),NFFT - COMMON /DATCOM/ XDAT(m_d),DAT(m_d),SIG(m_d),NDAT - COMMON /DINTRP/ IPDAT(m_d),XPDAT(m_d) - COMMON /SCLCOM/ BSCL,ASCL,WSCL,SCLVEC(m_p,2),GSCL - I=1 - GSCL=(XJ(NFFT)-XJ(1))/FLOAT(NFFT-1) - do K=1,NDAT - do J=I,NFFT - IF (XJ(J).GE.XDAT(K)) GOTO 1 - end do - 1 IPDAT(K)=J-1 - XPDAT(K)=(XDAT(K)-XJ(J-1))/GSCL - I=J - end do - END -C ----------------- - SUBROUTINE GDINIT - INCLUDE 'res_par.f90' - COMMON /DATCOM/ XDAT(m_d),DAT(m_d),SIG(m_d),NDAT - COMMON /GRDCOM/ DDDPAR(m_d,m_p),FR2PIK(m_d2,2) - X1=XDAT(1) - XN=XDAT(NDAT) - GNORM=1.0/(XN-X1) - do I=1,NDAT - XGNORM=(XDAT(I)-X1)*GNORM - DDDPAR(I,1)=1.0-XGNORM - DDDPAR(I,2)=XGNORM - end do - END -C --------------------------------------------- - SUBROUTINE INVERT(HESS,COVAR,NP,INDX,DETLOG) - INCLUDE 'options.f90' - REAL HESS(NP,*),COVAR(NP,*) - INTEGER INDX(*) - SMALL=1.E-20 - DETLOG=0.0 - if (prog.eq.'s') then - cov=2.0 - else - cov=1.0 - endif - CALL VRFILL(COVAR,0.0,NP*NP) - do I=1,NP - COVAR(I,I)=cov - end do - CALL LUDCMP(HESS,NP,NP,INDX,D) - do I=1,NP - DETLOG=DETLOG+LOG10(ABS(HESS(I,I))+SMALL) - IF (HESS(I,I).LT.0.0) D=-D - end do - do I=1,NP - CALL LUBKSB(HESS,NP,NP,INDX,COVAR(1,I)) - end do - END -C --------------------------------- - SUBROUTINE PRBOUT(P,NP,NQ,POUT) - INCLUDE 'res_par.f90' - INCLUDE 'mod_files.f90' - REAL P(4,m_sp),POUT(4,m_sp) - J=NQ - SM=0.0 - do I=1,NP - SM=SM+10.0**(P(I,J)-P(NP,J)) - end do - PLMAX=MAX(P(3,J),P(4,J)) - PLNORM=LOG10(SM)+P(NP,J) - do I=1,NP - P(I,J)=P(I,J)-PLMAX - end do - do I=1,NP - POUT(I,J)=P(I,J) - end do - END -C ----------------------------------------------- - SUBROUTINE NEWEST(COVAR,GRAD,NP,NFEW,DPAR,FITP) - INCLUDE 'mod_files.f90' - INCLUDE 'options.f90' - REAL COVAR(NP,*),GRAD(*),DPAR(*),FITP(*) - if (prog.eq.'w') then - mp=3 - else - mp=2 - endif - CALL MLTMXV(GRAD,COVAR,NP,DPAR) - IF (NP.EQ.(4+mp*NFEW)) THEN - do I=1,NP - FITP(I)=FITP(I)-DPAR(I) - end do - ELSEIF(NP.EQ.(3+NFEW)) THEN - do I=1,3 - FITP(I)=FITP(I)-DPAR(I) - end do - do I=1,NFEW - J=I+3 - FITP(J+I)=FITP(J+I)-DPAR(J) - end do - ELSE - OPEN(UNIT=53,FILE=lptfile,STATUS='old',FORM='formatted', - 1 access='append') - WRITE(53,*)' NEWEST : Something wrong here folks!' - STOP - close(unit=53) - ENDIF - END -C ------------------------------------------------ - SUBROUTINE HESS1(HESS,NP,SCLVEC,STEPSZ,NFEW) - INCLUDE 'res_par.f90' - INCLUDE 'options.f90' - COMMON /DATCOM/ XDAT(m_d),DAT(m_d),SIG(m_d),NDAT - COMMON /GRDCOM/ DDDPAR(m_d,m_p),FR2PIK(m_d2,2) - REAL HESS(NP,*),SCLVEC(*) - do J=1,NP - do I=J,NP - SM=0.0 - do K=1,NDAT - SM=SM+SIG(K)*DDDPAR(K,I)*DDDPAR(K,J) - end do - HESS(I,J)=(HESS(I,J)+SM)*SCLVEC(I)*SCLVEC(J) - HESS(J,I)=HESS(I,J) - end do - end do - BEEFUP=2.0/(STEPSZ*STEPSZ) - do I=1,NP - HESS(I,I)=HESS(I,I)+BEEFUP - end do - if (prog.eq.'l'.OR.prog.eq.'s') then - IF (NFEW.GT.0) then !option for elastic peak - if (o_el.eq.0) HESS(3,3)=2.0E8 - ENDIF - endif - END -C ------------------------------------------------------------------ - SUBROUTINE PROBN(CNORM,NDAT,DETLOG,NFEW,NMAX,PRBSV) - INCLUDE 'res_par.f90' - INCLUDE 'mod_files.f90' - INCLUDE 'options.f90' - COMMON /SCLCOM/ BSCL,ASCL,WSCL,SCLVEC(m_p,2),GSCL - REAL PRBSV(*) - EXTERNAL FCTNLG - CHISQ=CNORM*FLOAT(NDAT) - DETLOG=DETLOG-FLOAT(NFEW*2)*LOG10(ASCL*WSCL) - CHI2LG=-LOG10(2.7182818)*CHISQ/2.0 - PROBLG=CHI2LG-(0.5*DETLOG)-(FLOAT(NFEW)*LOG10(ASCL*WSCL)) - PROBLG=PROBLG+FCTNLG(NFEW) - PROBLG=PROBLG+(FLOAT(NFEW)*LOG10(4.0*3.141592654)) - OPEN(UNIT=53,FILE=lptfile,STATUS='old',FORM='formatted', - 1 access='append') - if (prog.eq.'l') then - WRITE(53,101) NFEW,PROBLG - 101 FORMAT(' Log10[Prob(',I2,' Quasi-elastic lines|{Data})] = ', - 1 F11.1) - IF (NFEW.LT.NMAX) WRITE(53,*)' -------------------------' - endif - if (prog.eq.'s') then - WRITE(53,102) PROBLG - 102 FORMAT(' Log10[Prob(Stretched exp|{Data})] = ',F11.1) - IF (NFEW.LT.1) WRITE(53,*)' -------------------------' - endif - if (prog.eq.'w') then - WRITE(53,103) PROBLG - 103 FORMAT(' Log10[Prob(Water|{Data})] = ',F11.1) - IF (NFEW.LT.1) WRITE(53,*)' -------------------------' - endif - close(unit=53) - PRBSV(NFEW+1)=PROBLG - END -C ------------------------------------------------------- - SUBROUTINE REFINA(GRAD,HESS,DPAR,NP,DETLOG,INDX,COVAR) - INCLUDE 'res_par.f90' - INCLUDE 'options.f90' - COMMON /FFTCOM/ FRES(m_d2),FWRK(m_d2),XJ(m_d),TWOPIK(m_d1),NFFT - COMMON /DATCOM/ XDAT(m_d),DAT(m_d),SIG(m_d),NDAT - COMMON /DINTRP/ IPDAT(m_d),XPDAT(m_d) - COMMON /FITCOM/ FIT(m_d),RESID(m_d),NFEW,FITP(m_p),EXPF(m_d1,6) - COMMON /SCLCOM/ BSCL,ASCL,WSCL,SCLVEC(m_p,2),GSCL - COMMON /GRDCOM/ DDDPAR(m_d,m_p),FR2PIK(m_d2,2) - REAL GRAD(*),HESS(NP,*),DPAR(*),COVAR(NP,*) - INTEGER INDX(*) - NFT2=NFFT/2+1 - if (prog.eq.'s'.OR.prog.eq.'q') then - CNORM=CBCHI(FITP) - else - CNORM=CCHI(FITP) - endif - CALL VRFILL(HESS,0.0,NP*NP) - CALL VCOPY(FR2PIK,FWRK,NFFT+2) - CALL FOUR2(FWRK,NFFT,1,-1,-1) - CALL DEGRID(FWRK,DDDPAR(1,3)) - do I=1,NFEW - CALL VMLTRC(EXPF(1,I),FR2PIK,NFT2,FWRK) - CALL FOUR2(FWRK,NFFT,1,-1,-1) - CALL DEGRID(FWRK,DDDPAR(1,3+I)) - end do - CALL GRADPR(GRAD,RESID,NDAT,NP,SCLVEC) - CALL HESS1(HESS,NP,SCLVEC,0.3,NFEW) - if (prog.eq.'s'.OR.prog.eq.'q') then - CALL MTXINV(HESS,COVAR,NP,INDX,DETLOG) - else - CALL INVERT(HESS,COVAR,NP,INDX,DETLOG) - endif - CALL NEWEST(COVAR,GRAD,NP,NFEW,DPAR,FITP) - if (prog.eq.'s'.OR.prog.eq.'q') then - CNORM=CBCHI(FITP) - else - CNORM=CCHI(FITP) - endif - CALL GRADPR(GRAD,RESID,NDAT,NP,SCLVEC) - CALL NEWEST(COVAR,GRAD,NP,NFEW,DPAR,FITP) - END -C --------------------------------------------- - SUBROUTINE MTXINV(HESS,COVAR,NP,INDX,DETLOG) - REAL HESS(NP,*),COVAR(NP,*) - INTEGER INDX(*) - SMALL=1.E-20 - DETLOG=0.0 - CALL VRFILL(COVAR,0.0,NP*NP) - do I=1,NP - COVAR(I,I)=1.0 - end do - CALL LUDCMP(HESS,NP,NP,INDX,D) - do I=1,NP - DETLOG=DETLOG+LOG10(ABS(HESS(I,I))+SMALL) - IF (HESS(I,I).LT.0.0) D=-D - end do - do I=1,NP - CALL LUBKSB(HESS,NP,NP,INDX,COVAR(1,I)) - end do - END -C --------------------------------------------- - FUNCTION CBCHI(V) - INCLUDE 'res_par.f90' - INCLUDE 'options.f90' - COMMON /FFTCOM/ FRES(m_d2),FWRK(m_d2),XJ(m_d),TWOPIK(m_d1),NFFT - COMMON /DATCOM/ XDAT(m_d),DAT(m_d),SIG(m_d),NDAT - COMMON /DINTRP/ IPDAT(m_d),XPDAT(m_d) - COMMON /FITCOM/ FIT(m_d),RESID(m_d),NFEW,FITP(m_p),EXPF(m_d1,6) - COMMON /SCLCOM/ BSCL,ASCL,WSCL,SCLVEC(m_p,2),GSCL - COMMON /GRDCOM/ DDDPAR(m_d,m_p),FR2PIK(m_d2,2) - COMMON /WRKCOM/ WORK(m_d2,2) - COMMON /STEXP/ BETEXP,XBETA(101),BETCHI(101),NBTOT - REAL V(*) - PI=3.141592654 - VSMALL=0.0001 - CBCHI=1.0E+10 - CHI=0.0 - B1=BSCL*V(1) - B2=BSCL*V(2) - A0=ASCL*V(3) - DELTAX=V(4) - NFT2=NFFT/2+1 - CALL CXSHFT(FRES,DELTAX,TWOPIK,FR2PIK,FR2PIK(1,2),NFT2) - CALL VRFILL(WORK,A0,NFT2) - PI2=2.0*PI - do J=1,NFEW - J3=J+3 - AJ=ASCL*V(3+J+J) - IF (V(4+J+J).LT.VSMALL) RETURN - SPNORM=WSCL*V(4+J+J)/(GSCL*PI2) - EXPF(1,J)=1.0 - EXPF(1,J3)=0.0 - WORK(1,1)=WORK(1,1)+AJ - do I=2,NFT2 - SIGIJ=SPNORM*TWOPIK(I) - EXPIJ=EXP(-PI2*SIGIJ**BETEXP) - EXPF(I,J)=EXPIJ - EXPF(I,J3)=SIGIJ - WORK(I,1)=WORK(I,1)+AJ*EXPIJ - end do - end do - CALL VMLTRC(WORK,FR2PIK,NFT2,FWRK) - CALL FOUR2(FWRK,NFFT,1,-1,-1) - CALL DEGRID(FWRK,FIT) - X1=XDAT(1) - if(o_bgd.eq.2) BNRM=(B2-B1)/(XDAT(NDAT)-X1) -C avoid conflict BNORM with ModPars - do I=1,NDAT - FIT(I)=FIT(I)+B1 - if(o_bgd.eq.2) FIT(I)=FIT(I)+BNRM*(XDAT(I)-X1) - DIF=FIT(I)-DAT(I) - RESID(I)=DIF*SIG(I) - CHI=CHI+DIF*RESID(I) - end do - CBCHI=CHI/(2.0*FLOAT(NDAT)) - END -C --------------------------------------------- - SUBROUTINE PRINIT(FITP,NQMAX,NFEW,IXSCAL) - INCLUDE 'mod_files.f90' - INCLUDE 'mod_data.f90' - INCLUDE 'options.f90' - COMMON /DATCOM/ XDAT(m_d),DAT(m_d),SIG(m_d),NDAT - COMMON /SCLCOM/ BSCL,ASCL,WSCL,SCLVEC(m_p,2),GSCL - REAL FITP(m_p) - if (IXSCAL.gt.1) goto 3 - SMALL=1.0E-10 - SM=0.0 - NSUM=0 - do I=1,20 - IF (SIG(I).GE.SMALL) THEN - NSUM=NSUM+1 - SM=SM+ABS(DAT(I)) - ENDIF - IF (NSUM.GE.10) GOTO 1 - end do - 1 BSCL1=SM/FLOAT(NSUM) - SM=0.0 - NSUM=0 - do I=1,20 - IF (SIG(NDAT-I+1).GE.SMALL) THEN - NSUM=NSUM+1 - SM=SM+ABS(DAT(NDAT-I+1)) - ENDIF - IF (NSUM.GE.10) GOTO 2 - end do - 2 BSCL=SM/FLOAT(NSUM) - IF (BSCL1.LT.BSCL) BSCL=BSCL1 - BSCL=BSCL/2.0 - if(o_bgd.eq.0)BSCL=0.0 !zero background - AXMAX=ABS(XDAT(NDAT)) - IF (ABS(XDAT(1)).GT.AXMAX) AXMAX=ABS(XDAT(1)) - WSCL=AXMAX/3.0 - MK=0 - SM=0.0 - SUMSIG=0.0 - do I=1,NDAT-1 - IF (SIG(I).GE.SMALL) THEN - MK=MK+1 - SM=SM+(DAT(I)-BSCL)*(XDAT(I+1)-XDAT(I)) - SUMSIG=SUMSIG+SQRT((2.0/SIG(I))) - ENDIF - end do - ASCL=SM*FLOAT(NDAT)/FLOAT(MK) - SUMSIG=SUMSIG/FLOAT(MK) - SUMSIG=(XDAT(NDAT)-XDAT(1))*SUMSIG/SQRT(FLOAT(MK)) - OPEN(UNIT=53,FILE=lptfile,STATUS='old',FORM='formatted', - 1 access='append') - IF (ASCL.LT.SUMSIG) THEN - write(53,1001) -1001 format(' qlm> *** Estimate of Amax is being set to lower bound!') - write(53,1002)ASCL,SUMSIG -1002 format(' ( ',e14.7,' --> ',e14.7,' )') - ASCL=SUMSIG - ENDIF - WRITE(53,*)' ----------------------------------------------------' - close(unit=53) - ASCL=ASCL/GSCL - FITP(1)=1.0 - FITP(2)=1.0 - FITP(3)=0.5 - do I=1,2 - SCLVEC(I,1)=BSCL - SCLVEC(I,2)=BSCL - end do - SCLVEC(3,1)=ASCL - SCLVEC(3,2)=ASCL - 3 SCLVEC(4,2)=1.0 - if(prog.eq.'w')then - SCLVEC(4,1)=ASCL - SCLVEC(5,2)=ASCL - SCLVEC(6,2)=WSCL/GSCL - SCLVEC(7,2)=WSCL/GSCL - else - do I=1,NQMAX - SCLVEC(3+I,1)=ASCL - SCLVEC(3+I+I,2)=ASCL - SCLVEC(4+I+I,2)=WSCL/GSCL - end do - endif - NFEW=0 - END -C --------------------------------------------- - SUBROUTINE FileInit(Nu,ISP) - INCLUDE 'mod_files.f90' - INCLUDE 'mod_data.f90' - COMMON /SCLCOM/ BSCL,ASCL,WSCL,SCLVEC(m_p,2),GSCL - OPEN(UNIT=1,FILE=fileout1,STATUS='old',FORM='formatted', - 1 access='append') - if (Nu.ge.2) then - OPEN(UNIT=2,FILE=fileout2,STATUS='old',FORM='formatted', - 1 access='append') - if (Nu.eq.3) then - OPEN(UNIT=3,FILE=fileout3,STATUS='old',FORM='formatted', - 1 access='append') - endif - endif - do n=1,Nu - write(n,*) QAVRG(ISP),ASCL,WSCL,BSCL,GSCL - close(unit=n) - end do - END +!***************************************************** +SUBROUTINE DATIN(IREAD,DTNORM,IDUF) +INCLUDE 'mod_files.f90' +INCLUDE 'mod_data.f90' +COMMON /DATCOM/ XDAT(m_d),DAT(m_d),SIG(m_d),NDAT +REAL DTNORM(m_sp) +IDUF=0 +SMALL=1.0E-10 +DSUM=0.0 +COS2TH=2.0*COS(theta(IREAD)*3.14159265/180.0) +QQ=efix+efix-COS2TH*SQRT(efix*efix) +QAVRG(IREAD)=0.69469*SQRT(QQ) +OPEN(UNIT=53,FILE=lptfile,STATUS='old',FORM='formatted', & + access='append') +WRITE(53,*)' ----------------------------------------------------' +write(53,1001)IREAD,theta(IREAD),QAVRG(IREAD) +1001 format(' Group ',i2,' : theta = ',f10.5,' Q = ',f10.5) +WRITE(53,*)' ----------------------------------------------------' +DTNRM=DTNORM(IREAD) +NDAT=ntc-1 +do I=1,NDAT + XDAT(I)=xin(I) + DAT(I)=yin(I)*DTNRM + SIG(I)=ein(I)*DTNRM + IF (SIG(I).GT.SMALL) THEN + SIG(I)=SIG(I)*SIG(I) + DSUM=DSUM+DAT(I) + ELSE + SIG(I)=0.0 + ENDIF +end do +IF (DSUM.LT.SMALL) IDUF=1 +CALL DATIN1 +close(unit=53) +END +! --------------------------------------------------------- +SUBROUTINE DATIN1 +INCLUDE 'res_par.f90' +INCLUDE 'mod_files.f90' +INCLUDE 'options.f90' +COMMON /DATCOM/ XDAT(m_d),DAT(m_d),SIG(m_d),NDAT +COMMON/ModPars/NBIN,IMIN,IMAX,RSCL,BNORM +SMALL=1.0E-20 +if (ABS(RSCL-1.0).GT.0.01)then + OPEN(UNIT=53,FILE=lptfile,STATUS='old',FORM='formatted', & + access='append') + WRITE(53,*) ' DATIN1; Data error-bars multiplied by: ',RSCL + close(unit=53) +endif +RSCL=RSCL*RSCL +N=0 +do I=IMIN,IMAX,NBIN + N=N+1 + XXD=0.0 + DD=0.0 + EE=0.0 + K=0 + do J=0,NBIN-1 + XXD=XXD+XDAT(I+J) + IF (SIG(I+J).GT.SMALL) THEN + K=K+1 + DD=DD+DAT(I+J) + EE=EE+SIG(I+J) + ENDIF + end do + XDAT(N)=BNORM*XXD + IF (K.GT.0) THEN + DAT(N)=BNORM*DD + SIG(N)=2.0*FLOAT(K*K)/(EE*RSCL) + ELSE + DAT(N)=0.0 + SIG(N)=0.0 + ENDIF +end do +NDAT=N +END +! ------------------ +FUNCTION FCTNLG(N) +A=0.0 +do I=1,N + A=A+LOG10(FLOAT(I)) +end do +FCTNLG=A +END +! ---------------------------------------------- +SUBROUTINE CXSHFT(RK,DX,TWOPIK,RKEXP,RKEXP2,N) +COMPLEX RK(*),RKEXP(*),RKEXP2(*),XC +REAL TWOPIK(*) +do I=1,N + XX=TWOPIK(I)*DX + XC=CMPLX(COS(XX),SIN(XX)) + RKEXP(I)=RK(I)*XC +end do +CALL VMLTRC(TWOPIK,RKEXP,N,RKEXP2) +CALL VMLTIC(RKEXP2,N,RKEXP2) +END +! --------------------------- +SUBROUTINE VMLTRC(R,C,N,CC) +REAL R(*) +COMPLEX C(*),CC(*) +do I=1,N + A=R(I)*REAL(C(I)) + B=R(I)*AIMAG(C(I)) + CC(I)=CMPLX(A,B) +end do +END +! ------------------------- +SUBROUTINE VMLTIC(C,N,CI) +COMPLEX C(*),CI(*) +do J=1,N + A=REAL(C(J)) + B=AIMAG(C(J)) + CI(J)=CMPLX(-B,A) +end do +END +! --------------------------- +SUBROUTINE MLTMXV(P,OP,N,D) +REAL P(*),OP(N,N),D(*) +do K=1,N + SM=0.0 + do J=1,N + SM=SM+OP(J,K)*P(J) + end do + D(K)=SM +end do +END +! --------------------------------------------- +SUBROUTINE DEGRID(YGRD,YDAT) +INCLUDE 'res_par.f90' +COMMON /DATCOM/ XDAT(m_d),DAT(m_d),SIG(m_d),NDAT +COMMON /DINTRP/ IPDAT(m_d),XPDAT(m_d) +REAL YGRD(*),YDAT(*) +do I=1,NDAT + J=IPDAT(I) + YDAT(I)=YGRD(J)+XPDAT(I)*(YGRD(J+1)-YGRD(J)) +end do +END +! -------------------------------------------- +SUBROUTINE GRADPR(GRAD,RESID,NDAT,NP,SCLVEC) +INCLUDE 'res_par.f90' +COMMON /GRDCOM/ DDDPAR(m_d,m_p),FR2PIK(m_d2,2) +REAL GRAD(*),RESID(*),SCLVEC(*) +do I=1,NP + CALL VRDOTR(RESID,DDDPAR(1,I),NDAT,SM) + GRAD(I)=SCLVEC(I)*SM +end do +END +! -------------------------- +SUBROUTINE VRDOTR(A,B,N,C) +REAL A(*),B(*) +C=0.0 +do I=1,N + C=C+A(I)*B(I) +end do +END +! ------------------------------------------------ +SUBROUTINE HESS0(HESS,NP,RESID,NDAT,DDDPAR,AJ,J) +REAL HESS(NP,*),RESID(*),DDDPAR(*) +SM=0.0 +do I=1,NDAT + SM=SM-RESID(I)*DDDPAR(I) + DDDPAR(I)=-AJ*DDDPAR(I) +end do +HESS(J,J+1)=SM +HESS(J+1,J)=SM +END +! ---------------------------------- +SUBROUTINE ERRBAR(COVAR,NP,SIGPAR) +REAL COVAR(NP,*),SIGPAR(*) +SMALL=1.0E-20 +do I=1,NP + SIGPAR(I)=SQRT(2.0*ABS(COVAR(I,I))+SMALL) +end do +END +! ---------------------------------------- +SUBROUTINE DPINIT +INCLUDE 'res_par.f90' +COMMON /FFTCOM/ FRES(m_d2),FWRK(m_d2),XJ(m_d),TWOPIK(m_d1),NFFT +COMMON /DATCOM/ XDAT(m_d),DAT(m_d),SIG(m_d),NDAT +COMMON /DINTRP/ IPDAT(m_d),XPDAT(m_d) +COMMON /SCLCOM/ BSCL,ASCL,WSCL,SCLVEC(m_p,2),GSCL +I=1 +GSCL=(XJ(NFFT)-XJ(1))/FLOAT(NFFT-1) +do K=1,NDAT + do J=I,NFFT + IF (XJ(J).GE.XDAT(K)) GOTO 1 + end do +1 IPDAT(K)=J-1 + XPDAT(K)=(XDAT(K)-XJ(J-1))/GSCL + I=J +end do +END +! ----------------- +SUBROUTINE GDINIT +INCLUDE 'res_par.f90' +COMMON /DATCOM/ XDAT(m_d),DAT(m_d),SIG(m_d),NDAT +COMMON /GRDCOM/ DDDPAR(m_d,m_p),FR2PIK(m_d2,2) +X1=XDAT(1) +XN=XDAT(NDAT) +GNORM=1.0/(XN-X1) +do I=1,NDAT + XGNORM=(XDAT(I)-X1)*GNORM + DDDPAR(I,1)=1.0-XGNORM + DDDPAR(I,2)=XGNORM +end do +END +! --------------------------------------------- +SUBROUTINE INVERT(HESS,COVAR,NP,INDX,DETLOG) +INCLUDE 'options.f90' +REAL HESS(NP,*),COVAR(NP,*) +INTEGER INDX(*) +SMALL=1.E-20 +DETLOG=0.0 +if (prog.eq.'s') then + cov=2.0 +else + cov=1.0 +endif +CALL VRFILL(COVAR,0.0,NP*NP) +do I=1,NP + COVAR(I,I)=cov +end do +CALL LUDCMP(HESS,NP,NP,INDX,D) +do I=1,NP + DETLOG=DETLOG+LOG10(ABS(HESS(I,I))+SMALL) + IF (HESS(I,I).LT.0.0) D=-D +end do +do I=1,NP +CALL LUBKSB(HESS,NP,NP,INDX,COVAR(1,I)) +end do +END +! --------------------------------- +SUBROUTINE PRBOUT(P,NP,NQ,POUT) +INCLUDE 'res_par.f90' +INCLUDE 'mod_files.f90' +REAL P(4,m_sp),POUT(4,m_sp) +J=NQ +SM=0.0 +do I=1,NP + SM=SM+10.0**(P(I,J)-P(NP,J)) +end do +PLMAX=MAX(P(3,J),P(4,J)) +PLNORM=LOG10(SM)+P(NP,J) +do I=1,NP + P(I,J)=P(I,J)-PLMAX +end do +do I=1,NP + POUT(I,J)=P(I,J) + end do +END +! ----------------------------------------------- +SUBROUTINE NEWEST(COVAR,GRAD,NP,NFEW,DPAR,FITP) +INCLUDE 'mod_files.f90' +INCLUDE 'options.f90' +REAL COVAR(NP,*),GRAD(*),DPAR(*),FITP(*) +if (prog.eq.'w') then + mp=3 +else + mp=2 +endif +CALL MLTMXV(GRAD,COVAR,NP,DPAR) +IF (NP.EQ.(4+mp*NFEW)) THEN + do I=1,NP + FITP(I)=FITP(I)-DPAR(I) + end do +ELSEIF(NP.EQ.(3+NFEW)) THEN + do I=1,3 + FITP(I)=FITP(I)-DPAR(I) + end do + do I=1,NFEW + J=I+3 + FITP(J+I)=FITP(J+I)-DPAR(J) + end do +ELSE + OPEN(UNIT=53,FILE=lptfile,STATUS='old',FORM='formatted', & + access='append') + WRITE(53,*)' NEWEST : Something wrong here folks!' + STOP + close(unit=53) +ENDIF +END +! ------------------------------------------------ +SUBROUTINE HESS1(HESS,NP,SCLVEC,STEPSZ,NFEW) +INCLUDE 'res_par.f90' +INCLUDE 'options.f90' +COMMON /DATCOM/ XDAT(m_d),DAT(m_d),SIG(m_d),NDAT +COMMON /GRDCOM/ DDDPAR(m_d,m_p),FR2PIK(m_d2,2) +REAL HESS(NP,*),SCLVEC(*) +do J=1,NP + do I=J,NP + SM=0.0 + do K=1,NDAT + SM=SM+SIG(K)*DDDPAR(K,I)*DDDPAR(K,J) + end do + HESS(I,J)=(HESS(I,J)+SM)*SCLVEC(I)*SCLVEC(J) + HESS(J,I)=HESS(I,J) + end do +end do +BEEFUP=2.0/(STEPSZ*STEPSZ) +do I=1,NP + HESS(I,I)=HESS(I,I)+BEEFUP +end do +if (prog.eq.'l'.OR.prog.eq.'s') then + IF (NFEW.GT.0) then !option for elastic peak + if (o_el.eq.0) HESS(3,3)=2.0E8 + ENDIF +endif +END +! ------------------------------------------------------------------ +SUBROUTINE PROBN(CNORM,NDAT,DETLOG,NFEW,NMAX,PRBSV) +INCLUDE 'res_par.f90' +INCLUDE 'mod_files.f90' +INCLUDE 'options.f90' +COMMON /SCLCOM/ BSCL,ASCL,WSCL,SCLVEC(m_p,2),GSCL +REAL PRBSV(*) +EXTERNAL FCTNLG +CHISQ=CNORM*FLOAT(NDAT) +DETLOG=DETLOG-FLOAT(NFEW*2)*LOG10(ASCL*WSCL) +CHI2LG=-LOG10(2.7182818)*CHISQ/2.0 +PROBLG=CHI2LG-(0.5*DETLOG)-(FLOAT(NFEW)*LOG10(ASCL*WSCL)) +PROBLG=PROBLG+FCTNLG(NFEW) +PROBLG=PROBLG+(FLOAT(NFEW)*LOG10(4.0*3.141592654)) +OPEN(UNIT=53,FILE=lptfile,STATUS='old',FORM='formatted', & + access='append') +if (prog.eq.'l') then + WRITE(53,101) NFEW,PROBLG +101 FORMAT(' Log10[Prob(',I2,' Quasi-elastic lines|{Data})] = ', & + F11.1) + IF (NFEW.LT.NMAX) WRITE(53,*)' -------------------------' +endif +if (prog.eq.'s') then + WRITE(53,102) PROBLG +102 FORMAT(' Log10[Prob(Stretched exp|{Data})] = ',F11.1) + IF (NFEW.LT.1) WRITE(53,*)' -------------------------' +endif +if (prog.eq.'w') then + WRITE(53,103) PROBLG +103 FORMAT(' Log10[Prob(Water|{Data})] = ',F11.1) + IF (NFEW.LT.1) WRITE(53,*)' -------------------------' +endif +close(unit=53) +PRBSV(NFEW+1)=PROBLG +END +! ------------------------------------------------------- +SUBROUTINE REFINA(GRAD,HESS,DPAR,NP,DETLOG,INDX,COVAR) +INCLUDE 'res_par.f90' +INCLUDE 'options.f90' +COMMON /FFTCOM/ FRES(m_d2),FWRK(m_d2),XJ(m_d),TWOPIK(m_d1),NFFT +COMMON /DATCOM/ XDAT(m_d),DAT(m_d),SIG(m_d),NDAT +COMMON /DINTRP/ IPDAT(m_d),XPDAT(m_d) +COMMON /FITCOM/ FIT(m_d),RESID(m_d),NFEW,FITP(m_p),EXPF(m_d1,6) +COMMON /SCLCOM/ BSCL,ASCL,WSCL,SCLVEC(m_p,2),GSCL +COMMON /GRDCOM/ DDDPAR(m_d,m_p),FR2PIK(m_d2,2) +REAL GRAD(*),HESS(NP,*),DPAR(*),COVAR(NP,*) +INTEGER INDX(*) +NFT2=NFFT/2+1 +if (prog.eq.'s'.OR.prog.eq.'q') then + CNORM=CBCHI(FITP) +else + CNORM=CCHI(FITP) +endif +CALL VRFILL(HESS,0.0,NP*NP) +CALL VCOPY(FR2PIK,FWRK,NFFT+2) +CALL FOUR2(FWRK,NFFT,1,-1,-1) +CALL DEGRID(FWRK,DDDPAR(1,3)) +do I=1,NFEW + CALL VMLTRC(EXPF(1,I),FR2PIK,NFT2,FWRK) + CALL FOUR2(FWRK,NFFT,1,-1,-1) + CALL DEGRID(FWRK,DDDPAR(1,3+I)) +end do +CALL GRADPR(GRAD,RESID,NDAT,NP,SCLVEC) +CALL HESS1(HESS,NP,SCLVEC,0.3,NFEW) +if (prog.eq.'s'.OR.prog.eq.'q') then + CALL MTXINV(HESS,COVAR,NP,INDX,DETLOG) +else + CALL INVERT(HESS,COVAR,NP,INDX,DETLOG) +endif +CALL NEWEST(COVAR,GRAD,NP,NFEW,DPAR,FITP) +if (prog.eq.'s'.OR.prog.eq.'q') then + CNORM=CBCHI(FITP) +else + CNORM=CCHI(FITP) +endif +CALL GRADPR(GRAD,RESID,NDAT,NP,SCLVEC) +CALL NEWEST(COVAR,GRAD,NP,NFEW,DPAR,FITP) +END +! --------------------------------------------- +SUBROUTINE MTXINV(HESS,COVAR,NP,INDX,DETLOG) +REAL HESS(NP,*),COVAR(NP,*) +INTEGER INDX(*) +SMALL=1.E-20 +DETLOG=0.0 +CALL VRFILL(COVAR,0.0,NP*NP) +do I=1,NP + COVAR(I,I)=1.0 +end do +CALL LUDCMP(HESS,NP,NP,INDX,D) +do I=1,NP + DETLOG=DETLOG+LOG10(ABS(HESS(I,I))+SMALL) + IF (HESS(I,I).LT.0.0) D=-D +end do +do I=1,NP + CALL LUBKSB(HESS,NP,NP,INDX,COVAR(1,I)) +end do +END +! --------------------------------------------- +FUNCTION CBCHI(V) +INCLUDE 'res_par.f90' +INCLUDE 'options.f90' +COMMON /FFTCOM/ FRES(m_d2),FWRK(m_d2),XJ(m_d),TWOPIK(m_d1),NFFT +COMMON /DATCOM/ XDAT(m_d),DAT(m_d),SIG(m_d),NDAT +COMMON /DINTRP/ IPDAT(m_d),XPDAT(m_d) +COMMON /FITCOM/ FIT(m_d),RESID(m_d),NFEW,FITP(m_p),EXPF(m_d1,6) +COMMON /SCLCOM/ BSCL,ASCL,WSCL,SCLVEC(m_p,2),GSCL +COMMON /GRDCOM/ DDDPAR(m_d,m_p),FR2PIK(m_d2,2) +COMMON /WRKCOM/ WORK(m_d2,2) +COMMON /STEXP/ BETEXP,XBETA(101),BETCHI(101),NBTOT +REAL V(*) +PI=3.141592654 +VSMALL=0.0001 +CBCHI=1.0E+10 +CHI=0.0 +B1=BSCL*V(1) +B2=BSCL*V(2) +A0=ASCL*V(3) +DELTAX=V(4) +NFT2=NFFT/2+1 +CALL CXSHFT(FRES,DELTAX,TWOPIK,FR2PIK,FR2PIK(1,2),NFT2) +CALL VRFILL(WORK,A0,NFT2) +PI2=2.0*PI +do J=1,NFEW + J3=J+3 + AJ=ASCL*V(3+J+J) + IF (V(4+J+J).LT.VSMALL) RETURN + SPNORM=WSCL*V(4+J+J)/(GSCL*PI2) + EXPF(1,J)=1.0 + EXPF(1,J3)=0.0 + WORK(1,1)=WORK(1,1)+AJ + do I=2,NFT2 + SIGIJ=SPNORM*TWOPIK(I) + EXPIJ=EXP(-PI2*SIGIJ**BETEXP) + EXPF(I,J)=EXPIJ + EXPF(I,J3)=SIGIJ + WORK(I,1)=WORK(I,1)+AJ*EXPIJ + end do +end do +CALL VMLTRC(WORK,FR2PIK,NFT2,FWRK) +CALL FOUR2(FWRK,NFFT,1,-1,-1) +CALL DEGRID(FWRK,FIT) +X1=XDAT(1) +if(o_bgd.eq.2) BNRM=(B2-B1)/(XDAT(NDAT)-X1) +! avoid conflict BNORM with ModPars +do I=1,NDAT + FIT(I)=FIT(I)+B1 + if(o_bgd.eq.2) FIT(I)=FIT(I)+BNRM*(XDAT(I)-X1) + DIF=FIT(I)-DAT(I) + RESID(I)=DIF*SIG(I) + CHI=CHI+DIF*RESID(I) +end do +CBCHI=CHI/(2.0*FLOAT(NDAT)) +END +! --------------------------------------------- +SUBROUTINE PRINIT(FITP,NQMAX,NFEW,IXSCAL) +INCLUDE 'mod_files.f90' +INCLUDE 'mod_data.f90' +INCLUDE 'options.f90' +COMMON /DATCOM/ XDAT(m_d),DAT(m_d),SIG(m_d),NDAT +COMMON /SCLCOM/ BSCL,ASCL,WSCL,SCLVEC(m_p,2),GSCL +REAL FITP(m_p) +if (IXSCAL.gt.1) goto 3 +SMALL=1.0E-10 +SM=0.0 +NSUM=0 +do I=1,20 + IF (SIG(I).GE.SMALL) THEN + NSUM=NSUM+1 + SM=SM+ABS(DAT(I)) + ENDIF + IF (NSUM.GE.10) GOTO 1 +end do +1 BSCL1=SM/FLOAT(NSUM) +SM=0.0 +NSUM=0 +do I=1,20 + IF (SIG(NDAT-I+1).GE.SMALL) THEN + NSUM=NSUM+1 + SM=SM+ABS(DAT(NDAT-I+1)) + ENDIF + IF (NSUM.GE.10) GOTO 2 +end do +2 BSCL=SM/FLOAT(NSUM) +IF (BSCL1.LT.BSCL) BSCL=BSCL1 +BSCL=BSCL/2.0 +if(o_bgd.eq.0)BSCL=0.0 !zero background +AXMAX=ABS(XDAT(NDAT)) +IF (ABS(XDAT(1)).GT.AXMAX) AXMAX=ABS(XDAT(1)) +WSCL=AXMAX/3.0 +MK=0 +SM=0.0 +SUMSIG=0.0 +do I=1,NDAT-1 + IF (SIG(I).GE.SMALL) THEN + MK=MK+1 + SM=SM+(DAT(I)-BSCL)*(XDAT(I+1)-XDAT(I)) + SUMSIG=SUMSIG+SQRT((2.0/SIG(I))) + ENDIF +end do +ASCL=SM*FLOAT(NDAT)/FLOAT(MK) +SUMSIG=SUMSIG/FLOAT(MK) +SUMSIG=(XDAT(NDAT)-XDAT(1))*SUMSIG/SQRT(FLOAT(MK)) +OPEN(UNIT=53,FILE=lptfile,STATUS='old',FORM='formatted', & + access='append') +IF (ASCL.LT.SUMSIG) THEN + write(53,1001) +1001 format(' qlm> *** Estimate of Amax is being set to lower bound!') + write(53,1002)ASCL,SUMSIG +1002 format(' ( ',e14.7,' --> ',e14.7,' )') + ASCL=SUMSIG +ENDIF +WRITE(53,*)' ----------------------------------------------------' +close(unit=53) +ASCL=ASCL/GSCL +FITP(1)=1.0 +FITP(2)=1.0 +FITP(3)=0.5 +do I=1,2 + SCLVEC(I,1)=BSCL + SCLVEC(I,2)=BSCL +end do +SCLVEC(3,1)=ASCL +SCLVEC(3,2)=ASCL +3 SCLVEC(4,2)=1.0 +if(prog.eq.'w')then + SCLVEC(4,1)=ASCL + SCLVEC(5,2)=ASCL + SCLVEC(6,2)=WSCL/GSCL + SCLVEC(7,2)=WSCL/GSCL +else + do I=1,NQMAX + SCLVEC(3+I,1)=ASCL + SCLVEC(3+I+I,2)=ASCL + SCLVEC(4+I+I,2)=WSCL/GSCL + end do +endif +NFEW=0 +END +! --------------------------------------------- +SUBROUTINE FileInit(Nu,ISP) +INCLUDE 'mod_files.f90' +INCLUDE 'mod_data.f90' +COMMON /SCLCOM/ BSCL,ASCL,WSCL,SCLVEC(m_p,2),GSCL +OPEN(UNIT=1,FILE=fileout1,STATUS='old',FORM='formatted', & + access='append') +if (Nu.ge.2) then + OPEN(UNIT=2,FILE=fileout2,STATUS='old',FORM='formatted', & + access='append') + if (Nu.eq.3) then + OPEN(UNIT=3,FILE=fileout3,STATUS='old',FORM='formatted', & + access='append') + endif +endif +do n=1,Nu + write(n,*) QAVRG(ISP),ASCL,WSCL,BSCL,GSCL + close(unit=n) +end do +END diff --git a/quasielasticbayes/BlrRes.f90 b/quasielasticbayes/BlrRes.f90 index f0ae256..6c826ac 100644 --- a/quasielasticbayes/BlrRes.f90 +++ b/quasielasticbayes/BlrRes.f90 @@ -1,111 +1,111 @@ -C************************************************* - SUBROUTINE BLRINT(XB,YB,NB,XSCALE,LSTART) - INCLUDE 'res_par.f90' - INCLUDE 'mod_files.f90' - COMMON /FFTCOM/ FRES(m_d2),FWRK(m_d2),XJ(m_d),TWOPIK(m_d1),NFFT - COMMON /DATCOM/ XDAT(m_d),DAT(m_d),SIG(m_d),NDAT - REAL XB(m_d),YB(m_d) - LOGICAL LSTART - NFFT=m_d - IF (.NOT .LSTART) THEN - YMAX=0.0 - do I=1,NFFT - IF (YB(I).GT.YMAX) YMAX=YB(I) - end do - ELSE - OPEN(UNIT=53,FILE=lptfile,STATUS='old',FORM='formatted', - 1 access='append') - WRITE(53,*)' Resolution function X-axis multiplied by: ',XSCALE - close(unit=53) - ENDIF - CALL XGINIT(XB,YB,NB,YMAX,XSCALE) - DXJ=XJ(2)-XJ(1) - DXB=XB(2)-XB(1) - do I=1,NB - IF (XB(I).GE.0.0) GOTO 4 - end do - 4 IR0=I - XB0=XB(IR0) - DXB=DXB*XSCALE - XBMIN=XB(1)*XSCALE+DXB - XBMAX=XB(NB)*XSCALE-DXB - TWOPIN=2.0*3.141592654/FLOAT(NFFT) - CALL VRFILL(FRES,0.0,NFFT) - X=0.0 - CALL RINTRP(X,YB,IR0,XB0,DXB,FRES(1)) - SM=FRES(1) - do I=1,NFFT/2 - X=X+DXJ - IF (X.LT.XBMAX) CALL RINTRP(X,YB,IR0,XB0,DXB,FRES(I+1)) - IF (-X.GT.XBMIN) CALL RINTRP(-X,YB,IR0,XB0,DXB,FRES(NFFT+1-I)) - SM=SM+FRES(I+1)+FRES(NFFT+1-I) - TWOPIK(I)=TWOPIN*FLOAT(I-1) - end do - TWOPIK(NFFT/2+1)=TWOPIN*FLOAT(NFFT/2) - BNORM=1.0/(SM*FLOAT(NFFT)) - do I=1,NFFT - FRES(I)=BNORM*FRES(I) - end do - CALL FOUR2(FRES,NFFT,1,1,0) - do I=3,NFFT,4 - FRES(I)=-FRES(I) - FRES(I+1)=-FRES(I+1) - end do - IF (.NOT. LSTART) THEN - CALL VCOPY(FRES,FWRK,NFFT+2) - CALL FOUR2(FWRK,NFFT,1,-1,-1) - ENDIF - END -C --------------------------------------------------------- - SUBROUTINE XGINIT(XB,YB,NB,YMAX,XSCALE) - INCLUDE 'res_par.f90' - INCLUDE 'mod_files.f90' - COMMON /FFTCOM/ FRES(m_d2),FWRK(m_d2),XJ(m_d),TWOPIK(m_d1),NFFT - COMMON /DATCOM/ XDAT(m_d),DAT(m_d),SIG(m_d),NDAT - REAL XB(*),YB(*) - Y0=YMAX/10.0 - do I=1,NB - IF (YB(I).GE.Y0) GOTO 1 - end do - 1 IMIN=I - do I=NB,1,-1 - IF (YB(I).GE.Y0) GOTO 2 - end do - 2 IMAX=I - BWIDTH=(XB(IMAX)-XB(IMIN))*XSCALE - DXJ=BWIDTH/20.0 - AXMAX=ABS(XDAT(1)) - IF (ABS(XDAT(NDAT)).GT.AXMAX) AXMAX=ABS(XDAT(NDAT)) - XNDMAX=500.0 - IF (NDAT.GT.INT(XNDMAX)) XNDMAX=FLOAT(NDAT) - DXDAT=2.0*AXMAX/XNDMAX - IF (DXDAT.GT.DXJ) DXJ=DXDAT - XNGD=(2.0*AXMAX)/DXJ - NGD=NINT(LOG(XNGD-1.0)/LOG(2.0))+1 - NGD=2**NGD - IF (NGD.GT.m_d) then - OPEN(UNIT=53,FILE=lptfile,STATUS='old',FORM='formatted', - 1 access='append') - WRITE(53,*)' ERROR in XGINIT : too many points' - close(unit=53) - RETURN - ENDIF - NFFT=NGD - XJ(1)=-DXJ*FLOAT(NFFT/2) - do I=2,NFFT - XJ(I)=XJ(I-1)+DXJ - end do - END -C -------------------------------------- - SUBROUTINE RINTRP(X,YB,IR0,XB0,DX,BLR) - REAL YB(*) - XOFSET=(X-XB0)/DX - IXOFST=INT(XOFSET) - DXOFST=ABS(XOFSET-FLOAT(IXOFST)) - I=IXOFST+IR0 - IF (XOFSET.GE.0.0) THEN - BLR=YB(I)+DXOFST*(YB(I+1)-YB(I)) - ELSE - BLR=YB(I)+DXOFST*(YB(I-1)-YB(I)) - ENDIF - END +!************************************************* +SUBROUTINE BLRINT(XB,YB,NB,XSCALE,LSTART) +INCLUDE 'res_par.f90' +INCLUDE 'mod_files.f90' +COMMON /FFTCOM/ FRES(m_d2),FWRK(m_d2),XJ(m_d),TWOPIK(m_d1),NFFT +COMMON /DATCOM/ XDAT(m_d),DAT(m_d),SIG(m_d),NDAT +REAL XB(m_d),YB(m_d) +LOGICAL LSTART +NFFT=m_d +IF (.NOT.LSTART) THEN + YMAX=0.0 + do I=1,NFFT + IF (YB(I).GT.YMAX) YMAX=YB(I) + end do +ELSE + OPEN(UNIT=53,FILE=lptfile,STATUS='old',FORM='formatted', & + access='append') + WRITE(53,*)' Resolution function X-axis multiplied by: ',XSCALE + close(unit=53) +ENDIF +CALL XGINIT(XB,YB,NB,YMAX,XSCALE) +DXJ=XJ(2)-XJ(1) +DXB=XB(2)-XB(1) +do I=1,NB + IF (XB(I).GE.0.0) GOTO 4 +end do +4 IR0=I +XB0=XB(IR0) +DXB=DXB*XSCALE +XBMIN=XB(1)*XSCALE+DXB +XBMAX=XB(NB)*XSCALE-DXB +TWOPIN=2.0*3.141592654/FLOAT(NFFT) +CALL VRFILL(FRES,0.0,NFFT) +X=0.0 +CALL RINTRP(X,YB,IR0,XB0,DXB,FRES(1)) +SM=FRES(1) +do I=1,NFFT/2 + X=X+DXJ + IF (X.LT.XBMAX) CALL RINTRP(X,YB,IR0,XB0,DXB,FRES(I+1)) + IF (-X.GT.XBMIN) CALL RINTRP(-X,YB,IR0,XB0,DXB,FRES(NFFT+1-I)) + SM=SM+FRES(I+1)+FRES(NFFT+1-I) + TWOPIK(I)=TWOPIN*FLOAT(I-1) +end do +TWOPIK(NFFT/2+1)=TWOPIN*FLOAT(NFFT/2) +BNORM=1.0/(SM*FLOAT(NFFT)) +do I=1,NFFT + FRES(I)=BNORM*FRES(I) +end do +CALL FOUR2(FRES,NFFT,1,1,0) +do I=3,NFFT,4 + FRES(I)=-FRES(I) + FRES(I+1)=-FRES(I+1) +end do +IF (.NOT. LSTART) THEN + CALL VCOPY(FRES,FWRK,NFFT+2) + CALL FOUR2(FWRK,NFFT,1,-1,-1) +ENDIF +END +! --------------------------------------------------------- +SUBROUTINE XGINIT(XB,YB,NB,YMAX,XSCALE) +INCLUDE 'res_par.f90' +INCLUDE 'mod_files.f90' +COMMON /FFTCOM/ FRES(m_d2),FWRK(m_d2),XJ(m_d),TWOPIK(m_d1),NFFT +COMMON /DATCOM/ XDAT(m_d),DAT(m_d),SIG(m_d),NDAT +REAL XB(*),YB(*) +Y0=YMAX/10.0 +do I=1,NB + IF (YB(I).GE.Y0) GOTO 1 +end do +1 IMIN=I +do I=NB,1,-1 + IF (YB(I).GE.Y0) GOTO 2 +end do +2 IMAX=I +BWIDTH=(XB(IMAX)-XB(IMIN))*XSCALE +DXJ=BWIDTH/20.0 +AXMAX=ABS(XDAT(1)) +IF (ABS(XDAT(NDAT)).GT.AXMAX) AXMAX=ABS(XDAT(NDAT)) +XNDMAX=500.0 +IF (NDAT.GT.INT(XNDMAX)) XNDMAX=FLOAT(NDAT) +DXDAT=2.0*AXMAX/XNDMAX +IF (DXDAT.GT.DXJ) DXJ=DXDAT +XNGD=(2.0*AXMAX)/DXJ +NGD=NINT(LOG(XNGD-1.0)/LOG(2.0))+1 +NGD=2**NGD +IF (NGD.GT.m_d) then + OPEN(UNIT=53,FILE=lptfile,STATUS='old',FORM='formatted', & + access='append') + WRITE(53,*)' ERROR in XGINIT : too many points' + close(unit=53) + RETURN +ENDIF +NFFT=NGD +XJ(1)=-DXJ*FLOAT(NFFT/2) +do I=2,NFFT + XJ(I)=XJ(I-1)+DXJ +end do +END +! -------------------------------------- +SUBROUTINE RINTRP(X,YB,IR0,XB0,DX,BLR) +REAL YB(*) +XOFSET=(X-XB0)/DX +IXOFST=INT(XOFSET) +DXOFST=ABS(XOFSET-FLOAT(IXOFST)) +I=IXOFST+IR0 +IF (XOFSET.GE.0.0) THEN + BLR=YB(I)+DXOFST*(YB(I+1)-YB(I)) +ELSE + BLR=YB(I)+DXOFST*(YB(I-1)-YB(I)) +ENDIF +END diff --git a/quasielasticbayes/Four.f90 b/quasielasticbayes/Four.f90 index 4c667ec..76fd8a1 100644 --- a/quasielasticbayes/Four.f90 +++ b/quasielasticbayes/Four.f90 @@ -1,294 +1,294 @@ - SUBROUTINE FOUR2 (DATA,N,NDIM,ISIGN,IFORM) -C COOLEY-TUKEY FAST FOURIER TRANSFORM IN USASI BASIC FORTRAN. -C MULTI-DIMENSIONAL TRANSFORM, EACH DIMENSION A POWER OF TWO, -C COMPLEX OR REAL DATA. -C TRANSFORM(K1,K2,...) = SUM(DATA(J1,J2,...)*EXP(ISIGN*2*PI*SQRT(-1) -C *((J1-1)*(K1-1)/N(1)+(J2-1)*(K2-1)/N(2)+...))), SUMMED FOR ALL -C J1 AND K1 FROM 1 TO N(1), J2 AND K2 FROM 1 TO N(2), -C ETC. FOR ALL NDIM SUBSCRIPTS. NDIM MUST BE POSITIVE AND -C EACH N(IDIM) MUST BE A POWER OF TWO. ISIGN IS +1 OR -1. -C LET NTOT = N(1)*N(2)*...*N(NDIM). THEN A -1 TRANSFORM -C FOLLOWED BY A +1 ONE (OR VICE VERSA) RETURNS NTOT -C TIMES THE ORIGINAL DATA. IFORM = 1, 0 OR -1, AS DATA IS -C COMPLEX, REAL OR THE FIRST HALF OF A COMPLEX ARRAY. TRANSFORM -C VALUES ARE RETURNED TO ARRAY DATA. THEY ARE COMPLEX, REAL OR -C THE FIRST HALF OF A COMPLEX ARRAY, AS IFORM = 1, -1 OR 0. -C THE TRANSFORM OF A REAL ARRAY (IFORM = 0) DIMENSIONED N(1) BY N(2) -C BY ... WILL BE RETURNED IN THE SAME ARRAY, NOW CONSIDERED TO -C BE COMPLEX OF DIMENSIONS N(1)/2+1 BY N(2) BY .... NOTE THAT IF -C IFORM = 0 OR -1, N(1) MUST BE EVEN, AND ENOUGH ROOM MUST BE -C RESERVED. THE MISSING VALUES MAY BE OBTAINED BY COMPLEX CONJUGA- -C TION. THE REVERSE TRANSFORMATION, OF A HALF COMPLEX ARRAY DIMEN- -C SIONED N(1)/2+1 BY N(2) BY ..., IS ACCOMPLISHED BY SETTING IFORM -C TO -1. IN THE N ARRAY, N(1) MUST BE THE TRUE N(1), NOT N(1)/2+1. -C THE TRANSFORM WILL BE REAL AND RETURNED TO THE INPUT ARRAY. -C RUNNING TIME IS PROPORTIONAL TO NTOT*LOG2(NTOT), RATHER THAN -C THE NAIVE NTOT**2. FURTHERMORE, LESS ERROR IS BUILT UP. -C WRITTEN BY NORMAN BRENNER OF MIT LINCOLN LABORATORY, JUNE 1968. -C SEE-- IEEE AUDIO TRANSACTIONS (JUNE 1967), SPECIAL ISSUE ON FFT. - INCLUDE 'res_par.f90' - DIMENSION DATA(m_d2), N(1) - NTOT=1 - DO 10 IDIM=1,NDIM - 10 NTOT=NTOT*N(IDIM) - IF (IFORM) 70,20,20 - 20 NREM=NTOT - DO 60 IDIM=1,NDIM - NREM=NREM/N(IDIM) - NPREV=NTOT/(N(IDIM)*NREM) - NCURR=N(IDIM) - IF (IDIM-1+IFORM) 30,30,40 - 30 NCURR=NCURR/2 - 40 CALL BOTRV (DATA,NPREV,NCURR,NREM) - CALL COOL2 (DATA,NPREV,NCURR,NREM,ISIGN) - IF (IDIM-1+IFORM) 50,50,60 - 50 CALL FOXRL (DATA,N(1),NREM,ISIGN,IFORM) - NTOT=(NTOT/N(1))*(N(1)/2+1) - 60 CONTINUE - RETURN - 70 NTOT=(NTOT/N(1))*(N(1)/2+1) - NREM=1 - DO 100 JDIM=1,NDIM - IDIM=NDIM+1-JDIM - NCURR=N(IDIM) - IF (IDIM-1) 80,80,90 - 80 NCURR=NCURR/2 - CALL FOXRL (DATA,N(1),NREM,ISIGN,IFORM) - NTOT=NTOT/(N(1)/2+1)*N(1) - 90 NPREV=NTOT/(N(IDIM)*NREM) - CALL BOTRV (DATA,NPREV,NCURR,NREM) - CALL COOL2 (DATA,NPREV,NCURR,NREM,ISIGN) - 100 NREM=NREM*N(IDIM) - RETURN - END - SUBROUTINE FOXRL (DATA,N,NREM,ISIGN,IFORM) -C FOR IFORM = 0, CONVERT THE TRANSFORM OF A DOUBLED-UP REAL ARRAY, -C CONSIDERED COMPLEX, INTO ITS TRUE TRANSFORM. SUPPLY ONLY THE -C FIRST HALF OF THE COMPLEX TRANSFORM, AS THE SECOND HALF HAS -C CONJUGATE SYMMETRY. FOR IFORM = -1, CONVERT THE FIRST HALF -C OF THE TRUE TRANSFORM INTO THE TRANSFORM OF A DOUBLED-UP REAL -C ARRAY. N MUST BE EVEN. -C USING COMPLEX NOTATION AND SUBSCRIPTS STARTING AT ZERO, THE -C TRANSFORMATION IS-- -C DIMENSION DATA(N,NREM) -C ZSTP = EXP(ISIGN*2*PI*I/N) -C DO 10 I2=0,NREM-1 -C DATA(0,I2) = CONJ(DATA(0,I2))*(1+I) -C DO 10 I1=1,N/4 -C Z = (1+(2*IFORM+1)*I*ZSTP**I1)/2 -C I1CNJ = N/2-I1 -C DIF = DATA(I1,I2)-CONJ(DATA(I1CNJ,I2)) -C TEMP = Z*DIF -C DATA(I1,I2) = (DATA(I1,I2)-TEMP)*(1-IFORM) -C 10 DATA(I1CNJ,I2) = (DATA(I1CNJ,I2)+CONJ(TEMP))*(1-IFORM) -C IF I1=I1CNJ, THE CALCULATION FOR THAT VALUE COLLAPSES INTO -C A SIMPLE CONJUGATION OF DATA(I1,I2). - INCLUDE 'res_par.f90' - DIMENSION DATA(m_d2) - TWOPI=6.283185307*FLOAT(ISIGN) - IP0=2 - IP1=IP0*(N/2) - IP2=IP1*NREM - IF (IFORM) 10,70,70 -C PACK THE REAL INPUT VALUES (TWO PER COLUMN) - 10 J1=IP1+1 - DATA(2)=DATA(J1) - IF (NREM-1) 70,70,20 - 20 J1=J1+IP0 - I2MIN=IP1+1 - DO 60 I2=I2MIN,IP2,IP1 - DATA(I2)=DATA(J1) - J1=J1+IP0 - IF (N-2) 50,50,30 - 30 I1MIN=I2+IP0 - I1MAX=I2+IP1-IP0 - DO 40 I1=I1MIN,I1MAX,IP0 - DATA(I1)=DATA(J1) - DATA(I1+1)=DATA(J1+1) - 40 J1=J1+IP0 - 50 DATA(I2+1)=DATA(J1) - 60 J1=J1+IP0 - 70 DO 80 I2=1,IP2,IP1 - TEMPR=DATA(I2) - DATA(I2)=DATA(I2)+DATA(I2+1) - 80 DATA(I2+1)=TEMPR-DATA(I2+1) - IF (N-2) 200,200,90 - 90 THETA=TWOPI/FLOAT(N) - SINTH=SIN(THETA/2.) - ZSTPR=-2.*SINTH*SINTH - ZSTPI=SIN(THETA) - ZR=(1.-ZSTPI)/2. - ZI=(1.+ZSTPR)/2. - IF (IFORM) 100,110,110 - 100 ZR=1.-ZR - ZI=-ZI - 110 I1MIN=IP0+1 - I1MAX=IP0*(N/4)+1 - DO 190 I1=I1MIN,I1MAX,IP0 - DO 180 I2=I1,IP2,IP1 - I2CNJ=IP0*(N/2+1)-2*I1+I2 - IF (I2-I2CNJ) 150,120,120 - 120 IF (ISIGN*(2*IFORM+1)) 130,140,140 - 130 DATA(I2+1)=-DATA(I2+1) - 140 IF (IFORM) 170,180,180 - 150 DIFR=DATA(I2)-DATA(I2CNJ) - DIFI=DATA(I2+1)+DATA(I2CNJ+1) - TEMPR=DIFR*ZR-DIFI*ZI - TEMPI=DIFR*ZI+DIFI*ZR - DATA(I2)=DATA(I2)-TEMPR - DATA(I2+1)=DATA(I2+1)-TEMPI - DATA(I2CNJ)=DATA(I2CNJ)+TEMPR - DATA(I2CNJ+1)=DATA(I2CNJ+1)-TEMPI - IF (IFORM) 160,180,180 - 160 DATA(I2CNJ)=DATA(I2CNJ)+DATA(I2CNJ) - DATA(I2CNJ+1)=DATA(I2CNJ+1)+DATA(I2CNJ+1) - 170 DATA(I2)=DATA(I2)+DATA(I2) - DATA(I2+1)=DATA(I2+1)+DATA(I2+1) - 180 CONTINUE - TEMPR=ZR-.5 - ZR=ZSTPR*TEMPR-ZSTPI*ZI+ZR - 190 ZI=ZSTPR*ZI+ZSTPI*TEMPR+ZI -C RECURSION SAVES TIME, AT A SLIGHT LOSS IN ACCURACY. IF AVAILABLE, -C USE DOUBLE PRECISION TO COMPUTE ZR AND ZI. - 200 IF (IFORM) 270,210,210 -C UNPACK THE REAL TRANSFORM VALUES (TWO PER COLUMN) - 210 I2=IP2+1 - I1=I2 - J1=IP0*(N/2+1)*NREM+1 - GO TO 250 - 220 DATA(J1)=DATA(I1) - DATA(J1+1)=DATA(I1+1) - I1=I1-IP0 - J1=J1-IP0 - 230 IF (I2-I1) 220,240,240 - 240 DATA(J1)=DATA(I1) - DATA(J1+1)=0. - 250 I2=I2-IP1 - J1=J1-IP0 - DATA(J1)=DATA(I2+1) - DATA(J1+1)=0. - I1=I1-IP0 - J1=J1-IP0 - IF (I2-1) 260,260,230 - 260 DATA(2)=0. - 270 RETURN - END - SUBROUTINE BOTRV(DATA,NPREV,N,NREM) -C SHUFFLE THE DATA BY 'BIT REVERSAL'. -C DIMENSION DATA(NPREV,N,NREM) -C DATA(I1,I2REV,I3) = DATA(I1,I2,I3), FOR ALL I1 FROM 1 TO -C NPREV, ALL I2 FROM 1 TO N (WHICH MUST BE A POWER OF TWO), AND -C ALL I3 FROM 1 TO NREM, WHERE I2REV-1 IS THE BITWISE REVERSAL -C OF I2-1. FOR EXAMPLE, N = 32, I2-1 = 10011 AND I2REV-1 = 11001. -C - INCLUDE 'res_par.f90' - DIMENSION DATA(m_d2) - COMPLEX DATA,TEMP - IP0=1 - IP1=IP0*NPREV - IP4=IP1*N - IP5=IP4*NREM - I4REV=1 - I4MAX=IP4 - DO 60 I4=1,I4MAX,IP1 - IF(I4-I4REV)10,30,30 - 10 I1MAX=I4+IP1-IP0 - DO 20 I1=I4,I1MAX,IP0 - DO 20 I5=I1,IP5,IP4 - I5REV=I4REV+I5-I4 - TEMP=DATA(I5) - DATA(I5)=DATA(I5REV) - 20 DATA(I5REV)=TEMP - 30 IP2=IP4/2 - 40 IF(I4REV-IP2)60,60,50 - 50 I4REV=I4REV-IP2 - IP2=IP2/2 - IF(IP2-IP1)60,40,40 - 60 I4REV=I4REV+IP2 - RETURN - END - SUBROUTINE COOL2(DATA,NPREV,N,NREM,ISIGN) -C FOURIER TRANSFORM, LENGTH N, BY THE COOLEY-TUKEY ALGORITHM, IN -C PLACE, BIT-REVERSED TO NORMAL ORDER, SANDE-TUKEY PHASE SHIFTS. -C COMPLEX DATA -C DIMENSION DATA(NPREV,N,NREM) -C DATA(I1,J2,I3) = SUM(DATA(I1,I2,I3)CEXP(ISIGNC2CPICIC((I2-1)C -C (J2-1)/N))), SUMMED OVER I2 = 1 TO N FOR ALL I1 FROM 1 TO -C NPREV, J2 FROM 1 TO N AND I3 FROM 1 TO NREM. N MUST BE A -C POWER OF TWO. FACTORING N BY FOUR'S DECREASES RUNNING TIME -C BY ABOUT TWENTY FIVE PERCENT OVER FACTORING BY TWO'S. -C GENERATING THE PHASE SHIFT FACTORS BY RECURSION SAVES ABOUT -C TWENTY FIVE PERCENT OVER COMPUTING THEM, WHILE TABLING THEM -C IS UNLIKELY TO SAVE MORE THAN ANOTHER TEN PERCENT. -C - INCLUDE 'res_par.f90' - DIMENSION DATA(m_d2) - COMPLEX DATA,TEMP,WSTP,W,W2,W3,T0,T1,T2,T3 - TWOPI=6.28318530717958647692*FLOAT(ISIGN) - IP0=1 - IP1=IP0*NPREV - IP4=IP1*N - IP5=IP4*NREM - IP2=IP1 - NPART=N - 10 IF(NPART-2)50,30,20 - 20 NPART=NPART/4 - GO TO 10 -C -C DO A FOURIER TRANSFORM OF LENGTH TWO -C - 30 IP3=IP2*2 - I1MAX=IP1 - DO 40 I1=1,I1MAX,IP0 - DO 40 I5=I1,IP5,IP3 - I3A=I5 - I3B=I3A+IP2 - TEMP=DATA(I3B) - DATA(I3B)=DATA(I3A)-TEMP - 40 DATA(I3A)=DATA(I3A)+TEMP - GO TO 140 -C -C DO A FOURIER TRANSFORM OF LENGTH FOUR (WITHOUT BIT REVERSAL) -C - 50 IP3=IP2*4 - THETA=TWOPI/FLOAT(IP3/IP1) - SINTH=SIN(THETA/2.) - WSTP=CMPLX(-2.*SINTH*SINTH,SIN(THETA)) -C -C COS(THETA)-1, FOR ACCURACY -C - W=1. - DO 130 I2=1,IP2,IP1 - IF(I2-1)70,70,60 - 60 W2=W*W - W3=W2*W - 70 I1MAX=I2+IP1-IP0 - DO 120 I1=I2,I1MAX,IP0 - DO 120 I5=I1,IP5,IP3 - I3A=I5 - I3B=I3A+IP2 - I3C=I3B+IP2 - I3D=I3C+IP2 - IF(I2-1)90,90,80 -C -C MULTIPLY BY THE PHASE SHIFT FACTORS -C - 80 DATA(I3B)=W2*DATA(I3B) - DATA(I3C)=W*DATA(I3C) - DATA(I3D)=W3*DATA(I3D) - 90 T0=DATA(I3A)+DATA(I3B) - T1=DATA(I3A)-DATA(I3B) - T2=DATA(I3C)+DATA(I3D) - T3=DATA(I3C)-DATA(I3D) - DATA(I3A)=T0+T2 - DATA(I3C)=T0-T2 - TEMP=(0.,1.)*T3 - IF(ISIGN)100,100,110 - 100 TEMP=-TEMP - 110 DATA(I3B)=T1+TEMP - 120 DATA(I3D)=T1-TEMP - 130 W=W*WSTP+W - 140 IP2=IP3 - IF(IP3-IP4)50,150,150 - 150 RETURN - END + SUBROUTINE FOUR2 (DATA,N,NDIM,ISIGN,IFORM) +! COOLEY-TUKEY FAST FOURIER TRANSFORM IN USASI BASIC FORTRAN. +! MULTI-DIMENSIONAL TRANSFORM, EACH DIMENSION A POWER OF TWO, +! COMPLEX OR REAL DATA. +! TRANSFORM(K1,K2,...) = SUM(DATA(J1,J2,...)*EXP(ISIGN*2*PI*SQRT(-1) +! *((J1-1)*(K1-1)/N(1)+(J2-1)*(K2-1)/N(2)+...))), SUMMED FOR ALL +! J1 AND K1 FROM 1 TO N(1), J2 AND K2 FROM 1 TO N(2), +! ETC. FOR ALL NDIM SUBSCRIPTS. NDIM MUST BE POSITIVE AND +! EACH N(IDIM) MUST BE A POWER OF TWO. ISIGN IS +1 OR -1. +! LET NTOT = N(1)*N(2)*...*N(NDIM). THEN A -1 TRANSFORM +! FOLLOWED BY A +1 ONE (OR VICE VERSA) RETURNS NTOT +! TIMES THE ORIGINAL DATA. IFORM = 1, 0 OR -1, AS DATA IS +! COMPLEX, REAL OR THE FIRST HALF OF A COMPLEX ARRAY. TRANSFORM +! VALUES ARE RETURNED TO ARRAY DATA. THEY ARE COMPLEX, REAL OR +! THE FIRST HALF OF A COMPLEX ARRAY, AS IFORM = 1, -1 OR 0. +! THE TRANSFORM OF A REAL ARRAY (IFORM = 0) DIMENSIONED N(1) BY N(2) +! BY ... WILL BE RETURNED IN THE SAME ARRAY, NOW CONSIDERED TO +! BE COMPLEX OF DIMENSIONS N(1)/2+1 BY N(2) BY .... NOTE THAT IF +! IFORM = 0 OR -1, N(1) MUST BE EVEN, AND ENOUGH ROOM MUST BE +! RESERVED. THE MISSING VALUES MAY BE OBTAINED BY COMPLEX CONJUGA- +! TION. THE REVERSE TRANSFORMATION, OF A HALF COMPLEX ARRAY DIMEN- +! SIONED N(1)/2+1 BY N(2) BY ..., IS ACCOMPLISHED BY SETTING IFORM +! TO -1. IN THE N ARRAY, N(1) MUST BE THE TRUE N(1), NOT N(1)/2+1. +! THE TRANSFORM WILL BE REAL AND RETURNED TO THE INPUT ARRAY. +! RUNNING TIME IS PROPORTIONAL TO NTOT*LOG2(NTOT), RATHER THAN +! THE NAIVE NTOT**2. FURTHERMORE, LESS ERROR IS BUILT UP. +! WRITTEN BY NORMAN BRENNER OF MIT LINCOLN LABORATORY, JUNE 1968. +! SEE-- IEEE AUDIO TRANSACTIONS (JUNE 1967), SPECIAL ISSUE ON FFT. +INCLUDE 'res_par.f90' +DIMENSION DATA(m_d2), N(1) +NTOT=1 +DO 10 IDIM=1,NDIM +10 NTOT=NTOT*N(IDIM) +IF (IFORM) 70,20,20 +20 NREM=NTOT +DO 60 IDIM=1,NDIM +NREM=NREM/N(IDIM) +NPREV=NTOT/(N(IDIM)*NREM) +NCURR=N(IDIM) +IF (IDIM-1+IFORM) 30,30,40 +30 NCURR=NCURR/2 +40 CALL BOTRV (DATA,NPREV,NCURR,NREM) +CALL COOL2 (DATA,NPREV,NCURR,NREM,ISIGN) +IF (IDIM-1+IFORM) 50,50,60 +50 CALL FOXRL (DATA,N(1),NREM,ISIGN,IFORM) +NTOT=(NTOT/N(1))*(N(1)/2+1) +60 CONTINUE +RETURN +70 NTOT=(NTOT/N(1))*(N(1)/2+1) +NREM=1 +DO 100 JDIM=1,NDIM +IDIM=NDIM+1-JDIM +NCURR=N(IDIM) +IF (IDIM-1) 80,80,90 +80 NCURR=NCURR/2 +CALL FOXRL (DATA,N(1),NREM,ISIGN,IFORM) +NTOT=NTOT/(N(1)/2+1)*N(1) +90 NPREV=NTOT/(N(IDIM)*NREM) +CALL BOTRV (DATA,NPREV,NCURR,NREM) +CALL COOL2 (DATA,NPREV,NCURR,NREM,ISIGN) +100 NREM=NREM*N(IDIM) +RETURN +END +SUBROUTINE FOXRL (DATA,N,NREM,ISIGN,IFORM) +! FOR IFORM = 0, CONVERT THE TRANSFORM OF A DOUBLED-UP REAL ARRAY, +! CONSIDERED COMPLEX, INTO ITS TRUE TRANSFORM. SUPPLY ONLY THE +! FIRST HALF OF THE COMPLEX TRANSFORM, AS THE SECOND HALF HAS +! CONJUGATE SYMMETRY. FOR IFORM = -1, CONVERT THE FIRST HALF +! OF THE TRUE TRANSFORM INTO THE TRANSFORM OF A DOUBLED-UP REAL +! ARRAY. N MUST BE EVEN. +! USING COMPLEX NOTATION AND SUBSCRIPTS STARTING AT ZERO, THE +! TRANSFORMATION IS-- +! DIMENSION DATA(N,NREM) +! ZSTP = EXP(ISIGN*2*PI*I/N) +! DO 10 I2=0,NREM-1 +! DATA(0,I2) = CONJ(DATA(0,I2))*(1+I) +! DO 10 I1=1,N/4 +! Z = (1+(2*IFORM+1)*I*ZSTP**I1)/2 +! I1CNJ = N/2-I1 +! DIF = DATA(I1,I2)-CONJ(DATA(I1CNJ,I2)) +! TEMP = Z*DIF +! DATA(I1,I2) = (DATA(I1,I2)-TEMP)*(1-IFORM) +! 10 DATA(I1CNJ,I2) = (DATA(I1CNJ,I2)+CONJ(TEMP))*(1-IFORM) +! IF I1=I1CNJ, THE CALCULATION FOR THAT VALUE COLLAPSES INTO +! A SIMPLE CONJUGATION OF DATA(I1,I2). +INCLUDE 'res_par.f90' +DIMENSION DATA(m_d2) +TWOPI=6.283185307*FLOAT(ISIGN) +IP0=2 +IP1=IP0*(N/2) +IP2=IP1*NREM +IF (IFORM) 10,70,70 +! PACK THE REAL INPUT VALUES (TWO PER COLUMN) +10 J1=IP1+1 +DATA(2)=DATA(J1) +IF (NREM-1) 70,70,20 +20 J1=J1+IP0 +I2MIN=IP1+1 +DO 60 I2=I2MIN,IP2,IP1 +DATA(I2)=DATA(J1) +J1=J1+IP0 +IF (N-2) 50,50,30 +30 I1MIN=I2+IP0 +I1MAX=I2+IP1-IP0 +DO 40 I1=I1MIN,I1MAX,IP0 +DATA(I1)=DATA(J1) +DATA(I1+1)=DATA(J1+1) +40 J1=J1+IP0 +50 DATA(I2+1)=DATA(J1) +60 J1=J1+IP0 +70 DO 80 I2=1,IP2,IP1 +TEMPR=DATA(I2) +DATA(I2)=DATA(I2)+DATA(I2+1) +80 DATA(I2+1)=TEMPR-DATA(I2+1) +IF (N-2) 200,200,90 +90 THETA=TWOPI/FLOAT(N) +SINTH=SIN(THETA/2.) +ZSTPR=-2.*SINTH*SINTH +ZSTPI=SIN(THETA) +ZR=(1.-ZSTPI)/2. +ZI=(1.+ZSTPR)/2. +IF (IFORM) 100,110,110 +100 ZR=1.-ZR +ZI=-ZI +110 I1MIN=IP0+1 +I1MAX=IP0*(N/4)+1 +DO 190 I1=I1MIN,I1MAX,IP0 +DO 180 I2=I1,IP2,IP1 +I2CNJ=IP0*(N/2+1)-2*I1+I2 +IF (I2-I2CNJ) 150,120,120 +120 IF (ISIGN*(2*IFORM+1)) 130,140,140 +130 DATA(I2+1)=-DATA(I2+1) +140 IF (IFORM) 170,180,180 +150 DIFR=DATA(I2)-DATA(I2CNJ) +DIFI=DATA(I2+1)+DATA(I2CNJ+1) +TEMPR=DIFR*ZR-DIFI*ZI +TEMPI=DIFR*ZI+DIFI*ZR +DATA(I2)=DATA(I2)-TEMPR +DATA(I2+1)=DATA(I2+1)-TEMPI +DATA(I2CNJ)=DATA(I2CNJ)+TEMPR +DATA(I2CNJ+1)=DATA(I2CNJ+1)-TEMPI +IF (IFORM) 160,180,180 +160 DATA(I2CNJ)=DATA(I2CNJ)+DATA(I2CNJ) +DATA(I2CNJ+1)=DATA(I2CNJ+1)+DATA(I2CNJ+1) +170 DATA(I2)=DATA(I2)+DATA(I2) +DATA(I2+1)=DATA(I2+1)+DATA(I2+1) +180 CONTINUE +TEMPR=ZR-.5 +ZR=ZSTPR*TEMPR-ZSTPI*ZI+ZR +190 ZI=ZSTPR*ZI+ZSTPI*TEMPR+ZI +! RECURSION SAVES TIME, AT A SLIGHT LOSS IN ACCURACY. IF AVAILABLE, +! USE DOUBLE PRECISION TO COMPUTE ZR AND ZI. +200 IF (IFORM) 270,210,210 +! UNPACK THE REAL TRANSFORM VALUES (TWO PER COLUMN) +210 I2=IP2+1 +I1=I2 +J1=IP0*(N/2+1)*NREM+1 +GO TO 250 +220 DATA(J1)=DATA(I1) +DATA(J1+1)=DATA(I1+1) +I1=I1-IP0 +J1=J1-IP0 +230 IF (I2-I1) 220,240,240 +240 DATA(J1)=DATA(I1) +DATA(J1+1)=0. +250 I2=I2-IP1 +J1=J1-IP0 +DATA(J1)=DATA(I2+1) +DATA(J1+1)=0. +I1=I1-IP0 +J1=J1-IP0 +IF (I2-1) 260,260,230 +260 DATA(2)=0. +270 RETURN +END +SUBROUTINE BOTRV(DATA,NPREV,N,NREM) +! SHUFFLE THE DATA BY 'BIT REVERSAL'. +! DIMENSION DATA(NPREV,N,NREM) +! DATA(I1,I2REV,I3) = DATA(I1,I2,I3), FOR ALL I1 FROM 1 TO +! NPREV, ALL I2 FROM 1 TO N (WHICH MUST BE A POWER OF TWO), AND +! ALL I3 FROM 1 TO NREM, WHERE I2REV-1 IS THE BITWISE REVERSAL +! OF I2-1. FOR EXAMPLE, N = 32, I2-1 = 10011 AND I2REV-1 = 11001. +! +INCLUDE 'res_par.f90' +DIMENSION DATA(m_d2) +COMPLEX DATA,TEMP +IP0=1 +IP1=IP0*NPREV +IP4=IP1*N +IP5=IP4*NREM +I4REV=1 +I4MAX=IP4 +DO 60 I4=1,I4MAX,IP1 +IF(I4-I4REV)10,30,30 +10 I1MAX=I4+IP1-IP0 +DO 20 I1=I4,I1MAX,IP0 +DO 20 I5=I1,IP5,IP4 +I5REV=I4REV+I5-I4 +TEMP=DATA(I5) +DATA(I5)=DATA(I5REV) +20 DATA(I5REV)=TEMP +30 IP2=IP4/2 +40 IF(I4REV-IP2)60,60,50 +50 I4REV=I4REV-IP2 +IP2=IP2/2 +IF(IP2-IP1)60,40,40 +60 I4REV=I4REV+IP2 +RETURN +END +SUBROUTINE COOL2(DATA,NPREV,N,NREM,ISIGN) +! FOURIER TRANSFORM, LENGTH N, BY THE COOLEY-TUKEY ALGORITHM, IN +! PLACE, BIT-REVERSED TO NORMAL ORDER, SANDE-TUKEY PHASE SHIFTS. +! COMPLEX DATA +! DIMENSION DATA(NPREV,N,NREM) +! DATA(I1,J2,I3) = SUM(DATA(I1,I2,I3)CEXP(ISIGNC2CPICIC((I2-1)C +! (J2-1)/N))), SUMMED OVER I2 = 1 TO N FOR ALL I1 FROM 1 TO +! NPREV, J2 FROM 1 TO N AND I3 FROM 1 TO NREM. N MUST BE A +! POWER OF TWO. FACTORING N BY FOUR'S DECREASES RUNNING TIME +! BY ABOUT TWENTY FIVE PERCENT OVER FACTORING BY TWO'S. +! GENERATING THE PHASE SHIFT FACTORS BY RECURSION SAVES ABOUT +! TWENTY FIVE PERCENT OVER COMPUTING THEM, WHILE TABLING THEM +! IS UNLIKELY TO SAVE MORE THAN ANOTHER TEN PERCENT. +! +INCLUDE 'res_par.f90' +DIMENSION DATA(m_d2) +COMPLEX DATA,TEMP,WSTP,W,W2,W3,T0,T1,T2,T3 +TWOPI=6.28318530717958647692*FLOAT(ISIGN) +IP0=1 +IP1=IP0*NPREV +IP4=IP1*N +IP5=IP4*NREM +IP2=IP1 +NPART=N +10 IF(NPART-2)50,30,20 +20 NPART=NPART/4 +GO TO 10 +! +! DO A FOURIER TRANSFORM OF LENGTH TWO +! +30 IP3=IP2*2 +I1MAX=IP1 +DO 40 I1=1,I1MAX,IP0 +DO 40 I5=I1,IP5,IP3 +I3A=I5 +I3B=I3A+IP2 +TEMP=DATA(I3B) +DATA(I3B)=DATA(I3A)-TEMP +40 DATA(I3A)=DATA(I3A)+TEMP +GO TO 140 +! +! DO A FOURIER TRANSFORM OF LENGTH FOUR (WITHOUT BIT REVERSAL) +! +50 IP3=IP2*4 +THETA=TWOPI/FLOAT(IP3/IP1) +SINTH=SIN(THETA/2.) +WSTP=CMPLX(-2.*SINTH*SINTH,SIN(THETA)) +! +! COS(THETA)-1, FOR ACCURACY +! +W=1. +DO 130 I2=1,IP2,IP1 + IF(I2-1)70,70,60 +60 W2=W*W +W3=W2*W +70 I1MAX=I2+IP1-IP0 +DO 120 I1=I2,I1MAX,IP0 +DO 120 I5=I1,IP5,IP3 +I3A=I5 +I3B=I3A+IP2 +I3C=I3B+IP2 +I3D=I3C+IP2 +IF(I2-1)90,90,80 +! +! MULTIPLY BY THE PHASE SHIFT FACTORS +! +80 DATA(I3B)=W2*DATA(I3B) +DATA(I3C)=W*DATA(I3C) +DATA(I3D)=W3*DATA(I3D) +90 T0=DATA(I3A)+DATA(I3B) +T1=DATA(I3A)-DATA(I3B) +T2=DATA(I3C)+DATA(I3D) +T3=DATA(I3C)-DATA(I3D) +DATA(I3A)=T0+T2 +DATA(I3C)=T0-T2 +TEMP=(0.,1.)*T3 +IF(ISIGN)100,100,110 +100 TEMP=-TEMP +110 DATA(I3B)=T1+TEMP +120 DATA(I3D)=T1-TEMP +130 W=W*WSTP+W +140 IP2=IP3 +IF(IP3-IP4)50,150,150 +150 RETURN +END diff --git a/quasielasticbayes/Four_main.f90 b/quasielasticbayes/Four_main.f90 index cedf057..1cbfe92 100644 --- a/quasielasticbayes/Four_main.f90 +++ b/quasielasticbayes/Four_main.f90 @@ -1,14 +1,14 @@ - SUBROUTINE four(DATA,N,NDIM,ISIGN,IFORM, y_out) - INCLUDE 'mod_data.f90' - INCLUDE 'mod_files.f90' - INCLUDE 'options.f90' +SUBROUTINE four(DATA,N,NDIM,ISIGN,IFORM, y_out) +INCLUDE 'mod_data.f90' +INCLUDE 'mod_files.f90' +INCLUDE 'options.f90' - INTEGER N(1), ISIGN, NDIM, IFORM - COMPLEX DATA(4098), y_out(4098) - real x_in(m_d), y_in(m_d), e_in(m_d) -cf2py intent(in) :: DATA, N, ISIGN, NDIM, IFORM -cf2py intent(out) :: y_out !real parameters - y_out = DATA - CALL FOUR2(y_out,N,NDIM,ISIGN,IFORM) - RETURN - END +INTEGER N(1), ISIGN, NDIM, IFORM +COMPLEX DATA(4098), y_out(4098) +REAL x_in(m_d), y_in(m_d), e_in(m_d) +!f2py intent(in) :: DATA, N, ISIGN, NDIM, IFORM +!f2py intent(out) :: y_out !real parameters +y_out = DATA +call FOUR2(y_out,N,NDIM,ISIGN,IFORM) +RETURN +END SUBROUTINE diff --git a/quasielasticbayes/QLdata_main.f90 b/quasielasticbayes/QLdata_main.f90 index 2fe2103..e505def 100644 --- a/quasielasticbayes/QLdata_main.f90 +++ b/quasielasticbayes/QLdata_main.f90 @@ -1,255 +1,255 @@ - SUBROUTINE QLdata(numb,x_in,y_in,e_in,reals,opft, - 1 XD_in,X_r,Y_r,E_r,Wy_in,We_in,sfile,rfile,l_fn, - 2 nd_out,xout,yout,eout,yfit,yprob) - INCLUDE 'mod_data.f90' - INCLUDE 'mod_files.f90' - INCLUDE 'options.f90' - COMMON /FFTCOM/ FRES(m_d2),FWRK(m_d2),XJ(m_d),TWOPIK(m_d1),NFFT - COMMON /DATCOM/ XDAT(m_d),DAT(m_d),SIG(m_d),NDAT - COMMON /DINTRP/ IPDAT(m_d),XPDAT(m_d) - COMMON /FITCOM/ FIT(m_d),RESID(m_d),NFEW,FITP(m_p),EXPF(m_d1,6) - COMMON /SCLCOM/ BSCL,ASCL,WSCL,SCLVEC(m_p,2),GSCL - COMMON /GRDCOM/ DDDPAR(m_d,m_p),FR2PIK(m_d2,2) - COMMON /QW1COM/ QW1(m_sp),SIGQW1(m_sp),ISPEC - COMMON /WRKCOM/ WORK(m_d2,2) - COMMON/ModRes/ntr,xres,yres,eres,nrbin,ermin,ermax - COMMON/ModPars/NBIN,IMIN,IMAX,RSCL,BNORM - real x_in(m_d), y_in(m_d), e_in(m_d) -cf2py intent(in) :: x_in, y_in, e_in !sample data - real reals(4) -cf2py intent(in) :: reals !real parameters - real XD_in(m_d), X_r(m_d), Y_r(m_d), E_r(m_d) -cf2py intent(in) :: XD_in, X_r, Y_r, E_r !sample xrange, res data (blur) - real Wy_in(m_sp), We_in(m_sp) -cf2py intent(in) :: Wy_in, We_in !fixed width data - integer numb(9) -cf2py intent(in) :: numb !integer parameters - integer opft(4) -cf2py intent(in) :: opft !options parameters - integer l_fn -cf2py intent(in) :: l_fn !length of filenames - character*140 sfile, rfile -cf2py intent(in) :: sfile, rfile !sample & res filenames - integer nd_out -cf2py intent(out) :: nd_out !number of output points - real xout(m_d), yout(m_d), eout(m_d) -cf2py intent(out) :: xout, yout, eout !data values - real yfit(4*m_d) -cf2py intent(out) :: yfit !fit values - real yprob(4) -cf2py intent(out) :: yprob !probability values - integer l_title,l_user - character*80 user,title - real xres(m_d),yres(m_d),eres(m_d), - 1 XBLR(m_d),YBLR(m_d) - REAL GRAD(m_p),HESS(m_p,m_p),DPAR(m_p),COVAR(m_p,m_p) - REAL SIGPAR(m_p),FITPSV(m_p) - REAL DTNORM(m_sp),XSCALE(m_sp) - REAL PRBSV(4,m_sp),POUT(4,m_sp), - 1 PRMSV(7,4,m_sp),SIGSV(7,4,m_sp) - INTEGER INDX(m_p) - LOGICAL LGOOD(m_sp) - prog='l' - CALL init_paras - do n=1,m_p - GRAD(n)=0.0 - DPAR(n)=0.0 - SIGPAR(n)=0.0 - FITPSV(n)=0.0 - do m=1,m_p - HESS(n,m)=0.0 - COVAR(n,m)=0.0 - end do - end do - do n=1,m_sp - do n1=1,4 - PRBSV(n1,n)=0.0 - POUT(n1,n)=0.0 - do n2=1,7 - PRMSV(n2,n1,n)=0.0 - SIGSV(n2,n1,n)=0.0 - end do - end do - end do - NFFT=m_d -c numb = [ngrp, nsp, ntc, Ndat, nbin, Imin, Imax, NB, nrbin] - NSPEC=numb(1) !no. of groups - ISP=numb(2) !group number - ISPEC=ISP - ntc=numb(3) !no. of points - NDAT=numb(4) - NBIN=numb(5) - IMIN=numb(6) - IMAX=numb(7) - NB=numb(8) - nrbin=numb(9) -c reals = [efix, theta[isp], rscl, bnorm] - efix=reals(1) - theta(ISP)=reals(2) - RSCL=reals(3) - BNORM=reals(4) - do n=1,m_d - xin(n)=x_in(n) - yin(n)=y_in(n) - ein(n)=e_in(n) - XDAT(n)=XD_in(n) - end do - do n=1,NB - xres(n)=X_r(n) - yres(n)=Y_r(n) - eres(n)=E_r(n) - end do - o_el=opft(1) - o_bgd=opft(2) - o_w1=opft(3) - do n=1,m_sp - DTNORM(n)=1.0 !DTNORM, NSPEC - XSCALE(n)=1.0 !XSCALE, NSPEC - yprob=0.0 - end do - lptfile='' - fileout1='' - fileout2='' - fileout3='' - l_lpt=l_fn+8 - lptfile(1:l_lpt)=sfile(1:l_fn)//'_QLd.lpt' - l_file=l_fn+8 - fileout1(1:l_lpt)=sfile(1:l_fn)//'_QLd.ql1' - fileout2(1:l_lpt)=sfile(1:l_fn)//'_QLd.ql2' - fileout3(1:l_lpt)=sfile(1:l_fn)//'_QLd.ql3' - l_title=9 - title='' - l_user=9 - user='' - if(o_w1.eq.1)then - do I=1,NSPEC - QW1(I)=Wy_in(I) - QW1(I)=0.5*(ABS(QW1(I))+0.00001) - SIGQW1(I)=We_in(I) - SIGQW1(I)=0.5*(ABS(SIGQW1(I))+0.00001) - end do - endif +SUBROUTINE QLdata(numb,x_in,y_in,e_in,reals,opft, & + XD_in,X_r,Y_r,E_r,Wy_in,We_in,sfile,rfile,l_fn, & + nd_out,xout,yout,eout,yfit,yprob) +INCLUDE 'mod_data.f90' +INCLUDE 'mod_files.f90' +INCLUDE 'options.f90' +COMMON /FFTCOM/ FRES(m_d2),FWRK(m_d2),XJ(m_d),TWOPIK(m_d1),NFFT +COMMON /DATCOM/ XDAT(m_d),DAT(m_d),SIG(m_d),NDAT +COMMON /DINTRP/ IPDAT(m_d),XPDAT(m_d) +COMMON /FITCOM/ FIT(m_d),RESID(m_d),NFEW,FITP(m_p),EXPF(m_d1,6) +COMMON /SCLCOM/ BSCL,ASCL,WSCL,SCLVEC(m_p,2),GSCL +COMMON /GRDCOM/ DDDPAR(m_d,m_p),FR2PIK(m_d2,2) +COMMON /QW1COM/ QW1(m_sp),SIGQW1(m_sp),ISPEC +COMMON /WRKCOM/ WORK(m_d2,2) +COMMON/ModRes/ntr,xres,yres,eres,nrbin,ermin,ermax +COMMON/ModPars/NBIN,IMIN,IMAX,RSCL,BNORM +real x_in(m_d), y_in(m_d), e_in(m_d) +!f2py intent(in) :: x_in, y_in, e_in !sample data +real reals(4) +!f2py intent(in) :: reals !real parameters +real XD_in(m_d), X_r(m_d), Y_r(m_d), E_r(m_d) +!f2py intent(in) :: XD_in, X_r, Y_r, E_r !sample xrange, res data (blur) +real Wy_in(m_sp), We_in(m_sp) +!f2py intent(in) :: Wy_in, We_in !fixed width data +integer numb(9) +!f2py intent(in) :: numb !integer parameters +integer opft(4) +!f2py intent(in) :: opft !options parameters +integer l_fn +!f2py intent(in) :: l_fn !length of filenames +character*140 sfile, rfile +!f2py intent(in) :: sfile, rfile !sample & res filenames +integer nd_out +!f2py intent(out) :: nd_out !number of output points +real xout(m_d), yout(m_d), eout(m_d) +!f2py intent(out) :: xout, yout, eout !data values +real yfit(4*m_d) +!f2py intent(out) :: yfit !fit values +real yprob(4) +!f2py intent(out) :: yprob !probability values +integer l_title,l_user +character*80 user,title +real xres(m_d),yres(m_d),eres(m_d), & + XBLR(m_d),YBLR(m_d) +REAL GRAD(m_p),HESS(m_p,m_p),DPAR(m_p),COVAR(m_p,m_p) +REAL SIGPAR(m_p),FITPSV(m_p) +REAL DTNORM(m_sp),XSCALE(m_sp) +REAL PRBSV(4,m_sp),POUT(4,m_sp), & + PRMSV(7,4,m_sp),SIGSV(7,4,m_sp) +INTEGER INDX(m_p) +LOGICAL LGOOD(m_sp) +prog='l' +CALL init_paras +do n=1,m_p + GRAD(n)=0.0 + DPAR(n)=0.0 + SIGPAR(n)=0.0 + FITPSV(n)=0.0 + do m=1,m_p + HESS(n,m)=0.0 + COVAR(n,m)=0.0 + end do +end do +do n=1,m_sp + do n1=1,4 + PRBSV(n1,n)=0.0 + POUT(n1,n)=0.0 + do n2=1,7 + PRMSV(n2,n1,n)=0.0 + SIGSV(n2,n1,n)=0.0 + end do + end do +end do +NFFT=m_d +! numb = [ngrp, nsp, ntc, Ndat, nbin, Imin, Imax, NB, nrbin] +NSPEC=numb(1) !no. of groups +ISP=numb(2) !group number +ISPEC=ISP +ntc=numb(3) !no. of points +NDAT=numb(4) +NBIN=numb(5) +IMIN=numb(6) +IMAX=numb(7) +NB=numb(8) +nrbin=numb(9) +! reals = [efix, theta[isp], rscl, bnorm] +efix=reals(1) +theta(ISP)=reals(2) +RSCL=reals(3) +BNORM=reals(4) +do n=1,m_d + xin(n)=x_in(n) + yin(n)=y_in(n) + ein(n)=e_in(n) + XDAT(n)=XD_in(n) +end do +do n=1,NB + xres(n)=X_r(n) + yres(n)=Y_r(n) + eres(n)=E_r(n) +end do +o_el=opft(1) +o_bgd=opft(2) +o_w1=opft(3) +do n=1,m_sp + DTNORM(n)=1.0 !DTNORM, NSPEC + XSCALE(n)=1.0 !XSCALE, NSPEC + yprob=0.0 +end do +lptfile='' +fileout1='' +fileout2='' +fileout3='' +l_lpt=l_fn+8 +lptfile(1:l_lpt)=sfile(1:l_fn)//'_QLd.lpt' +l_file=l_fn+8 +fileout1(1:l_lpt)=sfile(1:l_fn)//'_QLd.ql1' +fileout2(1:l_lpt)=sfile(1:l_fn)//'_QLd.ql2' +fileout3(1:l_lpt)=sfile(1:l_fn)//'_QLd.ql3' +l_title=9 +title='' +l_user=9 +user='' +if(o_w1.eq.1)then + do I=1,NSPEC + QW1(I)=Wy_in(I) + QW1(I)=0.5*(ABS(QW1(I))+0.00001) + SIGQW1(I)=We_in(I) + SIGQW1(I)=0.5*(ABS(SIGQW1(I))+0.00001) + end do +endif - if(ISP.eq.1)then !print info - call open_f(53,lptfile) - WRITE(53,1107)sfile -1107 format(' Sample run: ',a140) - WRITE(53,1108)rfile -1108 format(' Resolution file: ',a140) - write(53,1110)xin(imin),xin(imax) -1110 format(' Energy range: ',f8.3,' to ',f8.3,' meV') - if (o_el.eq.0) write(53,1111) - if (o_el.eq.1) write(53,1112) - if (o_bgd.eq.2) write(53,1113) - if (o_bgd.eq.1) write(53,1114) - if (o_bgd.eq.0) write(53,1115) -1111 format(' Elastic option : NO peak') -1112 format(' Elastic option : WITH peak') -1113 format(' Background option : sloping') -1114 format(' Background option : flat') -1115 format(' Background option : zero') - if(o_w1.eq.1)then - WRITE(53,1116) -1116 format(' Width option : fixed from file ') - else - WRITE(53,1117) -1117 format(' Width option : free ') - endif - close(unit=53) - call open_f(1,fileout1) - call open_f(2,fileout2) - call open_f(3,fileout3) - do n=1,3 - WRITE(n,*) ' Data : ',name - WRITE(n,100)title(1:l_title) - WRITE(n,100)user(1:l_user) - 100 FORMAT(2X,A) - write(n,120)NSPEC,NDAT,xin(imin),xin(imax) - 120 FORMAT(2X,2I10,2x,2f10.3) - WRITE(n,*)'-------------------------------------------------' - WRITE(n,1108)rfile - WRITE(n,121)n - 121 FORMAT(i3) - WRITE(n,*)'-------------------------------------------------' - close(unit=n) - end do - endif !end print -c - CALL VLFILL(LGOOD,.TRUE.,m_sp) - CALL BLRINT(XBLR,YBLR,NB,0,IDUF) - CALL DPINIT - CALL GDINIT - CALL DATIN(ISP,DTNORM,IDUF) - CALL BLRINT(XBLR,YBLR,NB,ISP,IDUF) - IF (IDUF.NE.0) THEN - LGOOD(ISP)=.FALSE. +if(ISP.eq.1)then !print info + call open_f(53,lptfile) + WRITE(53,1107)sfile +1107 format(' Sample run: ',a140) + WRITE(53,1108)rfile +1108 format(' Resolution file: ',a140) + write(53,1110)xin(imin),xin(imax) +1110 format(' Energy range: ',f8.3,' to ',f8.3,' meV') + if (o_el.eq.0) write(53,1111) + if (o_el.eq.1) write(53,1112) + if (o_bgd.eq.2) write(53,1113) + if (o_bgd.eq.1) write(53,1114) + if (o_bgd.eq.0) write(53,1115) +1111 format(' Elastic option : NO peak') +1112 format(' Elastic option : WITH peak') +1113 format(' Background option : sloping') +1114 format(' Background option : flat') +1115 format(' Background option : zero') + if(o_w1.eq.1)then + WRITE(53,1116) +1116 format(' Width option : fixed from file ') + else + WRITE(53,1117) +1117 format(' Width option : free ') + endif + close(unit=53) + call open_f(1,fileout1) + call open_f(2,fileout2) + call open_f(3,fileout3) + do n=1,3 + WRITE(n,*) ' Data : ',name + WRITE(n,100)title(1:l_title) + WRITE(n,100)user(1:l_user) +100 FORMAT(2X,A) + write(n,120)NSPEC,NDAT,xin(imin),xin(imax) +120 FORMAT(2X,2I10,2x,2f10.3) + WRITE(n,*)'-------------------------------------------------' + WRITE(n,1108)rfile + WRITE(n,121)n +121 FORMAT(i3) + WRITE(n,*)'-------------------------------------------------' + close(unit=n) + end do +endif !end print +! +CALL VLFILL(LGOOD,.TRUE.,m_sp) +CALL BLRINT(XBLR,YBLR,NB,0,IDUF) +CALL DPINIT +CALL GDINIT +CALL DATIN(ISP,DTNORM,IDUF) +CALL BLRINT(XBLR,YBLR,NB,ISP,IDUF) +IF (IDUF.NE.0) THEN + LGOOD(ISP)=.FALSE. +ENDIF +CALL DPINIT +CALL PRINIT(FITP,3,NFEW,1) +CALL FileInit(3,ISP) +CALL REFINA(GRAD,HESS,DPAR,3+NFEW,DETLOG,INDX,COVAR) +GOTO 2 +1 CALL SEARCH(GRAD,HESS,DPAR,NFEW,INDX,COVAR,FITP) +2 NPARMS=4+2*NFEW +CHIOLD=CCHI(FITP) +CALL VCOPY(FITP,FITPSV,NPARMS) +STEPSZ=0.3 +IF (NFEW.GT.1) STEPSZ=STEPSZ/10.0 +IAGAIN=0 +CDIFMN=0.003 + DO 10 I=1,200 + CALL REFINE(GRAD,HESS,NPARMS,DETLOG,INDX,COVAR,STEPSZ) + CALL NEWEST(COVAR,GRAD,NPARMS,NFEW,DPAR,FITP) + CNORM=CCHI(FITP) + IF (CNORM.LE.CHIOLD) THEN + CHIDIF=(CHIOLD-CNORM)/CNORM + IF (ABS(CHIDIF).LE.CDIFMN) THEN + IF (IAGAIN.EQ.0) THEN + CDIFMN=0.00005 + STEPSZ=0.15 + IAGAIN=1 + ELSE + GOTO 3 + ENDIF ENDIF - CALL DPINIT - CALL PRINIT(FITP,3,NFEW,1) - CALL FileInit(3,ISP) - CALL REFINA(GRAD,HESS,DPAR,3+NFEW,DETLOG,INDX,COVAR) - GOTO 2 - 1 CALL SEARCH(GRAD,HESS,DPAR,NFEW,INDX,COVAR,FITP) - 2 NPARMS=4+2*NFEW - CHIOLD=CCHI(FITP) + CHIOLD=CNORM CALL VCOPY(FITP,FITPSV,NPARMS) - STEPSZ=0.3 - IF (NFEW.GT.1) STEPSZ=STEPSZ/10.0 - IAGAIN=0 - CDIFMN=0.003 - DO 10 I=1,200 - CALL REFINE(GRAD,HESS,NPARMS,DETLOG,INDX,COVAR,STEPSZ) - CALL NEWEST(COVAR,GRAD,NPARMS,NFEW,DPAR,FITP) - CNORM=CCHI(FITP) - IF (CNORM.LE.CHIOLD) THEN - CHIDIF=(CHIOLD-CNORM)/CNORM - IF (ABS(CHIDIF).LE.CDIFMN) THEN - IF (IAGAIN.EQ.0) THEN - CDIFMN=0.00005 - STEPSZ=0.15 - IAGAIN=1 - ELSE - GOTO 3 - ENDIF - ENDIF - CHIOLD=CNORM - CALL VCOPY(FITP,FITPSV,NPARMS) - ELSE - CALL VCOPY(FITPSV,FITP,NPARMS) - STEPSZ=STEPSZ*0.6 - IF (STEPSZ.LT.1.0E-10) GOTO 3 - ENDIF - 10 CONTINUE - 3 CALL REFINE(GRAD,HESS,NPARMS,DETLOG,INDX,COVAR,0.7) - CALL ERRBAR(COVAR,NPARMS,SIGPAR) - CALL SEEFIT(SIGPAR,CNORM,PRMSV(1,NFEW+1,ISP), - 1 SIGSV(1,NFEW+1,ISP)) - CALL OUTPRM(FITP,COVAR,NPARMS,NFEW,CNORM) - CALL REFINE(GRAD,HESS,NPARMS,DETLOG,INDX,COVAR,0.25) - CALL PROBN(CNORM,numb(4),DETLOG,NFEW,3,PRBSV(1,ISP)) - noff=NDAT*NFEW - do n=1,NDAT - yfit(noff+n)=FIT(n) - end do - NFEW=NFEW+1 - if (o_el.eq.0) then !no peak - FITP(3)=0.0 - FITPSV(3)=0.0 - endif - IF (NFEW.LE.3) GOTO 1 - nd_out=NDAT - do n=1,nd_out - xout(n)=XDAT(n) - yout(n)=DAT(n) - if(SIG(n).gt.1.0e-10)then - eout(n)=SQRT(2.0/SIG(n)) - else - eout(n)=0. - endif - end do - CALL PRBOUT(PRBSV,4,ISP,POUT) - do l=1,4 - yprob(l)=POUT(l,isp) - end do - RETURN - END + ELSE + CALL VCOPY(FITPSV,FITP,NPARMS) + STEPSZ=STEPSZ*0.6 + IF (STEPSZ.LT.1.0E-10) GOTO 3 + ENDIF +10 CONTINUE +3 CALL REFINE(GRAD,HESS,NPARMS,DETLOG,INDX,COVAR,0.7) +CALL ERRBAR(COVAR,NPARMS,SIGPAR) +CALL SEEFIT(SIGPAR,CNORM,PRMSV(1,NFEW+1,ISP), & + SIGSV(1,NFEW+1,ISP)) +CALL OUTPRM(FITP,COVAR,NPARMS,NFEW,CNORM) +CALL REFINE(GRAD,HESS,NPARMS,DETLOG,INDX,COVAR,0.25) +CALL PROBN(CNORM,numb(4),DETLOG,NFEW,3,PRBSV(1,ISP)) +noff=NDAT*NFEW +do n=1,NDAT + yfit(noff+n)=FIT(n) +end do +NFEW=NFEW+1 +if (o_el.eq.0) then !no peak + FITP(3)=0.0 + FITPSV(3)=0.0 +endif +IF (NFEW.LE.3) GOTO 1 +nd_out=NDAT +do n=1,nd_out + xout(n)=XDAT(n) + yout(n)=DAT(n) + if(SIG(n).gt.1.0e-10)then + eout(n)=SQRT(2.0/SIG(n)) + else + eout(n)=0. + endif +end do +CALL PRBOUT(PRBSV,4,ISP,POUT) +do l=1,4 + yprob(l)=POUT(l,isp) +end do +RETURN +END diff --git a/quasielasticbayes/QLdata_subs.f90 b/quasielasticbayes/QLdata_subs.f90 index a0467b7..0a89d11 100644 --- a/quasielasticbayes/QLdata_subs.f90 +++ b/quasielasticbayes/QLdata_subs.f90 @@ -1,546 +1,546 @@ - SUBROUTINE init_paras - INCLUDE 'res_par.f90' - COMMON /FFTCOM/ FRES(m_d2),FWRK(m_d2),XJ(m_d),TWOPIK(m_d1),NFFT - COMMON /DATCOM/ XDAT(m_d),DAT(m_d),SIG(m_d),NDAT - COMMON /DINTRP/ IPDAT(m_d),XPDAT(m_d) - COMMON /FITCOM/ FIT(m_d),RESID(m_d),NFEW,FITP(m_p),EXPF(m_d1,6) - COMMON /SCLCOM/ BSCL,ASCL,WSCL,SCLVEC(m_p,2),GSCL - COMMON /GRDCOM/ DDDPAR(m_d,m_p),FR2PIK(m_d2,2) - COMMON /QW1COM/ QW1(m_sp),SIGQW1(m_sp),ISPEC - COMMON /WRKCOM/ WORK(m_d2,2) - do n=1,m_d - XJ(n)=0.0 - XDAT(n)=0.0 - DAT(n)=0.0 - SIG(n)=0.0 - IPDAT(n)=0 - XPDAT(n)=0.0 - FIT(n)=0.0 - RESID(n)=0.0 - do m=1,m_p - DDDPAR(n,m)=0.0 - end do - end do - do n=1,m_d1 - TWOPIK(n)=0.0 - do m=1,3 - EXPF(n,m)=0.0 - end do - end do - do n=1,m_d2 - FRES(n)=0.0 - FWRK(n)=0.0 - do m=1,2 - FR2PIK(n,m)=0.0 - WORK(n,m)=0.0 - end do - end do - do n=1,m_p - FITP(n)=0.0 - do m=1,2 - SCLVEC(n,m)=0.0 - end do - end do - do n=1,m_sp - QW1(n)=0.0 - SIGQW1(n)=0.0 - end do - RETURN - END -C ------------------------------------ - SUBROUTINE OUTPRM(P,C,NP,NFEW,CNORM) - INCLUDE 'mod_files.f90' - REAL P(*),C(NP,*) - IF (NFEW.LT.1 .OR. NFEW.GT.3) RETURN - OPEN(UNIT=1,FILE=fileout1,STATUS='old',FORM='formatted', - 1 access='append') - OPEN(UNIT=2,FILE=fileout2,STATUS='old',FORM='formatted', - 1 access='append') - OPEN(UNIT=3,FILE=fileout3,STATUS='old',FORM='formatted', - 1 access='append') - WRITE(NFEW,100) P(3),P(1),P(2),P(4) - do I=5,NP,2 - WRITE(NFEW,100) P(I),P(I+1) - end do - CSCALE=2.0*CNORM - do J=1,NP - do I=1,NP - C(I,J)=CSCALE*C(I,J) - end do - end do - WRITE(NFEW,100) C(3,3) - WRITE(NFEW,100) C(3,5),C(5,5) - WRITE(NFEW,100) C(3,6),C(5,6),C(6,6) - IF (NFEW.GT.1) THEN - WRITE(NFEW,100) C(3,7),C(5,7),C(6,7),C(7,7) - WRITE(NFEW,100) C(3,8),C(5,8),C(6,8),C(7,8),C(8,8) - ENDIF - IF (NFEW.GT.2) THEN - WRITE(NFEW,100) C(3,9),C(5,9),C(6,9),C(7,9),C(8,9),C(9,9) - WRITE(NFEW,100) C(3,10),C(5,10),C(6,10),C(7,10),C(8,10), - 1 C(9,10),C(10,10) - ENDIF - 100 FORMAT(1PE13.4,6E13.4) - WRITE(NFEW,*)' -------------------------------------------------' - close(unit=1) - close(unit=2) - close(unit=3) - END -C -C************************************************* +SUBROUTINE init_paras +INCLUDE 'res_par.f90' +COMMON /FFTCOM/ FRES(m_d2),FWRK(m_d2),XJ(m_d),TWOPIK(m_d1),NFFT +COMMON /DATCOM/ XDAT(m_d),DAT(m_d),SIG(m_d),NDAT +COMMON /DINTRP/ IPDAT(m_d),XPDAT(m_d) +COMMON /FITCOM/ FIT(m_d),RESID(m_d),NFEW,FITP(m_p),EXPF(m_d1,6) +COMMON /SCLCOM/ BSCL,ASCL,WSCL,SCLVEC(m_p,2),GSCL +COMMON /GRDCOM/ DDDPAR(m_d,m_p),FR2PIK(m_d2,2) +COMMON /QW1COM/ QW1(m_sp),SIGQW1(m_sp),ISPEC +COMMON /WRKCOM/ WORK(m_d2,2) +do n=1,m_d + XJ(n)=0.0 + XDAT(n)=0.0 + DAT(n)=0.0 + SIG(n)=0.0 + IPDAT(n)=0 + XPDAT(n)=0.0 + FIT(n)=0.0 + RESID(n)=0.0 + do m=1,m_p + DDDPAR(n,m)=0.0 + end do +end do +do n=1,m_d1 + TWOPIK(n)=0.0 + do m=1,3 + EXPF(n,m)=0.0 + end do +end do +do n=1,m_d2 + FRES(n)=0.0 + FWRK(n)=0.0 + do m=1,2 + FR2PIK(n,m)=0.0 + WORK(n,m)=0.0 + end do +end do +do n=1,m_p + FITP(n)=0.0 + do m=1,2 + SCLVEC(n,m)=0.0 + end do +end do +do n=1,m_sp + QW1(n)=0.0 + SIGQW1(n)=0.0 +end do +RETURN +END +! ------------------------------------ +SUBROUTINE OUTPRM(P,C,NP,NFEW,CNORM) +INCLUDE 'mod_files.f90' +REAL P(*),C(NP,*) +IF (NFEW.LT.1 .OR. NFEW.GT.3) RETURN +OPEN(UNIT=1,FILE=fileout1,STATUS='old',FORM='formatted', & + access='append') +OPEN(UNIT=2,FILE=fileout2,STATUS='old',FORM='formatted', & + access='append') +OPEN(UNIT=3,FILE=fileout3,STATUS='old',FORM='formatted', & + access='append') +WRITE(NFEW,100) P(3),P(1),P(2),P(4) +do I=5,NP,2 + WRITE(NFEW,100) P(I),P(I+1) +end do +CSCALE=2.0*CNORM +do J=1,NP + do I=1,NP + C(I,J)=CSCALE*C(I,J) + end do +end do +WRITE(NFEW,100) C(3,3) +WRITE(NFEW,100) C(3,5),C(5,5) +WRITE(NFEW,100) C(3,6),C(5,6),C(6,6) +IF (NFEW.GT.1) THEN + WRITE(NFEW,100) C(3,7),C(5,7),C(6,7),C(7,7) + WRITE(NFEW,100) C(3,8),C(5,8),C(6,8),C(7,8),C(8,8) +ENDIF +IF (NFEW.GT.2) THEN + WRITE(NFEW,100) C(3,9),C(5,9),C(6,9),C(7,9),C(8,9),C(9,9) + WRITE(NFEW,100) C(3,10),C(5,10),C(6,10),C(7,10),C(8,10), & + C(9,10),C(10,10) +ENDIF +100 FORMAT(1PE13.4,6E13.4) +WRITE(NFEW,*)' -------------------------------------------------' +close(unit=1) +close(unit=2) +close(unit=3) +END +! +!************************************************* - SUBROUTINE BLRINT(XB,YB,NB,IREAD,IDUF) - INCLUDE 'res_par.f90' - INCLUDE 'mod_files.f90' - COMMON /FFTCOM/ FRES(m_d2),FWRK(m_d2),XJ(m_d),TWOPIK(m_d1),NFFT - COMMON /FITCOM/ FIT(m_d),RESID(m_d),NFEW,FITP(m_p),EXPF(m_d1,6) - COMMON /DATCOM/ XDAT(m_d),DAT(m_d),SIG(m_d),NDAT - COMMON/ModRes/ntr,xres,yres,eres,nrbin,ermin,ermax - REAL XB(m_d),YB(m_d),DER2(m_d),xr(m_d),yr(m_d),er(m_d) - real xres(m_d),yres(m_d),eres(m_d) - LOGICAL LSTART - DATA LSTART /.FALSE./ - if(IREAD.eq.0)then - LSTART=.FALSE. - else - LSTART=.TRUE. - endif - SMALL=1.0E-20 - NFFT=m_d - DO I=1,NB - xr(I)=xres(I) - yr(I)=yres(I) - er(I)=eres(I) - END DO - CALL BINBLR(xr,yr,er,NB,XB,YB,NRBIN) - XDMIN=XDAT(1) - XDMAX=XDAT(NDAT) - YMAX=0.0 - YSUM=0.0 - DO 10 I=1,NB - IF (XB(I).LT.XDMIN .OR. XB(I).GT.XDMAX) GOTO 10 - IF (YB(I).GT.YMAX) YMAX=YB(I) - YSUM=YSUM+YB(I) - 10 CONTINUE - IF (YSUM.LT.SMALL) THEN - OPEN(UNIT=53,FILE=lptfile,STATUS='old',FORM='formatted', - 1 access='append') - write(53,1000) -1000 format(' Ysum is too small') - IDUF=1 - close(unit=53) - RETURN - ENDIF - CALL XGINIT(XB,YB,NB,YMAX,XBMIN,XBMAX,LSTART) - CALL SPLINE(XB,YB,NB,0.0,0.0,DER2) - TWOPIN=2.0*3.141592654/FLOAT(NFFT) - CALL VRFILL(FRES,0.0,NFFT) - XX=0.0 - DXJ=XJ(2)-XJ(1) - CALL SPLINT(XB,YB,DER2,NB,XX,FRES(1)) - SUM=FRES(1) - do I=1,NFFT/2 - XX=XX+DXJ - IF (XX.LT.XBMAX) CALL SPLINT(XB,YB,DER2,NB,XX,FRES(I+1)) - IF (-XX.GT.XBMIN) CALL SPLINT(XB,YB,DER2,NB,-XX,FRES(NFFT+1-I)) - SUM=SUM+FRES(I+1)+FRES(NFFT+1-I) - TWOPIK(I)=TWOPIN*FLOAT(I-1) - end do - TWOPIK(NFFT/2+1)=TWOPIN*FLOAT(NFFT/2) - BNORM=1.0/(SUM*FLOAT(NFFT)) - do I=1,NFFT - FRES(I)=BNORM*FRES(I) - end do - CALL FOUR2(FRES,NFFT,1,1,0) - do I=3,NFFT,4 - FRES(I)=-FRES(I) - FRES(I+1)=-FRES(I+1) - end do - IF (.NOT. LSTART) THEN - CALL VCOPY(FRES,FWRK,NFFT+2) - CALL FOUR2(FWRK,NFFT,1,-1,-1) - ENDIF - LSTART=.TRUE. - END -C ----------------------------------------- - SUBROUTINE BINBLR(WX,WY,WE,NB,XB,YB,NBIN) - INCLUDE 'mod_files.f90' - REAL WX(*),WY(*),WE(*),XB(*),YB(*) - N=0 - SMALL=1.0E-20 - BNORM=1.0/FLOAT(NBIN) - do I=1,NB,NBIN - N=N+1 - XXD=0.0 - DD=0.0 - K=0 - do J=0,NBIN-1 - IJ=I+J - IF (IJ.LE.NB) THEN - XXD=XXD+WX(IJ) - IF (WE(IJ).GT.SMALL) THEN - K=K+1 - DD=DD+WY(IJ) - ENDIF - ENDIF - end do - XB(N)=BNORM*XXD - YB(N)=0.0 - IF (K.GT.0) YB(N)=BNORM*DD - end do - NB=N - close(unit=53) - END -C ---------------------------------------------------------------- - SUBROUTINE XGINIT(XB,YB,NB,YMAX,XMIN,XMAX,LST) - INCLUDE 'res_par.f90' - INCLUDE 'mod_files.f90' - COMMON /FFTCOM/ FRES(m_d2),FWRK(m_d2),XJ(m_d),TWOPIK(m_d1),NFFT - COMMON /DATCOM/ XDAT(m_d),DAT(m_d),SIG(m_d),NDAT - REAL XB(*),YB(*) - logical LST - XDMIN=XDAT(1) - XDMAX=XDAT(NDAT) - Y0=YMAX/10.0 - do I=1,NB - IF (YB(I).GE.Y0 .AND. XB(I).GT.XDMIN) GOTO 1 - end do - 1 XMIN=XB(I) - do I=NB,1,-1 - IF (YB(I).GE.Y0 .AND. XB(I).LT.XDMAX) GOTO 2 - end do - 2 XMAX=XB(I) - BWIDTH=XMAX-XMIN - DXJ=BWIDTH/20.0 - AXMAX=ABS(XDAT(1)) - IF (ABS(XDAT(NDAT)).GT.AXMAX) AXMAX=ABS(XDAT(NDAT)) - XNDMAX=500.0 - IF (NDAT.GT.INT(XNDMAX)) XNDMAX=FLOAT(NDAT) - DXDAT=2.0*AXMAX/XNDMAX - IF (DXDAT.GT.DXJ) DXJ=DXDAT - XNGD=(2.0*AXMAX)/DXJ - NGD=NINT(LOG(XNGD-1.0)/LOG(2.0))+1 - NGD=2**NGD - IF (NGD.GT.m_d) then - OPEN(UNIT=53,FILE=lptfile,STATUS='old',FORM='formatted', - 1 access='append') - WRITE(53,*)' ERROR in XGINIT : too many points' - close(unit=53) - RETURN - ENDIF - NFFT=NGD - XJ(1)=-DXJ*FLOAT(NFFT/2) - do I=2,NFFT - XJ(I)=XJ(I-1)+DXJ - end do - XMIN=XMIN-5.0*BWIDTH - XMAX=XMAX+5.0*BWIDTH - IF (XMIN.LT.XB(1)) XMIN=XB(1) - IF (XMAX.GT.XB(NB)) XMAX=XB(NB) - IF (XMIN.LT.XDMIN) XMIN=XDMIN - IF (XMAX.GT.XDMAX) XMAX=XDMAX - if(LST)then - OPEN(UNIT=53,FILE=lptfile,STATUS='old',FORM='formatted', - 1 access='append') - WRITE(53,110) XMIN,XMAX -110 FORMAT(' Resolution Range: ',F7.1,' to ',F7.1,' ueV') - close(unit=53) - endif - do I=1,NB - IF (XB(I).GE.XMIN) GOTO 4 - end do - 4 IMIN=I - do I=NB,1,-1 - IF (XB(I).LE.XMAX) GOTO 5 - end do - 5 IMAX=I - B1=0.0 - B2=0.0 - do I=1,5 - B1=B1+YB(IMIN+I-1) - B2=B2+YB(IMAX-I+1) - end do - B1=B1/5.0 - B2=B2/5.0 - DB=(B2-B1)/FLOAT(MAX(IMAX-IMIN-4,1)) - B=B1 - do I=IMIN,IMAX - YB(I)=YB(I)-B - B=B+DB - end do - END -C -C***************************************** -C - FUNCTION CCHI(V) - INCLUDE 'res_par.f90' - INCLUDE 'options.f90' - COMMON /FFTCOM/ FRES(m_d2),FWRK(m_d2),XJ(m_d),TWOPIK(m_d1),NFFT - COMMON /DATCOM/ XDAT(m_d),DAT(m_d),SIG(m_d),NDAT - COMMON /DINTRP/ IPDAT(m_d),XPDAT(m_d) - COMMON /FITCOM/ FIT(m_d),RESID(m_d),NFEW,FITP(m_p),EXPF(m_d1,6) - COMMON /SCLCOM/ BSCL,ASCL,WSCL,SCLVEC(m_p,2),GSCL - COMMON /GRDCOM/ DDDPAR(m_d,m_p),FR2PIK(m_d2,2) - COMMON /QW1COM/ QW1(m_sp),SIGQW1(m_sp),ISPEC - COMMON /WRKCOM/ WORK(m_d2,2) - REAL V(*) - CHI=0.0 - B1=BSCL*V(1) - B2=BSCL*V(2) - A0=ASCL*V(3) - DELTAX=V(4) - NFT2=NFFT/2+1 - CALL CXSHFT(FRES,DELTAX,TWOPIK,FR2PIK,FR2PIK(1,2),NFT2) - CALL VRFILL(WORK,A0,NFT2) - XNSCL=-LOG(1.0E-7)/(TWOPIK(2)-TWOPIK(1)) - do J=1,NFEW - AJ=ASCL*V(3+J+J) - SIGJ=WSCL*V(4+J+J)/GSCL - CALL VRFILL(EXPF(1,J),0.0,NFT2) - NXFT2=1+NINT(XNSCL/(ABS(SIGJ)+1.0E-10)) - IF (NXFT2.GT.NFT2) NXFT2=NFT2 - do I=1,NXFT2 - EXPIJ=EXP(-TWOPIK(I)*SIGJ) - EXPF(I,J)=EXPIJ - WORK(I,1)=WORK(I,1)+AJ*EXPIJ - end do - end do - CALL VMLTRC(WORK,FR2PIK,NFT2,FWRK) - CALL FOUR2(FWRK,NFFT,1,-1,-1) - CALL DEGRID(FWRK,FIT) - X1=XDAT(1) - if(o_bgd.eq.2) BNRM=(B2-B1)/(XDAT(NDAT)-X1) -C avoid conflict BNORM with ModPars - do I=1,NDAT - FIT(I)=FIT(I)+B1 - if(o_bgd.eq.2) FIT(I)=FIT(I)+BNRM*(XDAT(I)-X1) - DIF=FIT(I)-DAT(I) - RESID(I)=DIF*SIG(I) - CHI=CHI+DIF*RESID(I) - end do - if(o_w1.eq.1)then - if(NFEW.GE.1) then - RESW1D=(WSCL*V(6)-QW1(ISPEC))/SIGQW1(ISPEC) - CHI=CHI+2.0*RESW1D**2 - endif - endif - CCHI=CHI/(2.0*FLOAT(NDAT)) - END -C -C****************************** -C - SUBROUTINE SEARCH(GRAD,HESS,DPAR,NFEW,INDX,COVAR,FITP) - INCLUDE 'res_par.f90' - INCLUDE 'options.f90' - COMMON /SCLCOM/ BSCL,ASCL,WSCL,SCLVEC(m_p,2),GSCL - COMMON /QW1COM/ QW1(m_sp),SIGQW1(m_sp),ISPEC - REAL GRAD(*),HESS(*),DPAR(*),COVAR(*),FITP(*) - INTEGER INDX(*) - if(o_w1.eq.1)then - if (NFEW.GE.1) then - FITP(5)=0.1 - FITP(6)=QW1(ISPEC)/WSCL - if (NFEW.EQ.1) then - CALL REFINA(GRAD,HESS,DPAR,3+NFEW,DETLOG,INDX,COVAR) - RETURN - endif - endif - endif - J=4+2*NFEW - DXLOG=0.85 - NSRCH=NINT(LOG(5.0*GSCL/WSCL)/LOG(DXLOG)) - CMIN=1.0E20 - FITP(J-1)=0.1 - FITP(J)=1.0 - do I=1,NSRCH - CALL REFINA(GRAD,HESS,DPAR,3+NFEW,DETLOG,INDX,COVAR) - CNORM=CCHI(FITP) - IF (CNORM.LT.CMIN) THEN - CMIN=CNORM - SIGJ=FITP(J) - ENDIF - FITP(J)=FITP(J)*DXLOG - end do - FITP(J)=SIGJ - CALL REFINA(GRAD,HESS,DPAR,3+NFEW,DETLOG,INDX,COVAR) - END -C -C*********************************************************** -C - SUBROUTINE REFINE(GRAD,HESS,NP,DETLOG,INDX,COVAR,STEPSZ) - INCLUDE 'res_par.f90' - INCLUDE 'options.f90' - COMMON /FFTCOM/ FRES(m_d2),FWRK(m_d2),XJ(m_d),TWOPIK(m_d1),NFFT - COMMON /DATCOM/ XDAT(m_d),DAT(m_d),SIG(m_d),NDAT - COMMON /DINTRP/ IPDAT(m_d),XPDAT(m_d) - COMMON /FITCOM/ FIT(m_d),RESID(m_d),NFEW,FITP(m_p),EXPF(m_d1,6) - COMMON /SCLCOM/ BSCL,ASCL,WSCL,SCLVEC(m_p,2),GSCL - COMMON /WRKCOM/ WORK(m_d2,2) - COMMON /GRDCOM/ DDDPAR(m_d,m_p),FR2PIK(m_d2,2) - COMMON /QW1COM/ QW1(m_sp),SIGQW1(m_sp),ISPEC - REAL GRAD(*),HESS(NP,*),COVAR(NP,*) - INTEGER INDX(*) - NFT2=NFFT/2+1 - CNORM=CCHI(FITP) - CALL VRFILL(HESS,0.0,NP*NP) - CALL VMLTRC(WORK,FR2PIK(1,2),NFT2,FWRK) - CALL VMLTRC(TWOPIK,FWRK,NFT2,WORK) - CALL VMLTIC(WORK,NFT2,WORK) - CALL FOUR2(FWRK,NFFT,1,-1,-1) - CALL DEGRID(FWRK,DDDPAR(1,4)) - CALL FOUR2(WORK,NFFT,1,-1,-1) - CALL DEGRID(WORK,FWRK) - CALL VRDOTR(RESID,FWRK,NDAT,HESS(4,4)) - CALL VCOPY(FR2PIK,FWRK,NFFT+2) - CALL FOUR2(FWRK,NFFT,1,-1,-1) - CALL DEGRID(FWRK,DDDPAR(1,3)) - CALL VCOPY(FR2PIK(1,2),FWRK,NFFT+2) - CALL FOUR2(FWRK,NFFT,1,-1,-1) - CALL DEGRID(FWRK,WORK) - CALL VRDOTR(RESID,WORK,NDAT,HESS(3,4)) - HESS(4,3)=HESS(3,4) - do I=1,NFEW - J=3+I+I - AJ=FITP(J)*ASCL - CALL VMLTRC(EXPF(1,I),FR2PIK,NFT2,WORK) - CALL VCOPY(WORK,FWRK,NFFT+2) - CALL FOUR2(FWRK,NFFT,1,-1,-1) - CALL DEGRID(FWRK,DDDPAR(1,J)) - CALL VMLTRC(TWOPIK,WORK,NFT2,FWRK) - CALL VCOPY(FWRK,WORK,NFFT+2) - CALL FOUR2(FWRK,NFFT,1,-1,-1) - CALL DEGRID(FWRK,DDDPAR(1,J+1)) - CALL HESS0(HESS,NP,RESID,NDAT,DDDPAR(1,J+1),AJ,J) - CALL VMLTIC(WORK,NFT2,WORK) - CALL VCOPY(WORK,FWRK,NFFT+2) - CALL FOUR2(FWRK,NFFT,1,-1,-1) - CALL DEGRID(FWRK,WORK(1,2)) - CALL VRDOTR(RESID,WORK(1,2),NDAT,HESS(4,J)) - HESS(J,4)=HESS(4,J) - CALL VMLTRC(TWOPIK,WORK,NFT2,FWRK) - CALL VCOPY(FWRK,WORK,NFFT+2) - CALL FOUR2(FWRK,NFFT,1,-1,-1) - CALL DEGRID(FWRK,WORK(1,2)) - CALL VRDOTR(RESID,WORK(1,2),NDAT,SM) - HESS(4,J+1)=-AJ*SM - HESS(J+1,4)=HESS(4,J+1) - CALL VMLTIC(WORK,NFT2,WORK) - CALL FOUR2(WORK,NFFT,1,-1,-1) - CALL DEGRID(WORK,FWRK) - CALL VRDOTR(RESID,FWRK,NDAT,SM) - HESS(J+1,J+1)=-AJ*SM - end do - CALL GRADPR(GRAD,RESID,NDAT,NP,SCLVEC(1,2)) - CALL HESS1(HESS,NP,SCLVEC(1,2),STEPSZ,NFEW) - if(o_w1.eq.1)then - if (NP.GE.6) then - DIF=WSCL*FITP(6)-QW1(ISPEC) - SIG2=2.0/SIGQW1(ISPEC)**2 - GRAD(6)=GRAD(6)+SIG2*DIF*WSCL - HESS(6,6)=HESS(6,6)+SIG2*WSCL**2 - endif - endif - CALL INVERT(HESS,COVAR,NP,INDX,DETLOG) - END -C********************************************************** -C - SUBROUTINE SEEFIT(SIGPAR,CNORM,PRMSV,SIGSV) - INCLUDE 'res_par.f90' - INCLUDE 'mod_files.f90' - COMMON /DATCOM/ XDAT(m_d),DAT(m_d),SIG(m_d),NDAT - COMMON /FITCOM/ FIT(m_d),RESID(m_d),NFEW,FITP(m_p),EXPF(m_d1,6) - COMMON /SCLCOM/ BSCL,ASCL,WSCL,SCLVEC(m_p,2),GSCL - COMMON /WRKCOM/ WORK(m_d2,2) - REAL SIGPAR(*),PRMSV(*),SIGSV(*) - CHARACTER TITLE*80 - OPEN(UNIT=53,FILE=lptfile,STATUS='old',FORM='formatted', - 1 access='append') - ERRSCL=SQRT(CNORM) - WRITE(TITLE,100) NFEW - 100 FORMAT(' Best-fit assuming no. of quasi-elastic lines = ',I2) - WRITE(53,100) NFEW - WRITE(53,120) CNORM - 120 FORMAT(' >>> Normalised Chi-squared = ',F11.4) - WRITE(53,130) FITP(1)*BSCL,SIGPAR(1)*BSCL*ERRSCL - 130 FORMAT(' Background(Xmin) = ',1PE12.3,' +- ',E10.2) - WRITE(53,140) FITP(2)*BSCL,SIGPAR(2)*BSCL*ERRSCL - 140 FORMAT(' Background(Xmax) = ',1PE12.3,' +- ',E10.2) - WRITE(53,150) FITP(4)*GSCL*1000.0 - 1 ,SIGPAR(4)*GSCL*ERRSCL*1000.0 - 150 FORMAT(' Zero offset = ',F12.2,' +- ',F10.2,' ueV') - WRITE(53,*)' Elastic line' - WRITE(53,160) FITP(3)*ASCL,SIGPAR(3)*ASCL*ERRSCL - 160 FORMAT(5X,' Amplitude = ',1PE13.4,' +- ',E11.3) - PRMSV(1)=FITP(3)*ASCL - SIGSV(1)=SIGPAR(3)*ASCL*ERRSCL - do I=1,NFEW - J=4+I+I - WRITE(53,161) I - 161 FORMAT(' Quasi-elastic line ',I2) - WRITE(53,170) 2000.0*FITP(J)*WSCL, - 1 2000.0*SIGPAR(J)*WSCL*ERRSCL - 170 FORMAT(5X,' FWHM = ',F13.2,' +- ',F11.2,' ueV') - WRITE(53,180) FITP(J-1)*ASCL,SIGPAR(J-1)*ASCL*ERRSCL - 180 FORMAT(5X,' Amplitude = ',1PE13.4,' +- ',E11.3) - PRMSV(I+I)=FITP(J-1)*ASCL - SIGSV(I+I)=SIGPAR(J-1)*ASCL*ERRSCL - PRMSV(I+I+1)=2.0*FITP(J)*WSCL - SIGSV(I+I+1)=2.0*SIGPAR(J)*WSCL*ERRSCL - end do - close(unit=53) - END -C -C******************************************* -C - SUBROUTINE SPLINE(X,Y,N,YP1,YPN,Y2) - PARAMETER (NMAX=10000) - DIMENSION X(N),Y(N),Y2(N),U(NMAX) - IF (YP1.GT..99E30) THEN - Y2(1)=0. - U(1)=0. - ELSE - Y2(1)=-0.5 - U(1)=(3./(X(2)-X(1)))*((Y(2)-Y(1))/(X(2)-X(1))-YP1) - ENDIF - do I=2,N-1 - SIG=(X(I)-X(I-1))/(X(I+1)-X(I-1)) - P=SIG*Y2(I-1)+2. - Y2(I)=(SIG-1.)/P - U(I)=(6.*((Y(I+1)-Y(I))/(X(I+1)-X(I))-(Y(I)-Y(I-1)) - * /(X(I)-X(I-1)))/(X(I+1)-X(I-1))-SIG*U(I-1))/P - end do - IF (YPN.GT..99E30) THEN - QN=0. - UN=0. - ELSE - QN=0.5 - UN=(3./(X(N)-X(N-1)))*(YPN-(Y(N)-Y(N-1))/(X(N)-X(N-1))) - ENDIF - Y2(N)=(UN-QN*U(N-1))/(QN*Y2(N-1)+1.) - do K=N-1,1,-1 - Y2(K)=Y2(K)*Y2(K+1)+U(K) - end do - RETURN - END -C - SUBROUTINE SPLINT(XA,YA,Y2A,N,X,Y) - DIMENSION XA(N),YA(N),Y2A(N) - KLO=1 - KHI=N -1 IF (KHI-KLO.GT.1) THEN - K=(KHI+KLO)/2 - IF(XA(K).GT.X)THEN - KHI=K - ELSE - KLO=K - ENDIF - GOTO 1 +SUBROUTINE BLRINT(XB,YB,NB,IREAD,IDUF) +INCLUDE 'res_par.f90' +INCLUDE 'mod_files.f90' +COMMON /FFTCOM/ FRES(m_d2),FWRK(m_d2),XJ(m_d),TWOPIK(m_d1),NFFT +COMMON /FITCOM/ FIT(m_d),RESID(m_d),NFEW,FITP(m_p),EXPF(m_d1,6) +COMMON /DATCOM/ XDAT(m_d),DAT(m_d),SIG(m_d),NDAT +COMMON/ModRes/ntr,xres,yres,eres,nrbin,ermin,ermax +REAL XB(m_d),YB(m_d),DER2(m_d),xr(m_d),yr(m_d),er(m_d) +real xres(m_d),yres(m_d),eres(m_d) +LOGICAL LSTART +DATA LSTART /.FALSE./ +if(IREAD.eq.0)then + LSTART=.FALSE. +else + LSTART=.TRUE. +endif +SMALL=1.0E-20 +NFFT=m_d +DO I=1,NB + xr(I)=xres(I) + yr(I)=yres(I) + er(I)=eres(I) +END DO +CALL BINBLR(xr,yr,er,NB,XB,YB,NRBIN) +XDMIN=XDAT(1) +XDMAX=XDAT(NDAT) +YMAX=0.0 +YSUM=0.0 +DO 10 I=1,NB + IF (XB(I).LT.XDMIN .OR. XB(I).GT.XDMAX) GOTO 10 + IF (YB(I).GT.YMAX) YMAX=YB(I) + YSUM=YSUM+YB(I) +10 CONTINUE +IF (YSUM.LT.SMALL) THEN + OPEN(UNIT=53,FILE=lptfile,STATUS='old',FORM='formatted', & + access='append') + write(53,1000) +1000 format(' Ysum is too small') + IDUF=1 + close(unit=53) + RETURN +ENDIF +CALL XGINIT(XB,YB,NB,YMAX,XBMIN,XBMAX,LSTART) +CALL SPLINE(XB,YB,NB,0.0,0.0,DER2) +TWOPIN=2.0*3.141592654/FLOAT(NFFT) +CALL VRFILL(FRES,0.0,NFFT) +XX=0.0 +DXJ=XJ(2)-XJ(1) +CALL SPLINT(XB,YB,DER2,NB,XX,FRES(1)) +SUM=FRES(1) +do I=1,NFFT/2 + XX=XX+DXJ + IF (XX.LT.XBMAX) CALL SPLINT(XB,YB,DER2,NB,XX,FRES(I+1)) + IF (-XX.GT.XBMIN) CALL SPLINT(XB,YB,DER2,NB,-XX,FRES(NFFT+1-I)) + SUM=SUM+FRES(I+1)+FRES(NFFT+1-I) + TWOPIK(I)=TWOPIN*FLOAT(I-1) +end do +TWOPIK(NFFT/2+1)=TWOPIN*FLOAT(NFFT/2) +BNORM=1.0/(SUM*FLOAT(NFFT)) +do I=1,NFFT + FRES(I)=BNORM*FRES(I) +end do +CALL FOUR2(FRES,NFFT,1,1,0) +do I=3,NFFT,4 + FRES(I)=-FRES(I) + FRES(I+1)=-FRES(I+1) +end do +IF (.NOT. LSTART) THEN + CALL VCOPY(FRES,FWRK,NFFT+2) + CALL FOUR2(FWRK,NFFT,1,-1,-1) +ENDIF +LSTART=.TRUE. +END +! ----------------------------------------- +SUBROUTINE BINBLR(WX,WY,WE,NB,XB,YB,NBIN) +INCLUDE 'mod_files.f90' +REAL WX(*),WY(*),WE(*),XB(*),YB(*) +N=0 +SMALL=1.0E-20 +BNORM=1.0/FLOAT(NBIN) +do I=1,NB,NBIN + N=N+1 + XXD=0.0 + DD=0.0 + K=0 + do J=0,NBIN-1 + IJ=I+J + IF (IJ.LE.NB) THEN + XXD=XXD+WX(IJ) + IF (WE(IJ).GT.SMALL) THEN + K=K+1 + DD=DD+WY(IJ) ENDIF - H=XA(KHI)-XA(KLO) - IF (H.EQ.0.) STOP 'Bad XA input.' - A=(XA(KHI)-X)/H - B=(X-XA(KLO))/H - Y=A*YA(KLO)+B*YA(KHI)+ - * ((A**3-A)*Y2A(KLO)+(B**3-B)*Y2A(KHI))*(H**2)/6. - RETURN - END + ENDIF + end do + XB(N)=BNORM*XXD + YB(N)=0.0 + IF (K.GT.0) YB(N)=BNORM*DD +end do +NB=N +close(unit=53) +END +! ---------------------------------------------------------------- +SUBROUTINE XGINIT(XB,YB,NB,YMAX,XMIN,XMAX,LST) +INCLUDE 'res_par.f90' +INCLUDE 'mod_files.f90' +COMMON /FFTCOM/ FRES(m_d2),FWRK(m_d2),XJ(m_d),TWOPIK(m_d1),NFFT +COMMON /DATCOM/ XDAT(m_d),DAT(m_d),SIG(m_d),NDAT +REAL XB(*),YB(*) +logical LST +XDMIN=XDAT(1) +XDMAX=XDAT(NDAT) +Y0=YMAX/10.0 +do I=1,NB + IF (YB(I).GE.Y0 .AND. XB(I).GT.XDMIN) GOTO 1 +end do +1 XMIN=XB(I) +do I=NB,1,-1 + IF (YB(I).GE.Y0 .AND. XB(I).LT.XDMAX) GOTO 2 +end do +2 XMAX=XB(I) +BWIDTH=XMAX-XMIN +DXJ=BWIDTH/20.0 +AXMAX=ABS(XDAT(1)) +IF (ABS(XDAT(NDAT)).GT.AXMAX) AXMAX=ABS(XDAT(NDAT)) +XNDMAX=500.0 +IF (NDAT.GT.INT(XNDMAX)) XNDMAX=FLOAT(NDAT) +DXDAT=2.0*AXMAX/XNDMAX +IF (DXDAT.GT.DXJ) DXJ=DXDAT +XNGD=(2.0*AXMAX)/DXJ +NGD=NINT(LOG(XNGD-1.0)/LOG(2.0))+1 +NGD=2**NGD +if (NGD.GT.m_d) then + OPEN(UNIT=53,FILE=lptfile,STATUS='old',FORM='formatted', & + access='append') + WRITE(53,*)' ERROR in XGINIT : too many points' + close(unit=53) + RETURN +ENDIF +NFFT=NGD +XJ(1)=-DXJ*FLOAT(NFFT/2) +do I=2,NFFT + XJ(I)=XJ(I-1)+DXJ +end do +XMIN=XMIN-5.0*BWIDTH +XMAX=XMAX+5.0*BWIDTH +IF (XMIN.LT.XB(1)) XMIN=XB(1) +IF (XMAX.GT.XB(NB)) XMAX=XB(NB) +IF (XMIN.LT.XDMIN) XMIN=XDMIN +IF (XMAX.GT.XDMAX) XMAX=XDMAX +if(LST)then + OPEN(UNIT=53,FILE=lptfile,STATUS='old',FORM='formatted', & + access='append') + WRITE(53,110) XMIN,XMAX +110 FORMAT(' Resolution Range: ',F7.1,' to ',F7.1,' ueV') + close(unit=53) +endif +do I=1,NB + IF (XB(I).GE.XMIN) GOTO 4 +end do +4 IMIN=I +do I=NB,1,-1 + IF (XB(I).LE.XMAX) GOTO 5 +end do +5 IMAX=I +B1=0.0 +B2=0.0 +do I=1,5 + B1=B1+YB(IMIN+I-1) + B2=B2+YB(IMAX-I+1) +end do +B1=B1/5.0 +B2=B2/5.0 +DB=(B2-B1)/FLOAT(MAX(IMAX-IMIN-4,1)) +B=B1 +do I=IMIN,IMAX + YB(I)=YB(I)-B + B=B+DB +end do +END +! +!***************************************** +! +FUNCTION CCHI(V) +INCLUDE 'res_par.f90' +INCLUDE 'options.f90' +COMMON /FFTCOM/ FRES(m_d2),FWRK(m_d2),XJ(m_d),TWOPIK(m_d1),NFFT +COMMON /DATCOM/ XDAT(m_d),DAT(m_d),SIG(m_d),NDAT +COMMON /DINTRP/ IPDAT(m_d),XPDAT(m_d) +COMMON /FITCOM/ FIT(m_d),RESID(m_d),NFEW,FITP(m_p),EXPF(m_d1,6) +COMMON /SCLCOM/ BSCL,ASCL,WSCL,SCLVEC(m_p,2),GSCL +COMMON /GRDCOM/ DDDPAR(m_d,m_p),FR2PIK(m_d2,2) +COMMON /QW1COM/ QW1(m_sp),SIGQW1(m_sp),ISPEC +COMMON /WRKCOM/ WORK(m_d2,2) +REAL V(*) +CHI=0.0 +B1=BSCL*V(1) +B2=BSCL*V(2) +A0=ASCL*V(3) +DELTAX=V(4) +NFT2=NFFT/2+1 +CALL CXSHFT(FRES,DELTAX,TWOPIK,FR2PIK,FR2PIK(1,2),NFT2) +CALL VRFILL(WORK,A0,NFT2) +XNSCL=-LOG(1.0E-7)/(TWOPIK(2)-TWOPIK(1)) +do J=1,NFEW + AJ=ASCL*V(3+J+J) + SIGJ=WSCL*V(4+J+J)/GSCL + CALL VRFILL(EXPF(1,J),0.0,NFT2) + NXFT2=1+NINT(XNSCL/(ABS(SIGJ)+1.0E-10)) + IF (NXFT2.GT.NFT2) NXFT2=NFT2 + do I=1,NXFT2 + EXPIJ=EXP(-TWOPIK(I)*SIGJ) + EXPF(I,J)=EXPIJ + WORK(I,1)=WORK(I,1)+AJ*EXPIJ + end do +end do +CALL VMLTRC(WORK,FR2PIK,NFT2,FWRK) +CALL FOUR2(FWRK,NFFT,1,-1,-1) +CALL DEGRID(FWRK,FIT) +X1=XDAT(1) +if(o_bgd.eq.2) BNRM=(B2-B1)/(XDAT(NDAT)-X1) +! avoid conflict BNORM with ModPars +do I=1,NDAT + FIT(I)=FIT(I)+B1 + if(o_bgd.eq.2) FIT(I)=FIT(I)+BNRM*(XDAT(I)-X1) + DIF=FIT(I)-DAT(I) + RESID(I)=DIF*SIG(I) + CHI=CHI+DIF*RESID(I) +end do +if(o_w1.eq.1)then + if(NFEW.GE.1) then + RESW1D=(WSCL*V(6)-QW1(ISPEC))/SIGQW1(ISPEC) + CHI=CHI+2.0*RESW1D**2 + endif +endif +CCHI=CHI/(2.0*FLOAT(NDAT)) +END +! +!****************************** +! +SUBROUTINE SEARCH(GRAD,HESS,DPAR,NFEW,INDX,COVAR,FITP) +INCLUDE 'res_par.f90' +INCLUDE 'options.f90' +COMMON /SCLCOM/ BSCL,ASCL,WSCL,SCLVEC(m_p,2),GSCL +COMMON /QW1COM/ QW1(m_sp),SIGQW1(m_sp),ISPEC +REAL GRAD(*),HESS(*),DPAR(*),COVAR(*),FITP(*) +INTEGER INDX(*) +if(o_w1.eq.1)then + if (NFEW.GE.1) then + FITP(5)=0.1 + FITP(6)=QW1(ISPEC)/WSCL + if (NFEW.EQ.1) then + CALL REFINA(GRAD,HESS,DPAR,3+NFEW,DETLOG,INDX,COVAR) + RETURN + endif + endif +endif +J=4+2*NFEW +DXLOG=0.85 +NSRCH=NINT(LOG(5.0*GSCL/WSCL)/LOG(DXLOG)) +CMIN=1.0E20 +FITP(J-1)=0.1 +FITP(J)=1.0 +do I=1,NSRCH + CALL REFINA(GRAD,HESS,DPAR,3+NFEW,DETLOG,INDX,COVAR) + CNORM=CCHI(FITP) + IF (CNORM.LT.CMIN) THEN + CMIN=CNORM + SIGJ=FITP(J) + ENDIF + FITP(J)=FITP(J)*DXLOG +end do +FITP(J)=SIGJ +CALL REFINA(GRAD,HESS,DPAR,3+NFEW,DETLOG,INDX,COVAR) +END +! +!*********************************************************** +! +SUBROUTINE REFINE(GRAD,HESS,NP,DETLOG,INDX,COVAR,STEPSZ) +INCLUDE 'res_par.f90' +INCLUDE 'options.f90' +COMMON /FFTCOM/ FRES(m_d2),FWRK(m_d2),XJ(m_d),TWOPIK(m_d1),NFFT +COMMON /DATCOM/ XDAT(m_d),DAT(m_d),SIG(m_d),NDAT +COMMON /DINTRP/ IPDAT(m_d),XPDAT(m_d) +COMMON /FITCOM/ FIT(m_d),RESID(m_d),NFEW,FITP(m_p),EXPF(m_d1,6) +COMMON /SCLCOM/ BSCL,ASCL,WSCL,SCLVEC(m_p,2),GSCL +COMMON /WRKCOM/ WORK(m_d2,2) +COMMON /GRDCOM/ DDDPAR(m_d,m_p),FR2PIK(m_d2,2) +COMMON /QW1COM/ QW1(m_sp),SIGQW1(m_sp),ISPEC +REAL GRAD(*),HESS(NP,*),COVAR(NP,*) +INTEGER INDX(*) +NFT2=NFFT/2+1 +CNORM=CCHI(FITP) +CALL VRFILL(HESS,0.0,NP*NP) +CALL VMLTRC(WORK,FR2PIK(1,2),NFT2,FWRK) +CALL VMLTRC(TWOPIK,FWRK,NFT2,WORK) +CALL VMLTIC(WORK,NFT2,WORK) +CALL FOUR2(FWRK,NFFT,1,-1,-1) +CALL DEGRID(FWRK,DDDPAR(1,4)) +CALL FOUR2(WORK,NFFT,1,-1,-1) +CALL DEGRID(WORK,FWRK) +CALL VRDOTR(RESID,FWRK,NDAT,HESS(4,4)) +CALL VCOPY(FR2PIK,FWRK,NFFT+2) +CALL FOUR2(FWRK,NFFT,1,-1,-1) +CALL DEGRID(FWRK,DDDPAR(1,3)) +CALL VCOPY(FR2PIK(1,2),FWRK,NFFT+2) +CALL FOUR2(FWRK,NFFT,1,-1,-1) +CALL DEGRID(FWRK,WORK) +CALL VRDOTR(RESID,WORK,NDAT,HESS(3,4)) +HESS(4,3)=HESS(3,4) +do I=1,NFEW + J=3+I+I + AJ=FITP(J)*ASCL + CALL VMLTRC(EXPF(1,I),FR2PIK,NFT2,WORK) + CALL VCOPY(WORK,FWRK,NFFT+2) + CALL FOUR2(FWRK,NFFT,1,-1,-1) + CALL DEGRID(FWRK,DDDPAR(1,J)) + CALL VMLTRC(TWOPIK,WORK,NFT2,FWRK) + CALL VCOPY(FWRK,WORK,NFFT+2) + CALL FOUR2(FWRK,NFFT,1,-1,-1) + CALL DEGRID(FWRK,DDDPAR(1,J+1)) + CALL HESS0(HESS,NP,RESID,NDAT,DDDPAR(1,J+1),AJ,J) + CALL VMLTIC(WORK,NFT2,WORK) + CALL VCOPY(WORK,FWRK,NFFT+2) + CALL FOUR2(FWRK,NFFT,1,-1,-1) + CALL DEGRID(FWRK,WORK(1,2)) + CALL VRDOTR(RESID,WORK(1,2),NDAT,HESS(4,J)) + HESS(J,4)=HESS(4,J) + CALL VMLTRC(TWOPIK,WORK,NFT2,FWRK) + CALL VCOPY(FWRK,WORK,NFFT+2) + CALL FOUR2(FWRK,NFFT,1,-1,-1) + CALL DEGRID(FWRK,WORK(1,2)) + CALL VRDOTR(RESID,WORK(1,2),NDAT,SM) + HESS(4,J+1)=-AJ*SM + HESS(J+1,4)=HESS(4,J+1) + CALL VMLTIC(WORK,NFT2,WORK) + CALL FOUR2(WORK,NFFT,1,-1,-1) + CALL DEGRID(WORK,FWRK) + CALL VRDOTR(RESID,FWRK,NDAT,SM) + HESS(J+1,J+1)=-AJ*SM +end do +CALL GRADPR(GRAD,RESID,NDAT,NP,SCLVEC(1,2)) +CALL HESS1(HESS,NP,SCLVEC(1,2),STEPSZ,NFEW) +if(o_w1.eq.1)then + if (NP.GE.6) then + DIF=WSCL*FITP(6)-QW1(ISPEC) + SIG2=2.0/SIGQW1(ISPEC)**2 + GRAD(6)=GRAD(6)+SIG2*DIF*WSCL + HESS(6,6)=HESS(6,6)+SIG2*WSCL**2 + endif +endif +CALL INVERT(HESS,COVAR,NP,INDX,DETLOG) +END +!********************************************************** +! +SUBROUTINE SEEFIT(SIGPAR,CNORM,PRMSV,SIGSV) +INCLUDE 'res_par.f90' +INCLUDE 'mod_files.f90' +COMMON /DATCOM/ XDAT(m_d),DAT(m_d),SIG(m_d),NDAT +COMMON /FITCOM/ FIT(m_d),RESID(m_d),NFEW,FITP(m_p),EXPF(m_d1,6) +COMMON /SCLCOM/ BSCL,ASCL,WSCL,SCLVEC(m_p,2),GSCL +COMMON /WRKCOM/ WORK(m_d2,2) +REAL SIGPAR(*),PRMSV(*),SIGSV(*) +CHARACTER TITLE*80 +OPEN(UNIT=53,FILE=lptfile,STATUS='old',FORM='formatted', & + access='append') +ERRSCL=SQRT(CNORM) +WRITE(TITLE,100) NFEW +100 FORMAT(' Best-fit assuming no. of quasi-elastic lines = ',I2) +WRITE(53,100) NFEW +WRITE(53,120) CNORM +120 FORMAT(' >>> Normalised Chi-squared = ',F11.4) +WRITE(53,130) FITP(1)*BSCL,SIGPAR(1)*BSCL*ERRSCL +130 FORMAT(' Background(Xmin) = ',1PE12.3,' +- ',E10.2) +WRITE(53,140) FITP(2)*BSCL,SIGPAR(2)*BSCL*ERRSCL +140 FORMAT(' Background(Xmax) = ',1PE12.3,' +- ',E10.2) +WRITE(53,150) FITP(4)*GSCL*1000.0 & + ,SIGPAR(4)*GSCL*ERRSCL*1000.0 +150 FORMAT(' Zero offset = ',F12.2,' +- ',F10.2,' ueV') +WRITE(53,*)' Elastic line' +WRITE(53,160) FITP(3)*ASCL,SIGPAR(3)*ASCL*ERRSCL +160 FORMAT(5X,' Amplitude = ',1PE13.4,' +- ',E11.3) +PRMSV(1)=FITP(3)*ASCL +SIGSV(1)=SIGPAR(3)*ASCL*ERRSCL +do I=1,NFEW + J=4+I+I + WRITE(53,161) I +161 FORMAT(' Quasi-elastic line ',I2) + WRITE(53,170) 2000.0*FITP(J)*WSCL, & + 2000.0*SIGPAR(J)*WSCL*ERRSCL +170 FORMAT(5X,' FWHM = ',F13.2,' +- ',F11.2,' ueV') + WRITE(53,180) FITP(J-1)*ASCL,SIGPAR(J-1)*ASCL*ERRSCL +180 FORMAT(5X,' Amplitude = ',1PE13.4,' +- ',E11.3) + PRMSV(I+I)=FITP(J-1)*ASCL + SIGSV(I+I)=SIGPAR(J-1)*ASCL*ERRSCL + PRMSV(I+I+1)=2.0*FITP(J)*WSCL + SIGSV(I+I+1)=2.0*SIGPAR(J)*WSCL*ERRSCL +end do +close(unit=53) +END +! +!******************************************* +! +SUBROUTINE SPLINE(X,Y,N,YP1,YPN,Y2) +PARAMETER (NMAX=10000) +DIMENSION X(N),Y(N),Y2(N),U(NMAX) +IF (YP1.GT..99E30) THEN + Y2(1)=0. + U(1)=0. +ELSE + Y2(1)=-0.5 + U(1)=(3./(X(2)-X(1)))*((Y(2)-Y(1))/(X(2)-X(1))-YP1) +ENDIF +do I=2,N-1 + SIG=(X(I)-X(I-1))/(X(I+1)-X(I-1)) + P=SIG*Y2(I-1)+2. + Y2(I)=(SIG-1.)/P + U(I)=(6.*((Y(I+1)-Y(I))/(X(I+1)-X(I))-(Y(I)-Y(I-1)) & + /(X(I)-X(I-1)))/(X(I+1)-X(I-1))-SIG*U(I-1))/P +end do +IF (YPN.GT..99E30) THEN + QN=0. + UN=0. +ELSE + QN=0.5 + UN=(3./(X(N)-X(N-1)))*(YPN-(Y(N)-Y(N-1))/(X(N)-X(N-1))) +ENDIF +Y2(N)=(UN-QN*U(N-1))/(QN*Y2(N-1)+1.) +do K=N-1,1,-1 + Y2(K)=Y2(K)*Y2(K+1)+U(K) +end do +RETURN +END +! +SUBROUTINE SPLINT(XA,YA,Y2A,N,X,Y) +DIMENSION XA(N),YA(N),Y2A(N) +KLO=1 +KHI=N +1 IF (KHI-KLO.GT.1) THEN + K=(KHI+KLO)/2 + IF(XA(K).GT.X)THEN + KHI=K + ELSE + KLO=K + ENDIF +GOTO 1 +ENDIF +H=XA(KHI)-XA(KLO) +IF (H.EQ.0.) STOP 'Bad XA input.' +A=(XA(KHI)-X)/H +B=(X-XA(KLO))/H +Y=A*YA(KLO)+B*YA(KHI)+ & + ((A**3-A)*Y2A(KLO)+(B**3-B)*Y2A(KHI))*(H**2)/6. +RETURN +END diff --git a/quasielasticbayes/QLres_main.f90 b/quasielasticbayes/QLres_main.f90 index c841255..e61a36d 100644 --- a/quasielasticbayes/QLres_main.f90 +++ b/quasielasticbayes/QLres_main.f90 @@ -1,282 +1,282 @@ -C PROGRAM QUASI_LINES_2D -C----------------------------------------------------------------------- -C This is a 2-D version of QUASI_LINES, a 1-D Bayesian Quasi-elastic -C line-fitting program. The resolution function is given on a constant -C X-binning grid, and is assumed to be invariant. The background is -C assumed to be linear and the spectrum a sum of Laurentzians, centered -C at the "origin". The maximum number of lines allowed to be fit is 3. -C The data are assumed to be of intermediate Genie binary format, such -C as that output by batch-mode ICON. -C----------------------------------------------------------------------- -C Written by: D.S. Sivia, Rutherford Appleton Lab., Oxfordshire, England. -C----------------------------------------------------------------------- -C Initial release for trials by CJC, MAA, WSH. (DSS: 27-FEB-1992) -C Changed file access from sequential to direct. (DSS: 5-MAR-1992) -C Changed STEPSZ reduction from 0.85 to 0.6 . (DSS: 7-MAR-1992) -C Can read in a detector normalisation file. (DSS: 12-MAR-1992) -C Readonly for resol. file; silent-running modified. (DSS: 14-MAY-1992) -C WBF array-size increased in subroutine INBUFF. (DSS: 28-MAY-1992) -C Fixed bug in CLRBUF; problem for lots of detectors.(DSS: 29-MAY-1992) -C Hard-wired meV as input and ueV as output. (DSS: 2-OCT-1992) -C Put in STEPSZ safety-valve in case Chisq stuck! (DSS: 27-OCT-1992) -C Took out small and negative number safety-valve. (DSS: 17-DEC-1992) -C Fixed bug in DATIN1 (no more large error-bars!). (DSS: 27-SEP-1993) -C----------------------------------------------------------------------- -C Option : elastic peak , o_el=0 (no), =1 (yes) -C : background , o_bgd=2 (sloping), =1 (flat), =0 (zero) -C : width1 , o_w1=1 (fix), =0 (free) -C----------------------------------------------------------------------- -C - SUBROUTINE QLres(numb,x_in,y_in,e_in,reals,opft, - 1 XD_in,XB_in,YB_in,Wy_in,We_in,dtn,xsc,sfile,rfile,l_fn, - 2 nd_out,xout,yout,eout,yfit,yprob) - INCLUDE 'mod_files.f90' - INCLUDE 'mod_data.f90' - INCLUDE 'options.f90' - COMMON /FFTCOM/ FRES(m_d2),FWRK(m_d2),XJ(m_d),TWOPIK(m_d1),NFFT - COMMON /DATCOM/ XDAT(m_d),DAT(m_d),SIG(m_d),NDAT - COMMON /DINTRP/ IPDAT(m_d),XPDAT(m_d) - COMMON /FITCOM/ FIT(m_d),RESID(m_d),NFEW,FITP(m_p),EXPF(m_d1,6) - COMMON /SCLCOM/ BSCL,ASCL,WSCL,SCLVEC(m_p,2),GSCL - COMMON /GRDCOM/ DDDPAR(m_d,m_p),FR2PIK(m_d2,2) - COMMON /QW1COM/ QW1(m_sp),SIGQW1(m_sp),ISPEC - COMMON /WRKCOM/ WORK(m_d2,2) - COMMON /ModPars/ NBIN,IMIN,IMAX,RSCL,BNORM - real x_in(m_d), y_in(m_d), e_in(m_d) -cf2py intent(in) :: x_in, y_in, e_in !sample data - real reals(4) -cf2py intent(in) :: reals !real parameters - real XD_in(m_d), XB_in(m_d), YB_in(m_d) -cf2py intent(in) :: XD_in, XB_in, YB_in !sample xrange, res data (blur) - real Wy_in(m_sp), We_in(m_sp), dtn(m_sp), xsc(m_sp) -cf2py intent(in) :: Wy_in, We_in, dtn, xsc !fixed width data & res scaling - integer numb(9) -cf2py intent(in) :: numb !integer parameters - integer opft(4) -cf2py intent(in) :: opft !options parameters - integer l_fn -cf2py intent(in) :: l_fn !length of filenames - character*140 sfile, rfile -cf2py intent(in) :: sfile, rfile !sample & res filenames - integer nd_out -cf2py intent(out) :: nd_out !number of output points - real xout(m_d), yout(m_d), eout(m_d) -cf2py intent(out) :: xout, yout, eout !data values - real yfit(4*m_d) -cf2py intent(out) :: yfit !fit values - real yprob(4) -cf2py intent(out) :: yprob !probability values - integer l_title,l_user - character*80 user,title - real XBLR(m_d),YBLR(m_d) - REAL GRAD(m_p),HESS(m_p,m_p),DPAR(m_p),COVAR(m_p,m_p) - REAL SIGPAR(m_p),FITPSV(m_p),DTNORM(m_sp),XSCALE(m_sp) - REAL PRBSV(4,m_sp),POUT(4,m_sp), - 1 PRMSV(7,4,m_sp),SIGSV(7,4,m_sp) - INTEGER INDX(m_p) - prog='l' - CALL init_paras - do n=1,m_p - GRAD(n)=0.0 - DPAR(n)=0.0 - SIGPAR(n)=0.0 - FITPSV(n)=0.0 - do m=1,m_p - HESS(n,m)=0.0 - COVAR(n,m)=0.0 - end do - end do - do n=1,m_sp - do n1=1,4 - PRBSV(n1,n)=0.0 - POUT(n1,n)=0.0 - do n2=1,7 - PRMSV(n2,n1,n)=0.0 - SIGSV(n2,n1,n)=0.0 - end do - end do - end do -c numb = [ngrp, nsp, ntc, Ndat, nbin, Imin, Imax, Nb, nrbin] - NSPEC=numb(1) !no. of groups - ISP=numb(2) !group number - ISPEC=ISP - ntc=numb(3) !no. of points - NDAT=numb(4) - NBIN=numb(5) - IMIN=numb(6) - IMAX=numb(7) - NB=numb(8) - nrbin=numb(9) -c reals = [efix, theta[isp], rscl, bnorm] - efix=reals(1) - theta(ISP)=reals(2) - RSCL=reals(3) - BNORM=reals(4) - do n=1,m_d - xin(n)=x_in(n) - yin(n)=y_in(n) - ein(n)=e_in(n) - XDAT(n)=XD_in(n) - XBLR(n)=XB_in(n) - YBLR(n)=YB_in(n) - end do - o_el=opft(1) - o_bgd=opft(2) - o_w1=opft(3) - do n=1,m_sp - DTNORM(n)=dtn(n) !DTNORM - XSCALE(n)=xsc(n) !XSCALE - yprob=0.0 - end do - lptfile = '' - fileout1 = '' - fileout2 = '' - fileout3 = '' - l_lpt=l_fn+8 - lptfile(1:l_lpt)=sfile(1:l_fn)//'_QLr.lpt' - l_file=l_fn+8 - fileout1(1:l_lpt)=sfile(1:l_fn)//'_QLr.ql1' - fileout2(1:l_lpt)=sfile(1:l_fn)//'_QLr.ql2' - fileout3(1:l_lpt)=sfile(1:l_fn)//'_QLr.ql3' - l_title=9 - title='' - l_user=9 - user='' - if(o_w1.eq.1)then - do I=1,NSPEC - QW1(I)=Wy_in(I) - QW1(I)=0.5*(ABS(QW1(I))+0.00001) - SIGQW1(I)=We_in(I) - SIGQW1(I)=0.5*(ABS(SIGQW1(I))+0.00001) - end do - endif - if(ISP.eq.1)then !print info - call open_f(53,lptfile) - write(53,1107)sfile -1107 format(' Sample file : ',a140) - write(53,1108)rfile -1108 format(' Resolution file : ',a140) - write(53,1110)xin(imin),xin(imax) -1110 format(' Energy range: ',f8.3,' to ',f8.3,' meV') - if (o_el.eq.0) write(53,1111) - if (o_el.eq.1) write(53,1112) - if (o_bgd.eq.2) write(53,1113) - if (o_bgd.eq.1) write(53,1114) - if (o_bgd.eq.0) write(53,1115) -1111 format(' Elastic option : NO peak') -1112 format(' Elastic option : WITH peak') -1113 format(' Background option : sloping') -1114 format(' Background option : flat') -1115 format(' Background option : zero') - if(o_w1.eq.1)then - write(53,1116) - else - write(53,1117) - endif -1116 format(' Width option : fixed from file ') -1117 format(' Width option : free') - close(unit=53) - call open_f(1,fileout1) - call open_f(2,fileout2) - call open_f(3,fileout3) - do n=1,3 - write(n,1107)sfile - write(n,1121)title(1:l_title) -1121 format(' Title : ',a) - write(n,1122)user(1:l_user) -1122 format(' User : ',a) - write(n,1123)NSPEC,NDAT,xin(imin),xin(imax) -1123 FORMAT(2X,2I10,2x,2f10.3) - write(n,*)' -------------------------------------------------' - write(n,1108)rfile - write(n,1124)n -1124 FORMAT(i3) - write(n,*)' -------------------------------------------------' - close(unit=n) - end do - endif !end print - CALL BLRINT(XBLR,YBLR,NB,1.0,.FALSE.) - NDAT=ntc-1 - CALL DPINIT - CALL GDINIT - NDAT=ntc-1 - CALL DATIN(ISP,DTNORM,IDUF) - if(o_w1.eq.1)then - OPEN(UNIT=53,FILE=lptfile,STATUS='old',FORM='formatted', - 1 access='append') - write(53,1120)QW1(isp) -1120 format(' qlm> width 1 fixed at ',f10.5) - close(unit=53) - endif - CALL BLRINT(XBLR,YBLR,NB,XSCALE(ISP),.TRUE.) - CALL DPINIT - CALL PRINIT(FITP,3,NFEW,1) - CALL FileInit(3,ISP) - CALL REFINA(GRAD,HESS,DPAR,3+NFEW,DETLOG,INDX,COVAR) - GOTO 2 - 1 CALL SEARCH(GRAD,HESS,DPAR,NFEW,INDX,COVAR,FITP) - 2 NPARMS=4+2*NFEW - CHIOLD=CCHI(FITP) - CALL VCOPY(FITP,FITPSV,NPARMS) - STEPSZ=0.3 - IF (NFEW.GT.1) STEPSZ=STEPSZ/10.0 - IAGAIN=0 - CDIFMN=0.003 - do I=1,200 - CALL REFINE(GRAD,HESS,NPARMS,DETLOG,INDX,COVAR,STEPSZ) - CALL NEWEST(COVAR,GRAD,NPARMS,NFEW,DPAR,FITP) - CNORM=CCHI(FITP) - IF (CNORM.LE.CHIOLD) THEN - CHIDIF=(CHIOLD-CNORM)/CNORM - IF (ABS(CHIDIF).LE.CDIFMN) THEN - IF (IAGAIN.EQ.0) THEN - CDIFMN=0.00005 - STEPSZ=0.15 - IAGAIN=1 - ELSE - GOTO 3 - ENDIF - ENDIF - CHIOLD=CNORM - CALL VCOPY(FITP,FITPSV,NPARMS) - ELSE - CALL VCOPY(FITPSV,FITP,NPARMS) - STEPSZ=STEPSZ*0.6 - IF (STEPSZ.LT.1.0E-10) GOTO 3 - ENDIF - end do - 3 continue - CALL REFINE(GRAD,HESS,NPARMS,DETLOG,INDX,COVAR,0.7) - CALL ERRBAR(COVAR,NPARMS,SIGPAR) - CALL SEEFIT(SIGPAR,CNORM,PRMSV(1,NFEW+1,ISP), - * SIGSV(1,NFEW+1,ISP)) - CALL OUTPRM(FITP,COVAR,NPARMS,NFEW,CNORM) - CALL REFINE(GRAD,HESS,NPARMS,DETLOG,INDX,COVAR,0.25) - CALL PROBN(CNORM,numb(4),DETLOG,NFEW,3,PRBSV(1,ISP)) - noff=NDAT*NFEW - do n=1,NDAT - yfit(noff+n)=FIT(n) - end do - NFEW=NFEW+1 - if (o_el.eq.0) then !no elastic peak - FITP(3)=0.0 - FITPSV(3)=0.0 - endif - IF (NFEW.LE.3) GOTO 1 - nd_out=NDAT - do n=1,nd_out - xout(n)=XDAT(n) - yout(n)=DAT(n) - if(SIG(n).lt.1.0e-10)then - eout(n)=0.0 - else - eout(n)=SQRT(2.0/SIG(n)) - endif - end do - CALL PRBOUT(PRBSV,4,ISP,POUT) - do n=1,4 - yprob(n)=POUT(n,isp) - end do - kill=0 - RETURN - END +! PROGRAM QUASI_LINES_2D +!----------------------------------------------------------------------- +! This is a 2-D version of QUASI_LINES, a 1-D Bayesian Quasi-elastic +! line-fitting program. The resolution function is given on a constant +! X-binning grid, and is assumed to be invariant. The background is +! assumed to be linear and the spectrum a sum of Laurentzians, centered +! at the "origin". The maximum number of lines allowed to be fit is 3. +! The data are assumed to be of intermediate Genie binary format, such +! as that output by batch-mode ICON. +!----------------------------------------------------------------------- +! Written by: D.S. Sivia, Rutherford Appleton Lab., Oxfordshire, England. +!----------------------------------------------------------------------- +! Initial release for trials by CJC, MAA, WSH. (DSS: 27-FEB-1992) +! Changed file access from sequential to direct. (DSS: 5-MAR-1992) +! Changed STEPSZ reduction from 0.85 to 0.6 . (DSS: 7-MAR-1992) +! Can read in a detector normalisation file. (DSS: 12-MAR-1992) +! Readonly for resol. file; silent-running modified. (DSS: 14-MAY-1992) +! WBF array-size increased in subroutine INBUFF. (DSS: 28-MAY-1992) +! Fixed bug in CLRBUF; problem for lots of detectors.(DSS: 29-MAY-1992) +! Hard-wired meV as input and ueV as output. (DSS: 2-OCT-1992) +! Put in STEPSZ safety-valve in case Chisq stuck! (DSS: 27-OCT-1992) +! Took out small and negative number safety-valve. (DSS: 17-DEC-1992) +! Fixed bug in DATIN1 (no more large error-bars!). (DSS: 27-SEP-1993) +!----------------------------------------------------------------------- +! Option : elastic peak , o_el=0 (no), =1 (yes) +! : background , o_bgd=2 (sloping), =1 (flat), =0 (zero) +! : width1 , o_w1=1 (fix), =0 (free) +!----------------------------------------------------------------------- +! +SUBROUTINE QLres(numb,x_in,y_in,e_in,reals,opft, & + XD_in,XB_in,YB_in,Wy_in,We_in,dtn,xsc,sfile,rfile,l_fn, & + nd_out,xout,yout,eout,yfit,yprob) +INCLUDE 'mod_files.f90' +INCLUDE 'mod_data.f90' +INCLUDE 'options.f90' +COMMON /FFTCOM/ FRES(m_d2),FWRK(m_d2),XJ(m_d),TWOPIK(m_d1),NFFT +COMMON /DATCOM/ XDAT(m_d),DAT(m_d),SIG(m_d),NDAT +COMMON /DINTRP/ IPDAT(m_d),XPDAT(m_d) +COMMON /FITCOM/ FIT(m_d),RESID(m_d),NFEW,FITP(m_p),EXPF(m_d1,6) +COMMON /SCLCOM/ BSCL,ASCL,WSCL,SCLVEC(m_p,2),GSCL +COMMON /GRDCOM/ DDDPAR(m_d,m_p),FR2PIK(m_d2,2) +COMMON /QW1COM/ QW1(m_sp),SIGQW1(m_sp),ISPEC +COMMON /WRKCOM/ WORK(m_d2,2) +COMMON /ModPars/ NBIN,IMIN,IMAX,RSCL,BNORM +real x_in(m_d), y_in(m_d), e_in(m_d) +!f2py intent(in) :: x_in, y_in, e_in !sample data +real reals(4) +!f2py intent(in) :: reals !real parameters +real XD_in(m_d), XB_in(m_d), YB_in(m_d) +!f2py intent(in) :: XD_in, XB_in, YB_in !sample xrange, res data (blur) +real Wy_in(m_sp), We_in(m_sp), dtn(m_sp), xsc(m_sp) +!f2py intent(in) :: Wy_in, We_in, dtn, xsc !fixed width data & res scaling +integer numb(9) +!f2py intent(in) :: numb !integer parameters +integer opft(4) +!f2py intent(in) :: opft !options parameters +integer l_fn +!f2py intent(in) :: l_fn !length of filenames +character*140 sfile, rfile +!f2py intent(in) :: sfile, rfile !sample & res filenames +integer nd_out +!f2py intent(out) :: nd_out !number of output points +real xout(m_d), yout(m_d), eout(m_d) +!f2py intent(out) :: xout, yout, eout !data values +real yfit(4*m_d) +!f2py intent(out) :: yfit !fit values +real yprob(4) +!f2py intent(out) :: yprob !probability values +integer l_title,l_user +character*80 user,title +real XBLR(m_d),YBLR(m_d) +REAL GRAD(m_p),HESS(m_p,m_p),DPAR(m_p),COVAR(m_p,m_p) +REAL SIGPAR(m_p),FITPSV(m_p),DTNORM(m_sp),XSCALE(m_sp) +REAL PRBSV(4,m_sp),POUT(4,m_sp), & + PRMSV(7,4,m_sp),SIGSV(7,4,m_sp) +INTEGER INDX(m_p) +prog='l' +CALL init_paras +do n=1,m_p + GRAD(n)=0.0 + DPAR(n)=0.0 + SIGPAR(n)=0.0 + FITPSV(n)=0.0 + do m=1,m_p + HESS(n,m)=0.0 + COVAR(n,m)=0.0 + end do +end do +do n=1,m_sp + do n1=1,4 + PRBSV(n1,n)=0.0 + POUT(n1,n)=0.0 + do n2=1,7 + PRMSV(n2,n1,n)=0.0 + SIGSV(n2,n1,n)=0.0 + end do + end do +end do +! numb = [ngrp, nsp, ntc, Ndat, nbin, Imin, Imax, Nb, nrbin] +NSPEC=numb(1) !no. of groups +ISP=numb(2) !group number +ISPEC=ISP +ntc=numb(3) !no. of points +NDAT=numb(4) +NBIN=numb(5) +IMIN=numb(6) +IMAX=numb(7) +NB=numb(8) +nrbin=numb(9) +! reals = [efix, theta[isp], rscl, bnorm] +efix=reals(1) +theta(ISP)=reals(2) +RSCL=reals(3) +BNORM=reals(4) +do n=1,m_d + xin(n)=x_in(n) + yin(n)=y_in(n) + ein(n)=e_in(n) + XDAT(n)=XD_in(n) + XBLR(n)=XB_in(n) + YBLR(n)=YB_in(n) +end do +o_el=opft(1) +o_bgd=opft(2) +o_w1=opft(3) +do n=1,m_sp + DTNORM(n)=dtn(n) !DTNORM + XSCALE(n)=xsc(n) !XSCALE + yprob=0.0 +end do +lptfile = '' +fileout1 = '' +fileout2 = '' +fileout3 = '' +l_lpt=l_fn+8 +lptfile(1:l_lpt)=sfile(1:l_fn)//'_QLr.lpt' +l_file=l_fn+8 +fileout1(1:l_lpt)=sfile(1:l_fn)//'_QLr.ql1' +fileout2(1:l_lpt)=sfile(1:l_fn)//'_QLr.ql2' +fileout3(1:l_lpt)=sfile(1:l_fn)//'_QLr.ql3' +l_title=9 +title='' +l_user=9 +user='' +if(o_w1.eq.1)then + do I=1,NSPEC + QW1(I)=Wy_in(I) + QW1(I)=0.5*(ABS(QW1(I))+0.00001) + SIGQW1(I)=We_in(I) + SIGQW1(I)=0.5*(ABS(SIGQW1(I))+0.00001) + end do +endif +if(ISP.eq.1)then !print info + call open_f(53,lptfile) + write(53,1107)sfile +1107 format(' Sample file : ',a140) + write(53,1108)rfile +1108 format(' Resolution file : ',a140) + write(53,1110)xin(imin),xin(imax) +1110 format(' Energy range: ',f8.3,' to ',f8.3,' meV') + if (o_el.eq.0) write(53,1111) + if (o_el.eq.1) write(53,1112) + if (o_bgd.eq.2) write(53,1113) + if (o_bgd.eq.1) write(53,1114) + if (o_bgd.eq.0) write(53,1115) +1111 format(' Elastic option : NO peak') +1112 format(' Elastic option : WITH peak') +1113 format(' Background option : sloping') +1114 format(' Background option : flat') +1115 format(' Background option : zero') + if(o_w1.eq.1)then + write(53,1116) + else + write(53,1117) + endif +1116 format(' Width option : fixed from file ') +1117 format(' Width option : free') + close(unit=53) + call open_f(1,fileout1) + call open_f(2,fileout2) + call open_f(3,fileout3) + do n=1,3 + write(n,1107)sfile + write(n,1121)title(1:l_title) +1121 format(' Title : ',a) + write(n,1122)user(1:l_user) +1122 format(' User : ',a) + write(n,1123)NSPEC,NDAT,xin(imin),xin(imax) +1123 FORMAT(2X,2I10,2x,2f10.3) + write(n,*)' -------------------------------------------------' + write(n,1108)rfile + write(n,1124)n +1124 FORMAT(i3) + write(n,*)' -------------------------------------------------' + close(unit=n) + end do +endif !end print +CALL BLRINT(XBLR,YBLR,NB,1.0,.FALSE.) +NDAT=ntc-1 +CALL DPINIT +CALL GDINIT +NDAT=ntc-1 +CALL DATIN(ISP,DTNORM,IDUF) +if(o_w1.eq.1)then + OPEN(UNIT=53,FILE=lptfile,STATUS='old',FORM='formatted', & + access='append') + write(53,1120)QW1(isp) +1120 format(' qlm> width 1 fixed at ',f10.5) + close(unit=53) +endif +CALL BLRINT(XBLR,YBLR,NB,XSCALE(ISP),.TRUE.) +CALL DPINIT +CALL PRINIT(FITP,3,NFEW,1) +CALL FileInit(3,ISP) +CALL REFINA(GRAD,HESS,DPAR,3+NFEW,DETLOG,INDX,COVAR) +GOTO 2 +1 CALL SEARCH(GRAD,HESS,DPAR,NFEW,INDX,COVAR,FITP) +2 NPARMS=4+2*NFEW +CHIOLD=CCHI(FITP) +CALL VCOPY(FITP,FITPSV,NPARMS) +STEPSZ=0.3 +IF (NFEW.GT.1) STEPSZ=STEPSZ/10.0 +IAGAIN=0 +CDIFMN=0.003 +do I=1,200 + CALL REFINE(GRAD,HESS,NPARMS,DETLOG,INDX,COVAR,STEPSZ) + CALL NEWEST(COVAR,GRAD,NPARMS,NFEW,DPAR,FITP) + CNORM=CCHI(FITP) + IF (CNORM.LE.CHIOLD) THEN + CHIDIF=(CHIOLD-CNORM)/CNORM + IF (ABS(CHIDIF).LE.CDIFMN) THEN + IF (IAGAIN.EQ.0) THEN + CDIFMN=0.00005 + STEPSZ=0.15 + IAGAIN=1 +ELSE + GOTO 3 +ENDIF + ENDIF + CHIOLD=CNORM + CALL VCOPY(FITP,FITPSV,NPARMS) + ELSE + CALL VCOPY(FITPSV,FITP,NPARMS) + STEPSZ=STEPSZ*0.6 + IF (STEPSZ.LT.1.0E-10) GOTO 3 + ENDIF +end do +3 continue +CALL REFINE(GRAD,HESS,NPARMS,DETLOG,INDX,COVAR,0.7) +CALL ERRBAR(COVAR,NPARMS,SIGPAR) +CALL SEEFIT(SIGPAR,CNORM,PRMSV(1,NFEW+1,ISP), & + SIGSV(1,NFEW+1,ISP)) +CALL OUTPRM(FITP,COVAR,NPARMS,NFEW,CNORM) +CALL REFINE(GRAD,HESS,NPARMS,DETLOG,INDX,COVAR,0.25) +CALL PROBN(CNORM,numb(4),DETLOG,NFEW,3,PRBSV(1,ISP)) +noff=NDAT*NFEW +do n=1,NDAT + yfit(noff+n)=FIT(n) +end do +NFEW=NFEW+1 +if (o_el.eq.0) then !no elastic peak + FITP(3)=0.0 + FITPSV(3)=0.0 +endif +IF (NFEW.LE.3) GOTO 1 +nd_out=NDAT +do n=1,nd_out + xout(n)=XDAT(n) + yout(n)=DAT(n) + if(SIG(n).lt.1.0e-10)then + eout(n)=0.0 + else + eout(n)=SQRT(2.0/SIG(n)) + endif +end do +CALL PRBOUT(PRBSV,4,ISP,POUT) +do n=1,4 + yprob(n)=POUT(n,isp) +end do +kill=0 +RETURN +END diff --git a/quasielasticbayes/QLres_subs.f90 b/quasielasticbayes/QLres_subs.f90 index 0756404..bce10f5 100644 --- a/quasielasticbayes/QLres_subs.f90 +++ b/quasielasticbayes/QLres_subs.f90 @@ -1,334 +1,334 @@ - SUBROUTINE init_paras - INCLUDE 'res_par.f90' - COMMON /FFTCOM/ FRES(m_d2),FWRK(m_d2),XJ(m_d),TWOPIK(m_d1),NFFT - COMMON /DATCOM/ XDAT(m_d),DAT(m_d),SIG(m_d),NDAT - COMMON /DINTRP/ IPDAT(m_d),XPDAT(m_d) - COMMON /FITCOM/ FIT(m_d),RESID(m_d),NFEW,FITP(m_p),EXPF(m_d1,6) - COMMON /SCLCOM/ BSCL,ASCL,WSCL,SCLVEC(m_p,2),GSCL - COMMON /GRDCOM/ DDDPAR(m_d,m_p),FR2PIK(m_d2,2) - COMMON /QW1COM/ QW1(m_sp),SIGQW1(m_sp),ISPEC - COMMON /WRKCOM/ WORK(m_d2,2) - do n=1,m_d - XJ(n)=0.0 - XDAT(n)=0.0 - DAT(n)=0.0 - SIG(n)=0.0 - IPDAT(n)=0 - XPDAT(n)=0.0 - FIT(n)=0.0 - RESID(n)=0.0 - do m=1,m_p - DDDPAR(n,m)=0.0 - end do - end do - do n=1,m_d1 - TWOPIK(n)=0.0 - do m=1,3 - EXPF(n,m)=0.0 - end do - end do - do n=1,m_d2 - FRES(n)=0.0 - FWRK(n)=0.0 - do m=1,2 - FR2PIK(n,m)=0.0 - WORK(n,m)=0.0 - end do - end do - do n=1,m_p - FITP(n)=0.0 - do m=1,2 - SCLVEC(n,m)=0.0 - end do - end do - do n=1,m_sp - QW1(n)=0.0 - SIGQW1(n)=0.0 - end do - RETURN - END -C ------------------------------------ - SUBROUTINE OUTPRM(P,C,NP,NFEW,CNORM) - INCLUDE 'mod_files.f90' - REAL P(*),C(NP,*) - IF (NFEW.LT.1 .OR. NFEW.GT.3) RETURN - OPEN(UNIT=1,FILE=fileout1,STATUS='old',FORM='formatted', - 1 access='append') - OPEN(UNIT=2,FILE=fileout2,STATUS='old',FORM='formatted', - 1 access='append') - OPEN(UNIT=3,FILE=fileout3,STATUS='old',FORM='formatted', - 1 access='append') - WRITE(NFEW,100) P(3),P(1),P(2),P(4) - do I=5,NP,2 - WRITE(NFEW,100) P(I),P(I+1) - end do - CSCALE=2.0*CNORM - do J=1,NP - do I=1,NP - C(I,J)=CSCALE*C(I,J) - end do - end do - WRITE(NFEW,100) C(3,3) - WRITE(NFEW,100) C(3,5),C(5,5) - WRITE(NFEW,100) C(3,6),C(5,6),C(6,6) - IF (NFEW.GT.1) THEN - WRITE(NFEW,100) C(3,7),C(5,7),C(6,7),C(7,7) - WRITE(NFEW,100) C(3,8),C(5,8),C(6,8),C(7,8),C(8,8) - ENDIF - IF (NFEW.GT.2) THEN - WRITE(NFEW,100) C(3,9),C(5,9),C(6,9),C(7,9),C(8,9),C(9,9) - WRITE(NFEW,100) C(3,10),C(5,10),C(6,10),C(7,10),C(8,10), - 1 C(9,10),C(10,10) - ENDIF - 100 FORMAT(1PE13.4,6E13.4) - WRITE(NFEW,*)' ----------------------------------------------' - close(unit=1) - close(unit=2) - close(unit=3) - END -c -C***************************************** - FUNCTION CCHI(V) - INCLUDE 'res_par.f90' - INCLUDE 'options.f90' - COMMON /FFTCOM/ FRES(m_d2),FWRK(m_d2),XJ(m_d),TWOPIK(m_d1),NFFT - COMMON /DATCOM/ XDAT(m_d),DAT(m_d),SIG(m_d),NDAT - COMMON /DINTRP/ IPDAT(m_d),XPDAT(m_d) - COMMON /FITCOM/ FIT(m_d),RESID(m_d),NFEW,FITP(m_p),EXPF(m_d1,6) - COMMON /SCLCOM/ BSCL,ASCL,WSCL,SCLVEC(m_p,2),GSCL - COMMON /GRDCOM/ DDDPAR(m_d,m_p),FR2PIK(m_d2,2) - COMMON /QW1COM/ QW1(m_sp),SIGQW1(m_sp),ISPEC - COMMON /WRKCOM/ WORK(m_d2,2) - REAL V(*) - CHI=0.0 - B1=BSCL*V(1) - B2=BSCL*V(2) - A0=ASCL*V(3) - DELTAX=V(4) - NFT2=NFFT/2+1 - CALL CXSHFT(FRES,DELTAX,TWOPIK,FR2PIK,FR2PIK(1,2),NFT2) - CALL VRFILL(WORK,A0,NFT2) - XNSCL=-LOG(1.0E-7)/(TWOPIK(2)-TWOPIK(1)) - do J=1,NFEW - AJ=ASCL*V(3+J+J) - SIGJ=WSCL*V(4+J+J)/GSCL - CALL VRFILL(EXPF(1,J),0.0,NFT2) - NXFT2=1+NINT(XNSCL/(ABS(SIGJ)+1.0E-10)) - IF (NXFT2.GT.NFT2) NXFT2=NFT2 - do I=1,NXFT2 - EXPIJ=EXP(-TWOPIK(I)*SIGJ) - EXPF(I,J)=EXPIJ - WORK(I,1)=WORK(I,1)+AJ*EXPIJ - end do - end do - CALL VMLTRC(WORK,FR2PIK,NFT2,FWRK) - CALL FOUR2(FWRK,NFFT,1,-1,-1) - CALL DEGRID(FWRK,FIT) - X1=XDAT(1) - if(o_bgd.eq.2) BNRM=(B2-B1)/(XDAT(NDAT)-X1) !avoid conflict BNORM with ModPars - do I=1,NDAT - FIT(I)=FIT(I)+B1 - if(o_bgd.eq.2) FIT(I)=FIT(I)+BNRM*(XDAT(I)-X1) - DIF=FIT(I)-DAT(I) - RESID(I)=DIF*SIG(I) - CHI=CHI+DIF*RESID(I) - end do - if(o_w1.eq.1)then - if(NFEW.GE.1) then - RESW1D=(WSCL*V(6)-QW1(ISPEC))/SIGQW1(ISPEC) - CHI=CHI+2.0*RESW1D**2 - endif - endif - CCHI=CHI/(2.0*FLOAT(NDAT)) - END -C -C****************************** -C - SUBROUTINE SEARCH(GRAD,HESS,DPAR,NFEW,INDX,COVAR,FITP) - INCLUDE 'res_par.f90' - INCLUDE 'options.f90' - COMMON /SCLCOM/ BSCL,ASCL,WSCL,SCLVEC(m_p,2),GSCL - COMMON /QW1COM/ QW1(m_sp),SIGQW1(m_sp),ISPEC - REAL GRAD(*),HESS(*),DPAR(*),COVAR(*),FITP(*) - INTEGER INDX(*) - if(o_w1.eq.1)then - if (NFEW.GE.1) then - FITP(5)=0.1 - FITP(6)=QW1(ISPEC)/WSCL - if (NFEW.EQ.1) then - CALL REFINA(GRAD,HESS,DPAR,3+NFEW,DETLOG,INDX,COVAR) - RETURN - endif - endif - endif - J=4+2*NFEW - DXLOG=0.85 - NSRCH=NINT(LOG(5.0*GSCL/WSCL)/LOG(DXLOG)) - CMIN=1.0E20 - FITP(J-1)=0.1 - FITP(J)=1.0 - do I=1,NSRCH - CALL REFINA(GRAD,HESS,DPAR,3+NFEW,DETLOG,INDX,COVAR) - CNORM=CCHI(FITP) - IF (CNORM.LT.CMIN) THEN - CMIN=CNORM - SIGJ=FITP(J) - ENDIF - FITP(J)=FITP(J)*DXLOG - end do - FITP(J)=SIGJ - CALL REFINA(GRAD,HESS,DPAR,3+NFEW,DETLOG,INDX,COVAR) - END -C*********************************************************** - SUBROUTINE REFINE(GRAD,HESS,NP,DETLOG,INDX,COVAR,STEPSZ) - INCLUDE 'res_par.f90' - INCLUDE 'options.f90' - COMMON /FFTCOM/ FRES(m_d2),FWRK(m_d2),XJ(m_d),TWOPIK(m_d1),NFFT - COMMON /DATCOM/ XDAT(m_d),DAT(m_d),SIG(m_d),NDAT - COMMON /DINTRP/ IPDAT(m_d),XPDAT(m_d) - COMMON /FITCOM/ FIT(m_d),RESID(m_d),NFEW,FITP(m_p),EXPF(m_d1,6) - COMMON /SCLCOM/ BSCL,ASCL,WSCL,SCLVEC(m_p,2),GSCL - COMMON /WRKCOM/ WORK(m_d2,2) - COMMON /GRDCOM/ DDDPAR(m_d,m_p),FR2PIK(m_d2,2) - COMMON /QW1COM/ QW1(m_sp),SIGQW1(m_sp),ISPEC - REAL GRAD(*),HESS(NP,*),COVAR(NP,*) - INTEGER INDX(*) - NFT2=NFFT/2+1 - CNORM=CCHI(FITP) - CALL VRFILL(HESS,0.0,NP*NP) - CALL VMLTRC(WORK,FR2PIK(1,2),NFT2,FWRK) - CALL VMLTRC(TWOPIK,FWRK,NFT2,WORK) - CALL VMLTIC(WORK,NFT2,WORK) - CALL FOUR2(FWRK,NFFT,1,-1,-1) - CALL DEGRID(FWRK,DDDPAR(1,4)) - CALL FOUR2(WORK,NFFT,1,-1,-1) - CALL DEGRID(WORK,FWRK) - CALL VRDOTR(RESID,FWRK,NDAT,HESS(4,4)) - CALL VCOPY(FR2PIK,FWRK,NFFT+2) - CALL FOUR2(FWRK,NFFT,1,-1,-1) - CALL DEGRID(FWRK,DDDPAR(1,3)) - CALL VCOPY(FR2PIK(1,2),FWRK,NFFT+2) - CALL FOUR2(FWRK,NFFT,1,-1,-1) - CALL DEGRID(FWRK,WORK) - CALL VRDOTR(RESID,WORK,NDAT,HESS(3,4)) - HESS(4,3)=HESS(3,4) - do I=1,NFEW - J=3+I+I - AJ=FITP(J)*ASCL - CALL VMLTRC(EXPF(1,I),FR2PIK,NFT2,WORK) - CALL VCOPY(WORK,FWRK,NFFT+2) - CALL FOUR2(FWRK,NFFT,1,-1,-1) - CALL DEGRID(FWRK,DDDPAR(1,J)) - CALL VMLTRC(TWOPIK,WORK,NFT2,FWRK) - CALL VCOPY(FWRK,WORK,NFFT+2) - CALL FOUR2(FWRK,NFFT,1,-1,-1) - CALL DEGRID(FWRK,DDDPAR(1,J+1)) - CALL HESS0(HESS,NP,RESID,NDAT,DDDPAR(1,J+1),AJ,J) - CALL VMLTIC(WORK,NFT2,WORK) - CALL VCOPY(WORK,FWRK,NFFT+2) - CALL FOUR2(FWRK,NFFT,1,-1,-1) - CALL DEGRID(FWRK,WORK(1,2)) - CALL VRDOTR(RESID,WORK(1,2),NDAT,HESS(4,J)) - HESS(J,4)=HESS(4,J) - CALL VMLTRC(TWOPIK,WORK,NFT2,FWRK) - CALL VCOPY(FWRK,WORK,NFFT+2) - CALL FOUR2(FWRK,NFFT,1,-1,-1) - CALL DEGRID(FWRK,WORK(1,2)) - CALL VRDOTR(RESID,WORK(1,2),NDAT,SM) - HESS(4,J+1)=-AJ*SM - HESS(J+1,4)=HESS(4,J+1) - CALL VMLTIC(WORK,NFT2,WORK) - CALL FOUR2(WORK,NFFT,1,-1,-1) - CALL DEGRID(WORK,FWRK) - CALL VRDOTR(RESID,FWRK,NDAT,SM) - HESS(J+1,J+1)=-AJ*SM - end do - CALL GRADPR(GRAD,RESID,NDAT,NP,SCLVEC(1,2)) - CALL HESS1(HESS,NP,SCLVEC(1,2),STEPSZ,0) - if(o_w1.eq.1)then - if (NP.GE.6) then - DIF=WSCL*FITP(6)-QW1(ISPEC) - SIG2=2.0/SIGQW1(ISPEC)**2 - GRAD(6)=GRAD(6)+SIG2*DIF*WSCL - HESS(6,6)=HESS(6,6)+SIG2*WSCL**2 - endif - endif - CALL INVERT(HESS,COVAR,NP,INDX,DETLOG) - END -C********************************************************** - SUBROUTINE SEEFIT(SIGPAR,CNORM,PRMSV,SIGSV) - INCLUDE 'res_par.f90' - COMMON /DATCOM/ XDAT(m_d),DAT(m_d),SIG(m_d),NDAT - COMMON /FITCOM/ FIT(m_d),RESID(m_d),NFEW,FITP(m_p),EXPF(m_d1,6) - COMMON /SCLCOM/ BSCL,ASCL,WSCL,SCLVEC(m_p,2),GSCL - COMMON /WRKCOM/ WORK(m_d2,2) - INCLUDE 'mod_files.f90' - REAL SIGPAR(*),PRMSV(*),SIGSV(*) - CHARACTER TITLE*80 - OPEN(UNIT=53,FILE=lptfile,STATUS='old',FORM='formatted', - 1 access='append') - ERRSCL=SQRT(CNORM) - WRITE(TITLE,100) NFEW - 100 FORMAT(' Best-fit assuming no. of quasi-elastic lines = ',I2) - WRITE(53,100) NFEW - WRITE(53,120) CNORM - 120 FORMAT(' >>> Normalised Chi-squared = ',F11.4) - WRITE(53,130) FITP(1)*BSCL,SIGPAR(1)*BSCL*ERRSCL - 130 FORMAT(' Background(Xmin) = ',1PE12.3,' +- ',E10.2) - WRITE(53,140) FITP(2)*BSCL,SIGPAR(2)*BSCL*ERRSCL - 140 FORMAT(' Background(Xmax) = ',1PE12.3,' +- ',E10.2) - WRITE(53,150) FITP(4)*GSCL*1000.0, - 1 SIGPAR(4)*GSCL*ERRSCL*1000.0 - 150 FORMAT(' Zero offset = ',F12.2,' +- ',F10.2,' ueV') - WRITE(53,*)' Elastic line' - WRITE(53,160) FITP(3)*ASCL,SIGPAR(3)*ASCL*ERRSCL - 160 FORMAT(5X,' Amplitude = ',1PE13.4,' +- ',E11.3) - PRMSV(1)=FITP(3)*ASCL - SIGSV(1)=SIGPAR(3)*ASCL*ERRSCL - do I=1,NFEW - J=4+I+I - WRITE(53,161) I - 161 FORMAT(' Quasi-elastic line ',I2) - WRITE(53,170) 2000.0*FITP(J)*WSCL, - 1 2000.0*SIGPAR(J)*WSCL*ERRSCL - 170 FORMAT(5X,' FWHM = ',F13.2,' +- ',F11.2,' ueV') - WRITE(53,180) FITP(J-1)*ASCL,SIGPAR(J-1)*ASCL*ERRSCL - 180 FORMAT(5X,' Amplitude = ',1PE13.4,' +- ',E11.3) - PRMSV(I+I)=FITP(J-1)*ASCL - SIGSV(I+I)=SIGPAR(J-1)*ASCL*ERRSCL - PRMSV(I+I+1)=2.0*FITP(J)*WSCL - SIGSV(I+I+1)=2.0*SIGPAR(J)*WSCL*ERRSCL - end do - close(unit=53) - END -C ---------------------------------------------------------- - SUBROUTINE INTDSP(X,Y,XL,XH,YL,YH,SIGPAR,ERRSCL,XMIN,XMAX) - INCLUDE 'res_par.f90' - COMMON /FITCOM/ FIT(m_d),RESID(m_d),NFEW,FITP(m_p),EXPF(m_d1,6) - COMMON /SCLCOM/ BSCL,ASCL,WSCL,SCLVEC(m_p,2),GSCL - REAL X(*),Y(*),XL(*),XH(*),YL(*),YH(*),SIGPAR(*) - XMAX=0.0 - CALL VRFILL(X,0.0,2*(NFEW+1)) - CALL VRFILL(Y,0.0,2*(NFEW+1)) - Y(2)=FITP(3)*ASCL - XL(1)=0.0 - XH(1)=0.0 - YL(1)=Y(2)-ASCL*SIGPAR(3)*ERRSCL - YH(1)=Y(2)+ASCL*SIGPAR(3)*ERRSCL - do I=1,NFEW - J=I+I+1 - X(J)=2.0*FITP(J+3)*WSCL - X(J+1)=X(J) - Y(J+1)=FITP(J+2)*ASCL - SIGX=SIGPAR(J+3)*WSCL*ERRSCL*2.0 - SIGY=SIGPAR(J+2)*ASCL*ERRSCL - XL(I+1)=X(J+1)-SIGX - XH(I+1)=X(J+1)+SIGX - YL(I+1)=Y(J+1)-SIGY - YH(I+1)=Y(J+1)+SIGY - IF (XH(I+1).GT.XMAX) XMAX=XH(I+1) - end do - IF (NFEW.EQ.0) XMAX=WSCL/10.0 - XMIN=-XMAX/50.0 - XMAX=XMAX*1.03 - END +SUBROUTINE init_paras +INCLUDE 'res_par.f90' +COMMON /FFTCOM/ FRES(m_d2),FWRK(m_d2),XJ(m_d),TWOPIK(m_d1),NFFT +COMMON /DATCOM/ XDAT(m_d),DAT(m_d),SIG(m_d),NDAT +COMMON /DINTRP/ IPDAT(m_d),XPDAT(m_d) +COMMON /FITCOM/ FIT(m_d),RESID(m_d),NFEW,FITP(m_p),EXPF(m_d1,6) +COMMON /SCLCOM/ BSCL,ASCL,WSCL,SCLVEC(m_p,2),GSCL +COMMON /GRDCOM/ DDDPAR(m_d,m_p),FR2PIK(m_d2,2) +COMMON /QW1COM/ QW1(m_sp),SIGQW1(m_sp),ISPEC +COMMON /WRKCOM/ WORK(m_d2,2) +do n=1,m_d + XJ(n)=0.0 + XDAT(n)=0.0 + DAT(n)=0.0 + SIG(n)=0.0 + IPDAT(n)=0 + XPDAT(n)=0.0 + FIT(n)=0.0 + RESID(n)=0.0 + do m=1,m_p + DDDPAR(n,m)=0.0 + end do +end do +do n=1,m_d1 + TWOPIK(n)=0.0 + do m=1,3 + EXPF(n,m)=0.0 + end do +end do +do n=1,m_d2 + FRES(n)=0.0 + FWRK(n)=0.0 + do m=1,2 + FR2PIK(n,m)=0.0 + WORK(n,m)=0.0 + end do +end do +do n=1,m_p + FITP(n)=0.0 + do m=1,2 + SCLVEC(n,m)=0.0 + end do +end do +do n=1,m_sp + QW1(n)=0.0 + SIGQW1(n)=0.0 +end do +RETURN +END +! ------------------------------------ +SUBROUTINE OUTPRM(P,C,NP,NFEW,CNORM) +INCLUDE 'mod_files.f90' +REAL P(*),C(NP,*) +IF (NFEW.LT.1 .OR. NFEW.GT.3) RETURN + OPEN(UNIT=1,FILE=fileout1,STATUS='old',FORM='formatted', & + access='append') + OPEN(UNIT=2,FILE=fileout2,STATUS='old',FORM='formatted', & + access='append') + OPEN(UNIT=3,FILE=fileout3,STATUS='old',FORM='formatted', & + access='append') + WRITE(NFEW,100) P(3),P(1),P(2),P(4) + do I=5,NP,2 + WRITE(NFEW,100) P(I),P(I+1) + end do + CSCALE=2.0*CNORM + do J=1,NP + do I=1,NP + C(I,J)=CSCALE*C(I,J) + end do + end do + WRITE(NFEW,100) C(3,3) + WRITE(NFEW,100) C(3,5),C(5,5) + WRITE(NFEW,100) C(3,6),C(5,6),C(6,6) + IF (NFEW.GT.1) THEN + WRITE(NFEW,100) C(3,7),C(5,7),C(6,7),C(7,7) + WRITE(NFEW,100) C(3,8),C(5,8),C(6,8),C(7,8),C(8,8) +ENDIF +IF (NFEW.GT.2) THEN + WRITE(NFEW,100) C(3,9),C(5,9),C(6,9),C(7,9),C(8,9),C(9,9) + WRITE(NFEW,100) C(3,10),C(5,10),C(6,10),C(7,10),C(8,10), & + C(9,10),C(10,10) +ENDIF +100 FORMAT(1PE13.4,6E13.4) +WRITE(NFEW,*)' ----------------------------------------------' +close(unit=1) +close(unit=2) +close(unit=3) +END +! +!***************************************** +FUNCTION CCHI(V) +INCLUDE 'res_par.f90' +INCLUDE 'options.f90' +COMMON /FFTCOM/ FRES(m_d2),FWRK(m_d2),XJ(m_d),TWOPIK(m_d1),NFFT +COMMON /DATCOM/ XDAT(m_d),DAT(m_d),SIG(m_d),NDAT +COMMON /DINTRP/ IPDAT(m_d),XPDAT(m_d) +COMMON /FITCOM/ FIT(m_d),RESID(m_d),NFEW,FITP(m_p),EXPF(m_d1,6) +COMMON /SCLCOM/ BSCL,ASCL,WSCL,SCLVEC(m_p,2),GSCL +COMMON /GRDCOM/ DDDPAR(m_d,m_p),FR2PIK(m_d2,2) +COMMON /QW1COM/ QW1(m_sp),SIGQW1(m_sp),ISPEC +COMMON /WRKCOM/ WORK(m_d2,2) +REAL V(*) +CHI=0.0 +B1=BSCL*V(1) +B2=BSCL*V(2) +A0=ASCL*V(3) +DELTAX=V(4) +NFT2=NFFT/2+1 +CALL CXSHFT(FRES,DELTAX,TWOPIK,FR2PIK,FR2PIK(1,2),NFT2) +CALL VRFILL(WORK,A0,NFT2) +XNSCL=-LOG(1.0E-7)/(TWOPIK(2)-TWOPIK(1)) +do J=1,NFEW + AJ=ASCL*V(3+J+J) + SIGJ=WSCL*V(4+J+J)/GSCL + CALL VRFILL(EXPF(1,J),0.0,NFT2) + NXFT2=1+NINT(XNSCL/(ABS(SIGJ)+1.0E-10)) + IF (NXFT2.GT.NFT2) NXFT2=NFT2 + do I=1,NXFT2 + EXPIJ=EXP(-TWOPIK(I)*SIGJ) + EXPF(I,J)=EXPIJ + WORK(I,1)=WORK(I,1)+AJ*EXPIJ + end do +end do +CALL VMLTRC(WORK,FR2PIK,NFT2,FWRK) +CALL FOUR2(FWRK,NFFT,1,-1,-1) +CALL DEGRID(FWRK,FIT) +X1=XDAT(1) +if(o_bgd.eq.2) BNRM=(B2-B1)/(XDAT(NDAT)-X1) !avoid conflict BNORM with ModPars +do I=1,NDAT + FIT(I)=FIT(I)+B1 + if(o_bgd.eq.2) FIT(I)=FIT(I)+BNRM*(XDAT(I)-X1) + DIF=FIT(I)-DAT(I) + RESID(I)=DIF*SIG(I) + CHI=CHI+DIF*RESID(I) +end do +if(o_w1.eq.1)then + if(NFEW.GE.1) then + RESW1D=(WSCL*V(6)-QW1(ISPEC))/SIGQW1(ISPEC) + CHI=CHI+2.0*RESW1D**2 + endif +endif +CCHI=CHI/(2.0*FLOAT(NDAT)) +END +! +!****************************** +! +SUBROUTINE SEARCH(GRAD,HESS,DPAR,NFEW,INDX,COVAR,FITP) +INCLUDE 'res_par.f90' +INCLUDE 'options.f90' +COMMON /SCLCOM/ BSCL,ASCL,WSCL,SCLVEC(m_p,2),GSCL +COMMON /QW1COM/ QW1(m_sp),SIGQW1(m_sp),ISPEC +REAL GRAD(*),HESS(*),DPAR(*),COVAR(*),FITP(*) +INTEGER INDX(*) +if(o_w1.eq.1)then + if (NFEW.GE.1) then + FITP(5)=0.1 + FITP(6)=QW1(ISPEC)/WSCL + if (NFEW.EQ.1) then + CALL REFINA(GRAD,HESS,DPAR,3+NFEW,DETLOG,INDX,COVAR) + RETURN + endif + endif +endif +J=4+2*NFEW +DXLOG=0.85 +NSRCH=NINT(LOG(5.0*GSCL/WSCL)/LOG(DXLOG)) +CMIN=1.0E20 +FITP(J-1)=0.1 +FITP(J)=1.0 +do I=1,NSRCH + CALL REFINA(GRAD,HESS,DPAR,3+NFEW,DETLOG,INDX,COVAR) + CNORM=CCHI(FITP) + IF (CNORM.LT.CMIN) THEN + CMIN=CNORM + SIGJ=FITP(J) + ENDIF + FITP(J)=FITP(J)*DXLOG +end do +FITP(J)=SIGJ +CALL REFINA(GRAD,HESS,DPAR,3+NFEW,DETLOG,INDX,COVAR) +END +!*********************************************************** +SUBROUTINE REFINE(GRAD,HESS,NP,DETLOG,INDX,COVAR,STEPSZ) +INCLUDE 'res_par.f90' +INCLUDE 'options.f90' +COMMON /FFTCOM/ FRES(m_d2),FWRK(m_d2),XJ(m_d),TWOPIK(m_d1),NFFT +COMMON /DATCOM/ XDAT(m_d),DAT(m_d),SIG(m_d),NDAT +COMMON /DINTRP/ IPDAT(m_d),XPDAT(m_d) +COMMON /FITCOM/ FIT(m_d),RESID(m_d),NFEW,FITP(m_p),EXPF(m_d1,6) +COMMON /SCLCOM/ BSCL,ASCL,WSCL,SCLVEC(m_p,2),GSCL +COMMON /WRKCOM/ WORK(m_d2,2) +COMMON /GRDCOM/ DDDPAR(m_d,m_p),FR2PIK(m_d2,2) +COMMON /QW1COM/ QW1(m_sp),SIGQW1(m_sp),ISPEC +REAL GRAD(*),HESS(NP,*),COVAR(NP,*) +INTEGER INDX(*) +NFT2=NFFT/2+1 +CNORM=CCHI(FITP) +CALL VRFILL(HESS,0.0,NP*NP) +CALL VMLTRC(WORK,FR2PIK(1,2),NFT2,FWRK) +CALL VMLTRC(TWOPIK,FWRK,NFT2,WORK) +CALL VMLTIC(WORK,NFT2,WORK) +CALL FOUR2(FWRK,NFFT,1,-1,-1) +CALL DEGRID(FWRK,DDDPAR(1,4)) +CALL FOUR2(WORK,NFFT,1,-1,-1) +CALL DEGRID(WORK,FWRK) +CALL VRDOTR(RESID,FWRK,NDAT,HESS(4,4)) +CALL VCOPY(FR2PIK,FWRK,NFFT+2) +CALL FOUR2(FWRK,NFFT,1,-1,-1) +CALL DEGRID(FWRK,DDDPAR(1,3)) +CALL VCOPY(FR2PIK(1,2),FWRK,NFFT+2) +CALL FOUR2(FWRK,NFFT,1,-1,-1) +CALL DEGRID(FWRK,WORK) +CALL VRDOTR(RESID,WORK,NDAT,HESS(3,4)) +HESS(4,3)=HESS(3,4) +do I=1,NFEW + J=3+I+I + AJ=FITP(J)*ASCL + CALL VMLTRC(EXPF(1,I),FR2PIK,NFT2,WORK) + CALL VCOPY(WORK,FWRK,NFFT+2) + CALL FOUR2(FWRK,NFFT,1,-1,-1) + CALL DEGRID(FWRK,DDDPAR(1,J)) + CALL VMLTRC(TWOPIK,WORK,NFT2,FWRK) + CALL VCOPY(FWRK,WORK,NFFT+2) + CALL FOUR2(FWRK,NFFT,1,-1,-1) + CALL DEGRID(FWRK,DDDPAR(1,J+1)) + CALL HESS0(HESS,NP,RESID,NDAT,DDDPAR(1,J+1),AJ,J) + CALL VMLTIC(WORK,NFT2,WORK) + CALL VCOPY(WORK,FWRK,NFFT+2) + CALL FOUR2(FWRK,NFFT,1,-1,-1) + CALL DEGRID(FWRK,WORK(1,2)) + CALL VRDOTR(RESID,WORK(1,2),NDAT,HESS(4,J)) + HESS(J,4)=HESS(4,J) + CALL VMLTRC(TWOPIK,WORK,NFT2,FWRK) + CALL VCOPY(FWRK,WORK,NFFT+2) + CALL FOUR2(FWRK,NFFT,1,-1,-1) + CALL DEGRID(FWRK,WORK(1,2)) + CALL VRDOTR(RESID,WORK(1,2),NDAT,SM) + HESS(4,J+1)=-AJ*SM + HESS(J+1,4)=HESS(4,J+1) + CALL VMLTIC(WORK,NFT2,WORK) + CALL FOUR2(WORK,NFFT,1,-1,-1) + CALL DEGRID(WORK,FWRK) + CALL VRDOTR(RESID,FWRK,NDAT,SM) + HESS(J+1,J+1)=-AJ*SM +end do +CALL GRADPR(GRAD,RESID,NDAT,NP,SCLVEC(1,2)) +CALL HESS1(HESS,NP,SCLVEC(1,2),STEPSZ,0) +if(o_w1.eq.1)then + if (NP.GE.6) then + DIF=WSCL*FITP(6)-QW1(ISPEC) + SIG2=2.0/SIGQW1(ISPEC)**2 + GRAD(6)=GRAD(6)+SIG2*DIF*WSCL + HESS(6,6)=HESS(6,6)+SIG2*WSCL**2 + endif +endif +CALL INVERT(HESS,COVAR,NP,INDX,DETLOG) +END +!********************************************************** +SUBROUTINE SEEFIT(SIGPAR,CNORM,PRMSV,SIGSV) +INCLUDE 'res_par.f90' +COMMON /DATCOM/ XDAT(m_d),DAT(m_d),SIG(m_d),NDAT +COMMON /FITCOM/ FIT(m_d),RESID(m_d),NFEW,FITP(m_p),EXPF(m_d1,6) +COMMON /SCLCOM/ BSCL,ASCL,WSCL,SCLVEC(m_p,2),GSCL +COMMON /WRKCOM/ WORK(m_d2,2) +INCLUDE 'mod_files.f90' +REAL SIGPAR(*),PRMSV(*),SIGSV(*) +CHARACTER TITLE*80 +OPEN(UNIT=53,FILE=lptfile,STATUS='old',FORM='formatted', & + access='append') +ERRSCL=SQRT(CNORM) +WRITE(TITLE,100) NFEW +100 FORMAT(' Best-fit assuming no. of quasi-elastic lines = ',I2) +WRITE(53,100) NFEW +WRITE(53,120) CNORM +120 FORMAT(' >>> Normalised Chi-squared = ',F11.4) +WRITE(53,130) FITP(1)*BSCL,SIGPAR(1)*BSCL*ERRSCL +130 FORMAT(' Background(Xmin) = ',1PE12.3,' +- ',E10.2) +WRITE(53,140) FITP(2)*BSCL,SIGPAR(2)*BSCL*ERRSCL +140 FORMAT(' Background(Xmax) = ',1PE12.3,' +- ',E10.2) +WRITE(53,150) FITP(4)*GSCL*1000.0, & + SIGPAR(4)*GSCL*ERRSCL*1000.0 +150 FORMAT(' Zero offset = ',F12.2,' +- ',F10.2,' ueV') +WRITE(53,*)' Elastic line' +WRITE(53,160) FITP(3)*ASCL,SIGPAR(3)*ASCL*ERRSCL +160 FORMAT(5X,' Amplitude = ',1PE13.4,' +- ',E11.3) +PRMSV(1)=FITP(3)*ASCL +SIGSV(1)=SIGPAR(3)*ASCL*ERRSCL +do I=1,NFEW + J=4+I+I + WRITE(53,161) I +161 FORMAT(' Quasi-elastic line ',I2) + WRITE(53,170) 2000.0*FITP(J)*WSCL, & + 2000.0*SIGPAR(J)*WSCL*ERRSCL +170 FORMAT(5X,' FWHM = ',F13.2,' +- ',F11.2,' ueV') + WRITE(53,180) FITP(J-1)*ASCL,SIGPAR(J-1)*ASCL*ERRSCL +180 FORMAT(5X,' Amplitude = ',1PE13.4,' +- ',E11.3) + PRMSV(I+I)=FITP(J-1)*ASCL + SIGSV(I+I)=SIGPAR(J-1)*ASCL*ERRSCL + PRMSV(I+I+1)=2.0*FITP(J)*WSCL + SIGSV(I+I+1)=2.0*SIGPAR(J)*WSCL*ERRSCL +end do +close(unit=53) +END +! ---------------------------------------------------------- +SUBROUTINE INTDSP(X,Y,XL,XH,YL,YH,SIGPAR,ERRSCL,XMIN,XMAX) +INCLUDE 'res_par.f90' +COMMON /FITCOM/ FIT(m_d),RESID(m_d),NFEW,FITP(m_p),EXPF(m_d1,6) +COMMON /SCLCOM/ BSCL,ASCL,WSCL,SCLVEC(m_p,2),GSCL +REAL X(*),Y(*),XL(*),XH(*),YL(*),YH(*),SIGPAR(*) +XMAX=0.0 +CALL VRFILL(X,0.0,2*(NFEW+1)) +CALL VRFILL(Y,0.0,2*(NFEW+1)) +Y(2)=FITP(3)*ASCL +XL(1)=0.0 +XH(1)=0.0 +YL(1)=Y(2)-ASCL*SIGPAR(3)*ERRSCL +YH(1)=Y(2)+ASCL*SIGPAR(3)*ERRSCL +do I=1,NFEW + J=I+I+1 + X(J)=2.0*FITP(J+3)*WSCL + X(J+1)=X(J) + Y(J+1)=FITP(J+2)*ASCL + SIGX=SIGPAR(J+3)*WSCL*ERRSCL*2.0 + SIGY=SIGPAR(J+2)*ASCL*ERRSCL + XL(I+1)=X(J+1)-SIGX + XH(I+1)=X(J+1)+SIGX + YL(I+1)=Y(J+1)-SIGY + YH(I+1)=Y(J+1)+SIGY + IF (XH(I+1).GT.XMAX) XMAX=XH(I+1) +end do +IF (NFEW.EQ.0) XMAX=WSCL/10.0 +XMIN=-XMAX/50.0 +XMAX=XMAX*1.03 +END diff --git a/quasielasticbayes/QLse_main.f90 b/quasielasticbayes/QLse_main.f90 index 63f7900..fa06afc 100644 --- a/quasielasticbayes/QLse_main.f90 +++ b/quasielasticbayes/QLse_main.f90 @@ -1,282 +1,282 @@ -C**
******************************************************* -C PROGRAM QUASI_STEXP_2D -C ----------------------- -C -C----------------------------------------------------------------------- -C This program tries to estimate the parameters of an elstic peak and -C a single "stretched exponential" pertaining to some relevant data. -C It was modified from QUASI_LINES_2D, a 2-D Bayesian Quasi-elastic -C line-fitting program. The resolution function is given on a constant -C X-binning grid, and is assumed to be invariant. The background is -C assumed to be linear and the data should be of an intermediate Genie -C binary format, such as that output by batch-mode ICON. -C----------------------------------------------------------------------- -C Written by: D.S. Sivia, Rutherford Appleton Lab., Oxfordshire, England. -C----------------------------------------------------------------------- -C Initial release for trials by CJC, MAA, WSH. (DSS: 27-FEB-1992) -C Changed file access from sequential to direct. (DSS: 5-MAR-1992) -C Changed STEPSZ reduction from 0.85 to 0.6 . (DSS: 7-MAR-1992) -C Can read in a detector normalisation file. (DSS: 12-MAR-1992) -C Readonly for resol. file; silent-running modified. (DSS: 14-MAY-1992) -C WBF array-size increased in subroutine INBUFF. (DSS: 28-MAY-1992) -C Fixed bug in CLRBUF; problem for lots of detectors. (DSS: 29-MAY-1992) -C Hard-wired meV as input and ueV as output. (DSS: 2-OCT-1992) -C Put in STEPSZ safety-valve in case Chisq stuck! (DSS: 27-OCT-1992) -C Took out small and negative number safety-valve. (DSS: 17-DEC-1992) -C Fixed bug in DATIN1 (no more large error-bars!). (DSS: 27-SEP-1993) -C Modification of QUASI_LINES_2D.FOR . (DSS: 26-APR-1994) -C Do "stretched-exp" quasi_lines properly, I hope! (DSS: 9-JUN-1999) -C Corrected minor crashable bug! (DSS: 7-JUL-1999) -C----------------------------------------------------------------------- -C - SUBROUTINE QLstexp(numb,x_in,y_in,e_in,reals,opft, - 1 XD_in,XB_in,YB_in,Wy_in,We_in,dtn,xsc,sfile,rfile,l_fn, - 2 nd_out,xout,yout,eout,yfit,yprob) - INCLUDE 'mod_data.f90' - INCLUDE 'mod_files.f90' - INCLUDE 'options.f90' - COMMON /FFTCOM/ FRES(m_d2),FWRK(m_d2),XJ(m_d),TWOPIK(m_d1),NFFT - COMMON /DATCOM/ XDAT(m_d),DAT(m_d),SIG(m_d),NDAT - COMMON /DINTRP/ IPDAT(m_d),XPDAT(m_d) - COMMON /FITCOM/ FIT(m_d),RESID(m_d),NFEW,FITP(10),EXPF(m_d1,6) - COMMON /SCLCOM/ BSCL,ASCL,WSCL,SCLVEC(m_p,2),GSCL - COMMON /GRDCOM/ DDDPAR(m_d,m_p),FR2PIK(m_d2,2) - COMMON /WRKCOM/ WORK(m_d2,2) - COMMON /STEXP/ BETEXP,XBETA(101),BETCHI(101),NBTOT - COMMON/ModPars/NBIN,IMIN,IMAX,RSCL,BNORM - real x_in(m_d), y_in(m_d), e_in(m_d) -cf2py intent(in) :: x_in, y_in, e_in !sample data - real reals(4) -cf2py intent(in) :: reals !real parameters - real XD_in(m_d), XB_in(m_d), YB_in(m_d) -cf2py intent(in) :: XD_in, XB_in, YB_in !sample xrange, res data (blur) - real Wy_in(m_sp), We_in(m_sp), dtn(m_sp), xsc(m_sp) -cf2py intent(in) :: Wy_in, We_in, dtn, xsc !fixed width data - integer numb(9) -cf2py intent(in) :: numb !integer parameters - integer opft(4) -cf2py intent(in) :: opft !options parameters - integer l_fn -cf2py intent(in) :: l_fn !length of filenames - character*140 sfile, rfile -cf2py intent(in) :: sfile, rfile !sample & res filenames - integer nd_out -cf2py intent(out) :: nd_out !number of output points - real xout(m_d), yout(m_d), eout(m_d) -cf2py intent(out) :: xout, yout, eout !data values - real yfit(4*m_d) -cf2py intent(out) :: yfit !fit values - real yprob(2) -cf2py intent(out) :: yprob !probability values - integer l_title,l_user - character*80 title,user - real XBLR(m_d),YBLR(m_d) - REAL GRAD(m_p),HESS(m_p,m_p),DPAR(m_p),COVAR(m_p,m_p) - REAL SIGPAR(m_p),FITPSV(m_p),PARS(m_p),DPARS(m_p) - REAL DTNORM(m_sp),XSCALE(m_sp) - REAL PRBSV(4,m_sp),POUT(4,m_sp), - 1 PRMSV(7,4,m_sp),SIGSV(7,4,m_sp) - INTEGER INDX(m_p) - prog='s' - CALL init_paras - do n=1,m_p - GRAD(n)=0.0 - DPAR(n)=0.0 - SIGPAR(n)=0.0 - FITPSV(n)=0.0 - do m=1,m_p - HESS(n,m)=0.0 - COVAR(n,m)=0.0 - end do - end do - do n=1,m_sp - do n1=1,4 - PRBSV(n1,n)=0.0 - POUT(n1,n)=0.0 - do n2=1,7 - PRMSV(n2,n1,n)=0.0 - SIGSV(n2,n1,n)=0.0 - end do - end do - end do -c numb = [ngrp, nsp, ntc, Ndat, nbin, Imin, Imax, Nb, nrbin] - NSPEC=numb(1) !no. of groups - ISP=numb(2) !group number - ISPEC=ISP - ntc=numb(3) !no. of points - NDAT=numb(4) - NBIN=numb(5) - IMIN=numb(6) - IMAX=numb(7) - NB=numb(8) - nrbin=numb(9) -c reals = [efix, theta[isp], rscl, bnorm] - efix=reals(1) - theta(ISP)=reals(2) - RSCL=reals(3) - BNORM=reals(4) - do n=1,m_d - xin(n)=x_in(n) - yin(n)=y_in(n) - ein(n)=e_in(n) - XDAT(n)=XD_in(n) - XBLR(n)=XB_in(n) - YBLR(n)=YB_in(n) - end do - o_el=opft(1) - o_bgd=opft(2) - o_w1=opft(3) - do n=1,m_sp - DTNORM(n)=dtn(n) !DTNORM - XSCALE(n)=xsc(n) !XSCALE - yprob=0.0 - end do - lptfile = '' - fileout1 = '' - fileout2 = '' - fileout3 = '' - l_lpt=l_fn+8 - lptfile(1:l_lpt)=sfile(1:l_fn)//'_QSe.lpt' - l_file=l_fn+8 - fileout1(1:l_lpt)=sfile(1:l_fn)//'_QSe.qse' - l_title=9 - title='' - l_user=9 - user='' - if(ISP.eq.1)then !print info - call open_f(53,lptfile) - WRITE(53,1107)sfile -1107 format(' Sample file: ',a140) - WRITE(53,1108)rfile -1108 format(' Resolution file: ',a140) - write(53,1110)xin(imin),xin(imax) -1110 format(' Energy range: ',f8.3,' to ',f8.3,' meV') - if (o_el.eq.0) write(53,1111) - if (o_el.eq.1) write(53,1112) - if (o_bgd.eq.2) write(53,1113) - if (o_bgd.eq.1) write(53,1114) - if (o_bgd.eq.0) write(53,1115) -1111 format(' Elastic option : NO peak') -1112 format(' Elastic option : WITH peak') -1113 format(' Background option : sloping') -1114 format(' Background option : flat') -1115 format(' Background option : zero') - if(o_w1.eq.1)then - write(53,1116) - else - write(53,1117) - endif -1116 format(' Width option : fixed from file ') -1117 format(' Width option : free') - close(unit=53) - call open_f(1,fileout1) - n=1 - WRITE(n,1107)sfile - write(n,1121)title(1:l_title) -1121 format(' Title : ',a) - write(n,1122)user(1:l_user) -1122 format(' User : ',a) - write(n,120)NSPEC,NDAT,xin(imin),xin(imax) - 120 FORMAT(2X,2I10,2x,2f10.3,' ueV') - WRITE(n,*)' -------------------------------------------------' - WRITE(n,1108)rfile - WRITE(n,*) ' 1' - WRITE(n,*)' -------------------------------------------------' - close(unit=n) - endif !end print -c - CALL BLRINT(XBLR,YBLR,NB,1.0,.FALSE.) - NDAT=ntc-1 - CALL DPINIT - CALL GDINIT - NDAT=ntc-1 - CALL DATIN(ISP,DTNORM,IDUF) - CALL BLRINT(XBLR,YBLR,NB,XSCALE(ISP),.TRUE.) - CALL DPINIT - CALL PRINIT(FITP,3,NFEW,1) - CALL FileInit(1,ISP) - CALL REFINA(GRAD,HESS,DPAR,3+NFEW,DETLOG,INDX,COVAR) - GOTO 2 - 1 CALL SEARCH(GRAD,HESS,DPAR,NFEW,INDX,COVAR,FITP) - 2 NPARMS=4+2*NFEW - BETEXP=1.0 - CHIOLD=CBCHI(FITP) - CALL VCOPY(FITP,FITPSV,NPARMS) - STEPSZ=0.3 - IF (NFEW.GE.1) STEPSZ=STEPSZ/10.0 - IAGAIN=0 - CDIFMN=0.003 - do I=1,200 - CALL REFINE(GRAD,HESS,NPARMS,DETLOG,INDX,COVAR,STEPSZ) - CALL NEWEST(COVAR,GRAD,NPARMS,NFEW,DPAR,FITP) - CNORM=CBCHI(FITP) - IF (CNORM.LE.CHIOLD) THEN - CHIDIF=(CHIOLD-CNORM)/CNORM - IF (ABS(CHIDIF).LE.CDIFMN) THEN - IF (IAGAIN.EQ.0) THEN - CDIFMN=0.00005 - STEPSZ=0.15 - IAGAIN=1 - ELSE - GOTO 3 - ENDIF - ENDIF - CHIOLD=CNORM - CALL VCOPY(FITP,FITPSV,NPARMS) - ELSE - CALL VCOPY(FITPSV,FITP,NPARMS) - STEPSZ=STEPSZ*0.6 - IF (STEPSZ.LT.1.0E-10) GOTO 3 - ENDIF - end do - 3 CALL REFINE(GRAD,HESS,NPARMS,DETLOG,INDX,COVAR,0.25) - CNORM=CBCHI(FITP) - CALL REFINE(GRAD,HESS,NPARMS,DETLOG,INDX,COVAR,0.7) - CALL ERRBAR(COVAR,NPARMS,SIGPAR) - IF (NFEW.GT.0) THEN - CALL VCOPY(FITP,PARS,NPARMS) - PARS(NPARMS+1)=BETEXP - CALL VCOPY(SIGPAR,DPARS,NPARMS) - DPARS(NPARMS+1)=0.1 - CALL SIMOPT(PARS,DPARS,COVAR,NPARMS+1) - CALL VCOPY(PARS,FITP,NPARMS+1) - CALL ERRBAR(COVAR,NPARMS+1,SIGPAR) - CNORM=CCHI(FITP)/FLOAT(NDAT) - do I=1,NPARMS+1 - DPARS(I)=0.4*SIGPAR(I) - end do - CALL SIMOPT(PARS,DPARS,COVAR,NPARMS+1) - CALL VCOPY(PARS,FITP,NPARMS+1) - CALL ERRBAR(COVAR,NPARMS+1,SIGPAR) - CNORM=CCHI(FITP)/FLOAT(NDAT) - ENDIF - CALL SEEFIT(SIGPAR,CNORM,PRMSV(1,NFEW+1,ISP), - * SIGSV(1,NFEW+1,ISP),NPARMS+1) - CALL OUTPRM(FITP,COVAR,NPARMS+1,NFEW,CNORM) - call PROBN(CNORM,numb(4),DETLOG,NFEW,3, PRBSV(1,ISP)) - noff=NDAT*NFEW - do n=1,NDAT - yfit(noff+n)=FIT(n) - end do - NFEW=NFEW+1 - if (o_el.eq.0) then !no peak - FITP(3)=0.0 - FITPSV(3)=0.0 - endif - IF (NFEW.LE.1) GOTO 1 - nd_out=NDAT - do n=1,nd_out - xout(n)=XDAT(n) - yout(n)=DAT(n) - if(SIG(n).lt.1.0e-10)then - eout(n)=0.0 - else - eout(n)=SQRT(2.0/SIG(n)) - endif - end do - CALL PRBOUT(PRBSV,2,ISP,POUT) - do l=1,2 - yprob(l)=POUT(l,isp) - end do - RETURN - END +!**
******************************************************* +! PROGRAM QUASI_STEXP_2D +! ----------------------- +! +!----------------------------------------------------------------------- +! This program tries to estimate the parameters of an elstic peak and +! a single "stretched exponential" pertaining to some relevant data. +! It was modified from QUASI_LINES_2D, a 2-D Bayesian Quasi-elastic +! line-fitting program. The resolution function is given on a constant +! X-binning grid, and is assumed to be invariant. The background is +! assumed to be linear and the data should be of an intermediate Genie +! binary format, such as that output by batch-mode ICON. +!----------------------------------------------------------------------- +! Written by: D.S. Sivia, Rutherford Appleton Lab., Oxfordshire, England. +!----------------------------------------------------------------------- +! Initial release for trials by CJC, MAA, WSH. (DSS: 27-FEB-1992) +! Changed file access from sequential to direct. (DSS: 5-MAR-1992) +! Changed STEPSZ reduction from 0.85 to 0.6 . (DSS: 7-MAR-1992) +! Can read in a detector normalisation file. (DSS: 12-MAR-1992) +! Readonly for resol. file; silent-running modified. (DSS: 14-MAY-1992) +! WBF array-size increased in subroutine INBUFF. (DSS: 28-MAY-1992) +! Fixed bug in CLRBUF; problem for lots of detectors. (DSS: 29-MAY-1992) +! Hard-wired meV as input and ueV as output. (DSS: 2-OCT-1992) +! Put in STEPSZ safety-valve in case Chisq stuck! (DSS: 27-OCT-1992) +! Took out small and negative number safety-valve. (DSS: 17-DEC-1992) +! Fixed bug in DATIN1 (no more large error-bars!). (DSS: 27-SEP-1993) +! Modification of QUASI_LINES_2D.FOR . (DSS: 26-APR-1994) +! Do "stretched-exp" quasi_lines properly, I hope! (DSS: 9-JUN-1999) +! Corrected minor crashable bug! (DSS: 7-JUL-1999) +!----------------------------------------------------------------------- +! +SUBROUTINE QLstexp(numb,x_in,y_in,e_in,reals,opft, & + XD_in,XB_in,YB_in,Wy_in,We_in,dtn,xsc,sfile,rfile,l_fn, & + nd_out,xout,yout,eout,yfit,yprob) +INCLUDE 'mod_data.f90' +INCLUDE 'mod_files.f90' +INCLUDE 'options.f90' +COMMON /FFTCOM/ FRES(m_d2),FWRK(m_d2),XJ(m_d),TWOPIK(m_d1),NFFT +COMMON /DATCOM/ XDAT(m_d),DAT(m_d),SIG(m_d),NDAT +COMMON /DINTRP/ IPDAT(m_d),XPDAT(m_d) +COMMON /FITCOM/ FIT(m_d),RESID(m_d),NFEW,FITP(10),EXPF(m_d1,6) +COMMON /SCLCOM/ BSCL,ASCL,WSCL,SCLVEC(m_p,2),GSCL +COMMON /GRDCOM/ DDDPAR(m_d,m_p),FR2PIK(m_d2,2) +COMMON /WRKCOM/ WORK(m_d2,2) +COMMON /STEXP/ BETEXP,XBETA(101),BETCHI(101),NBTOT +COMMON/ModPars/NBIN,IMIN,IMAX,RSCL,BNORM +real x_in(m_d), y_in(m_d), e_in(m_d) +!f2py intent(in) :: x_in, y_in, e_in !sample data +real reals(4) +!f2py intent(in) :: reals !real parameters +real XD_in(m_d), XB_in(m_d), YB_in(m_d) +!f2py intent(in) :: XD_in, XB_in, YB_in !sample xrange, res data (blur) +real Wy_in(m_sp), We_in(m_sp), dtn(m_sp), xsc(m_sp) +!f2py intent(in) :: Wy_in, We_in, dtn, xsc !fixed width data +integer numb(9) +!f2py intent(in) :: numb !integer parameters +integer opft(4) +!f2py intent(in) :: opft !options parameters +integer l_fn +!f2py intent(in) :: l_fn !length of filenames +character*140 sfile, rfile +!f2py intent(in) :: sfile, rfile !sample & res filenames +integer nd_out +!f2py intent(out) :: nd_out !number of output points +real xout(m_d), yout(m_d), eout(m_d) +!f2py intent(out) :: xout, yout, eout !data values +real yfit(4*m_d) +!f2py intent(out) :: yfit !fit values +real yprob(2) +!f2py intent(out) :: yprob !probability values +integer l_title,l_user +character*80 title,user +real XBLR(m_d),YBLR(m_d) +REAL GRAD(m_p),HESS(m_p,m_p),DPAR(m_p),COVAR(m_p,m_p) +REAL SIGPAR(m_p),FITPSV(m_p),PARS(m_p),DPARS(m_p) +REAL DTNORM(m_sp),XSCALE(m_sp) +REAL PRBSV(4,m_sp),POUT(4,m_sp), & + PRMSV(7,4,m_sp),SIGSV(7,4,m_sp) +INTEGER INDX(m_p) +prog='s' +CALL init_paras +do n=1,m_p + GRAD(n)=0.0 + DPAR(n)=0.0 + SIGPAR(n)=0.0 + FITPSV(n)=0.0 + do m=1,m_p + HESS(n,m)=0.0 + COVAR(n,m)=0.0 + end do +end do +do n=1,m_sp + do n1=1,4 + PRBSV(n1,n)=0.0 + POUT(n1,n)=0.0 + do n2=1,7 + PRMSV(n2,n1,n)=0.0 + SIGSV(n2,n1,n)=0.0 + end do + end do +end do +! numb = [ngrp, nsp, ntc, Ndat, nbin, Imin, Imax, Nb, nrbin] +NSPEC=numb(1) !no. of groups +ISP=numb(2) !group number +ISPEC=ISP +ntc=numb(3) !no. of points +NDAT=numb(4) +NBIN=numb(5) +IMIN=numb(6) +IMAX=numb(7) +NB=numb(8) +nrbin=numb(9) +! reals = [efix, theta[isp], rscl, bnorm] +efix=reals(1) +theta(ISP)=reals(2) +RSCL=reals(3) +BNORM=reals(4) +do n=1,m_d + xin(n)=x_in(n) + yin(n)=y_in(n) + ein(n)=e_in(n) + XDAT(n)=XD_in(n) + XBLR(n)=XB_in(n) + YBLR(n)=YB_in(n) +end do +o_el=opft(1) +o_bgd=opft(2) +o_w1=opft(3) +do n=1,m_sp + DTNORM(n)=dtn(n) !DTNORM + XSCALE(n)=xsc(n) !XSCALE + yprob=0.0 +end do +lptfile = '' +fileout1 = '' +fileout2 = '' +fileout3 = '' +l_lpt=l_fn+8 +lptfile(1:l_lpt)=sfile(1:l_fn)//'_QSe.lpt' +l_file=l_fn+8 +fileout1(1:l_lpt)=sfile(1:l_fn)//'_QSe.qse' +l_title=9 +title='' +l_user=9 +user='' +if(ISP.eq.1)then !print info + call open_f(53,lptfile) + WRITE(53,1107)sfile +1107 format(' Sample file: ',a140) + WRITE(53,1108)rfile +1108 format(' Resolution file: ',a140) + write(53,1110)xin(imin),xin(imax) +1110 format(' Energy range: ',f8.3,' to ',f8.3,' meV') + if (o_el.eq.0) write(53,1111) + if (o_el.eq.1) write(53,1112) + if (o_bgd.eq.2) write(53,1113) + if (o_bgd.eq.1) write(53,1114) + if (o_bgd.eq.0) write(53,1115) +1111 format(' Elastic option : NO peak') +1112 format(' Elastic option : WITH peak') +1113 format(' Background option : sloping') +1114 format(' Background option : flat') +1115 format(' Background option : zero') + if(o_w1.eq.1)then + write(53,1116) + else + write(53,1117) + endif +1116 format(' Width option : fixed from file ') +1117 format(' Width option : free') + close(unit=53) + call open_f(1,fileout1) + n=1 + WRITE(n,1107)sfile + write(n,1121)title(1:l_title) +1121 format(' Title : ',a) + write(n,1122)user(1:l_user) +1122 format(' User : ',a) + write(n,120)NSPEC,NDAT,xin(imin),xin(imax) +120 FORMAT(2X,2I10,2x,2f10.3,' ueV') + WRITE(n,*)' -------------------------------------------------' + WRITE(n,1108)rfile + WRITE(n,*) ' 1' + WRITE(n,*)' -------------------------------------------------' + close(unit=n) +endif !end print +! +CALL BLRINT(XBLR,YBLR,NB,1.0,.FALSE.) +NDAT=ntc-1 +CALL DPINIT +CALL GDINIT +NDAT=ntc-1 +CALL DATIN(ISP,DTNORM,IDUF) +CALL BLRINT(XBLR,YBLR,NB,XSCALE(ISP),.TRUE.) +CALL DPINIT +CALL PRINIT(FITP,3,NFEW,1) +CALL FileInit(1,ISP) +CALL REFINA(GRAD,HESS,DPAR,3+NFEW,DETLOG,INDX,COVAR) +GOTO 2 +1 CALL SEARCH(GRAD,HESS,DPAR,NFEW,INDX,COVAR,FITP) +2 NPARMS=4+2*NFEW +BETEXP=1.0 +CHIOLD=CBCHI(FITP) +CALL VCOPY(FITP,FITPSV,NPARMS) +STEPSZ=0.3 +IF (NFEW.GE.1) STEPSZ=STEPSZ/10.0 +IAGAIN=0 +CDIFMN=0.003 +do I=1,200 + CALL REFINE(GRAD,HESS,NPARMS,DETLOG,INDX,COVAR,STEPSZ) + CALL NEWEST(COVAR,GRAD,NPARMS,NFEW,DPAR,FITP) + CNORM=CBCHI(FITP) + IF (CNORM.LE.CHIOLD) THEN + CHIDIF=(CHIOLD-CNORM)/CNORM + IF (ABS(CHIDIF).LE.CDIFMN) THEN + IF (IAGAIN.EQ.0) THEN + CDIFMN=0.00005 + STEPSZ=0.15 + IAGAIN=1 + ELSE + GOTO 3 + ENDIF + ENDIF + CHIOLD=CNORM + CALL VCOPY(FITP,FITPSV,NPARMS) + ELSE + CALL VCOPY(FITPSV,FITP,NPARMS) + STEPSZ=STEPSZ*0.6 + IF (STEPSZ.LT.1.0E-10) GOTO 3 + ENDIF +end do +3 CALL REFINE(GRAD,HESS,NPARMS,DETLOG,INDX,COVAR,0.25) +CNORM=CBCHI(FITP) +CALL REFINE(GRAD,HESS,NPARMS,DETLOG,INDX,COVAR,0.7) +CALL ERRBAR(COVAR,NPARMS,SIGPAR) +IF (NFEW.GT.0) THEN + CALL VCOPY(FITP,PARS,NPARMS) + PARS(NPARMS+1)=BETEXP + CALL VCOPY(SIGPAR,DPARS,NPARMS) + DPARS(NPARMS+1)=0.1 + CALL SIMOPT(PARS,DPARS,COVAR,NPARMS+1) + CALL VCOPY(PARS,FITP,NPARMS+1) + CALL ERRBAR(COVAR,NPARMS+1,SIGPAR) + CNORM=CCHI(FITP)/FLOAT(NDAT) + do I=1,NPARMS+1 + DPARS(I)=0.4*SIGPAR(I) + end do + CALL SIMOPT(PARS,DPARS,COVAR,NPARMS+1) + CALL VCOPY(PARS,FITP,NPARMS+1) + CALL ERRBAR(COVAR,NPARMS+1,SIGPAR) + CNORM=CCHI(FITP)/FLOAT(NDAT) +ENDIF +CALL SEEFIT(SIGPAR,CNORM,PRMSV(1,NFEW+1,ISP), & + SIGSV(1,NFEW+1,ISP),NPARMS+1) +CALL OUTPRM(FITP,COVAR,NPARMS+1,NFEW,CNORM) +call PROBN(CNORM,numb(4),DETLOG,NFEW,3, PRBSV(1,ISP)) +noff=NDAT*NFEW +do n=1,NDAT + yfit(noff+n)=FIT(n) +end do +NFEW=NFEW+1 +if (o_el.eq.0) then !no peak + FITP(3)=0.0 + FITPSV(3)=0.0 +endif +IF (NFEW.LE.1) GOTO 1 +nd_out=NDAT +do n=1,nd_out + xout(n)=XDAT(n) + yout(n)=DAT(n) + if(SIG(n).lt.1.0e-10)then + eout(n)=0.0 + else + eout(n)=SQRT(2.0/SIG(n)) + endif +end do +CALL PRBOUT(PRBSV,2,ISP,POUT) +do l=1,2 + yprob(l)=POUT(l,isp) +end do +RETURN +END diff --git a/quasielasticbayes/QLse_subs.f90 b/quasielasticbayes/QLse_subs.f90 index d7fdd3d..318e3d9 100644 --- a/quasielasticbayes/QLse_subs.f90 +++ b/quasielasticbayes/QLse_subs.f90 @@ -1,369 +1,369 @@ - SUBROUTINE init_paras - INCLUDE 'res_par.f90' - COMMON /FFTCOM/ FRES(m_d2),FWRK(m_d2),XJ(m_d),TWOPIK(m_d1),NFFT - COMMON /DATCOM/ XDAT(m_d),DAT(m_d),SIG(m_d),NDAT - COMMON /DINTRP/ IPDAT(m_d),XPDAT(m_d) - COMMON /FITCOM/ FIT(m_d),RESID(m_d),NFEW,FITP(m_p),EXPF(m_d1,6) - COMMON /SCLCOM/ BSCL,ASCL,WSCL,SCLVEC(m_p,2),GSCL - COMMON /GRDCOM/ DDDPAR(m_d,m_p),FR2PIK(m_d2,2) - COMMON /QW1COM/ QW1(m_sp),SIGQW1(m_sp),ISPEC - COMMON /WRKCOM/ WORK(m_d2,2) - do n=1,m_d - XJ(n)=0.0 - XDAT(n)=0.0 - DAT(n)=0.0 - SIG(n)=0.0 - IPDAT(n)=0 - XPDAT(n)=0.0 - FIT(n)=0.0 - RESID(n)=0.0 - do m=1,m_p - DDDPAR(n,m)=0.0 - end do - end do - do n=1,m_d1 - TWOPIK(n)=0.0 - do m=1,3 - EXPF(n,m)=0.0 - end do - end do - do n=1,m_d2 - FRES(n)=0.0 - FWRK(n)=0.0 - do m=1,2 - FR2PIK(n,m)=0.0 - WORK(n,m)=0.0 - end do - end do - do n=1,m_p - FITP(n)=0.0 - do m=1,2 - SCLVEC(n,m)=0.0 - end do - end do - do n=1,m_sp - QW1(n)=0.0 - SIGQW1(n)=0.0 - end do - RETURN - END -C ------------------------------------ - SUBROUTINE OUTPRM(P,C,NP,NFEW,CNORM) - INCLUDE 'mod_files.f90' - REAL P(*),C(NP,*) - IF (NFEW.LT.1 .OR. NFEW.GT.2) RETURN - OPEN(UNIT=1,FILE=fileout1,STATUS='old',FORM='formatted', - 1 access='append') - WRITE(NFEW,100) P(3),P(1),P(2),P(4) - do I=5,NP-1,2 - WRITE(NFEW,100) P(I),P(I+1) - end do - CSCALE=2.0*CNORM - do J=1,NP - do I=1,NP - C(I,J)=CSCALE*C(I,J) - end do - end do - WRITE(NFEW,100) C(3,3) - WRITE(NFEW,100) C(3,5),C(5,5) - WRITE(NFEW,100) C(3,6),C(5,6),C(6,6) - 100 FORMAT(1PE13.4,4E13.4) - WRITE(NFEW,100) P(NP) - WRITE(NFEW,100) C(3,NP),C(5,NP),C(6,NP),C(7,NP) - WRITE(NFEW,*)' -------------------------------------------------' - close(unit=1) - END -C -C***************************************** - SUBROUTINE BTINIT(X,N,XMIN,XMAX,NBMIN) - REAL X(*) - INTEGER NBMIN(*) - NBMIN(1)=N - NBMIN(2)=NINT(0.1*FLOAT(N)) - DX=(XMAX-XMIN)/FLOAT(N-1) - X(1)=XMIN - do I=2,N - X(I)=X(I-1)+DX - end do - END -C -C***************************************** -C - FUNCTION CCHI(V) - INCLUDE 'res_par.f90' - INCLUDE 'options.f90' - COMMON /FFTCOM/ FRES(m_d2),FWRK(m_d2),XJ(m_d),TWOPIK(m_d1),NFFT - COMMON /DATCOM/ XDAT(m_d),DAT(m_d),SIG(m_d),NDAT - COMMON /DINTRP/ IPDAT(m_d),XPDAT(m_d) - COMMON /FITCOM/ FIT(m_d),RESID(m_d),NFEW,FITP(m_p),EXPF(m_d1,6) - COMMON /SCLCOM/ BSCL,ASCL,WSCL,SCLVEC(m_p,2),GSCL - COMMON /GRDCOM/ DDDPAR(m_d,m_p),FR2PIK(m_d2,2) - COMMON /QW1COM/ QW1(m_sp),SIGQW1(m_sp),ISPEC - COMMON /WRKCOM/ WORK(m_d2,2) - REAL V(*) - PI=3.141592654 - VSMALL=0.0001 - small=0.001 - CCHI=1.0E+10 - CHI=0.0 - B1=BSCL*V(1) - B2=BSCL*V(2) - A0=ASCL*V(3) - DELTAX=V(4) - NFT2=NFFT/2+1 - CALL CXSHFT(FRES,DELTAX,TWOPIK,FR2PIK,FR2PIK(1,2),NFT2) - CALL VRFILL(WORK,A0,NFT2) - IF (NFEW.GT.0) THEN - BETEXP=V(5+2*NFEW) - IF (BETEXP.LT.0.01) RETURN - ENDIF - PI2=2.0*PI - do J=1,NFEW - J3=J+3 - AJ=ASCL*V(3+J+J) - IF (V(4+J+J).LT.VSMALL) RETURN - SPNORM=WSCL*V(4+J+J)/(GSCL*PI2) - EXPF(1,J)=1.0 - EXPF(1,J3)=0.0 - WORK(1,1)=WORK(1,1)+AJ - do I=2,NFT2 - SIGIJ=SPNORM*TWOPIK(I) - EXPIJ=EXP(-PI2*SIGIJ**BETEXP) - EXPF(I,J)=EXPIJ - EXPF(I,J3)=SIGIJ - WORK(I,1)=WORK(I,1)+AJ*EXPIJ - end do - end do - CALL VMLTRC(WORK,FR2PIK,NFT2,FWRK) - CALL FOUR2(FWRK,NFFT,1,-1,-1) - CALL DEGRID(FWRK,FIT) - X1=XDAT(1) - if(o_bgd.eq.2) BNRM=(B2-B1)/(XDAT(NDAT)-X1) -C avoid conflict BNORM with ModPars - do I=1,NDAT - FIT(I)=FIT(I)+B1 - if(o_bgd.eq.2) FIT(I)=FIT(I)+BNRM*(XDAT(I)-X1) - DIF=FIT(I)-DAT(I) - RESID(I)=DIF*SIG(I) - CHI=CHI+DIF*RESID(I) - end do - CCHI=CHI/2.0 - sm2=small*small - v12=V(1)-V(2) - if(v12.lt.vsmall)v12=1.0 - if(o_bgd.le.1) CCHI=CCHI+v12*v12/sm2 - END -C -C****************************** -C - SUBROUTINE SEARCH(GRAD,HESS,DPAR,NFEW,INDX,COVAR,FITP) - INCLUDE 'res_par.f90' - INCLUDE 'options.f90' - COMMON /SCLCOM/ BSCL,ASCL,WSCL,SCLVEC(m_p,2),GSCL - COMMON /QW1COM/ QW1(m_sp),SIGQW1(m_sp),ISPEC - REAL GRAD(*),HESS(*),DPAR(*),COVAR(*),FITP(*) - INTEGER INDX(*) - J=4+2*NFEW - DXLOG=0.85 - NSRCH=NINT(LOG(5.0*GSCL/WSCL)/LOG(DXLOG)) - CMIN=1.0E20 - FITP(J-1)=0.1 - FITP(J)=1.0 - do I=1,NSRCH - CALL REFINA(GRAD,HESS,DPAR,3+NFEW,DETLOG,INDX,COVAR) - CNORM=CBCHI(FITP) - IF (CNORM.LT.CMIN) THEN - CMIN=CNORM - SIGJ=FITP(J) - ENDIF - FITP(J)=FITP(J)*DXLOG - end do - FITP(J)=SIGJ - CALL REFINA(GRAD,HESS,DPAR,3+NFEW,DETLOG,INDX,COVAR) - END -C -C*********************************************************** -C - SUBROUTINE REFINE(GRAD,HESS,NP,DETLOG,INDX,COVAR,STEPSZ) - INCLUDE 'res_par.f90' - INCLUDE 'options.f90' - COMMON /FFTCOM/ FRES(m_d2),FWRK(m_d2),XJ(m_d),TWOPIK(m_d1),NFFT - COMMON /DATCOM/ XDAT(m_d),DAT(m_d),SIG(m_d),NDAT - COMMON /DINTRP/ IPDAT(m_d),XPDAT(m_d) - COMMON /FITCOM/ FIT(m_d),RESID(m_d),NFEW,FITP(m_p),EXPF(m_d1,6) - COMMON /SCLCOM/ BSCL,ASCL,WSCL,SCLVEC(m_p,2),GSCL - COMMON /WRKCOM/ WORK(m_d2,2) - COMMON /GRDCOM/ DDDPAR(m_d,m_p),FR2PIK(m_d2,2) - COMMON /STEXP/ BETEXP,XBETA(101),BETCHI(101),NBTOT - COMMON /QW1COM/ QW1(m_sp),SIGQW1(m_sp),ISPEC - REAL GRAD(*),HESS(NP,*),COVAR(NP,*) - INTEGER INDX(*) - NFT2=NFFT/2+1 - CNORM=CBCHI(FITP) - CALL VRFILL(HESS,0.0,NP*NP) - CALL VMLTRC(WORK,FR2PIK(1,2),NFT2,FWRK) - CALL VMLTRC(TWOPIK,FWRK,NFT2,WORK) - CALL VMLTIC(WORK,NFT2,WORK) - CALL FOUR2(FWRK,NFFT,1,-1,-1) - CALL DEGRID(FWRK,DDDPAR(1,4)) - CALL FOUR2(WORK,NFFT,1,-1,-1) - CALL DEGRID(WORK,FWRK) - CALL VRDOTR(RESID,FWRK,NDAT,HESS(4,4)) - CALL VCOPY(FR2PIK,FWRK,NFFT+2) - CALL FOUR2(FWRK,NFFT,1,-1,-1) - CALL DEGRID(FWRK,DDDPAR(1,3)) - CALL VCOPY(FR2PIK(1,2),FWRK,NFFT+2) - CALL FOUR2(FWRK,NFFT,1,-1,-1) - CALL DEGRID(FWRK,WORK) - CALL VRDOTR(RESID,WORK,NDAT,HESS(3,4)) - HESS(4,3)=HESS(3,4) - do I=1,NFEW - J=3+I+I - AJ=FITP(J)*ASCL - CALL VMLTRC(EXPF(1,I),FR2PIK,NFT2,WORK) - CALL VCOPY(WORK,FWRK,NFFT+2) - CALL FOUR2(FWRK,NFFT,1,-1,-1) - CALL DEGRID(FWRK,DDDPAR(1,J)) - CALL VMLTRC(TWOPIK,WORK,NFT2,FWRK) - CALL VCOPY(FWRK,WORK,NFFT+2) - CALL VMLTB1(FWRK,EXPF(1,I+3),BETEXP,NFT2) - CALL FOUR2(FWRK,NFFT,1,-1,-1) - CALL DEGRID(FWRK,DDDPAR(1,J+1)) - CALL HESS0(HESS,NP,RESID,NDAT,DDDPAR(1,J+1),AJ,J) - CALL VMLTIC(WORK,NFT2,WORK) - CALL VCOPY(WORK,FWRK,NFFT+2) - CALL FOUR2(FWRK,NFFT,1,-1,-1) - CALL DEGRID(FWRK,WORK(1,2)) - CALL VRDOTR(RESID,WORK(1,2),NDAT,HESS(4,J)) - HESS(J,4)=HESS(4,J) - CALL VMLTRC(TWOPIK,WORK,NFT2,FWRK) - CALL VCOPY(FWRK,WORK,NFFT+2) - CALL VMLTB1(FWRK,EXPF(1,I+3),BETEXP,NFT2) - CALL FOUR2(FWRK,NFFT,1,-1,-1) - CALL DEGRID(FWRK,WORK(1,2)) - CALL VRDOTR(RESID,WORK(1,2),NDAT,SM) - HESS(4,J+1)=-AJ*SM - HESS(J+1,4)=HESS(4,J+1) - CALL VMLTIC(WORK,NFT2,WORK) - CALL VMLTB2(WORK,EXPF(1,I+3),BETEXP,NFT2) - CALL FOUR2(WORK,NFFT,1,-1,-1) - CALL DEGRID(WORK,FWRK) - CALL VRDOTR(RESID,FWRK,NDAT,SM) - HESS(J+1,J+1)=-AJ*SM - end do - CALL GRADPR(GRAD,RESID,NDAT,NP,SCLVEC(1,2)) - CALL HESS1(HESS,NP,SCLVEC(1,2),STEPSZ,0) - CALL MTXINV(HESS,COVAR,NP,INDX,DETLOG) - END -C --------------------------- - SUBROUTINE VMLTB1(F,SK,B,N) - COMPLEX F(*) - REAL SK(*) - B1=B-1.0 - do I=2,N - BFACT=B*SK(I)**B1 - F(I)=BFACT*F(I) - end do - END -C --------------------------- - SUBROUTINE VMLTB2(F,SK,B,N) - COMPLEX F(*) - REAL SK(*) - DATA PI /3.141592654/ - PI2=2.0*PI - B1=B-1.0 - B2=B-2.0 - do I=2,N - BB1=B*SK(I)**B1 - BFACT=BB1*(BB1-B1/(PI2*SK(I))) - F(I)=BFACT*F(I) - end do - END -C -C********************************************************** -C - SUBROUTINE SEEFIT(SIGPAR,CNORM,PRMSV,SIGSV,NP) - INCLUDE 'res_par.f90' - INCLUDE 'mod_files.f90' - COMMON /DATCOM/ XDAT(m_d),DAT(m_d),SIG(m_d),NDAT - COMMON /FITCOM/ FIT(m_d),RESID(m_d),NFEW,FITP(m_p),EXPF(m_d1,6) - COMMON /SCLCOM/ BSCL,ASCL,WSCL,SCLVEC(m_p,2),GSCL - COMMON /WRKCOM/ WORK(m_d2,2) - REAL SIGPAR(*),PRMSV(*),SIGSV(*) - CHARACTER TITLE*80 - OPEN(UNIT=53,FILE=lptfile,STATUS='old',FORM='formatted', - 1 access='append') - ERRSCL=SQRT(CNORM) - WRITE(TITLE,100) NFEW - 100 FORMAT(' Best-fit assuming no. of quasi-elastic lines = ',I2) - WRITE(53,100) NFEW - WRITE(53,120) CNORM - 120 FORMAT(' >>> Normalised Chi-squared = ',F11.4) - WRITE(53,130) FITP(1)*BSCL,SIGPAR(1)*BSCL*ERRSCL - 130 FORMAT(' Background(Xmin) = ',1PE12.3,' +- ',E10.2) - WRITE(53,140) FITP(2)*BSCL,SIGPAR(2)*BSCL*ERRSCL - 140 FORMAT(' Background(Xmax) = ',1PE12.3,' +- ',E10.2) - WRITE(53,150) FITP(4)*GSCL*1000.0, - 1 SIGPAR(4)*GSCL*ERRSCL*1000.0 - 150 FORMAT(' Zero offset = ',F12.2,' +- ',F10.2,' ueV') - WRITE(53,*)' Elastic line' - WRITE(53,160) FITP(3)*ASCL,SIGPAR(3)*ASCL*ERRSCL - 160 FORMAT(5X,' Amplitude = ',1PE13.4,' +- ',E11.3) - PRMSV(1)=FITP(3)*ASCL - SIGSV(1)=SIGPAR(3)*ASCL*ERRSCL - do I=1,NFEW - J=4+I+I - WRITE(53,161) I - 161 FORMAT(' Stretched-exponential : line ',I2) - WRITE(53,170) 2000.0*FITP(J)*WSCL, - 1 2000.0*SIGPAR(J)*WSCL*ERRSCL - 170 FORMAT(5X,' 2*Sigma = ',F13.2,' +- ',F11.2,' ueV') - WRITE(53,180) FITP(J-1)*ASCL,SIGPAR(J-1)*ASCL*ERRSCL - 180 FORMAT(5X,' Amplitude = ',1PE13.4,' +- ',E11.3) - PRMSV(I+I)=FITP(J-1)*ASCL - SIGSV(I+I)=SIGPAR(J-1)*ASCL*ERRSCL - PRMSV(I+I+1)=2.0*FITP(J)*WSCL - SIGSV(I+I+1)=2.0*SIGPAR(J)*WSCL*ERRSCL - end do - IF (NFEW.GT.0) THEN - BT0=FITP(NP) - BTSIG=SIGPAR(NP) - WRITE(53,190) BT0,BTSIG - 190 FORMAT(5X,' Exp-Beta = ',F13.3,' +- ',F11.3) - PRMSV(NFEW+NFEW+2)=BT0 - SIGSV(NFEW+NFEW+2)=BTSIG - ENDIF - close(unit=53) - END -C ---------------------------------------------------------- - SUBROUTINE INTDSP(X,Y,XL,XH,YL,YH,SIGPAR,ERRSCL,XMIN,XMAX) - INCLUDE 'res_par.f90' - COMMON /FITCOM/ FIT(m_d),RESID(m_d),NFEW,FITP(m_p),EXPF(m_d1,6) - COMMON /SCLCOM/ BSCL,ASCL,WSCL,SCLVEC(m_p,2),GSCL - REAL X(*),Y(*),XL(*),XH(*),YL(*),YH(*),SIGPAR(*) - XMAX=0.0 - CALL VRFILL(X,0.0,2*(NFEW+1)) - CALL VRFILL(Y,0.0,2*(NFEW+1)) - Y(2)=FITP(3)*ASCL - XL(1)=0.0 - XH(1)=0.0 - YL(1)=Y(2)-ASCL*SIGPAR(3)*ERRSCL - YH(1)=Y(2)+ASCL*SIGPAR(3)*ERRSCL - do I=1,NFEW - J=I+I+1 - X(J)=2.0*FITP(J+3)*WSCL - X(J+1)=X(J) - Y(J+1)=FITP(J+2)*ASCL - SIGX=SIGPAR(J+3)*WSCL*ERRSCL*2.0 - SIGY=SIGPAR(J+2)*ASCL*ERRSCL - XL(I+1)=X(J+1)-SIGX - XH(I+1)=X(J+1)+SIGX - YL(I+1)=Y(J+1)-SIGY - YH(I+1)=Y(J+1)+SIGY - IF (XH(I+1).GT.XMAX) XMAX=XH(I+1) - end do - IF (NFEW.EQ.0) XMAX=WSCL/10.0 - XMIN=-XMAX/50.0 - XMAX=XMAX*1.03 - END -C +SUBROUTINE init_paras +INCLUDE 'res_par.f90' +COMMON /FFTCOM/ FRES(m_d2),FWRK(m_d2),XJ(m_d),TWOPIK(m_d1),NFFT +COMMON /DATCOM/ XDAT(m_d),DAT(m_d),SIG(m_d),NDAT +COMMON /DINTRP/ IPDAT(m_d),XPDAT(m_d) +COMMON /FITCOM/ FIT(m_d),RESID(m_d),NFEW,FITP(m_p),EXPF(m_d1,6) +COMMON /SCLCOM/ BSCL,ASCL,WSCL,SCLVEC(m_p,2),GSCL +COMMON /GRDCOM/ DDDPAR(m_d,m_p),FR2PIK(m_d2,2) +COMMON /QW1COM/ QW1(m_sp),SIGQW1(m_sp),ISPEC +COMMON /WRKCOM/ WORK(m_d2,2) +do n=1,m_d + XJ(n)=0.0 + XDAT(n)=0.0 + DAT(n)=0.0 + SIG(n)=0.0 + IPDAT(n)=0 + XPDAT(n)=0.0 + FIT(n)=0.0 + RESID(n)=0.0 + do m=1,m_p + DDDPAR(n,m)=0.0 + end do +end do +do n=1,m_d1 + TWOPIK(n)=0.0 + do m=1,3 + EXPF(n,m)=0.0 + end do +end do +do n=1,m_d2 + FRES(n)=0.0 + FWRK(n)=0.0 + do m=1,2 + FR2PIK(n,m)=0.0 + WORK(n,m)=0.0 + end do +end do +do n=1,m_p + FITP(n)=0.0 + do m=1,2 + SCLVEC(n,m)=0.0 + end do +end do +do n=1,m_sp + QW1(n)=0.0 + SIGQW1(n)=0.0 +end do +RETURN +END +! ------------------------------------ +SUBROUTINE OUTPRM(P,C,NP,NFEW,CNORM) +INCLUDE 'mod_files.f90' +REAL P(*),C(NP,*) +IF (NFEW.LT.1 .OR. NFEW.GT.2) RETURN +OPEN(UNIT=1,FILE=fileout1,STATUS='old',FORM='formatted', & + access='append') +WRITE(NFEW,100) P(3),P(1),P(2),P(4) +do I=5,NP-1,2 + WRITE(NFEW,100) P(I),P(I+1) +end do +CSCALE=2.0*CNORM +do J=1,NP + do I=1,NP + C(I,J)=CSCALE*C(I,J) + end do +end do +WRITE(NFEW,100) C(3,3) +WRITE(NFEW,100) C(3,5),C(5,5) +WRITE(NFEW,100) C(3,6),C(5,6),C(6,6) +100 FORMAT(1PE13.4,4E13.4) +WRITE(NFEW,100) P(NP) +WRITE(NFEW,100) C(3,NP),C(5,NP),C(6,NP),C(7,NP) +WRITE(NFEW,*)' -------------------------------------------------' +close(unit=1) +END +! +!***************************************** +SUBROUTINE BTINIT(X,N,XMIN,XMAX,NBMIN) +REAL X(*) +INTEGER NBMIN(*) +NBMIN(1)=N +NBMIN(2)=NINT(0.1*FLOAT(N)) +DX=(XMAX-XMIN)/FLOAT(N-1) +X(1)=XMIN +do I=2,N + X(I)=X(I-1)+DX +end do +END +! +!***************************************** +! +FUNCTION CCHI(V) +INCLUDE 'res_par.f90' +INCLUDE 'options.f90' +COMMON /FFTCOM/ FRES(m_d2),FWRK(m_d2),XJ(m_d),TWOPIK(m_d1),NFFT +COMMON /DATCOM/ XDAT(m_d),DAT(m_d),SIG(m_d),NDAT +COMMON /DINTRP/ IPDAT(m_d),XPDAT(m_d) +COMMON /FITCOM/ FIT(m_d),RESID(m_d),NFEW,FITP(m_p),EXPF(m_d1,6) +COMMON /SCLCOM/ BSCL,ASCL,WSCL,SCLVEC(m_p,2),GSCL +COMMON /GRDCOM/ DDDPAR(m_d,m_p),FR2PIK(m_d2,2) +COMMON /QW1COM/ QW1(m_sp),SIGQW1(m_sp),ISPEC +COMMON /WRKCOM/ WORK(m_d2,2) +REAL V(*) +PI=3.141592654 +VSMALL=0.0001 +small=0.001 +CCHI=1.0E+10 +CHI=0.0 +B1=BSCL*V(1) +B2=BSCL*V(2) +A0=ASCL*V(3) +DELTAX=V(4) +NFT2=NFFT/2+1 +CALL CXSHFT(FRES,DELTAX,TWOPIK,FR2PIK,FR2PIK(1,2),NFT2) +CALL VRFILL(WORK,A0,NFT2) +IF (NFEW.GT.0) THEN + BETEXP=V(5+2*NFEW) + IF (BETEXP.LT.0.01) RETURN +ENDIF +PI2=2.0*PI +do J=1,NFEW + J3=J+3 + AJ=ASCL*V(3+J+J) + IF (V(4+J+J).LT.VSMALL) RETURN + SPNORM=WSCL*V(4+J+J)/(GSCL*PI2) + EXPF(1,J)=1.0 + EXPF(1,J3)=0.0 + WORK(1,1)=WORK(1,1)+AJ + do I=2,NFT2 + SIGIJ=SPNORM*TWOPIK(I) + EXPIJ=EXP(-PI2*SIGIJ**BETEXP) + EXPF(I,J)=EXPIJ + EXPF(I,J3)=SIGIJ + WORK(I,1)=WORK(I,1)+AJ*EXPIJ + end do +end do +CALL VMLTRC(WORK,FR2PIK,NFT2,FWRK) +CALL FOUR2(FWRK,NFFT,1,-1,-1) +CALL DEGRID(FWRK,FIT) +X1=XDAT(1) +if(o_bgd.eq.2) BNRM=(B2-B1)/(XDAT(NDAT)-X1) +! avoid conflict BNORM with ModPars +do I=1,NDAT + FIT(I)=FIT(I)+B1 + if(o_bgd.eq.2) FIT(I)=FIT(I)+BNRM*(XDAT(I)-X1) + DIF=FIT(I)-DAT(I) + RESID(I)=DIF*SIG(I) + CHI=CHI+DIF*RESID(I) +end do +CCHI=CHI/2.0 +sm2=small*small +v12=V(1)-V(2) +if(v12.lt.vsmall)v12=1.0 +if(o_bgd.le.1) CCHI=CCHI+v12*v12/sm2 +END +! +!****************************** +! +SUBROUTINE SEARCH(GRAD,HESS,DPAR,NFEW,INDX,COVAR,FITP) +INCLUDE 'res_par.f90' +INCLUDE 'options.f90' +COMMON /SCLCOM/ BSCL,ASCL,WSCL,SCLVEC(m_p,2),GSCL +COMMON /QW1COM/ QW1(m_sp),SIGQW1(m_sp),ISPEC +REAL GRAD(*),HESS(*),DPAR(*),COVAR(*),FITP(*) +INTEGER INDX(*) +J=4+2*NFEW +DXLOG=0.85 +NSRCH=NINT(LOG(5.0*GSCL/WSCL)/LOG(DXLOG)) +CMIN=1.0E20 +FITP(J-1)=0.1 +FITP(J)=1.0 +do I=1,NSRCH + CALL REFINA(GRAD,HESS,DPAR,3+NFEW,DETLOG,INDX,COVAR) + CNORM=CBCHI(FITP) + IF (CNORM.LT.CMIN) THEN + CMIN=CNORM + SIGJ=FITP(J) + ENDIF + FITP(J)=FITP(J)*DXLOG +end do +FITP(J)=SIGJ +CALL REFINA(GRAD,HESS,DPAR,3+NFEW,DETLOG,INDX,COVAR) +END +! +!*********************************************************** +! +SUBROUTINE REFINE(GRAD,HESS,NP,DETLOG,INDX,COVAR,STEPSZ) +INCLUDE 'res_par.f90' +INCLUDE 'options.f90' +COMMON /FFTCOM/ FRES(m_d2),FWRK(m_d2),XJ(m_d),TWOPIK(m_d1),NFFT +COMMON /DATCOM/ XDAT(m_d),DAT(m_d),SIG(m_d),NDAT +COMMON /DINTRP/ IPDAT(m_d),XPDAT(m_d) +COMMON /FITCOM/ FIT(m_d),RESID(m_d),NFEW,FITP(m_p),EXPF(m_d1,6) +COMMON /SCLCOM/ BSCL,ASCL,WSCL,SCLVEC(m_p,2),GSCL +COMMON /WRKCOM/ WORK(m_d2,2) +COMMON /GRDCOM/ DDDPAR(m_d,m_p),FR2PIK(m_d2,2) +COMMON /STEXP/ BETEXP,XBETA(101),BETCHI(101),NBTOT +COMMON /QW1COM/ QW1(m_sp),SIGQW1(m_sp),ISPEC +REAL GRAD(*),HESS(NP,*),COVAR(NP,*) +INTEGER INDX(*) +NFT2=NFFT/2+1 +CNORM=CBCHI(FITP) +CALL VRFILL(HESS,0.0,NP*NP) +CALL VMLTRC(WORK,FR2PIK(1,2),NFT2,FWRK) +CALL VMLTRC(TWOPIK,FWRK,NFT2,WORK) +CALL VMLTIC(WORK,NFT2,WORK) +CALL FOUR2(FWRK,NFFT,1,-1,-1) +CALL DEGRID(FWRK,DDDPAR(1,4)) +CALL FOUR2(WORK,NFFT,1,-1,-1) +CALL DEGRID(WORK,FWRK) +CALL VRDOTR(RESID,FWRK,NDAT,HESS(4,4)) +CALL VCOPY(FR2PIK,FWRK,NFFT+2) +CALL FOUR2(FWRK,NFFT,1,-1,-1) +CALL DEGRID(FWRK,DDDPAR(1,3)) +CALL VCOPY(FR2PIK(1,2),FWRK,NFFT+2) +CALL FOUR2(FWRK,NFFT,1,-1,-1) +CALL DEGRID(FWRK,WORK) +CALL VRDOTR(RESID,WORK,NDAT,HESS(3,4)) +HESS(4,3)=HESS(3,4) +do I=1,NFEW + J=3+I+I + AJ=FITP(J)*ASCL + CALL VMLTRC(EXPF(1,I),FR2PIK,NFT2,WORK) + CALL VCOPY(WORK,FWRK,NFFT+2) + CALL FOUR2(FWRK,NFFT,1,-1,-1) + CALL DEGRID(FWRK,DDDPAR(1,J)) + CALL VMLTRC(TWOPIK,WORK,NFT2,FWRK) + CALL VCOPY(FWRK,WORK,NFFT+2) + CALL VMLTB1(FWRK,EXPF(1,I+3),BETEXP,NFT2) + CALL FOUR2(FWRK,NFFT,1,-1,-1) + CALL DEGRID(FWRK,DDDPAR(1,J+1)) + CALL HESS0(HESS,NP,RESID,NDAT,DDDPAR(1,J+1),AJ,J) + CALL VMLTIC(WORK,NFT2,WORK) + CALL VCOPY(WORK,FWRK,NFFT+2) + CALL FOUR2(FWRK,NFFT,1,-1,-1) + CALL DEGRID(FWRK,WORK(1,2)) + CALL VRDOTR(RESID,WORK(1,2),NDAT,HESS(4,J)) + HESS(J,4)=HESS(4,J) + CALL VMLTRC(TWOPIK,WORK,NFT2,FWRK) + CALL VCOPY(FWRK,WORK,NFFT+2) + CALL VMLTB1(FWRK,EXPF(1,I+3),BETEXP,NFT2) + CALL FOUR2(FWRK,NFFT,1,-1,-1) + CALL DEGRID(FWRK,WORK(1,2)) + CALL VRDOTR(RESID,WORK(1,2),NDAT,SM) + HESS(4,J+1)=-AJ*SM + HESS(J+1,4)=HESS(4,J+1) + CALL VMLTIC(WORK,NFT2,WORK) + CALL VMLTB2(WORK,EXPF(1,I+3),BETEXP,NFT2) + CALL FOUR2(WORK,NFFT,1,-1,-1) + CALL DEGRID(WORK,FWRK) + CALL VRDOTR(RESID,FWRK,NDAT,SM) + HESS(J+1,J+1)=-AJ*SM +end do +CALL GRADPR(GRAD,RESID,NDAT,NP,SCLVEC(1,2)) +CALL HESS1(HESS,NP,SCLVEC(1,2),STEPSZ,0) +CALL MTXINV(HESS,COVAR,NP,INDX,DETLOG) +END +! --------------------------- +SUBROUTINE VMLTB1(F,SK,B,N) +COMPLEX F(*) +REAL SK(*) +B1=B-1.0 +do I=2,N + BFACT=B*SK(I)**B1 + F(I)=BFACT*F(I) +end do +END +! --------------------------- +SUBROUTINE VMLTB2(F,SK,B,N) +COMPLEX F(*) +REAL SK(*) +DATA PI /3.141592654/ +PI2=2.0*PI +B1=B-1.0 +B2=B-2.0 +do I=2,N + BB1=B*SK(I)**B1 + BFACT=BB1*(BB1-B1/(PI2*SK(I))) + F(I)=BFACT*F(I) +end do +END +! +!********************************************************** +! +SUBROUTINE SEEFIT(SIGPAR,CNORM,PRMSV,SIGSV,NP) +INCLUDE 'res_par.f90' +INCLUDE 'mod_files.f90' +COMMON /DATCOM/ XDAT(m_d),DAT(m_d),SIG(m_d),NDAT +COMMON /FITCOM/ FIT(m_d),RESID(m_d),NFEW,FITP(m_p),EXPF(m_d1,6) +COMMON /SCLCOM/ BSCL,ASCL,WSCL,SCLVEC(m_p,2),GSCL +COMMON /WRKCOM/ WORK(m_d2,2) +REAL SIGPAR(*),PRMSV(*),SIGSV(*) +CHARACTER TITLE*80 +OPEN(UNIT=53,FILE=lptfile,STATUS='old',FORM='formatted', & + access='append') +ERRSCL=SQRT(CNORM) +WRITE(TITLE,100) NFEW +100 FORMAT(' Best-fit assuming no. of quasi-elastic lines = ',I2) +WRITE(53,100) NFEW +WRITE(53,120) CNORM +120 FORMAT(' >>> Normalised Chi-squared = ',F11.4) +WRITE(53,130) FITP(1)*BSCL,SIGPAR(1)*BSCL*ERRSCL +130 FORMAT(' Background(Xmin) = ',1PE12.3,' +- ',E10.2) +WRITE(53,140) FITP(2)*BSCL,SIGPAR(2)*BSCL*ERRSCL +140 FORMAT(' Background(Xmax) = ',1PE12.3,' +- ',E10.2) +WRITE(53,150) FITP(4)*GSCL*1000.0, & + SIGPAR(4)*GSCL*ERRSCL*1000.0 +150 FORMAT(' Zero offset = ',F12.2,' +- ',F10.2,' ueV') +WRITE(53,*)' Elastic line' +WRITE(53,160) FITP(3)*ASCL,SIGPAR(3)*ASCL*ERRSCL +160 FORMAT(5X,' Amplitude = ',1PE13.4,' +- ',E11.3) +PRMSV(1)=FITP(3)*ASCL +SIGSV(1)=SIGPAR(3)*ASCL*ERRSCL +do I=1,NFEW + J=4+I+I + WRITE(53,161) I +161 FORMAT(' Stretched-exponential : line ',I2) + WRITE(53,170) 2000.0*FITP(J)*WSCL, & + 2000.0*SIGPAR(J)*WSCL*ERRSCL +170 FORMAT(5X,' 2*Sigma = ',F13.2,' +- ',F11.2,' ueV') + WRITE(53,180) FITP(J-1)*ASCL,SIGPAR(J-1)*ASCL*ERRSCL +180 FORMAT(5X,' Amplitude = ',1PE13.4,' +- ',E11.3) + PRMSV(I+I)=FITP(J-1)*ASCL + SIGSV(I+I)=SIGPAR(J-1)*ASCL*ERRSCL + PRMSV(I+I+1)=2.0*FITP(J)*WSCL + SIGSV(I+I+1)=2.0*SIGPAR(J)*WSCL*ERRSCL +end do +IF (NFEW.GT.0) THEN + BT0=FITP(NP) + BTSIG=SIGPAR(NP) + WRITE(53,190) BT0,BTSIG +190 FORMAT(5X,' Exp-Beta = ',F13.3,' +- ',F11.3) + PRMSV(NFEW+NFEW+2)=BT0 + SIGSV(NFEW+NFEW+2)=BTSIG +ENDIF +close(unit=53) +END +! ---------------------------------------------------------- +SUBROUTINE INTDSP(X,Y,XL,XH,YL,YH,SIGPAR,ERRSCL,XMIN,XMAX) +INCLUDE 'res_par.f90' +COMMON /FITCOM/ FIT(m_d),RESID(m_d),NFEW,FITP(m_p),EXPF(m_d1,6) +COMMON /SCLCOM/ BSCL,ASCL,WSCL,SCLVEC(m_p,2),GSCL +REAL X(*),Y(*),XL(*),XH(*),YL(*),YH(*),SIGPAR(*) +XMAX=0.0 +CALL VRFILL(X,0.0,2*(NFEW+1)) +CALL VRFILL(Y,0.0,2*(NFEW+1)) +Y(2)=FITP(3)*ASCL +XL(1)=0.0 +XH(1)=0.0 +YL(1)=Y(2)-ASCL*SIGPAR(3)*ERRSCL +YH(1)=Y(2)+ASCL*SIGPAR(3)*ERRSCL +do I=1,NFEW + J=I+I+1 + X(J)=2.0*FITP(J+3)*WSCL + X(J+1)=X(J) + Y(J+1)=FITP(J+2)*ASCL + SIGX=SIGPAR(J+3)*WSCL*ERRSCL*2.0 + SIGY=SIGPAR(J+2)*ASCL*ERRSCL + XL(I+1)=X(J+1)-SIGX + XH(I+1)=X(J+1)+SIGX + YL(I+1)=Y(J+1)-SIGY + YH(I+1)=Y(J+1)+SIGY + IF (XH(I+1).GT.XMAX) XMAX=XH(I+1) +end do +IF (NFEW.EQ.0) XMAX=WSCL/10.0 +XMIN=-XMAX/50.0 +XMAX=XMAX*1.03 +END +! diff --git a/quasielasticbayes/Quest_main.f90 b/quasielasticbayes/Quest_main.f90 index 99a1881..312a0b0 100644 --- a/quasielasticbayes/Quest_main.f90 +++ b/quasielasticbayes/Quest_main.f90 @@ -1,266 +1,266 @@ -c PROGRAM QUASI_STEXP_2DPLOT0 -C --------------------------- -C -C----------------------------------------------------------------------- -C This program tries to estimate the parameters of an elstic peak and -C a single "stretched exponential" pertaining to some relevant data. -C It was modified from QUASI_LINES_2D, a 2-D Bayesian Quasi-elastic -C line-fitting program. The resolution function is given on a constant -C X-binning grid, and is assumed to be invariant. The background is -C assumed to be linear and the data should be of an intermediate Genie -C binary format, such as that output by batch-mode ICON. -C----------------------------------------------------------------------- -C Written by: D.S. Sivia, Rutherford Appleton Lab., Oxfordshire, England. -C----------------------------------------------------------------------- -C Initial release for trials by CJC, MAA, WSH. (DSS: 27-FEB-1992) -C Changed file access from sequential to direct. (DSS: 5-MAR-1992) -C Changed STEPSZ reduction from 0.85 to 0.6 . (DSS: 7-MAR-1992) -C Can read in a detector normalisation file. (DSS: 12-MAR-1992) -C Readonly for resol. file; silent-running modified. (DSS: 14-MAY-1992) -C WBF array-size increased in subroutine INBUFF. (DSS: 28-MAY-1992) -C Fixed bug in CLRBUF; problem for lots of detectors. (DSS: 29-MAY-1992) -C Hard-wired meV as input and ueV as output. (DSS: 2-OCT-1992) -C Put in STEPSZ safety-valve in case Chisq stuck! (DSS: 27-OCT-1992) -C Took out small and negative number safety-valve. (DSS: 17-DEC-1992) -C Fixed bug in DATIN1 (no more large error-bars!). (DSS: 27-SEP-1993) -C Modification of QUASI_LINES_2D.FOR . (DSS: 26-APR-1994) -C Do "stretched-exp" quasi_lines properly! (DSS: 7-JUN-1999) -C Plot the 2d posterior pdf for Beta and Sigma. (DSS: 10-JUN-1999) -C----------------------------------------------------------------------- -C - SUBROUTINE Quest(numb,x_in,y_in,e_in,reals,opft, - 1 XD_in,XB_in,YB_in,sfile,rfile,l_fn, - 2 xs_out,ys_out,xb_out,yb_out,zp_out) - INCLUDE 'mod_data.f90' - INCLUDE 'mod_files.f90' - INCLUDE 'options.f90' - COMMON /FFTCOM/ FRES(m_d2),FWRK(m_d2),XJ(m_d),TWOPIK(m_d1),NFFT - COMMON /DATCOM/ XDAT(m_d),DAT(m_d),SIG(m_d),NDAT - COMMON /DINTRP/ IPDAT(m_d),XPDAT(m_d) - COMMON /FITCOM/ FIT(m_d),RESID(m_d),NFEW,FITP(m_p),EXPF(m_d1,6) - COMMON /SCLCOM/ BSCL,ASCL,WSCL,SCLVEC(m_p,2),GSCL - COMMON /GRDCOM/ DDDPAR(m_d,m_p),FR2PIK(m_d2,2) - COMMON /QW1COM/ QW1(m_sp),SIGQW1(m_sp),ISPEC - COMMON /WRKCOM/ WORK(m_d2,2) - COMMON /STEXP/ BETEXP,SIGMA,ADETLG - COMMON/ModPars/NBIN,IMIN,IMAX,RSCL,BNORM - integer numb(11) -cf2py intent(in) :: numb !integer parameters - real x_in(m_d), y_in(m_d), e_in(m_d) -cf2py intent(in) :: x_in, y_in, e_in !sample data - real reals(4) -cf2py intent(in) :: reals !real parameters - integer opft(4) -cf2py intent(in) :: opft !options parameters - real XD_in(m_d), XB_in(m_d), YB_in(m_d) -cf2py intent(in) :: XD_in, XB_in, YB_in !sample xrange, res data (blur) - character*140 sfile, rfile -cf2py intent(in) :: sfile, rfile !sample & res filenames - integer l_fn -cf2py intent(in) :: l_fn !length of filenames - real xs_out(201), ys_out(201), xb_out(201), yb_out(201) -cf2py intent(out) :: xs_out, ys_out, xb_out, yb_out - real zp_out(40500) -cf2py intent(out) :: zp_out - integer l_title,l_user - character*80 user,title - real XBLR(m_d),YBLR(m_d) - REAL GRAD(m_p),HESS(m_p,m_p),DPAR(m_p),COVAR(m_p,m_p) - REAL SIGPAR(m_p),FITPSV(m_p) - REAL DTNORM(m_sp),XSCALE(m_sp) - INTEGER INDX(m_p),NBMIN(2) - REAL XBETA(201),YSIGMA(201,2),PRBETA(201),PRSIGM(201),xsig(201) - REAL ZP(40500),ZLP(40500) - LOGICAL LBATCH - DATA LBATCH,NBET,NSIG /.FALSE.,201,201/ - prog='q' - CALL init_paras -C -c numb = [ngrp, nsp, ntc, Ndat, nbin, Imin, Imax, Nb, nrbin, Nbet,Nsig] - NSPEC=numb(1) !no. of groups - ISP=numb(2) !group number - ISPEC=ISP - ntc=numb(3) !no. of points - NDAT=numb(4) - NBIN=numb(5) - IMIN=numb(6) - IMAX=numb(7) - NB=numb(8) - nrbin=numb(9) - NBET=numb(10) - NSIG=numb(11) -c reals = [efix, theta[isp], rscl, bnorm] - efix=reals(1) - theta(ISP)=reals(2) - RSCL=reals(3) - BNORM=reals(4) - do n=1,m_d - xin(n)=x_in(n) - yin(n)=y_in(n) - ein(n)=e_in(n) - XDAT(n)=XD_in(n) - XBLR(n)=XB_in(n) - YBLR(n)=YB_in(n) - end do - o_el=opft(1) - o_bgd=opft(2) - o_w1=opft(3) - do n=1,m_sp - DTNORM(n)=1.0 !'dtnorm', DTNORM, NSPEC - XSCALE(n)=1.0 !'xscale', XSCALE, NSPEC - yprob=0.0 - end do - lptfile = '' - fileout1 = '' - fileout2 = '' - fileout3 = '' - l_lpt=l_fn+8 - lptfile(1:l_lpt)=sfile(1:l_fn)//'_Qst.lpt' - l_file=l_fn+8 - fileout1(1:l_lpt)=sfile(1:l_fn)//'_Qsb.ql1' - fileout2(1:l_lpt)=sfile(1:l_fn)//'_Qss.ql2' - l_title=9 - title='' - l_user=9 - user='' - o_w1=0 -c - if(ISP.eq.1)then !print info - call open_f(53,lptfile) - write(53,1107)sfile -1107 format(' Sample file : ',a140) - write(53,1108)rfile -1108 format(' Resolution file : ',a140) - write(53,1110)xin(imin),xin(imax) -1110 format(' Energy range: ',f8.3,' to ',f8.3,' meV') - if (o_el.eq.0) write(53,1111) - if (o_el.eq.1) write(53,1112) - if (o_bgd.eq.2) write(53,1113) - if (o_bgd.eq.1) write(53,1114) - if (o_bgd.eq.0) write(53,1115) -1111 format(' Elastic option : NO peak') -1112 format(' Elastic option : WITH peak') -1113 format(' Background option : sloping') -1114 format(' Background option : flat') -1115 format(' Background option : zero') - if(o_w1.eq.1)then - WRITE(53,*)'Width option : fixed from file ',difile - else - WRITE(53,*)'Width option : free ' - endif - close(unit=53) - call open_f(1,fileout1) - call open_f(2,fileout2) - do n=1,2 - write(n,1107)sfile - write(n,1121)title(1:l_title) -1121 format(' Title : ',a) - write(n,1122)user(1:l_user) -1122 format(' User : ',a) - if(n.eq.1)WRITE(n,120)NSPEC,NBET - if(n.eq.2)WRITE(n,120)NSPEC,NSIG - 120 FORMAT(2X,3I10) - WRITE(n,*)' -------------------------------------------------' - close(unit=n) - end do - endif !end print -c - CALL BLRINT(XBLR,YBLR,NB,1.0,.false.) - CALL DPINIT - CALL GDINIT - CALL BTINIT(XBETA,NBET,0.1,1.4,NBMIN) - BETEXP=1.0 - ISPEC=ISP - CALL DATIN(ISP,DTNORM,IDUF) - CALL BLRINT(XBLR,YBLR,NB,XSCALE(ISP),.false.) - CALL DPINIT - CALL PRINIT(FITP,3,NFEW,1) - CALL REFINA(GRAD,HESS,DPAR,3+NFEW,DETLOG,INDX,COVAR) - 1 NPARMS=4+2*NFEW - CHIOLD=CBCHI(FITP) - CALL VCOPY(FITP,FITPSV,NPARMS) - STEPSZ=0.3 - IF (NFEW.GE.1) STEPSZ=STEPSZ/10.0 - IAGAIN=0 - CDIFMN=0.003 - do I=1,200 - CALL REFINE(GRAD,HESS,NPARMS,DETLOG,INDX,COVAR,STEPSZ) - CALL NEWEST(COVAR,GRAD,NPARMS,NFEW,DPAR,FITP) - CNORM=CBCHI(FITP) - IF (CNORM.LE.CHIOLD) THEN - CHIDIF=(CHIOLD-CNORM)/CNORM - IF (ABS(CHIDIF).LE.CDIFMN) THEN - IF (IAGAIN.EQ.0) THEN - CDIFMN=0.00005 - STEPSZ=0.15 - IAGAIN=1 - ELSE - GOTO 3 - ENDIF - ENDIF - CHIOLD=CNORM - CALL VCOPY(FITP,FITPSV,NPARMS) - ELSE - CALL VCOPY(FITPSV,FITP,NPARMS) - STEPSZ=STEPSZ*0.6 - IF (STEPSZ.LT.1.0E-10) GOTO 3 - ENDIF - end do - 3 IF (NFEW.EQ.0) THEN - NFEW=NFEW+1 - CALL SEARCH(GRAD,HESS,DPAR,NFEW,INDX,COVAR,FITP) - GOTO 1 - ENDIF - CALL REFINE(GRAD,HESS,NPARMS,DETLOG,INDX,COVAR,0.25) - CNORM=CBCHI(FITP) - CALL VCOPY(FITP,FITPSV,NPARMS) - CALL REFINE(GRAD,HESS,NPARMS,DETLOG,INDX,COVAR,0.7) - CALL ERRBAR(COVAR,NPARMS,SIGPAR) - SIG1SV=SIGPAR(4) - CALL SGINIT(YSIGMA,201,NSIG,FITP(NPARMS),SIGPAR(NPARMS),WSCL) - K=1 - ZLPMAX=-1.0E10 - do J=1,NSIG - SIGMA=YSIGMA(J,1) - do I=1,NBET - BETEXP=XBETA(I) - FITP(NPARMS+1)=BETEXP - FITP(NPARMS)=SIGMA - FITP(NPARMS-1)=0.1 - FITP(4)=FITPSV(1) - CALL VCOPY(FITPSV,FITP,3) - CALL REFINA(GRAD,HESS,DPAR,3+NFEW,ADETLG,INDX,COVAR) - CHISQ=FLOAT(NDAT)*CBCHI(FITP) - ZLP(K)=-0.5*(LOG10(2.7182818)*CHISQ+ADETLG) - ZLPMAX=MAX(ZLPMAX,ZLP(K)) - K=K+1 - end do - end do - CALL PLNORM(ZLPMAX,ZLP,ZP,NBET*NSIG) - CALL PRMARG(ZP,NBET,NSIG,PRBETA,PRSIGM) - do n=1,NSIG - xsig(n)=YSIGMA(n,2) - end do - OPEN(UNIT=1,FILE=fileout1,STATUS='old',FORM='formatted', - 1 access='append') - write(1,130)(Xbeta(i),PRbeta(i),i=1,NBET) -130 format(2f10.5) - close(unit=1) - OPEN(UNIT=2,FILE=fileout2,STATUS='old',FORM='formatted', - 1 access='append') - write(2,130)(xsig(i),PRsigm(i),i=1,NSIG) - close(unit=2) - nz=NBET*NSIG - do n=1,Nbet - xb_out(n)=XBETA(n) - yb_out(n)=PRBETA(n) - end do - do n=1,Nsig - xs_out(n)=XSIG(n) - ys_out(n)=PRSIGM(n) - end do - do n=1,nz - zp_out(n)=ZP(n) - end do - RETURN - END +! PROGRAM QUASI_STEXP_2DPLOT0 +! --------------------------- +! +!----------------------------------------------------------------------- +! This program tries to estimate the parameters of an elstic peak and +! a single "stretched exponential" pertaining to some relevant data. +! It was modified from QUASI_LINES_2D, a 2-D Bayesian Quasi-elastic +! line-fitting program. The resolution function is given on a constant +! X-binning grid, and is assumed to be invariant. The background is +! assumed to be linear and the data should be of an intermediate Genie +! binary format, such as that output by batch-mode ICON. +!----------------------------------------------------------------------- +! Written by: D.S. Sivia, Rutherford Appleton Lab., Oxfordshire, England. +!----------------------------------------------------------------------- +! Initial release for trials by CJC, MAA, WSH. (DSS: 27-FEB-1992) +! Changed file access from sequential to direct. (DSS: 5-MAR-1992) +! Changed STEPSZ reduction from 0.85 to 0.6 . (DSS: 7-MAR-1992) +! Can read in a detector normalisation file. (DSS: 12-MAR-1992) +! Readonly for resol. file; silent-running modified. (DSS: 14-MAY-1992) +! WBF array-size increased in subroutine INBUFF. (DSS: 28-MAY-1992) +! Fixed bug in CLRBUF; problem for lots of detectors. (DSS: 29-MAY-1992) +! Hard-wired meV as input and ueV as output. (DSS: 2-OCT-1992) +! Put in STEPSZ safety-valve in case Chisq stuck! (DSS: 27-OCT-1992) +! Took out small and negative number safety-valve. (DSS: 17-DEC-1992) +! Fixed bug in DATIN1 (no more large error-bars!). (DSS: 27-SEP-1993) +! Modification of QUASI_LINES_2D.FOR . (DSS: 26-APR-1994) +! Do "stretched-exp" quasi_lines properly! (DSS: 7-JUN-1999) +! Plot the 2d posterior pdf for Beta and Sigma. (DSS: 10-JUN-1999) +!----------------------------------------------------------------------- +! +SUBROUTINE Quest(numb,x_in,y_in,e_in,reals,opft, & + XD_in,XB_in,YB_in,sfile,rfile,l_fn, & + xs_out,ys_out,xb_out,yb_out,zp_out) +INCLUDE 'mod_data.f90' +INCLUDE 'mod_files.f90' +INCLUDE 'options.f90' +COMMON /FFTCOM/ FRES(m_d2),FWRK(m_d2),XJ(m_d),TWOPIK(m_d1),NFFT +COMMON /DATCOM/ XDAT(m_d),DAT(m_d),SIG(m_d),NDAT +COMMON /DINTRP/ IPDAT(m_d),XPDAT(m_d) +COMMON /FITCOM/ FIT(m_d),RESID(m_d),NFEW,FITP(m_p),EXPF(m_d1,6) +COMMON /SCLCOM/ BSCL,ASCL,WSCL,SCLVEC(m_p,2),GSCL +COMMON /GRDCOM/ DDDPAR(m_d,m_p),FR2PIK(m_d2,2) +COMMON /QW1COM/ QW1(m_sp),SIGQW1(m_sp),ISPEC +COMMON /WRKCOM/ WORK(m_d2,2) +COMMON /STEXP/ BETEXP,SIGMA,ADETLG +COMMON/ModPars/NBIN,IMIN,IMAX,RSCL,BNORM +integer numb(11) +!f2py intent(in) :: numb !integer parameters +real x_in(m_d), y_in(m_d), e_in(m_d) +!f2py intent(in) :: x_in, y_in, e_in !sample data +real reals(4) +!f2py intent(in) :: reals !real parameters +integer opft(4) +!f2py intent(in) :: opft !options parameters +real XD_in(m_d), XB_in(m_d), YB_in(m_d) +!f2py intent(in) :: XD_in, XB_in, YB_in !sample xrange, res data (blur) +character*140 sfile, rfile +!f2py intent(in) :: sfile, rfile !sample & res filenames +integer l_fn +!f2py intent(in) :: l_fn !length of filenames +real xs_out(201), ys_out(201), xb_out(201), yb_out(201) +!f2py intent(out) :: xs_out, ys_out, xb_out, yb_out +real zp_out(40500) +!f2py intent(out) :: zp_out +integer l_title,l_user +character*80 user,title +real XBLR(m_d),YBLR(m_d) +REAL GRAD(m_p),HESS(m_p,m_p),DPAR(m_p),COVAR(m_p,m_p) +REAL SIGPAR(m_p),FITPSV(m_p) +REAL DTNORM(m_sp),XSCALE(m_sp) +INTEGER INDX(m_p),NBMIN(2) +REAL XBETA(201),YSIGMA(201,2),PRBETA(201),PRSIGM(201),xsig(201) +REAL ZP(40500),ZLP(40500) +LOGICAL LBATCH +DATA LBATCH,NBET,NSIG /.FALSE.,201,201/ +prog='q' +CALL init_paras +! +! numb = [ngrp, nsp, ntc, Ndat, nbin, Imin, Imax, Nb, nrbin, Nbet,Nsig] +NSPEC=numb(1) !no. of groups +ISP=numb(2) !group number +ISPEC=ISP +ntc=numb(3) !no. of points +NDAT=numb(4) +NBIN=numb(5) +IMIN=numb(6) +IMAX=numb(7) +NB=numb(8) +nrbin=numb(9) +NBET=numb(10) +NSIG=numb(11) +! reals = [efix, theta[isp], rscl, bnorm] +efix=reals(1) +theta(ISP)=reals(2) +RSCL=reals(3) +BNORM=reals(4) +do n=1,m_d + xin(n)=x_in(n) + yin(n)=y_in(n) + ein(n)=e_in(n) + XDAT(n)=XD_in(n) + XBLR(n)=XB_in(n) + YBLR(n)=YB_in(n) +end do +o_el=opft(1) +o_bgd=opft(2) +o_w1=opft(3) +do n=1,m_sp + DTNORM(n)=1.0 !'dtnorm', DTNORM, NSPEC + XSCALE(n)=1.0 !'xscale', XSCALE, NSPEC + yprob=0.0 +end do +lptfile = '' +fileout1 = '' +fileout2 = '' +fileout3 = '' +l_lpt=l_fn+8 +lptfile(1:l_lpt)=sfile(1:l_fn)//'_Qst.lpt' +l_file=l_fn+8 +fileout1(1:l_lpt)=sfile(1:l_fn)//'_Qsb.ql1' +fileout2(1:l_lpt)=sfile(1:l_fn)//'_Qss.ql2' +l_title=9 +title='' +l_user=9 +user='' +o_w1=0 +! +if(ISP.eq.1)then !print info + call open_f(53,lptfile) + write(53,1107)sfile +1107 format(' Sample file : ',a140) + write(53,1108)rfile +1108 format(' Resolution file : ',a140) + write(53,1110)xin(imin),xin(imax) +1110 format(' Energy range: ',f8.3,' to ',f8.3,' meV') + if (o_el.eq.0) write(53,1111) + if (o_el.eq.1) write(53,1112) + if (o_bgd.eq.2) write(53,1113) + if (o_bgd.eq.1) write(53,1114) + if (o_bgd.eq.0) write(53,1115) +1111 format(' Elastic option : NO peak') +1112 format(' Elastic option : WITH peak') +1113 format(' Background option : sloping') +1114 format(' Background option : flat') +1115 format(' Background option : zero') + if(o_w1.eq.1)then + WRITE(53,*)'Width option : fixed from file ',difile + else + WRITE(53,*)'Width option : free ' + endif + close(unit=53) + call open_f(1,fileout1) + call open_f(2,fileout2) + do n=1,2 + write(n,1107)sfile + write(n,1121)title(1:l_title) +1121 format(' Title : ',a) + write(n,1122)user(1:l_user) +1122 format(' User : ',a) + if(n.eq.1)WRITE(n,120)NSPEC,NBET + if(n.eq.2)WRITE(n,120)NSPEC,NSIG +120 FORMAT(2X,3I10) + WRITE(n,*)' -------------------------------------------------' + close(unit=n) + end do +endif !end print +! +CALL BLRINT(XBLR,YBLR,NB,1.0,.false.) +CALL DPINIT +CALL GDINIT +CALL BTINIT(XBETA,NBET,0.1,1.4,NBMIN) + BETEXP=1.0 + ISPEC=ISP + CALL DATIN(ISP,DTNORM,IDUF) + CALL BLRINT(XBLR,YBLR,NB,XSCALE(ISP),.false.) + CALL DPINIT + CALL PRINIT(FITP,3,NFEW,1) + CALL REFINA(GRAD,HESS,DPAR,3+NFEW,DETLOG,INDX,COVAR) +1 NPARMS=4+2*NFEW + CHIOLD=CBCHI(FITP) + CALL VCOPY(FITP,FITPSV,NPARMS) + STEPSZ=0.3 + IF (NFEW.GE.1) STEPSZ=STEPSZ/10.0 + IAGAIN=0 + CDIFMN=0.003 + do I=1,200 + CALL REFINE(GRAD,HESS,NPARMS,DETLOG,INDX,COVAR,STEPSZ) + CALL NEWEST(COVAR,GRAD,NPARMS,NFEW,DPAR,FITP) + CNORM=CBCHI(FITP) + IF (CNORM.LE.CHIOLD) THEN + CHIDIF=(CHIOLD-CNORM)/CNORM + IF (ABS(CHIDIF).LE.CDIFMN) THEN + IF (IAGAIN.EQ.0) THEN + CDIFMN=0.00005 + STEPSZ=0.15 + IAGAIN=1 + ELSE + GOTO 3 + ENDIF + ENDIF + CHIOLD=CNORM + CALL VCOPY(FITP,FITPSV,NPARMS) + ELSE + CALL VCOPY(FITPSV,FITP,NPARMS) + STEPSZ=STEPSZ*0.6 + IF (STEPSZ.LT.1.0E-10) GOTO 3 + ENDIF + end do +3 IF (NFEW.EQ.0) THEN + NFEW=NFEW+1 + CALL SEARCH(GRAD,HESS,DPAR,NFEW,INDX,COVAR,FITP) + GOTO 1 + ENDIF + CALL REFINE(GRAD,HESS,NPARMS,DETLOG,INDX,COVAR,0.25) + CNORM=CBCHI(FITP) + CALL VCOPY(FITP,FITPSV,NPARMS) + CALL REFINE(GRAD,HESS,NPARMS,DETLOG,INDX,COVAR,0.7) + CALL ERRBAR(COVAR,NPARMS,SIGPAR) + SIG1SV=SIGPAR(4) + CALL SGINIT(YSIGMA,201,NSIG,FITP(NPARMS),SIGPAR(NPARMS),WSCL) + K=1 + ZLPMAX=-1.0E10 + do J=1,NSIG + SIGMA=YSIGMA(J,1) + do I=1,NBET + BETEXP=XBETA(I) + FITP(NPARMS+1)=BETEXP + FITP(NPARMS)=SIGMA + FITP(NPARMS-1)=0.1 + FITP(4)=FITPSV(1) + CALL VCOPY(FITPSV,FITP,3) + CALL REFINA(GRAD,HESS,DPAR,3+NFEW,ADETLG,INDX,COVAR) + CHISQ=FLOAT(NDAT)*CBCHI(FITP) + ZLP(K)=-0.5*(LOG10(2.7182818)*CHISQ+ADETLG) + ZLPMAX=MAX(ZLPMAX,ZLP(K)) + K=K+1 + end do + end do + CALL PLNORM(ZLPMAX,ZLP,ZP,NBET*NSIG) + CALL PRMARG(ZP,NBET,NSIG,PRBETA,PRSIGM) +do n=1,NSIG + xsig(n)=YSIGMA(n,2) +end do +OPEN(UNIT=1,FILE=fileout1,STATUS='old',FORM='formatted', & + access='append') +write(1,130)(Xbeta(i),PRbeta(i),i=1,NBET) +130 format(2f10.5) +close(unit=1) +OPEN(UNIT=2,FILE=fileout2,STATUS='old',FORM='formatted', & + access='append') +write(2,130)(xsig(i),PRsigm(i),i=1,NSIG) +close(unit=2) +nz=NBET*NSIG +do n=1,Nbet + xb_out(n)=XBETA(n) + yb_out(n)=PRBETA(n) +end do +do n=1,Nsig + xs_out(n)=XSIG(n) + ys_out(n)=PRSIGM(n) +end do +do n=1,nz + zp_out(n)=ZP(n) +end do +RETURN +END diff --git a/quasielasticbayes/Quest_subs.f90 b/quasielasticbayes/Quest_subs.f90 index 23bf49d..642e348 100644 --- a/quasielasticbayes/Quest_subs.f90 +++ b/quasielasticbayes/Quest_subs.f90 @@ -1,295 +1,295 @@ - SUBROUTINE PLNORM(ZLMAX,ZL,Z,N) - REAL Z(*),ZL(*) - do I=1,N - ZL(I)=ZL(I)-ZLMAX - Z(I)=EXP(ZL(I)) - end do - END -C ------------------------------ - SUBROUTINE PRMARG(Z,NX,NY,X,Y) - REAL Z(NX,NY),X(*),Y(*) - CALL VRFILL(X,0.0,NX) - CALL VRFILL(Y,0.0,NY) - YMAX=-1.0E10 - do J=1,NY - SUM=0.0 - do I=1,NX - ZIJ=Z(I,J) - SUM=SUM+ZIJ - X(I)=X(I)+ZIJ - end do - Y(J)=SUM - YMAX=MAX(YMAX,SUM) - end do - XMAX=-1.0E10 - do I=1,NX - XMAX=MAX(XMAX,X(I)) - end do - XSCL=1.0/XMAX - do I=1,NX - X(I)=X(I)*XSCL - end do - YSCL=1.0/YMAX - do J=1,NY - Y(J)=Y(J)*YSCL - end do - END -C ------------------------------ - SUBROUTINE init_paras - INCLUDE 'res_par.f90' - COMMON /FFTCOM/ FRES(m_d2),FWRK(m_d2),XJ(m_d),TWOPIK(m_d1),NFFT - COMMON /DATCOM/ XDAT(m_d),DAT(m_d),SIG(m_d),NDAT - COMMON /DINTRP/ IPDAT(m_d),XPDAT(m_d) - COMMON /FITCOM/ FIT(m_d),RESID(m_d),NFEW,FITP(m_p),EXPF(m_d1,6) - COMMON /SCLCOM/ BSCL,ASCL,WSCL,SCLVEC(m_p,2),GSCL - COMMON /GRDCOM/ DDDPAR(m_d,m_p),FR2PIK(m_d2,2) - COMMON /QW1COM/ QW1(m_sp),SIGQW1(m_sp),ISPEC - COMMON /WRKCOM/ WORK(m_d2,2) - do n=1,m_d - XJ(n)=0.0 - XDAT(n)=0.0 - DAT(n)=0.0 - SIG(n)=0.0 - IPDAT(n)=0 - XPDAT(n)=0.0 - FIT(n)=0.0 - RESID(n)=0.0 - do m=1,m_p - DDDPAR(n,m)=0.0 - end do - end do - do n=1,m_d1 - TWOPIK(n)=0.0 - do m=1,3 - EXPF(n,m)=0.0 - end do - end do - do n=1,m_d2 - FRES(n)=0.0 - FWRK(n)=0.0 - do m=1,2 - FR2PIK(n,m)=0.0 - WORK(n,m)=0.0 - end do - end do - do n=1,m_p - FITP(n)=0.0 - do m=1,2 - SCLVEC(n,m)=0.0 - end do - end do - do n=1,m_sp - QW1(n)=0.0 - SIGQW1(n)=0.0 - end do - RETURN - END -C -C***************************************** -C - SUBROUTINE BTINIT(X,N,XMIN,XMAX,NBMIN) - REAL X(*) - INTEGER NBMIN(*) - NBMIN(1)=N - NBMIN(2)=NINT(0.1*FLOAT(N)) - DX=(XMAX-XMIN)/FLOAT(N-1) - X(1)=XMIN - do I=2,N - X(I)=X(I-1)+DX - end do - END -C ---------------------------------------- - SUBROUTINE SGINIT(Y,NMAX,N,Y0,YSIG,WSCL) - REAL Y(NMAX,*) - YMAX=Y0+MIN(20.0*YSIG,Y0) - YMIN=YMAX/FLOAT(N) - DY=(YMAX-YMIN)/FLOAT(N-1) - Y(1,1)=YMIN-DY/2.0 - Y(1,2)=2.0*Y(1,1)*WSCL - do I=2,N - Y(I,1)=Y(I-1,1)+DY - Y(I,2)=2.0*Y(I,1)*WSCL - end do - END -C -C***************************************** -C - FUNCTION CCHI(V) - INCLUDE 'res_par.f90' - INCLUDE 'options.f90' - COMMON /FFTCOM/ FRES(m_d2),FWRK(m_d2),XJ(m_d),TWOPIK(m_d1),NFFT - COMMON /DATCOM/ XDAT(m_d),DAT(m_d),SIG(m_d),NDAT - COMMON /DINTRP/ IPDAT(m_d),XPDAT(m_d) - COMMON /FITCOM/ FIT(m_d),RESID(m_d),NFEW,FITP(m_p),EXPF(m_d1,6) - COMMON /SCLCOM/ BSCL,ASCL,WSCL,SCLVEC(m_p,2),GSCL - COMMON /GRDCOM/ DDDPAR(m_d,m_p),FR2PIK(m_d2,2) - COMMON /QW1COM/ QW1(m_sp),SIGQW1(m_sp),ISPEC - COMMON /WRKCOM/ WORK(m_d2,2) - REAL V(*) - CHI=0.0 - B1=BSCL*V(1) - B2=BSCL*V(2) - A0=ASCL*V(3) - DELTAX=V(4) - NFT2=NFFT/2+1 - CALL CXSHFT(FRES,DELTAX,TWOPIK,FR2PIK,FR2PIK(1,2),NFT2) - CALL VRFILL(WORK,A0,NFT2) - XNSCL=-LOG(1.0E-7)/(TWOPIK(2)-TWOPIK(1)) - do J=1,NFEW - AJ=ASCL*V(3+J+J) - SIGJ=WSCL*V(4+J+J)/GSCL - CALL VRFILL(EXPF(1,J),0.0,NFT2) - NXFT2=1+NINT(XNSCL/(ABS(SIGJ)+1.0E-10)) - IF (NXFT2.GT.NFT2) NXFT2=NFT2 - do I=1,NXFT2 - EXPIJ=EXP(-TWOPIK(I)*SIGJ) - EXPF(I,J)=EXPIJ - WORK(I,1)=WORK(I,1)+AJ*EXPIJ - end do - end do - CALL VMLTRC(WORK,FR2PIK,NFT2,FWRK) - CALL FOUR2(FWRK,NFFT,1,-1,-1) - CALL DEGRID(FWRK,FIT) - X1=XDAT(1) - if(o_bgd.eq.2) BNRM=(B2-B1)/(XDAT(NDAT)-X1) -C avoid conflict BNORM with ModPars - do I=1,NDAT - FIT(I)=FIT(I)+B1 - if(o_bgd.eq.2) FIT(I)=FIT(I)+BNRM*(XDAT(I)-X1) - DIF=FIT(I)-DAT(I) - RESID(I)=DIF*SIG(I) - CHI=CHI+DIF*RESID(I) - end do - if(o_w1.eq.1)then - if(NFEW.GE.1) then - RESW1D=(WSCL*V(6)-QW1(ISPEC))/SIGQW1(ISPEC) - CHI=CHI+2.0*RESW1D**2 - endif - endif - CCHI=CHI/(2.0*FLOAT(NDAT)) - END -C -C****************************** -C - SUBROUTINE SEARCH(GRAD,HESS,DPAR,NFEW,INDX,COVAR,FITP) - INCLUDE 'res_par.f90' - INCLUDE 'options.f90' - COMMON /SCLCOM/ BSCL,ASCL,WSCL,SCLVEC(m_p,2),GSCL - REAL GRAD(*),HESS(*),DPAR(*),COVAR(*),FITP(*) - INTEGER INDX(*) - J=4+2*NFEW - DXLOG=0.85 - NSRCH=NINT(LOG(5.0*GSCL/WSCL)/LOG(DXLOG)) - CMIN=1.0E20 - FITP(J-1)=0.1 - FITP(J)=1.0 - do I=1,NSRCH - CALL REFINA(GRAD,HESS,DPAR,3+NFEW,DETLOG,INDX,COVAR) - CNORM=CBCHI(FITP) - IF (CNORM.LT.CMIN) THEN - CMIN=CNORM - SIGJ=FITP(J) - ENDIF - FITP(J)=FITP(J)*DXLOG - end do - FITP(J)=SIGJ - CALL REFINA(GRAD,HESS,DPAR,3+NFEW,DETLOG,INDX,COVAR) - END -C -C*********************************************************** -C - SUBROUTINE REFINE(GRAD,HESS,NP,DETLOG,INDX,COVAR,STEPSZ) - INCLUDE 'res_par.f90' - INCLUDE 'options.f90' - COMMON /FFTCOM/ FRES(m_d2),FWRK(m_d2),XJ(m_d),TWOPIK(m_d1),NFFT - COMMON /DATCOM/ XDAT(m_d),DAT(m_d),SIG(m_d),NDAT - COMMON /DINTRP/ IPDAT(m_d),XPDAT(m_d) - COMMON /FITCOM/ FIT(m_d),RESID(m_d),NFEW,FITP(m_p),EXPF(m_d1,6) - COMMON /SCLCOM/ BSCL,ASCL,WSCL,SCLVEC(m_p,2),GSCL - COMMON /WRKCOM/ WORK(m_d2,2) - COMMON /GRDCOM/ DDDPAR(m_d,m_p),FR2PIK(m_d2,2) - COMMON /STEXP/ BETEXP,SIGMA,ADETLG - COMMON /QW1COM/ QW1(m_sp),SIGQW1(m_sp),ISPEC - REAL GRAD(*),HESS(NP,*),COVAR(NP,*) - INTEGER INDX(*) - NFT2=NFFT/2+1 - CNORM=CBCHI(FITP) - CALL VRFILL(HESS,0.0,NP*NP) - CALL VMLTRC(WORK,FR2PIK(1,2),NFT2,FWRK) - CALL VMLTRC(TWOPIK,FWRK,NFT2,WORK) - CALL VMLTIC(WORK,NFT2,WORK) - CALL FOUR2(FWRK,NFFT,1,-1,-1) - CALL DEGRID(FWRK,DDDPAR(1,4)) - CALL FOUR2(WORK,NFFT,1,-1,-1) - CALL DEGRID(WORK,FWRK) - CALL VRDOTR(RESID,FWRK,NDAT,HESS(4,4)) - CALL VCOPY(FR2PIK,FWRK,NFFT+2) - CALL FOUR2(FWRK,NFFT,1,-1,-1) - CALL DEGRID(FWRK,DDDPAR(1,3)) - CALL VCOPY(FR2PIK(1,2),FWRK,NFFT+2) - CALL FOUR2(FWRK,NFFT,1,-1,-1) - CALL DEGRID(FWRK,WORK) - CALL VRDOTR(RESID,WORK,NDAT,HESS(3,4)) - HESS(4,3)=HESS(3,4) - do I=1,NFEW - J=3+I+I - AJ=FITP(J)*ASCL - CALL VMLTRC(EXPF(1,I),FR2PIK,NFT2,WORK) - CALL VCOPY(WORK,FWRK,NFFT+2) - CALL FOUR2(FWRK,NFFT,1,-1,-1) - CALL DEGRID(FWRK,DDDPAR(1,J)) - CALL VMLTRC(TWOPIK,WORK,NFT2,FWRK) - CALL VCOPY(FWRK,WORK,NFFT+2) - CALL VMLTB1(FWRK,EXPF(1,I+3),BETEXP,NFT2) - CALL FOUR2(FWRK,NFFT,1,-1,-1) - CALL DEGRID(FWRK,DDDPAR(1,J+1)) - CALL HESS0(HESS,NP,RESID,NDAT,DDDPAR(1,J+1),AJ,J) - CALL VMLTIC(WORK,NFT2,WORK) - CALL VCOPY(WORK,FWRK,NFFT+2) - CALL FOUR2(FWRK,NFFT,1,-1,-1) - CALL DEGRID(FWRK,WORK(1,2)) - CALL VRDOTR(RESID,WORK(1,2),NDAT,HESS(4,J)) - HESS(J,4)=HESS(4,J) - CALL VMLTRC(TWOPIK,WORK,NFT2,FWRK) - CALL VCOPY(FWRK,WORK,NFFT+2) - CALL VMLTB1(FWRK,EXPF(1,I+3),BETEXP,NFT2) - CALL FOUR2(FWRK,NFFT,1,-1,-1) - CALL DEGRID(FWRK,WORK(1,2)) - CALL VRDOTR(RESID,WORK(1,2),NDAT,SUM) - HESS(4,J+1)=-AJ*SUM - HESS(J+1,4)=HESS(4,J+1) - CALL VMLTIC(WORK,NFT2,WORK) - CALL VMLTB2(WORK,EXPF(1,I+3),BETEXP,NFT2) - CALL FOUR2(WORK,NFFT,1,-1,-1) - CALL DEGRID(WORK,FWRK) - CALL VRDOTR(RESID,FWRK,NDAT,SUM) - HESS(J+1,J+1)=-AJ*SUM - end do - CALL GRADPR(GRAD,RESID,NDAT,NP,SCLVEC(1,2)) - CALL HESS1(HESS,NP,SCLVEC(1,2),STEPSZ,NFEW) - CALL MTXINV(HESS,COVAR,NP,INDX,DETLOG) - END -C --------------------------- - SUBROUTINE VMLTB1(F,SK,B,N) - COMPLEX F(*) - REAL SK(*) - B1=B-1.0 - do I=2,N - BFACT=B*SK(I)**B1 - F(I)=BFACT*F(I) - end do - END -C --------------------------- - SUBROUTINE VMLTB2(F,SK,B,N) - COMPLEX F(*) - REAL SK(*) - DATA PI /3.141592654/ - PI2=2.0*PI - B1=B-1.0 - B2=B-2.0 - do I=2,N - BB1=B*SK(I)**B1 - BFACT=BB1*(BB1-B1/(PI2*SK(I))) - F(I)=BFACT*F(I) - end do - END +SUBROUTINE PLNORM(ZLMAX,ZL,Z,N) +REAL Z(*),ZL(*) +do I=1,N + ZL(I)=ZL(I)-ZLMAX + Z(I)=EXP(ZL(I)) +end do +END +! ------------------------------ +SUBROUTINE PRMARG(Z,NX,NY,X,Y) +REAL Z(NX,NY),X(*),Y(*) +CALL VRFILL(X,0.0,NX) +CALL VRFILL(Y,0.0,NY) +YMAX=-1.0E10 +do J=1,NY + SUM=0.0 + do I=1,NX + ZIJ=Z(I,J) + SUM=SUM+ZIJ + X(I)=X(I)+ZIJ + end do + Y(J)=SUM + YMAX=MAX(YMAX,SUM) +end do +XMAX=-1.0E10 +do I=1,NX + XMAX=MAX(XMAX,X(I)) +end do +XSCL=1.0/XMAX +do I=1,NX + X(I)=X(I)*XSCL +end do +YSCL=1.0/YMAX +do J=1,NY + Y(J)=Y(J)*YSCL +end do +END +! ------------------------------ +SUBROUTINE init_paras +INCLUDE 'res_par.f90' +COMMON /FFTCOM/ FRES(m_d2),FWRK(m_d2),XJ(m_d),TWOPIK(m_d1),NFFT +COMMON /DATCOM/ XDAT(m_d),DAT(m_d),SIG(m_d),NDAT +COMMON /DINTRP/ IPDAT(m_d),XPDAT(m_d) +COMMON /FITCOM/ FIT(m_d),RESID(m_d),NFEW,FITP(m_p),EXPF(m_d1,6) +COMMON /SCLCOM/ BSCL,ASCL,WSCL,SCLVEC(m_p,2),GSCL +COMMON /GRDCOM/ DDDPAR(m_d,m_p),FR2PIK(m_d2,2) +COMMON /QW1COM/ QW1(m_sp),SIGQW1(m_sp),ISPEC +COMMON /WRKCOM/ WORK(m_d2,2) +do n=1,m_d + XJ(n)=0.0 + XDAT(n)=0.0 + DAT(n)=0.0 + SIG(n)=0.0 + IPDAT(n)=0 + XPDAT(n)=0.0 + FIT(n)=0.0 + RESID(n)=0.0 + do m=1,m_p + DDDPAR(n,m)=0.0 + end do +end do +do n=1,m_d1 + TWOPIK(n)=0.0 + do m=1,3 + EXPF(n,m)=0.0 + end do +end do +do n=1,m_d2 + FRES(n)=0.0 + FWRK(n)=0.0 + do m=1,2 + FR2PIK(n,m)=0.0 + WORK(n,m)=0.0 + end do +end do +do n=1,m_p + FITP(n)=0.0 + do m=1,2 + SCLVEC(n,m)=0.0 + end do +end do +do n=1,m_sp + QW1(n)=0.0 + SIGQW1(n)=0.0 +end do +RETURN +END +! +!***************************************** +! +SUBROUTINE BTINIT(X,N,XMIN,XMAX,NBMIN) +REAL X(*) +INTEGER NBMIN(*) +NBMIN(1)=N +NBMIN(2)=NINT(0.1*FLOAT(N)) +DX=(XMAX-XMIN)/FLOAT(N-1) +X(1)=XMIN +do I=2,N + X(I)=X(I-1)+DX +end do +END +! ---------------------------------------- +SUBROUTINE SGINIT(Y,NMAX,N,Y0,YSIG,WSCL) +REAL Y(NMAX,*) +YMAX=Y0+MIN(20.0*YSIG,Y0) +YMIN=YMAX/FLOAT(N) +DY=(YMAX-YMIN)/FLOAT(N-1) +Y(1,1)=YMIN-DY/2.0 +Y(1,2)=2.0*Y(1,1)*WSCL +do I=2,N + Y(I,1)=Y(I-1,1)+DY + Y(I,2)=2.0*Y(I,1)*WSCL +end do +END +! +!***************************************** +! +FUNCTION CCHI(V) +INCLUDE 'res_par.f90' +INCLUDE 'options.f90' +COMMON /FFTCOM/ FRES(m_d2),FWRK(m_d2),XJ(m_d),TWOPIK(m_d1),NFFT +COMMON /DATCOM/ XDAT(m_d),DAT(m_d),SIG(m_d),NDAT +COMMON /DINTRP/ IPDAT(m_d),XPDAT(m_d) +COMMON /FITCOM/ FIT(m_d),RESID(m_d),NFEW,FITP(m_p),EXPF(m_d1,6) +COMMON /SCLCOM/ BSCL,ASCL,WSCL,SCLVEC(m_p,2),GSCL +COMMON /GRDCOM/ DDDPAR(m_d,m_p),FR2PIK(m_d2,2) +COMMON /QW1COM/ QW1(m_sp),SIGQW1(m_sp),ISPEC +COMMON /WRKCOM/ WORK(m_d2,2) +REAL V(*) +CHI=0.0 +B1=BSCL*V(1) +B2=BSCL*V(2) +A0=ASCL*V(3) +DELTAX=V(4) +NFT2=NFFT/2+1 +CALL CXSHFT(FRES,DELTAX,TWOPIK,FR2PIK,FR2PIK(1,2),NFT2) +CALL VRFILL(WORK,A0,NFT2) +XNSCL=-LOG(1.0E-7)/(TWOPIK(2)-TWOPIK(1)) +do J=1,NFEW + AJ=ASCL*V(3+J+J) + SIGJ=WSCL*V(4+J+J)/GSCL + CALL VRFILL(EXPF(1,J),0.0,NFT2) + NXFT2=1+NINT(XNSCL/(ABS(SIGJ)+1.0E-10)) + IF (NXFT2.GT.NFT2) NXFT2=NFT2 + do I=1,NXFT2 + EXPIJ=EXP(-TWOPIK(I)*SIGJ) + EXPF(I,J)=EXPIJ + WORK(I,1)=WORK(I,1)+AJ*EXPIJ + end do +end do +CALL VMLTRC(WORK,FR2PIK,NFT2,FWRK) +CALL FOUR2(FWRK,NFFT,1,-1,-1) +CALL DEGRID(FWRK,FIT) +X1=XDAT(1) +if(o_bgd.eq.2) BNRM=(B2-B1)/(XDAT(NDAT)-X1) +! avoid conflict BNORM with ModPars +do I=1,NDAT + FIT(I)=FIT(I)+B1 + if(o_bgd.eq.2) FIT(I)=FIT(I)+BNRM*(XDAT(I)-X1) + DIF=FIT(I)-DAT(I) + RESID(I)=DIF*SIG(I) + CHI=CHI+DIF*RESID(I) +end do +if(o_w1.eq.1)then + if(NFEW.GE.1) then + RESW1D=(WSCL*V(6)-QW1(ISPEC))/SIGQW1(ISPEC) + CHI=CHI+2.0*RESW1D**2 + endif +endif +CCHI=CHI/(2.0*FLOAT(NDAT)) +END +! +!****************************** +! +SUBROUTINE SEARCH(GRAD,HESS,DPAR,NFEW,INDX,COVAR,FITP) +INCLUDE 'res_par.f90' +INCLUDE 'options.f90' +COMMON /SCLCOM/ BSCL,ASCL,WSCL,SCLVEC(m_p,2),GSCL +REAL GRAD(*),HESS(*),DPAR(*),COVAR(*),FITP(*) +INTEGER INDX(*) +J=4+2*NFEW +DXLOG=0.85 +NSRCH=NINT(LOG(5.0*GSCL/WSCL)/LOG(DXLOG)) +CMIN=1.0E20 +FITP(J-1)=0.1 +FITP(J)=1.0 +do I=1,NSRCH + CALL REFINA(GRAD,HESS,DPAR,3+NFEW,DETLOG,INDX,COVAR) + CNORM=CBCHI(FITP) + IF (CNORM.LT.CMIN) THEN + CMIN=CNORM + SIGJ=FITP(J) + ENDIF + FITP(J)=FITP(J)*DXLOG +end do +FITP(J)=SIGJ +CALL REFINA(GRAD,HESS,DPAR,3+NFEW,DETLOG,INDX,COVAR) +END +! +!*********************************************************** +! +SUBROUTINE REFINE(GRAD,HESS,NP,DETLOG,INDX,COVAR,STEPSZ) +INCLUDE 'res_par.f90' +INCLUDE 'options.f90' +COMMON /FFTCOM/ FRES(m_d2),FWRK(m_d2),XJ(m_d),TWOPIK(m_d1),NFFT +COMMON /DATCOM/ XDAT(m_d),DAT(m_d),SIG(m_d),NDAT +COMMON /DINTRP/ IPDAT(m_d),XPDAT(m_d) +COMMON /FITCOM/ FIT(m_d),RESID(m_d),NFEW,FITP(m_p),EXPF(m_d1,6) +COMMON /SCLCOM/ BSCL,ASCL,WSCL,SCLVEC(m_p,2),GSCL +COMMON /WRKCOM/ WORK(m_d2,2) +COMMON /GRDCOM/ DDDPAR(m_d,m_p),FR2PIK(m_d2,2) +COMMON /STEXP/ BETEXP,SIGMA,ADETLG +COMMON /QW1COM/ QW1(m_sp),SIGQW1(m_sp),ISPEC +REAL GRAD(*),HESS(NP,*),COVAR(NP,*) +INTEGER INDX(*) +NFT2=NFFT/2+1 +CNORM=CBCHI(FITP) +CALL VRFILL(HESS,0.0,NP*NP) +CALL VMLTRC(WORK,FR2PIK(1,2),NFT2,FWRK) +CALL VMLTRC(TWOPIK,FWRK,NFT2,WORK) +CALL VMLTIC(WORK,NFT2,WORK) +CALL FOUR2(FWRK,NFFT,1,-1,-1) +CALL DEGRID(FWRK,DDDPAR(1,4)) +CALL FOUR2(WORK,NFFT,1,-1,-1) +CALL DEGRID(WORK,FWRK) +CALL VRDOTR(RESID,FWRK,NDAT,HESS(4,4)) +CALL VCOPY(FR2PIK,FWRK,NFFT+2) +CALL FOUR2(FWRK,NFFT,1,-1,-1) +CALL DEGRID(FWRK,DDDPAR(1,3)) +CALL VCOPY(FR2PIK(1,2),FWRK,NFFT+2) +CALL FOUR2(FWRK,NFFT,1,-1,-1) +CALL DEGRID(FWRK,WORK) +CALL VRDOTR(RESID,WORK,NDAT,HESS(3,4)) +HESS(4,3)=HESS(3,4) +do I=1,NFEW + J=3+I+I + AJ=FITP(J)*ASCL + CALL VMLTRC(EXPF(1,I),FR2PIK,NFT2,WORK) + CALL VCOPY(WORK,FWRK,NFFT+2) + CALL FOUR2(FWRK,NFFT,1,-1,-1) + CALL DEGRID(FWRK,DDDPAR(1,J)) + CALL VMLTRC(TWOPIK,WORK,NFT2,FWRK) + CALL VCOPY(FWRK,WORK,NFFT+2) + CALL VMLTB1(FWRK,EXPF(1,I+3),BETEXP,NFT2) + CALL FOUR2(FWRK,NFFT,1,-1,-1) + CALL DEGRID(FWRK,DDDPAR(1,J+1)) + CALL HESS0(HESS,NP,RESID,NDAT,DDDPAR(1,J+1),AJ,J) + CALL VMLTIC(WORK,NFT2,WORK) + CALL VCOPY(WORK,FWRK,NFFT+2) + CALL FOUR2(FWRK,NFFT,1,-1,-1) + CALL DEGRID(FWRK,WORK(1,2)) + CALL VRDOTR(RESID,WORK(1,2),NDAT,HESS(4,J)) + HESS(J,4)=HESS(4,J) + CALL VMLTRC(TWOPIK,WORK,NFT2,FWRK) + CALL VCOPY(FWRK,WORK,NFFT+2) + CALL VMLTB1(FWRK,EXPF(1,I+3),BETEXP,NFT2) + CALL FOUR2(FWRK,NFFT,1,-1,-1) + CALL DEGRID(FWRK,WORK(1,2)) + CALL VRDOTR(RESID,WORK(1,2),NDAT,SUM) + HESS(4,J+1)=-AJ*SUM + HESS(J+1,4)=HESS(4,J+1) + CALL VMLTIC(WORK,NFT2,WORK) + CALL VMLTB2(WORK,EXPF(1,I+3),BETEXP,NFT2) + CALL FOUR2(WORK,NFFT,1,-1,-1) + CALL DEGRID(WORK,FWRK) + CALL VRDOTR(RESID,FWRK,NDAT,SUM) + HESS(J+1,J+1)=-AJ*SUM +end do +CALL GRADPR(GRAD,RESID,NDAT,NP,SCLVEC(1,2)) +CALL HESS1(HESS,NP,SCLVEC(1,2),STEPSZ,NFEW) +CALL MTXINV(HESS,COVAR,NP,INDX,DETLOG) +END +! --------------------------- +SUBROUTINE VMLTB1(F,SK,B,N) +COMPLEX F(*) +REAL SK(*) +B1=B-1.0 +do I=2,N + BFACT=B*SK(I)**B1 + F(I)=BFACT*F(I) +end do +END +! --------------------------- +SUBROUTINE VMLTB2(F,SK,B,N) +COMPLEX F(*) +REAL SK(*) +DATA PI /3.141592654/ +PI2=2.0*PI +B1=B-1.0 +B2=B-2.0 +do I=2,N + BB1=B*SK(I)**B1 + BFACT=BB1*(BB1-B1/(PI2*SK(I))) + F(I)=BFACT*F(I) +end do +END diff --git a/quasielasticbayes/ResNorm_main.f90 b/quasielasticbayes/ResNorm_main.f90 index 5fee37d..6d0ffff 100644 --- a/quasielasticbayes/ResNorm_main.f90 +++ b/quasielasticbayes/ResNorm_main.f90 @@ -1,232 +1,230 @@ -C PROGRAM RESNORM -C----------------------------------------------------------------------- -C This is a simple resolution normalisation program, which was modified -C from QUASI_LINES_2D.FOR . It reads in a 2-D resolution file, which -C should be of the same intermediate GENIE binary format as that of the -C 2-D quasi-elastic data to be subsequently analysed. The output is in -C file FOR007.DAT . -C----------------------------------------------------------------------- -C Written by: D.S. Sivia, Rutherford Appleton Lab., Oxfordshire, England. -C----------------------------------------------------------------------- -C Initial release for trials by CJC, MAA, WSH. (DSS: 10-MAR-1992) -C Stretch-factor range increased to +/- 10%. (DSS: 27-MAY-1992) -C WBF array-size increased in subroutine INBUFF. (DSS: 28-MAY-1992) -C Also put in READONLY for the resolution file. (DSS: 28-MAY-1992) -C Fixed bug in CLRBUF; problem for lots of detectors.(DSS: 29-MAY-1992) -C Hard-wired meV input & ueV output, increased search -C to +/- 15% and added silent-running option. (DSS: 2-OCT-1992) -C Took out small and negative number safety-valve. (DSS: 17-DEC-1992) -C Fixed bug in DATIN1 (no more large error-bars!). (DSS: 27-SEP-1993) -C----------------------------------------------------------------------- -c nd,xout,yout,eout,yfit=resnorm.resnorm(numb,Xv,Yv,Ev,reals,Xdat,Xb,Yb,wrk,lwrk) -c numb = [ngrp, nsp, ntc, Ndat, nbin, Imin, Imax, Nb] -c reals = [efix, theta[0], rscl, bnorm] -c - SUBROUTINE RESNORM(numb,x_in,y_in,e_in,reals, - 1 XD_in,XB_in,YB_in,vfile,rfile,l_fn, - 2 nd_out,xout,yout,eout,yfit,pfit) - INCLUDE 'mod_data.f90' - INCLUDE 'mod_files.f90' - INCLUDE 'options.f90' - common/mess/ness - COMMON /FFTCOM/ FRES(m_d2),FWRK(m_d2),XJ(m_d),TWOPIK(m_d1),NFFT - COMMON /DATCOM/ XDAT(m_d),DAT(m_d),SIG(m_d),NDAT - COMMON /DINTRP/ IPDAT(m_d),XPDAT(m_d) - COMMON /FITCOM/ FIT(m_d),RESID(m_d),NFEW,FITP(m_p),EXPF(m_d1,6) - COMMON /SCLCOM/ BSCL,ASCL,WSCL,SCLVEC(m_p,2),GSCL - COMMON /GRDCOM/ DDDPAR(m_d,m_p),FR2PIK(m_d2,2) - COMMON /WRKCOM/ WORK(m_d2,2) - COMMON /ModPars/ NBIN,IMIN,IMAX,RSCL,BNORM - real x_in(m_d), y_in(m_d), e_in(m_d) -cf2py intent(in) :: x_in, y_in, e_in !sample data - real reals(4) -cf2py intent(in) :: reals !real parameters - real XD_in(m_d), XB_in(m_d), YB_in(m_d) -cf2py intent(in) :: XD_in, XB_in, YB_in !sample xrange, res data (blur) - integer numb(8) -cf2py intent(in) :: numb !integer parameters - integer l_fn -cf2py intent(in) :: l_fn !length of filenames - character*140 vfile, rfile -cf2py intent(in) :: vfile, rfile !van & res filenames - integer nd_out -cf2py intent(out) :: nd_out !number of output points - real xout(m_d), yout(m_d), eout(m_d), yfit(m_d), pfit(4) -cf2py intent(out) :: xout, yout, eout, yfit, pfit !data values - real*4 XBLR(m_d),YBLR(m_d) - real*4 GRAD(m_p),HESS(m_p,m_p),DPAR(m_p),COVAR(m_p,m_p) - real*4 SIGPAR(m_p),FITPSV(m_p) - real*4 PRBSV(4,m_sp),PRMSV(7,4,m_sp),SIGSV(7,4,m_sp) - real*4 CHIX(31),BPARSV(m_p),CCHIX(31) - real*4 DTNORM(m_sp),XSCALE(m_sp) - integer INDX(m_p) - character*80 text,TITLE - DATA NCHIX /31/ - prog='r' - o_bgd=1 - o_w1=0 - CALL init_paras - do n=1,m_p - GRAD(n)=0.0 - DPAR(n)=0.0 - SIGPAR(n)=0.0 - FITPSV(n)=0.0 - BPARSV(n)=0.0 - do m=1,m_p - HESS(n,m)=0.0 - COVAR(n,m)=0.0 - end do - end do - do n=1,m_sp - do n1=1,4 - PRBSV(n1,n)=0.0 - do n2=1,7 - PRMSV(n2,n1,n)=0.0 - SIGSV(n2,n1,n)=0.0 - end do - end do - end do - do n=1,31 - CHIX(n)=0.0 - CCHIX(n)=0.0 - end do -c -c numb = [ngrp, nsp, ntc, Ndat, nbin, Imin, Imax, Nb] - NSPEC=numb(1) !no. of groups - ISP=numb(2) !group number - ntc=numb(3) !no. of points - NDAT=numb(4) - NBIN=numb(5) - IMIN=numb(6) - IMAX=numb(7) - NB=numb(8) -c reals = [efix, theta[isp], rscl, bnorm] - efix=reals(1) - theta(ISP)=reals(2) - RSCL=reals(3) - BNORM=reals(4) - do n=1,m_d - xin(n)=x_in(n) - yin(n)=y_in(n) - ein(n)=e_in(n) - XDAT(n)=XD_in(n) - XBLR(n)=XB_in(n) - YBLR(n)=YB_in(n) - end do - do n=1,m_sp !ResNorm output not used - DTNORM(n)=1.0 !DTNORM, NSPEC - XSCALE(n)=1.0 !XSCALE, NSPEC - end do - lptfile = '' - l_lpt=l_fn+11 - lptfile(1:l_lpt)=vfile(1:l_fn)//'_resnrm.lpt' - if(ISP.eq.1)then !print info - call open_f(53,lptfile) - write(53,1107)vfile -1107 format(' Vanadium file : ',a140) - write(53,1108)rfile -1108 format(' Resolution file : ',a140) - close(unit=53) - endif - NDAT=ntc - CALL BLRINT(XBLR,YBLR,NB,1.0,.false.) - CALL DPINIT - CALL GDINIT - DCHIX=0.010 - CHIX0=1.0-DCHIX*FLOAT((NCHIX-1)/2) -c spectrum starts - NDAT=ntc - CALL DATIN(ISP,DTNORM,IDUF) - if(ISP.eq.1)then !print info - OPEN(UNIT=53,FILE=lptfile,STATUS='old',FORM='formatted', - 1 access='append') - write(53,1110)xin(1),xin(ntc) -1110 format(' Energy range: ',f8.3,' to ',f8.3,' meV') - write(53,1002)xblr(1),xblr(NB+1) -1002 format(' Energy range after BLRint: ',f8.3,' to ',f8.3,' meV') - close(unit=53) - endif - CMINSV=1.0E+20 - DO IX=1,NCHIX - CHIX(IX)=CHIX0+FLOAT(IX-1)*DCHIX - CALL BLRINT(XBLR,YBLR,NB,CHIX(IX),.false.) - CALL DPINIT - CALL PRINIT(FITP,3,NFEW,IX) - CALL REFINA(GRAD,HESS,DPAR,3+NFEW,DETLOG,INDX,COVAR) - NPARMS=4+2*NFEW - CHIOLD=CCHI(FITP) - CALL VCOPY(FITP,FITPSV,NPARMS) - STEPSZ=0.3 - IF (NFEW.GT.1) STEPSZ=STEPSZ/10.0 - IAGAIN=0 - CDIFMN=0.003 - ness=0 - DO I=1,200 - CALL REFINE(GRAD,HESS,NPARMS,DETLOG,INDX,COVAR, - 1 STEPSZ,.FALSE.) - CALL NEWEST(COVAR,GRAD,NPARMS,NFEW,DPAR,FITP) - CNORM=CCHI(FITP) - IF (CNORM.LE.CHIOLD) THEN - CHIDIF=(CHIOLD-CNORM)/CNORM - IF (ABS(CHIDIF).LE.CDIFMN) THEN - IF (IAGAIN.EQ.0) THEN - CDIFMN=0.00005 - STEPSZ=0.15 - IAGAIN=1 - ELSE - GOTO 3 - ENDIF - ENDIF - CHIOLD=CNORM - CALL VCOPY(FITP,FITPSV,NPARMS) - ELSE - CALL VCOPY(FITPSV,FITP,NPARMS) - STEPSZ=STEPSZ*0.6 - ENDIF - END DO - 3 CCHIX(IX)=CNORM - IF (CNORM.LT.CMINSV) THEN - IXMIN=IX - CMINSV=CNORM - XSCLSV=CHIX(IX) - FLUXSV=FITP(3)*ASCL - CALL VCOPY(FITP,BPARSV,NPARMS) +! PROGRAM RESNORM +!----------------------------------------------------------------------- +! This is a simple resolution normalisation program, which was modified +! from QUASI_LINES_2D.FOR . It reads in a 2-D resolution file, which +! should be of the same intermediate GENIE binary format as that of the +! 2-D quasi-elastic data to be subsequently analysed. The output is in +! file FOR007.DAT . +!----------------------------------------------------------------------- +! Written by: D.S. Sivia, Rutherford Appleton Lab., Oxfordshire, England. +!----------------------------------------------------------------------- +! Initial release for trials by CJC, MAA, WSH. (DSS: 10-MAR-1992) +! Stretch-factor range increased to +/- 10%. (DSS: 27-MAY-1992) +! WBF array-size increased in subroutine INBUFF. (DSS: 28-MAY-1992) +! Also put in READONLY for the resolution file. (DSS: 28-MAY-1992) +! Fixed bug in CLRBUF; problem for lots of detectors.(DSS: 29-MAY-1992) +! Hard-wired meV input & ueV output, increased search +! to +/- 15% and added silent-running option. (DSS: 2-OCT-1992) +! Took out small and negative number safety-valve. (DSS: 17-DEC-1992) +! Fixed bug in DATIN1 (no more large error-bars!). (DSS: 27-SEP-1993) +!----------------------------------------------------------------------- +! nd,xout,yout,eout,yfit=resnorm.resnorm(numb,Xv,Yv,Ev,reals,Xdat,Xb,Yb,wrk,lwrk) +! numb = [ngrp, nsp, ntc, Ndat, nbin, Imin, Imax, Nb] +! reals = [efix, theta[0], rscl, bnorm] +! +SUBROUTINE RESNORM(numb,x_in,y_in,e_in,reals, & + XD_in,XB_in,YB_in,vfile,rfile,l_fn, & + nd_out,xout,yout,eout,yfit,pfit) +INCLUDE 'mod_data.f90' +INCLUDE 'mod_files.f90' +INCLUDE 'options.f90' +common/mess/ness +COMMON /FFTCOM/ FRES(m_d2),FWRK(m_d2),XJ(m_d),TWOPIK(m_d1),NFFT +COMMON /DATCOM/ XDAT(m_d),DAT(m_d),SIG(m_d),NDAT +COMMON /DINTRP/ IPDAT(m_d),XPDAT(m_d) +COMMON /FITCOM/ FIT(m_d),RESID(m_d),NFEW,FITP(m_p),EXPF(m_d1,6) +COMMON /SCLCOM/ BSCL,ASCL,WSCL,SCLVEC(m_p,2),GSCL +COMMON /GRDCOM/ DDDPAR(m_d,m_p),FR2PIK(m_d2,2) +COMMON /WRKCOM/ WORK(m_d2,2) +COMMON /ModPars/ NBIN,IMIN,IMAX,RSCL,BNORM +real x_in(m_d), y_in(m_d), e_in(m_d) +!f2py intent(in) :: x_in, y_in, e_in !sample data +real reals(4) +!f2py intent(in) :: reals !real parameters +real XD_in(m_d), XB_in(m_d), YB_in(m_d) +!f2py intent(in) :: XD_in, XB_in, YB_in !sample xrange, res data (blur) +integer numb(8) +!f2py intent(in) :: numb !integer parameters +integer l_fn +!f2py intent(in) :: l_fn !length of filenames +character*140 vfile, rfile +!f2py intent(in) :: vfile, rfile !van & res filenames +integer nd_out +!f2py intent(out) :: nd_out !number of output points +real xout(m_d), yout(m_d), eout(m_d), yfit(m_d), pfit(4) +!f2py intent(out) :: xout, yout, eout, yfit, pfit !data values +real*4 XBLR(m_d),YBLR(m_d) +real*4 GRAD(m_p),HESS(m_p,m_p),DPAR(m_p),COVAR(m_p,m_p) +real*4 SIGPAR(m_p),FITPSV(m_p) +real*4 PRBSV(4,m_sp),PRMSV(7,4,m_sp),SIGSV(7,4,m_sp) +real*4 CHIX(31),BPARSV(m_p),CCHIX(31) +real*4 DTNORM(m_sp),XSCALE(m_sp) +integer INDX(m_p) +DATA NCHIX /31/ +prog='r' +o_bgd=1 +o_w1=0 +CALL init_paras +do n=1,m_p + GRAD(n)=0.0 + DPAR(n)=0.0 + SIGPAR(n)=0.0 + FITPSV(n)=0.0 + BPARSV(n)=0.0 + do m=1,m_p + HESS(n,m)=0.0 + COVAR(n,m)=0.0 + end do +end do +do n=1,m_sp + do n1=1,4 + PRBSV(n1,n)=0.0 + do n2=1,7 + PRMSV(n2,n1,n)=0.0 + SIGSV(n2,n1,n)=0.0 + end do + end do +end do +do n=1,31 + CHIX(n)=0.0 + CCHIX(n)=0.0 +end do +! +! numb = [ngrp, nsp, ntc, Ndat, nbin, Imin, Imax, Nb] +NSPEC=numb(1) !no. of groups +ISP=numb(2) !group number +ntc=numb(3) !no. of points +NDAT=numb(4) +NBIN=numb(5) +IMIN=numb(6) +IMAX=numb(7) +NB=numb(8) +! reals = [efix, theta[isp], rscl, bnorm] +efix=reals(1) +theta(ISP)=reals(2) +RSCL=reals(3) +BNORM=reals(4) +do n=1,m_d + xin(n)=x_in(n) + yin(n)=y_in(n) + ein(n)=e_in(n) + XDAT(n)=XD_in(n) + XBLR(n)=XB_in(n) + YBLR(n)=YB_in(n) +end do +do n=1,m_sp !ResNorm output not used + DTNORM(n)=1.0 !DTNORM, NSPEC + XSCALE(n)=1.0 !XSCALE, NSPEC +end do +l_lpt=l_fn+11 +lptfile(1:l_lpt)=vfile(1:l_fn)//'_resnrm.lpt' +if(ISP.eq.1)then !print info + call open_f(53,lptfile) + write(53,1107)vfile +1107 format(' Vanadium file : ',a140) + write(53,1108)rfile +1108 format(' Resolution file : ',a140) + close(unit=53) +endif +NDAT=ntc +CALL BLRINT(XBLR,YBLR,NB,1.0,.false.) +CALL DPINIT +CALL GDINIT +DCHIX=0.010 +CHIX0=1.0-DCHIX*FLOAT((NCHIX-1)/2) +! spectrum starts +NDAT=ntc +CALL DATIN(ISP,DTNORM,IDUF) +if(ISP.eq.1)then !print info + OPEN(UNIT=53,FILE=lptfile,STATUS='old',FORM='formatted', & + access='append') + write(53,1110)xin(1),xin(ntc) +1110 format(' Energy range: ',f8.3,' to ',f8.3,' meV') + write(53,1002)xblr(1),xblr(NB+1) +1002 format(' Energy range after BLRint: ',f8.3,' to ',f8.3,' meV') + close(unit=53) +endif +CMINSV=1.0E+20 +DO IX=1,NCHIX + CHIX(IX)=CHIX0+FLOAT(IX-1)*DCHIX + CALL BLRINT(XBLR,YBLR,NB,CHIX(IX),.false.) + CALL DPINIT + CALL PRINIT(FITP,3,NFEW,IX) + CALL REFINA(GRAD,HESS,DPAR,3+NFEW,DETLOG,INDX,COVAR) + NPARMS=4+2*NFEW + CHIOLD=CCHI(FITP) + CALL VCOPY(FITP,FITPSV,NPARMS) + STEPSZ=0.3 + IF (NFEW.GT.1) STEPSZ=STEPSZ/10.0 + IAGAIN=0 + CDIFMN=0.003 + ness=0 + DO I=1,200 + CALL REFINE(GRAD,HESS,NPARMS,DETLOG,INDX,COVAR, & + STEPSZ,.FALSE.) + CALL NEWEST(COVAR,GRAD,NPARMS,NFEW,DPAR,FITP) + CNORM=CCHI(FITP) + IF (CNORM.LE.CHIOLD) THEN + CHIDIF=(CHIOLD-CNORM)/CNORM + IF (ABS(CHIDIF).LE.CDIFMN) THEN + IF (IAGAIN.EQ.0) THEN + CDIFMN=0.00005 + STEPSZ=0.15 + IAGAIN=1 + ELSE + GOTO 3 ENDIF - END DO - CALL VCOPY(BPARSV,FITP,NPARMS) - CALL QUADRT(CCHIX,IXMIN,NCHIX,XSCLSV,CHIX) - CALL BLRINT(XBLR,YBLR,NB,XSCLSV,.false.) - CALL DPINIT - CALL PRINIT(FITP,3,NFEW,2) - do I=1,5 - CALL REFINE(GRAD,HESS,NPARMS,DETLOG,INDX,COVAR, - 1 0.01,.TRUE.) - CALL NEWEST(COVAR,GRAD,NPARMS,NFEW,DPAR,FITP) - end do - CALL ERRBAR(COVAR,NPARMS,SIGPAR) - CNORM=CCHI(FITP) - pfit(1)=FITP(3)*ASCL - pfit(2)=XSCLSV - pfit(3)=CNORM - pfit(4)=FITP(4)*GSCL - OPEN(UNIT=53,FILE=lptfile,STATUS='old',FORM='formatted', - 1 access='append') - write(53,110) pfit(1),pfit(2),pfit(3),pfit(4) - 110 FORMAT(G15.5,F8.3,5X,2F10.3) - close(unit=53) + ENDIF + CHIOLD=CNORM + CALL VCOPY(FITP,FITPSV,NPARMS) + ELSE + CALL VCOPY(FITPSV,FITP,NPARMS) + STEPSZ=STEPSZ*0.6 + ENDIF + END DO +3 CCHIX(IX)=CNORM + IF (CNORM.LT.CMINSV) THEN + IXMIN=IX + CMINSV=CNORM + XSCLSV=CHIX(IX) + FLUXSV=FITP(3)*ASCL + CALL VCOPY(FITP,BPARSV,NPARMS) + ENDIF +END DO +CALL VCOPY(BPARSV,FITP,NPARMS) +CALL QUADRT(CCHIX,IXMIN,NCHIX,XSCLSV,CHIX) +CALL BLRINT(XBLR,YBLR,NB,XSCLSV,.false.) +CALL DPINIT +CALL PRINIT(FITP,3,NFEW,2) +do I=1,5 + CALL REFINE(GRAD,HESS,NPARMS,DETLOG,INDX,COVAR, & + 0.01,.TRUE.) + CALL NEWEST(COVAR,GRAD,NPARMS,NFEW,DPAR,FITP) +end do +CALL ERRBAR(COVAR,NPARMS,SIGPAR) +CNORM=CCHI(FITP) +pfit(1)=FITP(3)*ASCL +pfit(2)=XSCLSV +pfit(3)=CNORM +pfit(4)=FITP(4)*GSCL +OPEN(UNIT=53,FILE=lptfile,STATUS='old',FORM='formatted', & + access='append') +write(53,110) pfit(1),pfit(2),pfit(3),pfit(4) +110 FORMAT(G15.5,F8.3,5X,2F10.3) +close(unit=53) - nd_out=NDAT - do n=1,nd_out - xout(n)=XDAT(n) - yout(n)=DAT(n) - if(SIG(n).gt.1.0e-20)then - eout(n)=SQRT(2.0/SIG(n)) - else - eout(n)=0.0 - endif - yfit(n)=FIT(n) - end do -c spectrum ends - CLOSE(unit=53) - RETURN - END +nd_out=NDAT +do n=1,nd_out + xout(n)=XDAT(n) + yout(n)=DAT(n) + if(SIG(n).gt.1.0e-20)then + eout(n)=SQRT(2.0/SIG(n)) + else + eout(n)=0.0 + endif + yfit(n)=FIT(n) +end do +! spectrum ends +CLOSE(unit=53) +RETURN +END diff --git a/quasielasticbayes/ResNorm_subs.f90 b/quasielasticbayes/ResNorm_subs.f90 index 2ceca61..ac99973 100644 --- a/quasielasticbayes/ResNorm_subs.f90 +++ b/quasielasticbayes/ResNorm_subs.f90 @@ -1,184 +1,184 @@ - SUBROUTINE init_paras - INCLUDE 'res_par.f90' - COMMON /FFTCOM/ FRES(m_d2),FWRK(m_d2),XJ(m_d),TWOPIK(m_d1),NFFT - COMMON /DATCOM/ XDAT(m_d),DAT(m_d),SIG(m_d),NDAT - COMMON /DINTRP/ IPDAT(m_d),XPDAT(m_d) - COMMON /FITCOM/ FIT(m_d),RESID(m_d),NFEW,FITP(m_p),EXPF(m_d1,6) - COMMON /SCLCOM/ BSCL,ASCL,WSCL,SCLVEC(m_p,2),GSCL - COMMON /GRDCOM/ DDDPAR(m_d,m_p),FR2PIK(m_d2,2) - COMMON /QW1COM/ QW1(m_sp),SIGQW1(m_sp),ISPEC - COMMON /WRKCOM/ WORK(m_d2,2) - do n=1,m_d - XJ(n)=0.0 - XDAT(n)=0.0 - DAT(n)=0.0 - SIG(n)=0.0 - IPDAT(n)=0 - XPDAT(n)=0.0 - FIT(n)=0.0 - RESID(n)=0.0 - do m=1,m_p - DDDPAR(n,m)=0.0 - end do - end do - do n=1,m_d1 - TWOPIK(n)=0.0 - do m=1,3 - EXPF(n,m)=0.0 - end do - end do - do n=1,m_d2 - FRES(n)=0.0 - FWRK(n)=0.0 - do m=1,2 - FR2PIK(n,m)=0.0 - WORK(n,m)=0.0 - end do - end do - do n=1,m_p - FITP(n)=0.0 - do m=1,2 - SCLVEC(n,m)=0.0 - end do - end do - do n=1,m_sp - QW1(n)=0.0 - SIGQW1(n)=0.0 - end do - RETURN - END -C ---------------------------------------- - SUBROUTINE QUADRT(CHI,IXMIN,NX,XSCLSV,X) - real*4 CHI(*),X(*) - IF (IXMIN.LE.1 .OR. IXMIN.GE.NX) RETURN - CM=CHI(IXMIN-1) - C0=CHI(IXMIN) - CP=CHI(IXMIN+1) - X0=0.5*(CM-CP)/(CM-C0-C0+CP) - IF (ABS(X0).LT.0.5) XSCLSV=X0*(X(2)-X(1))+X(IXMIN) - END -c -C***************************************** -C - FUNCTION CCHI(V) - INCLUDE 'res_par.f90' - common/mess/ness - COMMON /FFTCOM/ FRES(m_d2),FWRK(m_d2),XJ(m_d),TWOPIK(m_d1),NFFT - COMMON /DATCOM/ XDAT(m_d),DAT(m_d),SIG(m_d),NDAT - COMMON /DINTRP/ IPDAT(m_d),XPDAT(m_d) - COMMON /FITCOM/ FIT(m_d),RESID(m_d),NFEW,FITP(m_p),EXPF(m_d1,6) - COMMON /SCLCOM/ BSCL,ASCL,WSCL,SCLVEC(m_p,2),GSCL - COMMON /GRDCOM/ DDDPAR(m_d,m_p),FR2PIK(m_d2,2) - COMMON /WRKCOM/ WORK(m_d2,2) - real*4 V(*) - CHI=0.0 - B1=BSCL*V(1) - B2=BSCL*V(2) - A0=ASCL*V(3) - DELTAX=V(4) - NFT2=NFFT/2+1 - CALL CXSHFT(FRES,DELTAX,TWOPIK,FR2PIK,FR2PIK(1,2),NFT2) - CALL VRFILL(WORK,A0,NFT2) - XNSCL=-LOG(1.0E-7)/(TWOPIK(2)-TWOPIK(1)) - DO J=1,NFEW - AJ=ASCL*V(3+J+J) - SIGJ=WSCL*V(4+J+J)/GSCL - CALL VRFILL(EXPF(1,J),0.0,NFT2) - NXFT2=1+NINT(XNSCL/(ABS(SIGJ)+1.0E-10)) - IF (NXFT2.GT.NFT2) NXFT2=NFT2 - DO I=1,NXFT2 - EXPIJ=EXP(-TWOPIK(I)*SIGJ) - EXPF(I,J)=EXPIJ - WORK(I,1)=WORK(I,1)+AJ*EXPIJ - END DO - END DO - CALL VMLTRC(WORK,FR2PIK,NFT2,FWRK) - CALL FOUR2(FWRK,NFFT,1,-1,-1) - CALL DEGRID(FWRK,FIT) - X1=XDAT(1) - BNORM=(B2-B1)/(XDAT(NDAT)-X1) - DO I=1,NDAT - FIT(I)=FIT(I)+B1+BNORM*(XDAT(I)-X1) - DIF=FIT(I)-DAT(I) - RESID(I)=DIF*SIG(I) - CHI=CHI+DIF*RESID(I) - END DO - CCHI=CHI/(2.0*FLOAT(NDAT)) - END -C -C****************************** -C - SUBROUTINE REFINE(GRAD,HESS,NP,DETLOG,INDX,COVAR,STEPSZ,lpt) - INCLUDE 'res_par.f90' - INCLUDE 'mod_files.f90' - COMMON /FFTCOM/ FRES(m_d2),FWRK(m_d2),XJ(m_d),TWOPIK(m_d1),NFFT - COMMON /DATCOM/ XDAT(m_d),DAT(m_d),SIG(m_d),NDAT - COMMON /DINTRP/ IPDAT(m_d),XPDAT(m_d) - COMMON /FITCOM/ FIT(m_d),RESID(m_d),NFEW,FITP(m_p),EXPF(m_d1,6) - COMMON /SCLCOM/ BSCL,ASCL,WSCL,SCLVEC(m_p,2),GSCL - COMMON /WRKCOM/ WORK(m_d2,2) - COMMON /GRDCOM/ DDDPAR(m_d,m_p),FR2PIK(m_d2,2) - real*4 GRAD(*),HESS(NP,*),COVAR(NP,*) - integer INDX(*) - logical lpt - NFT2=NFFT/2+1 - CNORM=CCHI(FITP) - if(lpt)then - OPEN(UNIT=53,FILE=lptfile,STATUS='old',FORM='formatted', - 1 access='append') - WRITE(53,100) CNORM - 100 FORMAT(' Refine: Normalised chi-squared = ',1PE13.5) - close(unit=53) - endif - CALL VRFILL(HESS,0.0,NP*NP) - CALL VMLTRC(WORK,FR2PIK(1,2),NFT2,FWRK) - CALL VMLTRC(TWOPIK,FWRK,NFT2,WORK) - CALL VMLTIC(WORK,NFT2,WORK) - CALL FOUR2(FWRK,NFFT,1,-1,-1) - CALL DEGRID(FWRK,DDDPAR(1,4)) - CALL FOUR2(WORK,NFFT,1,-1,-1) - CALL DEGRID(WORK,FWRK) - CALL VRDOTR(RESID,FWRK,NDAT,HESS(4,4)) - CALL VCOPY(FR2PIK,FWRK,NFFT+2) - CALL FOUR2(FWRK,NFFT,1,-1,-1) - CALL DEGRID(FWRK,DDDPAR(1,3)) - CALL VCOPY(FR2PIK(1,2),FWRK,NFFT+2) - CALL FOUR2(FWRK,NFFT,1,-1,-1) - CALL DEGRID(FWRK,WORK) - CALL VRDOTR(RESID,WORK,NDAT,HESS(3,4)) - HESS(4,3)=HESS(3,4) - DO I=1,NFEW - J=3+I+I - AJ=FITP(J)*ASCL - CALL VMLTRC(EXPF(1,I),FR2PIK,NFT2,WORK) - CALL VCOPY(WORK,FWRK,NFFT+2) - CALL FOUR2(FWRK,NFFT,1,-1,-1) - CALL DEGRID(FWRK,DDDPAR(1,J)) - CALL VMLTRC(TWOPIK,WORK,NFT2,FWRK) - CALL VCOPY(FWRK,WORK,NFFT+2) - CALL FOUR2(FWRK,NFFT,1,-1,-1) - CALL DEGRID(FWRK,DDDPAR(1,J+1)) - CALL HESS0(HESS,NP,RESID,NDAT,DDDPAR(1,J+1),AJ,J) - CALL VMLTIC(WORK,NFT2,WORK) - CALL VCOPY(WORK,FWRK,NFFT+2) - CALL FOUR2(FWRK,NFFT,1,-1,-1) - CALL DEGRID(FWRK,WORK(1,2)) - CALL VRDOTR(RESID,WORK(1,2),NDAT,HESS(4,J)) - HESS(J,4)=HESS(4,J) - CALL VMLTRC(TWOPIK,WORK,NFT2,FWRK) - CALL VCOPY(FWRK,WORK,NFFT+2) - CALL FOUR2(FWRK,NFFT,1,-1,-1) - CALL DEGRID(FWRK,WORK(1,2)) - CALL VRDOTR(RESID,WORK(1,2),NDAT,SM) - HESS(4,J+1)=-AJ*SM - HESS(J+1,4)=HESS(4,J+1) - CALL VMLTIC(WORK,NFT2,WORK) - CALL FOUR2(WORK,NFFT,1,-1,-1) - CALL DEGRID(WORK,FWRK) - CALL VRDOTR(RESID,FWRK,NDAT,SM) - HESS(J+1,J+1)=-AJ*SM - END DO - CALL GRADPR(GRAD,RESID,NDAT,NP,SCLVEC(1,2)) - CALL HESS1(HESS,NP,SCLVEC(1,2),STEPSZ,NFEW) - CALL INVERT(HESS,COVAR,NP,INDX,DETLOG) - END +SUBROUTINE init_paras +INCLUDE 'res_par.f90' +COMMON /FFTCOM/ FRES(m_d2),FWRK(m_d2),XJ(m_d),TWOPIK(m_d1),NFFT +COMMON /DATCOM/ XDAT(m_d),DAT(m_d),SIG(m_d),NDAT +COMMON /DINTRP/ IPDAT(m_d),XPDAT(m_d) +COMMON /FITCOM/ FIT(m_d),RESID(m_d),NFEW,FITP(m_p),EXPF(m_d1,6) +COMMON /SCLCOM/ BSCL,ASCL,WSCL,SCLVEC(m_p,2),GSCL +COMMON /GRDCOM/ DDDPAR(m_d,m_p),FR2PIK(m_d2,2) +COMMON /QW1COM/ QW1(m_sp),SIGQW1(m_sp),ISPEC +COMMON /WRKCOM/ WORK(m_d2,2) +do n=1,m_d + XJ(n)=0.0 + XDAT(n)=0.0 + DAT(n)=0.0 + SIG(n)=0.0 + IPDAT(n)=0 + XPDAT(n)=0.0 + FIT(n)=0.0 + RESID(n)=0.0 + do m=1,m_p + DDDPAR(n,m)=0.0 + end do +end do +do n=1,m_d1 + TWOPIK(n)=0.0 + do m=1,3 + EXPF(n,m)=0.0 + end do +end do +do n=1,m_d2 + FRES(n)=0.0 + FWRK(n)=0.0 + do m=1,2 + FR2PIK(n,m)=0.0 + WORK(n,m)=0.0 + end do +end do +do n=1,m_p + FITP(n)=0.0 + do m=1,2 + SCLVEC(n,m)=0.0 + end do +end do +do n=1,m_sp + QW1(n)=0.0 + SIGQW1(n)=0.0 +end do +RETURN +END +! ---------------------------------------- +SUBROUTINE QUADRT(CHI,IXMIN,NX,XSCLSV,X) +real*4 CHI(*),X(*) +IF (IXMIN.LE.1 .OR. IXMIN.GE.NX) RETURN +CM=CHI(IXMIN-1) +C0=CHI(IXMIN) +CP=CHI(IXMIN+1) +X0=0.5*(CM-CP)/(CM-C0-C0+CP) +IF (ABS(X0).LT.0.5) XSCLSV=X0*(X(2)-X(1))+X(IXMIN) +END +! +!***************************************** +! +FUNCTION CCHI(V) +INCLUDE 'res_par.f90' +common/mess/ness +COMMON /FFTCOM/ FRES(m_d2),FWRK(m_d2),XJ(m_d),TWOPIK(m_d1),NFFT +COMMON /DATCOM/ XDAT(m_d),DAT(m_d),SIG(m_d),NDAT +COMMON /DINTRP/ IPDAT(m_d),XPDAT(m_d) +COMMON /FITCOM/ FIT(m_d),RESID(m_d),NFEW,FITP(m_p),EXPF(m_d1,6) +COMMON /SCLCOM/ BSCL,ASCL,WSCL,SCLVEC(m_p,2),GSCL +COMMON /GRDCOM/ DDDPAR(m_d,m_p),FR2PIK(m_d2,2) +COMMON /WRKCOM/ WORK(m_d2,2) +real*4 V(*) +CHI=0.0 +B1=BSCL*V(1) +B2=BSCL*V(2) +A0=ASCL*V(3) +DELTAX=V(4) +NFT2=NFFT/2+1 +CALL CXSHFT(FRES,DELTAX,TWOPIK,FR2PIK,FR2PIK(1,2),NFT2) +CALL VRFILL(WORK,A0,NFT2) +XNSCL=-LOG(1.0E-7)/(TWOPIK(2)-TWOPIK(1)) +DO J=1,NFEW + AJ=ASCL*V(3+J+J) + SIGJ=WSCL*V(4+J+J)/GSCL + CALL VRFILL(EXPF(1,J),0.0,NFT2) + NXFT2=1+NINT(XNSCL/(ABS(SIGJ)+1.0E-10)) + IF (NXFT2.GT.NFT2) NXFT2=NFT2 + DO I=1,NXFT2 + EXPIJ=EXP(-TWOPIK(I)*SIGJ) + EXPF(I,J)=EXPIJ + WORK(I,1)=WORK(I,1)+AJ*EXPIJ + END DO +END DO +CALL VMLTRC(WORK,FR2PIK,NFT2,FWRK) +CALL FOUR2(FWRK,NFFT,1,-1,-1) +CALL DEGRID(FWRK,FIT) +X1=XDAT(1) +BNORM=(B2-B1)/(XDAT(NDAT)-X1) +DO I=1,NDAT + FIT(I)=FIT(I)+B1+BNORM*(XDAT(I)-X1) + DIF=FIT(I)-DAT(I) + RESID(I)=DIF*SIG(I) + CHI=CHI+DIF*RESID(I) +END DO +CCHI=CHI/(2.0*FLOAT(NDAT)) +END +! +!****************************** +! +SUBROUTINE REFINE(GRAD,HESS,NP,DETLOG,INDX,COVAR,STEPSZ,lpt) +INCLUDE 'res_par.f90' +INCLUDE 'mod_files.f90' +COMMON /FFTCOM/ FRES(m_d2),FWRK(m_d2),XJ(m_d),TWOPIK(m_d1),NFFT +COMMON /DATCOM/ XDAT(m_d),DAT(m_d),SIG(m_d),NDAT +COMMON /DINTRP/ IPDAT(m_d),XPDAT(m_d) +COMMON /FITCOM/ FIT(m_d),RESID(m_d),NFEW,FITP(m_p),EXPF(m_d1,6) +COMMON /SCLCOM/ BSCL,ASCL,WSCL,SCLVEC(m_p,2),GSCL +COMMON /WRKCOM/ WORK(m_d2,2) +COMMON /GRDCOM/ DDDPAR(m_d,m_p),FR2PIK(m_d2,2) +real*4 GRAD(*),HESS(NP,*),COVAR(NP,*) +integer INDX(*) +logical lpt +NFT2=NFFT/2+1 +CNORM=CCHI(FITP) +if(lpt)then + OPEN(UNIT=53,FILE=lptfile,STATUS='old',FORM='formatted', & + access='append') + WRITE(53,100) CNORM +100 FORMAT(' Refine: Normalised chi-squared = ',1PE13.5) + close(unit=53) +endif +CALL VRFILL(HESS,0.0,NP*NP) +CALL VMLTRC(WORK,FR2PIK(1,2),NFT2,FWRK) +CALL VMLTRC(TWOPIK,FWRK,NFT2,WORK) +CALL VMLTIC(WORK,NFT2,WORK) +CALL FOUR2(FWRK,NFFT,1,-1,-1) +CALL DEGRID(FWRK,DDDPAR(1,4)) +CALL FOUR2(WORK,NFFT,1,-1,-1) +CALL DEGRID(WORK,FWRK) +CALL VRDOTR(RESID,FWRK,NDAT,HESS(4,4)) +CALL VCOPY(FR2PIK,FWRK,NFFT+2) +CALL FOUR2(FWRK,NFFT,1,-1,-1) +CALL DEGRID(FWRK,DDDPAR(1,3)) +CALL VCOPY(FR2PIK(1,2),FWRK,NFFT+2) +CALL FOUR2(FWRK,NFFT,1,-1,-1) +CALL DEGRID(FWRK,WORK) +CALL VRDOTR(RESID,WORK,NDAT,HESS(3,4)) +HESS(4,3)=HESS(3,4) +DO I=1,NFEW + J=3+I+I + AJ=FITP(J)*ASCL + CALL VMLTRC(EXPF(1,I),FR2PIK,NFT2,WORK) + CALL VCOPY(WORK,FWRK,NFFT+2) + CALL FOUR2(FWRK,NFFT,1,-1,-1) + CALL DEGRID(FWRK,DDDPAR(1,J)) + CALL VMLTRC(TWOPIK,WORK,NFT2,FWRK) + CALL VCOPY(FWRK,WORK,NFFT+2) + CALL FOUR2(FWRK,NFFT,1,-1,-1) + CALL DEGRID(FWRK,DDDPAR(1,J+1)) + CALL HESS0(HESS,NP,RESID,NDAT,DDDPAR(1,J+1),AJ,J) + CALL VMLTIC(WORK,NFT2,WORK) + CALL VCOPY(WORK,FWRK,NFFT+2) + CALL FOUR2(FWRK,NFFT,1,-1,-1) + CALL DEGRID(FWRK,WORK(1,2)) + CALL VRDOTR(RESID,WORK(1,2),NDAT,HESS(4,J)) + HESS(J,4)=HESS(4,J) + CALL VMLTRC(TWOPIK,WORK,NFT2,FWRK) + CALL VCOPY(FWRK,WORK,NFFT+2) + CALL FOUR2(FWRK,NFFT,1,-1,-1) + CALL DEGRID(FWRK,WORK(1,2)) + CALL VRDOTR(RESID,WORK(1,2),NDAT,SM) + HESS(4,J+1)=-AJ*SM + HESS(J+1,4)=HESS(4,J+1) + CALL VMLTIC(WORK,NFT2,WORK) + CALL FOUR2(WORK,NFFT,1,-1,-1) + CALL DEGRID(WORK,FWRK) + CALL VRDOTR(RESID,FWRK,NDAT,SM) + HESS(J+1,J+1)=-AJ*SM +END DO +CALL GRADPR(GRAD,RESID,NDAT,NP,SCLVEC(1,2)) +CALL HESS1(HESS,NP,SCLVEC(1,2),STEPSZ,NFEW) +CALL INVERT(HESS,COVAR,NP,INDX,DETLOG) +END diff --git a/quasielasticbayes/Simopt.f90 b/quasielasticbayes/Simopt.f90 index 972873c..8916de1 100644 --- a/quasielasticbayes/Simopt.f90 +++ b/quasielasticbayes/Simopt.f90 @@ -1,272 +1,272 @@ - SUBROUTINE SIMOPT(X,DX,COVAR,N) -C -C Purpose -C A SIMPLEX-based routine which optimises the values of the N -C parameters pertaining to the components of the vector X; it also -C estimates the related covariance matrix. -C -C Parameters -C ARGUMENT TYPE I/O DIMENSION DESCRIPTION -C N I*4 I - No. of parameters to be optimised. -C X R*4 I N Initial guess. -C X R*4 O N The optimal answer. -C DX R*4 I N Initial step-lengths for X. -C COVAR R*4 O N x N The covariance matrix. -C -C Other Requirements -C The user must provide a FUNCTION CCHI(X) which evalutes -C Chi-squared (un-normalised) given the vector X. -C -C History -C D. S. Sivia 9 Feb 1995 Initial release. -C D. S. Sivia 21 Nov 1995 Corrected a minor, but crashable, bug. -C D. S. Sivia 26 Apr 1996 Removed chi-squared write statements. -C -C----------------------------------------------------------------------- -C - REAL X(N),DX(N),COVAR(N,N) - REAL HESS(2500),DELTA(50),C0,C1(2,50),C2(2500) - REAL V(2550),EX(150),C(51) - INTEGER IR(51),INDX(50) - EXTERNAL CCHI - DATA NMAX /50/ -C - IF (N.GT.NMAX) STOP' Sorry, too many parameters !' - CALL VCOPY(X,V,N) - CHIMIN=CCHI(V) - 1 CALL SIMPLEX(V,N,DX,EX,C,IR,N*1000) - CALL VCOPY(EX,V,N) - CHI=CCHI(V) - IF ((1.0-CHI/CHIMIN).GT.0.0001) THEN - CHIMIN=CHI - GOTO 1 - ENDIF - CALL VCOPY(V,X,N) - CALL CHINIT(V,N,DELTA,C0,C1,C2) - CALL HSINT1(C0,C1,DELTA,N,HESS) - CALL HSINT2(C0,C1,C2,DELTA,N,HESS) - CALL INVERT(HESS,COVAR,N,INDX,DETLOG) - END -C -C******************************************************** -C - SUBROUTINE SIMPLEX(V,N,D,EX,C,IR,MX) - REAL V(N,*),EX(N,*),C(*),D(*) - INTEGER IR(*) - LOGICAL SLOW - DATA ALPHA,BETA,GAMA/1.0,0.5,2.0/ -C - SLOW=.FALSE. - N3=3*N - CAIM=0.0 - C(1)=CCHI(V(1,1)) - CALL SIMP0(V,D,C,IR,N) - CMIN=C(IR(N+1)) - ITER=0 - NOLUCK=0 - IRSTRT=0 - 10 ITER=ITER+1 - NOLUCK=NOLUCK+1 - IF (ITER.GE.MX .OR. NOLUCK.GT.100) THEN - CALL SSORT(C,IR,N) - CALL VCOPY(V(1,IR(N+1)),EX,N) - IF (ITER.LT.250) THEN - NOLUCK=0 - do ID=1,N - D(ID)=D(ID)/10.0 - end do - CALL VCOPY(EX,V,N) - C(1)=CCHI(V(1,1)) - CALL SIMP0(V,D,C,IR,N) - CMIN=C(IR(N+1)) - ELSE - RETURN - ENDIF - ENDIF - CALL VRFILL(EX,0.,N3) - CALL XCENT(V,EX(1,3),IR(1),N) - CALL XZERO(V(1,IR(1)),EX,EX(1,3),N,ALPHA) - C0=CCHI(EX) - CL=C(IR(N+1)) - CH=C(IR(1)) - CS=C(IR(2)) - IF (C0.LT.CL) THEN - CALL EXPAND(CL,EX,EX(1,2),EX(1,3),N,C0,GAMA) - ELSEIF (C0.GT.CS) THEN - CALL CONTRACT(CH,C0,C00,EX,EX(1,2),EX(1,3),V(1,IR(1)),BETA,N) - IF (C00.LT.CH.AND.C00.LT.C0) THEN - CALL VCOPY(EX(1,2),EX,N) - C0=C00 - ELSE - CALL CONT2(IR(N+1),V,C,N,IR) - IRSTRT=IRSTRT+1 - IF (C(IR(N+1)).LT.CMIN) CMIN=C(IR(N+1)) - IF (IRSTRT.GE.5) THEN - NOLUCK=0 - CALL SSORT(C,IR,N) - CALL VCOPY(V(1,IR(N+1)),EX,N) - RETURN - ENDIF - ENDIF - ENDIF -C - CALL VCOPY(EX,V(1,IR(1)),N) - C(IR(1))=C0 - CALL SSORT(C,IR,N) - IF (C(IR(N+1)).LT.CMIN) THEN - DROP=(CMIN-C(IR(N+1)))/CMIN - IF (ABS(DROP).LT.1.0E-4) SLOW=.TRUE. - NOLUCK=0 - CMIN=C(IR(N+1)) - ENDIF - IF (CMIN.GT.CAIM .AND. .NOT. SLOW) GOTO 10 - CALL VCOPY(V(1,IR(N+1)),EX,N) - END -C ---------------------------- - SUBROUTINE SIMP0(V,D,C,IR,N) - REAL V(N,*),C(*),D(*) - INTEGER IR(*) - do I=2,N+1 - CALL VCOPY(V,V(1,I),N) - V(I-1,I)=V(I-1,I)+D(I-1) - C(I)= CCHI(V(1,I)) - end do - CALL SSORT(C,IR,N) - END -C ------------------------ - SUBROUTINE SSORT(C,IR,N) - REAL C(*) - INTEGER IR(*) - IR(1)=1 - DO 20 J=2,N+1 - DO 10 I=1,J-1 - IF (C(J).LT.C(IR(I))) GOTO 10 - do II=1,J-I - IR(J+1-II)=IR(J-II) - end do - IR(I)=J - GOTO 20 - 10 CONTINUE - IR(J)=J - 20 CONTINUE - END -C --------------------------- - SUBROUTINE XCENT(V,XC,IH,N) - REAL V(N,*),XC(*) - XNORM=1.0/FLOAT(N) - DO 20 J=1,N+1 - IF (J.EQ.IH) GOTO 20 - do I=1,N - XC(I)=XC(I)+V(I,J) - end do - 20 CONTINUE - do I=1,N - XC(I)=XC(I)*XNORM - end do - END -C ------------------------------ - SUBROUTINE XZERO(XH,X0,XC,N,A) - REAL XH(*),X0(*),XC(*) - do I=1,N - X0(I)=A*(XC(I)-XH(I))+XC(I) - end do - END -C -------------------------------------- - SUBROUTINE EXPAND(CL,X0,X00,XC,N,C0,G) - REAL X0(*),X00(*),XC(*) - do I=1,N - X00(I)=G*(X0(I)-XC(I))+XC(I) - end do - C00=CCHI(X00) - IF (C00.LT.CL) THEN - CALL VCOPY(X00,X0,N) - C0=C00 - ENDIF - END -C -------------------------------------------------- - SUBROUTINE CONTRACT(CH,C0,C00,X0,X00,XC,XH,B,N) - REAL X0(*),X00(*),XC(*),XH(*) - IF (C0.LT.CH) THEN - do I=1,N - X00(I)=B*(X0(I)-XC(I))+XC(I) - end do - ELSE - do I=1,N - X00(I)=B*(XH(I)-XC(I))+XC(I) - end do - ENDIF - C00=CCHI(X00) - END -C ---------------------------- - SUBROUTINE CONT2(K,V,C,N,IR) - REAL V(N,*),C(*) - INTEGER IR(*) - DO 20 J=1,N+1 - IF (J.EQ.K) GOTO 20 - do I=1,N - V(I,J)=0.5*(V(I,J)+V(I,K)) - C(J)=CCHI(V(1,J)) - end do - 20 CONTINUE - CALL SSORT(C,IR,N) - END -C -C******************************************************* -C - SUBROUTINE CHINIT(V,N,DELTA,C0,C1,C2) - REAL V(*),DELTA(*),C0,C1(2,*),C2(N,*) - EXTERNAL CCHI - CALL VRFILL(C2,0.0,N*N) - C0=CCHI(V) - CDELTA=C0/2000.0 - IF (CDELTA.LT.0.5) CDELTA=0.5 - do I=1,N - CALL DLINIT(V,I,C1(1,I),C1(2,I),C0,CDELTA,DELTA(I)) - end do - do J=1,N - V(J)=V(J)+DELTA(J) - do I=J+1,N - V(I)=V(I)+DELTA(I) - C2(I,J)=CCHI(V) - C2(J,I)=C2(I,J) - V(I)=V(I)-DELTA(I) - end do - V(J)=V(J)-DELTA(J) - end do - END -C ---------------------------------------------------- - SUBROUTINE DLINIT(X,J,CMINUS,CPLUS,C0,CDELTA,DELTA) - REAL X(*) - DATA FRAC,SMALL,XLARGE /1.0E-6,1.0E-20,1.0E20/ - X0=X(J) - D=FRAC*ABS(X0)+SMALL - do I=1,100 - D=D+D - X(J)=X0-D - CMINUS=CCHI(X) - X(J)=X0+D - CPLUS=CCHI(X) - IF (X(J).GT.XLARGE) GOTO 1 - IF (ABS(CMINUS-C0).GT.CDELTA) GOTO 1 - IF (ABS(CPLUS-C0).GT.CDELTA) GOTO 1 - end do - 1 DELTA=D - X(J)=X0 - END -C ------------------------------- - SUBROUTINE HSINT1(C0,C1,D,N,HS) - REAL C0,C1(2,*),D(*),HS(N,*) - do I=1,N - HS(I,I)=(C1(2,I)-C0-C0+C1(1,I))/(D(I)*D(I)) - end do - END -C ---------------------------------- - SUBROUTINE HSINT2(C0,C1,C2,D,N,HS) - REAL C0,C1(2,*),C2(N,*),D(*),HS(N,*) - do J=1,N - do I=J+1,N - HS(I,J)=(C2(I,J)-C1(2,I)-C1(2,J)+C0)/(D(I)*D(J)) - HS(J,I)=HS(I,J) - end do - end do - END +SUBROUTINE SIMOPT(X,DX,COVAR,N) +! +! Purpose +! A SIMPLEX-based routine which optimises the values of the N +! parameters pertaining to the components of the vector X; it also +! estimates the related covariance matrix. +! +! Parameters +! ARGUMENT TYPE I/O DIMENSION DESCRIPTION +! N I*4 I - No. of parameters to be optimised. +! X R*4 I N Initial guess. +! X R*4 O N The optimal answer. +! DX R*4 I N Initial step-lengths for X. +! COVAR R*4 O N x N The covariance matrix. +! +! Other Requirements +! The user must provide a FUNCTION CCHI(X) which evalutes +! Chi-squared (un-normalised) given the vector X. +! +! History +! D. S. Sivia 9 Feb 1995 Initial release. +! D. S. Sivia 21 Nov 1995 Corrected a minor, but crashable, bug. +! D. S. Sivia 26 Apr 1996 Removed chi-squared write statements. +! +!----------------------------------------------------------------------- +! +REAL X(N),DX(N),COVAR(N,N) +REAL HESS(2500),DELTA(50),C0,C1(2,50),C2(2500) +REAL V(2550),EX(150),C(51) +INTEGER IR(51),INDX(50) +EXTERNAL CCHI +DATA NMAX /50/ +! +IF (N.GT.NMAX) STOP 'Sorry, too many parameters !' +CALL VCOPY(X,V,N) +CHIMIN=CCHI(V) +1 CALL SIMPLEX(V,N,DX,EX,C,IR,N*1000) +CALL VCOPY(EX,V,N) +CHI=CCHI(V) +IF ((1.0-CHI/CHIMIN).GT.0.0001) THEN + CHIMIN=CHI + GOTO 1 +ENDIF +CALL VCOPY(V,X,N) +CALL CHINIT(V,N,DELTA,C0,C1,C2) +CALL HSINT1(C0,C1,DELTA,N,HESS) +CALL HSINT2(C0,C1,C2,DELTA,N,HESS) +CALL INVERT(HESS,COVAR,N,INDX,DETLOG) +END +! +!******************************************************** +! +SUBROUTINE SIMPLEX(V,N,D,EX,C,IR,MX) +REAL V(N,*),EX(N,*),C(*),D(*) +INTEGER IR(*) +LOGICAL SLOW +DATA ALPHA,BETA,GAMA/1.0,0.5,2.0/ +! +SLOW=.FALSE. +N3=3*N +CAIM=0.0 +C(1)=CCHI(V(1,1)) +CALL SIMP0(V,D,C,IR,N) +CMIN=C(IR(N+1)) +ITER=0 +NOLUCK=0 +IRSTRT=0 +10 ITER=ITER+1 +NOLUCK=NOLUCK+1 +IF (ITER.GE.MX .OR. NOLUCK.GT.100) THEN + CALL SSORT(C,IR,N) + CALL VCOPY(V(1,IR(N+1)),EX,N) + IF (ITER.LT.250) THEN + NOLUCK=0 + do ID=1,N + D(ID)=D(ID)/10.0 + end do + CALL VCOPY(EX,V,N) + C(1)=CCHI(V(1,1)) + CALL SIMP0(V,D,C,IR,N) + CMIN=C(IR(N+1)) + ELSE + RETURN + ENDIF +ENDIF +CALL VRFILL(EX,0.,N3) +CALL XCENT(V,EX(1,3),IR(1),N) +CALL XZERO(V(1,IR(1)),EX,EX(1,3),N,ALPHA) +C0=CCHI(EX) +CL=C(IR(N+1)) +CH=C(IR(1)) +CS=C(IR(2)) +IF (C0.LT.CL) THEN + CALL EXPAND(CL,EX,EX(1,2),EX(1,3),N,C0,GAMA) +ELSEIF (C0.GT.CS) THEN + CALL CONTRACT(CH,C0,C00,EX,EX(1,2),EX(1,3),V(1,IR(1)),BETA,N) + IF (C00.LT.CH.AND.C00.LT.C0) THEN + CALL VCOPY(EX(1,2),EX,N) + C0=C00 + ELSE + CALL CONT2(IR(N+1),V,C,N,IR) + IRSTRT=IRSTRT+1 + IF (C(IR(N+1)).LT.CMIN) CMIN=C(IR(N+1)) + IF (IRSTRT.GE.5) THEN + NOLUCK=0 + CALL SSORT(C,IR,N) + CALL VCOPY(V(1,IR(N+1)),EX,N) + RETURN + ENDIF + ENDIF +ENDIF +! +CALL VCOPY(EX,V(1,IR(1)),N) +C(IR(1))=C0 +CALL SSORT(C,IR,N) +IF (C(IR(N+1)).LT.CMIN) THEN + DROP=(CMIN-C(IR(N+1)))/CMIN + IF (ABS(DROP).LT.1.0E-4) SLOW=.TRUE. + NOLUCK=0 + CMIN=C(IR(N+1)) +ENDIF +IF (CMIN.GT.CAIM .AND. .NOT. SLOW) GOTO 10 +CALL VCOPY(V(1,IR(N+1)),EX,N) +END +! ---------------------------- +SUBROUTINE SIMP0(V,D,C,IR,N) +REAL V(N,*),C(*),D(*) +INTEGER IR(*) +do I=2,N+1 + CALL VCOPY(V,V(1,I),N) + V(I-1,I)=V(I-1,I)+D(I-1) + C(I)= CCHI(V(1,I)) +end do +CALL SSORT(C,IR,N) +END +! ------------------------ +SUBROUTINE SSORT(C,IR,N) +REAL C(*) +INTEGER IR(*) +IR(1)=1 +DO 20 J=2,N+1 + DO 10 I=1,J-1 + IF (C(J).LT.C(IR(I))) GOTO 10 + do II=1,J-I + IR(J+1-II)=IR(J-II) + end do + IR(I)=J + GOTO 20 +10 CONTINUE + IR(J)=J +20 CONTINUE +END +! --------------------------- +SUBROUTINE XCENT(V,XC,IH,N) +REAL V(N,*),XC(*) +XNORM=1.0/FLOAT(N) +DO 20 J=1,N+1 + IF (J.EQ.IH) GOTO 20 + do I=1,N + XC(I)=XC(I)+V(I,J) + end do +20 CONTINUE +do I=1,N + XC(I)=XC(I)*XNORM +end do +END +! ------------------------------ +SUBROUTINE XZERO(XH,X0,XC,N,A) +REAL XH(*),X0(*),XC(*) +do I=1,N + X0(I)=A*(XC(I)-XH(I))+XC(I) +end do +END +! -------------------------------------- +SUBROUTINE EXPAND(CL,X0,X00,XC,N,C0,G) +REAL X0(*),X00(*),XC(*) +do I=1,N + X00(I)=G*(X0(I)-XC(I))+XC(I) +end do +C00=CCHI(X00) +IF (C00.LT.CL) THEN + CALL VCOPY(X00,X0,N) + C0=C00 +ENDIF +END +! -------------------------------------------------- +SUBROUTINE CONTRACT(CH,C0,C00,X0,X00,XC,XH,B,N) +REAL X0(*),X00(*),XC(*),XH(*) +IF (C0.LT.CH) THEN + do I=1,N + X00(I)=B*(X0(I)-XC(I))+XC(I) + end do +ELSE + do I=1,N + X00(I)=B*(XH(I)-XC(I))+XC(I) + end do +ENDIF +C00=CCHI(X00) +END +! ---------------------------- +SUBROUTINE CONT2(K,V,C,N,IR) +REAL V(N,*),C(*) +INTEGER IR(*) +DO 20 J=1,N+1 + IF (J.EQ.K) GOTO 20 + do I=1,N + V(I,J)=0.5*(V(I,J)+V(I,K)) + C(J)=CCHI(V(1,J)) + end do +20 CONTINUE +CALL SSORT(C,IR,N) +END +! +!******************************************************* +! +SUBROUTINE CHINIT(V,N,DELTA,C0,C1,C2) +REAL V(*),DELTA(*),C0,C1(2,*),C2(N,*) +EXTERNAL CCHI +CALL VRFILL(C2,0.0,N*N) +C0=CCHI(V) +CDELTA=C0/2000.0 +IF (CDELTA.LT.0.5) CDELTA=0.5 +do I=1,N + CALL DLINIT(V,I,C1(1,I),C1(2,I),C0,CDELTA,DELTA(I)) +end do +do J=1,N + V(J)=V(J)+DELTA(J) + do I=J+1,N + V(I)=V(I)+DELTA(I) + C2(I,J)=CCHI(V) + C2(J,I)=C2(I,J) + V(I)=V(I)-DELTA(I) + end do + V(J)=V(J)-DELTA(J) +end do +END +! ---------------------------------------------------- +SUBROUTINE DLINIT(X,J,CMINUS,CPLUS,C0,CDELTA,DELTA) +REAL X(*) +DATA FRAC,SMALL,XLARGE /1.0E-6,1.0E-20,1.0E20/ +X0=X(J) +D=FRAC*ABS(X0)+SMALL +do I=1,100 + D=D+D + X(J)=X0-D + CMINUS=CCHI(X) + X(J)=X0+D + CPLUS=CCHI(X) + IF (X(J).GT.XLARGE) GOTO 1 + IF (ABS(CMINUS-C0).GT.CDELTA) GOTO 1 + IF (ABS(CPLUS-C0).GT.CDELTA) GOTO 1 +end do +1 DELTA=D +X(J)=X0 +END +! ------------------------------- +SUBROUTINE HSINT1(C0,C1,D,N,HS) +REAL C0,C1(2,*),D(*),HS(N,*) +do I=1,N + HS(I,I)=(C1(2,I)-C0-C0+C1(1,I))/(D(I)*D(I)) +end do +END +! ---------------------------------- +SUBROUTINE HSINT2(C0,C1,C2,D,N,HS) +REAL C0,C1(2,*),C2(N,*),D(*),HS(N,*) +do J=1,N + do I=J+1,N + HS(I,J)=(C2(I,J)-C1(2,I)-C1(2,J)+C0)/(D(I)*D(J)) + HS(J,I)=HS(I,J) + end do +end do +END diff --git a/quasielasticbayes/Util.f90 b/quasielasticbayes/Util.f90 index 49a6963..7d90c65 100644 --- a/quasielasticbayes/Util.f90 +++ b/quasielasticbayes/Util.f90 @@ -1,133 +1,133 @@ - SUBROUTINE open_f(nit,fname) - character*(*) fname - logical found - integer nit - INQUIRE(FILE=fname,EXIST=found) - if(found)then - OPEN(UNIT=nit,FILE=fname,STATUS='OLD',FORM='FORMATTED') - CLOSE(UNIT=nit,STATUS='DELETE') - endif - OPEN(UNIT=nit,FILE=fname,STATUS='NEW',FORM='FORMATTED') - RETURN - END +SUBROUTINE open_f(nit,fname) +character*(*) fname +logical found +integer nit +INQUIRE(FILE=fname,EXIST=found) +if(found)then + OPEN(UNIT=nit,FILE=fname,STATUS='OLD',FORM='FORMATTED') + CLOSE(UNIT=nit,STATUS='DELETE') +endif +OPEN(UNIT=nit,FILE=fname,STATUS='NEW',FORM='FORMATTED') +RETURN +END -C**************************************************** -C - SUBROUTINE VCOPY(X,Y,N) - REAL X(*),Y(*) - do I=1,N - Y(I)=X(I) - end do - END -C -------------------------- - SUBROUTINE VIFILL(IN,K,N) - INTEGER IN(*) - do I=1,N - IN(I)=K - end do - END -C ------------------------ - SUBROUTINE VRFILL(X,A,N) - REAL X(*) - do I=1,N - X(I)=A - end do - END -C ------------------------ - SUBROUTINE VLFILL(LG,L,N) - LOGICAL LG(*),L - do I=1,N - LG(I)=L - end do - END -C----------------------------------------------------------------------C -C Two subroutines, for Cholesky decomposition of a matrix, copied out C -C of Numerical Recipes. C -C----------------------------------------------------------------------C -C - SUBROUTINE LUDCMP(A,N,NP,INDX,D) - PARAMETER (NMAX=100,TINY=1.0E-20) - DIMENSION A(NP,NP),INDX(N),VV(NMAX) - D=1.0 - do I=1,N - AAMAX=0.0 - do J=1,N - IF (ABS(A(I,J)).GT.AAMAX) AAMAX=ABS(A(I,J)) +!**************************************************** +! +SUBROUTINE VCOPY(X,Y,N) +REAL X(*),Y(*) +do I=1,N + Y(I)=X(I) +end do +END +! -------------------------- +SUBROUTINE VIFILL(IN,K,N) +INTEGER IN(*) +do I=1,N + IN(I)=K +end do +END +! ------------------------ +SUBROUTINE VRFILL(X,A,N) +REAL X(*) +do I=1,N + X(I)=A +end do +END +! ------------------------ +SUBROUTINE VLFILL(LG,L,N) +LOGICAL LG(*),L +do I=1,N + LG(I)=L +end do +END +!----------------------------------------------------------------------C +! Two subroutines, for Cholesky decomposition of a matrix, copied out C +! of Numerical Recipes. C +!----------------------------------------------------------------------C +! +SUBROUTINE LUDCMP(A,N,NP,INDX,D) +PARAMETER (NMAX=100,TINY=1.0E-20) +DIMENSION A(NP,NP),INDX(N),VV(NMAX) +D=1.0 +do I=1,N + AAMAX=0.0 + do J=1,N + IF (ABS(A(I,J)).GT.AAMAX) AAMAX=ABS(A(I,J)) + end do + IF (AAMAX.EQ.0.0) STOP ' Singular matrix!' + VV(I)=1.0/AAMAX +end do +do J=1,N + IF (J.GT.1) THEN + do I=1,J-1 + SUM=A(I,J) + IF (I.GT.1) THEN + do K=1,I-1 + SUM=SUM-A(I,K)*A(K,J) end do - IF (AAMAX.EQ.0.0) STOP ' Singular matrix!' - VV(I)=1.0/AAMAX - end do - do J=1,N - IF (J.GT.1) THEN - do I=1,J-1 - SUM=A(I,J) - IF (I.GT.1) THEN - do K=1,I-1 - SUM=SUM-A(I,K)*A(K,J) - end do - A(I,J)=SUM - ENDIF - end do - ENDIF - AAMAX=0.0 - do I=J,N - SUM=A(I,J) - IF (J.GT.1) THEN - do K=1,J-1 - SUM=SUM-A(I,K)*A(K,J) - end do - A(I,J)=SUM - ENDIF - DUM=VV(I)*ABS(SUM) - IF (DUM.GE.AAMAX) THEN - IMAX=I - AAMAX=DUM - ENDIF - end do - IF (J.NE.IMAX) THEN - do K=1,N - DUM=A(IMAX,K) - A(IMAX,K)=A(J,K) - A(J,K)=DUM - end do - D=-D - VV(IMAX)=VV(J) - ENDIF - INDX(J)=IMAX - IF (J.NE.N) THEN - IF (A(J,J).EQ.0.0) A(J,J)=TINY - DUM=1.0/A(J,J) - do I=J+1,N - A(I,J)=A(I,J)*DUM - end do - ENDIF - end do - IF (A(N,N).EQ.0.0) A(N,N)=TINY - END -C -------------------------------- - SUBROUTINE LUBKSB(A,N,NP,INDX,B) - DIMENSION A(NP,NP),INDX(N),B(N) - II=0 - do I=1,N - LL=INDX(I) - SUM=B(LL) - B(LL)=B(I) - IF (II.NE.0) THEN - do J=II,I-1 - SUM=SUM-A(I,J)*B(J) - end do - ELSEIF (SUM.NE.0.0) THEN - II=I - ENDIF - B(I)=SUM + A(I,J)=SUM + ENDIF + end do + ENDIF + AAMAX=0.0 + do I=J,N + SUM=A(I,J) + IF (J.GT.1) THEN + do K=1,J-1 + SUM=SUM-A(I,K)*A(K,J) end do - do I=N,1,-1 - SUM=B(I) - IF (I.LT.N) THEN - do J=I+1,N - SUM=SUM-A(I,J)*B(J) - end do - ENDIF - B(I)=SUM/A(I,I) + A(I,J)=SUM + ENDIF + DUM=VV(I)*ABS(SUM) + IF (DUM.GE.AAMAX) THEN + IMAX=I + AAMAX=DUM + ENDIF + end do + IF (J.NE.IMAX) THEN + do K=1,N + DUM=A(IMAX,K) + A(IMAX,K)=A(J,K) + A(J,K)=DUM + end do + D=-D + VV(IMAX)=VV(J) + ENDIF + INDX(J)=IMAX + IF (J.NE.N) THEN + IF (A(J,J).EQ.0.0) A(J,J)=TINY + DUM=1.0/A(J,J) + do I=J+1,N + A(I,J)=A(I,J)*DUM end do - END + ENDIF +end do +IF (A(N,N).EQ.0.0) A(N,N)=TINY +END +! -------------------------------- +SUBROUTINE LUBKSB(A,N,NP,INDX,B) +DIMENSION A(NP,NP),INDX(N),B(N) +II=0 +do I=1,N + LL=INDX(I) + SUM=B(LL) + B(LL)=B(I) + IF (II.NE.0) THEN + do J=II,I-1 + SUM=SUM-A(I,J)*B(J) + end do + ELSEIF (SUM.NE.0.0) THEN + II=I + ENDIF + B(I)=SUM +end do +do I=N,1,-1 + SUM=B(I) + IF (I.LT.N) THEN + do J=I+1,N + SUM=SUM-A(I,J)*B(J) + end do + ENDIF + B(I)=SUM/A(I,I) +end do +END diff --git a/quasielasticbayes/loc_size.f90 b/quasielasticbayes/loc_size.f90 index a86ce05..cc4afc0 100644 --- a/quasielasticbayes/loc_size.f90 +++ b/quasielasticbayes/loc_size.f90 @@ -1,4 +1,4 @@ - integer l_disk,l_dir,l_loc,l_name - integer m_disk,m_dir,m_loc,m_name - character disk*60,dir*60,loc*120,name*20 - parameter (m_disk=60,m_dir=60,m_loc=120,m_name=20) +integer l_disk,l_dir,l_loc,l_name +integer m_disk,m_dir,m_loc,m_name +character disk*60,dir*60,loc*120,name*20 +parameter (m_disk=60,m_dir=60,m_loc=120,m_name=20) diff --git a/quasielasticbayes/mod_data.f90 b/quasielasticbayes/mod_data.f90 index cefd94a..6233c05 100644 --- a/quasielasticbayes/mod_data.f90 +++ b/quasielasticbayes/mod_data.f90 @@ -1,4 +1,4 @@ - INCLUDE 'res_par.f90' - COMMON /ModDat/ ng,ntc,xin,yin,ein,theta,efix,Qavrg - REAL xin(m_d),yin(m_d),ein(m_d) - REAL theta(m_sp),Qavrg(m_sp) \ No newline at end of file +INCLUDE 'res_par.f90' +COMMON /ModDat/ ng,ntc,xin,yin,ein,theta,efix,Qavrg +REAL xin(m_d),yin(m_d),ein(m_d) +REAL theta(m_sp),Qavrg(m_sp) \ No newline at end of file diff --git a/quasielasticbayes/mod_files.f90 b/quasielasticbayes/mod_files.f90 index 6bf0fd0..768d471 100644 --- a/quasielasticbayes/mod_files.f90 +++ b/quasielasticbayes/mod_files.f90 @@ -1,5 +1,5 @@ - COMMON/ModFiles/filein,l_file,fileout1,fileout2,fileout3, - 1 l_par,filepar,l_lpt,lptfile,opt,filenorm - integer l_file,l_par,l_lpt,opt - character*140 filein,fileout1,fileout2,fileout3,filepar, - 1 lptfile,filenorm +COMMON/ModFiles/filein,l_file,fileout1,fileout2,fileout3, & + l_par,filepar,l_lpt,lptfile,opt,filenorm +integer l_file,l_par,l_lpt,opt +character*140 filein,fileout1,fileout2,fileout3,filepar, & + lptfile,filenorm diff --git a/quasielasticbayes/options.f90 b/quasielasticbayes/options.f90 index 7f3f66a..408c25d 100644 --- a/quasielasticbayes/options.f90 +++ b/quasielasticbayes/options.f90 @@ -1,3 +1,3 @@ - COMMON/Options/o_el,o_bgd,o_w1,prog - character*1 prog - integer o_el,o_bgd,o_w1 +COMMON/Options/o_el,o_bgd,o_w1,prog +character*1 prog +integer o_el,o_bgd,o_w1 diff --git a/quasielasticbayes/res_par.f90 b/quasielasticbayes/res_par.f90 index e5f56fe..bc91ab7 100644 --- a/quasielasticbayes/res_par.f90 +++ b/quasielasticbayes/res_par.f90 @@ -1 +1 @@ - PARAMETER (m_d=4096,m_d2=4098,m_d1=2049,m_sp=51,m_p=10) +PARAMETER (m_d=4096,m_d2=4098,m_d1=2049,m_sp=51,m_p=10) diff --git a/setup.py b/setup.py index 3a1b5c4..2bd307d 100644 --- a/setup.py +++ b/setup.py @@ -117,7 +117,7 @@ def finalize_options(self): ext_modules=extensions, author_email="mantid-help@mantidproject.org", url="https://github.com/mantidproject/quasielasticbayes", - version="0.2.0", + version="0.2.2", license="BSD", cmdclass={"build_ext": FortranExtensionBuilder} )