//public static string RunCalculationGetSummary(int projectId) //{ // var potController = new MappedObjectController(); // potController.createDamageExtent(projectId); // return GetSummary(projectId); //} public static ProjectResult ComputeResult(int projectId, bool details = false) { var _controller = new DamageExtentController(); ProjectResult _result = _controller.computeProjectResult(projectId, details); return(_result); }
/// <summary> /// Delete all damage extents of this project in database and recreate them /// </summary> /// <param name="projectId"></param> /// <returns></returns> public void createDamageExtent(int projectId) { Stopwatch _stopWatch = new Stopwatch(); _stopWatch.Start(); //DBManager.NewSession(); //bac session //ConcurrentBag<DamageExtent> _saveDamageExtents = new ConcurrentBag<DamageExtent>(); List <DamageExtent> _saveDamageExtents = new List <DamageExtent>(); var _damageExtentController = new DamageExtentController(); _damageExtentController.deleteDamageExtentsFromDB(projectId); //DELETE var _hazards = ActiveSession.QueryOver <NatHazard>().List <NatHazard>(); var _ikClasses = ActiveSession.QueryOver <IKClasses>().List <IKClasses>(); List <bool> _beforeActions = new List <bool>() { true, false }; Logging.warn($"querying: elapsed time = " + _stopWatch.Elapsed.ToString()); _stopWatch.Restart(); var _damagePotentialController = new MappedObjectController(); var _allAffectedDamagePotentials = _damagePotentialController.getAllDamagePotentials(projectId); //unprocessed Damage Potentials in the project perimeter Logging.warn($"getAllDamagePotentials: elapsed time = " + _stopWatch.Elapsed.ToString() + $", count= {_allAffectedDamagePotentials.Count()}"); _stopWatch.Restart(); foreach (var hazard in _hazards) { foreach (var period in _ikClasses) { foreach (var beforeAction in _beforeActions) { _stopWatch.Restart(); var _controller = new IntensityController(); List <Intensity> _intensities = _controller.getIntensityMap(projectId, hazard.ID, period.ID, beforeAction); List <MappedObject> _allProcessedDamagePotentials = new List <MappedObject>(); Logging.warn($"getIntensityMap: elapsed time = " + _stopWatch.Elapsed.ToString()); _stopWatch.Restart(); if (_intensities == null || _intensities.Count() == 0) { continue; } Stopwatch _damageWatch = new Stopwatch(); _damageWatch.Start(); // gather all processed DamagePotentials foreach (var intensity in _intensities) { _damageWatch.Restart(); IList <MappedObject> dpListWithin = _damagePotentialController.getDamagePotentialsWithin(intensity, _allAffectedDamagePotentials); List <MappedObject> outlist = dpListWithin.ToList(); Logging.warn($">getDamagePotentialsWithin: elapsed time = " + _damageWatch.Elapsed.ToString()); _damageWatch.Restart(); //IList<MappedObject> dpListWithin2 = _damagePotentialController.getDamagePotentialsWithin2(intensity, projectId); //List<MappedObject> outlist = dpListWithin2.ToList(); //Logging.warn($">getDamagePotentialsWithin2: elapsed time = " + _damageWatch.Elapsed.ToString()); //_damageWatch.Restart(); IList <MappedObject> dpListCrossing = _damagePotentialController.getDamagePotentialCrossing(intensity, _allAffectedDamagePotentials); outlist.AddRange(dpListCrossing); //Merge Within and Crossing for Intensity Logging.warn($">getDamagePotentialCrossing: elapsed time = " + _damageWatch.Elapsed.ToString()); _damageWatch.Restart(); //IList<MappedObject> dpListCrossing2 = _damagePotentialController.getDamagePotentialCrossing2(intensity, projectId); //outlist.AddRange(dpListCrossing2); //Merge Within and Crossing for Intensity //Logging.warn($">getDamagePotentialCrossing2: elapsed time = " + _damageWatch.Elapsed.ToString()); //_damageWatch.Restart(); _allProcessedDamagePotentials.AddRange(outlist); //collect all processed DamagePotentials } _damageWatch.Stop(); Logging.warn($"getDamagePotential: elapsed time = " + _stopWatch.Elapsed.ToString()); _stopWatch.Restart(); //Parallel.ForEach(_intensities, // (intensity) => // { foreach (var intensity in _intensities) { var outlist = _allProcessedDamagePotentials.Where(o => o.Intensity.ID == intensity.ID).ToList(); List <DamageExtent> outDamageExtents = new List <DamageExtent>(); //ConcurrentBag<DamageExtent> outDamageExtents = new ConcurrentBag<DamageExtent>(); //Parallel.ForEach(outlist, (damagePotential) => //{ foreach (MappedObject damagePotential in outlist) { DamageExtent damageExtent = null; damageExtent = DamageExtentController.computeDamageExtent(damagePotential, intensity); if (damageExtent != null) { outDamageExtents.Add(damageExtent); } } //}); _saveDamageExtents.AddRange(outDamageExtents); //_saveDamageExtents.AddRange<DamageExtent>(outDamageExtents); //double _sumPersonDamage = outDamageExtents.Sum(x => x.PersonDamage); //double _sumDeaths = outDamageExtents.Sum(x => x.Deaths); //double _sumProptertyDamage = outDamageExtents.Sum(x => x.PropertyDamage); //Logging.warn($" #DamageExtent: {outlist.Count}"); } //loop over intensities //}); Logging.warn($"computeDamageExtent: elapsed time = " + _stopWatch.Elapsed.ToString()); _stopWatch.Restart(); } //loop over actions } //loop over period } //loop over hazard Logging.warn($"inbetween: elapsed time = " + _stopWatch.Elapsed.ToString()); _stopWatch.Restart(); //one time saving to db <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< _damageExtentController.saveDamageExtentToDB(_saveDamageExtents.ToList()); //SAVE Logging.warn($"saveDamageExtentToDB: elapsed time = " + _stopWatch.Elapsed.ToString()); _stopWatch.Restart(); _stopWatch.Stop(); //Change the project to state "Calculated" var _resultController = new ResultController(); _resultController.setProjectStatus(projectId, 2); }