Esempio n. 1
0
    def _copyPreviousSolution(self):
        if self._curTStep == 0:
            return

        # Function for finding closest timestep to current time
        def closest_floor(arr):
            tstep = arr.index.get_level_values('tstep')
            t = self._curTStep - tstep > 0
            # print(t)
            return (tstep[t].min())

        # Find closest time and copy fields to current time
        g = self.fields.groupby(level='fieldID').apply(closest_floor)
        for fID in g.index:
            key = (fID, g[fID])
            newKey = (fID, self._curTStep)
            f = self.fields[key]

            newField = Field.Field(f.getMesh(),
                                   f.getFieldID(),
                                   f.getValueType(),
                                   units=f.getUnits(),
                                   values=f.values,
                                   time=self._curTStep,
                                   fieldType=f.fieldType)
            self.fields.set_value(newKey, newField)

        # Find closest time and copy properties to current time
        g = self.properties.groupby(level=('propertyID',
                                           'objectID')).apply(closest_floor)
        for pID in g.index:
            key = (pID[0], pID[1], g[pID])
            newKey = (pID[0], pID[1], self._curTStep)
            p = self.properties[key]
            newProp = Property.Property(value=p.getValue(),
                                        propID=p.getPropertyID(),
                                        valueType=p.valueType,
                                        time=self._curTStep,
                                        units=p.getUnits(),
                                        objectID=p.getObjectID())
            self.properties.set_value(newKey, newProp)
