Dear Mike,

Thank you for your answer!
I implemented your suggestions and I don’t have the error anymore. The code 
starts running, but then goes crazy with absolutely random values of 
composition (as opposed to an expected periodic variation). I don’t know if 
this still come from the spline..
I remember I was advised to not set the diffusion coefficient as a variable, 
but I have to admit I don’t remember why. I don’t know if that could be the 
problem.

Any idea, anyone?

Thank you!
Clara


> On 09 Aug 2017, at 18:13, Michael J. Waters <waters.mik...@gmail.com> wrote:
> 
> Hi Clara,
> 
> Is your spline function returning a numpy array?  I think what is happening 
> is that FiPy is seeing it as a tensor diffusion coefficient rather than just 
> a list of the values throughout your simulation. I'm a little rusty with FiPy 
> these days, but I think you could so something like this:
> 
> Diff = CellVariable(mesh=mesh)
> 
> Diff.setValue(d2G(Xf))
> 
> and then update the value in the loop like this:
> while time < duration:
>        res0 = eq.sweep(X_var, dt=dt, solver=solver)
> 
> 
>          Diff.setValue(d2G(Xf))
> 
> 
> Maybe 'Diff' should be FaceVariable? whichever way it should be, it should be 
> fine in the equation definition then.
> 
> Best,
> -Mike
> 
> 
> 
> 
> On 8/9/17 4:48 PM, Clara Maurel wrote:
>> Hello,
>> 
>> I would like to model the Cahn Hilliard equation with a diffusion 
>> coefficient that depends on the cell variable (concentration X) and time.
>> The diffusion coefficient (Diff) is proportional to the second derivative of 
>> the free energy (d2G), for which I have the values in an external file, for 
>> a range of concentrations.
>> Initially I interpolated d2G with a polynomial function and could easily 
>> express Diff as a function of Xf = X.arithmeticFaceValue
>> 
>> However, I realised that this interpolation was not appropriate in my case. 
>> The only way I found to obtain a correct interpolation of d2G is to use a 
>> B-spline interpolation, with scipy.interpolate.UnivariateSpline. The piece 
>> of code is as follows (d2G_fit is the array of values that I imported from 
>> an external file):
>> 
>> 
>> X = np.arange(0.011,1.0,0.001)
>> 
>> X_var = CellVariable(name=r"$X_{at}$", mesh=mesh, hasOld=True)
>> 
>> noise = GaussianNoiseVariable(mesh=mesh, mean=X_mean, variance=1.0e-7).value
>> X_var[:] =  noise
>> X_var.updateOld()
>> Xf = X_var.arithmeticFaceValue
>> 
>> d2G = UnivariateSpline(X, d2G_fit[id_mean_spino], k=3, s=0)
>> Diff = d2G(Xf)
>> 
>> 
>> My problem is that when I start looping with:
>> 
>> while time < duration:
>>       res0 = eq.sweep(X_var, dt=dt, solver=solver)
>> 
>> I have the error message:
>> 
>> IndexError: diffusion coefficent tensor is not an appropriate shape for this 
>> mesh
>> 
>> 
>> I also tried: 
>> 
>> Diff =  Variable(value=d2G(Xf))
>> and
>> Diff =  d2G(Xf)*Variable(list(d2G(Xf)))
>> 
>> but I have the same error.
>> 
>> Could you tell me how I could work this out? Additional comment: Diff 
>> evolves with time, I update it at selected timestep in the loop.
>> 
>> 
>> Any hint would be greatly appreciated!
>> 
>> Thank you in advance!
>> Clara
>> 
>> 
>> 
>> 
>> 
>> _______________________________________________
>> fipy mailing list
>> fipy@nist.gov <mailto:fipy@nist.gov>
>> http://www.ctcms.nist.gov/fipy <http://www.ctcms.nist.gov/fipy>
>>   [ NIST internal ONLY: https://email.nist.gov/mailman/listinfo/fipy 
>> <https://email.nist.gov/mailman/listinfo/fipy> ]
> 
> _______________________________________________
> fipy mailing list
> fipy@nist.gov
> http://www.ctcms.nist.gov/fipy
>  [ NIST internal ONLY: https://email.nist.gov/mailman/listinfo/fipy ]

Attachment: smime.p7s
Description: S/MIME cryptographic signature

_______________________________________________
fipy mailing list
fipy@nist.gov
http://www.ctcms.nist.gov/fipy
  [ NIST internal ONLY: https://email.nist.gov/mailman/listinfo/fipy ]

Reply via email to