1
0
Fork 0

Initial commit

main
Christoph Giess 2023-02-14 08:06:33 +01:00
parent 0def711fcf
commit 98dd45efbb
8 changed files with 193 additions and 2 deletions

View File

@ -1,3 +1,6 @@
# flutter_demo_energy
# Beispiel: Energieberechnung & Tests
Aktuell enthält das Repo nur die Business-Logik und die Tests der Energy-App.
Dieser Code ist unabhängig von Flutter. Die Tests können daher sowohl mit
`flutter test` als auch `dart test` ausgeführt werden.
Flutter Beispiel Energie-Berechung

View File

@ -0,0 +1,29 @@
# This file configures the analyzer, which statically analyzes Dart code to
# check for errors, warnings, and lints.
#
# The issues identified by the analyzer are surfaced in the UI of Dart-enabled
# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be
# invoked from the command line by running `flutter analyze`.
# The following line activates a set of recommended lints for Flutter apps,
# packages, and plugins designed to encourage good coding practices.
include: package:flutter_lints/flutter.yaml
linter:
# The lint rules applied to this project can be customized in the
# section below to disable rules from the `package:flutter_lints/flutter.yaml`
# included above or to enable additional rules. A list of all available lints
# and their documentation is published at
# https://dart-lang.github.io/linter/lints/index.html.
#
# Instead of disabling a lint rule for the entire project in the
# section below, it can also be suppressed for a single line of code
# or a specific dart file by using the `// ignore: name_of_lint` and
# `// ignore_for_file: name_of_lint` syntax on the line or in the file
# producing the lint.
rules:
# avoid_print: false # Uncomment to disable the `avoid_print` rule
# prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule
# Additional information about this file can be found at
# https://dart.dev/guides/language/analysis-options

View File

@ -0,0 +1,30 @@
/// free fall acceleration in m/s²
const double g = 9.81;
///
/// Potential Energy = [mass] * [height] * g
/// with [mass] in kg, [height] in m and result in m²kg/s² = Joule
double potential(double mass, double height) {
return mass * height * g;
}
double freedPotential(double mass, double hStart, double hEnd) {
return potential(mass, hStart) - potential(mass, hEnd);
}
///
/// Kinetic energy = 0.5 [mass] * [velocity] * [velocity]
/// with [mass] in kg and velocity in m/s and result in m²kg/s² = Joule
double kinetic(double mass, double velocity) {
return mass * velocity * velocity / 2;
}
double freedKinetic(double mass, double vStart, double vEnd) {
return kinetic(mass, vStart) - kinetic(mass, vEnd);
}
///
/// Amount of freed energy when an object changes its height from [hStart] m to [hEnd] m
/// and changes its velocity from [vStart] m/s² to [vEnd] m/s².
double freedEnergy(double mass, double hStart, double hEnd, double vStart, double vEnd) {
return freedPotential(mass, hStart, hEnd) + freedKinetic(mass, vStart, vEnd);
}

View File

@ -0,0 +1,31 @@
/// energyNeededToHeatAParticularMaterial = tempDiff * specificHeatCapacity (measued in J/kg)
/// we have some amount of energy e
/// e / energyNeededToHeatAParticularMaterial => amount of material which can be heated (in kg)
/// for H2H: 1 l = 1 kg
double _kg(double energy, double specHeatCapacity, double tempDiff) {
return energy / (tempDiff * specHeatCapacity);
}
/// Notes
/// Eine PKW-Bremscheibe ca. 6.5kg
/// LKW Actros: 34kg
/// Calculates the amount of water in Liter that can be heated
/// from 20°C to 100°C with the given [engergy] in Joule.
///
double literWaterThatCanBeBoiled(double energy) {
const double specHeatCapaH2O = 4180; // J(kg*K)
const double tempDiffH20 = 100 - 20; // K
return _kg(energy, specHeatCapaH2O, tempDiffH20);
}
///
/// Calculates the amount of iron in kg that can be heated
/// from 20°C to ???°C with the given [engergy] in Joule.
///
double kgIronThatCanBeHeatetUntilRed(double energy) {
const double specHeatCapaIron = 500; // J/(kg*K)
const double tempDiffIron = 700 - 20; // K
return _kg(energy, specHeatCapaIron, tempDiffIron);
}

