⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cbess00_cpp.txt

📁 BESSEL PROGRAMS IN C/C
💻 TXT
📖 第 1 页 / 共 3 页
字号:
      CSI = P2I;
      for (I=1; I<=K; I++) {
        A1 = FKS - FK;
        AK = (FKS+FK)/(A1+FHS);
        RAK = 2.0/(FK+CONER);
        CBR = (FK+ZR)*RAK;
        CBI = ZI*RAK;
        PTR = P2R;
        PTI = P2I;
        P2R = (PTR*CBR-PTI*CBI-P1R)*AK;
        P2I = (PTI*CBR+PTR*CBI-P1I)*AK;
        P1R = PTR;
        P1I = PTI;
        CSR = CSR + P2R;
        CSI = CSI + P2I;
        FKS = A1 - FK + CONER;
        FK = FK - CONER;
      }
/*----------------------------------------------------------------------
!     COMPUTE (P2/CS)=(P2/CABS(CS))*(CONJG(CS)/CABS(CS)) FOR BETTER
!     SCALING
!---------------------------------------------------------------------*/
      TM = ZABS(CSR,CSI);
      PTR = 1.0/TM;
      S1R = P2R*PTR;
      S1I = P2I*PTR;
      CSR = CSR*PTR;
      CSI = -CSI*PTR;
      ZMLT(COEFR, COEFI, S1R, S1I, &STR, &STI);
      ZMLT(STR, STI, CSR, CSI, &S1R, &S1I);
      if (INU > 0 || N > 1) goto e200;
      ZDR = ZR;
      ZDI = ZI;
      if (IFLAG == 1) goto e270;
      goto e240;
/*----------------------------------------------------------------------
!     COMPUTE P1/P2=(P1/CABS(P2)*CONJG(P2)/CABS(P2) FOR SCALING
!---------------------------------------------------------------------*/
e200: TM = ZABS(P2R,P2I);
      PTR = 1.0/TM;
      P1R = P1R*PTR;
      P1I = P1I*PTR;
      P2R = P2R*PTR;
      P2I = -P2I*PTR;
      ZMLT(P1R, P1I, P2R, P2I, &PTR, &PTI);
      STR = DNU + 0.5 - PTR;
      STI = -PTI;
      ZDIV(STR, STI, ZR, ZI, &STR, &STI);
      STR = STR + 1.0;
      ZMLT(STR, STI, S1R, S1I, &S2R, &S2I);
/*----------------------------------------------------------------------
!     FORWARD RECURSION ON THE THREE TERM RECURSION WITH RELATION WITH
!     SCALING NEAR EXPONENT EXTREMES ON KFLAG=1 OR KFLAG=3
!---------------------------------------------------------------------*/
e210: STR = DNU + 1.0;
      CKR = STR*RZR;
      CKI = STR*RZI;
      if (N == 1)  INU -= 1;
      if (INU > 0) goto e220;
      if (N > 1) goto e215;
      S1R = S2R;
      S1I = S2I;
e215: ZDR = ZR;
      ZDI = ZI;
      if (IFLAG == 1) goto e270;
      goto e240;
e220: INUB = 1;
      if (IFLAG == 1) goto e261;
e225: P1R = CSRR[KFLAG];
      ASCLE = BRY[KFLAG];
      for (I=INUB; I<=INU; I++) {
        STR = S2R;
        STI = S2I;
        S2R = CKR*STR - CKI*STI + S1R;
        S2I = CKR*STI + CKI*STR + S1I;
        S1R = STR;
        S1I = STI;
        CKR = CKR + RZR;
        CKI = CKI + RZI;
        if (KFLAG >= 3) goto e230;
        P2R = S2R*P1R;
        P2I = S2I*P1R;
        STR = ABS(P2R);
        STI = ABS(P2I);
        P2M = DMAX(STR,STI);
        if (P2M <= ASCLE) goto e230;
        KFLAG++;
        ASCLE = BRY[KFLAG];
        S1R = S1R*P1R;
        S1I = S1I*P1R;
        S2R = P2R;
        S2I = P2I;
        STR = CSSR[KFLAG];
        S1R = S1R*STR;
        S1I = S1I*STR;
        S2R = S2R*STR;
        S2I = S2I*STR;
        P1R = CSRR[KFLAG];
e230:;}
      if (N != 1) goto e240;
      S1R = S2R;
      S1I = S2I;
