diff --git a/TrimSPlib.js b/TrimSPlib.js index 178f059..a383f23 100644 --- a/TrimSPlib.js +++ b/TrimSPlib.js @@ -1,11 +1,14 @@ -// This file contains function that are Javascript generic +// This file contains function that are generic Javascript for TrimSP function parse_formula (mf) { // This function takes a chemical formula and returns // an object that contains the atoms and their number + + // replace all types of brackets into () var mf = mf.replace(/\[/g,"(").replace(/\]/g,")").replace(/\{/g,"(").replace(/\}/g,")").replace(/\s+/g,""); if(/^\d+/.test(mf)) throw new SyntaxError("Molecular formula should not start with a number!"); var mol = {}; + // go into brackets and collect info while(mf.includes("(")){ var x = mf.lastIndexOf("("); var y = mf.indexOf(")", mf.lastIndexOf("(")); @@ -14,7 +17,7 @@ function parse_formula (mf) { var c = mf.substr(y+1); c = /^\d+/.exec(c); c=(c!= null)?Number(c[0]):1; - + // recursive var a = this.parse_formula(z); var b = ""; for(var k in a){ @@ -24,13 +27,19 @@ function parse_formula (mf) { } var m = ""; - while(m = /([A-Z]{1}[a-z]{0,}[0-9]{0,})/.exec(mf)){ + // Separate element name from stoichiometry + // while(m = /([A-Z]{1}[a-z]{0,}[0-9]{0,})/.exec(mf)){ + while(m = /([A-Z]{1}[a-z]{0,}[0-9]{0,}\.?[0-9]{0,})/.exec(mf)){ + // Element var m1 = /([A-Z]{1,}[a-z]{0,})/.exec(m[0]); - var m2 = /\d+/.exec(m[0]); + // Stoichiometry + //var m2 = /\d+/.exec(m[0]); + var m2 = /\d+\.?\d{0,}/.exec(m[0]); if(typeof mol[m1[0]] == 'undefined') mol[m1[0]]=(m2!=null)?Number(m2[0]):1; else mol[m1[0]] += (m2!=null)?Number(m2[0]):1; mf = mf.replace(m[0], ""); } + console.log("mol=",mol); return mol; } @@ -836,14 +845,15 @@ function CreateInpFile(All) { Check++; } } - if (Comp == "") {Check++;} + if (Comp == "" || typeof Comp == 'undefined') {Check++;} // Write composition to results file header // Densities of layers let Lrho="layer"+i+"rho"; let rho = 1*All[Lrho]; + // How to do this? All[Lrho]=sprintf("%6.2f",rho); - if (rho=="") {Check++;} + if (rho=="") {Check++;console.log("rho",rho);} // Thickness of layers let Ld ="L"+i+"d"; @@ -853,8 +863,8 @@ function CreateInpFile(All) { // Sanity check, is the layer supposed to have value? are they all there? if (Check!=0) { - ErrMsg="Error: Bad chemical formula in Layer $i.\nPleach check!\n"; - //print STDERR $ErrMsg; + ErrMsg="Error: Bad chemical formula in Layer $i.\nPlease check!\n"; + console.log($ErrMsg); return ErrMsg; } @@ -866,6 +876,7 @@ function CreateInpFile(All) { Sum=Sum+LElComp[key]; } if (Sum==0) {Sum=1;} + console.log("Sum=",Sum); let Els = Object.keys(LElComp); diff --git a/fortran/trimspNL.F b/fortran/trimspNL.F index 09e2daa..ef9f7f8 100644 --- a/fortran/trimspNL.F +++ b/fortran/trimspNL.F @@ -394,6 +394,7 @@ C This part reads the input file (new format) OPEN(UNIT=99,file=errnam,STATUS='replace') OPEN(UNIT=11,file=innam,STATUS='unknown',ERR=1359) C First line: properties of projectile +C Ordered as: Z, mass number (amu), imp. energy, dist. of imp. energy, angle, dist. angles, READ(11,*) Z1,M1,E0,Esig,ALPHA,ALPHASIG,EF,ESB,SHEATH,ERC C Second line: simulation related parameters C Ordered as: Number of particles, seed, seed, seed, initial depth, RD, depth increment, CA, KK0, KDEE1,KDEE2,IPOT @@ -406,13 +407,13 @@ C Third line: Number of layers C Here we read the NLayers structure DO I=1,NLayers C Thickness (DX), density (RHO), and correction factor (CK, it is -C always 1.0??) Atomic numbers +C always 1.0??) READ(11,*) DX(I),RHO(I),CK(I) C Atomic numbers READ(11,*) ZT(I,1),ZT(I,2),ZT(I,3),ZT(I,4),ZT(I,5) C Mass numbers (amu) READ(11,*) MT(I,1),MT(I,2),MT(I,3),MT(I,4),MT(I,5) -C Concentration +C Concentration (stoichiometry) READ(11,*) CO(I,1),CO(I,2),CO(I,3),CO(I,4),CO(I,5) C Surface binding energy READ(11,*) SBE(I,1),SBE(I,2),SBE(I,3),SBE(I,4),SBE(I,5)