MODULE JJ_I_Cost_Functions USE Precision USE Error_Handling USE System_Monitors USE Network_Data_Structures USE Network_Data_Types USE JJ_I_Cost_Parameters IMPLICIT NONE PUBLIC::JJ_IElementalCosts PRIVATE INTEGER,SAVE,PUBLIC::jj_i_elemental_costs_timer=-1 CONTAINS SUBROUTINE JJ_IElementalCosts(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)::i,c3,c4 LOGICAL::known_flow,known_voltage CHARACTER::status INTEGER(KIND=i_wp)::arc CALL StartTimer(jj_i_elemental_costs_timer) known_flow=(arguments_status(1:1)=='F') IF(.NOT.known_flow)THEN CALL NonCriticalError(message="Flow not given",caller="JJ_IElementalCosts") RETURN END IF status=arguments_status(2:2) known_voltage=(status=='F') IF((.NOT.known_voltage).AND.status/='D')THEN status=arguments_status(3:3) IF(status/='F'.AND.status/='D')THEN DO arc=arcs_indices(1),arcs_indices(2) c3=(ABS(arcs_flows(arc))-arcs_cost_parameters(1,arc))**2+arcs_cost_parameters(2,arc)**2 c4=SQRT((ABS(arcs_flows(arc))-arcs_cost_parameters(1,arc))**2+arcs_cost_parameters(2,arc)**2) arcs_voltages(arc)=SIGN(1.0_r_wp,arcs_flows(arc))*0.5_r_wp*(arcs_cost_parameters(3,arc)*ABS(arcs_flows(arc))+(arcs_cost_para& &meters(4,arc)*arcs_cost_parameters(1,arc)-arcs_cost_parameters(3,arc)*(arcs_cost_parameters(5,arc)**2))/arcs_cost_parameters& &(5,arc)+(arcs_cost_parameters(4,arc)*(ABS(arcs_flows(arc))-arcs_cost_parameters(1,arc))+arcs_cost_parameters(3,arc)*c3)/c4) arcs_resistances(arc)=(& arcs_cost_parameters(4,arc)*arcs_cost_parameters(2,arc)**2+arcs_cost_parameters(3,arc)*c3*(ABS(arcs_flows(arc))-arcs_cost_pa& &rameters(1,arc)+c4))/(2*c4**3) END DO ELSE DO arc=arcs_indices(1),arcs_indices(2) c3=(ABS(arcs_flows(arc))-arcs_cost_parameters(1,arc))**2+arcs_cost_parameters(2,arc)**2 c4=SQRT((ABS(arcs_flows(arc))-arcs_cost_parameters(1,arc))**2+arcs_cost_parameters(2,arc)**2) arcs_voltages(arc)=SIGN(1.0_r_wp,arcs_flows(arc))*0.5_r_wp*(arcs_cost_parameters(3,arc)*ABS(arcs_flows(arc))+(arcs_cost_para& &meters(4,arc)*arcs_cost_parameters(1,arc)-arcs_cost_parameters(3,arc)*(arcs_cost_parameters(5,arc)**2))/arcs_cost_parameters& &(5,arc)+(arcs_cost_parameters(4,arc)*(ABS(arcs_flows(arc))-arcs_cost_parameters(1,arc))+arcs_cost_parameters(3,arc)*c3)/c4) END DO END IF known_voltage=.TRUE. END IF status=arguments_status(4:4) IF(status/='F'.AND.status/='D')THEN CALL Warning(message="Cost requested",caller="JJElementalCosts") IF(known_flow)THEN DO arc=arcs_indices(1),arcs_indices(2) c4=SQRT((ABS(arcs_flows(arc))-arcs_cost_parameters(1,arc))**2+arcs_cost_parameters(2,arc)**2) arcs_costs(arc)=0.25_r_wp*((2.0_r_wp*arcs_cost_parameters(4,arc)+arcs_cost_parameters(3,arc)*(ABS(arcs_flows(arc))-arcs_cost& &_parameters(1,arc)))*c4+(arcs_cost_parameters(3,arc)*(arcs_cost_parameters(1,arc)-2.0_r_wp*ABS(arcs_flows(arc)))*(arcs_cost_& ¶meters(5,arc)**2)-2.0_r_wp*arcs_cost_parameters(4,arc)*((arcs_cost_parameters(5,arc)**2)-arcs_cost_parameters(1,arc)*ABS& &(arcs_flows(arc))))/& arcs_cost_parameters(5,arc)+& arcs_cost_parameters(3,arc)*(ABS(arcs_flows(arc))**2+arcs_cost_parameters(2,arc)**2*(LOG(c4+ABS(arcs_flows(arc))-arcs_cost_p& &arameters(1,arc))-LOG(& arcs_cost_parameters(5,arc)-arcs_cost_parameters(1,arc))))) END DO ELSE CALL NonCriticalError(message="Flow not given",caller="JJElementalCosts") END IF END IF CALL StopTimer(jj_i_elemental_costs_timer) END SUBROUTINE JJ_IElementalCosts END MODULE JJ_I_Cost_Functions