e240: STR = CSRR[KFLAG];
      YR[1] = S1R*STR;
      YI[1] = S1I*STR;
      if (N == 1) {
		vmfree(vmblock);  
	    return;
      }
      YR[2] = S2R*STR;
      YI[2] = S2I*STR;
      if (N == 2) {
		vmfree(vmblock);  
	    return;
      }
      KK = 2;
e250: KK++;
      if (KK > N) {
		vmfree(vmblock);  
	    return;
      }
      P1R = CSRR[KFLAG];
      ASCLE = BRY[KFLAG];
      for (I=KK; I<=N; I++) {
        P2R = S2R;
        P2I = S2I;
        S2R = CKR*P2R - CKI*P2I + S1R;
        S2I = CKI*P2R + CKR*P2I + S1I;
        S1R = P2R;
        S1I = P2I;
        CKR = CKR + RZR;
        CKI = CKI + RZI;
        P2R = S2R*P1R;
        P2I = S2I*P1R;
        YR[I] = P2R;
        YI[I] = P2I;
        if (KFLAG >= 3) goto e260;
        STR = ABS(P2R);
        STI = ABS(P2I);
        P2M = DMAX(STR,STI);
        if (P2M <= ASCLE) goto e260;
        KFLAG = KFLAG + 1;
        ASCLE = BRY[KFLAG];
        S1R = S1R*P1R;
        S1I = S1I*P1R;
        S2R = P2R;
        S2I = P2I;
        STR = CSSR[KFLAG];
        S1R = S1R*STR;
        S1I = S1I*STR;
        S2R = S2R*STR;
        S2I = S2I*STR;
        P1R = CSRR[KFLAG];
e260:;} //I loop
	  vmfree(vmblock);
      return;
/*----------------------------------------------------------------------
!     IFLAG=1 CASES, FORWARD RECURRENCE ON SCALED VALUES ON UNDERFLOW
!---------------------------------------------------------------------*/
e261: HELIM = 0.5*ELIM;
      ELM = EXP(-ELIM);
      CELMR = ELM;
      ASCLE = BRY[1];
      ZDR = ZR;
      ZDI = ZI;
      IC = -1;
      J = 2;
      for (I=1; I<=INU; I++) {
        STR = S2R;
        STI = S2I;
        S2R = STR*CKR-STI*CKI+S1R;
        S2I = STI*CKR+STR*CKI+S1I;
        S1R = STR;
        S1I = STI;
        CKR = CKR+RZR;
        CKI = CKI+RZI;
        AS = ZABS(S2R,S2I);
        ALAS = log(AS);
        P2R = -ZDR+ALAS;
        if (P2R < -ELIM) goto e263;
        ZLOG(S2R,S2I,&STR,&STI,&IDUM);
        P2R = -ZDR+STR;
        P2I = -ZDI+STI;
        P2M = EXP(P2R)/TOL;
        P1R = P2M*COS(P2I);
        P1I = P2M*SIN(P2I);
        ZUCHK(P1R,P1I,&NW,ASCLE,TOL);
        if (NW != 0) goto e263;
        J = 3 - J;
        CYR[J] = P1R;
        CYI[J] = P1I;
        if (IC == I-1) goto e264;
        IC = I;
        goto e262;
e263:   if (ALAS < HELIM) goto e262;
        ZDR = ZDR-ELIM;
        S1R = S1R*CELMR;
        S1I = S1I*CELMR;
        S2R = S2R*CELMR;
        S2I = S2I*CELMR;
e262:;} // I loop
      if (N != 1) goto e270;
      S1R = S2R;
      S1I = S2I;
      goto e270;
