@@ -65,15 +65,6 @@ private void calculateSensitivityValues(List<LfSensitivityFactor<AcVariableType,
6565 int contingencyIndex , int operatorStrategyIndex , SensitivityResultWriter resultWriter ) {
6666 Set <LfSensitivityFactor <AcVariableType , AcEquationType >> lfFactorsSet = new HashSet <>(lfFactors );
6767
68- // VALID_ONLY_FOR_FUNCTION status is for factors where variable element is not in the main connected component but reference element is.
69- // Therefore, the sensitivity is known to value 0 and the reference value can be computed.
70- lfFactors .stream ().filter (factor -> factor .getStatus () == LfSensitivityFactor .Status .VALID_ONLY_FOR_FUNCTION )
71- .forEach (factor -> {
72- if (!filterSensitivityValue (0 , factor .getVariableType (), factor .getFunctionType (), parameters )) {
73- resultWriter .writeSensitivityValue (factor .getIndex (), contingencyIndex , operatorStrategyIndex , 0 , unscaleFunction (factor , factor .getFunctionReference ()));
74- }
75- });
76-
7768 for (SensitivityFactorGroup <AcVariableType , AcEquationType > factorGroup : factorGroups .getList ()) {
7869 for (LfSensitivityFactor <AcVariableType , AcEquationType > factor : factorGroup .getFactors ()) {
7970 if (!lfFactorsSet .contains (factor )) {
@@ -87,16 +78,15 @@ private void calculateSensitivityValues(List<LfSensitivityFactor<AcVariableType,
8778 if (!factor .getFunctionEquationTerm ().isActive ()) {
8879 throw new PowsyblException ("Found an inactive equation for a factor that has no predefined result" );
8980 }
90- sensi = factor .getFunctionEquationTerm ().calculateSensi (factorsState , factorGroup .getIndex ());
81+ sensi = unscaleSensitivity ( factor , factor .getFunctionEquationTerm ().calculateSensi (factorsState , factorGroup .getIndex () ));
9182 }
9283 if (factor .getFunctionPredefinedResult () != null ) {
9384 ref = factor .getFunctionPredefinedResult ();
9485 } else {
95- ref = factor .getFunctionReference ();
86+ ref = unscaleFunction ( factor , factor .getFunctionReference () );
9687 }
97- double unscaledSensi = unscaleSensitivity (factor , sensi );
98- if (!filterSensitivityValue (unscaledSensi , factor .getVariableType (), factor .getFunctionType (), parameters )) {
99- resultWriter .writeSensitivityValue (factor .getIndex (), contingencyIndex , operatorStrategyIndex , unscaledSensi , unscaleFunction (factor , ref ));
88+ if (!filterSensitivityValue (sensi , factor .getVariableType (), factor .getFunctionType (), parameters )) {
89+ resultWriter .writeSensitivityValue (factor .getIndex (), contingencyIndex , operatorStrategyIndex , sensi , ref );
10090 }
10191 }
10292 }
@@ -344,19 +334,14 @@ private void analyzeContingencySet(Network network, LfNetworkList lfNetworks, Li
344334 LOGGER .info ("Running AC sensitivity analysis with {} factors, {} contingencies and {} operator strategies" ,
345335 allLfFactors .size (), propagatedContingencies .size (), operatorStrategies .size ());
346336
347- // next we only work with valid and valid only for function factors
348- var validFactorHolder = writeInvalidFactors (allFactorHolder , resultWriter , propagatedContingencies , new HashMap <>(), parameters );
349- var validLfFactors = validFactorHolder .getAllFactors ();
350-
351337 try (AcLoadFlowContext context = new AcLoadFlowContext (lfNetwork , acParameters )) {
352338
353339 runLoadFlow (context , true );
354340
355341 acParameters .setVoltageInitReport (false );
356342
357343 // index factors by variable group to compute a minimal number of states
358- SensitivityFactorGroupList <AcVariableType , AcEquationType > factorGroups = createFactorGroups (validLfFactors .stream ()
359- .filter (factor -> factor .getStatus () == LfSensitivityFactor .Status .VALID ).collect (Collectors .toList ()));
344+ SensitivityFactorGroupList <AcVariableType , AcEquationType > factorGroups = createFactorGroups (allLfFactors );
360345
361346 // compute the participation for each injection factor (+1 on the injection and then -participation factor on all
362347 // buses that contain elements participating to slack distribution
@@ -395,10 +380,12 @@ private void analyzeContingencySet(Network network, LfNetworkList lfNetworks, Li
395380 OpenLoadFlowParameters contingencylfParametersExt = applyGenericContingencyParameters (context , lfParameters , lfParametersExt ,
396381 sensitivityAnalysisParametersExt .isStartWithFrozenACEmulation ());
397382
383+ setPredefinedResults (allLfFactors , new DisabledNetwork (), null );
384+
398385 // calculate sensitivity values
399- setFunctionReferences (validLfFactors );
386+ setFunctionReferences (allLfFactors );
400387 if (parameters .getOperatorStrategiesCalculationMode () != SensitivityOperatorStrategiesCalculationMode .ONLY_OPERATOR_STRATEGIES ) {
401- calculateSensitivityValues (validFactorHolder .getFactorsForBaseNetwork (), factorGroups , factorsStates , -1 , -1 , resultWriter );
388+ calculateSensitivityValues (allFactorHolder .getFactorsForBaseNetwork (), factorGroups , factorsStates , -1 , -1 , resultWriter );
402389 }
403390
404391 NetworkState networkState = NetworkState .save (lfNetwork );
@@ -411,7 +398,7 @@ private void analyzeContingencySet(Network network, LfNetworkList lfNetworks, Li
411398 LfOperatorStrategy lfOperatorStrategy = LfOperatorStrategy .create (operatorStrategy , lfActionById );
412399 LfNetworkChange lfNetworkChange = new LfNetworkChange (lfNetwork , null , null , lfOperatorStrategy );
413400 processNetworkChange (lfParameters , resultWriter , variablesTargetVoltageInfo , null , lfNetworkChange , networkReportNode ,
414- lfNetwork , validFactorHolder , factorGroups , contingencylfParametersExt , context , networkState , factorsStates );
401+ lfNetwork , allFactorHolder , factorGroups , contingencylfParametersExt , context , networkState , factorsStates );
415402 }
416403 }
417404 }
@@ -428,7 +415,7 @@ private void analyzeContingencySet(Network network, LfNetworkList lfNetworks, Li
428415 LOGGER .info ("Simulate contingency '{}'" , propagatedContingency .getContingency ().getId ());
429416 LfNetworkChange lfNetworkChange = new LfNetworkChange (lfNetwork , propagatedContingency , lfContingency , null );
430417 processNetworkChange (lfParameters , resultWriter , variablesTargetVoltageInfo , propagatedContingency , lfNetworkChange , networkReportNode ,
431- lfNetwork , validFactorHolder , factorGroups , contingencylfParametersExt , context , networkState , factorsStates );
418+ lfNetwork , allFactorHolder , factorGroups , contingencylfParametersExt , context , networkState , factorsStates );
432419 }
433420
434421 if (parameters .getOperatorStrategiesCalculationMode () != SensitivityOperatorStrategiesCalculationMode .NONE ) {
@@ -440,7 +427,7 @@ private void analyzeContingencySet(Network network, LfNetworkList lfNetworks, Li
440427 LfOperatorStrategy lfOperatorStrategy = LfOperatorStrategy .create (operatorStrategy , lfActionById );
441428 LfNetworkChange lfNetworkChange = new LfNetworkChange (lfNetwork , propagatedContingency , lfContingency , lfOperatorStrategy );
442429 processNetworkChange (lfParameters , resultWriter , variablesTargetVoltageInfo , propagatedContingency , lfNetworkChange , networkReportNode ,
443- lfNetwork , validFactorHolder , factorGroups , contingencylfParametersExt , context , networkState , factorsStates );
430+ lfNetwork , allFactorHolder , factorGroups , contingencylfParametersExt , context , networkState , factorsStates );
444431 }
445432 }
446433 });
@@ -455,14 +442,15 @@ private void processNetworkChange(LoadFlowParameters lfParameters, SensitivityRe
455442 ReportNode postContSimReportNode = Reports .createPostContingencySimulation (networkReportNode , lfNetworkChange .getContingencyId ());
456443 lfNetwork .setReportNode (postContSimReportNode );
457444
445+ lfNetworkChange .apply (lfParameters .getBalanceType ());
446+
458447 List <LfSensitivityFactor <AcVariableType , AcEquationType >> contingencyFactors = validFactorHolder .getFactorsForContingency (lfNetworkChange .getContingencyId ());
459448 contingencyFactors .forEach (lfFactor -> {
460449 lfFactor .setSensitivityValuePredefinedResult (null );
461450 lfFactor .setFunctionPredefinedResult (null );
451+ lfFactor .updateStatus ();
462452 });
463453
464- lfNetworkChange .apply (lfParameters .getBalanceType ());
465-
466454 setPredefinedResults (contingencyFactors , lfNetworkChange .getDisabledNetwork (), propagatedContingency );
467455
468456 Map <LfBus , Double > postContingencySlackParticipationByBus ;
0 commit comments