def initialProps(props, jsondata, pID=PropertyID):
    # Number of rays
    nr = Property.Property(value=jsondata['sources'][0]['rays'],
                           propID=pID.PID_NumberOfRays,
                           valueType=ValueType.Scalar,
                           time=0.0,
                           units=None,
                           objectID=objID.OBJ_CHIP_ACTIVE_AREA)

    key = (pID.PID_NumberOfRays, objID.OBJ_CHIP_ACTIVE_AREA, 0)
    props.set_value(key, nr)

    # Refractive index of silicone cone
    v = jsondata['materials'][3]['refractiveIndex']
    nr = Property.Property(value=v,
                           propID=pID.PID_RefractiveIndex,
                           valueType=ValueType.Scalar,
                           time=0.0,
                           units=None,
                           objectID=objID.OBJ_CONE)

    key = (pID.PID_RefractiveIndex, objID.OBJ_CONE, 0)
    props.set_value(key, nr)

    # LED spectrum
    nr = Property.Property(value={
        "wavelengths": np.array([450]),
        "intensities": np.array([0])
    },
                           propID=pID.PID_LEDSpectrum,
                           valueType="dict",
                           time=0.0,
                           units=None,
                           objectID=objID.OBJ_LED)

    key = (pID.PID_LEDSpectrum, objID.OBJ_LED, 0)
    props.set_value(key, nr)

    # Chip spectrum
    v1 = jsondata['sources'][0]['wavelengths']
    v2 = jsondata['sources'][0]['intensities']
    nr = Property.Property(value={
        "wavelengths": np.array(v1),
        "intensities": np.array(v2)
    },
                           propID=pID.PID_ChipSpectrum,
                           valueType="dict",
                           time=0.0,
                           units=None,
                           objectID=objID.OBJ_CHIP_ACTIVE_AREA)

    key = (pID.PID_ChipSpectrum, objID.OBJ_CHIP_ACTIVE_AREA, 0)
    props.set_value(key, nr)

    # Color X
    nr = Property.Property(value=0,
                           propID=pID.PID_LEDColor_x,
                           valueType=ValueType.Scalar,
                           time=0.0,
                           units=None,
                           objectID=objID.OBJ_LED)

    key = (pID.PID_LEDColor_x, objID.OBJ_LED, 0)
    props.set_value(key, nr)

    # Color Y
    nr = Property.Property(value=0,
                           propID=pID.PID_LEDColor_y,
                           valueType=ValueType.Scalar,
                           time=0.0,
                           units=None,
                           objectID=objID.OBJ_LED)

    key = (pID.PID_LEDColor_y, objID.OBJ_LED, 0)
    props.set_value(key, nr)

    # CCT
    nr = Property.Property(value=0,
                           propID=pID.PID_LEDCCT,
                           valueType=ValueType.Scalar,
                           time=0.0,
                           units=None,
                           objectID=objID.OBJ_LED)

    key = (pID.PID_LEDCCT, objID.OBJ_LED, 0)
    props.set_value(key, nr)

    # RadiantPower
    nr = Property.Property(value=0,
                           propID=pID.PID_LEDRadiantPower,
                           valueType=ValueType.Scalar,
                           time=0.0,
                           units=None,
                           objectID=objID.OBJ_LED)

    key = (pID.PID_LEDRadiantPower, objID.OBJ_LED, 0)
    props.set_value(key, nr)

    # Number of fluorescent particles:
    nr = Property.Property(
        value=jsondata['materials'][3]['numberOfFluorescentParticles'],
        valueType=ValueType.Scalar,
        propID=pID.PID_NumberOfFluorescentParticles,
        time=0.0,
        units=None,
        objectID=objID.OBJ_CONE)
    key = (pID.PID_NumberOfFluorescentParticles, objID.OBJ_CONE, 0)
    props.set_value(key, nr)

    # Phosphor efficiency for PARTICLE_TYPE_1:
    p_eff = Property.Property(
        value=jsondata['materials'][3]['phosphorEfficiencies'][0],
        valueType=ValueType.Scalar,
        propID=pID.PID_PhosphorEfficiency,
        time=0.0,
        units=None,
        objectID=objID.OBJ_PARTICLE_TYPE_1)
    key = (pID.PID_PhosphorEfficiency, objID.OBJ_PARTICLE_TYPE_1, 0)
    props.set_value(key, p_eff)
    tracerApp.setProperty(pScat)
    tracerApp.setProperty(pPhase)

    # Connect fields
    fTemp = comsolApp.getField(FieldID.FID_Temperature, 0)
    fHeat = comsolApp.getField(FieldID.FID_Thermal_absorption_volume, 0)

    tracerApp.setField(fTemp)
    tracerApp.setField(fHeat)

    # Connect properties
    # Particle density
    vDens = 0.00003400
    pDens = Property.Property(value=vDens,
                              propID=PropertyID.PID_ParticleNumberDensity,
                              valueType=ValueType.Scalar,
                              time=0.0,
                              units=None,
                              objectID=objID.OBJ_CONE)
    tracerApp.setProperty(pDens)

    # Number of rays to trace
    pRays = Property.Property(value=100000,
                              propID=PropertyID.PID_NumberOfRays,
                              valueType=ValueType.Scalar,
                              time=0.0,
                              units=None,
                              objectID=objID.OBJ_CONE)
    tracerApp.setProperty(pRays)
    # Emission spectrum
    em = Property.Property(value=ex_em_import.getEm(),
                           propID=PropertyID.PID_EmissionSpectrum,
    tracerApp.setProperty(pPhase, objID.OBJ_PARTICLE_TYPE_1)
    logger.info('Props connected')

    # Connect fields
    fTemp = comsolApp.getField(FieldID.FID_Temperature, 0)
    fHeat = comsolApp.getField(FieldID.FID_Thermal_absorption_volume, 0)

    tracerApp.setField(fTemp)
    tracerApp.setField(fHeat)

    # Connect properties
    # Particle density
    vDens = 0.00000003400
    pDens = Property.Property(value=vDens,
                              propID=PropertyID.PID_ParticleNumberDensity,
                              valueType=ValueType.Scalar,
                              time=0.0,
                              units=None,
                              objectID=objID.OBJ_CONE)
    tracerApp.setProperty(pDens)

    # Number of rays to trace
    pRays = Property.Property(value=100,
                              propID=PropertyID.PID_NumberOfRays,
                              valueType=ValueType.Scalar,
                              time=0.0,
                              units=None,
                              objectID=objID.OBJ_CONE)
    tracerApp.setProperty(pRays)

    # Emission spectrum
    import numpy as np
def interpolateProperty(properties,
                        time,
                        propertyID,
                        objectID,
                        method='linear'):
    """
    Function to interpolate fields in between solved timesteps.


    Parameters
    ----------
    properties : pandas.Series of Property.Property
                 Series of properties for consecutive timesteps.
    time : float
           Time to interpolate data

    propetyID : PropertyID
                Type of the property to interpolate

    objectID : float
               Object id the porperty is attached to.

    method : string, optional
             Method to be used in the interpolation. Only linear is currently
             supported


    Returns
    -------
    interPorp : Property.Property
            Interpolated property


    """
    if not isinstance(properties, pd.Series):
        raise TypeError("Properties should be in pandas Series -object")

    # Find closest timesteps
    idx_tstep = properties.loc[propertyID, objectID, :].index
    value_to_find = time
    Min = idx_tstep <= value_to_find
    Max = idx_tstep >= value_to_find

    p_min = properties[(propertyID, objectID, idx_tstep[Min].max())]
    p_max = properties[(propertyID, objectID, idx_tstep[Max].min())]

    # Dictinary not supported
    if type(p_max.getValue()) == dict:
        logger.warning('Interpolation of (dict) not supported! Returning max.')
        return (p_max)

    # Interpolate property getValue().
    if method == 'linear':
        newValue = p_min.getValue() + (p_max.getValue() -
                                       p_min.getValue()) / 2.0
    else:
        logger.warning(
            'Interpolation method (%s) not supported! Using linear.' % method)
        newValue = p_min.getValue() + (p_max.getValue() -
                                       p_min.getValue()) / 2.0

    # Create new property.
    newProp = Property.Property(value=newValue,
                                propID=propertyID,
                                valueType=p_min.getValueType(),
                                time=time,
                                units=p_min.getUnits(),
                                objectID=objectID)

    return (newProp)