Hi Simone,
If your equation can't be put in a Lindblad form, then you can simulate this in QuTiP by providing a callback function to mesolve which returns the Liouvillian superoperator at any point in time. Instead of passing a separate c_ops list, define something like
# Constant terms (first line)
constant_liouvillian = qutip.liouvillian(H, c_ops)
def my_liouvillian(t: float, args: dict):
out = constant_liouvillian.copy()
# second line
for k in range(ks):
for j in range(js):
out = out + 1j * f[k](t) * W[j](...)
# third line
for k in range(ks):
out += (0.5j*eta/gamma) * f[k](t) * qutip.lindblad_dissipator(a[k])
return out
so that the function my_liouvillian returns the right-hand side of your expression. In mine, I use qutip.liouvillian to create the constant part that can be expressed in Lindblad form, and then the for loops are just adding in the extra terms of your second line, and the time-dependent parts of the last line. Without knowing what is going on in the $W^{in}_j$ function, it's hard to know how you'd write it explicitly in super-operator form, but you'll want to use the functions in `qutip.superoperator` to make sure that you're constructing the correct thing.
You then pass this directly to mesolve
state = qutip.basis(20, 0)
times = np.linspace(0, 1, 101)
result = qutip.mesolve(my_liouvillian, state, times)
Notice how I didn't pass any c_ops to mesolve, because they're included in my_liouvillian.
Jake