Jobs-Meth.Justif.  Molec.Speeds  Rota.Probab.  Iter.Eqn.  Int.Nuc.PE
Download this Package (Extract it to C:\chem_expt, may need to collect VFP6 Runtime)
Overall Theory of Int.Nuc.PE Expt. Using Assam-Calcu

* Justifier for Jobs Method of Composition-Determination
close all
clear all
on escape cancel
on shutdown quit
set century on
set confirm on
if iscolor()
  set color on
  set color to n/bg,n/g,g
  clear
else
  set color off
endif
clear
set date german
set decimals to 18
set exact on
set heading on
set safety off
set status off
set sysmenu to default
set sysmenu off
set talk off
set typeahead to 3000
set color to bg+/bg,n/g,g
@ 0,0 clear      
@ 0,10 say "  Justifier for Jobs Method of Composition-Determination"
set color to n/bg,n/g,g
Set alternate to JobJ_Res
set alternate on
text
   The Jobs Method of Determination of Complex-Composition is based on the 
   concept that when equimolar solutions of the metal-ion and the ligand are
   mixed in gradually varying volume-ratios, the concentration of the complex
   is highest when the volume-ratio equals complex-composition stoic. (ratio)
   
   For the reaction mM + nL = MmLn where M & L are metal & ligand respec-ly,
   let the two equimolar solutions each has molarity c0, so that for the 
   volume fractions fM (=VM/(VM+VL)) & fL (=1-fM), the initial (post-mixing)
   molarities of M & L are c0*fM & c0*fL. If cC is the equilibrium molarity 
   of complex, then equilibrium molarities of M & L are (c0*fM - m*cC) & 
   (c0*fL - n*cC), and so the (complex-formation) equilibrium relation is:
   cC/((c0*fM- m*cC)**m)*((c0*fL - n*cC)**n) = K  (K is stability constant).
   From this equilibrium relation, cC value may be found in a iterative way.
   
   So to justify Jobs method, fM is allowed to vary from 0.01 to 0.99 for 
   user-specified values of m, n, c0 & K, and the resulting cC values noted.
   (Outcome of above calculations WILL BE SAVED in the FILE 'JobJ_Res.txt')
   
endtext
set alternate off
store 1 to m
store 4 to n
store  0.10000000 to c0
store 20.000000 to K
@ 20, 3 say "Metal-Ion Coefficient m:" get m 
@ 20,44 say "Ligand Coefficient n:" get n 
@ 22, 3 say "Common Initial Molarity:" get c0 
@ 22,49 say "Const. K:" get K 
okbut = ""
@ 24,38 get okbut function '* Continue' size 1,9
read cycle
n = abs(n)
m = abs(m)
if n*m = 0 
  quit
