FiPy does not support complex arguments, but it does support solving for vectors, which might simplify your task a bit.
See the latter part of this coupled Cahn-Hilliard simulation.
It's certainly possible to set non-uniform initial conditions. See: examples/cahnHilliard/mesh2DCoupled.py for how to set the initial condition to a random field or examples/diffusion/electrostatics.py and and just about anything in examples/phase/ for how to set the initial condition based on coordinates. As you can see in those examples, there are a couple of different syntaxes that work, but setValue() is a perfectly legitimate way to do it.