adjustable number of differential equations

Hello,

I am trying to model non-radiative energy transfer between a single donor molecule towards a variable number of acceptor molecule that are on periphery of a circle. instead of having a fixed number of acceptor, I am trying to use the IntegrateODE command with a number that can be set by the user.

Function FRET_sphere(pw, tt, yw, dydt)
	Wave pw	// pw[0] = k1, pw[1] = k2, pw[2] = k3
	Variable tt	// time value at which to calculate derivatives
	Wave yw	// yw[0]-yw[3] containing concentrations of A,B,C,D
	Wave dydt	  // wave to receive dA/dt, dB/dt etc. (output)
	Variable /g na
	dydt[0] = -pw[0]*exp(-((tt)/0.03)^2)*yw[0]+pw[1]*yw[1] // pw[0]=donor excitation rate, pw[1]=1/(lifetime donor) 

	dydt[1] = pw[0]*exp(-((tt)/0.03)^2)*yw[0]-pw[1]*yw[1] - pw[na+2]*yw[1] //transfer toward na acceptors on a circle line with a total rate = pw[3]+...+pw[na+2]

variable i
for (i=0;i<(na);i=i+1)
	dydt[2+i] = pw[3+i]*yw[1]-pw[2]*yw[2+i] 
endfor

End

function EFRET_sphere(Rf,Racc,na)
variable Rf,Racc,na
variable i,j,r,aa,k
make /o/n=(na+4) pw
pw[0]=6500
pw[1]=0.25
pw[2]=0.33
make /o/d/n=20 FRET
SetScale/P x 1,1,"", FRET
FRET=0
Make/O/D/N=(200,na+2) ChemKin
SetScale/I x 0,50,"", ChemKin
Chemkin=0
ChemKin[0][0]= 1
for (k=1;k<2;k=k+1)
	for (j=0;j<(na);j=j+1)
		r=sqrt((Racc+k)^2+(Racc)^2-2*(Racc+k)*Racc*cos((pi/2)*(1-j/3)))	
		aa=aa+pw[1]*(Rf/r)^6
		pw[3+j]=pw[1]*(Rf/r)^6
	endfor
	pw[na+3]=aa
	IntegrateODE FRET_sphere, pw, ChemKin
	variable num=0
	wave out
	for (i=0;i<na;i=i+1)
		out[]=ChemKin[i+3][p]
		num=num+pw[2]*(sum(out))
	endfor
	out[]=ChemKin[1][p]
	variable den=num+pw[1]*sum(out)
	FRET[k]=num/den
endfor
end function

 

here is my code I suppose that IntegrateODE cannot handle a loop in the function defining the set of equations.

the second function EFRET_sphere is the part where I change the relative distance between the donor and the acceptors. 

Does anyone tried to use it in that way?

Best regards,

Pascal

The loop is fine. IntegrateODE counts the number of equations based on the number of columns in your matrix Y wave, or the number of Y waves. Once it has counted, it expects a derivative for each column. A derivative of zero should be OK, if that will do what you need.

I just optimized the code but it is now indeed working very well ! 

Thank for your quick answer.