Пример #1
0
def masterRayl(numDeps, numLams, temp, lambdaScale, stagePops, gsName,
               gsFirstMol, molPops):
    """ /*c******************************************************************************
c  The subroutines needed to calculate the opacities from scattering by
c  H I, H2, He I, are in this file.  These are from ATLAS9.
c******************************************************************************
*/"""

    #//System.out.println("masterRayl called...");

    #//From Moog source file Opacitymetals.f
    #// From how values such as aC1[] are used in Moog file Opacit.f to compute the total opacity
    #// and then the optical depth scale, I infer that they are extinction coefficients
    #// in cm^-1
    #//
    #// There does not seem to be any correction for stimulated emission

    logE = math.log10(math.e)

    masterRScat = [[0.0 for i in range(numDeps)] for j in range(numLams)]

    logUH1 = [0.0 for i in range(5)]
    logUHe1 = [0.0 for i in range(5)]

    logStatWH1 = 0.0
    logStatWHe1 = 0.0

    theta = 1.0
    species = ""

    logGroundPopsH1 = [0.0 for i in range(numDeps)]
    logGroundPopsHe1 = [0.0 for i in range(numDeps)]
    logH2Pops = [0.0 for i in range(numDeps)]
    #//
    #// H I: Z=1 --> iZ=0:
    sigH1 = [0.0 for i in range(numDeps)]
    #// He I: Z=2 --> iZ=1:
    sigHe1 = [0.0 for i in range(numDeps)]
    species = "HI"
    logUH1 = PartitionFn.getPartFn2(species)
    species = "HeI"
    logUHe1 = PartitionFn.getPartFn2(species)

    sigH2 = [0.0 for i in range(numDeps)]

    #Find index of H2 in molPops array
    for iH2 in range(len(gsName)):
        if (gsName[iH2].strip() == "H2"):
            break
    #print("iH2 ", iH2, " iH2-gsFirstMol ", (iH2-gsFirstMol))

    #//System.out.println("iD     PopsH1     PopsHe1");
    for iD in range(numDeps):
        #//neutral stage
        #//Assumes ground state stat weight, g_1, is 1.0
        #theta = 5040.0 / temp[0][iD]
        #// U[0]: theta = 1.0, U[1]: theta = 0.5
        """
        if (theta <= 0.5):
            logStatWH1 = logUH1[1]
            logStatWHe1 = logUHe1[1]
        elif ( (theta < 1.0) and (theta > 0.5) ):
            logStatWH1 = ( (theta-0.5) * logUH1[0] ) + ( (1.0-theta) * logUH1[1] )
            logStatWHe1 = ( (theta-0.5) * logUHe1[0] ) + ( (1.0-theta) * logUHe1[1] )
            #//divide by common factor of interpolation interval of 0.5 = (1.0 - 0.5):
            logStatWH1 = 2.0 * logStatWH1 
            logStatWHe1 = 2.0 * logStatWHe1 
        else: 
            logStatWH1 = logUH1[0]
            logStatWHe1 = logUHe1[0]
        """
        thisTemp = temp[0][iD]

        #JB#
        logWH1Fit = ToolBox.cubicFit(masterTemp, logUH1)
        logStatWH1 = ToolBox.valueFromFit(logWH1Fit, thisTemp)

        logWHe1Fit = ToolBox.cubicFit(masterTemp, logUHe1)
        logStatWHe1 = ToolBox.valueFromFit(logWHe1Fit, thisTemp)

        #logStatWH1Fun = spline(masterTemp,logUH1)
        #logStatWH1=logStatWH1Fun(thisTemp)

        #logStatWHe1Fun = spline(masterTemp,logUHe1)
        #logStatWHe1=logStatWHe1Fun(thisTemp)
        #JB#

        #// NEW Interpolation with temperature for new partition function: lburns
        thisTemp = temp[0][iD]
        if (thisTemp <= 130.0):
            logStatWH1 = logUH1[0]
            logStatWHe1 = logUHe1[0]
        if (thisTemp >= 10000.0):
            logStatWH1 = logUH1[4]
            logStatWHe1 = logUHe1[4]
        """
        elif (thisTemp > 130 and thisTemp <= 500):
            logStatWH1 = logUH1[1] * (thisTemp - 130)/(500 - 130) \
                       + logUH1[0] * (500 - thisTemp)/(500 - 130)
            logStatWHe1 = logUHe1[1] * (thisTemp - 130)/(500 - 130) \
                       + logUHe1[0] * (500 - thisTemp)/(500 - 130)
        elif (thisTemp > 500 and thisTemp <= 3000):
            logStatWH1 = logUH1[2] * (thisTemp - 500)/(3000 - 500) \
                       + logUH1[1] * (3000 - thisTemp)/(3000 - 500)
            logStatWHe1 = logUHe1[2] * (thisTemp - 500)/(3000 - 500) \
                       + logUHe1[1] * (3000 - thisTemp)/(3000 - 500)
        elif (thisTemp > 3000 and thisTemp <= 8000):
            logStatWH1 = logUH1[3] * (thisTemp - 3000)/(8000 - 3000) \
                       + logUH1[2] * (8000 - thisTemp)/(8000 - 3000)
            logStatWHe1 = logUHe1[3] * (thisTemp - 3000)/(8000 - 3000) \
                       + logUHe1[2] * (8000 - thisTemp)/(8000 - 3000)
        elif (thisTemp > 8000 and thisTemp < 10000):
            logStatWH1 = logUH1[4] * (thisTemp - 8000)/(10000 - 8000) \
                       + logUH1[3] * (10000 - thisTemp)/(10000 - 8000)
            logStatWHe1 = logUHe1[4] * (thisTemp - 8000)/(10000 - 8000) \
                       + logUHe1[3] * (10000 - thisTemp)/(10000 - 8000)
        else:
            #// for temperatures of greater than or equal to 10000K lburns
            logStatWH1 = logUH1[4]
            logStatWHe1 = logUHe1[4]
            """

        logGroundPopsH1[iD] = stagePops[0][0][iD] - logStatWH1
        logGroundPopsHe1[iD] = stagePops[1][0][iD] - logStatWHe1
        logH2Pops[iD] = molPops[iH2 - gsFirstMol][iD]
        #print("iD " , iD , " logH2 " , logH2Pops[iD])

        #// if (iD%10 == 1){
        #//     System.out.format("%03d, %21.15f, %21.15f %n",
        #//          iD, logE*logGroundPopsH1[iD], logE*logGroundPopsHe1[iD]);
        #// }

    kapRScat = 0.0
    #//System.out.println("iD    iL    lambda    sigH1    sigHe1 ");
    for iL in range(numLams):
        #//
        for i in range(numDeps):
            sigH1[i] = 0.0
            sigHe1[i] = 0.0
            sigH2[i] = 0.0

            #//System.out.println("Calling opacH1 from masterMetal...");
        sigH1 = opacHscat(numDeps, temp, lambdaScale[iL], logGroundPopsH1)
        sigHe1 = opacHescat(numDeps, temp, lambdaScale[iL], logGroundPopsHe1)
        sigH2 = opacH2scat(numDeps, temp, lambdaScale[iL], logH2Pops)

        for iD in range(numDeps):
            kapRScat = sigH1[iD] + sigHe1[iD] + sigH2[iD]
            masterRScat[iL][iD] = math.log(kapRScat)
            #if ( (iD%10 == 0) and (iL%10 == 0) ):
            #        print("iD ", iD, " iL ", iL, " lambda ", lambdaScale[iL], math.log10(sigH1[iD]), math.log10(sigHe1[iD]), math.log10(sigH2[iD]) )

            #} //iD

        #} //iL

    return masterRScat