View File

@ -0,0 +1,3 @@
const _factor = 3.6;
toKmPerHour(double mPerSecond) => mPerSecond * _factor;
tomPerSecond(double kmPerHour) => kmPerHour / _factor;

19
pubspec.yaml 100644
View File

@ -0,0 +1,19 @@
name: energy
description: Demo Application
publish_to: 'none' # Remove this line if you wish to publish to pub.dev
version: 1.0.0+1
environment:
sdk: ">=2.18.0 <3.0.0"
dependencies:
flutter:
sdk: flutter
dev_dependencies:
test:
flutter_lints: ^2.0.1

View File

@ -0,0 +1,64 @@
import 'package:energy/models/energy.dart';
import 'package:test/test.dart';
void main() {
const double oneTon = 1000.0; // kg
const double tenToStop = 50000.0; // J
const double oneTonTenMetersDown = 98100.0; // J
group('energy', () {
test('none', () {
expect(freedEnergy(oneTon, 0, 0, 0, 0), 0);
expect(freedEnergy(oneTon, 0, 0, 20, 20), 0);
});
group('potential', () {
test('10 m down', () {
expect(freedEnergy(oneTon, 10, 0, 0, 0), oneTonTenMetersDown);
expect(freedPotential(oneTon, 10, 0), oneTonTenMetersDown);
});
test('10 m up', () {
expect(freedEnergy(oneTon, 0, 10, 0, 0), -oneTonTenMetersDown);
expect(freedPotential(oneTon, 0, 10), -oneTonTenMetersDown);
});
test('20 m down', () {
expect(freedEnergy(oneTon, 2 * 10, 0, 0, 0), 2 * oneTonTenMetersDown);
expect(potential(oneTon, 2 * 10), 2 * oneTonTenMetersDown);
});
});
group('kinetic', () {
test('10 to 0', () {
expect(freedEnergy(oneTon, 0, 0, 10, 0), tenToStop);
expect(freedKinetic(oneTon, 10, 0), tenToStop);
});
test('0 to 10', () {
expect(freedEnergy(oneTon, 0, 0, 0, 10), -tenToStop);
expect(freedKinetic(oneTon, 0, 10), -tenToStop);
});
test('20 to 0', () {
expect(freedEnergy(oneTon, 0, 0, 20, 0), 4 * tenToStop);
expect(freedKinetic(oneTon, 20, 0), 4 * tenToStop);
});
});
group('sum', () {
test('10 down & 10 to 0', () {
expect(
freedEnergy(oneTon, 10, 0, 10, 0), oneTonTenMetersDown + tenToStop);
});
test('10 up & 0 to 10', () {
expect(
freedEnergy(oneTon, 0, 10, 0, 10), -(tenToStop + oneTonTenMetersDown));
});
test('10 down & 0 to 10', () {
expect(
freedEnergy(oneTon, 10, 0, 0, 10), oneTonTenMetersDown - tenToStop);
});
test('10 up & 10 to 0', () {
expect(
freedEnergy(oneTon, 0, 10, 10, 0), tenToStop - oneTonTenMetersDown);
});
});
});
}

View File

@ -0,0 +1,12 @@
import 'package:energy/models/heat_capacity.dart';
import 'package:test/test.dart';
void main() {
group('Joule to', () {
test('red heat 1 kg Iron', () {
expect(kgIronThatCanBeHeatetUntilRed(340000), 1);
});
test('boil 1 l Water', () {
expect(literWaterThatCanBeBoiled(334400), 1);
});});
}