MODULE Varistor_Cost_Functions USE Precision USE Error_Handling USE System_Monitors USE Network_Data_Structures USE Network_Data_Types USE Varistor_Cost_Parameters IMPLICIT NONE PUBLIC::VaristorElementalCosts PRIVATE INTEGER,SAVE,PUBLIC::varistor_elemental_costs_timer=-1 CONTAINS SUBROUTINE VaristorElementalCosts(cost_function,arguments_status,tolerance,& arcs_indices,arcs_flows,arcs_voltages,arcs_resistances,arcs_costs) IMPLICIT NONE TYPE(Network_SC_Cost),INTENT(INOUT),OPTIONAL::cost_function INTEGER(KIND=i_wp),DIMENSION(2),INTENT(IN)::arcs_indices CHARACTER(LEN=4),INTENT(IN)::arguments_status REAL(KIND=r_wp),INTENT(IN)::tolerance REAL(KIND=r_wp),DIMENSION(arcs_indices(1):),INTENT(INOUT),OPTIONAL::& arcs_flows,arcs_voltages,arcs_resistances,arcs_costs REAL(KIND=r_wp)::temp LOGICAL::known_flow,known_voltage CHARACTER::status INTEGER(KIND=i_wp)::arc CALL StartTimer(varistor_elemental_costs_timer) status=arguments_status(1:1) known_flow=(status=='F') IF((.NOT.known_flow).AND.status/='D')THEN DO arc=arcs_indices(1),arcs_indices(2) arcs_flows(arc)=SIGN(1.0_r_wp,arcs_voltages(arc))*& (SQRT((arcs_cost_parameters(1,arc)-ABS(arcs_voltages(arc)))**2+arcs_cost_parameters(3,arc)**2)+ABS(arcs_voltages(arc))-arcs_& &cost_parameters(4,arc))/(2*arcs_cost_parameters(2,arc)) END DO known_flow=.TRUE. END IF status=arguments_status(2:2) known_voltage=(status=='F') IF((.NOT.known_voltage).AND.status/='D')THEN DO arc=arcs_indices(1),arcs_indices(2) arcs_voltages(arc)=SIGN(1.0_r_wp,arcs_flows(arc))*2*ABS(arcs_flows(arc))*arcs_cost_parameters(2,arc)*(ABS(arcs_flows(arc))*a& &rcs_cost_parameters(2,arc)+arcs_cost_parameters(4,arc))/(2*ABS(arcs_flows(arc))*arcs_cost_parameters(2,arc)-& arcs_cost_parameters(1,arc)+arcs_cost_parameters(4,arc)) END DO known_voltage=.TRUE. END IF status=arguments_status(3:3) IF(status/='F'.AND.status/='D')THEN IF(arguments_status(1:1)=='F')THEN DO arc=arcs_indices(1),arcs_indices(2) arcs_resistances(arc)=arcs_cost_parameters(2,arc)*(1.0_r_wp+(arcs_cost_parameters(3,arc)/((2*ABS(arcs_flows(arc))*arcs_cost_& ¶meters(2,arc))-arcs_cost_parameters(1,arc)+arcs_cost_parameters(4,arc)))**2) END DO ELSE IF(arguments_status(2:2)=='F')THEN DO arc=arcs_indices(1),arcs_indices(2) arcs_resistances(arc)=2*arcs_cost_parameters(2,arc)/(1.0_r_wp+(ABS(arcs_voltages(arc))-arcs_cost_parameters(1,arc))/SQRT((AB& &S(arcs_voltages(arc))-arcs_cost_parameters(1,arc))**2+arcs_cost_parameters(3,arc)**2)) END DO ELSE arcs_resistances=0.0_r_wp END IF END IF status=arguments_status(4:4) IF(status/='F'.AND.status/='D')THEN IF(known_flow)THEN DO arc=arcs_indices(1),arcs_indices(2) arcs_costs(arc)=0.0_r_wp END DO ELSE IF(known_voltage)THEN DO arc=arcs_indices(1),arcs_indices(2) temp=(SQRT((arcs_cost_parameters(1,arc)-ABS(arcs_voltages(arc)))**2+arcs_cost_parameters(3,arc)**2)+ABS(arcs_voltages(arc))-& &arcs_cost_parameters(4,arc))/(2*arcs_cost_parameters(2,arc)) arcs_costs(arc)=0.0_r_wp END DO ELSE arcs_costs=0.0_r_wp END IF END IF CALL StopTimer(varistor_elemental_costs_timer) END SUBROUTINE VaristorElementalCosts END MODULE Varistor_Cost_Functions