//comp-func.g //CHEMESIS1.0 function poolcyl (path, length, rad, initcon, type, unit) str path float length float rad float initcon float PI = 3.14159 float area = PI*rad*rad float volume = area * length / 1000 /* divide by 1000 to convert from cm^3 to L */ float areaout = 2*PI*rad*length int type float unit create rxnpool {path} setfield {path} \ Cmin 0 \ len {length} \ Conc 0.0e-3 \ Cinit {initcon} \ vol {volume} \ SAside {area} \ SAout {areaout} \ radius {rad} \ quantity 0 \ Qinit {initcon*volume} \ type {type} \ units {unit} \ Iunits 1e-12 end /****************************************************************************/ function poolsphere (path, outerrad, innerrad, initcon, type, unit) str path float outerrad float innerrad float initcon float PI = 3.14159 float areaout = 4 * PI*outerrad*outerrad float areain = 4 * PI*innerrad*innerrad float volume = (areaout*outerrad - areain * innerrad) / 3 / 1000 /* divide by 1000 to convert from cm^3 to L */ int type float unit create rxnpool {path} setfield {path} \ Cmin 0 \ Conc 0.0e-3 \ Cinit {initcon} \ vol {volume} \ SAout {areaout} \ SAin {areain} \ radius {outerrad-innerrad} \ quantity 0 \ type {type} \ units {unit} \ Iunits 1e-12 \ Qinit {initcon*volume} end /****************************************************************************/ function pool2D (path, outerrad, innerrad, width, initcon, type, unit) str path float outerrad float innerrad float initcon float width int type float unit float PI = 3.14159 float areaout = 2 * PI*outerrad*width float areain = 2 * PI*innerrad*width float areaside = PI * (outerrad*outerrad - innerrad * innerrad) float volume = areaside * width / 1000 /* divide by 1000 to convert from cm^3 to L */ create rxnpool {path} setfield {path} \ Cmin 0 \ Conc 0.0e-3 \ Cinit {initcon} \ vol {volume} \ SAout {areaout} \ SAin {areain} \ SAside {areaside} \ len {width} \ radius {outerrad-innerrad} \ quantity 0 \ Qinit {initcon*volume} \ type {type} \ units {unit} \ Iunits 1e-12 end /****************************************************************************/ function difsphere (path1,path2,difpath,dif, unit) str path1, path2, difpath float dif, unit create diffusion {difpath} setfield ^ \ D {dif} \ units {unit} addmsg {path1} {difpath} POOL1 radius SAin Conc /* Should be "outer" pool */ addmsg {path2} {difpath} POOL2 radius SAout Conc /* Should be "inner" pool */ addmsg {difpath} {path1} RXN0MOLES difflux1 addmsg {difpath} {path2} RXN0MOLES difflux2 end /********************************************************************/ function difcyl (path1,path2,difpath,dif, unit) str path1, path2, difpath float dif, unit create diffusion {difpath} setfield ^ \ D {dif} \ units {unit} addmsg {path1} {difpath} POOL1 len SAside Conc /* Should be "left" pool */ addmsg {path2} {difpath} POOL2 len SAside Conc /* Should be "right" pool */ addmsg {difpath} {path1} RXN0MOLES difflux1 addmsg {difpath} {path2} RXN0MOLES difflux2 end /****************************************************************************/ function compcyl (path, radius, ncyls, cylsize, calconc, type, unit) float radius, cylsize float calconc int ncyls str path int type float unit int cyl for (cyl = 1; cyl <= ncyls; cyl=cyl+1) poolcyl {path}[{cyl}] {cylsize} {radius} {calconc} {type} {unit} end end /********************************************************************/ function compsphere(path, radius, nshells, shellsize, initcon, type, unit) float radius, shellsize float initconc int nshells str path int type float unit int shell float outer, inner outer=radius inner=radius-shellsize for (shell = 1; shell <= nshells; shell=shell+1) if (shell == nshells) ; inner = 0; end poolsphere {path}[{shell}] {outer} {inner} {initcon} {type} {unit} outer = inner inner = inner - shellsize end end /********************************************************************/ function comp2D(path, radius, nshells, shellsize, len, ncyls, initcon, type, unit) float radius, cylsize, len float initconc int nshells, ncyls str path int type float unit int shell, cyl float outer, inner outer=radius inner=radius-shellsize /* shell index first, cyl index second */ for (shell = 1; shell <= nshells; shell=shell+1) if (shell == nshells) ; inner = 0; end for (cyl = 1; cyl <= ncyls; cyl = cyl+1) pool2D {path}s{shell}[{cyl}] {outer} {inner} {len} {initcon} {type} {unit} end outer = inner inner = inner - shellsize end end /********************************************************************/ function conservepool(path,Total, vol, type, unit) str path float Total, vol int type float unit create conservepool {path} setfield {path} \ Ctot {Total} \ Cmin 0 \ Conc 0 \ Cinit 0 \ Qinit 0 \ quantity 0 \ Qtot {Total*vol} \ type {type} \ volume {vol} \ units {unit} end /********************************************************************/ function consv1D (path, ncomp, total, radius, length, type, unit) float total, radius, length str path int ncomp int type float unit float volume = PI * radius*radius*length / 1000 /* convert from cm^3 to Liters */ int i for (i = 1; i <= ncomp; i = i + 1) conservepool {path}[{i}] {total} {volume} {type} {unit} end end /*********************************************************************/ function consv2D (path, nshell, ncyl, total, radius, length, shellsize, type, unit) float total, radius, length, shellsize str path int ncyl, nshell int type float unit float outer, inner, volume int i, j outer=radius inner=radius-shellsize /* shell index first, cyl index second */ for (i = 1; i <= nshell; i = i + 1) if (i == nshell) ; inner = 0; end float volume = PI * (outer*outer - inner * inner) * length / 1000 /* divide by 1000 to convert from cm^3 to L */ for (j = 1; j <= ncyl; j = j + 1) conservepool {path}s{i}[{j}] {total} {volume} {type} {unit} end outer = inner inner = inner - shellsize end end /********************************************************************/ function difcomp2D(path, nshells, ncyls, difconst, unit) float difconst, unit int nshells, ncyls str path int shell, cyl /* shell index first, cyl index second */ /* axdif is diffusion axially, within a shell; raddif is difusion radially, within a cylinder */ for (cyl = 1; cyl <= ncyls; cyl = cyl+1) for (shell = 1; shell < nshells; shell=shell+1) difsphere {path}s{shell}[{cyl}] {path}s{shell+1}[{cyl}] {path}_raddifs{shell}[{cyl}] {difconst} {unit} end if (cyl < ncyls) for (shell = 1; shell <= nshells; shell=shell+1) difcyl {path}s{shell}[{cyl}] {path}s{shell}[{cyl+1}] {path}_axdifs{shell}[{cyl}] {difconst} {unit} end end end end /********************************************************************/ function difcompcyl(path, ncyls, difconst, unit) float difconst, unit int ncyls str path int cyl for (cyl = 1; cyl < ncyls; cyl = cyl+1) difcyl {path}[{cyl}] {path}[{cyl+1}] {path}_axdif[{cyl}] {difconst} {unit} end end /********************************************************************/ function difcompsphere(path, nshells, difconst, unit) float difconst, unit int nshells str path int shell for (shell = 1; shell < nshells; shell = shell+1) difsphere {path}[{shell}] {path}[{shell+1}] {path}_raddif[{shell}] {difconst} {unit} end end