endif
set alternate on
?"   Metal-Ion Coefficient m:",m 
??"    Ligand Coefficient n:",n 
?"   Common Initial Molarity:",c0 
??"    Const. K:",K
? 
?"      Volume Percentage         Equilibrium Molarity"
?"      of Metal-Ion Soln.           of the Complex"
?
* Evaluating q upto term < 0.000001*1 (1 is 1st term)
fM = 0.01
fMm = 0.00
cC_last = 0.0
do while fM < 1.00
  fL = 1.0 - fM
  store 1.0 to cC
  store 0.0 to cC2
  cCmx = K*((c0*fM-0)**m)*((c0*fL-0)**n)
  I = 1
  set alternate off
  if n*m = 1
    ?"  Percentage:",str(fM*100,3),"   Solving quadratic equation for molarity of complex..."
    * quadratic eqn is K*(cC**2) -(K*c0 + 1)*cC + K*c0*c0*fM*fL = 0; cCmx = K*c0*fM*c0*fL
    soln1 = ((K*c0 + 1) - sqrt((K*c0 + 1)**2 - 4*K*K*c0*c0*fM*fL))/(2*K)
    soln2 = ((K*c0 + 1) + sqrt((K*c0 + 1)**2 - 4*K*K*c0*c0*fM*fL))/(2*K)
    if soln2 > cCmx
      cC = soln1
    else
      ?"   An controversial situation encountered - calculation doubtful!"
      cC = soln1
      I = 1001
    endif  
  else
    ?"  Percentage:",str(fM*100,3),"   Proceeding with iterations for molarity of complex:"
    do while (round(cC,12) <> round(cC2,12) .and. I <= 1000)
      cC = cC2
      cC2 = K*((c0*fM- m*cC)**m)*((c0*fL - n*cC)**n)
      ?"   round:",str(I,4),"   value:",cC2
      I = I + 1
    enddo
  endif
  ?"   Checking correctness (the factor should be unity); factor is: "
  cC = round(cC,12)
  ??str(cC/(K*((c0*fM- m*cC)**m)*((c0*fL - n*cC)**n)),15,12)
  ?"   Completed; resting for a second...."  
  out = inkey(1,'ms')
  set alternate on
  if cC > cC_last
    fMm = fM
  endif
  cC_last = cC
  if I = 1001
    ?round(fM*100,0),"               Calculation Fails!"
  else
    ?round(fM*100,0),"     ",round(cC,12)
  endif  
  fM = fM + 0.01
enddo
if fMm > 0.0
  ?
  ?"   So, the maximum of complex concentration occurs at the percentage: "
  ??ltrim(str(fMm*100))+"%"  
  ?"   (i.e., n/m will be experimentally found to be:",str(round((1-fMm)/fMm,2),5,2)+")"
endif  
?
set alternate off
close alternate
close all
clear all
quit

* Molecular Speed Distribution Calculator
close all
clear all
on escape cancel
on shutdown quit
set century on
set confirm on
if iscolor()
  set color on
  set color to n/bg,n/g,g
  clear
else
  set color off
endif
clear
set date german
set decimals to 18
set exact on
set heading on
set safety off
set status off
set sysmenu to default
set sysmenu off
set talk off
set typeahead to 3000
set color to bg+/bg,n/g,g
@ 0,0 clear     
@ 0,10 say "         Molecular Speed Distribution Calculator"
set color to n/bg,n/g,g
Set alternate to MlSp_Res
set alternate on
text

   The disribution of molecular speeds as described by Maxwell is a deserving
   case for computer-use because of the huge computational work involved. The
   molecules of the given gas-system (with a definite mass m for its molecule)
   obey a definite distribution for their speeds depending on the temp. T.
   The distribution is expressed in terms of the number of molecules dN (out 
   of the total N molecules where N must be very large, say 10 to the power 18)
   with their speeds lying between v and v+dv, expressed as function of v & dv.
   Relations used are (pai is 3.14159; T is abs. temp.; k is Boltzmann const.):
  
   Mass of a molecule m = (Molar mass M)/(602200000000000000000000/mol)
   Number dN = N*4*pai*((m/(2*pai*k*T))**1.5)*(v**2)*exp(-m*(v**2)/(2*k*T))*dv
   Number N12 lying between speeds v1 & v2 = (Integral of dN from v=v1 to v=v2)
   (Outcome of aforesaid calculations WILL BE SAVED in the FILE 'MlSp_Res.txt')
endtext
set alternate off
N = 6022.00000000
molmass = 32.000000
T = 298.150000
lowspeed = 380.000000
upspeed =  410.000000
SpeedIncrD = 1.000000
@ 16, 3 say "Number of molecules in gas, N:" get N
??" (into 10 to the power 20)"
@ 18, 3 say "Molar Mass (g/mol):" get molmass
@ 18,43 say "Temperature T (K):" get T
@ 20, 3 say "Lower Speed (m/s):" get lowspeed
@ 20,43 say "Upper Speed (m/s):" get upspeed
@ 22, 3 say "Speed Increment (m/s) for Display:" get SpeedIncrD
okbut = ""
@ 24,37 get okbut function '* Continue' size 1,9
read cycle
if upspeed <= lowspeed
  ?"  The upper speed is smaller than (or equal to) the lower speed!"
  ?"  Press any key or just wait to leave this program.... "
  out = inkey(60,'ms')
  quit