e264: KFLAG = 1;
      INUB = I+1;
      S2R = CYR[J];
      S2I = CYI[J];
      J = 3 - J;
      S1R = CYR[J];
      S1I = CYI[J];
      if (INUB <= INU) goto e225;
      if (N != 1) goto e240;
      S1R = S2R;
      S1I = S2I;
      goto e240;
e270: YR[1] = S1R;
      YI[1] = S1I;
      if (N == 1) goto e280;
      YR[2] = S2R;
      YI[2] = S2I;
e280: ASCLE = BRY[1];
      ZKSCL(ZDR,ZDI,FNU,N,YR,YI,NZ,&RZR,&RZI,ASCLE,TOL,ELIM);
      INU = N - (*NZ);
      if (INU <= 0) {
		vmfree(vmblock);  
	    return;
      }
      KK = *NZ + 1;
      S1R = YR[KK];
      S1I = YI[KK];
      YR[KK] = S1R*CSRR[1];
      YI[KK] = S1I*CSRR[1];
      if (INU == 1) {
		vmfree(vmblock);  
	    return;
      }
      KK = *NZ + 2;
      S2R = YR[KK];
      S2I = YI[KK];
      YR[KK] = S2R*CSRR[1];
      YI[KK] = S2I*CSRR[1];
      if (INU == 2) {
		vmfree(vmblock);  
	    return;
      }
      T2 = FNU + 1.0*(KK-1);
      CKR = T2*RZR;
      CKI = T2*RZI;
      KFLAG = 1;
      goto e250;
/*----------------------------------------------------------------------
!     SCALE BY DEXP(Z), IFLAG = 1 CASES
!---------------------------------------------------------------------*/
e290: KODED = 2;
      IFLAG = 1;
      KFLAG = 2;
      goto e120;
/*----------------------------------------------------------------------
!     FNU=HALF ODD INTEGER CASE, DNU=-0.5
!---------------------------------------------------------------------*/
e300: S1R = COEFR;
      S1I = COEFI;
      S2R = COEFR;
      S2I = COEFI;
      goto e210;
e310: *NZ=-2;
	  vmfree(vmblock);  
} //ZBKNU()


