Code Duplication    Length = 48-49 lines in 2 locations

metpy/calc/thermo.py 2 locations

@@ 379-427 (lines=49) @@
376
    y = y[keep_idx]
377
    return x, y
378
379
@exporter.export
380
def cape(pressure, temperature, dewpt, parcel_temperature=None, use_virtual_temperature=False):
381
    r"""Calculate convective available potential energy (CAPE).
382
383
        Description
384
385
        Parameters
386
        ----------
387
        pressure : `pint.Quantity`
388
            The atmospheric pressure level(s) of interest. The first entry should be the starting
389
            point pressure.
390
        temperature : `pint.Quantity`
391
            The starting temperature
392
        dewpt : `pint.Quantity`
393
            The starting dew point
394
        parcel_temperature : `pint.Quantity`
395
            The temperature of the parcel
396
397
        Returns
398
        -------
399
        `pint.Quantity`
400
            Convective available potential energy (CAPE).
401
402
        See Also
403
        --------
404
        virtual_temperature, find_intersections, lfc, el
405
        """
406
    if parcel_temperature is None:
407
        parcel_temperature = parcel_profile(pressure, temperature[0], dewpt[0])
408
409
    if use_virtual_temperature:
410
        temperature = virtual_temperature(pressure, temperature, dewpt)
411
        parcel_temperature = virtual_temperature(pressure, parcel_temperature, dewpt)
412
413
    y = (parcel_temperature - temperature).to(units.degK)
414
415
    x,y = _find_append_zero_crossings(np.copy(pressure),y)
416
417
    # Clip out negative area (temperature parcel < temperature environment)
418
    y[y <= 0 * units.degK] = 0 * units.degK
419
420
    # Only use data between the LFC and EL for calculation
421
    lfc_pressure = lfc(pressure, temperature, dewpt)[0].magnitude
422
    el_pressure = el(pressure, temperature, dewpt)[0].magnitude
423
    p_mask = (x <= lfc_pressure) & (x >= el_pressure)
424
    x = x[p_mask]
425
    y = y[p_mask]
426
427
    return (Rd * (np.trapz(y, np.log(x)) * units.degK)).to(units('J/kg'))
428
429
430
@exporter.export
@@ 430-477 (lines=48) @@
427
    return (Rd * (np.trapz(y, np.log(x)) * units.degK)).to(units('J/kg'))
428
429
430
@exporter.export
431
def cin(pressure, temperature, dewpt, parcel_temperature=None, use_virtual_temperature=False):
432
    r"""Calculate convective inhibition (CIN).
433
434
        Description
435
436
        Parameters
437
        ----------
438
        pressure : `pint.Quantity`
439
            The atmospheric pressure level(s) of interest. The first entry should be the starting
440
            point pressure.
441
        temperature : `pint.Quantity`
442
            The starting temperature
443
        dewpt : `pint.Quantity`
444
            The starting dew point
445
        parcel_temperature : `pint.Quantity`
446
            The temperature of the parcel
447
448
        Returns
449
        -------
450
        `pint.Quantity`
451
            Convective inhibition (CIN).
452
453
        See Also
454
        --------
455
        virtual_temperature, find_intersections, lfc
456
        """
457
    if parcel_temperature is None:
458
        parcel_temperature = parcel_profile(pressure, temperature[0], dewpt[0])
459
460
    if use_virtual_temperature:
461
        temperature = virtual_temperature(pressure, temperature, dewpt)
462
        parcel_temperature = virtual_temperature(pressure, parcel_temperature, dewpt)
463
464
    y = (parcel_temperature - temperature).to(units.degK)
465
466
    x,y = _find_append_zero_crossings(np.copy(pressure),y)
467
468
    # Clip out positive area (temperature parcel > temperature environment)
469
    y[y >= 0 * units.degK] = 0 * units.degK
470
471
    # Only use data between the surface and the LFC for calculation
472
    lfc_pressure = lfc(pressure, temperature, dewpt)[0].magnitude
473
    p_mask = (x >= lfc_pressure)
474
    x = x[p_mask]
475
    y = y[p_mask]
476
477
    return (Rd * (np.trapz(y, np.log(x)) * units.degK)).to(units('J/kg'))
478
479
480
@exporter.export