endif
* Evaluating integral and probability function
m = (molmass/1000)/(6.022E23)
v = lowspeed+0.0
pai = 3.14159
k = 1.381E-23
mpv = sqrt(2.0*8.314*T/(Molmass/1000.0))
SpeedIncrI = 0.000025*mpv  && SpeedIncrI is around 0.01 for oxygen at 300 K
integral = 0.0
set alternate on
?"           Speed v (m/s)             dN/dv value (10E+20 s/m)"
?
do while v <= upspeed
  dNbydv = N*4*pai*sqrt((m/(2*pai*k*T))**3)*(v**2)*exp(-m*(v**2)/(2*k*T))
  ?round(v,15),round(dNbydv,15)
  v = v + SpeedIncrD
enddo
set alternate off
?"  Evaluating integral of dN from v=v1 to v=v2...."
set alternate on
dv = SpeedIncrI
N12 = 0.0
v = lowspeed
do while v < upspeed
  if (v + SpeedIncrI) > upspeed
    dv = upspeed - v  && correcting dv for the last special case only
  endif
  v = v + 0.5*dv  && taking middle-range speed v for calculation
  dN = N*4*pai*sqrt((m/(2*pai*k*T))**3)*(v**2)*exp(-m*(v**2)/(2*k*T))*dv
  N12 = N12+dN
  v = v - 0.5*dv + SpeedIncrI
enddo
clear
?
?"  Molar Mass (g/mol):",molmass
??"    Temperature T (K):", T
?"  Total number of gas-molecules:",N,"(into 10 to the power 20)"
?"  Most Probable speed (in m/s) of gas molecules:", round(mpv,15)
?"  Lower Speed (m/s):",lowspeed
??"    Upper Speed (m/s):", upspeed
?"  Number in speed-range:",round(N12,15),"(into 10 to the power 20)"
?
set alternate off
?"  Outcome of above calculations WILL BE SAVED in the FILE 'MlSp_Res.txt'"
?"  Press any key, click anywhere, or just wait to end the program...."
out = inkey(30,'ms')
close alternate
close all
clear all
quit

*  Rotational Probability Distribution Calculator
close all
clear all
on escape cancel
on shutdown quit
set century on
set confirm on
if iscolor()
  set color on
  set color to n/bg,n/g,g
  clear
else
  set color off
endif
clear
set date german
set decimals to 18
set exact on
set heading on
set safety off
set status off
set sysmenu to default
set sysmenu off
set talk off
set typeahead to 3000
set color to bg+/bg,n/g,g
@ 0,0 clear      
@ 0,10 say "      Rotational Probablity Distribution Calculator"
set color to n/bg,n/g,g
Set alternate to RotP_Res
set alternate on
text
   The probability disribution of heteronuclear diatomic rotational levels
   is an interesting simple case-study of molecular-level occupation patterns,
   as here the number of significantly occupied levels is limited, the energy-
   level degeneracies vary so as to cause maximum occupation at a non-ground
   level, the degeneracies & energies have manageable analytical expressions,
   and the partition function series converge manageably fast. The relations
   to be used here are (rotational level quantum number J = 0, 1, 2, .......; 
   thetarot is char. rota. temp.; T is abs. temp.; k is Boltz. const.):
   
   Degeneracy g (function of J) = 2*J+1
   Energy E (function of J) = J*(J+1)*thetarot*k 
   Partition-function q = g(0)*exp(-E(0)/(k*T)) + g(1)*exp(-E(1)/(k*T)) + ...
   Probability p (function of J) = g(J)*exp(-E(J)/(k*T))/q
   (Outcome of above calculations WILL BE SAVED in the FILE 'RotP_Res.txt')
   