void ZKSCL(REAL ZRR, REAL ZRI, REAL FNU, int N, REAL *YR, REAL *YI, int *NZ,
           REAL *RZR, REAL *RZI, REAL ASCLE, REAL TOL, REAL ELIM)  {
/***BEGIN PROLOGUE  ZKSCL
!***REFER TO  ZBESK
!
!     SET K FUNCTIONS TO ZERO ON UNDERFLOW, CONTINUE RECURRENCE
!     ON SCALED FUNCTIONS UNTIL TWO MEMBERS COME ON SCALE, THEN
!     RETURN WITH MIN(NZ+2,N) VALUES SCALED BY 1/TOL.
!
!***ROUTINES CALLED  ZUCHK,ZABS,ZLOG
!***END PROLOGUE  ZKSCL
!     COMPLEX CK,CS,CY,CZERO,RZ,S1,S2,Y,ZR,ZD,CELM */
//Labels: e10, e20, e25, e30, e40, e45

      REAL ACS, AS, CKI, CKR, CSI, CSR, FN, STR, S1I, S1R, S2I, S2R,
      ZEROI, ZEROR, ZDR, ZDI, CELMR, ELM, HELIM, ALAS;
      int I, IC, IDUM, KK, NN, NW;
      REAL *CYR, *CYI;
      void *vmblock = NULL;

//    Initialize CYR, CYI
      vmblock = vminit();  
	  CYR  = (REAL *) vmalloc(vmblock, VEKTOR,  N+1, 0); //index 0 not used
	  CYI  = (REAL *) vmalloc(vmblock, VEKTOR,  N+1, 0);
      if (! vmcomplete(vmblock)) {
        LogError ("No Memory", 0, __FILE__, __LINE__);
        return;
	  }
	  
      ZEROR=0.0; ZEROI=0.0;
      *NZ = 0;
      IC = 0;
      NN = IMIN(2,N);
      for (I=1; I<=NN; I++) {
        S1R = YR[I];
        S1I = YI[I];
        CYR[I] = S1R;
        CYI[I] = S1I;
        AS = ZABS(S1R,S1I);
        ACS = -ZRR + log(AS);
        *NZ = *NZ + 1;
        YR[I] = ZEROR;
        YI[I] = ZEROI;
        if (ACS < -ELIM) goto e10;
        ZLOG(S1R, S1I, &CSR, &CSI, &IDUM);
        CSR = CSR - ZRR;
        CSI = CSI - ZRI;
        STR = EXP(CSR)/TOL;
        CSR = STR*COS(CSI);
        CSI = STR*SIN(CSI);
        ZUCHK(CSR, CSI, &NW, ASCLE, TOL);
        if (NW != 0) goto e10;
        YR[I] = CSR;
        YI[I] = CSI;
        IC = I;
        *NZ = *NZ - 1;
e10: ;}
      if (N == 1) {
		vmfree(vmblock);  
	    return;
      }
      if (IC > 1) goto e20;
      YR[1] = ZEROR;
      YI[1] = ZEROI;
      *NZ = 2;
e20:  if (N == 2) {
		vmfree(vmblock);  
	    return;
      }
      if (*NZ == 0) {
		vmfree(vmblock);  
	    return;
      }
      FN = FNU + 1.0;
      CKR = FN*(*RZR);
      CKI = FN*(*RZI);
      S1R = CYR[1];
      S1I = CYI[1];
      S2R = CYR[2];
      S2I = CYI[2];
      HELIM = 0.5*ELIM;
      ELM = EXP(-ELIM);
      CELMR = ELM;
      ZDR = ZRR;
      ZDI = ZRI;

//    FIND TWO CONSECUTIVE Y VALUES ON SCALE. SCALE RECURRENCE IF
//    S2 GETS LARGER THAN EXP(ELIM/2).

      for (I=3; I<=N; I++) {
        KK = I;
        CSR = S2R;
        CSI = S2I;
        S2R = CKR*CSR - CKI*CSI + S1R;
        S2I = CKI*CSR + CKR*CSI + S1I;
        S1R = CSR;
        S1I = CSI;
        CKR = CKR + (*RZR);
        CKI = CKI + (*RZI);
        AS = ZABS(S2R,S2I);
        ALAS = log(AS);
        ACS = -ZDR + ALAS;
        *NZ = *NZ + 1;
        YR[I] = ZEROR;
        YI[I] = ZEROI;
        if (ACS < -ELIM) goto e25;
        ZLOG(S2R, S2I, &CSR, &CSI, &IDUM);
        CSR = CSR - ZDR;
        CSI = CSI - ZDI;
        STR = EXP(CSR)/TOL;
        CSR = STR*COS(CSI);
        CSI = STR*SIN(CSI);
        ZUCHK(CSR, CSI, &NW, ASCLE, TOL);
        if (NW != 0) goto e25;
        YR[I] = CSR;
        YI[I] = CSI;
        *NZ = *NZ - 1;
        if (IC == KK-1) goto e40;
        IC = KK;
        goto e30;
e25:    if (ALAS < HELIM) goto e30;
        ZDR = ZDR - ELIM;
        S1R = S1R*CELMR;
        S1I = S1I*CELMR;
        S2R = S2R*CELMR;
        S2I = S2I*CELMR;
e30:  ;}
      *NZ = N;
      if (IC == N)  *NZ = N-1;
      goto e45;
e40:  *NZ = KK - 2;
e45:  for (I=1; I<=*NZ; I++) {
        YR[I] = ZEROR;
        YI[I] = ZEROI;
      }
	  vmfree(vmblock);  
} //ZKSCL()

// end of file Cbess00.cpp

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -