/// <inheritdoc/> public override async Task Open(Runtime.Grpc.Interaction.OpenTunnel request, IServerStreamWriter <Runtime.Grpc.Interaction.CommittedEventStreamWithContext> responseStream, ServerCallContext context) { try { var tunnel = new QuantumTunnel(_serializer, responseStream, context.CancellationToken, _logger); var application = request.Application.ToConcept <Application>(); var boundedContext = request.BoundedContext.ToConcept <BoundedContext>(); var events = request .Events .Select(@event => @event.ToArtifact()) .ToArray(); var tenantOffsets = request.Offsets.ToTenantOffsets(); var subscription = new EventParticleSubscription(events); _logger.Information($"Opening up a quantum tunnel for bounded context '{boundedContext}' in application '{application}'"); var singularity = new Singularity(application, boundedContext, tunnel, subscription); _eventHorizon.GravitateTowards(singularity, tenantOffsets); tunnel.Collapsed += qt => _eventHorizon.Collapse(singularity); await tunnel.Open(request.Offsets.ToTenantOffsets()); _logger.Information($"Quantum tunnel collapsed for bounded context '{boundedContext}' in application '{application}'"); } catch (Exception ex) { _logger.Error(ex, "Problems opening tunnel"); } await Task.CompletedTask; }
public void TestQuantumTunnel() { // NOTE - this fails due to floating point innacuracy with very small numbers... //Taken from University Physics example 40.7 QuantumTunnel tunnel = new QuantumTunnel(new Energy(5, UniversityPhysics.Enums.EnergyMeasure.eV), new Energy(2, UniversityPhysics.Enums.EnergyMeasure.eV), 1E-9, Constants.Common.M_e); Assert.IsTrue(UniversityPhysics.Maths.MathsHelpers.WithinTolerance(tunnel.TunnelProbability, 7.1E-8)); tunnel.BarrierWidth = 0.5E-9; Assert.IsTrue(UniversityPhysics.Maths.MathsHelpers.WithinTolerance(tunnel.TunnelProbability, 5.2E-4)); }