endtext
set alternate off
thetarot = 15.020000
T = 298.150000
@ 17, 3 say "CRT theta-rot (K):" get thetarot 
@ 17,43 say "Temperature T (K):" get T
okbut = ""
@ 19,35 get okbut function '* Continue' size 1,9
read cycle
set alternate on
* Evaluating q upto term < 0.000001*1 (1 is 1st term)
J = 0
q = 0.0
do while (2*J+1)*exp(-J*(J+1)*thetarot/T) > 0.000001
  q = q + (2*J+1)*exp(-J*(J+1)*thetarot/T)
  J = J + 1
enddo
* Evaluating p upto all these terms
J = 0
sump = 0
Tbyt = T/thetarot
?"   Char. Rota. Temp. =",thetarot,"K ;    Temp. T =",T,"K"
?
?"   Partition function calculated q =",round(q,15)
?"   (value of T/theta-rot is:",round(Tbyt,15)
??")"
? 
?"      Level J            pf-contribution                  Probability"
?
do while (2*J+1)*exp(-J*(J+1)*thetarot/T) > 0.000001
  term = (2*J+1)*exp(-J*(J+1)*thetarot/T)
  p = term/q
  ?str(J),round(term,15),round(p,15)
  sump = sump + p
  J = J + 1
enddo
?
?"   Sum of these probabilities is (check!):", round(sump,15)
?
set alternate off
close alternate
close all
clear all
quit

*  Solving A Simple Non-Linear Equation Iteratively 
close all
clear all
set century on
set confirm on
set color to n/bg,n/g,g
clear
set date german
set decimals to 18
set exact on
set safety off
set status off
set sysmenu off
set talk off
set typeahead to 3000
on shutdown quit
on escape quit
set color to bg+/bg,b/g,g
@ 2,8 say "Program for Solving Simple Equation of Type x = f(x) Iteratively"
set color to b/bg,b/g,g
com = stuff(space(55),1,len("5*(EXP(x)-1)/EXP(x)"),"5*(EXP(x)-1)/EXP(x)")
X = 5.0000000000
Disagg = 0.0000010000
@ 5,3 say "The equation is: x =" get com
@ 7,3 say "Initiating x value: " get X
@ 9,3 say "Disagreement limit: " get Disagg
@ 11,3 say "(Result of calculations will be stored in Iter_Res.txt)"
okbut = ""
@ 14,36 get okbut function '* Continue' size 1,9
read cycle
set alternate to "Iter_Res.txt"
set alternate on
?" The equation is: X =",com
?" Initiating X value: ",X
?" Disagreement limit: ",Disagg
?
?
ICOUNT = 1
com = stuff( "y = ",5,len(ltrim(rtrim(com))),ltrim(rtrim(com)) )
DO while ICount < 1000.5
&com
?" Round:",ltrim(str(ICOUNT))," Started with x:",str(x,21,10)," Got x:",str(y,21,10)
ERR = Y-X
ERRABS = ABS(ERR)
IF ERRABS < Disagg
?
?" The solution is X =",str(x,21,10)," (at",ltrim(str(ICOUNT))+"th round)"
ICount = 1009
ELSE
X = Y
ICOUNT = ICOUNT + 1
ENDIF
ENDDO 
IF ICOUNT < 1008.5
?
?" 1000 iterations performed; not yet converging to a solution!"
ENDIF
?
set alternate off
close alternate 
modify file "Iter_Res.txt" noedit
close all
clear all
quit

