Dino Posted December 22, 2020 Share Posted December 22, 2020 I am trying to react two mineral with kinetic rate laws. The dissolution rate of the first mineral (Min A) is used in the calculation of the rate in the second mineral. I've tried several routes with scripts, but each attempt indicate I have an error in line 9 (script shown below and line in red). The error is probably obvious, but.... I know the rate laws alone for Min A and Min B work under a separate scripts. I can run both minerals together when I just use just the last two lines for MIn B. The REACTANTS in the React input file are both Min A and MIn B with the custom rate law for Min B pointing to the file containing the script below. I've tried several versions of line 9 with no success (error = syntax). etaa = 1 Ea = 44400 Ew = 67800 etab = 0.75 Eb = 49700 T1 = activity("H+")^(etaa)*exp(-Ea/(8.314*TK)) T2 = exp(-Ew/(8.314*TK)) T3 = (activity("OH-")^(etab))*exp(-Eb/(8.314*TK))kinetic "Min A" rate law = "(surface*rate_con*(T1 + T2 + T3))*(1.000-QoverK)" a = rate*23.089 kinetic "Min B" rate = surface*rate_con*a*(Time)^(-0.79) RETURN rate Quote Link to comment Share on other sites More sharing options...
Jia Wang Posted December 22, 2020 Share Posted December 22, 2020 Hello Dino, I think the issue here is that the program is not recognizing the variable kinetic "Min A" rate law, you can just simply call it rate or use another variable name (e.g. MinA_rate). Then set that variable in the following line in place of rate. I am not really sure you need the line 'kinetic "Min B"'. Try replacing kinetic "Min A" rate law = "(surface*rate_con*(T1 + T2 + T3))*(1.000-QoverK)"a = rate*23.089 with... MinA_rate = (surface*rate_con*(T1 + T2 + T3))*(1.000-QoverK)a = MinA_rate*23.089 If this doesn't help, please attach your input file and your rate law scripts so we can troubleshoot. Best regards, Jia Wang Quote Link to comment Share on other sites More sharing options...
Dino Posted December 23, 2020 Author Share Posted December 23, 2020 Jia Thanks for your response. I believe the problem is that the REACTANTS input has two reactants Min A and Min B. The script appears in the rate law input for Min B, but the first rate that I want to calculate is Min A because the input that I need to calculate the Min B rate is a constant (conversion to m/s) times the rate from Min A. I was trying to avoid confusion by indicating that the rate I need is that of Min A. Is there a way of determining this without invoking the Min A rate equation in the Min B script? If I use your suggestion, does the rate calculated in MinA_rate = (surface*rate_con*(T1 + T2 + T3))*(1.000-QoverK) that of MIn A (as I mean it to be) or is there confusion and that is why the context bombs? Quote Link to comment Share on other sites More sharing options...
Jia Wang Posted January 4, 2021 Share Posted January 4, 2021 Hello Denis, React won’t recognize the rate of another mineral being called in the rate law script (i.e. trying to call kinetic “Min A” rate law” in the initial post). If your reaction rate law for mineral A is relatively simple, then you might be able to replicate it in the custom script for mineral B using constant values. However, variables such as “surface” and “rate_con” are always going to refer to the values set for the kinetic mineral that you are providing the rate law script for. So if this is a script for mineral B, then calling the variables “rate_con” and “surface” at any point in the script, would refer to the rate constant and surface area of mineral B. React cannot refer to the rate constant of another mineral in the rate law script but you might consider entering the numerical value of the rate constant for mineral A in your script directly. Another feature that might be useful here is helper functions. These functions allow you to call a property value for a specific species, minerals, or gas and use it in the custom rate law. For a list of complete helper functions, please see Table 5.3 in the Reaction Modeling User Guide. You might be particularly interested in using the mass() helper function to figure out the surface area of mineral A or using the function QoverK(). Hope this helps, Jia Wang Quote Link to comment Share on other sites More sharing options...
Dino Posted January 5, 2021 Author Share Posted January 5, 2021 Thanks, Jia. your suggestions are very good. I had thought of using one of the elements to calculate the input I need for Min B, but you have put it in a much better context. This should be particularly useful since there are elements that are not common between the two minerals. I’ll give it a try. having you as a resource is invaluable. Thanks again and I wish you and your family a very happy new year. Denis Quote Link to comment Share on other sites More sharing options...
Dino Posted January 6, 2021 Author Share Posted January 6, 2021 Jia, It looks like I should be able to use a controlling script to do what I want...correct? If, as part of the controlling script, I read the dissolution rate for Min A at the current time step and use that to calculate a new rate constant for Min B, will that work? I assume here that at each time step in REACT, both Min A and Min B are run and the existing "React_Output..." file is updated to the current time step...correct? If so, can I interrogate that file and extract the last reported value for the dissolution rate and use it in the calculation of a new rate constant for Min B (it may be a time step off, but if the rates are changing slowly then the error should be small)? From what I read in the manual on Tcl and controlling scripts I should be able to do this, but my working knowledge is, admittedly, limited. Or, is there a way to print the needed data to a file at each time step and read that file? Denis Quote Link to comment Share on other sites More sharing options...
Dino Posted January 12, 2021 Author Share Posted January 12, 2021 JIa, I wrote wrote a post last week about using the 'remote' technique to solve the problem of accessing the rate constant from Min A in the Min B script. However, it occurred to me that running two react simulations simultaneously might also be a possibility. I installed Visual Studio and imported RC_example2.app and, after making the appropriate change to the RC_helper.h directory and pasting the script into the Visual edit screen, encountered no less than 450 errors when I tested jus the first line of the code!! I would have thought that this would have been a more straight forward operation. My colleague is going to try FORTRAN with with he has more experience. What I was hoping to do is run the first REACT (script 1 in the example of Chapter 11.2) and before calling script 2, get the value of the rate from Min A, perform a simple calculation to get a value for the rate constant for script 2, then calling script 2. Is this likely to work or is it doomed to failure? Thanks for your help. Denis Quote Link to comment Share on other sites More sharing options...
Jia Wang Posted January 19, 2021 Share Posted January 19, 2021 Hello Denis, The remote control feature is now a legacy feature that is replaced by the Plugin feature. If you would like to pursue this route, I would recommend using the Plugin feature instead of Remote Control. On the other hand, if you or your colleague is planning to do a little programming, I think you might have better luck with what you're doing using a compiled rate law instead. The advantage to using this method is that you can call information from specific vectors that are available in the data structure stored in the program run that is not available in a normal rate law script or the equation option. If you would like to look further into this option, I would like to point you to section 5.3 Compiled Rate Laws in the GWB Reaction Modeling User Guide. The get_context.h and rate_param.h files referenced in this section are found in the src folder where your GWB software is installed. I believe the kinetic rate for reactants that you're interested in is stored in a data structure call "reactant status" as the variable dndt. Just note that order of your reactant will matter in this case. For referencing a rate of an existing reactant, make sure the reactant's rate you're referencing is listed before the reactant you're calling it for. Hope this helps, Jia Wang Quote Link to comment Share on other sites More sharing options...
Dino Posted January 19, 2021 Author Share Posted January 19, 2021 Thanks, Jia. I'm sure this will help. I saw the Plugin feature, but I must admit it would take quite some time to understand it. Denis Quote Link to comment Share on other sites More sharing options...
Brian Farrell Posted March 28, 2022 Share Posted March 28, 2022 Hi Denis, The GWB 2022 release includes a new "reaction_rate" Custom Rate Law "helper function" that should be of use to you. By using the helper function, the custom rate law for one mineral can reference the current reaction rate for another. For more information, please see Table 5.2 in the GWB Reaction Modeling Guide. Regards, Brian Farrell Aqueous Solutions Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.