Пример #2
0
def masterMetal(numDeps, numLams, temp, lambdaScale, stagePops):
    """/* Metal b-f opacity routines taken from Moog (moogjul2014/, MOOGJUL2014.tar)
Chris Sneden (Universtiy of Texas at Austin)  and collaborators
http://www.as.utexas.edu/~chris/moog.html
//From Moog source file Opacitymetals.f
*/"""

    #//System.out.println("masterMetal called...");

    #//From Moog source file Opacitymetals.f
    #// From how values such as aC1[] are used in Moog file Opacit.f to compute the total opacity
    #// and then the optical depth scale, I infer that they are extinction coefficients
    #// in cm^-1
    #// There does not seem to be any correction for stimulated emission

    logE = math.log10(math.e)

    masterBF = [[0.0 for i in range(numDeps)] for j in range(numLams)]

    logUC1 = [0.0 for i in range(5)]
    logUMg1 = [0.0 for i in range(5)]
    logUMg2 = [0.0 for i in range(5)]
    logUAl1 = [0.0 for i in range(5)]
    logUSi1 = [0.0 for i in range(5)]
    logUSi2 = [0.0 for i in range(5)]
    logUFe1 = [0.0 for i in range(5)]

    logStatWC1 = 0.0
    logStatWMg1 = 0.0
    logStatWMg2 = 0.0
    logStatWAl1 = 0.0
    logStatWSi1 = 0.0
    logStatWSi2 = 0.0
    logStatWFe1 = 0.0

    theta = 1.0
    species = ""
    logGroundPopsC1 = [0.0 for i in range(numDeps)]
    logGroundPopsMg1 = [0.0 for i in range(numDeps)]
    logGroundPopsMg2 = [0.0 for i in range(numDeps)]
    logGroundPopsAl1 = [0.0 for i in range(numDeps)]
    logGroundPopsSi1 = [0.0 for i in range(numDeps)]
    logGroundPopsSi2 = [0.0 for i in range(numDeps)]
    logGroundPopsFe1 = [0.0 for i in range(numDeps)]

    #//
    #// C I: Z=6 --> iZ=5:
    aC1 = [0.0 for i in range(numDeps)]
    #// Mg I: Z=12 --> iZ=11:
    aMg1 = [0.0 for i in range(numDeps)]
    #// Mg II: Z=12 --> iZ=11:
    aMg2 = [0.0 for i in range(numDeps)]
    #// Al I: Z=13 --> iZ=12:
    aAl1 = [0.0 for i in range(numDeps)]
    #// Si I: Z=14 --> iZ=13:
    aSi1 = [0.0 for i in range(numDeps)]
    #// Si II: Z=14 --> iZ =13:
    aSi2 = [0.0 for i in range(numDeps)]
    #// Fe I: Z=26 --> iZ=25
    aFe1 = [0.0 for i in range(numDeps)]

    species = "CI"
    logUC1 = PartitionFn.getPartFn2(species)
    species = "MgI"
    logUMg1 = PartitionFn.getPartFn2(species)
    species = "MgII"
    logUMg2 = PartitionFn.getPartFn2(species)
    species = "AlI"
    logUAl1 = PartitionFn.getPartFn2(species)
    species = "SiI"
    logUSi1 = PartitionFn.getPartFn2(species)
    species = "SiII"
    logUSi2 = PartitionFn.getPartFn2(species)
    species = "FeI"
    logUFe1 = PartitionFn.getPartFn2(species)

    #//System.out.println("iD     PpC1     PpMg1      PpMg2     PpAl1     PpSi1     PpSi2     PpFe1");
    for iD in range(numDeps):
        #//neutral stage
        #//Assumes ground state stat weight, g_1, is 1.0
        #theta = 5040.0 / temp[0][iD]
        #// U[0]: theta = 1.0, U[1]: theta = 0.5
        """
        if (theta <= 0.5):
            logStatWC1 = logUC1[1]
            logStatWMg1 = logUMg1[1]
            logStatWMg2 = logUMg2[1]
            logStatWAl1 = logUAl1[1]
            logStatWSi1 = logUSi1[1]
            logStatWSi2 = logUSi2[1]
            logStatWFe1 = logUFe1[1]
        elif ( (theta < 1.0) and (theta > 0.5) ):
            logStatWC1 = ( (theta-0.5) * logUC1[0] ) + ( (1.0-theta) * logUC1[1] )
            #//divide by common factor of interpolation interval of 0.5 = (1.0 - 0.5):
            logStatWC1 = 2.0 * logStatWC1 
            logStatWMg1 = ( (theta-0.5) * logUMg1[0] ) + ( (1.0-theta) * logUMg1[1] );
            logStatWMg1 = 2.0 * logStatWMg1; 
            logStatWMg2 = ( (theta-0.5) * logUMg2[0] ) + ( (1.0-theta) * logUMg2[1] );
            logStatWMg2 = 2.0 * logStatWMg2; 
            logStatWAl1 = ( (theta-0.5) * logUAl1[0] ) + ( (1.0-theta) * logUAl1[1] );
            logStatWAl1 = 2.0 * logStatWAl1; 
            logStatWSi1 = ( (theta-0.5) * logUSi1[0] ) + ( (1.0-theta) * logUSi1[1] );
            logStatWSi1 = 2.0 * logStatWSi1; 
            logStatWSi2 = ( (theta-0.5) * logUSi2[0] ) + ( (1.0-theta) * logUSi2[1] );
            logStatWSi2 = 2.0 * logStatWSi2; 
            logStatWFe1 = ( (theta-0.5) * logUFe1[0] ) + ( (1.0-theta) * logUFe1[1] );
            logStatWFe1 = 2.0 * logStatWFe1; 
        else:
            logStatWC1 = logUC1[0]
            logStatWMg1 = logUMg1[0]
            logStatWMg2 = logUMg2[0]
            logStatWAl1 = logUAl1[0]
            logStatWSi1 = logUSi1[0]
            logStatWSi2 = logUSi2[0]
            logStatWFe1 = logUFe1[0]
        """

        thisTemp = temp[0][iD]
        #JB#
        logWC1Fit = ToolBox.cubicFit(masterTemp, logUC1)
        logStatWC1 = ToolBox.valueFromFit(logWC1Fit, thisTemp)

        logWMg1Fit = ToolBox.cubicFit(masterTemp, logUMg1)
        logStatWMg1 = ToolBox.valueFromFit(logWMg1Fit, thisTemp)

        logWSi1Fit = ToolBox.cubicFit(masterTemp, logUSi1)
        logStatWSi1 = ToolBox.valueFromFit(logWSi1Fit, thisTemp)

        logWMg2Fit = ToolBox.cubicFit(masterTemp, logUMg2)
        logStatWMg2 = ToolBox.valueFromFit(logWMg2Fit, thisTemp)

        logWSi2Fit = ToolBox.cubicFit(masterTemp, logUSi2)
        logStatWSi2 = ToolBox.valueFromFit(logWSi2Fit, thisTemp)

        logWFe1Fit = ToolBox.cubicFit(masterTemp, logUFe1)
        logStatWFe1 = ToolBox.valueFromFit(logWFe1Fit, thisTemp)

        logWAl1Fit = ToolBox.cubicFit(masterTemp, logUAl1)
        logStatWAl1 = ToolBox.valueFromFit(logWAl1Fit, thisTemp)

        #logStatWC1Fun = spline(masterTemp,logUC1)
        #logStatWC1=logStatWC1Fun(thisTemp)

        #logStatWMg1Fun = spline(masterTemp,logUMg1)
        #logStatWMg1=logStatWMg1Fun(thisTemp)

        #logStatWMg2Fun = spline(masterTemp,logUMg2)
        #logStatWMg2=logStatWMg2Fun(thisTemp)

        #logStatWAl1Fun = spline(masterTemp,logUAl1)
        #logStatWAl1=logStatWAl1Fun(thisTemp)

        #logStatWSi1Fun = spline(masterTemp,logUSi1)
        #logStatWSi1=logStatWSi1Fun(thisTemp)

        #logStatWSi2Fun = spline(masterTemp,logUSi2)
        #logStatWSi2=logStatWSi2Fun(thisTemp)

        #logStatWFe1Fun = spline(masterTemp,logUFe1)
        #logStatWFe1=logStatWFe1Fun(thisTemp)
        #JB#

        #// NEW Interpolation involving temperature for new partition function: lburns
        thisTemp = temp[0][iD]
        if (thisTemp <= 130.0):
            logStatWC1 = logUC1[0]
            logStatWMg1 = logUMg1[0]
            logStatWMg2 = logUMg2[0]
            logStatWAl1 = logUAl1[0]
            logStatWSi1 = logUSi1[0]
            logStatWSi2 = logUSi2[0]
            logStatWFe1 = logUFe1[0]
        if (thisTemp >= 10000.0):
            logStatWC1 = logUC1[4]
            logStatWMg1 = logUMg1[4]
            logStatWMg2 = logUMg2[4]
            logStatWAl1 = logUAl1[4]
            logStatWSi1 = logUSi1[4]
            logStatWSi2 = logUSi2[4]
            logStatWFe1 = logUFe1[4]
        """
        elif (thisTemp > 130 and thisTemp <= 500):
            #// Add in interpolation here lburns
            logStatWC1 = logUC1[1] * (thisTemp - 130)/(500 - 130) \
                + logUC1[0] * (500 - thisTemp)/(500 - 130)
            logStatWMg1 = logUMg1[1] * (thisTemp - 130)/(500 - 130) \
                + logUMg1[0] * (500 - thisTemp)/(500 - 130)
            logStatWMg2 = logUMg2[1] * (thisTemp - 130)/(500 - 130) \
                + logUMg2[0] * (500 - thisTemp)/(500 - 130)
            logStatWAl1 = logUAl1[1] * (thisTemp - 130)/(500 - 130) \
                + logUAl1[0] * (500 - thisTemp)/(500 - 130)
            logStatWSi1 = logUSi1[1] * (thisTemp - 130)/(500 - 130) \
                + logUSi1[0] * (500 - thisTemp)/(500 - 130)
            logStatWSi2 = logUSi2[1] * (thisTemp - 130)/(500 - 130) \
                + logUSi2[0] * (500 - thisTemp)/(500 - 130)
            logStatWFe1 = logUFe1[1] * (thisTemp - 130)/(500 - 130) \
                + logUFe1[0] * (500 - thisTemp)/(500 - 130)
        elif (thisTemp > 500 and thisTemp <= 3000):
            logStatWC1 = logUC1[2] * (thisTemp - 500)/(3000 - 500) \
                + logUC1[1] * (3000 - thisTemp)/(3000 - 500)
            logStatWMg1 = logUMg1[2] * (thisTemp - 500)/(3000 - 500) \
                + logUMg1[1] * (3000 - thisTemp)/(3000 - 500)
            logStatWMg2 = logUMg2[2] * (thisTemp - 500)/(3000 - 500) \
                + logUMg2[1] * (3000 - thisTemp)/(3000 - 500) 
            logStatWAl1 = logUAl1[2] * (thisTemp - 500)/(3000 - 500) \
                + logUAl1[1] * (3000 - thisTemp)/(3000 - 500) 
            logStatWSi1 = logUSi1[2] * (thisTemp - 500)/(3000 - 500) \
                + logUSi1[1] * (3000 - thisTemp)/(3000 - 500)
            logStatWSi2 = logUSi2[2] * (thisTemp - 500)/(3000 - 500) \
                + logUSi2[1] * (3000 - thisTemp)/(3000 - 500)
            logStatWFe1 = logUFe1[2] * (thisTemp - 500)/(3000 - 500) \
                + logUFe1[1] * (3000 - thisTemp)/(3000 - 500)
        elif (thisTemp > 3000 and thisTemp <= 8000):
            logStatWC1 = logUC1[3] * (thisTemp - 3000)/(8000 - 3000) \
                + logUC1[2] * (8000 - thisTemp)/(8000 - 3000)
            logStatWMg1 = logUMg1[3] * (thisTemp - 3000)/(8000 - 3000) \
                + logUMg1[2] * (8000 - thisTemp)/(8000 - 3000)
            logStatWMg2 = logUMg2[3] * (thisTemp - 3000)/(8000 - 3000) \
                + logUMg2[2] * (8000 - thisTemp)/(8000 - 3000) 
            logStatWAl1 = logUAl1[3] * (thisTemp - 3000)/(8000 - 3000) \
                + logUAl1[2] * (8000 - thisTemp)/(8000 - 3000)
            logStatWSi1 = logUSi1[3] * (thisTemp - 3000)/(8000 - 3000) \
                + logUSi1[2] * (8000 - thisTemp)/(8000 - 3000) 
            logStatWSi2 = logUSi2[3] * (thisTemp - 3000)/(8000 - 3000) \
                + logUSi2[2] * (8000 - thisTemp)/(8000 - 3000)
            logStatWFe1 = logUFe1[3] * (thisTemp - 3000)/(8000 - 3000) \
                + logUFe1[2] * (8000 - thisTemp)/(8000 - 3000)
        elif (thisTemp > 8000 and thisTemp < 10000):
            logStatWC1 = logUC1[4] * (thisTemp - 8000)/(10000 - 8000) \
                + logUC1[3] * (10000 - thisTemp)/(10000 - 8000)
            logStatWMg1 = logUMg1[4] * (thisTemp - 8000)/(10000 - 8000) \
                + logUMg1[3] * (10000 - thisTemp)/(10000 - 8000)
            logStatWMg2 = logUMg2[4] * (thisTemp - 8000)/(10000 - 8000) \
                + logUMg2[3] * (10000 - thisTemp)/(10000 - 8000)
            logStatWAl1 = logUAl1[4] * (thisTemp - 8000)/(10000 - 8000) \
                + logUAl1[3] * (10000 - thisTemp)/(10000 - 8000)
            logStatWSi1 = logUSi1[4] * (thisTemp - 8000)/(10000 - 8000) \
                + logUSi1[3] * (10000 - thisTemp)/(10000 - 8000) 
            logStatWSi2 = logUSi2[4] * (thisTemp - 8000)/(10000 - 8000) \
                + logUSi2[3] * (10000 - thisTemp)/(10000 - 8000) 
            logStatWFe1 = logUFe1[4] * (thisTemp - 8000)/(10000 - 8000) \
                + logUFe1[3] * (10000 - thisTemp)/(10000 - 8000)
        else:
            #// for temperatures greater than or equal to 10000
            logStatWC1 = logUC1[4]
            logStatWMg1 = logUMg1[4]
            logStatWMg2 = logUMg2[4]
            logStatWAl1 = logUAl1[4]
            logStatWSi1 = logUSi1[4]
            logStatWSi2 = logUSi2[4]
            logStatWFe1 = logUFe1[4]
        """

        logGroundPopsC1[iD] = stagePops[5][0][iD] - logStatWC1
        logGroundPopsMg1[iD] = stagePops[11][0][iD] - logStatWMg1
        logGroundPopsMg2[iD] = stagePops[11][1][iD] - logStatWMg2
        logGroundPopsAl1[iD] = stagePops[12][0][iD] - logStatWAl1
        logGroundPopsSi1[iD] = stagePops[13][0][iD] - logStatWSi1
        logGroundPopsSi2[iD] = stagePops[13][1][iD] - logStatWSi2
        logGroundPopsFe1[iD] = stagePops[25][0][iD] - logStatWFe1

        #// if (iD%5 == 1){
        #//     System.out.format("%03d, %21.15f, %21.15f, %21.15f, %21.15f, %21.15f, %21.15f, %21.15f %n",
        #//          iD, logE*(logGroundPopsC1[iD]+temp[1][iD]+Useful.logK()),
        #//              logE*(logGroundPopsMg1[iD]+temp[1][iD]+Useful.logK()),
        #//              logE*(logGroundPopsMg2[iD]+temp[1][iD]+Useful.logK()),
        #//              logE*(logGroundPopsAl1[iD]+temp[1][iD]+Useful.logK()),
        #//              logE*(logGroundPopsSi1[iD]+temp[1][iD]+Useful.logK()),
        #//              logE*(logGroundPopsSi2[iD]+temp[1][iD]+Useful.logK()),
        #//              logE*(logGroundPopsFe1[iD]+temp[1][iD]+Useful.logK()));
    #id loop// }

    #double waveno;  //cm??
    #double freq, logFreq, kapBF;
    #double stimEmExp, stimEmLogExp, stimEmLogExpHelp, stimEm;

    #//System.out.println("iD    iL    lambda    stimEm    aC1     aMg1     aMg2     aAl1    aSi1    aSi2    aFe1 ");
    for iL in range(numLams):
        #print("iL ", iL)
        #//
        #//initialization:
        for i in range(numDeps):
            aC1[i] = 0.0
            aMg1[i] = 0.0
            aMg2[i] = 0.0
            aAl1[i] = 0.0
            aSi1[i] = 0.0
            aSi2[i] = 0.0
            aFe1[i] = 0.0

        waveno = 1.0 / lambdaScale[iL]  #//cm^-1??
        logFreq = Useful.logC() - math.log(lambdaScale[iL])
        freq = math.exp(logFreq)
        #if (iL%20 == 1):
        #    print("freq ", freq)

        stimEmLogExpHelp = Useful.logH() + logFreq - Useful.logK()

        #//System.out.println("Calling opacC1 from masterMetal...");
        if (freq >= 2.0761e15):
            aC1 = opacC1(numDeps, temp, lambdaScale[iL], logGroundPopsC1)
        if (freq >= 2.997925e+14):
            #print("opacMg1 called")
            aMg1 = opacMg1(numDeps, temp, lambdaScale[iL], logGroundPopsMg1)
        if (freq >= 2.564306e15):
            aMg2 = opacMg2(numDeps, temp, lambdaScale[iL], logGroundPopsMg2)
        if (freq >= 1.443e15):
            aAl1 = opacAl1(numDeps, temp, lambdaScale[iL], logGroundPopsAl1)
        if (freq >= 2.997925e+14):
            #print("opacSi1 called")
            aSi1 = opacSi1(numDeps, temp, lambdaScale[iL], logGroundPopsSi1)
        if (freq >= 7.6869872e14):
            aSi2 = opacSi2(numDeps, temp, lambdaScale[iL], logGroundPopsSi2)
        if (waveno >= 21000.0):
            aFe1 = opacFe1(numDeps, temp, lambdaScale[iL], logGroundPopsFe1)

        for iD in range(numDeps):

            kapBF = 1.0e-99  #minimum safe value
            stimEmLogExp = stimEmLogExpHelp - temp[1][iD]
            stimEmExp = -1.0 * math.exp(stimEmLogExp)
            stimEm = (1.0 - math.exp(stimEmExp)
                      )  #//LTE correction for stimulated emission

            kapBF = kapBF + aC1[iD] + aMg1[iD] + aMg2[iD] + aAl1[iD] + aSi1[
                iD] + aSi2[iD] + aFe1[iD]
            #kapBF = aC1[iD] + aMg2[iD] + aAl1[iD] + aSi2[iD] + aFe1[iD]
            #if ( (iL%20 == 1) and (iD%10 == 1) ):
            #print("iL ", iL, " iD ", iD, " stimEm ", stimEm, " kapBF ", kapBF)
            #    print("aMg1 ", aMg1[iD], " aSi1 ", aSi1[iD])
            masterBF[iL][iD] = math.log(kapBF) + math.log(stimEm)
            #//  if ( (iD%10 == 0) && (iL%10 == 0) ) {
            #//    System.out.format("%03d, %03d, %21.15f, %21.15f, %21.15f, %21.15f, %21.15f, %21.15f, %21.15f, %21.15f, %21.15f, %n",
            #//       iD, iL, lambdaScale[iL], Math.log10(stimEm), Math.log10(aC1[iD]), Math.log10(aMg1[iD]), Math.log10(aMg2[iD]), Math.log10(aAl1[iD]), Math.log10(aSi1[iD]), Math.log10(aSi2[iD]), Math.log10(aFe1[iD]));
            #//  }

        #} //iD

    #} //iL

    return masterBF