*  Internuclear potential energy calculation for H2+ ion ground level
close all
clear all
set century on
set confirm on
clear
set date german
set decimals to 18
set exact on
set safety off
set status off
set sysmenu off
set talk off
set typeahead to 3000
on shutdown quit
on escape quit
set alternate to "INPE_Res.txt"
set alternate on 
TEXT
  Internuclear potential energy (electronic energy including internuclear
  repulsion) for hydrogen molecular monovalent cation ground state
 (Calculation of the same for the first excited states is too error-prone)
  Formulae used (Quantum Chemistry by Ira N. Levine, Chap. 13, Sec. MO theory of H2+):
  Overlap integral    Sab = (1 + k*R + k*k*R*R/3) * exp((-1)*k*R)
  Coulomb integral    Haa = 0.5*k*k - k - 1/R + (k+1/R) * exp((-2)*k*R)
  Resonance Integral  Hab = (-0.5)*k*k*Sab - k*(2-k)*(1+k*R)*exp((-1)*k*R)
  Internuclear Potn.  U   = (Haa + Hab)/(1 + Sab) + 1/R
  (Electronic energy)
  Value of the orbital exponent k for each value of R is obtained as the
  optimum value that gives the lowest value of U (variation theorem).
  The results of this work will be stored in INPE_RES.TXT in this folder.
ENDTEXT
SET ALTERNATE OFF
wait "  Would you include values of Sab, Haa, Hab & U in RES.TXT [Y,N]? ";
to openness
@ 1,0 clear
R = 0.4
SET ALTERNATE ON
If upper(openness) = "Y"
  TEXT
 Internuclear   Orbital      Overlap     Coulomb    Resonance  Electronic
  Distance R   Exponent k   Integral    Integral    Integral    Energy U
 (AtomicUnit) (PureNumber)  Sab(a.u.)   Haa(a.u.)   Hab(a.u.)    (a. u.)
  ENDTEXT
Else
  TEXT
 Internuclear   Orbital      Overlap     Coulomb    Resonance  Electronic
  Distance R   Exponent k   Integral    Integral    Integral    Energy U
 (AtomicUnit) (PureNumber)  Sab(a.u.)   Haa(a.u.)   Hab(a.u.)    (a. u.) 
  ENDTEXT
Endif
SET ALTERNATE OFF
DO WHILE R <= 8.0
k = 0.1
EP_MIN = 1000
DO WHILE k <= 2
  NUME = k*k - k - 1/R + (1+k*R)*EXP((-2)*k*R)/R + k*(k-2)*(1+k*R) ;
  *EXP((-1)*k*R)
  DENO = 1 + EXP((-1)*k*R)*(1+k*R+k*k*R*R/3)
  EP = (-0.5)*k*k + NUME/DENO + 1/R
  IF EP < EP_MIN
    k_min = k
    EP_MIN = EP
  ENDIF
  k = k + 0.01
ENDDO
k = k_min - 0.01
k_lim = k_min + 0.01
DO WHILE k <= k_lim
  NUME = k*k - k - 1/R + (1 + k*R)*EXP((-2)*k*R)/R + k*(k-2)*(1 + k*R) ;
  *EXP((-1)*k*R)
  DENO = 1 + EXP((-1)*k*R)*(1 + k*R + k*k*R*R/3)
  EP = (-0.5)*k*k + NUME/DENO + 1/R
  IF EP < EP_MIN
    k_min = k
    EP_MIN = EP
  ENDIF
  k = k + 0.0001
ENDDO
k = k_min
EP = EP_MIN
if k < 1.0
  k = 1.0
endif
Sab = (1 + k*R + k*k*R*R/3) * exp((-1)*k*R)
Haa = 0.5*k*k - k - 1/R + (k+1/R) * exp((-2)*k*R)
Hab = (-0.5)*k*k*Sab - k*(2-k)*(1+k*R) * exp((-1)*k*R)
U = (Haa + Hab)/(1 + Sab) + 1/R
SET ALTERNATE ON
If upper(openness) = "Y"
  ?str(round(R,5),11,5),str(round(k,5),11,5),str(round(Sab,5),11,5),str(round(Haa,5),12,5), ;
  str(round(Hab,5),11,5),str(round(U,5),11,5)
Else
  ?str(round(R,5),11,5),str(round(k,5),11,5)
Endif
SET ALTERNATE OFF
R = R + 0.2
ENDDO
SET ALTERNATE ON
?
SET ALTERNATE OFF
close alternate 
close all
clear all
quit