MODULE FF_Cost_Functions USE Precision USE Error_Handling USE System_Monitors USE Network_Data_Structures USE Network_Data_Types USE FF_Cost_Parameters IMPLICIT NONE PUBLIC::FFElementalCosts PRIVATE INTEGER,SAVE,PUBLIC::ff_elemental_costs_timer=-1 CONTAINS SUBROUTINE FFElementalCosts(cost_function,arguments_status,tolerance,& arcs_indices,arcs_flows,arcs_voltages,arcs_resistances,arcs_costs) USE Precision USE Network_Data_Types TYPE(Network_SC_Cost),INTENT(INOUT),OPTIONAL::cost_function CHARACTER(LEN=4),INTENT(IN)::arguments_status REAL(KIND=r_wp),INTENT(IN)::tolerance INTEGER(KIND=i_wp),DIMENSION(2),INTENT(IN)::arcs_indices REAL(KIND=r_wp),DIMENSION(arcs_indices(1):),INTENT(INOUT),OPTIONAL::& arcs_flows,arcs_voltages,arcs_resistances,arcs_costs LOGICAL::known_flow,known_voltage CHARACTER::status INTEGER(KIND=i_wp)::arc REAL(KIND=r_wp)::eps,temp eps=MAX(EPSILON(1.0_r_wp),tolerance) CALL StartTimer(ff_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))*& (2*ABS(arcs_voltages(arc)))*(ABS(arcs_voltages(arc))+arcs_cost_parameters(3,arc)*arcs_cost_parameters(4,arc))/(arcs_cost_par& &ameters(3,arc)*((2*ABS(arcs_voltages(arc)))+arcs_cost_parameters(3,arc)*(arcs_cost_parameters(4,arc)-arcs_cost_parameters(1,& &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))*0.5_r_wp*arcs_cost_parameters(3,arc)*(SQRT((ABS(arcs_flows(arc))-arcs_cost& &_parameters(1,arc))**2+arcs_cost_parameters(2,arc)**2)+ABS(arcs_flows(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)=0.5_r_wp*arcs_cost_parameters(3,arc)*(1.0_r_wp+(ABS(arcs_flows(arc))-arcs_cost_parameters(1,arc))/SQRT& &((ABS(arcs_flows(arc))-arcs_cost_parameters(1,arc))**2+arcs_cost_parameters(2,arc)**2)) END DO ELSE IF(arguments_status(2:2)=='F')THEN DO arc=arcs_indices(1),arcs_indices(2) arcs_resistances(arc)=arcs_cost_parameters(3,arc)/(1.0_r_wp+(arcs_cost_parameters(2,arc)/((2*ABS(arcs_voltages(arc)))/arcs_c& &ost_parameters(3,arc)-arcs_cost_parameters(1,arc)+arcs_cost_parameters(4,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.25_r_wp*arcs_cost_parameters(3,arc)*(ABS(arcs_flows(arc))**2+(arcs_cost_parameters(1,arc)-2*ABS(arcs_flows& &(arc)))*arcs_cost_parameters(4,arc)+(ABS(arcs_flows(arc))-arcs_cost_parameters(1,arc))*SQRT((ABS(arcs_flows(arc))-arcs_cost_& ¶meters(1,arc))**2+arcs_cost_parameters(2,arc)**2)+& arcs_cost_parameters(2,arc)**2*(LOG(ABS(arcs_flows(arc))-arcs_cost_parameters(1,arc)+SQRT((ABS(arcs_flows(arc))-arcs_cost_pa& &rameters(1,arc))**2+arcs_cost_parameters(2,arc)**2))-LOG(arcs_cost_parameters(4,arc)-arcs_cost_parameters(1,arc)))) END DO ELSE IF(known_voltage)THEN DO arc=arcs_indices(1),arcs_indices(2) temp=(2*ABS(arcs_voltages(arc)))*(ABS(arcs_voltages(arc))+arcs_cost_parameters(3,arc)*arcs_cost_parameters(4,arc))/(arcs_cos& &t_parameters(3,arc)*((2*ABS(arcs_voltages(arc)))+arcs_cost_parameters(3,arc)*(arcs_cost_parameters(4,arc)-arcs_cost_paramete& &rs(1,arc)))) arcs_costs(arc)=0.25_r_wp*arcs_cost_parameters(3,arc)*(temp**2+(arcs_cost_parameters(1,arc)-2*temp)*arcs_cost_parameters(4,a& &rc)+(temp-arcs_cost_parameters(1,arc))*SQRT((temp-arcs_cost_parameters(1,arc))**2+arcs_cost_parameters(2,arc)**2)+& arcs_cost_parameters(2,arc)**2*(LOG(temp-arcs_cost_parameters(1,arc)+SQRT((temp-arcs_cost_parameters(1,arc))**2+arcs_cost_pa& &rameters(2,arc)**2))-LOG(arcs_cost_parameters(4,arc)-arcs_cost_parameters(1,arc)))) END DO ELSE arcs_costs=0.0_r_wp END IF END IF CALL StopTimer(ff_elemental_costs_timer) END SUBROUTINE FFElementalCosts END MODULE FF_Cost_Functions