It is great if your solution doesn't blow up and you never need to flat start, but sometimes you can try alternative solving functions to get your case back to a normal state. Try the below function rather than a typical single solve.
def solve():
"""
Function to run Newton-Raphson load flow. If the original solve is unsuccessful, several more attempts are made with alternative parameters.
Returns True only if the case is solved without ignoring reactive limits.
"""
# Allow 200 iterations
psspy.solution_parameters_3([_i,200,_i],[_f,_f,_f,_f,_f,_f,_f,_f,_f,_f,_f,_f,_f,_f,_f,_f,_f,_f,_f])
# Normal full newton
psspy.fnsl([1,0,0,1,1,0,99,0])
reactive_ignored = False
if psspy.solved() != 0:
# If normal full newton didn't work:
# Flat start decoupled
psspy.fdns([0,0,0,1,1,1,99,0])
if psspy.solved() == 0:
# If flat start worked, now do a full netwon
psspy.fnsl([0,0,0,1,1,0,99,0])
else:
psspy.fdns([1,0,0,1,1,1,99,0])
psspy.fnsl([0,0,0,1,1,0,99,0])
psspy.fnsl([1,0,0,1,1,0,99,0])
# Try ignoring reactive limits
if psspy.solved > 0:
reactive_ignored = True
psspy.fnsl([1,0,0,1,1,1,-1,0])
psspy.fnsl([0,0,0,1,1,0,99,0])
if psspy.solved() == 0:
reactive_ignored = False
if psspy.solved > 0:
psspy.fdns([1,0,0,1,1,1,-1,0])
reactive_ignored = True
if psspy.solved() == 0:
psspy.fdns([0,0,0,1,1,1,99,0])
if reactive_ignored:
print "\nSolved successfully, but reactive limits were ignored."
return False
else:
print "\nSolved successfully!"
return True
else:
print "\nUnable to solve case."
return False