You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
3045 lines
94 KiB
Fortran
3045 lines
94 KiB
Fortran
C Version July 2007
|
|
C
|
|
C The MREG module provide 3 programs.
|
|
C
|
|
C 1) MREG
|
|
C 2) RIND
|
|
C 3) FI - normal CDF
|
|
C
|
|
C MREG and RIND are explained in the following:
|
|
C
|
|
C
|
|
C CALL MREG(F,R,B,DB,AA,BB,A,DA,VDER,M,N,NIT,INFR)
|
|
C
|
|
C F = expectation
|
|
C R = Covariance R(i+(j-1)*N) = Cov( Delta(T(i)), Delta(T(j)), length RDIM (in)
|
|
C B = Covariance B(i) = Cov(Delta(T(i)), XN), B(N+1)=Var(XN) length NMAX (in)
|
|
C DB = Covariance DB(i) = Cov(Delta(T(i)), Y0), DB(N+1)=Cov(XN,Y0) length NMAX (in)
|
|
C AA = Regression matrix coefficients size MMAX x MMAX
|
|
C BB = Regression vector coefficients length MMax + 1
|
|
C A = Slepian model coefficients, length (MMax + 1) * NMAX
|
|
C DA = Slepian model coefficients, length MMax + 1
|
|
C VDER = variance of Y0, Var(Y0)
|
|
C M = Number of regressors ( 0 < M < MMAX)
|
|
C N = dimension of the problem ( N < NMAX)
|
|
C NIT = 0,1,2..., maximum # of iterations/integrations done by quadrature
|
|
C to calculate the indicator function
|
|
C INFR = 1 means all input are the same as in the previous call except BB, A and DA
|
|
C 0 indicate new input
|
|
C
|
|
C The program MREG computes the following problem:
|
|
C
|
|
C We consider a process X(I)=X(T(I)) at the grid of N points T(1),...,T(N),
|
|
C
|
|
C X(I) = -A(I) + Z*A(I+N) + Sum Xj*A(I+(j+1)*N) + Delta(I), j=1,...,M-1
|
|
C
|
|
C where the sum disappears if M=1. We assume that Z,Xj are independent
|
|
C standard Rayleigh, Gaussian distributed rv. and independent of the zero
|
|
C mean Gaussian residual process, with covariance structure given in R,
|
|
C
|
|
C R(i+(j-1)N) = Cov (Delta(T(i)), Delta(T(j))).
|
|
C
|
|
C Additionally we have a zero mean Gaussian variable XN,
|
|
C independent of Z,Xj with covariance structure defined by
|
|
C B(i)= Cov (Delta(T(i)),XN), i=1,...,N, B(N+1)=Var(XN).
|
|
C Furthermore XN and Z,Xj satisfies the following equation system
|
|
C
|
|
C (BB + (XN,0,...,0)^T = AA*(Z,X1,...,Xm-1)^T (***)
|
|
C
|
|
C where AA is (M,M) matrix, BB is M-vector. We rewrite this equation, by
|
|
C introducing a variable Xm=XN/SQRT(Var(XN)) and construct new matrix AA1
|
|
c by adding the column (SQRT(Var(XN)),0,...,0) and the row with only zeros.
|
|
C The equations (***) writtes
|
|
C
|
|
C (BB,0)^T = AA1*(Z,X1,...,Xm-1,Xm)^T (****)
|
|
C
|
|
C where AA1 is (M+1,M+1) matrix, We assume that the rank of AA1 is M,
|
|
C otherwise the density is singular and we give a output F=0.CC
|
|
C
|
|
C Let Y0 be a zero-mean Gaussian variable independent of Z,Xj
|
|
C with covariance structure defined by
|
|
C DB(i)= Cov (Delta(T(i)),Y0), i=1,...,N, DB(N+1)=Cov(XN,Y0), Var(Y0)=VDER.
|
|
C Let Y be defined by
|
|
C
|
|
C Y=-DA(1) + Z*DA(2) + Sum Xj*DA(2+j) +Y0, j=1,...,M-1.
|
|
C
|
|
C The MREG program computes:
|
|
C
|
|
C F = E[ Y^+ *1{ HH<X(I)<0 for all I, I=1,...,N}|Z,X1,...,Xm-1 solves (***)]
|
|
C *f_{Z,X1,....,Xm-1}(***).
|
|
C
|
|
C In the simplest case NIT=0 we define (Delta(1),...,Delta(N),XN)=0.0d0
|
|
C
|
|
C We renormalize vectors AN and DA, the covariance fkn R, DB
|
|
C and VDER. Then by renormalization we choose the Gaussian variable X such
|
|
C that F is written in the form
|
|
C
|
|
C F = E[(D0(1)+X*D0(2)+Y1)^+*(PC+X*PD)^+*1{HH <A0(I)+X*B0(I)+Delta1(I)<0}]
|
|
C
|
|
C Observe, PC+X*PD>0 defines integration region for X.
|
|
C In the simplest case NIT=0 we define (Delta(1),...,Delta(N),Y1)=0.0d0
|
|
C For NIT=1 only (Delta(1),...,Delta(N))=0, i.e. we have to compute
|
|
C a one dimensional integral. Finally by conditioning on X the problem is
|
|
C put in the format of RIND-problem.
|
|
C
|
|
C INF indicates whether one
|
|
C has already called the subroutine before and ONLY! inputs BB, DA or A
|
|
C was changed.
|
|
C
|
|
C Observe the limitations are : N<NMAX = 201, 0<M< 5 = MMAX.
|
|
C
|
|
C
|
|
c 3-IX-93
|
|
C
|
|
C CALL RIND(XIND,R,BU,DBUN,DB,SQ,VDER,NIT,N,INFR)
|
|
C
|
|
C XIND = expectation/density (inout)
|
|
C R = Covariances Delta(ti), Delta(tj), size RDIM x 1 (in)
|
|
C R(i+(j-1)*N) = Cov( Delta(T(i)), Delta(T(j))
|
|
C BU = expectation of y(t), i.e., E(y(t)), size NMAX x 1 (in)
|
|
C DBUN = expectation of Y, i.e., E(Y)
|
|
C DB = Covariances Delta(T(i)), Y, size NMAX x 1 (in)
|
|
C DB(i) = Cov(Delta(T(i)), Y)
|
|
C SQ = standard deviations of Delta(T(i)), size NMAX x 1
|
|
C SQ(I) = SQRT (R(I+(I-1)*N))
|
|
C VDER = variance of Y, Var(Y)
|
|
C NIT = 0,1,2..., maximum # of iterations/integrations done by quadrature
|
|
C to calculate the indicator function
|
|
C N = dimension of the problem
|
|
C INFR = 1 means R, DB and SQ are the same as in the previous
|
|
C 0 indicate new R, DB and SQ.
|
|
C
|
|
C The program RIND computes the following problem:
|
|
C
|
|
C Let the process y(t)=BU(t)+Delta(t), where Delta(t) is zero mean
|
|
C Gaussian process and BU(t) be expectation of y(t). Consider the process x
|
|
C at the grid T(1),...,T(N), N=0,...,50, (N=0 means the empty grid T).
|
|
C Let y(I) = BU(T(I)) + Delta(T(I)). Observe we do not assume that the
|
|
C points T(I) are ordered or from, e.g. T(I) are in R^K.
|
|
C
|
|
C The covariance fkn of Delta at the points T(1),...,T(N), are given in
|
|
C the vector R; Cov( Delta(T(i)), Delta(T(j)) = R(i+(j-1)*N),
|
|
C furter E[y(T(i))] = BU(i). Hence the dimension of R must be N*N=2500.
|
|
C The vector SQ(1), ...., SQ(N) contains standard deviations of the residual
|
|
C Delta(T(I)), e.g. SQ(I) = SQRT (R(I+(I-1)*N)). However the small values
|
|
C of SQ could be corrupted by nummerical errors especially if the covariance
|
|
C structure was computed using the FFT algorithm. IF R(I+(I-1)*N)<EPS
|
|
C SQ(I)=0. and is used as an indicator that one is not allowed to
|
|
C condition on Delta(T(I)). Further when one have conditioned on the point
|
|
C T(I) the variance is put to zero.
|
|
C
|
|
C Consider in addition to y(t) a Gaussian variable Y, E[Y]=DBUN, Var(Y)=VDER,
|
|
C DB(I)=Cov(Delta(T(I)),Y).
|
|
C
|
|
C *** XIND - is the result; XIND=E[Y^+1{ HH<y(I)<0 for all I, I=1,...,N}] ***
|
|
C
|
|
C In the speccial case by choosing DB(I)=0, VDER=0 and DBUN=1, IAC=0,1,
|
|
C (if IAC=0 VDER can take any positive value), the output XIND is equal to
|
|
C XIND=Prob( HH < y(I) < 0 for all I, I=1,...,N).
|
|
C
|
|
C
|
|
C Some control variables:
|
|
C INFR=1 means that both R, DB and SQ are the same as in the previous
|
|
C call of RIND subroutine, INFR=0 indicates the new R, DB and SQ. The history
|
|
C of the conditioning is saved in the vectors INF(5), INFO(5): INF(1), ...,
|
|
C INF(5) are the times one has conditioned in the subroutines RINDT1,...,
|
|
C RINDT5, respectively. After conditioning INFO(i)=INF(i). Now if INF=INFO
|
|
C then the conditioning tree has not be changed and one not need to compute
|
|
C the conditonal covariances. This is really time saving trick. We are assume
|
|
C that the program saves all the time the matrices at the same fysical
|
|
C location, e.g. the values of variables are saved during the execution.
|
|
C This has all the time be checked when new compilator will be used.
|
|
C
|
|
C The variable ISQ marks which type of conditioning will be used ISQ=0
|
|
C means random time where the probability is minimum, ISQ=1 is the time
|
|
C where the variance of the residual process is minimal(ISQ=1 is faster).
|
|
C
|
|
C NIT, IAC are described in CROSSPACK paper, EPS0 is the accuracy constant
|
|
C used in choosing the number of nodes in numerical integrations
|
|
C (XX1, H1 vectors). The nodes and weights and other parameters are
|
|
C read in the subroutine INITINTEG from files Z.DAT, H.DAT and ACCUR.DAT.
|
|
C
|
|
C
|
|
C NIT=0, IAC=1 then one uses RIND0 - subroutine, all other cases
|
|
C goes through RIND1, ...,RIND5. NIT=0, here means explicite formula
|
|
C approximation for XIND=E[Y^+1{ HH<BU(I)<0 for all I, I=1,...,N}], where
|
|
C BU(I) is deterministic function.
|
|
C
|
|
C NIT=1, leads tp call RIND1, IAC=0 is also explicit form approximation,
|
|
C while IAC=1 leads to maximum one dimensional integral.
|
|
C .......
|
|
C NIT=5, leads tp call RIND5, IAC is maximally 4-dimensional integral,
|
|
C while IAC=1 leads to maximum 5 dimensional integral.
|
|
C
|
|
!
|
|
! Revised pab August 2007
|
|
! - replaced a call to SVDCMP with DSVDC derived from Lapack
|
|
! Revised pab July 2007
|
|
!
|
|
! - fixed some bugs
|
|
! - reimplemented as module mregmodule
|
|
! - moved the functions/subroutines in twog.f into rindmod and renamed it to MREG. -> mreg and rind publicly available
|
|
! - All commonblocks are replaced with a corresponding module
|
|
|
|
! References
|
|
! Rychlik, I and Lindgren, G (1993)
|
|
! "CROSSREG - A Technique for First Passage and Wave Density Analysis"
|
|
! Probability in the Engineering and Informational Sciences, Vol 7, pp 125--148
|
|
!
|
|
! Lindgren, G and Rychlik, I (1991)
|
|
! "Slepian Models and Regression Approximations in Crossing and xtreme value Theory",
|
|
! International Statistical Review, Vol 59, 2, pp 195--225
|
|
|
|
|
|
MODULE SIZEMOD
|
|
IMPLICIT NONE
|
|
INTEGER, PARAMETER :: MMAX = 6, NMAX = 201
|
|
INTEGER, PARAMETER :: RDIM = NMAX*NMAX
|
|
END MODULE SIZEMOD
|
|
|
|
MODULE EPSMOD
|
|
IMPLICIT NONE
|
|
! Constants determining accuracy of integration
|
|
!-----------------------------------------------
|
|
!if the conditional variance are less than:
|
|
C DOUBLE PRECISION :: EPS2=1.d-4 !- EPS2, the variable is
|
|
! considered deterministic
|
|
DOUBLE PRECISION :: EPS = 1.d-2 ! SQRT(EPS2)
|
|
C DOUBLE PRECISION :: XCEPS2=1.d-16 ! if Var(Xc) is less return NaN
|
|
DOUBLE PRECISION :: EPSS = 5.d-5 ! accuracy of Indicator
|
|
C DOUBLE PRECISION :: CEPSS=0.99995d0 ! accuracy of Indicator
|
|
DOUBLE PRECISION :: EPS0 = 5.d-5 ! used in GAUSSLE1 to implicitly
|
|
! determ. # nodes
|
|
|
|
C DOUBLE PRECISION :: fxcEpss=1.d-20 ! if less do not compute E(...|Xc)
|
|
C DOUBLE PRECISION :: xCutOff=5.d0 ! upper/lower truncation limit of the
|
|
! normal CDF
|
|
C DOUBLE PRECISION :: FxCutOff = 0.99999942669686d0
|
|
C DOUBLE PRECISION :: CFxCutOff = 5.733031438470704d-7 ! 1-FxCutOff,
|
|
|
|
END MODULE EPSMOD
|
|
|
|
MODULE RINTMOD
|
|
DOUBLE PRECISION, save :: C = 4.5d0
|
|
DOUBLE PRECISION, save :: FC = 0.999993204653751d0
|
|
C COMMON /RINT/ C,FC
|
|
END MODULE RINTMOD
|
|
|
|
MODULE TBRMOD
|
|
USE SIZEMOD
|
|
IMPLICIT NONE
|
|
DOUBLE PRECISION, DIMENSION(NMAX) :: HH
|
|
END MODULE TBRMOD
|
|
|
|
MODULE EXPACCMOD
|
|
DOUBLE PRECISION,PARAMETER:: PMAX = 40.0d0
|
|
C COMMON /EXPACC/ PMAX
|
|
END MODULE EXPACCMOD
|
|
|
|
MODULE INFCMOD
|
|
IMPLICIT NONE
|
|
INTEGER, save :: ISQ = 0, IAC=1
|
|
INTEGER, DIMENSION(10) :: INF,INFO
|
|
C DOUBLE PRECISION, DIMENSION(10)::
|
|
C COMMON /INFC/ ISQ,INF,INFO
|
|
END MODULE INFCMOD
|
|
MODULE CHECKMOD
|
|
IMPLICIT NONE
|
|
C III01,III11,... - variables,counts how many times one calls
|
|
C subroutine RIND0,RIND1,..., III*1 are also modified in the
|
|
C subroutines RIND*. This gives us statistics over the complexity of
|
|
C numerical calculations.
|
|
INTEGER :: III01,III11,III21,III31,III41,III51
|
|
INTEGER :: III61,III71,III81,III91,III101
|
|
INTEGER :: III0
|
|
END MODULE CHECKMOD
|
|
|
|
|
|
MODULE QUADRMOD
|
|
IMPLICIT NONE ! Quadratures available: Legendre
|
|
INTEGER :: I
|
|
|
|
C BLOCK DATA inithermite
|
|
|
|
INTEGER, PARAMETER :: NNW = 13
|
|
INTEGER, DIMENSION(25) :: NN
|
|
REAL*8 Z(126),H(126)
|
|
|
|
|
|
C COMMON /QUADR/ Z,H,NN,NNW
|
|
c COMMON /EXPACC/ PMAX
|
|
C COMMON /RINT/ C,FC
|
|
|
|
C DATA NNW /13/
|
|
DATA (NN(I),I=1,NNW)/2,3,4,5,6,7,8,9,10,12,16,20,24/
|
|
C DATA PMAX/40./
|
|
C DATA C/4.5/
|
|
DATA (H(I),I=1,61)/1.0d0,1.0d0,0.555555555555556d0,
|
|
* 0.888888888888889d0,
|
|
* 0.555555555555556d0,0.347854845137454d0,0.652145154862546d0,
|
|
* 0.652145154862546d0,0.347854845137454d0,0.236926885056189d0,
|
|
* 0.478628670499366d0,0.568888888888889d0,0.478628670499366d0,
|
|
* 0.236926885056189d0,0.171324492379170d0,0.360761573048139d0,
|
|
* 0.467913934572691d0,0.467913934572691d0,0.360761573048139d0,
|
|
* 0.171324492379170d0,0.129484966168870d0,0.279705391489277d0,
|
|
* 0.381830050505119d0,0.417959183673469d0,0.381830050505119d0,
|
|
* 0.279705391489277d0,0.129484966168870d0,0.101228536290376d0,
|
|
* 0.222381034453374d0,0.313706645877887d0,0.362683783378362d0,
|
|
* 0.362683783378362d0,0.313706645877887d0,0.222381034453374d0,
|
|
* 0.101228536290376d0,0.081274388361574d0,0.180648160694857d0,
|
|
* 0.260610696402935d0,0.312347077040003d0,0.330239355001260d0,
|
|
* 0.312347077040003d0,0.260610696402935d0,0.180648160694857d0,
|
|
* 0.081274388361574d0,0.066671344308688d0,0.149451349150581d0,
|
|
* 0.219086362515982d0,0.269266719309996d0,0.295524224714753d0,
|
|
* 0.295524224714753d0,0.269266719309996d0,0.219086362515982d0,
|
|
* 0.149451349150581d0,0.066671344308688d0,0.047175336386512d0,
|
|
* 0.106939325995318d0,0.160078328543346d0,0.203167426723066d0,
|
|
* 0.233492536538355d0,0.249147048513403d0,0.249147048513403d0/
|
|
DATA (H(I),I=62,101)/0.233492536538355d0,0.203167426723066d0,
|
|
* 0.160078328543346d0,0.106939325995318d0,
|
|
* 0.047175336386512d0,0.027152459411754094852d0,
|
|
* 0.062253523938647892863d0,0.095158511682492784810d0,
|
|
* 0.124628971255533872052d0,0.149595988816576732081d0,
|
|
* 0.169156519395002538189d0,0.182603415044923588867d0,
|
|
* 0.189450610455068496285d0,0.189450610455068496285d0,
|
|
* 0.182603415044923588867d0,0.169156519395002538189d0,
|
|
* 0.149595988816576732081d0,0.124628971255533872052d0,
|
|
* 0.095158511682492784810d0,0.062253523938647892863d0,
|
|
* 0.027152459411754094852d0,0.017614007139152118312d0,
|
|
* 0.040601429800386941331d0,0.062672048334109063570d0,
|
|
* 0.083276741576704748725d0,0.101930119817240435037d0,
|
|
* 0.118194531961518417312d0,0.131688638449176626898d0,
|
|
* 0.142096109318382051329d0,0.149172986472603746788d0,
|
|
* 0.152753387130725850698d0,0.152753387130725850698d0,
|
|
* 0.149172986472603746788d0,0.142096109318382051329d0,
|
|
* 0.131688638449176626898d0,0.118194531961518417312d0,
|
|
* 0.101930119817240435037d0,0.083276741576704748725d0,
|
|
* 0.062672048334109063570d0,0.040601429800386941331d0/
|
|
DATA (H(I),I=102,126)/0.017614007139152118312d0,
|
|
* 0.012341229799987199547d0, 0.028531388628933663181d0,
|
|
* 0.044277438817419806169d0, 0.059298584915436780746d0,
|
|
* 0.073346481411080305734d0, 0.086190161531953275917d0,
|
|
* 0.097618652104113888270d0, 0.107444270115965634783d0,
|
|
* 0.115505668053725601353d0, 0.121670472927803391204d0,
|
|
* 0.125837456346828296121d0, 0.127938195346752156974d0,
|
|
* 0.127938195346752156974d0, 0.125837456346828296121d0,
|
|
* 0.121670472927803391204d0, 0.115505668053725601353d0,
|
|
* 0.107444270115965634783d0, 0.097618652104113888270d0,
|
|
* 0.086190161531953275917d0, 0.073346481411080305734d0,
|
|
* 0.059298584915436780746d0, 0.044277438817419806169d0,
|
|
* 0.028531388628933663181d0, 0.012341229799987199547d0/
|
|
|
|
DATA (Z(I),I=1,58)/-0.577350269189626d0,0.577350269189626d0,
|
|
* -0.774596669241483d0,0.0d0,
|
|
* 0.774596669241483d0, -0.861136311594053d0, -0.339981043584856d0,
|
|
* 0.339981043584856d0, 0.861136311594053d0, -0.906179845938664d0,
|
|
* -0.538469310105683d0,0.0d0,
|
|
* 0.538469310105683d0, 0.906179845938664d0, -0.932469514203152d0,
|
|
* -0.661209386466265d0, -0.238619186083197d0, 0.238619186083197d0,
|
|
* 0.661209386466265d0, 0.932469514203152d0, -0.949107912342759d0,
|
|
* -0.741531185599394d0, -0.405845151377397d0, 0.0d0,
|
|
* 0.405845151377397d0, 0.741531185599394d0, 0.949107912342759d0,
|
|
* -0.960289856497536d0, -0.796666477413627d0, -0.525532409916329d0,
|
|
* -0.183434642495650d0, 0.183434642495650d0, 0.525532409916329d0,
|
|
* 0.796666477413627d0, 0.960289856497536d0, -0.968160239507626d0,
|
|
* -0.836031107326636d0, -0.613371432700590d0, -0.324253423403809d0,
|
|
* 0.0d0,
|
|
* 0.324253423403809d0, 0.613371432700590d0, 0.836031107326636d0,
|
|
* 0.968160239507626d0, -0.973906528517172d0, -0.865063366688985d0,
|
|
* -0.679409568299024d0, -0.433395394129247d0, -0.148874338981631d0,
|
|
* 0.148874338981631d0, 0.433395394129247d0, 0.679409568299024d0,
|
|
* 0.865063366688985d0, 0.973906528517172d0, -0.981560634246719d0,
|
|
* -0.904117256370475d0, -0.769902674194305d0, -0.587317954286617d0/
|
|
DATA (Z(I),I=59,99)/-0.367831498198180d0, -0.125233408511469d0,
|
|
* 0.125233408511469d0, 0.367831498198180d0,
|
|
* 0.587317954286617d0, 0.769902674194305d0,
|
|
* 0.904117256370475d0, 0.981560634246719d0,
|
|
* -0.989400934991649932596d0,
|
|
* -0.944575023073232576078d0, -0.865631202387831743880d0,
|
|
* -0.755404408355003033895d0, -0.617876244402643748447d0,
|
|
* -0.458016777657227386342d0, -0.281603550779258913230d0,
|
|
* -0.095012509837637440185d0, 0.095012509837637440185d0,
|
|
* 0.281603550779258913230d0, 0.458016777657227386342d0,
|
|
* 0.617876244402643748447d0, 0.755404408355003033895d0,
|
|
* 0.865631202387831743880d0, 0.944575023073232576078d0,
|
|
* 0.989400934991649932596d0, -0.993128599185094924786d0,
|
|
* -0.963971927277913791268d0, -0.912234428251325905868d0,
|
|
* -0.839116971822218823395d0, -0.746331906460150792614d0,
|
|
* -0.636053680726515025453d0, -0.510867001950827098004d0,
|
|
* -0.373706088715419560673d0, -0.227785851141645078080d0,
|
|
* -0.076526521133497333755d0, 0.076526521133497333755d0,
|
|
* 0.227785851141645078080d0, 0.373706088715419560673d0,
|
|
* 0.510867001950827098004d0, 0.636053680726515025453d0,
|
|
* 0.746331906460150792614d0, 0.839116971822218823395d0/
|
|
DATA (Z(I),I=100,126)/0.912234428251325905868d0,
|
|
* 0.963971927277913791268d0, 0.993128599185094924786d0,
|
|
* -0.995187219997021360180d0, -0.974728555971309498198d0,
|
|
* -0.938274552002732758524d0, -0.886415527004401034213d0,
|
|
* -0.820001985973902921954d0, -0.740124191578554364244d0,
|
|
* -0.648093651936975569252d0, -0.545421471388839535658d0,
|
|
* -0.433793507626045138487d0, -0.315042679696163374387d0,
|
|
* -0.191118867473616309159d0, -0.064056892862605626085d0,
|
|
* 0.064056892862605626085d0, 0.191118867473616309159d0,
|
|
* 0.315042679696163374387d0, 0.433793507626045138487d0,
|
|
* 0.545421471388839535658d0, 0.648093651936975569252d0,
|
|
* 0.740124191578554364244d0, 0.820001985973902921954d0,
|
|
* 0.886415527004401034213d0, 0.938274552002732758524d0,
|
|
* 0.974728555971309498198d0, 0.995187219997021360180d0/
|
|
END MODULE QUADRMOD
|
|
|
|
|
|
C
|
|
MODULE MREGMOD
|
|
IMPLICIT NONE
|
|
PRIVATE
|
|
PUBLIC :: RIND, MREG, FI
|
|
|
|
INTERFACE RIND
|
|
MODULE PROCEDURE RIND
|
|
END INTERFACE
|
|
|
|
INTERFACE MREG
|
|
MODULE PROCEDURE MREG
|
|
END INTERFACE
|
|
|
|
INTERFACE FI
|
|
MODULE PROCEDURE FI
|
|
END INTERFACE
|
|
|
|
INTERFACE C1_C2
|
|
MODULE PROCEDURE C1_C2
|
|
END INTERFACE
|
|
|
|
INTERFACE GAUSS1
|
|
MODULE PROCEDURE GAUSS1
|
|
END INTERFACE
|
|
|
|
INTERFACE GAUSINT
|
|
MODULE PROCEDURE GAUSINT
|
|
END INTERFACE
|
|
|
|
INTERFACE PYTHAG
|
|
MODULE PROCEDURE PYTHAG
|
|
END INTERFACE
|
|
|
|
|
|
CONTAINS
|
|
|
|
|
|
SUBROUTINE RIND(XIND,R,BU,DBUN,DB,SQ,VDER,NIT,N,INFR)
|
|
USE TBRMOD
|
|
USE INFCMOD
|
|
USE CHECKMOD
|
|
USE EPSMOD
|
|
USE SIZEMOD
|
|
IMPLICIT NONE
|
|
REAL*8, intent(inout) :: XIND,DBUN,VDER
|
|
REAL*8, DIMENSION(RDIM), intent(inout) :: R
|
|
REAL*8, DIMENSION(NMAX), intent(inout) :: BU,DB, SQ
|
|
INTEGER, intent(in) :: NIT,N,INFR
|
|
REAL*8 SDER
|
|
INTEGER, save :: NNIT
|
|
INTEGER I,III
|
|
C DIMENSION R(1),BU(1),SQ(1),DB(1)
|
|
C DIMENSION INF(10),INFO(10),HH(101)
|
|
C COMMON /TBR/ HH
|
|
C COMMON /INFC/ ISQ,INF,INFO
|
|
C COMMON /CHECK1/ III01,III11,III21,III31,III41,III51
|
|
C *,III61,III71,III81,III91,III101
|
|
C COMMON /EPS/ EPS,EPSS,CEPSS
|
|
C
|
|
C III01,III11,... - variables,counts how many times one calls
|
|
C subroutine RIND0,RIND1,..., III*1 are also modified in the
|
|
C subroutines RIND*. This gives us statistics over the complexity of
|
|
C numerical calculations.
|
|
C
|
|
XIND=0.0d0
|
|
IF (N.lt.1) go to 99
|
|
|
|
IF (INFR.EQ.0) THEN
|
|
NNIT=MIN(NIT,N)
|
|
if (NNIT.gt.10) NNIT=10
|
|
DO I=1,10
|
|
INF(I)=0
|
|
INFO(I)=0
|
|
enddo
|
|
III=0
|
|
DO I=1,N
|
|
IF (SQ(I).GT.EPS) then
|
|
III=1
|
|
else
|
|
IF(BU(I).GT.0.0d0) THEN
|
|
RETURN
|
|
END IF
|
|
IF(BU(I).LT.HH(I)) THEN
|
|
RETURN
|
|
END IF
|
|
END IF
|
|
enddo
|
|
END IF
|
|
IF (III.eq.0) go to 99
|
|
|
|
! GO TO (10,20,30,40,50,60,70,80,90,100) NNIT
|
|
SELECT CASE (NNIT)
|
|
CASE (1)
|
|
CALL RIND1(XIND,R,BU,DBUN,DB,SQ,VDER,N)
|
|
iii11=iii11+1
|
|
CASE(2)
|
|
CALL RIND2(XIND,R,BU,DBUN,DB,SQ,VDER,N)
|
|
iii21=iii21+1
|
|
CASE(3)
|
|
CALL RIND3(XIND,R,BU,DBUN,DB,SQ,VDER,N)
|
|
iii31=iii31+1
|
|
CASE(4)
|
|
CALL RIND4(XIND,R,BU,DBUN,DB,SQ,VDER,N)
|
|
iii41=iii41+1
|
|
CASE(5)
|
|
CALL RIND5(XIND,R,BU,DBUN,DB,SQ,VDER,N)
|
|
iii51=iii51+1
|
|
CASE(6)
|
|
CALL RIND6(XIND,R,BU,DBUN,DB,SQ,VDER,N)
|
|
iii61=iii61+1
|
|
CASE(7)
|
|
CALL RIND7(XIND,R,BU,DBUN,DB,SQ,VDER,N)
|
|
iii71=iii71+1
|
|
CASE(8)
|
|
CALL RIND8(XIND,R,BU,DBUN,DB,SQ,VDER,N)
|
|
iii81=iii81+1
|
|
CASE (9)
|
|
CALL RIND9(XIND,R,BU,DBUN,DB,SQ,VDER,N)
|
|
iii91=iii91+1
|
|
CASE (10)
|
|
CALL RIND10(XIND,R,BU,DBUN,DB,SQ,VDER,N)
|
|
iii101=iii101+1
|
|
CASE DEFAULT
|
|
CALL RIND0(XIND,BU,DBUN,VDER,N)
|
|
iii01=iii01+1
|
|
END SELECT
|
|
RETURN
|
|
|
|
99 continue
|
|
SDER=0.0d0
|
|
IF(VDER.GT.EPS) SDER=SQRT(VDER)
|
|
XIND=PMEAN(DBUN,SDER)
|
|
return
|
|
END SUBROUTINE RIND
|
|
|
|
SUBROUTINE RIND0(XIND,BU,DBUN,VDER,N)
|
|
USE TBRMOD
|
|
USE EPSMOD
|
|
USE SIZEMOD
|
|
IMPLICIT NONE
|
|
INTEGER, intent(in) :: N
|
|
REAL*8, intent(inout) :: XIND,DBUN,VDER
|
|
REAL*8, DIMENSION(NMAX), intent(inout) :: BU
|
|
REAL*8 SDER
|
|
INTEGER I
|
|
! DIMENSION BU(NMAX)
|
|
C DIMENSION HH(101)
|
|
C COMMON /EPS/ EPS,EPSS,CEPSS
|
|
C COMMON /TBR/ HH
|
|
|
|
IF (N.LT.1) GO TO 20
|
|
XIND=0.0d0
|
|
IF(DBUN.LT.0.0d0) THEN
|
|
RETURN
|
|
END IF
|
|
DO I=1,N
|
|
IF(BU(I).GT.0.0d0) THEN
|
|
RETURN
|
|
END IF
|
|
IF(BU(I).LT.HH(I)) THEN
|
|
RETURN
|
|
END IF
|
|
enddo
|
|
20 CONTINUE
|
|
SDER=0.0d0
|
|
IF(VDER.GT.EPS) SDER=SQRT(VDER)
|
|
XIND=PMEAN(DBUN,SDER)
|
|
RETURN
|
|
END SUBROUTINE RIND0
|
|
|
|
SUBROUTINE RIND1(XIND,R,BU,DBUN,DB,SQ,VDER,N)
|
|
USE SIZEMOD
|
|
USE TBRMOD
|
|
USE INFCMOD
|
|
USE CHECKMOD
|
|
USE EPSMOD
|
|
USE RINTMOD
|
|
IMPLICIT NONE
|
|
REAL*8, intent(inout) :: XIND,DBUN,VDER
|
|
REAL*8, DIMENSION(RDIM), intent(inout) :: R
|
|
REAL*8, DIMENSION(NMAX), intent(inout) :: BU,DB,SQ
|
|
INTEGER, intent(in) :: N
|
|
REAL*8, DIMENSION(NMAX), save :: B1,SQ1
|
|
REAL*8, DIMENSION(24) :: XX1, H1
|
|
REAL*8 XMI,XMA,DER,SDER
|
|
REAL*8, save :: DB1N,SDER1,VDER1, SS0
|
|
REAL*8 XFF,XF,X,XH, SQ0, HHB
|
|
INTEGER I,III,J,II0,N1
|
|
! INTEGER IAC,N
|
|
! real*8 XIND,R,BU,DBUN,DB,SQ,VDER
|
|
! REAL*8 XX1,H1, B1,SQ1,XMI,XMA, SDER,DB1N , DER, SDER1
|
|
! REAL*8 XFF,X, XH, SQ0, HHB, SS0, VDER1, XF
|
|
! INTEGER I,J,III,II0,N1
|
|
C DIMENSION R(1),BU(1),SQ(1),DB(1),B1(NMAX),SQ1(NMAX)
|
|
! DIMENSION R(RDIM),BU(NMAX),SQ(NMAX),DB(NMAX) ,B1(NMAX),SQ1(NMAX)
|
|
! DIMENSION XX1(24),H1(24)
|
|
C DIMENSION HH(101),INF(10),INFO(10)
|
|
|
|
C COMMON /EPS/ EPS,EPSS,CEPSS
|
|
C COMMON /RINT/ C,FC
|
|
C COMMON /TBR/ HH
|
|
C COMMON /INFC/ ISQ,INF,INFO
|
|
C COMMON /CHECK1/ III01,III11,III21,III31,III41,III51
|
|
C *,III61,III71,III81,III91,III101
|
|
|
|
c print *,'Topp of R1:',sq(1),sq(2),sq(3)
|
|
XIND=0.0d0
|
|
|
|
C Choice of the time for conditioning, two methods
|
|
C
|
|
C ISQ=1; INF(1)=II0 is the point where the SQ(I) obtaines its maximum, SQ0
|
|
C is the maximal st. deviation of the residual.
|
|
C
|
|
C ISQ=0; INF(1) is the time point when the probability P(hh<BU(I)+Delta(I)<0)
|
|
C obtains its minimum which is denoted by XFF.
|
|
C
|
|
XFF=1.0d0
|
|
IF (N.LT.1) GO TO 11
|
|
C
|
|
C If N<1 means empty grid we can not condition on any point and hence GO TO 11
|
|
C then XFF=1.0d0 and the XIND will be approximated by E[Y^+]=PMEAN(DBUN,SDER).
|
|
C Obs. E[Y]=DBUN and Var(Y)=VDER.
|
|
C
|
|
SQ0=0.0d0
|
|
DO I=1,N
|
|
SQ1(i)=0.0d0
|
|
IF (SQ(I).LE.eps) GO TO 1
|
|
HHB=HH(I)-BU(I)
|
|
C
|
|
C Obs. SQ(I)<=EPS idicates that the point is not good for conditioning.
|
|
C There can be two reasons for it: 1 Variance of the residual is too small
|
|
C or the point was already used before.
|
|
C
|
|
if (ISQ.GT.1) then
|
|
SS0 =R(I+(I-1)*N)
|
|
DB1N =DB(I)
|
|
VDER1=DB1N*DB1N/SS0
|
|
IF (VDER1.gt.SQ0) Then
|
|
SQ0=VDER1
|
|
II0=I
|
|
END IF
|
|
ELSE
|
|
IF (SQ(I).GT.SQ0) THEN
|
|
SQ0=SQ(I)
|
|
II0=I
|
|
END IF
|
|
END IF
|
|
|
|
X=-BU(I)/SQ(I)
|
|
XH=HHB/SQ(I)
|
|
XF=FI(X)-FI(XH)
|
|
IF(XF.LT.XFF) THEN
|
|
INF(1)=I
|
|
XFF=XF
|
|
END IF
|
|
1 CONTINUE
|
|
enddo
|
|
11 CONTINUE
|
|
C
|
|
C If the minimum probability XFF is close to 0 !!! then the indicator 1{}
|
|
C can be bounded by EPSS leading to the approximation of XIND=0 and RETURN.
|
|
C
|
|
IF(XFF.LT.EPSS) RETURN
|
|
C
|
|
C We are stoping because we assume that for all sample pathes I(0,t)=1
|
|
C
|
|
C If the minimum probability XFF is close to one then the indicator 1{}
|
|
C can be bounded by 1 leading to the approximation of XIND by E[Y^+]=
|
|
C PMEAN(DBUN,SDER), if IAC=1 or with E[Y]^+=MAX(0,DBUN).
|
|
C This reduces the order of integrations.
|
|
C
|
|
IF (XFF.GT.0.999d0*FC) THEN
|
|
SDER=0.
|
|
IF(VDER.GT.EPS) SDER=SQRT(VDER)
|
|
XIND=MAX(DBUN,0.0d0)
|
|
IF(IAC.LT.1) RETURN
|
|
XIND=PMEAN(DBUN,SDER)
|
|
RETURN
|
|
END IF
|
|
C
|
|
C We are conditioning on the point T(INF(1)). If ISQ=1 INF(1)=ii0.
|
|
C Obviously, X(INF(1))=BU(INF(1))+Delta(INF(1)), where SQ0 is a standard
|
|
C deviation of Delta(IN(1)), hence if X(INF(1))>XMA or X(INF(1))<XM1
|
|
C 1{}=0. Hence the values of X(INF(1)) are truncated to the interval [xmi,xma].
|
|
|
|
IF(ISQ.EQ.1) INF(1)=II0
|
|
SQ0=SQ(INF(1))
|
|
XMA=-BU(INF(1))/SQ0
|
|
XMI=XMA+HH(INF(1))/SQ0
|
|
XMI=MAX(-C,XMI)
|
|
XMA=MIN(C,XMA)
|
|
IF (XMI.GT.XMA) XMA=-C
|
|
C
|
|
C Now we are checking whether INF(I)=INFO(I), I=1,..,5, what indicates
|
|
C that all conditional covariances and variancec are unchanged since the
|
|
C last call of this subroutine (R,SQ,DB) as well as
|
|
C
|
|
III=0
|
|
DO I=1,10
|
|
III=III + ABS(INF(I)-INFO(I))
|
|
enddo
|
|
IF (III.EQ.0) GO TO 99
|
|
DO I=1,N
|
|
B1(I) = R(I+(INF(1)-1)*N)
|
|
enddo
|
|
SS0 = B1(INF(1))
|
|
DB1N = DB(INF(1))
|
|
INFO(1) = INF(1)
|
|
VDER1 = VDER-DB1N*DB1N/SS0
|
|
SDER1 = 0.0d0
|
|
IF(VDER1.GT.EPS) SDER1=SQRT(VDER1)
|
|
DB1N = DB1N/SQ0
|
|
DO I=1,N
|
|
B1(I) = B1(I)/SQ0
|
|
enddo
|
|
99 CONTINUE
|
|
C
|
|
C Here conditioning is done
|
|
C
|
|
CALL C1_C2(XMI,XMA,BU,B1,DBUN,DB1N,0.0d0,SQ1,N)
|
|
IF(FI(XMA)-FI(XMI).LT.EPSS) RETURN
|
|
C *******************************************************
|
|
C
|
|
C In this special case RIND1 if IAC=0 one can explicitly compute XIND
|
|
C and stop.
|
|
IF (IAC.LT.1) THEN
|
|
XIND=GAUSINT(XMI,XMA,DBUN,DB1N,1.0d0,0.0d0)
|
|
RETURN
|
|
END IF
|
|
CALL GAUSS1(N1,H1,XX1,XMI,XMA,EPS0)
|
|
c print *,XMI,XMA,EPS0,N1
|
|
c write(11,*) XMI,XMA,EPS0,N1
|
|
XIND=0.0d0
|
|
DO J=1,N1
|
|
DER=DBUN+XX1(J)*DB1N
|
|
XIND=XIND+PMEAN(DER,SDER1)*H1(J)
|
|
III01=III01+1
|
|
c IF (N.eq.15) then
|
|
c print *,'der,dbun,db1n,sder1',der,dbun,db1n,sder1
|
|
c write(11,*) der,dbun,db1n,sder1
|
|
c end if
|
|
10 CONTINUE
|
|
enddo
|
|
c IF (N.eq.15) then
|
|
c do 999 iii=1,N
|
|
c print *,iii,sq(Iii)
|
|
c999 continue
|
|
c write(11,*) XIND,INF(1),INF(2),INF(3),inf(4)
|
|
c pause
|
|
c end if
|
|
RETURN
|
|
END SUBROUTINE RIND1
|
|
|
|
SUBROUTINE RIND2(XIND,R,BU,DBUN,DB,SQ,VDER,N)
|
|
USE SIZEMOD
|
|
USE TBRMOD
|
|
USE INFCMOD
|
|
USE CHECKMOD
|
|
USE EPSMOD
|
|
USE RINTMOD
|
|
IMPLICIT NONE
|
|
REAL*8, intent(inout) :: XIND,DBUN,VDER
|
|
REAL*8, DIMENSION(RDIM), intent(inout) :: R
|
|
REAL*8, DIMENSION(NMAX), intent(inout) :: BU,DB,SQ
|
|
INTEGER, intent(in) :: N
|
|
REAL*8, DIMENSION(RDIM), save :: R1
|
|
REAL*8, DIMENSION(NMAX), save :: BU1,DB1,B1,SQ1
|
|
REAL*8, DIMENSION(24) :: XX1, H1
|
|
REAL*8, save :: DB1N,SDER1,VDER1, SS0
|
|
REAL*8 XMI,XMA,DER,SDER
|
|
REAL*8 XIND1,XFF,XF,X,XH, XR1, SQ0
|
|
INTEGER I,III,J,II0,N1
|
|
|
|
! INTEGER IAC,N
|
|
! INTEGER I,J, II0,III, N1
|
|
! REAL*8 XIND,R,BU,DBUN,DB,SQ,VDER
|
|
! real*8 XX1,H1,R1,B1,DB1,BU1,SQ1
|
|
! REAL*8 SS0, DB1N, VDER1, XR1
|
|
! REAL*8 XFF,X, XH, SQ0, SDER, XF, XMI, XMA
|
|
! REAL*8 SDER1, DER,XIND1
|
|
C DIMENSION R(1),BU(1),SQ(1),DB(1)
|
|
! DIMENSION R(RDIM),BU(NMAX),SQ(NMAX),DB(NMAX)
|
|
! DIMENSION R1(RDIM),B1(NMAX),DB1(NMAX),BU1(NMAX),SQ1(NMAX)
|
|
! DIMENSION XX1(24),H1(24)
|
|
C DIMENSION HH(101),INF(10),INFO(10)
|
|
|
|
C COMMON /EPS/ EPS,EPSS,CEPSS
|
|
C COMMON /RINT/ C,FC
|
|
C COMMON /TBR/ HH
|
|
C COMMON /INFC/ ISQ,INF,INFO
|
|
c COMMON/CHECK/III0,III1,III2,III3,III4
|
|
C COMMON /CHECK1/ III01,III11,III21,III31,III41,III51
|
|
C *,III61,III71,III81,III91,III101
|
|
|
|
c PRINT *,'Topp of 2:',sq(1),sq(2),sq(3)
|
|
XIND=0.0d0
|
|
XFF=1.0d0
|
|
IF (N.LT.1) GO TO 11
|
|
SQ0=0.0d0
|
|
DO I=1,N
|
|
IF (SQ(I).LE.EPS) THEN
|
|
SQ1(I)=SQ(I)
|
|
GO TO 1
|
|
END IF
|
|
c CSQ=C*SQ(I)
|
|
c IF (BU(I).LT.-CSQ.AND.BU(I).GT.HH(I)+CSQ) GO TO 1
|
|
c IF (BU(I).LT.-CSQ.AND.BU(I).GT.HH(I)+CSQ) SQ1(I)=EPS1
|
|
C IF (BU(I).GT. CSQ.OR.BU(I).LT.HH(I)-CSQ) RETURN
|
|
IF (SQ(I).GT.SQ0) THEN
|
|
SQ0=SQ(I)
|
|
II0=I
|
|
END IF
|
|
X=-BU(I)/SQ(I)
|
|
XH=X+HH(I)/SQ(I)
|
|
XF=FI(X)-FI(XH)
|
|
c IF(XF.GT.CEPSS) SQ1(I)=EPS1
|
|
IF (XF.LT.XFF) THEN
|
|
INF(2)=I
|
|
XFF=XF
|
|
END IF
|
|
1 CONTINUE
|
|
ENDDO
|
|
11 CONTINUE
|
|
IF(XFF.LT.EPSS) RETURN
|
|
IF (XFF.GT.0.9999d0*FC) THEN
|
|
SDER=0.0d0
|
|
IF (VDER.GT.EPS) SDER=SQRT(VDER)
|
|
XIND=MAX(DBUN,0.0d0)
|
|
IF(IAC.LT.1) RETURN
|
|
XIND=PMEAN(DBUN,SDER)
|
|
RETURN
|
|
END IF
|
|
IF(ISQ.EQ.1) INF(2)=II0
|
|
SQ0=SQ(INF(2))
|
|
XMA=-BU(INF(2))/SQ0
|
|
XMI=XMA+HH(INF(2))/SQ0
|
|
XMI=MAX(-C,XMI)
|
|
XMA=MIN(C,XMA)
|
|
IF (XMI.GT.XMA) XMA=-C
|
|
C *************************************************
|
|
C
|
|
C We are conditioning on the point T(INF(2)) and write new model
|
|
C BU(I)+X*B1(I)+Delta1(I), I=1,...,N (Obs. we do not use I=1,N)
|
|
C SQ1(I) is standard deviation of Delta1 DBUN=BU'(N), DB1N=B1'(N) and X is
|
|
C N(0,1) independent of Delta1, SDER1 is standard deviation of Delta1'(N).
|
|
C
|
|
III=0
|
|
DO I=2,10
|
|
III=III + ABS(INF(I)-INFO(I))
|
|
ENDDO
|
|
IF (III.EQ.0) GO TO 99
|
|
CALL M_COND(R1,B1,DB1,R,DB,INF(2),N)
|
|
C III1=III1+1
|
|
SS0=B1(INF(2))
|
|
INFO(2)=INF(2)
|
|
DB1N=DB(INF(2))
|
|
VDER1=VDER-DB1N*DB1N/SS0
|
|
SDER1=0.0d0
|
|
IF (VDER1.GT.EPS) SDER1=SQRT(VDER1)
|
|
C SQ0=SQRT(SS0)
|
|
DB1N=DB1N/SQ0
|
|
SQ1(INF(2))=0.0d0
|
|
DO I=1,N
|
|
C
|
|
C IF (SQ1(I).EQ.EPS1) GO TO 3 - the .EQ. can not be raplaced with .LT. without
|
|
C some general changes in the strategy of SQ and SQ1 values. More exactly
|
|
C SQ can not be changed in this subroutine when for some I we would like to
|
|
C put SQ1(I)=EPS1 in the first loop. This SQ1 should not be changed here and
|
|
C thus we have GO TO 3 statement. Observe that the other SQ1 values are
|
|
C
|
|
IF (SQ(I).LE.EPS) GO TO 3
|
|
C IF (SQ1(I).EQ.EPS1.OR.SQ(I).LE.EPS1) GO TO 3
|
|
XR1=R1(I+(I-1)*N)
|
|
c IF(XR1.LT.0.0d0) CALL ERROR(I,N,-1)
|
|
SQ1(I)=0.0d0
|
|
IF (XR1.GT.EPS) SQ1(I)=SQRT(XR1)
|
|
3 CONTINUE
|
|
ENDDO
|
|
DO I=1,N
|
|
5 B1(I)=B1(I)/SQ0
|
|
ENDDO
|
|
99 CONTINUE
|
|
C
|
|
C ***********************************************************
|
|
C
|
|
C We shall condition on the values of X, XMI<X<XMA, but for some
|
|
C X values XIND will be zero leading to reduced accuracy. Hence we try
|
|
C to exclude them and narrow the interval [XMI,XMA]
|
|
C
|
|
c PRINT *,'2:** ',XMI,XMA
|
|
CALL C1_C2(XMI,XMA,BU,B1,DBUN,DB1N,SDER1,SQ1,N)
|
|
c PRINT *,'2:****',XMI,XMA
|
|
IF(FI(XMA)-FI(XMI).LT.EPSS) THEN
|
|
c print *, 'Leaving R2: Exit 4', XIND,XIND1,VDER1
|
|
RETURN
|
|
ENDIF
|
|
CALL GAUSS1(N1,H1,XX1,XMI,XMA,EPS0)
|
|
DO J=1,N1
|
|
DO I=1,N
|
|
20 BU1(I)=BU(I)+XX1(J)*B1(I)
|
|
ENDDO
|
|
DER=DBUN+XX1(J)*DB1N
|
|
c print *,'R2: before calling R1: (SQ1):',sq1(1),sq1(2),sq1(3)
|
|
CALL RIND1(XIND1,R1,BU1,DER,DB1,SQ1,VDER1,N)
|
|
III11=III11+1
|
|
10 XIND=XIND+XIND1*H1(J)
|
|
ENDDO
|
|
c print *, 'Leaving R2: Exit 5', XIND,XIND1,VDER1
|
|
RETURN
|
|
END SUBROUTINE RIND2
|
|
|
|
SUBROUTINE RIND3(XIND,R,BU,DBUN,DB,SQ,VDER,N)
|
|
USE SIZEMOD
|
|
USE TBRMOD
|
|
USE INFCMOD
|
|
USE CHECKMOD
|
|
USE EPSMOD
|
|
USE RINTMOD
|
|
IMPLICIT NONE
|
|
REAL*8, intent(inout) :: XIND,DBUN,VDER
|
|
REAL*8, DIMENSION(RDIM), intent(inout) :: R
|
|
REAL*8, DIMENSION(NMAX), intent(inout) :: BU,DB,SQ
|
|
INTEGER, intent(in) :: N
|
|
REAL*8, DIMENSION(RDIM), save :: R1
|
|
REAL*8, DIMENSION(NMAX), save :: BU1,DB1,B1,SQ1
|
|
REAL*8, DIMENSION(24) :: XX1, H1
|
|
REAL*8, save :: DB1N,SDER1,VDER1, SS0
|
|
REAL*8 XMI,XMA,DER,SDER
|
|
REAL*8 XIND1,XFF,XF,X,XH, XR1, SQ0
|
|
INTEGER I,III,J,II0,N1
|
|
|
|
! INTEGER IAC,N
|
|
! INTEGER I,J, II0,III, N1
|
|
! REAL*8 XIND,R,BU,DBUN,DB,SQ,VDER
|
|
! real*8 XX1,H1
|
|
! REAL*8 R1,B1,DB1,BU1,SQ1
|
|
! REAL*8 XFF, SQ0, X, XH,XF, SDER, XMI,XMA
|
|
! REAL*8 SS0, DB1N, VDER1, XR1
|
|
! REAL*8 SDER1, DER,XIND1
|
|
C DIMENSION R(1),BU(1),SQ(1),DB(1)
|
|
! DIMENSION R(RDIM),BU(NMAX),SQ(NMAX),DB(NMAX)
|
|
! DIMENSION R1(RDIM),B1(NMAX),DB1(NMAX),BU1(NMAX),SQ1(NMAX)
|
|
! DIMENSION XX1(24),H1(24)
|
|
C DIMENSION HH(101),INF(10),INFO(10)
|
|
|
|
C COMMON /EPS/ EPS,EPSS,CEPSS
|
|
C COMMON /RINT/ C,FC
|
|
C COMMON /TBR/ HH
|
|
C COMMON /INFC/ ISQ,INF,INFO
|
|
C COMMON/CHECK/III0,III1,III2,III3,III4
|
|
C COMMON /CHECK1/ III01,III11,III21,III31,III41,III51
|
|
C *,III61,III71,III81,III91,III101
|
|
|
|
c PRINT *,'Topp of 3:',sq(1),sq(2),sq(3)
|
|
XIND=0.0d0
|
|
XFF=1.0d0
|
|
IF (N.LT.1) GO TO 11
|
|
SQ0=0.0d0
|
|
DO I=1,N
|
|
IF (SQ(I).LE.EPS) THEN
|
|
SQ1(I)=SQ(I)
|
|
GO TO 1
|
|
END IF
|
|
IF (SQ(I).GT.SQ0) THEN
|
|
SQ0=SQ(I)
|
|
II0=I
|
|
END IF
|
|
X=-BU(I)/SQ(I)
|
|
XH=X+HH(I)/SQ(I)
|
|
XF=FI(X)-FI(XH)
|
|
IF(XF.LT.XFF) THEN
|
|
INF(3)=I
|
|
XFF=XF
|
|
END IF
|
|
1 CONTINUE
|
|
ENDDO
|
|
11 CONTINUE
|
|
IF (XFF.LT.EPSS) RETURN
|
|
IF (XFF.GT.0.9999d0*FC) THEN
|
|
SDER=0.0d0
|
|
IF(VDER.GT.EPS) SDER=SQRT(VDER)
|
|
XIND=MAX(DBUN,0.0d0)
|
|
IF (IAC.LT.1) RETURN
|
|
XIND=PMEAN(DBUN,SDER)
|
|
RETURN
|
|
END IF
|
|
IF(ISQ.EQ.1) INF(3)=II0
|
|
SQ0=SQ(INF(3))
|
|
XMA=-BU(INF(3))/SQ0
|
|
XMI=XMA+HH(INF(3))/SQ0
|
|
XMI=MAX(-C,XMI)
|
|
XMA=MIN(C,XMA)
|
|
IF (XMI.GT.XMA) XMA=-C
|
|
III=0
|
|
DO I=3,10
|
|
III=III + ABS(INF(I)-INFO(I))
|
|
ENDDO
|
|
IF (III.EQ.0) GO TO 99
|
|
CALL M_COND(R1,B1,DB1,R,DB,INF(3),N)
|
|
SS0=B1(INF(3))
|
|
DB1N=DB(INF(3))
|
|
VDER1=VDER-DB1N*DB1N/SS0
|
|
SDER1=0.0d0
|
|
IF (VDER1.GT.EPS) SDER1=SQRT(VDER1)
|
|
INFO(3)=INF(3)
|
|
DB1N=DB1N/SQ0
|
|
SQ1(INF(3))=0.0d0
|
|
DO I=1,N
|
|
IF (SQ(I).LE.EPS) GO TO 3
|
|
XR1=R1(I+(I-1)*N)
|
|
SQ1(I)=0.0d0
|
|
IF (XR1.GT.EPS) SQ1(I)=SQRT(XR1)
|
|
3 CONTINUE
|
|
ENDDO
|
|
DO I=1,N
|
|
5 B1(I)=B1(I)/SQ0
|
|
ENDDO
|
|
99 CONTINUE
|
|
c PRINT *,'3:** ',XMI,XMA
|
|
CALL C1_C2(XMI,XMA,BU,B1,DBUN,DB1N,SDER1,SQ1,N)
|
|
c PRINT *,'3:****',XMI,XMA,EPSS
|
|
IF (FI(XMA)-FI(XMI).LT.EPSS) RETURN
|
|
CALL GAUSS1(N1,H1,XX1,XMI,XMA,EPS0)
|
|
DO J=1,N1
|
|
DO I=1,N
|
|
20 BU1(I)=BU(I)+XX1(J)*B1(I)
|
|
ENDDO
|
|
DER=DBUN+XX1(J)*DB1N
|
|
c print *,'R3: before calling R2: (SQ1):',sq1(1),sq1(2),sq1(3)
|
|
CALL RIND2(XIND1,R1,BU1,DER,DB1,SQ1,VDER1,N)
|
|
III21=III21+1
|
|
10 XIND=XIND+XIND1*H1(J)
|
|
ENDDO
|
|
RETURN
|
|
END SUBROUTINE RIND3
|
|
|
|
SUBROUTINE RIND4(XIND,R,BU,DBUN,DB,SQ,VDER,N)
|
|
USE SIZEMOD
|
|
USE TBRMOD
|
|
USE INFCMOD
|
|
USE CHECKMOD
|
|
USE EPSMOD
|
|
USE RINTMOD
|
|
IMPLICIT NONE
|
|
REAL*8, intent(inout) :: XIND,DBUN,VDER
|
|
REAL*8, DIMENSION(RDIM), intent(inout) :: R
|
|
REAL*8, DIMENSION(NMAX), intent(inout) :: BU,DB,SQ
|
|
INTEGER, intent(in) :: N
|
|
REAL*8, DIMENSION(RDIM), save :: R1
|
|
REAL*8, DIMENSION(NMAX), save :: BU1,DB1,B1,SQ1
|
|
REAL*8, DIMENSION(24) :: XX1, H1
|
|
REAL*8, save :: DB1N,SDER1,VDER1, SS0
|
|
REAL*8 XMI,XMA,DER,SDER
|
|
REAL*8 XIND1,XFF,XF,X,XH, XR1, SQ0
|
|
INTEGER I,III,J,II0,N1
|
|
|
|
! INTEGER IAC,N
|
|
! INTEGER I,J,II0,III, N1
|
|
! REAL*8 XIND,R,BU,DBUN,DB,SQ,VDER
|
|
! real*8 XX1,H1
|
|
! REAL*8 R1,B1,DB1,BU1,SQ1
|
|
! REAL*8 XFF, SQ0, X, XH,XF, SDER, XMI,XMA
|
|
! REAL*8 SS0, DB1N, VDER1, XR1
|
|
! REAL*8 SDER1, DER,XIND1
|
|
C DIMENSION R(1),BU(1),SQ(1),DB(1)
|
|
! DIMENSION R(RDIM),BU(NMAX),SQ(NMAX),DB(NMAX)
|
|
! DIMENSION R1(RDIM),B1(NMAX),DB1(NMAX),BU1(NMAX),SQ1(NMAX)
|
|
! DIMENSION XX1(24),H1(24)
|
|
C DIMENSION HH(101),INF(10),INFO(10)
|
|
|
|
C COMMON /EPS/ EPS,EPSS,CEPSS
|
|
C COMMON /RINT/ C,FC
|
|
C COMMON /TBR/ HH
|
|
C COMMON /INFC/ ISQ,INF,INFO
|
|
C COMMON/CHECK/III0,III1,III2,III3,III4
|
|
C COMMON /CHECK1/ III01,III11,III21,III31,III41,III51
|
|
C *,III61,III71,III81,III91,III101
|
|
|
|
c PRINT *,'Topp of 4:',SQ(1),SQ(2),SQ(3)
|
|
XIND=0.0d0
|
|
XFF=1.0d0
|
|
IF (N.LT.1) GO TO 11
|
|
SQ0=0.0d0
|
|
DO I=1,N
|
|
IF (SQ(I).LE.EPS) THEN
|
|
SQ1(I)=SQ(I)
|
|
GO TO 1
|
|
END IF
|
|
IF (SQ(I).GT.SQ0) THEN
|
|
SQ0=SQ(I)
|
|
II0=I
|
|
END IF
|
|
X=-BU(I)/SQ(I)
|
|
XH=X+HH(I)/SQ(I)
|
|
XF=FI(X)-FI(XH)
|
|
IF (XF.LT.XFF) THEN
|
|
INF(4)=I
|
|
XFF=XF
|
|
END IF
|
|
1 CONTINUE
|
|
ENDDO
|
|
11 CONTINUE
|
|
IF (XFF.LT.EPSS) RETURN
|
|
IF (XFF.GT.0.9999d0*FC) THEN
|
|
SDER=0.0d0
|
|
IF(VDER.GT.EPS) SDER=SQRT(VDER)
|
|
XIND=MAX(DBUN,0.0d0)
|
|
IF (IAC.LT.1) RETURN
|
|
XIND=PMEAN(DBUN,SDER)
|
|
RETURN
|
|
END IF
|
|
IF(ISQ.EQ.1) INF(4)=II0
|
|
SQ0=SQ(INF(4))
|
|
XMA=-BU(INF(4))/SQ0
|
|
XMI=XMA+HH(INF(4))/SQ0
|
|
XMI=MAX(-C,XMI)
|
|
XMA=MIN(C,XMA)
|
|
IF (XMI.GT.XMA) XMA=-C
|
|
III=0
|
|
DO I=4,10
|
|
III=III + ABS(INF(I)-INFO(I))
|
|
ENDDO
|
|
IF (III.EQ.0) GO TO 99
|
|
CALL M_COND(R1,B1,DB1,R,DB,INF(4),N)
|
|
SS0=B1(INF(4))
|
|
DB1N=DB(INF(4))
|
|
VDER1=VDER-DB1N*DB1N/SS0
|
|
SDER1=0.0d0
|
|
IF (VDER1.GT.EPS) SDER1=SQRT(VDER1)
|
|
INFO(4)=INF(4)
|
|
DB1N=DB1N/SQ0
|
|
SQ1(INF(4))=0.0d0
|
|
DO I=1,N
|
|
IF (SQ(I).LE.EPS) GO TO 3
|
|
XR1=R1(I+(I-1)*N)
|
|
SQ1(I)=0.0d0
|
|
IF (XR1.GT.EPS) SQ1(I)=SQRT(XR1)
|
|
3 CONTINUE
|
|
ENDDO
|
|
DO I=1,N
|
|
5 B1(I)=B1(I)/SQ0
|
|
ENDDO
|
|
99 CONTINUE
|
|
C PRINT *,'**',XMI,XMA
|
|
CALL C1_C2(XMI,XMA,BU,B1,DBUN,DB1N,SDER1,SQ1,N)
|
|
C PRINT *,INF(4),XMI,XMA
|
|
IF(FI(XMA)-FI(XMI).LT.EPSS) RETURN
|
|
CALL GAUSS1(N1,H1,XX1,XMI,XMA,EPS0)
|
|
DO J=1,N1
|
|
DO I=1,N
|
|
20 BU1(I)=BU(I)+XX1(J)*B1(I)
|
|
ENDDO
|
|
DER=DBUN+XX1(J)*DB1N
|
|
CALL RIND3(XIND1,R1,BU1,DER,DB1,SQ1,VDER1,N)
|
|
III31=III31+1
|
|
10 XIND=XIND+XIND1*H1(J)
|
|
ENDDO
|
|
RETURN
|
|
END SUBROUTINE RIND4
|
|
|
|
SUBROUTINE RIND5(XIND,R,BU,DBUN,DB,SQ,VDER,N)
|
|
USE SIZEMOD
|
|
USE TBRMOD
|
|
USE INFCMOD
|
|
USE CHECKMOD
|
|
USE EPSMOD
|
|
USE RINTMOD
|
|
IMPLICIT NONE
|
|
REAL*8, intent(inout) :: XIND,DBUN,VDER
|
|
REAL*8, DIMENSION(RDIM), intent(inout) :: R
|
|
REAL*8, DIMENSION(NMAX), intent(inout) :: BU,DB,SQ
|
|
INTEGER, intent(in) :: N
|
|
REAL*8, DIMENSION(RDIM), save :: R1
|
|
REAL*8, DIMENSION(NMAX), save :: BU1,DB1,B1,SQ1
|
|
REAL*8, DIMENSION(24) :: XX1, H1
|
|
REAL*8, save :: DB1N,SDER1,VDER1, SS0
|
|
REAL*8 XMI,XMA,DER,SDER
|
|
REAL*8 XIND1,XFF,XF,X,XH, XR1, SQ0
|
|
INTEGER I,III,J,II0,N1
|
|
|
|
! INTEGER IAC,N
|
|
! INTEGER I,J,III,II0,N1
|
|
! REAL*8 XIND,R,BU,DBUN,DB,SQ,VDER
|
|
! real*8 XX1,H1
|
|
! REAL*8 R1,B1,DB1,BU1,SQ1
|
|
! REAL*8 XFF, SQ0, X, XH,XF, SDER, XMI,XMA
|
|
! REAL*8 SS0, DB1N, VDER1, XR1
|
|
! REAL*8 SDER1, DER,XIND1
|
|
C DIMENSION R(1),BU(1),SQ(1),DB(1)
|
|
! DIMENSION R(RDIM),BU(NMAX),SQ(NMAX),DB(NMAX)
|
|
! DIMENSION R1(RDIM),B1(NMAX),DB1(NMAX),BU1(NMAX),SQ1(NMAX)
|
|
|
|
! DIMENSION XX1(24),H1(24)
|
|
C DIMENSION INF(10),INFO(10),HH(101)
|
|
|
|
C COMMON /EPS/ EPS,EPSS,CEPSS
|
|
C COMMON /RINT/ C,FC
|
|
C COMMON /TBR/ HH
|
|
C COMMON /INFC/ ISQ,INF,INFO
|
|
C COMMON/CHECK/III0,III1,III2,III3,III4
|
|
C COMMON /CHECK1/ III01,III11,III21,III31,III41,III51
|
|
C *,III61,III71,III81,III91,III101
|
|
|
|
XIND=0.0d0
|
|
XFF=1.0d0
|
|
IF (N.LT.1) GO TO 11
|
|
SQ0=0.0d0
|
|
DO I=1,N
|
|
IF (SQ(I).LE.EPS) THEN
|
|
SQ1(I)=SQ(I)
|
|
GO TO 1
|
|
END IF
|
|
IF (SQ(I).GT.SQ0) THEN
|
|
SQ0=SQ(I)
|
|
II0=I
|
|
END IF
|
|
X=-BU(I)/SQ(I)
|
|
XH=X+HH(I)/SQ(I)
|
|
XF=FI(X)-FI(XH)
|
|
IF (XF.LT.XFF) THEN
|
|
INF(5)=I
|
|
XFF=XF
|
|
END IF
|
|
1 CONTINUE
|
|
ENDDO
|
|
11 CONTINUE
|
|
IF (XFF.LT.EPSS) RETURN
|
|
IF (XFF.GT.0.9999d0*FC) THEN
|
|
SDER=0.d0
|
|
IF(VDER.GT.EPS) SDER=SQRT(VDER)
|
|
XIND=MAX(DBUN,0.0d0)
|
|
IF (IAC.LT.1) RETURN
|
|
XIND=PMEAN(DBUN,SDER)
|
|
RETURN
|
|
END IF
|
|
IF(ISQ.EQ.1) INF(5)=II0
|
|
SQ0=SQ(INF(5))
|
|
XMA=-BU(INF(5))/SQ0
|
|
XMI=XMA+HH(INF(5))/SQ0
|
|
XMI=MAX(-C,XMI)
|
|
XMA=MIN(C,XMA)
|
|
IF (XMI.GT.XMA) XMA=-C
|
|
III=0
|
|
DO I=5,10
|
|
III=III + ABS(INF(I)-INFO(I))
|
|
ENDDO
|
|
IF (III.EQ.0) GO TO 99
|
|
CALL M_COND(R1,B1,DB1,R,DB,INF(5),N)
|
|
SS0=B1(INF(5))
|
|
DB1N=DB(INF(5))
|
|
VDER1=VDER-DB1N*DB1N/SS0
|
|
SDER1=0.0d0
|
|
IF (VDER1.GT.EPS) SDER1=SQRT(VDER1)
|
|
INFO(5)=INF(5)
|
|
DB1N=DB1N/SQ0
|
|
SQ1(INF(5))=0.0d0
|
|
DO I=1,N
|
|
IF (SQ(I).LE.EPS) GO TO 3
|
|
XR1=R1(I+(I-1)*N)
|
|
SQ1(I)=0.0d0
|
|
IF (XR1.GT.EPS) SQ1(I)=SQRT(XR1)
|
|
3 CONTINUE
|
|
ENDDO
|
|
DO I=1,N
|
|
5 B1(I)=B1(I)/SQ0
|
|
ENDDO
|
|
99 CONTINUE
|
|
CALL C1_C2(XMI,XMA,BU,B1,DBUN,DB1N,SDER1,SQ1,N)
|
|
IF(FI(XMA)-FI(XMI).LT.EPSS) RETURN
|
|
CALL GAUSS1(N1,H1,XX1,XMI,XMA,EPS0)
|
|
DO J=1,N1
|
|
DO I=1,N
|
|
BU1(I)=BU(I)+XX1(J)*B1(I)
|
|
ENDDO
|
|
DER=DBUN+XX1(J)*DB1N
|
|
CALL RIND4(XIND1,R1,BU1,DER,DB1,SQ1,VDER1,N)
|
|
III41=III41+1
|
|
XIND=XIND+XIND1*H1(J)
|
|
ENDDO
|
|
RETURN
|
|
END SUBROUTINE RIND5
|
|
C
|
|
SUBROUTINE RIND6(XIND,R,BU,DBUN,DB,SQ,VDER,N)
|
|
USE SIZEMOD
|
|
USE TBRMOD
|
|
USE INFCMOD
|
|
USE CHECKMOD
|
|
USE EPSMOD
|
|
USE RINTMOD
|
|
IMPLICIT NONE
|
|
REAL*8, intent(inout) :: XIND,DBUN,VDER
|
|
REAL*8, DIMENSION(RDIM), intent(inout) :: R
|
|
REAL*8, DIMENSION(NMAX), intent(inout) :: BU,DB,SQ
|
|
INTEGER, intent(in) :: N
|
|
REAL*8, DIMENSION(RDIM), save :: R1
|
|
REAL*8, DIMENSION(NMAX), save :: BU1,DB1,B1,SQ1
|
|
REAL*8, DIMENSION(24) :: XX1, H1
|
|
REAL*8, save :: DB1N,SDER1,VDER1, SS0
|
|
REAL*8 XMI,XMA,DER,SDER
|
|
REAL*8 XIND1,XFF,XF,X,XH, XR1, SQ0
|
|
INTEGER I,III,J,II0,N1
|
|
|
|
! INTEGER IAC,N
|
|
! INTEGER I,J,III,II0,N1
|
|
! REAL*8 XIND,R,BU,DBUN,DB,SQ,VDER
|
|
! real*8 XX1,H1
|
|
! REAL*8 R1,B1,DB1,BU1,SQ1
|
|
! REAL*8 XFF, SQ0, X, XH,XF, SDER, XMI,XMA
|
|
! REAL*8 SS0, DB1N, VDER1, XR1
|
|
! REAL*8 SDER1, DER,XIND1
|
|
C DIMENSION R(1),BU(1),SQ(1),DB(1)
|
|
! DIMENSION R(RDIM),BU(NMAX),SQ(NMAX),DB(NMAX)
|
|
! DIMENSION R1(RDIM),B1(NMAX),DB1(NMAX),BU1(NMAX),SQ1(NMAX)
|
|
! DIMENSION XX1(24),H1(24)
|
|
C DIMENSION HH(101),INF(10),INFO(10)
|
|
|
|
C COMMON /EPS/ EPS,EPSS,CEPSS
|
|
C COMMON /RINT/ C,FC
|
|
C COMMON /TBR/ HH
|
|
C COMMON /INFC/ ISQ,INF,INFO
|
|
C COMMON /CHECK1/ III01,III11,III21,III31,III41,III51
|
|
C *,III61,III71,III81,III91,III101
|
|
|
|
XIND=0.0d0
|
|
XFF=1.0d0
|
|
IF (N.LT.1) GO TO 11
|
|
SQ0=0.0d0
|
|
DO I=1,N
|
|
IF (SQ(I).LE.EPS) THEN
|
|
SQ1(I)=SQ(I)
|
|
GO TO 1
|
|
END IF
|
|
c CSQ=C*SQ(I)
|
|
c IF (BU(I).LT.-CSQ.AND.BU(I).GT.HH(I)+CSQ) GO TO 1
|
|
c IF (BU(I).LT.-CSQ.AND.BU(I).GT.HH(I)+CSQ) SQ1(I)=EPS1
|
|
C IF (BU(I).GT. CSQ.OR.BU(I).LT.HH(I)-CSQ) RETURN
|
|
IF (SQ(I).GT.SQ0) THEN
|
|
SQ0=SQ(I)
|
|
II0=I
|
|
END IF
|
|
X=-BU(I)/SQ(I)
|
|
XH=X+HH(I)/SQ(I)
|
|
XF=FI(X)-FI(XH)
|
|
c IF(XF.GT.CEPSS) SQ1(I)=EPS1
|
|
IF (XF.LT.XFF) THEN
|
|
INF(6)=I
|
|
XFF=XF
|
|
END IF
|
|
1 CONTINUE
|
|
ENDDO
|
|
11 CONTINUE
|
|
IF(XFF.LT.EPSS) RETURN
|
|
IF (XFF.GT.0.9999d0*FC) THEN
|
|
SDER=0.0d0
|
|
IF (VDER.GT.EPS) SDER=SQRT(VDER)
|
|
XIND=MAX(DBUN,0.0d0)
|
|
IF(IAC.LT.1) RETURN
|
|
XIND=PMEAN(DBUN,SDER)
|
|
RETURN
|
|
END IF
|
|
IF(ISQ.EQ.1) INF(6)=II0
|
|
SQ0=SQ(INF(6))
|
|
XMA=-BU(INF(6))/SQ0
|
|
XMI=XMA+HH(INF(6))/SQ0
|
|
XMI=MAX(-C,XMI)
|
|
XMA=MIN(C,XMA)
|
|
IF (XMI.GT.XMA) XMA=-C
|
|
C *************************************************
|
|
C
|
|
C We are conditioning on the point T(INF(2)) and write new model
|
|
C BU(I)+X*B1(I)+Delta1(I), I=1,...,N (Obs. we do not use I=1,N)
|
|
C SQ1(I) is standard deviation of Delta1 DBUN=BU'(N), DB1N=B1'(N) and X is
|
|
C N(0,1) independent of Delta1, SDER1 is standard deviation of Delta1'(N).
|
|
C
|
|
III=0
|
|
DO I=6,10
|
|
III=III + ABS(INF(I)-INFO(I))
|
|
ENDDO
|
|
IF (III.EQ.0) GO TO 99
|
|
CALL M_COND(R1,B1,DB1,R,DB,INF(6),N)
|
|
C III1=III1+1
|
|
SS0=B1(INF(6))
|
|
INFO(6)=INF(6)
|
|
DB1N=DB(INF(6))
|
|
VDER1=VDER-DB1N*DB1N/SS0
|
|
SDER1=0.0d0
|
|
IF (VDER1.GT.EPS) SDER1=SQRT(VDER1)
|
|
C SQ0=SQRT(SS0)
|
|
DB1N=DB1N/SQ0
|
|
SQ1(INF(6))=0.0d0
|
|
DO I=1,N
|
|
C
|
|
C IF (SQ1(I).EQ.EPS1) GO TO 3 - the .EQ. can not be raplaced with .LT. without
|
|
C some general changes in the strategy of SQ and SQ1 values. More exactly
|
|
C SQ can not be changed in this subroutine when for some I we would like to
|
|
C put SQ1(I)=EPS1 in the first loop. This SQ1 should not be changed here and
|
|
C thus we have GO TO 3 statement. Observe that the other SQ1 values are
|
|
C
|
|
IF (SQ(I).LE.EPS) GO TO 3
|
|
C IF (SQ1(I).EQ.EPS1.OR.SQ(I).LE.EPS1) GO TO 3
|
|
XR1=R1(I+(I-1)*N)
|
|
c IF(XR1.LT.0.0d0) CALL ERROR(I,N,-1)
|
|
SQ1(I)=0.0d0
|
|
IF (XR1.GT.EPS) SQ1(I)=SQRT(XR1)
|
|
3 CONTINUE
|
|
ENDDO
|
|
DO I=1,N
|
|
5 B1(I)=B1(I)/SQ0
|
|
ENDDO
|
|
99 CONTINUE
|
|
C
|
|
C ***********************************************************
|
|
C
|
|
C We shall condition on the values of X, XMI<X<XMA, but for some
|
|
C X values XIND will be zero leading to reduced accuracy. Hence we try
|
|
C to exclude them and narrow the interval [XMI,XMA]
|
|
C
|
|
CALL C1_C2(XMI,XMA,BU,B1,DBUN,DB1N,SDER1,SQ1,N)
|
|
IF(FI(XMA)-FI(XMI).LT.EPSS) THEN
|
|
RETURN
|
|
ENDIF
|
|
CALL GAUSS1(N1,H1,XX1,XMI,XMA,EPS0)
|
|
DO J=1,N1
|
|
DO I=1,N
|
|
20 BU1(I)=BU(I)+XX1(J)*B1(I)
|
|
ENDDO
|
|
DER=DBUN+XX1(J)*DB1N
|
|
CALL RIND5(XIND1,R1,BU1,DER,DB1,SQ1,VDER1,N)
|
|
III51=III51+1
|
|
10 XIND=XIND+XIND1*H1(J)
|
|
ENDDO
|
|
RETURN
|
|
END SUBROUTINE RIND6
|
|
|
|
SUBROUTINE RIND7(XIND,R,BU,DBUN,DB,SQ,VDER,N)
|
|
USE SIZEMOD
|
|
USE TBRMOD
|
|
USE INFCMOD
|
|
USE CHECKMOD
|
|
USE EPSMOD
|
|
USE RINTMOD
|
|
IMPLICIT NONE
|
|
REAL*8, intent(inout) :: XIND,DBUN,VDER
|
|
REAL*8, DIMENSION(RDIM), intent(inout) :: R
|
|
REAL*8, DIMENSION(NMAX), intent(inout) :: BU,DB,SQ
|
|
INTEGER, intent(in) :: N
|
|
REAL*8, DIMENSION(RDIM), save :: R1
|
|
REAL*8, DIMENSION(NMAX), save :: BU1,DB1,B1,SQ1
|
|
REAL*8, DIMENSION(24) :: XX1, H1
|
|
REAL*8, save :: DB1N,SDER1,VDER1, SS0
|
|
REAL*8 XMI,XMA,DER,SDER
|
|
REAL*8 XIND1,XFF,XF,X,XH, XR1, SQ0
|
|
INTEGER I,III,J,II0,N1
|
|
|
|
! INTEGER IAC,N
|
|
! INTEGER I,J,III,II0,N1
|
|
! REAL*8 XIND,R,BU,DBUN,DB,SQ,VDER
|
|
! real*8 XX1,H1
|
|
! REAL*8 R1,B1,DB1,BU1,SQ1
|
|
! REAL*8 XFF, SQ0, X, XH,XF, SDER, XMI,XMA
|
|
! REAL*8 SS0, DB1N, VDER1, XR1
|
|
! REAL*8 SDER1, DER,XIND1
|
|
C DIMENSION R(1),BU(1),SQ(1),DB(1)
|
|
! DIMENSION R(RDIM),BU(NMAX),SQ(NMAX),DB(NMAX)
|
|
! DIMENSION R1(RDIM),B1(NMAX),DB1(NMAX),BU1(NMAX),SQ1(NMAX)
|
|
! DIMENSION XX1(24),H1(24)
|
|
C DIMENSION HH(101),INF(10),INFO(10)
|
|
|
|
C COMMON /EPS/ EPS,EPSS,CEPSS
|
|
C COMMON /RINT/ C,FC
|
|
C COMMON /TBR/ HH
|
|
C COMMON /INFC/ ISQ,INF,INFO
|
|
C COMMON /CHECK1/ III01,III11,III21,III31,III41,III51
|
|
C *,III61,III71,III81,III91,III101
|
|
|
|
XIND=0.0d0
|
|
XFF=1.0d0
|
|
IF (N.LT.1) GO TO 11
|
|
SQ0=0.0d0
|
|
DO I=1,N
|
|
IF (SQ(I).LE.EPS) THEN
|
|
SQ1(I)=SQ(I)
|
|
GO TO 1
|
|
END IF
|
|
c CSQ=C*SQ(I)
|
|
c IF (BU(I).LT.-CSQ.AND.BU(I).GT.HH(I)+CSQ) GO TO 1
|
|
c IF (BU(I).LT.-CSQ.AND.BU(I).GT.HH(I)+CSQ) SQ1(I)=EPS1
|
|
C IF (BU(I).GT. CSQ.OR.BU(I).LT.HH(I)-CSQ) RETURN
|
|
IF (SQ(I).GT.SQ0) THEN
|
|
SQ0=SQ(I)
|
|
II0=I
|
|
END IF
|
|
X=-BU(I)/SQ(I)
|
|
XH=X+HH(I)/SQ(I)
|
|
XF=FI(X)-FI(XH)
|
|
c IF(XF.GT.CEPSS) SQ1(I)=EPS1
|
|
IF (XF.LT.XFF) THEN
|
|
INF(7)=I
|
|
XFF=XF
|
|
END IF
|
|
1 CONTINUE
|
|
ENDDO
|
|
11 CONTINUE
|
|
IF(XFF.LT.EPSS) RETURN
|
|
IF (XFF.GT.0.9999d0*FC) THEN
|
|
SDER=0.0d0
|
|
IF (VDER.GT.EPS) SDER=SQRT(VDER)
|
|
XIND=MAX(DBUN,0.0d0)
|
|
IF(IAC.LT.1) RETURN
|
|
XIND=PMEAN(DBUN,SDER)
|
|
RETURN
|
|
END IF
|
|
IF(ISQ.EQ.1) INF(7)=II0
|
|
SQ0=SQ(INF(7))
|
|
XMA=-BU(INF(7))/SQ0
|
|
XMI=XMA+HH(INF(7))/SQ0
|
|
XMI=MAX(-C,XMI)
|
|
XMA=MIN(C,XMA)
|
|
IF (XMI.GT.XMA) XMA=-C
|
|
C *************************************************
|
|
C
|
|
C We are conditioning on the point T(INF(2)) and write new model
|
|
C BU(I)+X*B1(I)+Delta1(I), I=1,...,N (Obs. we do not use I=1,N)
|
|
C SQ1(I) is standard deviation of Delta1 DBUN=BU'(N), DB1N=B1'(N) and X is
|
|
C N(0,1) independent of Delta1, SDER1 is standard deviation of Delta1'(N).
|
|
C
|
|
III=0
|
|
DO I=7,10
|
|
III=III + ABS(INF(I)-INFO(I))
|
|
ENDDO
|
|
IF (III.EQ.0) GO TO 99
|
|
CALL M_COND(R1,B1,DB1,R,DB,INF(7),N)
|
|
C III1=III1+1
|
|
SS0=B1(INF(7))
|
|
INFO(7)=INF(7)
|
|
DB1N=DB(INF(7))
|
|
VDER1=VDER-DB1N*DB1N/SS0
|
|
SDER1=0.0d0
|
|
IF (VDER1.GT.EPS) SDER1=SQRT(VDER1)
|
|
C SQ0=SQRT(SS0)
|
|
DB1N=DB1N/SQ0
|
|
SQ1(INF(7))=0.0d0
|
|
DO I=1,N
|
|
C
|
|
C IF (SQ1(I).EQ.EPS1) GO TO 3 - the .EQ. can not be raplaced with .LT. without
|
|
C some general changes in the strategy of SQ and SQ1 values. More exactly
|
|
C SQ can not be changed in this subroutine when for some I we would like to
|
|
C put SQ1(I)=EPS1 in the first loop. This SQ1 should not be changed here and
|
|
C thus we have GO TO 3 statement. Observe that the other SQ1 values are
|
|
C
|
|
IF (SQ(I).LE.EPS) GO TO 3
|
|
C IF (SQ1(I).EQ.EPS1.OR.SQ(I).LE.EPS1) GO TO 3
|
|
XR1=R1(I+(I-1)*N)
|
|
c IF(XR1.LT.0.0d0) CALL ERROR(I,N,-1)
|
|
SQ1(I)=0.0d0
|
|
IF (XR1.GT.EPS) SQ1(I)=SQRT(XR1)
|
|
3 CONTINUE
|
|
ENDDO
|
|
DO I=1,N
|
|
B1(I)=B1(I)/SQ0
|
|
ENDDO
|
|
99 CONTINUE
|
|
C
|
|
C ***********************************************************
|
|
C
|
|
C We shall condition on the values of X, XMI<X<XMA, but for some
|
|
C X values XIND will be zero leading to reduced accuracy. Hence we try
|
|
C to exclude them and narrow the interval [XMI,XMA]
|
|
C
|
|
CALL C1_C2(XMI,XMA,BU,B1,DBUN,DB1N,SDER1,SQ1,N)
|
|
IF(FI(XMA)-FI(XMI).LT.EPSS) THEN
|
|
RETURN
|
|
ENDIF
|
|
CALL GAUSS1(N1,H1,XX1,XMI,XMA,EPS0)
|
|
DO J=1,N1
|
|
DO I=1,N
|
|
BU1(I)=BU(I)+XX1(J)*B1(I)
|
|
ENDDO
|
|
DER=DBUN+XX1(J)*DB1N
|
|
CALL RIND6(XIND1,R1,BU1,DER,DB1,SQ1,VDER1,N)
|
|
III61=III61+1
|
|
XIND=XIND+XIND1*H1(J)
|
|
ENDDO
|
|
RETURN
|
|
END SUBROUTINE RIND7
|
|
|
|
SUBROUTINE RIND8(XIND,R,BU,DBUN,DB,SQ,VDER,N)
|
|
USE SIZEMOD
|
|
USE TBRMOD
|
|
USE INFCMOD
|
|
USE CHECKMOD
|
|
USE EPSMOD
|
|
USE RINTMOD
|
|
IMPLICIT NONE
|
|
REAL*8, intent(inout) :: XIND,DBUN,VDER
|
|
REAL*8, DIMENSION(RDIM), intent(inout) :: R
|
|
REAL*8, DIMENSION(NMAX), intent(inout) :: BU,DB,SQ
|
|
INTEGER, intent(in) :: N
|
|
REAL*8, DIMENSION(RDIM), save :: R1
|
|
REAL*8, DIMENSION(NMAX), save :: BU1,DB1,B1,SQ1
|
|
REAL*8, DIMENSION(24) :: XX1, H1
|
|
REAL*8, save :: DB1N,SDER1,VDER1, SS0
|
|
REAL*8 XMI,XMA,DER,SDER
|
|
REAL*8 XIND1,XFF,XF,X,XH, XR1, SQ0
|
|
INTEGER I,III,J,II0,N1
|
|
|
|
! INTEGER IAC,N
|
|
! INTEGER I,J,III,II0,N1
|
|
! REAL*8 XIND,R,BU,DBUN,DB,SQ,VDER
|
|
! real*8 XX1,H1
|
|
! REAL*8 R1,B1,DB1,BU1,SQ1
|
|
! REAL*8 XFF, SQ0, X, XH,XF, SDER, XMI,XMA
|
|
! REAL*8 SS0, DB1N, VDER1, XR1
|
|
! REAL*8 SDER1, DER,XIND1
|
|
C DIMENSION R(1),BU(1),SQ(1),DB(1)
|
|
! DIMENSION R(RDIM),BU(NMAX),SQ(NMAX),DB(NMAX)
|
|
! DIMENSION R1(RDIM),B1(NMAX),DB1(NMAX),BU1(NMAX),SQ1(NMAX)
|
|
! DIMENSION XX1(24),H1(24)
|
|
C DIMENSION HH(101),INF(10),INFO(10)
|
|
|
|
C COMMON /EPS/ EPS,EPSS,CEPSS
|
|
C COMMON /RINT/ C,FC
|
|
C COMMON /TBR/ HH
|
|
C COMMON /INFC/ ISQ,INF,INFO
|
|
C COMMON /CHECK1/ III01,III11,III21,III31,III41,III51
|
|
C *,III61,III71,III81,III91,III101
|
|
|
|
XIND=0.0d0
|
|
XFF=1.0d0
|
|
IF (N.LT.1) GO TO 11
|
|
SQ0=0.0d0
|
|
DO I=1,N
|
|
IF (SQ(I).LE.EPS) THEN
|
|
SQ1(I)=SQ(I)
|
|
GO TO 1
|
|
END IF
|
|
c CSQ=C*SQ(I)
|
|
c IF (BU(I).LT.-CSQ.AND.BU(I).GT.HH(I)+CSQ) GO TO 1
|
|
c IF (BU(I).LT.-CSQ.AND.BU(I).GT.HH(I)+CSQ) SQ1(I)=EPS1
|
|
C IF (BU(I).GT. CSQ.OR.BU(I).LT.HH(I)-CSQ) RETURN
|
|
IF (SQ(I).GT.SQ0) THEN
|
|
SQ0=SQ(I)
|
|
II0=I
|
|
END IF
|
|
X=-BU(I)/SQ(I)
|
|
XH=X+HH(I)/SQ(I)
|
|
XF=FI(X)-FI(XH)
|
|
c IF(XF.GT.CEPSS) SQ1(I)=EPS1
|
|
IF (XF.LT.XFF) THEN
|
|
INF(8)=I
|
|
XFF=XF
|
|
END IF
|
|
1 CONTINUE
|
|
ENDDO
|
|
11 CONTINUE
|
|
IF(XFF.LT.EPSS) RETURN
|
|
IF (XFF.GT.0.9999d0*FC) THEN
|
|
SDER=0.0d0
|
|
IF (VDER.GT.EPS) SDER=SQRT(VDER)
|
|
XIND=MAX(DBUN,0.0d0)
|
|
IF(IAC.LT.1) RETURN
|
|
XIND=PMEAN(DBUN,SDER)
|
|
RETURN
|
|
END IF
|
|
IF(ISQ.EQ.1) INF(8)=II0
|
|
SQ0=SQ(INF(8))
|
|
XMA=-BU(INF(8))/SQ0
|
|
XMI=XMA+HH(INF(8))/SQ0
|
|
XMI=MAX(-C,XMI)
|
|
XMA=MIN(C,XMA)
|
|
IF (XMI.GT.XMA) XMA=-C
|
|
C *************************************************
|
|
C
|
|
C We are conditioning on the point T(INF(2)) and write new model
|
|
C BU(I)+X*B1(I)+Delta1(I), I=1,...,N (Obs. we do not use I=1,N)
|
|
C SQ1(I) is standard deviation of Delta1 DBUN=BU'(N), DB1N=B1'(N) and X is
|
|
C N(0,1) independent of Delta1, SDER1 is standard deviation of Delta1'(N).
|
|
C
|
|
III=0
|
|
DO I=8,10
|
|
III=III + ABS(INF(I)-INFO(I))
|
|
ENDDO
|
|
IF (III.EQ.0) GO TO 99
|
|
CALL M_COND(R1,B1,DB1,R,DB,INF(8),N)
|
|
C III1=III1+1
|
|
SS0=B1(INF(8))
|
|
INFO(8)=INF(8)
|
|
DB1N=DB(INF(8))
|
|
VDER1=VDER-DB1N*DB1N/SS0
|
|
SDER1=0.0d0
|
|
IF (VDER1.GT.EPS) SDER1=SQRT(VDER1)
|
|
C SQ0=SQRT(SS0)
|
|
DB1N=DB1N/SQ0
|
|
SQ1(INF(8))=0.0d0
|
|
DO I=1,N
|
|
C
|
|
C IF (SQ1(I).EQ.EPS1) GO TO 3 - the .EQ. can not be raplaced with .LT. without
|
|
C some general changes in the strategy of SQ and SQ1 values. More exactly
|
|
C SQ can not be changed in this subroutine when for some I we would like to
|
|
C put SQ1(I)=EPS1 in the first loop. This SQ1 should not be changed here and
|
|
C thus we have GO TO 3 statement. Observe that the other SQ1 values are
|
|
C
|
|
IF (SQ(I).LE.EPS) GO TO 3
|
|
C IF (SQ1(I).EQ.EPS1.OR.SQ(I).LE.EPS1) GO TO 3
|
|
XR1=R1(I+(I-1)*N)
|
|
c IF(XR1.LT.0.0d0) CALL ERROR(I,N,-1)
|
|
SQ1(I)=0.0d0
|
|
IF (XR1.GT.EPS) SQ1(I)=SQRT(XR1)
|
|
3 CONTINUE
|
|
ENDDO
|
|
DO I=1,N
|
|
B1(I)=B1(I)/SQ0
|
|
ENDDO
|
|
99 CONTINUE
|
|
C
|
|
C ***********************************************************
|
|
C
|
|
C We shall condition on the values of X, XMI<X<XMA, but for some
|
|
C X values XIND will be zero leading to reduced accuracy. Hence we try
|
|
C to exclude them and narrow the interval [XMI,XMA]
|
|
C
|
|
CALL C1_C2(XMI,XMA,BU,B1,DBUN,DB1N,SDER1,SQ1,N)
|
|
IF(FI(XMA)-FI(XMI).LT.EPSS) THEN
|
|
RETURN
|
|
ENDIF
|
|
CALL GAUSS1(N1,H1,XX1,XMI,XMA,EPS0)
|
|
DO J=1,N1
|
|
DO I=1,N
|
|
BU1(I)=BU(I)+XX1(J)*B1(I)
|
|
ENDDO
|
|
DER=DBUN+XX1(J)*DB1N
|
|
CALL RIND7(XIND1,R1,BU1,DER,DB1,SQ1,VDER1,N)
|
|
III71=III71+1
|
|
XIND=XIND+XIND1*H1(J)
|
|
ENDDO
|
|
RETURN
|
|
END SUBROUTINE RIND8
|
|
|
|
SUBROUTINE RIND9(XIND,R,BU,DBUN,DB,SQ,VDER,N)
|
|
USE SIZEMOD
|
|
USE TBRMOD
|
|
USE INFCMOD
|
|
USE CHECKMOD
|
|
USE EPSMOD
|
|
USE RINTMOD
|
|
IMPLICIT NONE
|
|
REAL*8, intent(inout) :: XIND,DBUN,VDER
|
|
REAL*8, DIMENSION(RDIM), intent(inout) :: R
|
|
REAL*8, DIMENSION(NMAX), intent(inout) :: BU,DB,SQ
|
|
INTEGER, intent(in) :: N
|
|
REAL*8, DIMENSION(RDIM), save :: R1
|
|
REAL*8, DIMENSION(NMAX), save :: BU1,DB1,B1,SQ1
|
|
REAL*8, DIMENSION(24) :: XX1, H1
|
|
REAL*8, save :: DB1N,SDER1,VDER1, SS0
|
|
REAL*8 XMI,XMA,DER,SDER
|
|
REAL*8 XIND1,XFF,XF,X,XH, XR1, SQ0
|
|
INTEGER I,III,J,II0,N1
|
|
|
|
! INTEGER IAC,N
|
|
! INTEGER I,J,III,II0,N1
|
|
! REAL*8 XIND,R,BU,DBUN,DB,SQ,VDER
|
|
! real*8 XX1,H1
|
|
! REAL*8 R1,B1,DB1,BU1,SQ1
|
|
! REAL*8 XFF, SQ0, X, XH,XF, SDER, XMI,XMA
|
|
! REAL*8 SS0, DB1N, VDER1, XR1
|
|
! REAL*8 SDER1, DER,XIND1
|
|
C DIMENSION R(1),BU(1),SQ(1),DB(1)
|
|
! DIMENSION R(RDIM),BU(NMAX),SQ(NMAX),DB(NMAX)
|
|
! DIMENSION R1(RDIM),B1(NMAX),DB1(NMAX),BU1(NMAX),SQ1(NMAX)
|
|
! DIMENSION XX1(24),H1(24)
|
|
C DIMENSION HH(101),INF(10),INFO(10)
|
|
|
|
C COMMON /EPS/ EPS,EPSS,CEPSS
|
|
C COMMON /RINT/ C,FC
|
|
C COMMON /TBR/ HH
|
|
C COMMON /INFC/ ISQ,INF,INFO
|
|
C COMMON /CHECK1/ III01,III11,III21,III31,III41,III51
|
|
C *,III61,III71,III81,III91,III101
|
|
|
|
XIND=0.0d0
|
|
XFF=1.0d0
|
|
IF (N.LT.1) GO TO 11
|
|
SQ0=0.0d0
|
|
DO I=1,N
|
|
IF (SQ(I).LE.EPS) THEN
|
|
SQ1(I)=SQ(I)
|
|
GO TO 1
|
|
END IF
|
|
c CSQ=C*SQ(I)
|
|
c IF (BU(I).LT.-CSQ.AND.BU(I).GT.HH(I)+CSQ) GO TO 1
|
|
c IF (BU(I).LT.-CSQ.AND.BU(I).GT.HH(I)+CSQ) SQ1(I)=EPS1
|
|
C IF (BU(I).GT. CSQ.OR.BU(I).LT.HH(I)-CSQ) RETURN
|
|
IF (SQ(I).GT.SQ0) THEN
|
|
SQ0=SQ(I)
|
|
II0=I
|
|
END IF
|
|
X=-BU(I)/SQ(I)
|
|
XH=X+HH(I)/SQ(I)
|
|
XF=FI(X)-FI(XH)
|
|
c IF(XF.GT.CEPSS) SQ1(I)=EPS1
|
|
IF (XF.LT.XFF) THEN
|
|
INF(9)=I
|
|
XFF=XF
|
|
END IF
|
|
1 CONTINUE
|
|
ENDDO
|
|
11 CONTINUE
|
|
IF(XFF.LT.EPSS) RETURN
|
|
IF (XFF.GT.0.9999d0*FC) THEN
|
|
SDER=0.0d0
|
|
IF (VDER.GT.EPS) SDER=SQRT(VDER)
|
|
XIND=MAX(DBUN,0.0d0)
|
|
IF(IAC.LT.1) RETURN
|
|
XIND=PMEAN(DBUN,SDER)
|
|
RETURN
|
|
END IF
|
|
IF(ISQ.EQ.1) INF(9)=II0
|
|
SQ0=SQ(INF(9))
|
|
XMA=-BU(INF(9))/SQ0
|
|
XMI=XMA+HH(INF(9))/SQ0
|
|
XMI=MAX(-C,XMI)
|
|
XMA=MIN(C,XMA)
|
|
IF (XMI.GT.XMA) XMA=-C
|
|
C *************************************************
|
|
C
|
|
C We are conditioning on the point T(INF(2)) and write new model
|
|
C BU(I)+X*B1(I)+Delta1(I), I=1,...,N (Obs. we do not use I=1,N)
|
|
C SQ1(I) is standard deviation of Delta1 DBUN=BU'(N), DB1N=B1'(N) and X is
|
|
C N(0,1) independent of Delta1, SDER1 is standard deviation of Delta1'(N).
|
|
C
|
|
III=0
|
|
DO I=9,10
|
|
III=III + ABS(INF(I)-INFO(I))
|
|
ENDDO
|
|
IF (III.EQ.0) GO TO 99
|
|
CALL M_COND(R1,B1,DB1,R,DB,INF(9),N)
|
|
C III1=III1+1
|
|
SS0=B1(INF(9))
|
|
INFO(9)=INF(9)
|
|
DB1N=DB(INF(9))
|
|
VDER1=VDER-DB1N*DB1N/SS0
|
|
SDER1=0.0d0
|
|
IF (VDER1.GT.EPS) SDER1=SQRT(VDER1)
|
|
C SQ0=SQRT(SS0)
|
|
DB1N=DB1N/SQ0
|
|
SQ1(INF(9))=0.0d0
|
|
DO I=1,N
|
|
C
|
|
C IF (SQ1(I).EQ.EPS1) GO TO 3 - the .EQ. can not be raplaced with .LT. without
|
|
C some general changes in the strategy of SQ and SQ1 values. More exactly
|
|
C SQ can not be changed in this subroutine when for some I we would like to
|
|
C put SQ1(I)=EPS1 in the first loop. This SQ1 should not be changed here and
|
|
C thus we have GO TO 3 statement. Observe that the other SQ1 values are
|
|
C
|
|
IF (SQ(I)>EPS) THEN
|
|
XR1=R1(I+(I-1)*N)
|
|
c IF(XR1.LT.0.0d0) CALL ERROR(I,N,-1)
|
|
SQ1(I)=0.0d0
|
|
IF (XR1.GT.EPS) SQ1(I)=SQRT(XR1)
|
|
ENDIF
|
|
ENDDO
|
|
DO I=1,N
|
|
B1(I)=B1(I)/SQ0
|
|
ENDDO
|
|
99 CONTINUE
|
|
C
|
|
C ***********************************************************
|
|
C
|
|
C We shall condition on the values of X, XMI<X<XMA, but for some
|
|
C X values XIND will be zero leading to reduced accuracy. Hence we try
|
|
C to exclude them and narrow the interval [XMI,XMA]
|
|
C
|
|
CALL C1_C2(XMI,XMA,BU,B1,DBUN,DB1N,SDER1,SQ1,N)
|
|
IF(FI(XMA)-FI(XMI).LT.EPSS) THEN
|
|
RETURN
|
|
ENDIF
|
|
CALL GAUSS1(N1,H1,XX1,XMI,XMA,EPS0)
|
|
DO J=1,N1
|
|
DO I=1,N
|
|
BU1(I)=BU(I)+XX1(J)*B1(I)
|
|
ENDDO
|
|
DER=DBUN+XX1(J)*DB1N
|
|
CALL RIND8(XIND1,R1,BU1,DER,DB1,SQ1,VDER1,N)
|
|
III81=III81+1
|
|
XIND=XIND+XIND1*H1(J)
|
|
ENDDO
|
|
RETURN
|
|
END SUBROUTINE RIND9
|
|
|
|
SUBROUTINE RIND10(XIND,R,BU,DBUN,DB,SQ,VDER,N)
|
|
USE SIZEMOD
|
|
USE TBRMOD
|
|
USE INFCMOD
|
|
USE CHECKMOD
|
|
USE EPSMOD
|
|
USE RINTMOD
|
|
IMPLICIT NONE
|
|
REAL*8, intent(inout) :: XIND,DBUN,VDER
|
|
REAL*8, DIMENSION(RDIM), intent(inout) :: R
|
|
REAL*8, DIMENSION(NMAX), intent(inout) :: BU,DB,SQ
|
|
INTEGER, intent(in) :: N
|
|
REAL*8, DIMENSION(RDIM), save :: R1
|
|
REAL*8, DIMENSION(NMAX), save :: BU1,DB1,B1,SQ1
|
|
REAL*8, DIMENSION(24) :: XX1, H1
|
|
REAL*8, save :: DB1N,SDER1,VDER1, SS0
|
|
REAL*8 XMI,XMA,DER,SDER
|
|
REAL*8 XIND1,XFF,XF,X,XH, XR1, SQ0
|
|
INTEGER I,III,J,II0,N1
|
|
|
|
! INTEGER IAC,N
|
|
! INTEGER I,J,III,II0,N1
|
|
! REAL*8 XIND,R,BU,DBUN,DB,SQ,VDER
|
|
! real*8 XX1,H1
|
|
! REAL*8 R1,B1,DB1,BU1,SQ1
|
|
! REAL*8 XFF, SQ0, X, XH,XF, SDER, XMI,XMA
|
|
! REAL*8 SS0, DB1N, VDER1, XR1
|
|
! REAL*8 SDER1, DER,XIND1
|
|
C DIMENSION R(1),BU(1),SQ(1),DB(1)
|
|
! DIMENSION R(RDIM),BU(NMAX),SQ(NMAX),DB(NMAX)
|
|
! DIMENSION R1(RDIM),B1(NMAX),DB1(NMAX),BU1(NMAX),SQ1(NMAX)
|
|
! DIMENSION XX1(24),H1(24)
|
|
C DIMENSION HH(101),INF(10),INFO(10)
|
|
|
|
C COMMON /EPS/ EPS,EPSS,CEPSS
|
|
C COMMON /RINT/ C,FC
|
|
C COMMON /TBR/ HH
|
|
C COMMON /INFC/ ISQ,INF,INFO
|
|
C COMMON /CHECK1/ III01,III11,III21,III31,III41,III51
|
|
C *,III61,III71,III81,III91,III101
|
|
|
|
XIND=0.0d0
|
|
XFF=1.0d0
|
|
IF (N.LT.1) GO TO 11
|
|
SQ0=0.0d0
|
|
DO I=1,N
|
|
IF (SQ(I).LE.EPS) THEN
|
|
SQ1(I)=SQ(I)
|
|
GO TO 1
|
|
END IF
|
|
c CSQ=C*SQ(I)
|
|
c IF (BU(I).LT.-CSQ.AND.BU(I).GT.HH(I)+CSQ) GO TO 1
|
|
c IF (BU(I).LT.-CSQ.AND.BU(I).GT.HH(I)+CSQ) SQ1(I)=EPS1
|
|
C IF (BU(I).GT. CSQ.OR.BU(I).LT.HH(I)-CSQ) RETURN
|
|
IF (SQ(I).GT.SQ0) THEN
|
|
SQ0=SQ(I)
|
|
II0=I
|
|
END IF
|
|
X=-BU(I)/SQ(I)
|
|
XH=X+HH(I)/SQ(I)
|
|
XF=FI(X)-FI(XH)
|
|
c IF(XF.GT.CEPSS) SQ1(I)=EPS1
|
|
IF (XF.LT.XFF) THEN
|
|
INF(10)=I
|
|
XFF=XF
|
|
END IF
|
|
1 CONTINUE
|
|
ENDDO
|
|
11 CONTINUE
|
|
IF(XFF.LT.EPSS) RETURN
|
|
IF (XFF.GT.0.9999d0*FC) THEN
|
|
SDER=0.0d0
|
|
IF (VDER.GT.EPS) SDER=SQRT(VDER)
|
|
XIND=MAX(DBUN,0.0d0)
|
|
IF(IAC.LT.1) RETURN
|
|
XIND=PMEAN(DBUN,SDER)
|
|
RETURN
|
|
END IF
|
|
IF(ISQ.EQ.1) INF(10)=II0
|
|
SQ0=SQ(INF(10))
|
|
XMA=-BU(INF(10))/SQ0
|
|
XMI=XMA+HH(INF(10))/SQ0
|
|
XMI=MAX(-C,XMI)
|
|
XMA=MIN(C,XMA)
|
|
IF (XMI.GT.XMA) XMA=-C
|
|
C *************************************************
|
|
C
|
|
C We are conditioning on the point T(INF(2)) and write new model
|
|
C BU(I)+X*B1(I)+Delta1(I), I=1,...,N (Obs. we do not use I=1,N)
|
|
C SQ1(I) is standard deviation of Delta1 DBUN=BU'(N), DB1N=B1'(N) and X is
|
|
C N(0,1) independent of Delta1, SDER1 is standard deviation of Delta1'(N).
|
|
C
|
|
III=0
|
|
DO I=10,10
|
|
III=III + ABS(INF(I)-INFO(I))
|
|
ENDDO
|
|
IF (III.EQ.0) GO TO 99
|
|
CALL M_COND(R1,B1,DB1,R,DB,INF(10),N)
|
|
C III1=III1+1
|
|
SS0=B1(INF(10))
|
|
INFO(10)=INF(10)
|
|
DB1N=DB(INF(10))
|
|
VDER1=VDER-DB1N*DB1N/SS0
|
|
SDER1=0.0d0
|
|
IF (VDER1.GT.EPS) SDER1=SQRT(VDER1)
|
|
C SQ0=SQRT(SS0)
|
|
DB1N=DB1N/SQ0
|
|
SQ1(INF(10))=0.0d0
|
|
DO I=1,N
|
|
C
|
|
C IF (SQ1(I).EQ.EPS1) GO TO 3 - the .EQ. can not be raplaced with .LT. without
|
|
C some general changes in the strategy of SQ and SQ1 values. More exactly
|
|
C SQ can not be changed in this subroutine when for some I we would like to
|
|
C put SQ1(I)=EPS1 in the first loop. This SQ1 should not be changed here and
|
|
C thus we have GO TO 3 statement. Observe that the other SQ1 values are
|
|
cc
|
|
IF (SQ(I)>EPS) THEN
|
|
|
|
XR1=R1(I+(I-1)*N)
|
|
c IF(XR1.LT.0.0d0) CALL ERROR(I,N,-1)
|
|
SQ1(I)=0.0d0
|
|
IF (XR1.GT.EPS) SQ1(I)=SQRT(XR1)
|
|
ENDIF
|
|
ENDDO
|
|
DO I=1,N
|
|
B1(I)=B1(I)/SQ0
|
|
ENDDO
|
|
99 CONTINUE
|
|
C
|
|
C ***********************************************************
|
|
C
|
|
C We shall condition on the values of X, XMI<X<XMA, but for some
|
|
C X values XIND will be zero leading to reduced accuracy. Hence we try
|
|
C to exclude them and narrow the interval [XMI,XMA]
|
|
C
|
|
CALL C1_C2(XMI,XMA,BU,B1,DBUN,DB1N,SDER1,SQ1,N)
|
|
IF(FI(XMA)-FI(XMI).LT.EPSS) THEN
|
|
RETURN
|
|
ENDIF
|
|
CALL GAUSS1(N1,H1,XX1,XMI,XMA,EPS0)
|
|
DO J=1,N1
|
|
DO I=1,N
|
|
BU1(I)=BU(I)+XX1(J)*B1(I)
|
|
ENDDO
|
|
DER=DBUN+XX1(J)*DB1N
|
|
CALL RIND9(XIND1,R1,BU1,DER,DB1,SQ1,VDER1,N)
|
|
III91=III91+1
|
|
XIND=XIND+XIND1*H1(J)
|
|
ENDDO
|
|
RETURN
|
|
END SUBROUTINE RIND10
|
|
|
|
SUBROUTINE C1_C2(C1,C2,BU,B1,DBUN,DB1N,SDER,SQ,N)
|
|
C
|
|
C We assume that the process y is of form y(I)=BU(I)+X*B1(I)+Delta(I),
|
|
C I=1,...,N, SQ(I) is standard deviation of Delta(I), where X is N(0,1)
|
|
C independent of Delta. Let Y = DBUN + DB1N*X + Z, where Z is zero-mean
|
|
C Gaussian with standart independent of X (it can depend on Delta(I)) with
|
|
C standart deviation SDER. Since we are truncating all Gaussian variables to
|
|
C the interval [-C,C], then if for any I
|
|
C
|
|
C a) BU(I)+x*B1(I)-C*SQ(I)>0 or
|
|
C
|
|
C b) BU(I)+x*B1(I)+C*SQ(I)<HH then
|
|
C
|
|
C XIND|X=x = E[Y^+1{ HH<y(I)<0 for all I, I=1,...,N}|X=x] = 0 !!!!!!!!!
|
|
C
|
|
C Further, see discussion in comments to the subroutine PMEAN, by first upper-
|
|
C bounding the indicator 1{} in XIND by 1, XIND|X=x = 0 if
|
|
C
|
|
C c) DBUN+x*DB1N+4.5*SDER<0.0d0
|
|
C
|
|
C Consequently, for increasing the accuracy (by excluding possible discon-
|
|
C tinuouities) we shall exclude such X=x values for which XIND|X=x = 0.0d0
|
|
C XIND=E([XIND|X]). Hence we assume that if C1<X<C2 any of the previous
|
|
C conditions are satisfied.
|
|
C
|
|
C OBSERVE!!, C1, C2 has to be set to upper bounds of possible values, e.g.
|
|
C C1=-C, C2=C before calling C1_C2 subroutine.
|
|
C
|
|
|
|
C NOTE: Check that integration limits contained in TBRMOD is used correctly
|
|
C If order of variables are changed then also the integration limits in HH should reflect this
|
|
USE EPSMOD
|
|
USE RINTMOD
|
|
USE TBRMOD
|
|
USE SIZEMOD
|
|
IMPLICIT NONE
|
|
REAL*8, DIMENSION(NMAX), intent(inout) :: BU,SQ,B1
|
|
REAL*8, intent(inout) :: C1,C2
|
|
REAL*8, intent(in) :: DBUN,DB1N,SDER
|
|
INTEGER, intent(in) :: N
|
|
REAL*8 CSQ, HHB, CC1, CC2, X
|
|
INTEGER I
|
|
C DIMENSION BU(1),B1(1),SQ(1)
|
|
! DIMENSION BU(NMAX),SQ(NMAX),B1(NMAX)
|
|
C DIMENSION HH(101)
|
|
C COMMON /EPS/EPS,EPSS,CEPSS
|
|
C COMMON/RINT/C,FC
|
|
C COMMON/TBR/HH
|
|
DO I=1,N
|
|
CSQ=C*SQ(I)
|
|
HHB=HH(I)-BU(I)
|
|
C
|
|
C If ABS(B1(I)) < EPS we can have overflow and hence we consider two cases
|
|
C 1) BU(I) is so large or small so we can surely assume that the probability
|
|
C of staying between the barriers is 0, consequently C1=C2=0
|
|
C 2) we do not change the original limits.
|
|
C
|
|
IF (ABS(B1(I)).LT. EPS) THEN
|
|
IF (BU(I).GT.CSQ.OR.BU(I).LT.HH(I)-CSQ) THEN
|
|
C1=0.0d0
|
|
C2=0.0d0
|
|
RETURN
|
|
END IF
|
|
C
|
|
C In other cases this part follows from the description of the problem.
|
|
C
|
|
ELSE
|
|
IF (B1(I).GT.EPS) THEN
|
|
CC1=(HHB-CSQ)/B1(I)
|
|
CC2=(-BU(I)+CSQ)/B1(I)
|
|
IF (C1.LT.CC1) C1=CC1
|
|
IF (C2.GT.CC2) C2=CC2
|
|
ELSE
|
|
CC2=(HHB-CSQ)/B1(I)
|
|
CC1=(-BU(I)+CSQ)/B1(I)
|
|
IF (C1.LT.CC1) C1=CC1
|
|
IF (C2.GT.CC2) C2=CC2
|
|
END IF
|
|
END IF
|
|
ENDDO
|
|
X=-DBUN-4.5d0*SDER
|
|
IF(DB1N.GT.EPS.AND.C1.LT.X/DB1N) C1=X/DB1N
|
|
IF(DB1N.LT.-EPS.AND.C2.GT.X/DB1N) C2=X/DB1N
|
|
if(abs(db1n).lt.eps.and.x.gt.0.0d0) then
|
|
C1=0.0d0
|
|
C2=0.0d0
|
|
RETURN
|
|
END IF
|
|
|
|
c
|
|
c In the following three rows we are cutting C1, C2 to the interval [-C,C].
|
|
c Obs. all tree lines are neccessary.
|
|
c
|
|
C1=MAX(-C,C1)
|
|
C2=MIN( C,C2)
|
|
IF (C1.GT.C2) C2=-C
|
|
C PRINT *,2,C1,C2
|
|
RETURN
|
|
END SUBROUTINE C1_C2
|
|
|
|
REAL*8 FUNCTION GAUSINT(X1,X2,A,B,C,D)
|
|
C
|
|
C Let X be stardized Gaussian variable, i.e. X=N(0,1).
|
|
C The function calculate the followin integral E[I(X1<X<X2)(A+BX)(C+DX)],
|
|
C where I(X1<X<X2) is an indicator function of the set {X1<X<X2}.
|
|
C
|
|
IMPLICIT NONE
|
|
REAL*8, intent(in) :: X1,X2,A,B,C,D
|
|
REAL*8 Y1,Y2,Y3
|
|
REAL*8, PARAMETER:: SP = 0.398942280401433d0
|
|
IF(X1.GE.X2) THEN
|
|
GAUSINT=0.0d0
|
|
RETURN
|
|
END IF
|
|
Y1=(A*D+B*C+X1*B*D)*EXP(-0.5d0*X1*X1)
|
|
Y2=(A*D+B*C+X2*B*D)*EXP(-0.5d0*X2*X2)
|
|
Y3=(A*C+B*D)*(FI(X2)-FI(X1))
|
|
GAUSINT=Y3+SP*(Y1-Y2)
|
|
RETURN
|
|
END FUNCTION GAUSINT
|
|
|
|
|
|
SUBROUTINE GAUSS1(N,H1,XX1,XMI,XMA,EPS0)
|
|
USE CHECKMOD
|
|
USE QUADRMOD
|
|
IMPLICIT NONE
|
|
INTEGER, intent(out) :: N
|
|
REAL*8, DIMENSION(24), intent(out) :: H1,XX1
|
|
REAL*8, intent(in) :: XMI,XMA,EPS0
|
|
REAL*8, DIMENSION(24) :: Z1
|
|
REAL*8 SDOT, SDOT1, DIFF1
|
|
INTEGER NNN, J, I1
|
|
! DIMENSION Z1(24),XX1(1),H1(1)
|
|
C DIMENSION Z(126),H(126)
|
|
C DIMENSION NN(25)
|
|
C COMMON/QUADR/ Z,H,NN,NNW
|
|
C COMMON/CHECKQ/ III0
|
|
REAL*8, parameter:: SP= 0.398942280401433d0
|
|
IF (XMA.LT.XMI) THEN
|
|
PRINT *,'Error XMIN>XMAX in GAUSS1 - stop!'
|
|
C STOP
|
|
END IF
|
|
NNN=0
|
|
DO I=1,NNW
|
|
N=NN(I)
|
|
DO J=1,N
|
|
XX1(J)=0.5d0*(Z(NNN+J)*(XMA-XMI)+XMA+XMI)
|
|
Z1(J)=XX1(J)*XX1(J)
|
|
H1(J)=0.5d0*SP*(XMA-XMI)*H(NNN+J)*EXP(-0.5d0*Z1(J))
|
|
ENDDO
|
|
NNN=NNN+N
|
|
SDOT=GAUSINT(XMI,XMA,0.0d0,1.0d0,0.0d0,1.0d0)
|
|
SDOT1=0.d0
|
|
DO I1=1,N
|
|
SDOT1=SDOT1+Z1(I1)*H1(I1)
|
|
ENDDO
|
|
DIFF1=ABS(SDOT-SDOT1)
|
|
IF(EPS0.LT.DIFF1) GO TO 10
|
|
III0=III0+N
|
|
C PRINT *,'N. of nodes',III0
|
|
RETURN
|
|
10 CONTINUE
|
|
ENDDO
|
|
END SUBROUTINE GAUSS1
|
|
|
|
|
|
SUBROUTINE M_COND(Syy_cd,Syyii,Syx_cd,Syy,Syx,ii,N)
|
|
C
|
|
C INPUT:
|
|
C
|
|
C ii IS THE INDEX OF THE TIME ON WHICH WE ARE CONDITIONING.
|
|
C N number of variables in covariance matrix Syy
|
|
C
|
|
C Covariance matrix Syy(I+(J-1)*N)=Cov(Yi,Yj) (is unchanged)
|
|
C Covariance vector Syx(I)=Cov(Yi,X) (is unchanged)
|
|
C
|
|
C OUTPUT:
|
|
C
|
|
C Covariance matrix Syy_cd(I+(J-1)*N)=Cov(Xi,Xj|Xii)
|
|
C Covariance vector Syyii(I)=Cov(Xi,Xii)
|
|
C Covariance vector Syx_cd(I)=Cov(Xi,Y|Xii)
|
|
C Variance Q1=Var(Xii)=Syyii(ii)
|
|
c Obs. If Q1<EPS there is no conditioning
|
|
C
|
|
C M_COND(R1,B1,DB1,R,DB,INF(10),N)
|
|
USE EPSMOD
|
|
USE SIZEMOD
|
|
IMPLICIT NONE
|
|
INTEGER, intent(in) :: II,N
|
|
REAL*8, DIMENSION(RDIM), intent(inout) :: Syy_cd,Syy
|
|
REAL*8, DIMENSION(NMAX), intent(inout) :: Syyii,Syx_cd,Syx
|
|
REAL*8 Q1
|
|
INTEGER I,J
|
|
! DIMENSION Syy_cd(RDIM),Syyii(NMAX),Syx_cd(NMAX),Syy(RDIM),Syx(NMAX)
|
|
C DIMENSION Syy_cd(1),Syyii(1),Syx_cd(1),Syy(1),Syx(1)
|
|
C COMMON /EPS/ EPS,EPSS,CEPSS
|
|
IF (II.LE.0.OR.II.GT.N) THEN
|
|
PRINT *,'The conditioning time in M_COND is out of range, stop!'
|
|
STOP
|
|
END IF
|
|
C
|
|
C Q1=Var(Xii)=Syyii(ii)
|
|
C
|
|
Q1=Syy(II+(II-1)*N)
|
|
IF(Q1.LE.eps) then
|
|
DO I=1,N
|
|
Syyii(I)=0.0d0
|
|
ENDDO
|
|
Q1=1.0d0
|
|
else
|
|
DO I=1,N
|
|
Syyii(I)=Syy(I+(II-1)*N)
|
|
ENDDO
|
|
end if
|
|
DO I=1,N
|
|
DO J=1,N
|
|
Syy_cd(I+(J-1)*N)=Syy(I+(J-1)*N)-Syy(II+(J-1)*N)*Syyii(I)/Q1
|
|
ENDDO
|
|
Syx_cd(I)=Syx(I)-Syx(II)*Syyii(I)/Q1
|
|
ENDDO
|
|
RETURN
|
|
END SUBROUTINE M_COND
|
|
|
|
|
|
|
|
REAL*8 FUNCTION PMEAN(XX,SS)
|
|
C
|
|
C PMEAN is the positive mean of a Gaussian variable with mean XX and
|
|
C standart deviation SS, i.e. PMEAN=SS*FIFUNK(XX/SS), where
|
|
C FIFUNK(x)=f(x)+x*FI(x), f and FI are density and distribution
|
|
C functions of N(0,1) variable, respectively. We have modified the
|
|
C algorithm 209 from CACAM for evaluation of FIFUNK, to avoid the operations
|
|
C of type SS*XX/SS, which can give numerical errors when SS and XX are
|
|
C both small.
|
|
C
|
|
C ** NUMERICAL ACCURACY **
|
|
C
|
|
C
|
|
C Obs. that, our general assumption is that the process is normalized, i.e.
|
|
C Var (X(t)) = Var (X'(t)) = 1.0d0 Consequently all conditional variances
|
|
C are less than 1, and usualy close to zero, i.e. SS<1.0d0. Now since SS<1.0d0
|
|
C and FIFUNK(x)<0.0000001 for x<-4.5 we have defined FIFUNK(x)=0.0d0
|
|
C if x<-4.5 and FIFUNK(x)=x if x>
|
|
C 4.5. Under we have a table with
|
|
C exact values of FIFUNK.
|
|
C
|
|
C x FIFUNK(x)
|
|
C
|
|
C -5.0 0.00000005233
|
|
C -4.5 0.00000069515
|
|
C -4.0 0.00000711075
|
|
C 4.0 4.00000700000
|
|
C 4.5 4.50000100000
|
|
C
|
|
C Obviously the tresholds -4.5 and 4.5 can be increased.
|
|
C
|
|
C
|
|
IMPLICIT NONE
|
|
REAL*8, intent(in) :: XX, SS
|
|
REAL*8 X,Y,W,Z
|
|
REAL*8, parameter :: SP = 0.398942280401433d0
|
|
IF(XX.LT.4.5d0*SS) GO TO 1
|
|
PMEAN=XX
|
|
RETURN
|
|
1 IF(XX.GT.-4.5d0*SS) GO TO 3
|
|
PMEAN=0.0d0
|
|
RETURN
|
|
3 continue
|
|
if (SS .LT. 0.0000001d0) then
|
|
PMEAN=0.0d0
|
|
RETURN
|
|
end if
|
|
|
|
X=XX/SS
|
|
|
|
IF(X==0) goto 8
|
|
Y=0.5d0*ABS(X)
|
|
IF(Y<1.0d0) then
|
|
W=Y*Y
|
|
Z=((((((((0.000124818987d0*W-0.001075204047d0)*W
|
|
1 +0.005198775019d0)*W-0.019198292d0)*W+0.05905403564d0)*W
|
|
2 -0.15196875136d0)*W+0.3191529327d0)*W-0.5319230073d0)*W
|
|
3 +0.7978845606d0)*Y*2.0d0
|
|
else
|
|
Y=Y-2.0d0
|
|
Z=(((((((((((((-0.000045255659d0*Y+0.00015252929d0)*Y
|
|
* -0.000019538132d0)*Y-0.000676904986d0)*Y
|
|
1 +0.001390604284d0)*Y-0.000794620820d0)*Y
|
|
2 -0.002034254874d0)*Y+0.006549791214d0)*Y-0.010557625006d0)*Y+
|
|
3 0.011630447319d0)*Y-0.009279453341d0)*Y+0.005353579108d0)*Y-
|
|
4 0.002141268741d0)*Y+0.000535310849d0)*Y+0.9999366575d0
|
|
endif
|
|
IF(X.GT.0.0d0) PMEAN=SS*SP*EXP(-0.5d0*X*X)+XX*0.5d0*(Z+1.0d0)
|
|
IF(X.LT.0.0d0) PMEAN=SS*SP*EXP(-0.5d0*X*X)+XX*0.5d0*(1.0d0-Z)
|
|
RETURN
|
|
8 PMEAN=SS*SP
|
|
RETURN
|
|
END FUNCTION PMEAN
|
|
|
|
|
|
REAL*8 FUNCTION FI(XX)
|
|
C
|
|
C Algorithm 209 from CACAM.
|
|
C FI(xx) is a distribution functions of N(0,1) variable.
|
|
C
|
|
IMPLICIT NONE
|
|
REAL*8, intent(in) :: XX
|
|
REAL*8 X, Y,Z, W
|
|
X=XX
|
|
IF(X==0) then
|
|
FI=0.5d0
|
|
RETURN
|
|
endif
|
|
Y=0.5d0*ABS(X)
|
|
IF(Y>3.0d0) then
|
|
IF(X.GT.0.0d0) FI=1.0d0
|
|
IF(X.LT.0.0d0) FI=0.0d0
|
|
RETURN
|
|
endif
|
|
IF (Y<1.0d0) then
|
|
W=Y*Y
|
|
Z=((((((((0.000124818987d0*W-0.001075204047d0)*W
|
|
1 +0.005198775019d0)*W-0.019198292d0)*W+0.05905403564d0)*W
|
|
2 -0.15196875136d0)*W+0.3191529327d0)*W-0.5319230073d0)*W
|
|
3 +0.7978845606d0)*Y*2.0d0
|
|
ELSE
|
|
Y=Y-2.0d0
|
|
Z=(((((((((((((-0.000045255659d0*Y+0.00015252929d0)*Y
|
|
1 -0.000019538132d0)*Y-0.000676904986d0)*Y+0.001390604284d0)*Y
|
|
2 -0.000794620820d0)*Y-0.002034254874d0)*Y+0.006549791214d0)*Y
|
|
3 -0.010557625006d0)*Y+0.011630447319d0)*Y-0.009279453341d0)*Y
|
|
4 +0.005353579108d0)*Y-0.002141268741d0)*Y+0.000535310849d0)*Y
|
|
5 +0.9999366575d0
|
|
endif
|
|
100 IF(X.GT.0.0d0) FI=0.5d0*(Z+1.0d0)
|
|
IF(X.LT.0.0d0) FI=0.5d0*(1.0d0-Z)
|
|
RETURN
|
|
END FUNCTION FI
|
|
|
|
C Version 1991-XII-14
|
|
|
|
C The MREG program.
|
|
C
|
|
C
|
|
C We consider a process X(I)=X(T(I)) at the grid of N points T(1),...,T(N),
|
|
C
|
|
C X(I) = -A(I) + Z*A(I+N) + Sum Xj*A(I+(j+1)*N) + Delta(I),
|
|
C
|
|
C the sum disapears if M=1, j=1,...,M-1. We assume that Z,Xj are independend
|
|
C standart Rayleigh, Gaussian distributed rv. and independent of the zero
|
|
C mean Gaussian residual process, with covariance structure given in R,
|
|
C
|
|
C R(i+(j-1)N) = Cov (Delta(T(i)), Delta(T(j))).
|
|
C
|
|
C Additionally we have a zero mean Gaussian variable XN,
|
|
C independent of Z,Xj with covariance structure defined by
|
|
C B(i)= Cov (Delta(T(i)),XN), i=1,...,N, B(N+1)=Var(XN).
|
|
C Furthermore XN and Z,Xj satisfies the following equation system
|
|
C
|
|
C (BB + (XN,0,...,0)^T = AA*(Z,X1,...,Xm-1)^T (***)
|
|
C
|
|
C where AA is (M,M) matrix, BB is M-vector. We rewrite this equation, by
|
|
C introducing a variable X_M=XN/SQRT(XN) and construct new matrix AA1
|
|
c by adding the column (SQRT(Var(XN)),0,...,0) and the row with only zeros.
|
|
C The equations (***) writtes
|
|
C
|
|
C (BB,0)^T = AA1*(Z,X1,...,Xm-1,Xm)^T (****)
|
|
C
|
|
C where AA1 is (M+1,M+1) matrix, We assume that the rank of AA1 is M,
|
|
C otherwise the density is singular and we give a output F=0.CC
|
|
C
|
|
C Let Y0 be a zero-mean Gaussian variable independent of Z,Xj
|
|
C with covariance structure defined by
|
|
C DB(i)= Cov (Delta(T(i)),Y0), i=1,...,N, DB(N+1)=Cov(XN,Y0), Var(Y0)=VDER.
|
|
C Let Y be defined by
|
|
C
|
|
C Y=-DA(1) + Z*DA(2) + Sum Xj*DA(2+j) +Y0,
|
|
C
|
|
C j=1,...,M-1. The program computes:
|
|
C
|
|
C F = E[ Y^+ *1{ HH<X(I)<0 for all I, I=1,...,N}|Z,X1,...,X_M-1 solves (***)]
|
|
C *f_{Z,X1,....,XM-1}(***).
|
|
C
|
|
C In the simplest case NIT=0 we define (Delta(1),...,Delta(N),XN)=0.0d0
|
|
C
|
|
C We renormalize vectors AN and DA, the covariance fkn R, DB
|
|
C and VDER. Then by renormalization we choose the Gaussian variable X such
|
|
C that F is written in the form
|
|
C
|
|
C F = E[(D0(1)+X*D0(2)+Y1)^+*(PC+X*PD)^+*1{HH <A0(I)+X*B0(I)+Delta1(I)<0}]
|
|
C
|
|
C Observe, PC+X*PD>0 defines integration region for X.
|
|
C In the simplest case NIT=0 we define (Delta(1),...,Delta(N),Y1)=0.0d0
|
|
C For NIT=1 only (Delta(1),...,Delta(N))=0, i.e. we have to compute
|
|
C a one dimensional integral. Finally by conditioning on X the problem is
|
|
C put in the format of RIND-problem.
|
|
C
|
|
C INF indicates whether one
|
|
C has already called the subroutine before and ONLY! inputs BB, DA or A
|
|
C was changed.
|
|
C
|
|
C Observe the limitations are : N<=100, 0<M <= 5 = MMAX.
|
|
C
|
|
C revised pab 2007
|
|
C - replaced all common blocks with modules
|
|
C - fixed some bugs
|
|
|
|
SUBROUTINE MREG(F,R,B,DB,AA,BB,A,DA,VDER,M,N,NIT,INFR)
|
|
USE SIZEMOD
|
|
USE EPSMOD
|
|
USE RINTMOD
|
|
USE INFCMOD
|
|
USE SVD
|
|
IMPLICIT NONE
|
|
! INTEGER, PARAMETER :: MMAX = 5, NMAX = 101, RDIM = 10201
|
|
INTEGER, PARAMETER :: Nw = MMAX+1
|
|
INTEGER, intent(in) :: M,N,NIT,INFR
|
|
REAL*8, intent(in) :: VDER
|
|
REAL*8, intent(inout) :: F
|
|
REAL*8, intent(inout) :: R(RDIM),B(NMAX),DB(NMAX),BB(Nw)
|
|
REAL*8, intent(inout) :: A(Nw*NMAX),DA(Nw),AA(MMAX-2,MMAX-2)
|
|
REAL*8, DIMENSION(Nw), save :: AO, DA0, W1, E1
|
|
REAL*8, DIMENSION(Nw,Nw), save :: AA1, U1,V1
|
|
REAL*8, DIMENSION(NMAX), save :: DB1, SQ
|
|
REAL*8, DIMENSION(RDIM), save :: R1
|
|
REAL*8, DIMENSION(Nw*NMAX), save :: A1
|
|
REAL*8, DIMENSION(NMAX) :: A0,B0,B1
|
|
REAL*8, DIMENSION(24) :: XX1,H1
|
|
REAL*8, DIMENSION(2) :: D0
|
|
REAL*8, save :: QD, DB1N,VDER1,SQD, SDER1,DET1
|
|
REAL*8 XIND, DB0N,FR1, XR1,XMI,XMA
|
|
REAL*8 CC, PC, PD, P, X
|
|
INTEGER INF1, I, I1, J, N1,I2,infoID
|
|
INTEGER, save :: IDET, NNIT
|
|
C DIMENSION AA1(6,6),V1(6,6)
|
|
C DIMENSION W1(6),AO(6),DA0(6)
|
|
C DIMENSION A0(2*Nmax),B0(2*Nmax),B1(2*Nmax),DB1(2*Nmax)
|
|
! DIMENSION D0(2)
|
|
! DIMENSION XX1(24),H1(24)
|
|
C COMMON /EPS/EPS,EPSS,CEPSS
|
|
C COMMON/RINT/ C,FC
|
|
C
|
|
C If INFR=0 we have to initiate conditioning and renormalization transf.
|
|
C
|
|
INF1=0
|
|
F=0.0d0
|
|
IF (N.LT.0) RETURN
|
|
IF (N.EQ.0) GO TO 2
|
|
DO I=1,N
|
|
DO I1=1,M+1
|
|
A1(I+(I1-1)*N)=A(I+(I1-1)*N)
|
|
ENDDO
|
|
ENDDO
|
|
2 CONTINUE
|
|
DO I=1,M+1
|
|
DA0(I)=DA(I)
|
|
ENDDO
|
|
|
|
C
|
|
C Renormalization
|
|
C
|
|
IF (INFR.EQ.1) GO TO 105
|
|
NNIT=MIN(NIT,N)
|
|
|
|
DO i=1,n
|
|
SQ(i)=0.0d0
|
|
ENDDO
|
|
|
|
DO I=1,M
|
|
DO J=1,M
|
|
AA1(I,J)=AA(I,J)
|
|
ENDDO
|
|
ENDDO
|
|
NNIT=MIN(NIT,N)
|
|
|
|
QD =B(N+1)
|
|
DB1N =DB(N+1)
|
|
VDER1=VDER
|
|
|
|
IF(QD.le.eps) then
|
|
|
|
DB1N = 0.0d0
|
|
SQD = 0.0d0
|
|
NNIT = 0
|
|
DO I=1,N
|
|
DB1(I) = DB(I)
|
|
A1(I+(M+1)*N)=0.0d0
|
|
SQ(I) = 0.0d0
|
|
ENDDO
|
|
|
|
else
|
|
SQD = SQRT(QD)
|
|
VDER1 = VDER1-DB1N*DB1N/QD
|
|
DB1N = DB1N/SQD
|
|
DO I=1,N
|
|
DB1(I) = DB(I)-DB(N+1)*(B(I)/QD)
|
|
A1(I+(M+1)*N) = B(I)/SQD
|
|
ENDDO
|
|
end if
|
|
|
|
SDER1 = 0.0d0
|
|
IF (VDER1.GT.EPS) SDER1=SQRT(VDER1)
|
|
C print *,'sqd,SDER1',sqd,SDER1
|
|
C PAB: BUG DA0 M+2 can be larger than NW = MMAX+1
|
|
DA0(M+2) = DB1N
|
|
BB(M+1) = 0.0d0
|
|
|
|
|
|
AA1(1,M+1)=SQD
|
|
DO I=1,M
|
|
AA1(I+1,M+1)=0.0d0
|
|
AA1(M+1,I)=0.0d0
|
|
ENDDO
|
|
! New call to avoid calling Numerical recipess SVDCMP
|
|
CALL dsvdc(AA1,M+1,M+1,W1, E1, U1, V1, 11, infoID)
|
|
! CALL SVDCMP(AA1,M+1,M+1,NW,NW,W1,V1)
|
|
|
|
|
|
DET1 = 1.0d0
|
|
idet = 0
|
|
DO I=1,M+1
|
|
IF ( W1(I).LT.0.00001d0 ) THEN
|
|
idet = idet+1
|
|
W1(I) = 0.0d0
|
|
DO J=1,M+1
|
|
AO(J)=V1(J,I)
|
|
ENDDO
|
|
GO TO 35
|
|
END IF
|
|
DET1=DET1*W1(I)
|
|
35 CONTINUE
|
|
ENDDO
|
|
C print *,'det1',det1
|
|
|
|
IF(DET1.LT.0.001d0) NNIT=0
|
|
c
|
|
c Obs. QD can not be small since NNIT>0
|
|
c
|
|
IF (NNIT.GT.1) THEN
|
|
DO I=1,N
|
|
XR1=R(I+(I-1)*N)-B(I)*(B(I)/QD)
|
|
IF(XR1.GT.EPS) THEN
|
|
SQ(I)=SQRT(XR1)
|
|
ENDIF
|
|
ENDDO
|
|
|
|
DO I=1,N
|
|
DO J=1,N
|
|
R1(J+(I-1)*N)=R(J+(I-1)*N)-B(I)*(B(J)/QD)
|
|
ENDDO
|
|
ENDDO
|
|
|
|
|
|
END IF
|
|
|
|
|
|
105 CONTINUE
|
|
if (idet.gt.1) return
|
|
C
|
|
C Renormalization is done
|
|
C
|
|
CALL R_ORT(CC,PC,PD,U1,V1,W1,AO,BB,A1,A0,B0,DA0,D0,DET1,M+1,N)
|
|
IF(CC.LT.0.0d0) RETURN
|
|
XMI=-C
|
|
XMA= C
|
|
IF(ABS(PD).LE.EPS.AND.PC.LT.0.0d0) RETURN
|
|
IF(ABS(PD).LE.EPS) GO TO 102
|
|
X=-PC/PD
|
|
IF(PD.GT.0.0d0.AND.XMI.LT.X) XMI=X
|
|
IF(PD.LT.0.0d0.AND.XMA.GT.X) XMA=X
|
|
102 CONTINUE
|
|
c PRINT *,'XMI,XMA',XMI,XMA
|
|
IF(NNIT.eq.1.AND.IAC.LT.1.OR.NNIT.eq.0.OR.XMI.GE.XMA) THEN
|
|
CALL C1_C2(XMI,XMA,A0,B0,D0(1),D0(2),0.0d0,SQ,N)
|
|
c PRINT *,'XMI,XMA',XMI,XMA
|
|
F=GAUSINT(XMI,XMA,D0(1),D0(2),PC,PD)*CC
|
|
c print *,'return',f,cc
|
|
RETURN
|
|
END IF
|
|
C
|
|
C ***********************************************************
|
|
C
|
|
C We shall condition on the values of X, XMI<X<XMA, but for some
|
|
C X values XIND will be zero leading to reduced accuracy. Hence we try
|
|
C to exclude them and narrow the interval [XMI,XMA]
|
|
c
|
|
c PRINT *,XMI,XMA
|
|
|
|
CALL C1_C2(XMI,XMA,A0,B0,D0(1),D0(2),SDER1,SQ,N)
|
|
c PRINT *,XMI,XMA
|
|
IF(FI(XMA)-FI(XMI).LT.EPSS) RETURN
|
|
CALL GAUSS1(N1,H1,XX1,XMI,XMA,EPS0)
|
|
DO I2=1,N1
|
|
FR1=CC*H1(I2)*(PC+XX1(I2)*PD)
|
|
DO I=1,N
|
|
B1(I)=A0(I)+XX1(I2)*B0(I)
|
|
ENDDO
|
|
DB0N=D0(1)+XX1(I2)*D0(2)
|
|
|
|
C
|
|
C INF1=1 means that both R1 and SQ are the same as in the previous
|
|
C call of TWOREG subroutine, INF=0 indicates the new R and SQ.
|
|
c
|
|
c print *,'go in rind'
|
|
CALL RIND(XIND,R1,B1,DB0N,DB1,SQ,VDER1,NNIT-1,N,INF1)
|
|
c if (n.gt.29) print *,XIND,DB0N,VDER1,b1(N),b1(n-1)
|
|
INF1=1
|
|
F=F+FR1*XIND
|
|
ENDDO
|
|
RETURN
|
|
END SUBROUTINE MREG
|
|
|
|
|
|
|
|
SUBROUTINE R_ORT(C,PC,PD,U1,V1,W1,AO,BB,A0,A,B,DA,D0,DET,M,N)
|
|
USE EXPACCMOD
|
|
USE SIZEMOD
|
|
IMPLICIT NONE
|
|
INTEGER, PARAMETER :: Nw = MMAX+1
|
|
INTEGER, intent(in) :: M,N
|
|
REAL*8, DIMENSION(Nw,Nw), intent(inout) :: U1, V1
|
|
REAL*8, DIMENSION(Nw ), intent(inout) :: W1,AO,BB, DA
|
|
REAL*8, DIMENSION(Nw*NMAX), intent(inout):: A0
|
|
REAL*8, DIMENSION(NMAX), intent(inout) :: A, B
|
|
REAL*8, DIMENSION(2), intent(inout) :: D0
|
|
REAL*8, intent(inout):: C,PC,PD,DET
|
|
REAL*8, DIMENSION(Nw ) :: XO
|
|
REAL*8 DER0,DER1,P
|
|
INTEGER I,J
|
|
|
|
|
|
C COMMON/EXPACC/PMAX
|
|
REAL*8, parameter :: SP = 0.398942280401433d0
|
|
C=-999.
|
|
CALL SVBKSB(U1,W1,V1,M,M,Nw,Nw,BB,XO)
|
|
P = 0.0d0
|
|
DER0 = -DA(1)
|
|
DER1 = 0.0d0
|
|
DO I=1,M
|
|
P = P + XO(I) * XO(I)
|
|
DER0 = DER0 + XO(I) * DA(I+1)
|
|
DER1 = DER1 + AO(I) * DA(I+1)
|
|
ENDDO
|
|
IF (P.GT.PMAX) RETURN
|
|
C=(SP**(M-2))*EXP(-0.5d0*P)/ABS(DET)
|
|
c print *,'XO',XO(1),XO(2),XO(3),XO(4)
|
|
c print *,'AO',AO(1),AO(2),AO(3),AO(4)
|
|
if(N.lt.1) go to 100
|
|
DO I=1,N
|
|
A(I) = -A0(I)
|
|
B(I) = 0.0d0
|
|
DO J=1,M
|
|
B(I) = B(I)+AO(J)*A0(I+J*N)
|
|
A(I) = A(I)+XO(J)*A0(I+J*N)
|
|
ENDDO
|
|
ENDDO
|
|
100 continue
|
|
D0(1)=DER0
|
|
D0(2)=DER1
|
|
PC=XO(1)
|
|
PD=AO(1)
|
|
RETURN
|
|
END SUBROUTINE R_ORT
|
|
|
|
|
|
REAL*8 FUNCTION pythag(a,b)
|
|
IMPLICIT NONE
|
|
REAL*8, intent(in) :: a,b
|
|
REAL*8 absa,absb
|
|
absa=abs(a)
|
|
absb=abs(b)
|
|
IF (absa.GT.absb) THEN
|
|
pythag=absa*SQRT(1.0d0+(absb/absa)**2)
|
|
ELSE
|
|
IF (absb.EQ.0.0d0) THEN
|
|
pythag=0.0d0
|
|
ELSE
|
|
pythag=absb*SQRT(1.0d0+(absa/absb)**2)
|
|
ENDIF
|
|
ENDIF
|
|
RETURN
|
|
END FUNCTION PYTHAG
|
|
|
|
|
|
SUBROUTINE SVBKSB(U,W,V,M,N,MP,NP,B,X)
|
|
C
|
|
C Solves AX=B for a vector X, where A is specified by the arrays
|
|
C U, W, V as returned by SVDCMP. M and N are the logical
|
|
C dimensions of A, and will be equal for a square matrices. MP and NP
|
|
C are the physical dimensions of A. B is the input right-hand side.
|
|
C X is the output solution vector. No input quantities are destroyed,
|
|
C so the routine may be called sequentialy with different B's.
|
|
C
|
|
USE SIZEMOD
|
|
IMPLICIT NONE
|
|
C INTEGER, PARAMETER :: NMAX=100
|
|
C Maximum anticipated value of N
|
|
INTEGER, intent(in) :: M,N,MP,NP
|
|
INTEGER :: J,I,JJ
|
|
REAL*8, intent(inout) :: U,W,V,B,X
|
|
REAL*8 TMP, S
|
|
DIMENSION U(MP,NP),W(NP),V(NP,NP),B(MP),X(NP),TMP(NMAX)
|
|
DO J=1,N
|
|
C Cumulate U^T*B
|
|
S=0.0d0
|
|
IF (W(J).NE.0.0d0) THEN
|
|
C Nonzero rezult only if wj is nonzero
|
|
DO I=1,M
|
|
S=S+U(I,J)*B(I)
|
|
ENDDO
|
|
S=S/W(J)
|
|
C This is the divide by wj
|
|
ENDIF
|
|
TMP(J)=S
|
|
ENDDO
|
|
DO J=1,N
|
|
S=0.0d0
|
|
DO JJ=1,N
|
|
S=S+V(J,JJ)*TMP(JJ)
|
|
ENDDO
|
|
X(J)=S
|
|
ENDDO
|
|
RETURN
|
|
END SUBROUTINE SVBKSB
|
|
|
|
|
|
|
|
SUBROUTINE SVDCMP(A,M,N,MP,NP,W,V)
|
|
C
|
|
C Given a matrix A, with logical dimensions M by N and physical
|
|
C dimensions MP by NP, this routine computes its singular value
|
|
C decomposition, A=U.W.V^T, see Numerical Recipes, by Press W.,H.
|
|
C Flannery, B. P., Teukolsky S.A. and Vetterling W., T. Cambrige
|
|
C University Press 1986, Chapter 2.9. The matrix U replaces A on
|
|
C output. The diagonal matrix of singular values W is ouyput as a vector
|
|
C W. The matrix V (not the transpose V^T) is output as V. M must be
|
|
C greater or equal to N; if it is smaller, then A should be filled up
|
|
C to square with zero rows.
|
|
C
|
|
USE SIZEMOD
|
|
IMPLICIT NONE
|
|
C PARAMETER (NMAX=100)
|
|
INTEGER, intent(in) :: M,N,MP,NP
|
|
INTEGER :: I,L,K,J, ITS, NM
|
|
REAL*8, intent(inout) :: A,W,V
|
|
REAL*8 RV1,G, S,SCALE,ANORM, F,H, C, Y,Z,X
|
|
C Maximum anticipated values of N
|
|
DIMENSION A(MP,NP),W(NP),V(NP,NP),RV1(NMAX)
|
|
IF(M.LT.N) THEN
|
|
print *, 'You must augment A with extra zero rows. stop'
|
|
stop
|
|
ENDIF
|
|
C Householder reduction to bidiagonal form
|
|
G=0.0d0
|
|
SCALE=0.0d0
|
|
ANORM=0.0
|
|
DO I=1,N
|
|
L=I+1
|
|
RV1(I)=SCALE*G
|
|
G=0.0d0
|
|
S=0.0d0
|
|
SCALE=0.0d0
|
|
IF (I.LE.M) THEN
|
|
DO K=I,M
|
|
SCALE=SCALE+ABS(A(K,I))
|
|
ENDDO
|
|
IF (SCALE.NE.0.0d0) THEN
|
|
DO K=I,M
|
|
A(K,I)=A(K,I)/SCALE
|
|
S=S+A(K,I)*A(K,I)
|
|
ENDDO
|
|
F=A(I,I)
|
|
G=-SIGN(SQRT(S),F)
|
|
H=F*G-S
|
|
A(I,I)=F-G
|
|
IF (I.NE.N) THEN
|
|
DO J=L,N
|
|
S=0.0d0
|
|
DO K=I,M
|
|
S=S+A(K,I)*A(K,J)
|
|
ENDDO
|
|
F=S/H
|
|
DO K=I,M
|
|
A(K,J)=A(K,J)+F*A(K,I)
|
|
ENDDO
|
|
ENDDO
|
|
ENDIF
|
|
DO K=I,M
|
|
A(K,I)=SCALE*A(K,I)
|
|
ENDDO
|
|
ENDIF
|
|
ENDIF
|
|
W(I)=SCALE*G
|
|
G=0.0d0
|
|
S=0.0d0
|
|
SCALE=0.0d0
|
|
IF ((I.LE.M).AND.(I.NE.N)) THEN
|
|
DO K=L,N
|
|
SCALE=SCALE+ABS(A(I,K))
|
|
ENDDO
|
|
IF (SCALE.NE.0.0d0) THEN
|
|
DO K=L,N
|
|
A(I,K)=A(I,K)/SCALE
|
|
S=S+A(I,K)*A(I,K)
|
|
ENDDO
|
|
F=A(I,L)
|
|
G=-SIGN(SQRT(S),F)
|
|
H=F*G-S
|
|
A(I,L)=F-G
|
|
DO K=L,N
|
|
RV1(K)=A(I,K)/H
|
|
ENDDO
|
|
IF (I.NE.M) THEN
|
|
DO J=L,M
|
|
S=0.0d0
|
|
DO K=L,N
|
|
S=S+A(J,K)*A(I,K)
|
|
ENDDO
|
|
DO K=L,N
|
|
A(J,K)=A(J,K)+S*RV1(K)
|
|
ENDDO
|
|
ENDDO
|
|
ENDIF
|
|
DO K=L,N
|
|
A(I,K)=SCALE*A(I,K)
|
|
ENDDO
|
|
ENDIF
|
|
ENDIF
|
|
ANORM=MAX(ANORM,(ABS(W(I))+ABS(RV1(I))))
|
|
ENDDO
|
|
c print *,'25'
|
|
C Accumulation of right-hand transformations.
|
|
DO I=N,1,-1
|
|
IF (I.LT.N) THEN
|
|
IF (G.NE.0.0d0) THEN
|
|
DO J=L,N
|
|
V(J,I)=(A(I,J)/A(I,L))/G
|
|
C Double division to avoid posible underflow.
|
|
ENDDO
|
|
DO J=L,N
|
|
S=0.0d0
|
|
DO K=L,N
|
|
S=S+A(I,K)*V(K,J)
|
|
ENDDO
|
|
DO K=L,N
|
|
V(K,J)=V(K,J)+S*V(K,I)
|
|
ENDDO
|
|
ENDDO
|
|
ENDIF
|
|
DO J=L,N
|
|
V(I,J)=0.0d0
|
|
V(J,I)=0.0d0
|
|
ENDDO
|
|
ENDIF
|
|
V(I,I)=1.0d0
|
|
G=RV1(I)
|
|
L=I
|
|
32 ENDDO
|
|
c print *,'32'
|
|
|
|
C Accumulation of the left-hang transformation
|
|
DO I=N,1,-1
|
|
L=I+1
|
|
G=W(I)
|
|
IF (I.LT.N) THEN
|
|
DO J=L,N
|
|
A(I,J)=0.0d0
|
|
ENDDO
|
|
ENDIF
|
|
IF (G.NE.0.0d0) THEN
|
|
G=1.0d0/G
|
|
IF (I.NE.N) THEN
|
|
DO J=L,N
|
|
S=0.0d0
|
|
DO K=L,M
|
|
S=S+A(K,I)*A(K,J)
|
|
ENDDO
|
|
F=(S/A(I,I))*G
|
|
DO K=I,M
|
|
A(K,J)=A(K,J)+F*A(K,I)
|
|
ENDDO
|
|
ENDDO
|
|
ENDIF
|
|
DO J=I,M
|
|
A(J,I)=A(J,I)*G
|
|
37 ENDDO
|
|
ELSE
|
|
DO J=I,M
|
|
A(J,I)=0.0d0
|
|
38 ENDDO
|
|
ENDIF
|
|
A(I,I)=A(I,I)+1.0d0
|
|
39 ENDDO
|
|
c print *,'39'
|
|
|
|
C Diagonalization of the bidiagonal form
|
|
C Loop over singular values
|
|
DO K=N,1,-1
|
|
C Loop allowed iterations
|
|
DO ITS=1,30
|
|
C Test for spliting
|
|
DO L=K,1,-1
|
|
NM=L-1
|
|
C Note that RV1(1) is always zero
|
|
IF((ABS(RV1(L))+ANORM).EQ.ANORM) GO TO 2
|
|
IF((ABS(W(NM))+ANORM).EQ.ANORM) GO TO 1
|
|
ENDDO
|
|
c print *,'41'
|
|
1 C=0.0d0
|
|
S=1.0d0
|
|
DO I=L,K
|
|
F=S*RV1(I)
|
|
IF ((ABS(F)+ANORM).NE.ANORM) THEN
|
|
G=W(I)
|
|
H=SQRT(F*F+G*G)
|
|
W(I)=H
|
|
H=1.0d0/H
|
|
C= (G*H)
|
|
S=-(F*H)
|
|
DO J=1,M
|
|
Y=A(J,NM)
|
|
Z=A(J,I)
|
|
A(J,NM)=(Y*C)+(Z*S)
|
|
A(J,I)=-(Y*S)+(Z*C)
|
|
ENDDO
|
|
ENDIF
|
|
ENDDO
|
|
c print *,'43'
|
|
2 Z=W(K)
|
|
IF (L.EQ.K) THEN
|
|
C Convergence
|
|
IF (Z.LT.0.0d0) THEN
|
|
C Singular values are made nonnegative
|
|
W(K)=-Z
|
|
DO J=1,N
|
|
V(J,K)=-V(J,K)
|
|
ENDDO
|
|
ENDIF
|
|
GO TO 3
|
|
ENDIF
|
|
IF (ITS.EQ.30) THEN
|
|
print *, 'No convergence in 30 iterations. stop.'
|
|
stop
|
|
ENDIF
|
|
X=W(L)
|
|
NM=K-1
|
|
Y=W(NM)
|
|
G=RV1(NM)
|
|
H=RV1(K)
|
|
F=((Y-Z)*(Y+Z)+(G-H)*(G+H))/(2.0*H*Y)
|
|
G=SQRT(F*F+1.0d0)
|
|
F=((X-Z)*(X+Z)+H*((Y/(F+SIGN(G,F)))-H))/X
|
|
C Next QR transformation
|
|
C=1.0d0
|
|
S=1.0d0
|
|
DO J=L,NM
|
|
I=J+1
|
|
G=RV1(I)
|
|
Y=W(I)
|
|
H=S*G
|
|
G=C*G
|
|
Z=SQRT(F*F+H*H)
|
|
RV1(J)=Z
|
|
C=F/Z
|
|
S=H/Z
|
|
F= (X*C)+(G*S)
|
|
G=-(X*S)+(G*C)
|
|
H=Y*S
|
|
Y=Y*C
|
|
DO NM=1,N
|
|
X=V(NM,J)
|
|
Z=V(NM,I)
|
|
V(NM,J)= (X*C)+(Z*S)
|
|
V(NM,I)=-(X*S)+(Z*C)
|
|
ENDDO
|
|
c print *,'45',F,H
|
|
Z=pythag(F,H)
|
|
W(J)=Z
|
|
C Rotation can be arbitrary if Z=0.
|
|
IF (Z.NE.0.0d0) THEN
|
|
c print *,1/Z
|
|
Z=1.0d0/Z
|
|
c print *,'*'
|
|
C=F*Z
|
|
S=H*Z
|
|
ENDIF
|
|
F= (C*G)+(S*Y)
|
|
X=-(S*G)+(C*Y)
|
|
DO NM=1,M
|
|
Y=A(NM,J)
|
|
Z=A(NM,I)
|
|
A(NM,J)= (Y*C)+(Z*S)
|
|
A(NM,I)=-(Y*S)+(Z*C)
|
|
ENDDO
|
|
c print *,'46'
|
|
|
|
ENDDO
|
|
c print *,'47'
|
|
RV1(L)=0.0d0
|
|
RV1(K)=F
|
|
W(K)=X
|
|
ENDDO
|
|
3 CONTINUE
|
|
ENDDO
|
|
c print *,'49'
|
|
|
|
RETURN
|
|
END SUBROUTINE SVDCMP
|
|
|
|
END MODULE MREGMOD
|
|
|
|
|