 So I'm going to take you through a quick walkthrough of the BMI and the PMT on as they work on the quasi Jupiter hub. I'm going to do something that I haven't done before so hopefully this will work. I'm going to do a walkthrough of both normally I would do a introduction to BMI which is the basic model interface which you may have heard in some of the talks so far. And then I would go through PMT but because we don't have a lot of time, I'm going to try to combine them both so I'm going to show you what the BMI would look like within PMT. So they'll show you what it would take or what it would take to implement a BMI for your model, how to use a BMI and then also how to use a model and run a model in the PMT. So first of all, I'm on the quasi Jupiter hub and Tian has some instructions on how you can access this. I think she sent them to you, and we will in the hands on part of the demo we can go over that since there's so few people here I think that shouldn't be a problem. Make sure everyone's up and running. So, I'm going to start off with opening up a Jupiter hub. And if you are doing this along with us or in the future it'll take a lot longer for your hub to start up but I just started mine out so it's going to be quite quick. So we'll start with the BMI walkthrough and you'll see some notebooks here and we'll start with just the journal book. So let's start off with a description of the BMI. And there's some links here. The basic model interface the documentation. So we can actually you know what I'm going to be this. I'm going to try it to you anyway. So the URL is bmi.readthedocs.io. Yeah. I think I just sent that to the chat in the main group. This is the documentation for BMI. I'm not going to go through it all other than to say that there's basically six different categories of functions that you would have to implement. I'm going to total about 30 functions to implement. You don't have to implement them all though. It depends on your model and how just how far you want to go with the BMI and how interoperable you want to make your component. So let's go through each of these functions in the notebooks and show you what they look like in in PyMT. There's also some links here for the bindings for the different languages. So we support C, C++, Fortran and Python. They said the different programming languages that we have BMIs for. And then we have examples that go with them. These seem to be most of the languages that our community uses certainly that are in our, the CSMS model repository. Would that, I mean, does that cover most of them for this group here with a small group, but are there any other languages that you guys use or would want to use that we don't provide? Or is that pretty much covering? Python's good here. Yeah, Python seems to be the most popular language. I think it's the second most popular language in the world these days. I think I'm the only one that I use MATLAB. Use MATLAB, Harrison? Yeah, I'm sorry. We won't hold it against you, Harrison. Then you'll be the only one who doesn't. Actually, you're absolutely not the only one who uses MATLAB. We have lots of users of MATLAB. And we don't support it so much because it is, it costs money. It's proprietary. It's closed source. So that's the main reason we don't support it. However, we do have some projects where we have brought MATLAB models into PMT. We've just done these on one-off basis. And the way that we do that is to use an open source version of MATLAB called Octave. Have you ever used that, Harrison? Or anyone else? It's very good. It's not MATLAB. So it's not quite as nice as MATLAB. But using that, it's a long process. So we have to convert the MATLAB to Octave, which isn't too hard. And then get Octave into Python is another step. And then we can bring it in. So we have done it before. After all those steps, depending on your model, it might be easier just to translate it to Python. So that's how we would support Python right now. Another language that people seem to use is R and Julia. And so people have started to write BMIs for both of those languages. We have BMIs for both of those languages. We just don't have any models that we brought into the PMT yet. And then I'm going to talk about the Python modeling toolkit. So this is the Python package that we developed at CSDMS to the BMI aware framework. So it works with components that have a BMI. And because the BMI is a standard interface, we can write code that works with a BMI, a general BMI component. So it's easy to bring components in and work with them. And it takes, so the Python modeling toolkit is a collection of BMI models from all the different languages, all the different languages that we support. It is also a, and we have all of these loaded up on a hydro share. So all of the models are contributed by the community. And they may or may not work on all the different platforms. If you try to model in C, they're not always concerned with running it on, for example, Windows. And so we can't support Windows if they haven't provided Windows support. The one nice thing that we've done here is that we've loaded all the components that we have onto hydro share. So you're working in a, it's going to be a Linux environment, but you'll be able to have exposed, you'll be exposed to all of the different models that you can run. And if you were to try to run them all on your laptop, you may or may not be able to, depending on what operating system. Python modeling toolkit, so it's a library of models. It also provides tools for coupling different models together. So when you're coupling models. There's a lot of problems and doing that one we talked about is the language problem. Another one is that they need to speak the same, I don't want to say the same language. They need to have the same interface. So you so we don't want to have to support every idiosyncratic interface for every model. And the BMI solves that problem. So once we put a little bit of work onto the developer to create a BMI. And then we, but then we can use it. But then there's other details that the Python modeling toolkit would deal with when coupling models like unit conversion. So the BMI doesn't specify that a component uses any particular set of units. But it just the BMI just reports the units and then the PMT you can use that to convert units models come on different grids some will be unstructured grid some might be structured quadrilaterals triangles different size of different resolutions Python modeling tool to will provide some tools for mapping different grids to one another. I'm not going to go over all of those today, but there are some notebooks that covers that that you could do by yourself or in the time that we have at the end. If you have any questions or any issues or you just want to say hi to us you can click on the issues on GitHub. And file an issue on GitHub. We generally don't have people filing issues just to say hello but I think that would be great. So I'd be github.com CSC mass PMT issues. So we have a bunch of issues now that are still ongoing. And so that's the introduction. And then so that what I'm going to do now is open up the next notebook, and then I'm going to take you through what a component looks like. I am T and a specific component we're going to look at is the coastline evolution model. But before we begin are there any questions people have any. Any questions about that stuff. So, as I said, we're going to talk about the. We're going to use the coastline evolution model as an example, or any of you coastal people at all. No, I'm not particularly either, but hopefully it'll still give you an idea of what a model looks like in pi and T, and showing you how the CM works in pi and T it really because all the models look the same if you know how to use one model you should be able to get up and running with any of the models. So this is just a diagram of what the CM does. So it's a model that that simulates the evolution of a delta along the coast. So this blue line here I hope you can see it is a river going to the river mouth. It carries sediment that's deposited into the river, and then waves act on the sediment men cause a long shore transport. You can build out deltas like we see here. Does anyone have any idea what Delta this is it sounds like you guys might not if it's a few guys aren't coastal people. I think it looks like a penguin, but I was going to ask that question, if you knew. I do know I this is, it's a kind of a well known delta I guess only because I think I think because it looks like a penguin, and it's cute looking. It's a Hebrew delta in Spain. Sorry, no one wins the beer I was going to give a beer to whoever got that right but I take that back I'll buy the next round thank you for coming to the. So what we have here is so this is a schematic for the model would look like so if we see the so it's on a grid so I've drawn these grid cells are huge I just wanted to show that we're going to be operating on a rectilinear grid. And that's where the values are going to be and we're going to be looking at the water depth so we're going to be adding sediment, creating a delta and then obviously shallowing the ocean water. So we're going to go, but to get there we're going to look at some of the capabilities of pi empty and what the model looks like in pi empty. I'm going to go I'm going to go run through these. I'll try not to go too quickly, but so please let me know if I'm going too fast or if you have any questions again just jump right in. So in pi empty. The, you can import this variable called models. I hope you all are somewhat familiar with Python if not again please just ask questions and I'll. So this variable models is a dictionary Python dictionary and it's going to be a dictionary that maps model names to actual classes that implement the model. So, for instance, we can see what. So this keys function is a standard dictionary function method function for Python dictionaries. And then you can see these are all the names of models that we have loaded right now on the hydro share for pi empty. And as I said before all of these models may not if you were to run all of this on your local computer which you totally can. Some of these components might not be available because we just haven't built them for windows is windows is usually the problem normally we can I shouldn't say problem. We can normally get them working for Mac and Linux those seem to be the standard ones because that's what people program in. But we don't always, they don't always run them on windows or build them on windows. So anyway, those are the models we use and CEM should be in here and we see it is at the end here so that's the one we're going to use. So we can access it either either as a regular Python dictionary and using the syntax with the square brackets and then any models of string or just as a straight attribute and that's what I. So the only so CEM with a capital C is a class. And then we can instantiate the class and create an instance of CEM. We can create more if we wanted to we could create 234 whatever instances of CEM all at once in the same memory space and they could all run independently of one another. But today we're just going to run one. So for instance you could in a notebook you could create a whole bunch of CEMs maybe with some different set of input parameters, and then just farm them out to a whole bunch of processors and run them in parallel from one notebook. So as I said we're going to go through the basic model interface and just show you what component looks like in PyMT and just what it would might take to implement a BMI for your model for any model. So there's a model information functions this provides just some static metadata about the model. These are pretty straightforward and I would think if you try to imagine how you could do that for a model, it would be pretty easy you just write a function that return to string that's the name of your model. So, in this case CEM. Pretty easy. They're not also easy. There are two more that we're going to look at here the output var names and then the input var names so this would be a function that just returns a list of strings. The output var names are all the variables that can dynamically change so this is part of the state of the model. And so as a mouse running these will be updated. So you'll see that seawater depth is one of the variables in output var names and that's the one that we're going to be mainly concerned with with our simulation today. The input var names. So this is also a list of strings, we can go over exactly why these strings are so crazy looking and so long. But these are the variables that another component or a user can change dynamically as the models running. So, for instance, what we're going to be doing here, the sea surface wave height. So we're going to be changing the wave height and the wave direction as the models running. And one thing to note here is that before, so CEM was, it's a sea library. It was a program as a command line program, and you would just run it you would set up, you know the initial conditions and you just run it. But now that it's in PMT, it's in it's in Python, you know you can run this interactively and so that's a new capability that we offer for some of these models. So a model written in C now you can play with and you can run it for a little while change some parameters in its state, and then advance it again. And so that adds a new capability to it that it didn't have before. So as I said some of these names are a little unusual. So what we're, we're going to we want is water depth is the output variable we want to look at and we're going to change some input variables to as a models running. So we're going to adjust the sediment supply, we're going to add rivers, we're going to turn off sediment supply we're going to increase the sediment supply. And we can also change the wave heights and periods as it's running. So if, so those are the, the common names for them, and then they would map to these standard names under that we're listing here in the table. So the standard name. So we have a conventional name and standard name, the standard name is intended to be a very descriptive spring that describes the variable. So when we're coupling models you want to be sure that we're exchanging the same variable so that's why these are so long. They're just very specific. So, some of them are pretty easy to figure out water depth is see water depth. Pretty good sediment supply those a little unusual land surface water sediment bed load mass flow rate. So the, I'm not going to go over the standard names for all for all of these as they. It's a much longer discussion, but you'll notice that each of them has a double underscore and so the what the words to the right of that double underscore is the quantity. And the words to the left is the object. So the quantity here is depth mass flow rate height period velocity. And then the left is actually what is it the velocity of what is the height of and so that's the form of these. If you go to our website we have a long list, a dictionary of, I don't know 1000 2000 maybe I think it's probably 3000 names and so generally when people are writing a BMI. They can consult that dictionary and they'll be able to find the name that they're looking for. And if not you can contact us and we can get you in touch with the people to help you out with that. If you are doing this, please don't let this, please don't get hung up on this. Just, just call it whatever you want and we can fix that later. This is, it's a detail. But the we want we don't want that don't hold you up and creating BMI's. So I think the other names are probably pretty, you can probably figure them out the other names out to. So I'm saying that's a pretty easy one, but these are the ones that we're going to be working with today. So every component in in pine tea, you can get help on and we'll look at the help for cm. And the help messages will look very similar for all the components and pine teeth. It'll give a brief description of the model. So this is cm. So if you were to go through this notebook on your own, you instead of working with cm you could work with any of these other components that we have loaded and this would, it would look very similar. There's some also some other metadata like the author of the component, the version, the license, the DOI and the URL. One thing we want to be very careful of with these components is it so you're accessing this through pine tea. And that's something we wrote and be my that's all our stuff, but this model is not ours and we want to be very clear that it to give credit to whoever is contributed the model and so we want to. So this is the, the help message here. So you can get lots of other metadata on that component to you can get the version. See, I guess the am I should be. And then references there's a site as attribute for every component. So this is just going to be a list of any references that the component author so Brad may have provided for us. And unfortunately, I think in CM there actually aren't any. He didn't submit any references not to say that there aren't any but he just didn't submit any. We could. I'll leave it up for as an exercise for the reader to instantiate a different component and look for the references for it there should be lots. If you want to child would be a good one. That's just the information functions fairly easy to implement. And I think pretty straightforward to use the next set is the model control functions and these ones are a little bit or they can be a little bit more difficult to implement. If you're starting from scratch though, I would say they're not very difficult to implement at all. And with, if you have an existing model if it did wasn't written with this be my design pattern in mind. These functions initializing the update function may all be together and you may have to pull them apart and refactor your code just a little bit. So there's going to go over just two of the control functions. So one is initialize every component will have an initialize method and it'll take an argument that is the name of an input file. What's going to happen here is CM is going to read that input file. So this is just in this case is just a text file with some input parameters. It'll allocate memory it'll initialize the memory, and it'll just get the model ready for time stepping. So if you can think of your model and code you'll have a bunch of stuff at the beginning. You'll have a for loop over time, and then all this stuff in the for loop is going to be in the update method but all the stuff above the for loop is an initialize. So we've initialized cm and we're ready to go ready to time step. I think before I do that though, I'll show you what an input file for cm looks like. And then we'll get I'll return to this in the future. So this is what the CM's input file happens to look like so I've just included one for you on our HydroShare repository just to get you running. But you'll notice it's not the greatest input file it really is just a string of numbers. It's not clear what the numbers are. So, to use this initialize method you have to have an existing input file, and they're not they're always idiosyncratic. And they're sometimes easy to use sometimes difficult to use but we'll get back to this pi and t provides a method for creating input files programmatically so that you can create, regardless of the company are using you can create them in the same way. So, but for now we're just going to stick with the one that we have. And then the update method will update cm or any component just by one time step. There's an optional BMI method called update until that will take one argument that is a time and then you do update until a time, and it would update several time steps possibly until it reaches that time. Not all models can implement that it just depends on how they're, they themselves are implemented some require a fixed time step. So it's not always available. Now, how do we know that cm was updated by that one time step. Well, we can look at the time functions. Again, so we have a start time so this is a BMI method starts at time zero. And then we'll look at the time step in the units. So cm's time step is point to and point to what point two days. So now we've updated cm one time step. So if you do cm dot time. If I've done this correctly it should be point to cm has implemented the update until. So this would be an example of how you would, how you could use that update until 1.0. So we're almost through the, we're through the main BMI methods I think the update until the update and initialize methods are the main ones. But now we can get information about the variables. So these are the state variables. So for instance we're looking at the output variable names, as we saw before. These are the state variables that cm exposes to the user. And each of these, these aren't typically methods that you would use if you're using within PMT but if you were to implement a BMI for a component you would need to implement these. This is metadata about the actual variables so the units to see what are depth is in meters. Again, we don't specify what unit system to use only just have to report what the units are. The variable type. So these are floats. So this is all metadata that PMT uses to, for instance, allocate memory. And then every variable is defined on a grid and agreed kind of multiple variables and a model kind of multiple grids. So this is just an identifier for which grid seawater depth is defined at. It's just an integer. It could be whatever number, but we'll use this number later on to get information about that grid. So seawater depth is on a grid ID to and that as we saw in the scroll up here. So that's going to be this. We don't know this yet because we haven't called the correct functions but I'm just telling you that the seawater depth is actually defined on this rectilinear grid so it's going to be a 2D grid with rows and columns. So what I'm going to show here is just that these are all the output variables and these are the grid ID so there's actually several different grids that CEM has. So the water depth and the bed load flux are on grid 2. So we're going to be using when we get information about the grids. Now a model component or a data component isn't very useful until you can actually get values from it. So this is going to be the get value. So every component is going to have a get value method. Because if you didn't have a get value method, the model wouldn't be very useful. The data set wouldn't be very useful if you couldn't get data out of it. So again, so all the get value method will take this string which is an output, something that's listed in the output var names, so seawater depth. So if we run this, we just get a numpy array, so flat array of all the seawater depths in meters. We can also, so the opposite of the get value would be the set value. Now, so this is all the set value. You can only call set value on variables that are listed in the input var names. So what we're doing here is we're setting the wave height period and incoming wave angle for the component. And so this is what we'll be doing every time step when we're running the model or what we could be doing every time step for running model changing the wave heights for every time step. And finally, we'll just do a quick overview of the grid functions, and then that'll be an introduction to a quick introduction to the pi mt. So as we said, the RSA showed you the seawater depth is on a rectilinear grid. And this is the actual grid here so we can use this pi mt method that tries to plot a variable name. That's the first argument. And so we have here on the bottom, the bottom six kilometers or so is the delta with the initial flat coastline. And then we can see that the ocean floor falls off linearly toward the diagram. So this is the initial model grid for the water depth. So this is just repeating the to get the grid that the seawater depth is defined on is grid two. Now we can call the grid type the grid methods so these all begin with grid underscore. So for instance can get the grid type so the grid type here is rectilinear other components may not have rectilinear grids they may have unstructured grids they may not have a grid at all they may have a grid of points just points and connected points. So this is the uniform rectilinear, it has a number that has rows and columns is how we would define that. And so you can get the shape of the grid, and then the row and column spacing of the grid. So for CEM that would be so we've 100 rows 200 columns and 200 meter meter spacing between each of them. This is defines the grid for CEM. So that takes us through a quick demonstration of what a component looks like in BMI, or a BMI component looks like in PMT, and maybe gives you an idea of what it would take to implement to be my yourself. Are there any questions before I go out. I've got one more notebook that's actually going to run CEM. You can play with wave angle and sentiments fly thanks. Yeah, sure. Eric, is there a different. I don't know what to call it like a script for converting different files for input like a net CD file. I don't know like what do you do about. Is there just a different syntax for that. Yeah. Well, it depends on. I think, Tian will make cover this a little bit so that could be a data component. So for instance, you could have a net CDF so what we're going to be doing here is is. And CEM with waves. And so the waves can come from anywhere. And one of those places ways could come from could be a net CDF file. And so what we would have would be a BMI that wraps a general net CDF file so that you can access that net CDF file through a BMI in the same way that you are doing it with with CEM so the net CDF file itself would have a BMI. If that kind of makes sense and you could also have a BMI for a CSV file that just reads in a time series of ways from a CSV file. And our goal is to make that seamless so that you don't, it doesn't matter what format the file the data are stored in, but just as long as you can use the BMI you can access it. I'm not sure if I answer your question but Okay yeah I just I just don't have that much experience with it so I'm just trying to imagine like what what what it takes but yeah yeah it's a big problem. You know every every model has its own crazy particular with input files don't crazy set of input files and then also output file formats. And so we would we're trying to harmonize all that and make it easier for people to use so that they don't have to know how to read. It's a big problem. Okay, all right, okay, thank you. Yeah, yeah. Are there any other questions before we continue. Yeah, I guess I so my, my entire introduction to numerical modeling has been through land lab. And I think I can see like in here you've got the update. Is that basically like run one step in. Yeah, that's exactly that's exactly right. Land lab and and pine teeth actually quite they're they're closely related we have scripts or we have a package in land lab that will automatically wrap a land lab component with a BMI. So I think if we were to look at the components that we have loaded on the hydro share right now. I think some of them are probably the BMI version of land lab components. So if you were to look at those you might recognize some of them. So yeah, but I would like to do in the future is to do the reverse so we can bring a land lab component into pi mt but I'd like to actually do the other and bring this, for instance, the coastal evolution model into land lab. So we could run on a land lab grid and interact with land lab components. So that's something that we're going to be doing as well so Yeah, that was going to be my next question like if if there is an easy way to do that other than maybe like, I don't know, figuring out how to get an output from this into the input. Yeah, yeah, cool. Yeah, right now there isn't I guess I'd say there isn't an easy way to do it right now but there will be and because the beam all the components and pi mt have that standard interface it should be fairly easy to write a wrapper to bring them into land lab also has a standard interface they're not exactly the same, but they're compatible. They follow the same design pattern. Thanks. Hey so now we're going to run the CEM model. So again, this is our penguin delta. I don't think we'll be able to build a delta quite that pretty today but if you guys want to play with it later on, you can try and see see how far you get. So we're going to just do a few steps that we did last time. So we'll just start off by bringing the model into I am tea and initializing it. And so, oh, so this we get back to the CEM input file. So as I said we provided I provided you with an input file, but it, you know, maybe you don't want that input file maybe want to use something else. So I'm going to show how pi mt can help with that. We can get help on it and if you scroll down a little bit further than before I didn't get down to this. We can look at some parameters and so these parameters are values in that input file so if you remember what the input file looked like it was very opaque it was just a whole bunch of numbers, but they represented this I don't know what order they are. And so are these the variables so pi mt provides a setup method. And as keywords you pass it those variables. So in this case we're going to call setup this is not a BMI function this is a pi mt function. And we're going to pass it the number of rows is 100 columns is 200 with a grid spacing of 200. And then it will take those keywords those values and just plug them into the correct places of the CEM input file. So, if we say I'm going to do this. So it returns the name of the input file that it created in the location of it so it in this case it's created in a temporary directory. So let's see that it worked. We'll have a look at the input file. So it looks similar to the other one, but now let's let's change the number of columns to 400 and make sure so it created a new temporary. And then so okay so this one changed to 400 so apparently this is the number of columns. So it will take a bunch of keywords and create an input file for your model. So model in the input files can be much more complex than this. But hopefully the idea is that you don't have to worry about the crazy different formats of all the input files and you can create a programmatically through Python. So I'm going to use this new input file. So now it's initialized. So now we're ready to run. So before we're going to look at the water debts. So we're going to just get some information about the grid. So this is we've already did this in the last notebook. So I'm just going to run through this a little bit quickly. We can see that the grid as before as you know from rectal linear it's 2D and it has 100 rows and 200 columns of the grid spacing of 200. So this is the initial part of the NumPy array that represents the water depths. So minus one is on land and positive values are because it's water depth, they get deeper towards the bottom, or the top of the, of the diagram we're looking at more. And as before we'll just, this will be our initial bathymetry. And then we've got, then we're going to set the wave so the incoming wave height. So we can set that. These are the values before that we used. You know what, since there's few people here. I'm going to give you your money's worth I'm going to go off script here and just going to see what happens. I'm going to change the wave angle now is going to be 45 degrees. I'm not sure whether it's 45 degrees this way or this way but hopefully we'll be able to figure it out. And just as a disclaimer, these, you know, these models are research models that are contributed to us. Sometimes they don't fail gracefully we'll say so we'll see if this works I think it'll work but we'll see. Okay, and now we're going to create a grid of, we're going to set the sediment supply. So the sediment supply I'm going to scroll up to the top again here is also defined on the same grid as the seawater depths. We don't have sediment supplies from any point on the grid. And so what I'm going to do is add sediment supply to the center of the grid, and it's going to create a delta that's going to go straight out. So that's what we're going to do here. So this is row zero column 100. So row zero is down here is he can't say when he is around 20 kilometers, and then it's going to go straight out and that's where the river is going to hit the ocean, and that's we're going to deposit sediment. And this is just to show you what the units that we're using our so this is kilograms per second. Okay, so now we're ready to run the model. So we're going to advance the model for 3000 days, because that's the unit the time step unit for every iteration through the loop we're going to call the set value method and we're going to change the the bed load In this case, we're going to keep it constant so we don't actually have to call this every time but you know you could have an if statement in this loop where you know if time is less than 1000 this is the discharge if it's greater than 1000 it's a different So you could add that to your time loop. So it'll take just a little while to run. So we wait for there if there's any questions. Right so we have the sediment coming straight out, and then the waves coming either this direction, or this direction will. We're not sure which, and they're constant so that there's no variation to the waves. So that's why I'm a little concerned. The models are being added to this kind of ecosystem are older ones that are kind of updated for it as opposed to just new stuff developed purpose built. Yeah, yeah, yeah a lot of these components actually that we have here are previous component, the previous models that we have refactored a little bit to so that we could put a BMI on them. Okay, well it runs out crashing so that's that's good. We'll look at the time. And so that's the correct time. So let's hope that we've built a delta. So we have built a delta but it's a little bit crazy. So it looks to me like the waves are coming from. Well I'm not sure if what your screen sees but I think you can see which direction the waves are coming from, and actually created these little waves along the coast which is interesting sediment waves, little mini ones. The conditions for the CM are wraparound boundary conditions. So when sediment leaves my screen like you can see my finger. So in the sediment leaves one side, it gets introduced to the other side. And so what you see here is some little periodic waves in the coastline which is interesting. Okay. So let's add a second source of sediment so the other one was in the middle. And so this is called that was column 100 so now we're going to keep that one. We're going to add a new one at column 1500. So it's going to be over here somewhere or no call 150. And we're going to add a little bit more sediment to that one so it's going to be a little bit stronger but we're still going to have to choose rivers going straight out. And because I was getting a little crazy. I'm going to change the wave angle again. I'm going to move it back to zero. So now we're going to have the waves got coming straight in, and we're going to run it for another 700 couple years 750 days. So now we have. So now it's flattened a little bit, because now we've got the waves coming straight in and so it's diffusing those little bumps that we saw. So we can see the delta in the middle is still building out a little bit and then there's a delta to the right that we have added with a little bit more sediment to it. And you can see there's a little so a few lagoons and stuff that is actually formed. So now, so for the last step we're just going to shut off sediment supply. So I hope you can see that how we can easily change the model and run it interactively. And so what I'm doing here is I'm manually adding changing the waves and the sediment supply but I hope you could imagine that we could easily get that from another data component, those, those information, or from another model, another component. So now we've, so this first line sets everything in the, in the sediment supply to zero, and then we're going to run it to for another 250 days. And so it's, so again we have no sediment supply waves still coming in from the top, and we've just diffused out the delta so now we've got a nice smooth delta. Well that's all I had for you. I hope that that was all right I hope you learned something.