📄 func.f90
字号:
ZZ = Z_1 + Z_2 + Z_3WGT =MIN(ZZ*10000._EB,10000._EB)IZ1 = FLOOR(WGT)IZ2 = MIN(10000,IZ1+1)WGT = WGT - IZ1z1z2z3: IF(ZZ <= 0._EB .OR. ZZ >= 1._EB) THEN C = 0._EB F = 0._EB Z_F = REACTION(1)%Z_FELSE IF (Z_1==ZZ) THEN F = 1._EB C = 0._EB Z_F = REACTION(1)%Z_F ELSE IF (Z_2 == 0._EB) THEN C = 1._EB Z_F = REACTION(2)%Z_F ELSE C = Z_3 / (Z_3 + Z_2) Z_F = 1._EB/(1._EB+(1._EB - C)*REACTION(1)%Z_F_CONS + C * REACTION(2)%Z_F_CONS) ENDIF IF (ZZ < Z_F) THEN F = Z_1 / ZZ ELSE F = (Z_1 * (1._EB - Z_F) - ZZ + Z_F) / (Z_F * (1._EB - ZZ)) ENDIF Z_3_MAX = (1._EB-WGT)*SPECIES(I_PROG_CO)%Z_MAX(IZ1)+ WGT*SPECIES(I_PROG_CO)%Z_MAX(IZ2) C = MAX(0._EB,MIN(1._EB,Z_3 / Z_3_MAX / (1._EB - F))) ENDIFENDIF z1z2z3F = MIN(1._EB,MAX(0._EB,F))END SUBROUTINE GET_F_CSUBROUTINE GET_F(Z_1,Z_3,F,Z_F)!Returns progress variables for Mixture Fraction functions for suppression onlyREAL(EB), INTENT(IN) :: Z_1,Z_3,Z_FREAL(EB), INTENT(OUT) :: FREAL(EB) :: ZZZZ = Z_1 + Z_3IF (ZZ > Z_F) THEN IF (ZZ >= 1._EB) THEN F = 1._EB ELSE F = (Z_1 * (1._EB - Z_F) - ZZ + Z_F) / (Z_F * (1._EB - ZZ)) ENDIFELSE IF (ZZ <= 0._EB) THEN F = 0._EB ELSE F = Z_1 / ZZ ENDIFENDIFF = MIN(1._EB,MAX(0._EB,F)) END SUBROUTINE GET_FSUBROUTINE GET_MASS_FRACTION2(Z1,Z2,Z3,INDEX,YY_SUM,Y_MF)! Y_MF returns the mass fraction of species INDEXINTEGER, INTENT(IN) :: INDEXREAL(EB), INTENT(IN) :: Z1,Z2,Z3,YY_SUMREAL(EB) :: Z_1,Z_2,Z_3,Y_MF,ZZTYPE(REACTION_TYPE), POINTER :: RNIF (YY_SUM >=1._EB) THEN Y_MF = 0._EB RETURNELSE Z_1 = MAX(0._EB,Z1)/(1._EB - MAX(0._EB,YY_SUM)) Z_2 = MAX(0._EB,Z2)/(1._EB - MAX(0._EB,YY_SUM)) Z_3 = MAX(0._EB,Z3)/(1._EB - MAX(0._EB,YY_SUM)) ZZ = Z_1 + Z_2 + Z_3ENDIFIF (CO_PRODUCTION) THEN RN => REACTION(2)ELSE RN => REACTION(1)ENDIFSELECT CASE(INDEX) CASE(FUEL_INDEX) Y_MF = Z_1 * RN%Y_F_INLET CASE(N2_INDEX) Y_MF = (1._EB - ZZ) * RN%Y_N2_INFTY + Z_1 * RN%Y_N2_INLET + (Z_2 + Z_3) * RN%Y_F_INLET / RN%MW_FUEL * MW_N2 * RN%NU_N2 CASE(O2_INDEX) Y_MF = (1._EB - ZZ) * RN%Y_O2_INFTY - Z_3 * RN%Y_F_INLET / RN%MW_FUEL * MW_O2 * RN%NU_O2 IF (CO_PRODUCTION) Y_MF = Y_MF - Z_2 * RN%Y_F_INLET / RN%MW_FUEL * MW_O2 * REACTION(1)%NU_O2 CASE(CO_INDEX) IF (CO_PRODUCTION) THEN Y_MF = Z_2 * RN%Y_F_INLET / RN%MW_FUEL * MW_CO * REACTION(1)%NU_CO ELSE Y_MF = Z_3 * RN%Y_F_INLET / RN%MW_FUEL * MW_CO * RN%NU_CO ENDIF CASE(CO2_INDEX) Y_MF = Z_3 * RN%Y_F_INLET / RN%MW_FUEL * MW_CO2 * RN%NU_CO2 CASE(H2O_INDEX) Y_MF = (Z_2 + Z_3) * RN%Y_F_INLET / RN%MW_FUEL * MW_H2O * RN%NU_H2O CASE(H2_INDEX) Y_MF = (Z_2 + Z_3) * RN%Y_F_INLET / RN%MW_FUEL * MW_H2 * RN%NU_H2 CASE(SOOT_INDEX) Y_MF = (Z_2 + Z_3) * RN%Y_F_INLET / RN%MW_FUEL * MW_SOOT * RN%NU_SOOT CASE(OTHER_INDEX) Y_MF = (Z_2 + Z_3) * RN%Y_F_INLET / RN%MW_FUEL * RN%MW_OTHER * RN%NU_OTHEREND SELECTY_MF = MIN(1._EB,MAX(0._EB,Y_MF)) * (1._EB - MAX(YY_SUM,0._EB))END SUBROUTINE GET_MASS_FRACTION2SUBROUTINE GET_MASS_FRACTION_ALL(Z1,Z2,Z3,YY_SUM,Y_MF)! Y_MF returns the mass fraction of all mixture fraction speciesREAL(EB), INTENT(IN) :: Z1,Z2,Z3,YY_SUMREAL(EB) :: ZZ,Z_1,Z_2,Z_3,Y_MF(9)TYPE(REACTION_TYPE), POINTER :: RNIF (YY_SUM >=1._EB) THEN Y_MF = 0._EB RETURNELSE Z_1 = MAX(0._EB,Z1)/(1._EB - MAX(0._EB,YY_SUM)) Z_2 = MAX(0._EB,Z2)/(1._EB - MAX(0._EB,YY_SUM)) Z_3 = MAX(0._EB,Z3)/(1._EB - MAX(0._EB,YY_SUM)) ZZ = Z_1 + Z_2 + Z_3ENDIFIF (CO_PRODUCTION) THEN RN => REACTION(2)ELSE RN => REACTION(1)ENDIFY_MF(FUEL_INDEX) = Z_1 * RN%Y_F_INLETY_MF(N2_INDEX) = (1._EB - ZZ) * RN%Y_N2_INFTY + Z_1 * RN%Y_N2_INLET + (Z_2 + Z_3) * RN%Y_F_INLET / RN%MW_FUEL * MW_N2 * RN%NU_N2Y_MF(O2_INDEX) = (1._EB - ZZ) * RN%Y_O2_INFTY - Z_3 * RN%Y_F_INLET / RN%MW_FUEL * MW_O2 * RN%NU_O2IF (CO_PRODUCTION) Y_MF(O2_INDEX) = Y_MF(O2_INDEX) - Z_2 * RN%Y_F_INLET / RN%MW_FUEL * MW_O2 * REACTION(1)%NU_O2IF (CO_PRODUCTION) THEN Y_MF(CO_INDEX) = Z_2 * RN%Y_F_INLET / RN%MW_FUEL * MW_CO * REACTION(1)%NU_COELSE Y_MF(CO_INDEX) = Z_3 * RN%Y_F_INLET / RN%MW_FUEL * MW_CO * RN%NU_COENDIFY_MF(CO2_INDEX) = Z_3 * RN%Y_F_INLET / RN%MW_FUEL * MW_CO2 * RN%NU_CO2Y_MF(H2O_INDEX) = (Z_2 + Z_3) * RN%Y_F_INLET / RN%MW_FUEL * MW_H2O * RN%NU_H2OY_MF(H2_INDEX) = (Z_2 + Z_3) * RN%Y_F_INLET / RN%MW_FUEL * MW_H2 * RN%NU_H2 Y_MF(SOOT_INDEX) = (Z_2 + Z_3) * RN%Y_F_INLET / RN%MW_FUEL * MW_SOOT * RN%NU_SOOTY_MF(OTHER_INDEX) = (Z_2 + Z_3) * RN%Y_F_INLET / RN%MW_FUEL * RN%MW_OTHER * RN%NU_OTHERY_MF = MIN(1._EB,MAX(0._EB,Y_MF)) * (1._EB - MAX(YY_SUM,0._EB))END SUBROUTINE GET_MASS_FRACTION_ALLSUBROUTINE GET_MOLECULAR_WEIGHT2(Z1,Z2,Z3,YY_SUM, MW_MF)! Y_MF returns the mass fraction of species INDEXREAL(EB), INTENT(IN) :: Z1,Z2,Z3,YY_SUMREAL(EB) :: Z_1,Z_2,Z_3,MW_MF,Y_MF(9)TYPE(REACTION_TYPE), POINTER :: RNIF (YY_SUM >=1._EB) THEN MW_MF = MW_AIR RETURNELSE Z_1 = MAX(0._EB,Z1)/(1._EB - MAX(0._EB,YY_SUM)) Z_2 = MAX(0._EB,Z2)/(1._EB - MAX(0._EB,YY_SUM)) Z_3 = MAX(0._EB,Z3)/(1._EB - MAX(0._EB,YY_SUM)) ENDIFCALL GET_MASS_FRACTION_ALL(Z_1,Z_2,Z_3,0._EB,Y_MF)RN => REACTION(1)MW_MF = 1._EB/(Y_MF(FUEL_INDEX)/RN%MW_FUEL + Y_MF(O2_INDEX)/MW_O2 + Y_MF(N2_INDEX)/MW_N2 + & Y_MF(H2O_INDEX)/MW_H2O + Y_MF(CO2_INDEX)/MW_CO2 + Y_MF(CO_INDEX)/MW_CO + & Y_MF(H2_INDEX)/MW_H2 + Y_MF(SOOT_INDEX)/MW_SOOT + Y_MF(OTHER_INDEX)/RN%MW_OTHER)END SUBROUTINE GET_MOLECULAR_WEIGHT2SUBROUTINE GET_MU2(Z1,Z2,Z3,YY_SUM,MU_MF,ITMP)! GET_MU returns the viscosity of the mixture fractionINTEGER, INTENT(IN) :: ITMPREAL(EB), INTENT(IN) :: Z1,Z2,Z3,YY_SUMREAL(EB) :: Z_1,Z_2,Z_3,MU_MF,Y_MF(9),MW_MFTYPE(SPECIES_TYPE), POINTER :: SSTYPE(REACTION_TYPE), POINTER :: RNIF (YY_SUM >=1._EB) THEN MU_MF = SPECIES(0)%MU(ITMP) RETURNELSE Z_1 = MAX(0._EB,Z1)/(1._EB - MAX(0._EB,YY_SUM)) Z_2 = MAX(0._EB,Z2)/(1._EB - MAX(0._EB,YY_SUM)) Z_3 = MAX(0._EB,Z3)/(1._EB - MAX(0._EB,YY_SUM)) ENDIFCALL GET_MASS_FRACTION_ALL(Z_1,Z_2,Z_3,0._EB,Y_MF)SS => SPECIES(I_FUEL)RN => REACTION(1)MW_MF = 1._EB/(Y_MF(FUEL_INDEX)/RN%MW_FUEL + Y_MF(O2_INDEX)/MW_O2 + Y_MF(N2_INDEX)/MW_N2 + & Y_MF(H2O_INDEX)/MW_H2O + Y_MF(CO2_INDEX)/MW_CO2 + Y_MF(CO_INDEX)/MW_CO + & Y_MF(H2_INDEX)/MW_H2 + Y_MF(SOOT_INDEX)/MW_SOOT + Y_MF(OTHER_INDEX)/RN%MW_OTHER)MU_MF = (Y_MF(FUEL_INDEX)*SS%MU_MF2(FUEL_INDEX,ITMP)/RN%MW_FUEL + Y_MF(O2_INDEX)*SS%MU_MF2(O2_INDEX,ITMP)/MW_O2 + & Y_MF(N2_INDEX)*SS%MU_MF2(N2_INDEX,ITMP)/MW_N2 + Y_MF(H2O_INDEX)*SS%MU_MF2(H2O_INDEX,ITMP)/MW_H2O + & Y_MF(CO2_INDEX)*SS%MU_MF2(CO2_INDEX,ITMP)/MW_CO2 + Y_MF(CO_INDEX)*SS%MU_MF2(CO_INDEX,ITMP)/MW_CO + & Y_MF(H2_INDEX)*SS%MU_MF2(H2_INDEX,ITMP)/MW_H2 + Y_MF(SOOT_INDEX)*SS%MU_MF2(SOOT_INDEX,ITMP)/MW_SOOT + & Y_MF(OTHER_INDEX)*SS%MU_MF2(OTHER_INDEX,ITMP)/RN%MW_OTHER) * MW_MFEND SUBROUTINE GET_MU2SUBROUTINE GET_D2(Z1,Z2,Z3,YY_SUM,D_MF,ITMP)! GET_D returns the diffusivity of the mixture fractionINTEGER, INTENT(IN) :: ITMPREAL(EB), INTENT(IN) :: Z1,Z2,Z3,YY_SUMREAL(EB) :: Z_1,Z_2,Z_3,D_MF,Y_MF(9)TYPE(SPECIES_TYPE), POINTER :: SSIF (YY_SUM >=1._EB) THEN D_MF = SPECIES(0)%D(ITMP) RETURNELSE Z_1 = MAX(0._EB,Z1)/(1._EB - MAX(0._EB,YY_SUM)) Z_2 = MAX(0._EB,Z2)/(1._EB - MAX(0._EB,YY_SUM)) Z_3 = MAX(0._EB,Z3)/(1._EB - MAX(0._EB,YY_SUM)) ENDIFCALL GET_MASS_FRACTION_ALL(Z_1,Z_2,Z_3,0._EB,Y_MF)SS => SPECIES(I_FUEL)D_MF = DOT_PRODUCT(Y_MF,SS%D_MF2(:,ITMP))END SUBROUTINE GET_D2SUBROUTINE GET_CP2(Z1,Z2,Z3,YY_SUM,CP_MF,ITMP)! GET_D returns the specific heat of the mixture fractionINTEGER, INTENT(IN) :: ITMPREAL(EB), INTENT(IN) :: Z1,Z2,Z3,YY_SUMREAL(EB) :: Z_1,Z_2,Z_3,CP_MF,Y_MF(9)TYPE(SPECIES_TYPE), POINTER :: SSIF (YY_SUM >=1._EB) THEN CP_MF = SPECIES(0)%CP(ITMP) RETURNELSE Z_1 = MAX(0._EB,Z1)/(1._EB - MAX(0._EB,YY_SUM)) Z_2 = MAX(0._EB,Z2)/(1._EB - MAX(0._EB,YY_SUM)) Z_3 = MAX(0._EB,Z3)/(1._EB - MAX(0._EB,YY_SUM)) ENDIFCALL GET_MASS_FRACTION_ALL(Z_1,Z_2,Z_3,0._EB,Y_MF)SS => SPECIES(I_FUEL)CP_MF = DOT_PRODUCT(Y_MF,SS%CP_MF2(:,ITMP))END SUBROUTINE GET_CP2SUBROUTINE GET_K2(Z1,Z2,Z3,YY_SUM,K_MF,ITMP)! GET_D returns the specific heat of the mixture fractionINTEGER, INTENT(IN) :: ITMPREAL(EB), INTENT(IN) :: Z1,Z2,Z3,YY_SUMREAL(EB) :: Z_1,Z_2,Z_3,K_MF,Y_MF(9),MW_MFTYPE(SPECIES_TYPE), POINTER :: SSTYPE(REACTION_TYPE), POINTER :: RNIF (YY_SUM >=1._EB) THEN K_MF = SPECIES(0)%K(ITMP) RETURNELSE Z_1 = MAX(0._EB,Z1)/(1._EB - MAX(0._EB,YY_SUM)) Z_2 = MAX(0._EB,Z2)/(1._EB - MAX(0._EB,YY_SUM)) Z_3 = MAX(0._EB,Z3)/(1._EB - MAX(0._EB,YY_SUM)) ENDIFCALL GET_MASS_FRACTION_ALL(Z_1,Z_2,Z_3,0._EB,Y_MF)SS => SPECIES(I_FUEL)RN => REACTION(1)MW_MF = 1._EB/(Y_MF(FUEL_INDEX)/RN%MW_FUEL + Y_MF(O2_INDEX)/MW_O2 + Y_MF(N2_INDEX)/MW_N2 + & Y_MF(H2O_INDEX)/MW_H2O + Y_MF(CO2_INDEX)/MW_CO2 + Y_MF(CO_INDEX)/MW_CO + & Y_MF(H2_INDEX)/MW_H2 + Y_MF(SOOT_INDEX)/MW_SOOT + Y_MF(OTHER_INDEX)/RN%MW_OTHER)K_MF = (Y_MF(FUEL_INDEX)*SS%K_MF2(FUEL_INDEX,ITMP)/RN%MW_FUEL + Y_MF(O2_INDEX)*SS%K_MF2(O2_INDEX,ITMP)/MW_O2 + & Y_MF(N2_INDEX)*SS%K_MF2(N2_INDEX,ITMP)/MW_N2 + Y_MF(H2O_INDEX)*SS%K_MF2(H2O_INDEX,ITMP)/MW_H2O + & Y_MF(CO2_INDEX)*SS%K_MF2(CO2_INDEX,ITMP)/MW_CO2 + Y_MF(CO_INDEX)*SS%K_MF2(CO_INDEX,ITMP)/MW_CO + & Y_MF(H2_INDEX)*SS%K_MF2(H2_INDEX,ITMP)/MW_H2 + Y_MF(SOOT_INDEX)*SS%K_MF2(SOOT_INDEX,ITMP)/MW_SOOT + & Y_MF(OTHER_INDEX)*SS%K_MF2(OTHER_INDEX,ITMP)/RN%MW_OTHER) * MW_MFEND SUBROUTINE GET_K2REAL(EB) FUNCTION DRAG(RE) ! Droplet drag coefficientREAL(EB) :: RE IF (RE<=1._EB) THEN DRAG = 24._EB/REELSEIF (RE>1._EB .AND. RE<1000._EB) THEN DRAG = 24._EB*(1._EB+0.15_EB*RE**0.687_EB)/REELSEIF (RE>=1000._EB) THEN DRAG = 0.44_EBENDIF END FUNCTION DRAGSUBROUTINE DROPLET_SIZE_DISTRIBUTION(DM,RR,CNF,NPT,GAMMA,SIGMA) ! Compute droplet Cumulative Number Fraction (CNF) REAL(EB), INTENT(IN) :: DM,GAMMA,SIGMAINTEGER, INTENT(IN) :: NPTREAL(EB) :: SUM1,DD1,DI,ETRM,GFAC,SFACINTEGER :: JREAL(EB), INTENT(OUT) :: RR(0:NPT),CNF(0:NPT) RR(0) = 0._EBCNF(0) = 0._EBSUM1 = 0._EBDD1 = (-LOG(1._EB-0.99_EB)/0.693_EB)**(1._EB/GAMMA)*DM/REAL(NPT,EB)GFAC = 0.693_EB*GAMMA*DD1/(DM**GAMMA)SFAC = DD1/(SQRT(TWOPI)*SIGMA) INTLOOP: DO J=1,NPT DI = (J-.5_EB)*DD1 RR(J) = .5_EB*DI IF (DI<=DM) THEN ETRM = EXP(-(LOG(DI/DM))**2/(2._EB*SIGMA**2)) SUM1 = SUM1 + (SFAC/DI**4)*ETRM ELSE ETRM = EXP(-0.693_EB*(DI/DM)**GAMMA) SUM1 = SUM1 + GFAC*DI**(GAMMA-4._EB)*ETRM ENDIF CNF(J) = SUM1ENDDO INTLOOP CNF = CNF/SUM1 END SUBROUTINE DROPLET_SIZE_DISTRIBUTIONEND MODULE PHYSICAL_FUNCTIONS MODULE MATH_FUNCTIONSUSE PRECISION_PARAMETERSIMPLICIT NONE CONTAINS REAL(EB) FUNCTION AFILL(A111,A211,A121,A221,A112,A212,A122,A222,P,R,S)! Linear interpolation functionREAL(EB) :: A111,A211,A121,A221,A112,A212,A122,A222,P,R,S,PP,RR,SSPP = 1._EB-PRR = 1._EB-RSS = 1._EB-SAFILL = ((PP*A111+P*A211)*RR+(PP*A121+P*A221)*R)*SS+((PP*A112+P*A212)*RR+(PP*A122+P*A222)*R)*SEND FUNCTION AFILL REAL(EB) FUNCTION AFILL2(A,I,J,K,P,R,S)! Linear interpolation function. Same as AFILL, only it reads in entire array.REAL(EB), INTENT(IN), DIMENSION(0:,0:,0:) :: AINTEGER, INTENT(IN) :: I,J,KREAL(EB) A111,A211,A121,A221,A112,A212,A122,A222,P,R,S,PP,RR,SSA111 = A(I,J,K)A211 = A(I+1,J,K)A121 = A(I,J+1,K)A221 = A(I+1,J+1,K)A112 = A(I,J,K+1)A212 = A(I+1,J,K+1)A122 = A(I,J+1,K+1)A222 = A(I+1,J+1,K+1)PP = 1._EB-PRR = 1._EB-RSS = 1._EB-SAFILL2 = ((PP*A111+P*A211)*RR+(PP*A121+P*A221)*R)*SS+ ((PP*A112+P*A212)*RR+(PP*A122+P*A222)*R)*SEND FUNCTION AFILL2 REAL(EB) FUNCTION POLYVAL(N,TEMP,COEF)! Calculate the value of polynomial function.INTEGER N,IREAL(EB) TEMP, COEF(N), VALVAL = 0._EBDO I=1,N VAL = VAL + COEF(I)*TEMP**(I-1)ENDDOPOLYVAL = VALEND FUNCTION POLYVAL SUBROUTINE GET_RAMP_INDEX(ID,TYPE,RAMP_INDEX)USE GLOBAL_CONSTANTS, ONLY: N_RAMP,RAMP_ID,RAMP_TYPECHARACTER(*), INTENT(IN) :: ID,TYPEINTEGER, INTENT(OUT) :: RAMP_INDEXINTEGER :: NR IF (ID=='null') THEN RAMP_INDEX = 0 RETURNENDIF SEARCH: DO NR=1,N_RAMP IF (ID==RAMP_ID(NR)) THEN RAMP_INDEX = NR RETURN ENDIFENDDO SEARCH N_RAMP = N_RAMP + 1RAMP_INDEX = N_RAMPRAMP_ID(RAMP_INDEX) = IDRAMP_TYPE(RAMP_INDEX) = TYPEEND SUBROUTINE GET_RAMP_INDEXSUBROUTINE GET_TABLE_INDEX(ID,TYPE,TABLE_INDEX)USE GLOBAL_CONSTANTS, ONLY: N_TABLE,TABLE_ID,TABLE_TYPECHARACTER(*), INTENT(IN) :: IDINTEGER, INTENT(IN) :: TYPEINTEGER, INTENT(OUT) :: TABLE_INDEXINTEGER :: NT IF (ID=='null') THEN TABLE_INDEX = 0 RETURNENDIF SEARCH: DO NT=1,N_TABLE IF (ID==TABLE_ID(NT)) THEN TABLE_INDEX = NT RETURN ENDIFENDDO SEARCH N_TABLE = N_TABLE + 1TABLE_INDEX = N_TABLETABLE_ID(TABLE_INDEX) = IDTABLE_TYPE(TABLE_INDEX) = TYPEEND SUBROUTINE GET_TABLE_INDEXREAL(EB) FUNCTION EVALUATE_RAMP(RAMP_INPUT,TAU,RAMP_INDEX)USE TYPES, ONLY: RAMPSUSE DEVICE_VARIABLES, ONLY: DEVICEUSE CONTROL_VARIABLES, ONLY:CONTROL! General time ramp up
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -