📄 pois.f90
字号:
MODULE POIS ! CODE CONVERTED USING TO_F90 BY ALAN MILLER! DATE: 2006-01-18 TIME: 13:48:46! POISSON SOLVER ROUTINESUSE PRECISION_PARAMETERSIMPLICIT REAL(EB) (A-H,O-Z)IMPLICIT INTEGER (I-N)PRIVATEREAL(EB) SCALEINTEGER :: KAPPA,NMAX,IKPWRLOGICAL :: TPOSE,NOCOPY,OUTARYCHARACTER(255), PARAMETER :: poisid='$Id: pois.f90 607 2007-09-17 17:53:03Z mcgratta $'CHARACTER(255), PARAMETER :: poisrev='$Revision: 607 $'CHARACTER(255), PARAMETER :: poisdate='$Date: 2007-09-17 13:53:03 -0400 (Mon, 17 Sep 2007) $'PUBLIC H3CZIS,H3CZSS,H2CZSS,H2CYSS,H3CSSS,H2CZIS,H3CSIS,H2CYIS,GET_REV_poisCONTAINSSUBROUTINE H3CZIS(XS,XF,L,LBDCND,YS,YF,M,MBDCND,ZS,ZF,N,NBDCND, & H,ELMBDA,LDIMF,MDIMF,IERROR,SAVE)! +--------------------------------------------------------------------+! | |! | COPYRIGHT (C) 1989 BY |! | ROLAND A. SWEET |! | ALL RIGHTS RESERVED |! | |! +--------------------------------------------------------------------+REAL(EB):: XS, XF, YS, YF, ZS, ZF, ELMBDA, DLZSQRINTEGER:: L, LBDCND, M, MBDCND, N, NBDCND, LDIMF, MDIMF, IERROR, LPERODREAL(EB) SAVE(-3:*),H(0:*)! CHECK FOR INVALID INPUTIERROR = 0IF (XS>XF) THEN IERROR = IERROR + 1 SAVE(IERROR) = 1._EBEND IFIF (L<3) THEN IERROR = IERROR + 1 SAVE(IERROR) = 2._EBEND IFIF (LBDCND<0 .OR. LBDCND>4) THEN IERROR = IERROR + 1 SAVE(IERROR) = 3._EB END IFIF (YS>YF) THEN IERROR = IERROR + 1 SAVE(IERROR) = 4._EB END IFIF (M<3) THEN IERROR = IERROR + 1 SAVE(IERROR) = 5._EB END IFIF (MBDCND<0 .OR. MBDCND>4) THEN IERROR = IERROR + 1 SAVE(IERROR) = 6._EB END IFIF (ZS>ZF) THEN IERROR = IERROR + 1 SAVE(IERROR) = 7._EB END IFIF (N<3) THEN IERROR = IERROR + 1 SAVE(IERROR) = 8._EB END IFIF (NBDCND<0 .OR. NBDCND>4) THEN IERROR = IERROR + 1 SAVE(IERROR) = 9._EB END IFIF (LDIMF<L) THEN IERROR = IERROR + 1 SAVE(IERROR) = 10._EB END IFIF (MDIMF<M) THEN IERROR = IERROR + 1 SAVE(IERROR) = 11._EB END IFIF (IERROR/=0) THEN RETURNELSE SAVE(1) = 0._EB END IF! DEFINE GRID PARAMETERSDX = (XF-XS)/LDY = (YF-YS)/MDZ = (ZF-ZS)/NDLXSQR = 1._EB/DX**2DLYSQR = 1._EB/DY**2DLZSQR = 1._EB/DZ**2LP = LBDCND + 1MP = MBDCND + 1NP = NBDCND + 1! ALLOCATE SAVE ARRAYIA = 12IB = IA + LIC = IB + LID = IC + LIS = ID + L! DEFINE THE A,B,C COEFFICIENTS! IN SAVE ARRAYDO I = 0,L - 1 HM = .5_EB*(H(I)+H(I+1)) HP = .5_EB*(H(I+1)+H(I+2)) SAVE(IA+I) = DLXSQR/(H(I+1)*HM) SAVE(IC+I) = DLXSQR/(H(I+1)*HP) SAVE(IB+I) = - (SAVE(IA+I)+SAVE(IC+I)) + ELMBDA SAVE(ID+I) = DLYSQREND DOSELECT CASE(LP)CASE(2)SAVE(IB) = SAVE(IB) - SAVE(IA)SAVE(IC-1) = SAVE(IC-1) - SAVE(ID-1)CASE(3)SAVE(IB) = SAVE(IB) - SAVE(IA)SAVE(IC-1) = SAVE(IC-1) + SAVE(ID-1)CASE(4)SAVE(IB) = SAVE(IB) + SAVE(IA)SAVE(IC-1) = SAVE(IC-1) + SAVE(ID-1)CASE(5)SAVE(IB) = SAVE(IB) + SAVE(IA)SAVE(IC-1) = SAVE(IC-1) - SAVE(ID-1)END SELECT! DETERMINE WHETHER OR NOT BOUNDARY! CONDITION IS PERIODIC IN XIF (LBDCND==0) THEN LPEROD = 0ELSE LPEROD = 1END IF! INITIALIZE SOLVER ROUTINE S3CFIS.CALL S3CFIS(LPEROD,L,MBDCND,M,NBDCND,N,DLZSQR,SAVE(IA),SAVE(IB), & SAVE(IC),SAVE(ID),LDIMF,MDIMF,IR,SAVE(IS))! TEST ERROR FLAG FROM S3CFIS FOR! INTERNAL ERRORIF (IR/=0) THEN SAVE(1) = 99._EB IERROR = 1 RETURNEND IF! SAVE PARAMETERS FOR H3CZSS IN SAVE ARRAYSAVE(2) = DXSAVE(3) = LSAVE(4) = LPSAVE(5) = DYSAVE(6) = MSAVE(7) = MPSAVE(8) = DZSAVE(9) = NSAVE(10) = NPSAVE(11) = ELMBDARETURNEND SUBROUTINE H3CZISSUBROUTINE H3CZSS(BDXS,BDXF,BDYS,BDYF,BDZS,BDZF,LDIMF,MDIMF,F, & PERTRB,SAVE,W,H)! +--------------------------------------------------------------------+! | |! | COPYRIGHT (C) 1989 BY |! | ROLAND A. SWEET |! | ALL RIGHTS RESERVED |! | |! +--------------------------------------------------------------------+REAL(EB):: BDXS(MDIMF,*), BDXF(MDIMF,*), BDYS(LDIMF,*), BDYF(LDIMF,*), BDZS(LDIMF,*), BDZF(LDIMF,*), & F(LDIMF,MDIMF,*),SAVE(-3:*),W(*),H(0:*), PERTRBINTEGER:: LDIMF, MDIMF ! CHECK VALUE OF IERROR (=SAVE(1)).! IF NON-ZERO, RETURN.IF (SAVE(1)/=0._EB) RETURN! GET PARAMETERS FOR H3CZSS FROM SAVE! ARRAY WHERE THEY WERE STORED IN! INITIALIZATION SUBROUTINE H3CZIS.DX = SAVE(2)L = SAVE(3)LP = SAVE(4)DY = SAVE(5)M = SAVE(6)MP = SAVE(7)DZ = SAVE(8)N = SAVE(9)NP = SAVE(10)ELMBDA = SAVE(11)DLYRCP = 1._EB/DYTWDYSQ = 2._EB/DY**2DLZRCP = 1._EB/DZTWDZSQ = 2._EB/DZ**2! ALLOCATE SAVE ARRAYIA = 12IB = IA + LIC = IB + LID = IC + LIS = 12 + 4*L! ENTER BOUNDARY DATA FOR X-BOUNDARIESIF (LP==2 .OR. LP==3) THEN DO K = 1,N DO J = 1,M F(1,J,K) = F(1,J,K) - 2._EB*BDXS(J,K)*SAVE(IA) END DO END DOEND IFIF (LP==4 .OR. LP==5) THEN DO K = 1,N DO J = 1,M F(1,J,K) = F(1,J,K) + SAVE(IA)*DX*BDXS(J,K) END DO END DOEND IFIF (LP==2 .OR. LP==5) THEN DO K = 1,N DO J = 1,M F(L,J,K) = F(L,J,K) - 2._EB*BDXF(J,K)*SAVE(ID-1) END DO END DOEND IFIF (LP==3 .OR. LP==4) THEN DO K = 1,N DO J = 1,M F(L,J,K) = F(L,J,K) - SAVE(ID-1)*DX*BDXF(J,K) END DO END DOEND IF! ENTER BOUNDARY DATA FOR Y-BOUNDARIESIF (MP==2 .OR. MP==3) THEN DO K = 1,N DO I = 1,L F(I,1,K) = F(I,1,K) - BDYS(I,K)*TWDYSQ END DO END DOEND IFIF (MP==4 .OR. MP==5) THEN DO K = 1,N DO I = 1,L F(I,1,K) = F(I,1,K) + BDYS(I,K)*DLYRCP END DO END DOEND IFIF (MP==2 .OR. MP==5) THEN DO K = 1,N DO I = 1,L F(I,M,K) = F(I,M,K) - BDYF(I,K)*TWDYSQ END DO END DOEND IFIF (MP==3 .OR. MP==4) THEN DO K = 1,N DO I = 1,L F(I,M,K) = F(I,M,K) - BDYF(I,K)*DLYRCP END DO END DOEND IF! ENTER BOUNDARY DATA FOR Z-BOUNDARIESIF (NP==2 .OR. NP==3) THEN DO J = 1,M DO I = 1,L F(I,J,1) = F(I,J,1) - BDZS(I,J)*TWDZSQ END DO END DOEND IFIF (NP==4 .OR. NP==5) THEN DO J = 1,M DO I = 1,L F(I,J,1) = F(I,J,1) + BDZS(I,J)*DLZRCP END DO END DOEND IFIF (NP==2 .OR. NP==5) THEN DO J = 1,M DO I = 1,L F(I,J,N) = F(I,J,N) - BDZF(I,J)*TWDZSQ END DO END DOEND IFIF (NP==3 .OR. NP==4) THEN DO J = 1,M DO I = 1,L F(I,J,N) = F(I,J,N) - BDZF(I,J)*DLZRCP END DO END DOEND IFPERTRB = 0._EB PERT = 0._EB ISING = 0! FOR SINGULAR PROBLEMS ADJUST DATA TO! INSURE A SOLUTION WILL EXIST. GO THRU! THIS CODE TWICE: ISING=1 FOR CALCULATING! PERTRB; ISING=2 FOR NORMALIZING SOLUTION! AFTER IT IS COMPUTED.SELECT CASE(LP)CASE(1) ; GO TO 630CASE(2:3) ; GO TO 750CASE(4) ; GO TO 630CASE(5) ; GO TO 750END SELECT630 CONTINUESELECT CASE(MP)CASE(1) ; GO TO 640CASE(2:3) ; GO TO 750CASE(4) ; GO TO 640CASE(5) ; GO TO 750END SELECT640 CONTINUESELECT CASE(NP)CASE(1) ; GO TO 650CASE(2:3) ; GO TO 750CASE(4) ; GO TO 650CASE(5) ; GO TO 750END SELECT650 CONTINUEIF (ELMBDA/=0._EB) GO TO 750ISING = 1660 CONTINUEPERT = 0._EB DO I = 1,L W(I) = 0._EB END DODO K = 1,N DO J = 1,M DO I = 1,L W(I) = W(I) + F(I,J,K) END DO END DOEND DOS1 = 0._EB S3 = 0._EB DO I = 1,L S3 = S3 + H(I) S1 = S1 + H(I)*W(I)END DOS3 = S3*M*NPERT = S1/S3! ADJUST F ARRAY BY PERTDO K = 1,N DO J = 1,M DO I = 1,L F(I,J,K) = F(I,J,K) - PERT END DO END DOEND DO750 CONTINUE! IF NORMALIZING SOLUTION, RESTORE PERTRB! AND JUMP TO ENDIF (ISING==2) THEN PERTRB = PRTSAV GO TO 800 END IFPRTSAV = PERT! SOLVE THE EQUATIONCALL S3CFSS(LDIMF,MDIMF,F,SAVE(IS),W)! IF A SINGULAR PROBLEM,! RE-NORMALIZE SOLUTION (ISING=2)IF (ISING==1) THEN ISING = 2 GO TO 660 END IF800 CONTINUERETURNEND SUBROUTINE H3CZSSSUBROUTINE S3CFIS(LPEROD,L,MPEROD,M,NPEROD,N,SCAL,A,B,C,D,LDIMF, & MDIMF,IERROR,SAVE)! +--------------------------------------------------------------------+! | |! | COPYRIGHT (C) 1989 BY |! | ROLAND A. SWEET |! | ALL RIGHTS RESERVED |! | |! +--------------------------------------------------------------------+INTEGER:: LPEROD, L, MPEROD, M, NPEROD, NREAL(EB):: SCALREAL(EB):: A(L), B(L), C(L), D(L), SAVE(-3:*)INTEGER:: LDIMF, MDIMF, IERROR! CHECK FOR INVALID INPUTIERROR = 0IF (LPEROD/=0 .AND. LPEROD/=1) THEN IERROR = 1 SAVE(1) = 1._EB END IFIF (L<3) THEN IERROR = IERROR + 1 SAVE(IERROR) = 2._EB END IFIF (MPEROD<0 .AND. MPEROD>4) THEN IERROR = IERROR + 1 SAVE(IERROR) = 3._EB END IFIF (M<3) THEN IERROR = IERROR + 1 SAVE(IERROR) = 4._EB END IFIF (NPEROD<0 .AND. NPEROD>4) THEN IERROR = IERROR + 1 SAVE(IERROR) = 5._EB END IFIF (N<3) THEN IERROR = IERROR + 1 SAVE(IERROR) = 6._EB END IFIF (LDIMF<L) THEN IERROR = IERROR + 1 SAVE(IERROR) = 7._EB END IFIF (MDIMF<M) THEN IERROR = IERROR + 1 SAVE(IERROR) = 8._EB END IFIF (LPEROD==0) THEN DO I = 1,L IF (A(I)/=A(1)) GO TO 110 IF (B(I)/=B(1)) GO TO 110 IF (C(I)/=A(1)) GO TO 110 IF (D(I)/=D(1)) GO TO 110 END DO GO TO 120 110 CONTINUE IERROR = IERROR + 1 SAVE(IERROR) = 9._EB END IF120 CONTINUEIF (IERROR/=0) THEN RETURNELSE SAVE(1) = IERROREND IF
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -