diff --git a/dev/.documenter-siteinfo.json b/dev/.documenter-siteinfo.json index 72d4dc249..62426edd8 100644 --- a/dev/.documenter-siteinfo.json +++ b/dev/.documenter-siteinfo.json @@ -1 +1 @@ -{"documenter":{"julia_version":"1.10.4","generation_timestamp":"2024-08-04T09:25:01","documenter_version":"1.5.0"}} \ No newline at end of file +{"documenter":{"julia_version":"1.10.4","generation_timestamp":"2024-08-04T10:53:02","documenter_version":"1.5.0"}} \ No newline at end of file diff --git a/dev/Articles/How-corporate-IT-is-killing-innovation/index.html b/dev/Articles/How-corporate-IT-is-killing-innovation/index.html index bc0a2e2f3..e7b0aabc8 100644 --- a/dev/Articles/How-corporate-IT-is-killing-innovation/index.html +++ b/dev/Articles/How-corporate-IT-is-killing-innovation/index.html @@ -1,2 +1,2 @@ -How corporate IT is killing innovation · WallyToolbox.jl

How corporate IT is killing innovation

For the past decade I have constantly worked with innovation. That's all I know to do with my life. A day without creating is mostly not worth it. Whether it was in academic or corporate settings, I generally got along with teammates and most stakeholders. But no matter where I go I am followed by a constant ghost , the enemy, the corporate IT. I known I don't fit in, I don't belong in the system, I don't fall into the listen-pray-obey-loop-herd, but that is not the reason why I should be guilty of how bad my interactions with corporate IT (not specifically with IT people, I have met very nice people there) have been for more than one decade.

So far, my words might seem harsh and full of anger to the uneager reader. As I scientist I am prompt to expect hateful reactions from the conservatives and religiously aligned corporate people. But as a scientist I shall recur to the reason and argumentation to expose, solely based on observations, my conclusions on the matter. Time to end the vague wording, let's get to the anecdotes.

Installing a compiler, but you no admin

Early in my PhD days I was told I should model some chemically reacting flows to better understand some processes I was studying. As usual, you start that by a literature review cause you are told so or because you are not dumb enough to think you can reinvent the wheel.

After some reading I realized there was nothing to add to that field under my research scope and it was time to use the numbers that were already available in the literature. Yay, time to code! Well, not so fun... In fact, that nothing-moment is when PhD students realize how humble they have to be in face of existing knowledge. It is also often the point where the cracks appear in the system, the small spots where they can make a small contribution.

My lab was a standard Windows-only environment, although later on I discovered that there were more exceptions than rules in the system. I was actually in the wrong side of the building, most students in the other wing had everything I dreamt of. Since the libraries I was aiming to use at the time were not portable from Nix, I had to start my crusade to show IT I was not the standard user and that I was worth Baloo048 (Baloo048 was the name of my workstation once I got authorized a CentOS 5 system)!

Security above obscurity (and overall)

Here I am not making a reference to security through obscurity and I will actually cite several unrelated events that I have seen so far.

IT has always been considered guilty of major failures in security systems. Nonetheless, trespassers often get inside by errors committed by standard network users. Keep that repeating for more than 40 years and you've got what we have today: an overprotective IT mother. – You don't know how to use a computer! You are an irresponsible m-word! – And the list goes on... so a monster was born. All because of repeated wrong root-cause analysis.

With the rise of social networks, machine learning, and everything that dominated the web since 2010, IT gained power in major corporations and in some situations their choices come above technical or commercial ones. Naturally, the overly repressed IT people raised their concerns about every living and digital thing and started locking all paths to standard users.

What companies forgot is how that building walls also block your views to the outside world. Innovation has always been a matter of who copies the best part of what others are doing. Mankind never created a single thing, we copied from nature, and then, putting bricks together, we copied from one another with varying levels of complexity. That to say, every single patent is somehow dishonest. But we keep protecting them, they are the status quo basis of competition. That's the case probably because we are less intelligent than we think we are.

The moment IT obfuscates the view of technical people, the copy-edit-paste cycle is broken: innovation is, at least, strongly hurt. And there is no lack of examples of how this actually happens.

I will stick to what concerns my technical field of expertise.

  • In numerical simulation it is fundamental to sandbox everything, especially systems. Creativity comes with destruction, it's always oblivion. Numerical people like hard access to perform their best (and sometimes even to perform at all). Working with containers or, even worse, the cloud, are nightmarish. In our world a sandbox is nothing more than a good old workstation without company network access. We make magic there. Every single time an engineer has to beat themselves to have the right to work their best, they get damaged. Some withstand for years, some simply get aligned, what is even worse than quiet quitting. Give us sandboxes to play!
  • In an average corporation (not talking about sizes here!), there are just a few people working on cutting edge technologies. Sometimes they go beyond the academic state-of-the-art (what is often the situation in semi-conductor industry, for instance). Because they are a minority, they get statistically forgotten by IT as standard users. Needless to say, these are also the people who know what they are doing with a computer. Based on what I said before, you get that we enter an infinite recursion here: you user no know how to use computer, but me user statistical minority, and so on...

The open-source battles till the end of the world

We have found this great startup selling dreams

Non-technical project managers everywhere

Too-much governance and too little governance leading to no governance at all.

+How corporate IT is killing innovation · WallyToolbox.jl

How corporate IT is killing innovation

For the past decade I have constantly worked with innovation. That's all I know to do with my life. A day without creating is mostly not worth it. Whether it was in academic or corporate settings, I generally got along with teammates and most stakeholders. But no matter where I go I am followed by a constant ghost , the enemy, the corporate IT. I known I don't fit in, I don't belong in the system, I don't fall into the listen-pray-obey-loop-herd, but that is not the reason why I should be guilty of how bad my interactions with corporate IT (not specifically with IT people, I have met very nice people there) have been for more than one decade.

So far, my words might seem harsh and full of anger to the uneager reader. As I scientist I am prompt to expect hateful reactions from the conservatives and religiously aligned corporate people. But as a scientist I shall recur to the reason and argumentation to expose, solely based on observations, my conclusions on the matter. Time to end the vague wording, let's get to the anecdotes.

Installing a compiler, but you no admin

Early in my PhD days I was told I should model some chemically reacting flows to better understand some processes I was studying. As usual, you start that by a literature review cause you are told so or because you are not dumb enough to think you can reinvent the wheel.

After some reading I realized there was nothing to add to that field under my research scope and it was time to use the numbers that were already available in the literature. Yay, time to code! Well, not so fun... In fact, that nothing-moment is when PhD students realize how humble they have to be in face of existing knowledge. It is also often the point where the cracks appear in the system, the small spots where they can make a small contribution.

My lab was a standard Windows-only environment, although later on I discovered that there were more exceptions than rules in the system. I was actually in the wrong side of the building, most students in the other wing had everything I dreamt of. Since the libraries I was aiming to use at the time were not portable from Nix, I had to start my crusade to show IT I was not the standard user and that I was worth Baloo048 (Baloo048 was the name of my workstation once I got authorized a CentOS 5 system)!

Security above obscurity (and overall)

Here I am not making a reference to security through obscurity and I will actually cite several unrelated events that I have seen so far.

IT has always been considered guilty of major failures in security systems. Nonetheless, trespassers often get inside by errors committed by standard network users. Keep that repeating for more than 40 years and you've got what we have today: an overprotective IT mother. – You don't know how to use a computer! You are an irresponsible m-word! – And the list goes on... so a monster was born. All because of repeated wrong root-cause analysis.

With the rise of social networks, machine learning, and everything that dominated the web since 2010, IT gained power in major corporations and in some situations their choices come above technical or commercial ones. Naturally, the overly repressed IT people raised their concerns about every living and digital thing and started locking all paths to standard users.

What companies forgot is how that building walls also block your views to the outside world. Innovation has always been a matter of who copies the best part of what others are doing. Mankind never created a single thing, we copied from nature, and then, putting bricks together, we copied from one another with varying levels of complexity. That to say, every single patent is somehow dishonest. But we keep protecting them, they are the status quo basis of competition. That's the case probably because we are less intelligent than we think we are.

The moment IT obfuscates the view of technical people, the copy-edit-paste cycle is broken: innovation is, at least, strongly hurt. And there is no lack of examples of how this actually happens.

I will stick to what concerns my technical field of expertise.

  • In numerical simulation it is fundamental to sandbox everything, especially systems. Creativity comes with destruction, it's always oblivion. Numerical people like hard access to perform their best (and sometimes even to perform at all). Working with containers or, even worse, the cloud, are nightmarish. In our world a sandbox is nothing more than a good old workstation without company network access. We make magic there. Every single time an engineer has to beat themselves to have the right to work their best, they get damaged. Some withstand for years, some simply get aligned, what is even worse than quiet quitting. Give us sandboxes to play!
  • In an average corporation (not talking about sizes here!), there are just a few people working on cutting edge technologies. Sometimes they go beyond the academic state-of-the-art (what is often the situation in semi-conductor industry, for instance). Because they are a minority, they get statistically forgotten by IT as standard users. Needless to say, these are also the people who know what they are doing with a computer. Based on what I said before, you get that we enter an infinite recursion here: you user no know how to use computer, but me user statistical minority, and so on...

The open-source battles till the end of the world

We have found this great startup selling dreams

Non-technical project managers everywhere

Too-much governance and too little governance leading to no governance at all.

diff --git a/dev/Articles/Maybe-I-f-ed-my-career/index.html b/dev/Articles/Maybe-I-f-ed-my-career/index.html index 2de5d4c9c..ac76ebcd7 100644 --- a/dev/Articles/Maybe-I-f-ed-my-career/index.html +++ b/dev/Articles/Maybe-I-f-ed-my-career/index.html @@ -1,2 +1,2 @@ -Maybe I f********** my career... · WallyToolbox.jl

Maybe I f********** my career...

…and it is not all on me, just part of it.

In this essay I will tentatively tell in some sort of autobiography how I messed up with my career and what may be the way out of this mess. I won't explore any details or feelings, but stick to facts, my observations at each of the episodes, and my takes about the happenings.


Early life

It has never been questioned in my circles that I was some sort of gifted child. But certainly, I was not what you first think about when hearing about someone gifted. I could read and write in some rudimentary ways before age 4 — and that led me to opening Pandora’s box. By age 6 I had read most of the encyclopedias we had at home, my main interests being history, art, and engineering; at that time, I was already able to discuss with adults on these topics and most kids were embarrassingly boring to me. It was reading and reading and reading that time was spent.

Numismatics came next and, in a few years, I was not just a kid collecting lost coins around the house, but the one with in depth knowledge of the characters being depicted, historical events, and an actual set of collectible coins; needless to say, that really developed my interest in metals. Ah, and before I forget, at the same time I was also really into rocks and geology, always digging around looking for gems, which at the time I was often able to identify, and when stuck I would recur to the local natural history museum geologist for help. I know I should have been running and playing around by that time, but it simply was not my thing, so I ended up not developing good motor skills by then.

For the next ten years or so I barely had to study for school because I had self-taught me everything that was in the curriculum, so I could spend my time learning new subjects that had come to my attention, especially university level ones. Because of that only on a few occasions I was the first of my class since I never reviewed, but most of the time the second or third at most. The profile of the ones on the top was really the dedicated ones, those who were seeing the topics for the first time and delving in the subjects for the exams. My view on then was of demise cause most of the time it was clear their actual grasp of what was behind things.

By age 11 my interest in sports grew; I had always been fond of adventure and then I started mountain biking. That was the first time I really socialized and by age 16 you couldn’t tell anymore that I had been that weird child — finally I was a normal person. Or not. Because of those highly cultural beginnings you could tell some features wouldn’t really let me fit in with my pairs. So finally, the last year before college I got back to my roots and studied everything once again, but 16h+ per day, no eating, no sleeping — sometimes cheap vodka — and managed to get accepted in first place at some major universities around my place, but that is the matter of the next paragraph.


At college

Tired. That’s how you describe my early days at college. Hormones blowing up and tiredness. So many years reading and reading got me tired. I essentially had learned what I thought was enough to already get my diploma and start working or something like that. First semester was not great intellectually speaking but after I few months I put my head in place and started working hard. Got a job in a lab. Some of the experimental work I was carrying used to be very boring and take many hours. For safety reasons you had to stay there to make sure everything was fine. But you know me, any free time and I will start reading. By the end of the first year, I had finished studying — exercises included — most of the books I needed to read for the next two years or so, and that didn’t prevent me of partying a lot.

Everything seems fine so far but that is not actually true. While I was the highest performing student of my class and got moderately social, this was the turning point where performance started to mess things up. I was following my undergraduate studies in Materials Engineering with focus in Mechanics — in Brazil you get Materials Engineering to be associated to Mechanical or Chemical Engineering, and your diploma is not actually in Materials Engineering in the end — but since most of Materials Science topics are about having a good memory and knowing how analyse and to put things together to get things done, I diverged into the neighboring engineering schools and sometimes in the Physics department.

I was often taking classes at other undergraduate courses and when not available, I would take lecture notes and study them anyway. I managed to become better at plain Mechanical Engineering than I was in pure Materials Engineering and sometimes taught subjects to friends following that course. Here we notice that I completely changed subjects since I was a child: from history and art, now I was into applied mathematics and thermal engines. Things always had a limit to me, but not because of difficulty; once I have a feeling of being able to go beyond in a subject by myself, I also start to get bored. The grasp of the generality of a subject fulfils my curiosity.

By the fifth and last year I was considering a PhD in Germany but finally I decided to stay a bit more around. In fact, I was no longer feeling like I wanted to stay in academia and got a particularly respectable job offer that I sticked with; more on that next.


First job

By age 22 I was an engineer; later than I expected but I didn’t tell you that my parents refused to let me skip a few years at school as some of my tutors proposed at some point. This could have been much earlier but then I would be jobless or following a PhD in the Humanities. That was not the case, before even getting my diploma I already had the job offer and the transition from intern to actual engineer happened overnight as I got my diplomas. In fact, nothing changed — except that they started paying me a decent salary quite above the average at that time.

So, I started working in a not that technical position. At first, I was writing technical specifications for materials and mechanical construction of metallic parts, but soon someone realized that my strongest feature was my negotiation skills and from that day I was often defending deviations from technical requirements with the customers and proposing technical alternatives. It was a very transversal job with interaction with all levels from the shop floor to the high management. It didn’t take long for me to start living in an airplane going to technical audits all around and to participate at the defining stages of scope of commercial supply in large projects. By this time, my hobby was learning a little bit of every language I was able to, and I did that with religious fervor.

So far you may think all this took me at least 5 years to accomplish, but in fact it lasted only 1 year and 10 months. The main reason I excelled at this position was that whole random background I carried with strong scientific culture, good history knowledge, and on general matters. It became natural to me to start a conversation with anyone and later develop links that allowed huge gains in negotiation. My career was on track, and it seemed very promising. But I told you already that once I reached a certain level of generality, I need a change.

At some point I found myself there and had the urge to reach out a previous internship advisor in France. When I first worked in his team, I didn’t do a fantastic job as I try to most of the time, but anyways he had good views of me and offered me a PhD. In a few months it was me again in a plane flying once again to France. What made me interested in the PhD offer he proposed me was the fact that I already knew most of the literature on the subject, so that would allow me to get back and finish some open ends from my undergraduate studies. I didn't expect to make I great thesis, just to follow the rules and get a PhD. What matters is what you learn on your free time, that's what life taught me so far.


Graduate years

There I would finally go deeper in fluid dynamics and reacting flows, two subjects that always were among my favorite ones. Also, in the part of the thesis related to materials, I would be able be learn more about diffusion and some microscopy techniques of my interest. So, hands to work, I could already code in C++ by that time and started with that to perform my numerical analyses. Soon I was coding in several programming languages and grasped the use of many scientific software, what a delight! The intellectual and social environment was interesting and whenever I got bored with my own matters, I went see some friends in the building and see how I could help them. It was the first time in my life that I felt in a place where you could develop interesting ideas and talk to people who would understand you. But academia can also be harsh, especially when you graduate — the competition among researchers in some cases reach an extremally toxic level, so once I finished, I didn’t even try to get a post-doc and ended up in industry again, but this time in a research center.

If there is one thing you learn during a PhD is the sense of generality; not that I needed that, so far you understand that this is my main characteristic — I was just looking for a piece of paper stating that I had accomplished that. It is not difficult for a PhD to identify another without even asking, you notice in the way people speak and the things they are interested at. In my whole life I just met three people who didn’t graduate that behaved that way and I find that amazing — and two of them are a couple, what is even more mind blowing. So, when I started my new job, I was looking to interact with people matching this level of general views. The problem is that industry hurts; some people get greedy over the years; some completely loose interest; but a few stick to their core. Nonetheless, I managed to identify these last group and for a few years I was productive.


Back in industry

Yes, once again I gained lots of new skills. With the scientific computing background, I built over the years it was easy for me to start in machine learning. Yes, I survived the boom of machine learning in 2018 and conducted many proof-of-concept projects in the field but managed to stay linked to my core engineering skills. I also contributed to vulgarizing the use of some open-source software people were not using yet. Ever since the start of my PhD I lost contact with supply chain and quality related people, but always tried to keep using to a lesser level what I learned there and applied that to my project management. On the technical side, most of my work was in some sort related to skills — but not subjects — I developed during my PhD. This time and only this time it was not my loss of interest in a subject that messed things, but the feeling that some people were working in closed silos and only for self-marketeering themselves. I don’t know how this could be a reality in a private company — you simply get rid of people not willing to play the game, unless you are in France, obviously. The overall environment was technically challenging, and you could have nice discussions and growth with some colleagues, but not everyone was willing to collaborate.

After trying a lot to overcome some barriers and break some silos, by a miracle I got a phone call with a job offer elsewhere — my current position. There were quite a few incoherencies in what they proposed me but that was because my field was something new to them, so I was quite sure those points could be fixed; I promptly accepted the offer without much thinking. I packed my stuff and in one month there I was, full of motivation. The team was nice and welcoming and the company much smaller, exactly what I thought I was looking for. The ground was lacking foundations, so I started developing some basic tools to build what in a few years I expected to be a project portfolio. Also, there was the possibility to in about two years have my own team of numerical guys, what was motivating.

In practice things weren’t that smooth. First, they didn’t research what was required to get some numerical work done; you need expensive computers. Then comes the fact that you get people specialized in fields of applied mathematics — there is no such 1990s Discovery Channel simulation generalist. If you read attentively so far, you noticed that in my previous job I finally managed to stick to a subject, or at least a small family of related subjects. Now I started to get people asking me if I could run some molecular dynamics in the same simulation of macroscale transport or predict the age of their grandmother: it was driving me nuts. For a while I really thought they would fire me without even knowing why. In a few months things settled down a bit and requests became more consistent with my skills. Some people understood that fluid dynamics applied to materials processing is still a research field and many things that may seem trivial to the layman are quite challenging. Others are still annoying about the limitations of what I can offer today.

Since I was the first numerical person in the company I had to fight battles against an incompetent IT with senseless rules; then I confirmed the company was really capital-driven only, and to my disappointment I was feeling mismanaged. During this time things went awry because I started suffering from impostor syndrome — sorry guys, I can’t make DFT calculations coupled to CFD — and entered a bottomless pit of trying to learn everything else again. To add to my disappointment and endless lies that have been told to me, instead of getting a team in the middle term, I will get a new colleague to work with me. All the work towards really understanding my field and its people were thrown to the rubbish by people who are not even close to be qualified to manage me: experience do not mean capacity, a mistake people from past generations often do. I started becoming grumpier and grumpier, face severe lack of concentration, it became impossible to sleep, and intellectual loneliness is really killing me. These people were not ready for me, not the inverse, which is clear now.


What's next?

So, what may be the way out of this mess? I have no clue! 

My only certainty right now is that I am quitting in the extremely short term; I no longer try to hide my urge of change.

The branching of my knowledge made me useless to the standard market and I am still too young to occupy the positions I have developed the skills for because it is not socially acceptable.

Current job descriptions require sharp skills, but during the past three years the intellectually poor environment I am at destroyed anything I had left to offer.

I am now incapacitated to get back to jobs like my first one where I outperformed because of my social skills were ravaged during the past months.

Academia would be a solution but since I didn’t publish enough while in nor chained PhD with a post-doc, it is highly improbable I would get in again.

I will become a farmer, or what else?

+Maybe I f********** my career... · WallyToolbox.jl

Maybe I f********** my career...

…and it is not all on me, just part of it.

In this essay I will tentatively tell in some sort of autobiography how I messed up with my career and what may be the way out of this mess. I won't explore any details or feelings, but stick to facts, my observations at each of the episodes, and my takes about the happenings.


Early life

It has never been questioned in my circles that I was some sort of gifted child. But certainly, I was not what you first think about when hearing about someone gifted. I could read and write in some rudimentary ways before age 4 — and that led me to opening Pandora’s box. By age 6 I had read most of the encyclopedias we had at home, my main interests being history, art, and engineering; at that time, I was already able to discuss with adults on these topics and most kids were embarrassingly boring to me. It was reading and reading and reading that time was spent.

Numismatics came next and, in a few years, I was not just a kid collecting lost coins around the house, but the one with in depth knowledge of the characters being depicted, historical events, and an actual set of collectible coins; needless to say, that really developed my interest in metals. Ah, and before I forget, at the same time I was also really into rocks and geology, always digging around looking for gems, which at the time I was often able to identify, and when stuck I would recur to the local natural history museum geologist for help. I know I should have been running and playing around by that time, but it simply was not my thing, so I ended up not developing good motor skills by then.

For the next ten years or so I barely had to study for school because I had self-taught me everything that was in the curriculum, so I could spend my time learning new subjects that had come to my attention, especially university level ones. Because of that only on a few occasions I was the first of my class since I never reviewed, but most of the time the second or third at most. The profile of the ones on the top was really the dedicated ones, those who were seeing the topics for the first time and delving in the subjects for the exams. My view on then was of demise cause most of the time it was clear their actual grasp of what was behind things.

By age 11 my interest in sports grew; I had always been fond of adventure and then I started mountain biking. That was the first time I really socialized and by age 16 you couldn’t tell anymore that I had been that weird child — finally I was a normal person. Or not. Because of those highly cultural beginnings you could tell some features wouldn’t really let me fit in with my pairs. So finally, the last year before college I got back to my roots and studied everything once again, but 16h+ per day, no eating, no sleeping — sometimes cheap vodka — and managed to get accepted in first place at some major universities around my place, but that is the matter of the next paragraph.


At college

Tired. That’s how you describe my early days at college. Hormones blowing up and tiredness. So many years reading and reading got me tired. I essentially had learned what I thought was enough to already get my diploma and start working or something like that. First semester was not great intellectually speaking but after I few months I put my head in place and started working hard. Got a job in a lab. Some of the experimental work I was carrying used to be very boring and take many hours. For safety reasons you had to stay there to make sure everything was fine. But you know me, any free time and I will start reading. By the end of the first year, I had finished studying — exercises included — most of the books I needed to read for the next two years or so, and that didn’t prevent me of partying a lot.

Everything seems fine so far but that is not actually true. While I was the highest performing student of my class and got moderately social, this was the turning point where performance started to mess things up. I was following my undergraduate studies in Materials Engineering with focus in Mechanics — in Brazil you get Materials Engineering to be associated to Mechanical or Chemical Engineering, and your diploma is not actually in Materials Engineering in the end — but since most of Materials Science topics are about having a good memory and knowing how analyse and to put things together to get things done, I diverged into the neighboring engineering schools and sometimes in the Physics department.

I was often taking classes at other undergraduate courses and when not available, I would take lecture notes and study them anyway. I managed to become better at plain Mechanical Engineering than I was in pure Materials Engineering and sometimes taught subjects to friends following that course. Here we notice that I completely changed subjects since I was a child: from history and art, now I was into applied mathematics and thermal engines. Things always had a limit to me, but not because of difficulty; once I have a feeling of being able to go beyond in a subject by myself, I also start to get bored. The grasp of the generality of a subject fulfils my curiosity.

By the fifth and last year I was considering a PhD in Germany but finally I decided to stay a bit more around. In fact, I was no longer feeling like I wanted to stay in academia and got a particularly respectable job offer that I sticked with; more on that next.


First job

By age 22 I was an engineer; later than I expected but I didn’t tell you that my parents refused to let me skip a few years at school as some of my tutors proposed at some point. This could have been much earlier but then I would be jobless or following a PhD in the Humanities. That was not the case, before even getting my diploma I already had the job offer and the transition from intern to actual engineer happened overnight as I got my diplomas. In fact, nothing changed — except that they started paying me a decent salary quite above the average at that time.

So, I started working in a not that technical position. At first, I was writing technical specifications for materials and mechanical construction of metallic parts, but soon someone realized that my strongest feature was my negotiation skills and from that day I was often defending deviations from technical requirements with the customers and proposing technical alternatives. It was a very transversal job with interaction with all levels from the shop floor to the high management. It didn’t take long for me to start living in an airplane going to technical audits all around and to participate at the defining stages of scope of commercial supply in large projects. By this time, my hobby was learning a little bit of every language I was able to, and I did that with religious fervor.

So far you may think all this took me at least 5 years to accomplish, but in fact it lasted only 1 year and 10 months. The main reason I excelled at this position was that whole random background I carried with strong scientific culture, good history knowledge, and on general matters. It became natural to me to start a conversation with anyone and later develop links that allowed huge gains in negotiation. My career was on track, and it seemed very promising. But I told you already that once I reached a certain level of generality, I need a change.

At some point I found myself there and had the urge to reach out a previous internship advisor in France. When I first worked in his team, I didn’t do a fantastic job as I try to most of the time, but anyways he had good views of me and offered me a PhD. In a few months it was me again in a plane flying once again to France. What made me interested in the PhD offer he proposed me was the fact that I already knew most of the literature on the subject, so that would allow me to get back and finish some open ends from my undergraduate studies. I didn't expect to make I great thesis, just to follow the rules and get a PhD. What matters is what you learn on your free time, that's what life taught me so far.


Graduate years

There I would finally go deeper in fluid dynamics and reacting flows, two subjects that always were among my favorite ones. Also, in the part of the thesis related to materials, I would be able be learn more about diffusion and some microscopy techniques of my interest. So, hands to work, I could already code in C++ by that time and started with that to perform my numerical analyses. Soon I was coding in several programming languages and grasped the use of many scientific software, what a delight! The intellectual and social environment was interesting and whenever I got bored with my own matters, I went see some friends in the building and see how I could help them. It was the first time in my life that I felt in a place where you could develop interesting ideas and talk to people who would understand you. But academia can also be harsh, especially when you graduate — the competition among researchers in some cases reach an extremally toxic level, so once I finished, I didn’t even try to get a post-doc and ended up in industry again, but this time in a research center.

If there is one thing you learn during a PhD is the sense of generality; not that I needed that, so far you understand that this is my main characteristic — I was just looking for a piece of paper stating that I had accomplished that. It is not difficult for a PhD to identify another without even asking, you notice in the way people speak and the things they are interested at. In my whole life I just met three people who didn’t graduate that behaved that way and I find that amazing — and two of them are a couple, what is even more mind blowing. So, when I started my new job, I was looking to interact with people matching this level of general views. The problem is that industry hurts; some people get greedy over the years; some completely loose interest; but a few stick to their core. Nonetheless, I managed to identify these last group and for a few years I was productive.


Back in industry

Yes, once again I gained lots of new skills. With the scientific computing background, I built over the years it was easy for me to start in machine learning. Yes, I survived the boom of machine learning in 2018 and conducted many proof-of-concept projects in the field but managed to stay linked to my core engineering skills. I also contributed to vulgarizing the use of some open-source software people were not using yet. Ever since the start of my PhD I lost contact with supply chain and quality related people, but always tried to keep using to a lesser level what I learned there and applied that to my project management. On the technical side, most of my work was in some sort related to skills — but not subjects — I developed during my PhD. This time and only this time it was not my loss of interest in a subject that messed things, but the feeling that some people were working in closed silos and only for self-marketeering themselves. I don’t know how this could be a reality in a private company — you simply get rid of people not willing to play the game, unless you are in France, obviously. The overall environment was technically challenging, and you could have nice discussions and growth with some colleagues, but not everyone was willing to collaborate.

After trying a lot to overcome some barriers and break some silos, by a miracle I got a phone call with a job offer elsewhere — my current position. There were quite a few incoherencies in what they proposed me but that was because my field was something new to them, so I was quite sure those points could be fixed; I promptly accepted the offer without much thinking. I packed my stuff and in one month there I was, full of motivation. The team was nice and welcoming and the company much smaller, exactly what I thought I was looking for. The ground was lacking foundations, so I started developing some basic tools to build what in a few years I expected to be a project portfolio. Also, there was the possibility to in about two years have my own team of numerical guys, what was motivating.

In practice things weren’t that smooth. First, they didn’t research what was required to get some numerical work done; you need expensive computers. Then comes the fact that you get people specialized in fields of applied mathematics — there is no such 1990s Discovery Channel simulation generalist. If you read attentively so far, you noticed that in my previous job I finally managed to stick to a subject, or at least a small family of related subjects. Now I started to get people asking me if I could run some molecular dynamics in the same simulation of macroscale transport or predict the age of their grandmother: it was driving me nuts. For a while I really thought they would fire me without even knowing why. In a few months things settled down a bit and requests became more consistent with my skills. Some people understood that fluid dynamics applied to materials processing is still a research field and many things that may seem trivial to the layman are quite challenging. Others are still annoying about the limitations of what I can offer today.

Since I was the first numerical person in the company I had to fight battles against an incompetent IT with senseless rules; then I confirmed the company was really capital-driven only, and to my disappointment I was feeling mismanaged. During this time things went awry because I started suffering from impostor syndrome — sorry guys, I can’t make DFT calculations coupled to CFD — and entered a bottomless pit of trying to learn everything else again. To add to my disappointment and endless lies that have been told to me, instead of getting a team in the middle term, I will get a new colleague to work with me. All the work towards really understanding my field and its people were thrown to the rubbish by people who are not even close to be qualified to manage me: experience do not mean capacity, a mistake people from past generations often do. I started becoming grumpier and grumpier, face severe lack of concentration, it became impossible to sleep, and intellectual loneliness is really killing me. These people were not ready for me, not the inverse, which is clear now.


What's next?

So, what may be the way out of this mess? I have no clue! 

My only certainty right now is that I am quitting in the extremely short term; I no longer try to hide my urge of change.

The branching of my knowledge made me useless to the standard market and I am still too young to occupy the positions I have developed the skills for because it is not socially acceptable.

Current job descriptions require sharp skills, but during the past three years the intellectually poor environment I am at destroyed anything I had left to offer.

I am now incapacitated to get back to jobs like my first one where I outperformed because of my social skills were ravaged during the past months.

Academia would be a solution but since I didn’t publish enough while in nor chained PhD with a post-doc, it is highly improbable I would get in again.

I will become a farmer, or what else?

diff --git a/dev/Computing/01-Scientific-Computing/index.html b/dev/Computing/01-Scientific-Computing/index.html index 18fbeb1a5..802c0f043 100644 --- a/dev/Computing/01-Scientific-Computing/index.html +++ b/dev/Computing/01-Scientific-Computing/index.html @@ -1,2 +1,2 @@ -Scientific Computing · WallyToolbox.jl

Scientific Computing

Notes related to my learning and teaching interests in several fields related to scientific computing (mostly applied mathematics and machine learning) and related applications. This home page is the entry point and those interested in more content and interesting links can use the sidebar with an index to the materials.

It can also be used as a general guide for introducing scientific computing as it tries to introduce the minimal skill set any scientific computing engineer or scientist should have:

  • Version control comes first, everything else is worthless without it, currently that means Git.
  • Next comes software documentation with Doxygen, Sphinx, and/or Documenter.jl.
  • A low(er) level programming language among C, C++, and Fortran, preferably all of them.
  • Scripting languages, as of 2024, Python is mandatory, Julia highly recommended.
  • Basic machine learning in one of the above scripts, everything is ML these days.
  • Shell automation, basis of both Bash/other UNIX shell and PowerShell are required.
  • Typesetting equations reports and presentations (beamer) in $\LaTeX$.
  • Domain specific skills related to the field of study (CFD, DFT, MD, ML, ...).

Some technologies have been mainstream or important in the past, but nowadays some of them have already died or are becoming too niche to be put in such a list. That is the case of SVN for version control. As for programming languages in science, that is the case of matlabish (MATLAB, Octave, Scilab) environments, which are still used by controls and automation people, but are mostly incompatible with good software practices and should be discouraged.

It is also worth getting familiar with high-performance computing (HPC); in the Top 500 page you can get to know the most powerful computers on Earth. The specification benchmarking page allows for the check of hardware specification, what is interesting when preparing investment in a computing structure. Lastly, when working in multi-user systems it is worth knowing about job management systems such as Slurm.

As a last word, I would like to remember that it is humanly impossible to master everything at once; even after more than 10 years in the field as of today I only have a grasp in the tools I do not use everyday. Software and methods evolve, and unless you keep using a specific tool you simply cannot afford to keep up to date with it. That should not be a roadblock for a scientist in the long term. As you get used to scientific software, getting back to a good level of some tool you used in the past is quick (but not extremely fast in some cases) and learning new tools for which you already know the science behind is trivial. Even exploring new fields become easy in some cases.

+Scientific Computing · WallyToolbox.jl

Scientific Computing

Notes related to my learning and teaching interests in several fields related to scientific computing (mostly applied mathematics and machine learning) and related applications. This home page is the entry point and those interested in more content and interesting links can use the sidebar with an index to the materials.

It can also be used as a general guide for introducing scientific computing as it tries to introduce the minimal skill set any scientific computing engineer or scientist should have:

  • Version control comes first, everything else is worthless without it, currently that means Git.
  • Next comes software documentation with Doxygen, Sphinx, and/or Documenter.jl.
  • A low(er) level programming language among C, C++, and Fortran, preferably all of them.
  • Scripting languages, as of 2024, Python is mandatory, Julia highly recommended.
  • Basic machine learning in one of the above scripts, everything is ML these days.
  • Shell automation, basis of both Bash/other UNIX shell and PowerShell are required.
  • Typesetting equations reports and presentations (beamer) in $\LaTeX$.
  • Domain specific skills related to the field of study (CFD, DFT, MD, ML, ...).

Some technologies have been mainstream or important in the past, but nowadays some of them have already died or are becoming too niche to be put in such a list. That is the case of SVN for version control. As for programming languages in science, that is the case of matlabish (MATLAB, Octave, Scilab) environments, which are still used by controls and automation people, but are mostly incompatible with good software practices and should be discouraged.

It is also worth getting familiar with high-performance computing (HPC); in the Top 500 page you can get to know the most powerful computers on Earth. The specification benchmarking page allows for the check of hardware specification, what is interesting when preparing investment in a computing structure. Lastly, when working in multi-user systems it is worth knowing about job management systems such as Slurm.

As a last word, I would like to remember that it is humanly impossible to master everything at once; even after more than 10 years in the field as of today I only have a grasp in the tools I do not use everyday. Software and methods evolve, and unless you keep using a specific tool you simply cannot afford to keep up to date with it. That should not be a roadblock for a scientist in the long term. As you get used to scientific software, getting back to a good level of some tool you used in the past is quick (but not extremely fast in some cases) and learning new tools for which you already know the science behind is trivial. Even exploring new fields become easy in some cases.

diff --git a/dev/Computing/02-General-Computing-Skills/index.html b/dev/Computing/02-General-Computing-Skills/index.html index d8bf78a81..ed7ebfc9a 100644 --- a/dev/Computing/02-General-Computing-Skills/index.html +++ b/dev/Computing/02-General-Computing-Skills/index.html @@ -1,5 +1,5 @@ -General computing skills · WallyToolbox.jl

General computing skills


Git version control

Version control in Windows

  • TortoiseGIT: for Windows users, this applications add the possibility of managing version control and other features directly from the file explorer.

Adding submodules

Generally speaking adding a submodule to a repository should be a simple matter of:

git submodule add https://<path>/<to>/<repository>

Nonetheless this might fail, especially for large sized repositories; I faced this issue which I tried to fix by increasing buffer size as reported in the link. This solved the issue but led me to another problem which could be solved by degrading HTTP protocol.


Working on Windows

Creating a portable launcher

A simple way to create a portable launcher requiring to source extra variables is by writing a simple batch script exporting or calling another script with the definitions:

@echo off
+General computing skills · WallyToolbox.jl

General computing skills


Git version control

Version control in Windows

  • TortoiseGIT: for Windows users, this applications add the possibility of managing version control and other features directly from the file explorer.

Adding submodules

Generally speaking adding a submodule to a repository should be a simple matter of:

git submodule add https://<path>/<to>/<repository>

Nonetheless this might fail, especially for large sized repositories; I faced this issue which I tried to fix by increasing buffer size as reported in the link. This solved the issue but led me to another problem which could be solved by degrading HTTP protocol.


Working on Windows

Creating a portable launcher

A simple way to create a portable launcher requiring to source extra variables is by writing a simple batch script exporting or calling another script with the definitions:

@echo off
 
 @REM Add variables to be sourced here such as
 @REM set PATH="/path/to/some/dir";%PATH%
@@ -13,4 +13,4 @@
 sudo mkdir /mnt/z
 
 # Mount the network drive in WSL:
-sudo mount -t drvfs Z: /mnt/z

Regular expressions

Regular expressions (or simply regex) processing is a must-have skill for anyone doing scientific computing. Most programs produce results or logs in plain text and do not support specific data extraction from those. There regex becomes your best friend. Unfortunately during the years many flavors of regex appeared, each claiming to offer advantages or to be more formal than its predecessors. Due to this, learning regex is often language-specific (most of the time you create and process regex from your favorite language) and sometimes even package-specific. Needless to say, regex may be more difficult to master than assembly programming.

  • Useful web applications can be found in regex101 and regexr.

  • Match all characters between two strings with lookbehind and look ahead patterns. Notice that this will require the enclosing strings to be fixed (at least under PCRE). For processing WallyTutor.jl documentation I have used a more generic approach but less general than what is proposed here.

  • Match any character across multiple lines with (.|\n)*.

  • Currently joining regexes in Julia might be tricky (because of escaping characters); a solution is proposed here and seems to work just fine with minimal extra coding.


$\LaTeX$

Math typesetting with $\LaTeX$

  • For integrals to display the same size as fractions expanded with \dfrac, place a \displaystyle in front of the \int command.

Code typesetting with $\LaTeX$

  • For some reason minted blocks \begin{minted}...\end{minted} have problems to render in Beamer (something related to multilevel macros). I managed to insert code blocks with \inputminted as reported here.

  • Beamer have some issues with footnotes, especially when use column environments; a quick fix for this is through \footnotemark and \footnotetext[<number>]{<text>} as described here. Notice that \footnotemark automatically generates the counter for use as <number> in \footnotetext.

  • For setting a background watermark in Beamer one can use package background and display it using a Beamer template as described here.

MiKTeX

LaTeX Workshop

+sudo mount -t drvfs Z: /mnt/z

Regular expressions

Regular expressions (or simply regex) processing is a must-have skill for anyone doing scientific computing. Most programs produce results or logs in plain text and do not support specific data extraction from those. There regex becomes your best friend. Unfortunately during the years many flavors of regex appeared, each claiming to offer advantages or to be more formal than its predecessors. Due to this, learning regex is often language-specific (most of the time you create and process regex from your favorite language) and sometimes even package-specific. Needless to say, regex may be more difficult to master than assembly programming.

  • Useful web applications can be found in regex101 and regexr.

  • Match all characters between two strings with lookbehind and look ahead patterns. Notice that this will require the enclosing strings to be fixed (at least under PCRE). For processing WallyTutor.jl documentation I have used a more generic approach but less general than what is proposed here.

  • Match any character across multiple lines with (.|\n)*.

  • Currently joining regexes in Julia might be tricky (because of escaping characters); a solution is proposed here and seems to work just fine with minimal extra coding.


$\LaTeX$

Math typesetting with $\LaTeX$

  • For integrals to display the same size as fractions expanded with \dfrac, place a \displaystyle in front of the \int command.

Code typesetting with $\LaTeX$

  • For some reason minted blocks \begin{minted}...\end{minted} have problems to render in Beamer (something related to multilevel macros). I managed to insert code blocks with \inputminted as reported here.

  • Beamer have some issues with footnotes, especially when use column environments; a quick fix for this is through \footnotemark and \footnotetext[<number>]{<text>} as described here. Notice that \footnotemark automatically generates the counter for use as <number> in \footnotetext.

  • For setting a background watermark in Beamer one can use package background and display it using a Beamer template as described here.

MiKTeX

LaTeX Workshop

diff --git a/dev/Computing/03-Programming-Languages/index.html b/dev/Computing/03-Programming-Languages/index.html index 74d608b7e..1ae7bef3d 100644 --- a/dev/Computing/03-Programming-Languages/index.html +++ b/dev/Computing/03-Programming-Languages/index.html @@ -1,2 +1,2 @@ -Programming · WallyToolbox.jl

Programming

Those new to programming can find a quite interesting environment at Exercism.

C++

Cuda

Fortran

Haskell

Lisp

Octave

OpenCL

Pascal

Python

General stuff:

Some (yet crude) visual programming in Python:

All you need is a package:

  • casadi: Optimal control and MPC.
  • mip: Mixed-integer linear programming.

Rust

Rust community often organizes books on the main topics regarding the language:

Some resources for learning Rust (start with rustlings):

Useful links for working with cargo:

Useful links for doing numerical stuff in Rust:

Scilab

Other materials

+Programming · WallyToolbox.jl

Programming

Those new to programming can find a quite interesting environment at Exercism.

C++

Cuda

Fortran

Haskell

Lisp

Octave

OpenCL

Pascal

Python

General stuff:

Some (yet crude) visual programming in Python:

All you need is a package:

  • casadi: Optimal control and MPC.
  • mip: Mixed-integer linear programming.

Rust

Rust community often organizes books on the main topics regarding the language:

Some resources for learning Rust (start with rustlings):

Useful links for working with cargo:

Useful links for doing numerical stuff in Rust:

Scilab

Other materials

diff --git a/dev/Computing/04-Geometry-and-Preprocessing/index.html b/dev/Computing/04-Geometry-and-Preprocessing/index.html index 7de4f858c..1f4b8d2f1 100644 --- a/dev/Computing/04-Geometry-and-Preprocessing/index.html +++ b/dev/Computing/04-Geometry-and-Preprocessing/index.html @@ -1,2 +1,2 @@ -Geometry and Preprocessing · WallyToolbox.jl

Geometry and Preprocessing

Computer assisted design

FreeCAD

Salome

Rotating reactor

In this tutorial we illustrate how to produce a STL surface for use with DEM simulation or meshing with other tools (such as snappyHexMesh).

The first step in Salome Shaper to create a geometry is to add a part using the button indicated below:

00-create-part.png

To add a sketch, select the created part on the object tree and click on button Sketch:

01-add-sketch-to-part.png

Then select the sketching plane and set plane view to start drawing:

02-select-set-plane-view.png

Reactor body will be a cylinder with lifters. Here we start by drawing a circle for later extruding it. It is important to snap the center of the cylinder to the origin of coordinate systems and Salome will handle the constraint automatically.

03-start-sketching-part.png

Using the radius tool you can now constraint the size of shape. Notice that this could also employ symbolic values declarer in the dedicated manager.

04-add-geometrical-constraints.png

Using the line tool we can draw the lifters profile. Again we can make use of Salome auto-constraning functionality by placing the cursor over the circle before starting the sketch, so that it becomes light blue. By doing this, once we try to set dimensions of the newly drawn lines, their tips will follow along the circle path.

05-draw-with-constraints.png

It is also important to notice that if you draw perfectly vertical or horizontal lines, Salome Shaper will again apply auto-constraints, as depicted below:

06-draw-with-constraints.png

With the horizontal distance tool you can set distances between objects:

07-constrain-other-parts.png

Similarly, you can also set lengths with the adequate tool:

08-add-constraints-till-end.png

Using the trimming tool you can remove segments that are intercepted by points:

09-trim-undesired-lines.png

Once sketch is ready, you can validate to pursue 3D modeling:

10-finish-sketch-clicking-on-V.png

Among the several possible extrusion methods, you can select to extrude only the profile. Do not forget to select the objects, direction and depth to extrude. Using auxiliary lines it is virtually possible to extrude in any direction other than perpendicular to sketch plane.

11-extrude-the-profile-only.png

Here we are ready to go to menu File > Export > To CAD format... and select STL option and the path to the target file. Notice that if the design was composed of several parts, in this step you would need to export them individually by selecting one part at a time.

12-export-to-stl-file.png

Now you have a reactor profile for use in a simulation setup.

Grid generation

gmsh

netgen

tetgen

+Geometry and Preprocessing · WallyToolbox.jl

Geometry and Preprocessing

Computer assisted design

FreeCAD

Salome

Rotating reactor

In this tutorial we illustrate how to produce a STL surface for use with DEM simulation or meshing with other tools (such as snappyHexMesh).

The first step in Salome Shaper to create a geometry is to add a part using the button indicated below:

00-create-part.png

To add a sketch, select the created part on the object tree and click on button Sketch:

01-add-sketch-to-part.png

Then select the sketching plane and set plane view to start drawing:

02-select-set-plane-view.png

Reactor body will be a cylinder with lifters. Here we start by drawing a circle for later extruding it. It is important to snap the center of the cylinder to the origin of coordinate systems and Salome will handle the constraint automatically.

03-start-sketching-part.png

Using the radius tool you can now constraint the size of shape. Notice that this could also employ symbolic values declarer in the dedicated manager.

04-add-geometrical-constraints.png

Using the line tool we can draw the lifters profile. Again we can make use of Salome auto-constraning functionality by placing the cursor over the circle before starting the sketch, so that it becomes light blue. By doing this, once we try to set dimensions of the newly drawn lines, their tips will follow along the circle path.

05-draw-with-constraints.png

It is also important to notice that if you draw perfectly vertical or horizontal lines, Salome Shaper will again apply auto-constraints, as depicted below:

06-draw-with-constraints.png

With the horizontal distance tool you can set distances between objects:

07-constrain-other-parts.png

Similarly, you can also set lengths with the adequate tool:

08-add-constraints-till-end.png

Using the trimming tool you can remove segments that are intercepted by points:

09-trim-undesired-lines.png

Once sketch is ready, you can validate to pursue 3D modeling:

10-finish-sketch-clicking-on-V.png

Among the several possible extrusion methods, you can select to extrude only the profile. Do not forget to select the objects, direction and depth to extrude. Using auxiliary lines it is virtually possible to extrude in any direction other than perpendicular to sketch plane.

11-extrude-the-profile-only.png

Here we are ready to go to menu File > Export > To CAD format... and select STL option and the path to the target file. Notice that if the design was composed of several parts, in this step you would need to export them individually by selecting one part at a time.

12-export-to-stl-file.png

Now you have a reactor profile for use in a simulation setup.

Grid generation

gmsh

netgen

tetgen

diff --git a/dev/Computing/05-Postprocessing/index.html b/dev/Computing/05-Postprocessing/index.html index 8266914b0..df0a6e88b 100644 --- a/dev/Computing/05-Postprocessing/index.html +++ b/dev/Computing/05-Postprocessing/index.html @@ -1,2 +1,2 @@ -Postprocessing · WallyToolbox.jl
+Postprocessing · WallyToolbox.jl
diff --git a/dev/Computing/06-Domain-Specific-Software/index.html b/dev/Computing/06-Domain-Specific-Software/index.html index 79acb609f..f2ec3f84b 100644 --- a/dev/Computing/06-Domain-Specific-Software/index.html +++ b/dev/Computing/06-Domain-Specific-Software/index.html @@ -1,2 +1,2 @@ -Domain specific software · WallyToolbox.jl

Domain specific software

Transport phenomena

The list below provides useful links for learning transport phenomena simulation:

And below you find some supporting tools for setting up a CFD simulation:

The following is a list of water property calculators for use in detailed simulations:

It is also interesting to have access to some combustion-related materials:

SU2

OpenFOAM

OpenFOAM distributions

General purpose, tutorials, and documentation:

External solvers:

Conjugate heat transfer:

Volume of fluid (VoF):

Moving reference frame (MRF):

Reduced order modeling (ROM)

Lattice-Boltzmann method

The following links provide simple implementations to learn DEM development:

Smooth Particle Hydrodynamics


Systems modeling

DWSIM

Generical chemical process simulation software.

Dyssol

Dyssol is process unit operations simulator conceived from granular processes.

Modelica

Modelica is an acausal programming language for systems modeling:


Combustion and kinetics

Cantera

Cantera is the standard package for modeling reacting systems. As it was my main toolkit in the final parts of my PhD and still is a major part of my professional life, I am quite knowledgeable on this software. It can be considered the final replacement of classical Chemkin. I am currently working in a Julia interface to its core library.

Fire Models

OpenSmoke++

  • OpenSmoke++ is a framework for detailed kinetics modeling of large reacting systems. This paper might be of interest: Dalili (2020) - modeling of a single droplet evaporation and combustion.

Mathematical software


Computational thermodynamics


Entering

This section contains other software to check; I don't necessarily know them and as I might them useful or consider the projects abandoned they might be dropped from the list until they find their right place in this file.

+Domain specific software · WallyToolbox.jl

Domain specific software

Transport phenomena

The list below provides useful links for learning transport phenomena simulation:

And below you find some supporting tools for setting up a CFD simulation:

The following is a list of water property calculators for use in detailed simulations:

It is also interesting to have access to some combustion-related materials:

SU2

OpenFOAM

OpenFOAM distributions

General purpose, tutorials, and documentation:

External solvers:

Conjugate heat transfer:

Volume of fluid (VoF):

Moving reference frame (MRF):

Reduced order modeling (ROM)

Lattice-Boltzmann method

The following links provide simple implementations to learn DEM development:

Smooth Particle Hydrodynamics


Systems modeling

DWSIM

Generical chemical process simulation software.

Dyssol

Dyssol is process unit operations simulator conceived from granular processes.

Modelica

Modelica is an acausal programming language for systems modeling:


Combustion and kinetics

Cantera

Cantera is the standard package for modeling reacting systems. As it was my main toolkit in the final parts of my PhD and still is a major part of my professional life, I am quite knowledgeable on this software. It can be considered the final replacement of classical Chemkin. I am currently working in a Julia interface to its core library.

Fire Models

OpenSmoke++

  • OpenSmoke++ is a framework for detailed kinetics modeling of large reacting systems. This paper might be of interest: Dalili (2020) - modeling of a single droplet evaporation and combustion.

Mathematical software


Computational thermodynamics


Entering

This section contains other software to check; I don't necessarily know them and as I might them useful or consider the projects abandoned they might be dropped from the list until they find their right place in this file.

diff --git a/dev/Modules/Cantera/index.html b/dev/Modules/Cantera/index.html index f4501cf02..1ebb7b850 100644 --- a/dev/Modules/Cantera/index.html +++ b/dev/Modules/Cantera/index.html @@ -1,2 +1,2 @@ -Cantera · WallyToolbox.jl

Cantera

This page documents the wrapper written around the C-API of Cantera. The status of development is documented here. Its goal is not to mimic the original API or provide an interface equivalent to the Python package, but something in line with the functioning of the parent toolbox.

Status of Cantera wrapper

This is an experimental interface to Cantera library based on its C-API version 3.0. This interface is at its early days and has developped for Julia >= 1.9.0 under Windows 10/11. When it is stable enough it will be published as a package and tested under other platforms.

API of ct.h

Documentation here.

StatusHeaderFunctionModule
Testedct.hct_appdeleteinlined
Structct.hsoln_newSolutionwrapped
ct.hsoln_newInterfacewaitlist
Testedct.hsoln_delinlined
Testedct.hsoln_nameinlined
Structct.hsoln_thermoinlined
Structct.hsoln_kineticsinlined
Structct.hsoln_transportinlined
Testedct.hsoln_setTransportModelwrapped
Testedct.hsoln_nAdjacentinlined
ct.hsoln_adjacentwaitlist
Testedct.hthermo_newFromFilewrapped
Testedct.hthermo_delinlined
Structct.hthermo_nElementsinlined
Structct.hthermo_nSpeciesinlined
Testedct.hthermo_temperatureinlined
Structct.hthermo_setTemperatureinlined
Testedct.hthermo_densityinlined
Testedct.hthermo_setDensityinlined
Testedct.hthermo_molarDensityinlined
Testedct.hthermo_setMolarDensityinlined
Testedct.hthermo_meanMolecularWeightinlined
Testedct.hthermo_moleFractioninlined
Testedct.hthermo_massFractioninlined
Structct.hthermo_getMoleFractionsinlined
Testedct.hthermo_getMassFractionsinlined
Structct.hthermo_setMoleFractionsinlined
Testedct.hthermo_setMassFractionsinlined
ct.hthermo_setMoleFractionsByName
ct.hthermo_setMassFractionsByName
ct.hthermo_getAtomicWeights
ct.hthermo_getMolecularWeights
ct.hthermo_getCharges
ct.hthermo_getElementName
ct.hthermo_getSpeciesName
ct.hthermo_getName
ct.hthermo_setName
ct.hthermo_elementIndex
ct.hthermo_speciesIndex
ct.hthermo_report
Testedct.hthermo_print
ct.hthermo_nAtoms
ct.hthermo_addElement
ct.hthermo_getEosType
To testct.hthermo_refPressureinlined
To testct.hthermo_minTempinlined
To testct.hthermo_maxTempinlined
To testct.hthermoenthalpymoleinlined
To testct.hthermointEnergymoleinlined
To testct.hthermoentropymoleinlined
To testct.hthermogibbsmoleinlined
To testct.hthermocpmoleinlined
To testct.hthermocvmoleinlined
To testct.hthermo_pressureinlined
Structct.hthermo_setPressureinlined
To testct.hthermoenthalpymassinlined
To testct.hthermointEnergymassinlined
To testct.hthermoentropymassinlined
To testct.hthermogibbsmassinlined
To testct.hthermocpmassinlined
To testct.hthermocvmassinlined
To testct.hthermo_electricPotentialinlined
To testct.hthermo_thermalExpansionCoeffinlined
To testct.hthermo_isothermalCompressibilityinlined
ct.hthermo_chemPotentials
ct.hthermogetEnthalpiesRT
ct.hthermogetEntropiesR
ct.hthermogetCpR
ct.hthermo_setElectricPotential
ct.hthermosetTP
ct.hthermosetTD
ct.hthermosetRP
ct.hthermosetDP
ct.hthermosetHP
ct.hthermosetUV
ct.hthermosetSV
ct.hthermosetSP
ct.hthermosetST
ct.hthermosetTV
ct.hthermosetPV
ct.hthermosetUP
ct.hthermosetVH
ct.hthermosetTH
ct.hthermosetSH
Testedct.hthermo_equilibrate
To testct.hthermo_critTemperatureinlined
To testct.hthermo_critPressureinlined
To testct.hthermo_critDensityinlined
To testct.hthermo_vaporFractioninlined
ct.hthermo_satTemperature
ct.hthermo_satPressure
ct.hthermosetStatePsat
ct.hthermosetStateTsat
ct.hkin_newFromFile
To testct.hkin_delinlined
To testct.hkin_nSpeciesinlined
To testct.hkin_nReactionsinlined
To testct.hkin_nPhasesinlined
ct.hkin_phaseIndex
To testct.hkin_reactionPhaseIndexinlined
ct.hkin_reactantStoichCoeff
ct.hkin_productStoichCoeff
ct.hkin_getReactionType
ct.hkin_getFwdRatesOfProgress
ct.hkin_getRevRatesOfProgress
ct.hkin_getNetRatesOfProgress
ct.hkin_getEquilibriumConstants
ct.hkin_getFwdRateConstants
ct.hkin_getRevRateConstants
ct.hkin_getDelta
ct.hkin_getCreationRates
ct.hkin_getDestructionRates
ct.hkin_getNetProductionRates
ct.hkin_getSourceTerms
To testct.hkin_multiplierinlined
ct.hkin_getReactionString
ct.hkin_setMultiplier
To testct.hkin_isReversibleinlined
ct.hkin_getType
To testct.hkin_startinlined
ct.hkin_speciesIndex
To testct.hkin_advanceCoveragesinlined
To testct.hkin_phaseinlined
To testct.htrans_newDefaultinlined
ct.htrans_new
To testct.htrans_delinlined
To testct.htrans_transportModelinlined
To testct.htrans_viscosityinlined
To testct.htrans_electricalConductivityinlined
ct.htrans_thermalConductivity
ct.htrans_getThermalDiffCoeffs
ct.htrans_getMixDiffCoeffs
ct.htrans_getBinDiffCoeffs
ct.htrans_getMultiDiffCoeffs
ct.htrans_setParameters
ct.htrans_getMolarFluxes
ct.htrans_getMassFluxes
ct.hct_getCanteraError
ct.hct_setLogWriter
ct.hct_setLogCallback
ct.hct_addCanteraDirectory
ct.hct_getDataDirectories
ct.hct_getCanteraVersion
ct.hct_getGitCommit
Testedct.hctsuppressthermo_warningsinlined
Testedct.hctuselegacyrateconstantsinlined
Testedct.hct_clearStorageinlined
Testedct.hct_resetStorageinlined

API of ctfunc.h

Documentation here.

StatusHeaderFunctionModule
ctfunc.hfunc_new
ctfunc.hfuncnewbasic
ctfunc.hfuncnewadvanced
ctfunc.hfuncnewcompound
ctfunc.hfuncnewmodified
To testctfunc.hfunc_delinlined
ctfunc.hfunc_type
To testctfunc.hfunc_valueinlined
To testctfunc.hfunc_derivativeinlined
To testctfunc.hfunc_duplicateinlined
ctfunc.hfunc_write
To testctfunc.hct_clearFuncinlined

API of ctmultiphase.h

Documentation here.

StatusHeaderFunctionModule
To testctmultiphase.hmix_newinlined
To testctmultiphase.hmix_delinlined
To testctmultiphase.hct_clearMixinlined
ctmultiphase.hmix_addPhase
To testctmultiphase.hmix_initinlined
To testctmultiphase.hmix_updatePhasesinlined
To testctmultiphase.hmix_nElementsinlined
ctmultiphase.hmix_elementIndex
ctmultiphase.hmix_speciesIndex
To testctmultiphase.hmix_nSpeciesinlined
To testctmultiphase.hmix_setTemperatureinlined
To testctmultiphase.hmix_temperatureinlined
To testctmultiphase.hmix_minTempinlined
To testctmultiphase.hmix_maxTempinlined
To testctmultiphase.hmix_chargeinlined
To testctmultiphase.hmix_phaseChargeinlined
To testctmultiphase.hmix_setPressureinlined
To testctmultiphase.hmix_pressureinlined
To testctmultiphase.hmix_nAtomsinlined
To testctmultiphase.hmix_nPhasesinlined
To testctmultiphase.hmix_phaseMolesinlined
ctmultiphase.hmix_setPhaseMoles
ctmultiphase.hmix_setMoles
ctmultiphase.hmix_setMolesByName
To testctmultiphase.hmix_speciesMolesinlined
To testctmultiphase.hmix_elementMolesinlined
ctmultiphase.hmix_equilibrate
ctmultiphase.hmix_getChemPotentials
To testctmultiphase.hmix_enthalpyinlined
To testctmultiphase.hmix_entropyinlined
To testctmultiphase.hmix_gibbsinlined
To testctmultiphase.hmix_cpinlined
To testctmultiphase.hmix_volumeinlined
To testctmultiphase.hmix_speciesPhaseIndexinlined
To testctmultiphase.hmix_moleFractioninlined

API of ctonedim.h

Documentation here.

StatusHeaderFunctionModule
To testctonedim.hct_clearOneDiminlined
ctonedim.hdomain_new
To testctonedim.hdomain_delinlined
To testctonedim.hdomain_typeinlined
ctonedim.hdomain_type3
To testctonedim.hdomain_indexinlined
To testctonedim.hdomain_nComponentsinlined
To testctonedim.hdomain_nPointsinlined
ctonedim.hdomain_componentName
ctonedim.hdomain_componentIndex
ctonedim.hdomain_setBounds
To testctonedim.hdomain_lowerBoundinlined
To testctonedim.hdomain_upperBoundinlined
ctonedim.hdomain_setSteadyTolerances
ctonedim.hdomain_setTransientTolerances
To testctonedim.hdomain_rtolinlined
To testctonedim.hdomain_atolinlined
ctonedim.hdomain_setupGrid
ctonedim.hdomain_setID
To testctonedim.hdomain_gridinlined
To testctonedim.hbdry_setMdotinlined
To testctonedim.hbdry_setTemperatureinlined
To testctonedim.hbdry_setSpreadRateinlined
ctonedim.hbdry_setMoleFractions
To testctonedim.hbdry_temperatureinlined
To testctonedim.hbdry_spreadRateinlined
To testctonedim.hbdry_massFractioninlined
To testctonedim.hbdry_mdotinlined
To testctonedim.hreactingsurf_setkineticsmgrinlined
To testctonedim.hreactingsurf_enableCoverageEqsinlined
To testctonedim.hinlet_newinlined
To testctonedim.houtlet_newinlined
To testctonedim.houtletres_newinlined
To testctonedim.hsymm_newinlined
To testctonedim.hsurf_newinlined
To testctonedim.hreactingsurf_newinlined
To testctonedim.hinlet_setSpreadRateinlined
ctonedim.hstflow_new
To testctonedim.hstflow_setTransportinlined
To testctonedim.hstflow_enableSoretinlined
To testctonedim.hstflow_setPressureinlined
To testctonedim.hstflow_pressureinlined
ctonedim.hstflow_setFixedTempProfile
To testctonedim.hstflow_solveEnergyEqninlined
ctonedim.hsim1D_new
To testctonedim.hsim1D_delinlined
ctonedim.hsim1D_setValue
ctonedim.hsim1D_setProfile
ctonedim.hsim1D_setFlatProfile
ctonedim.hsim1D_show
ctonedim.hsim1D_showSolution
ctonedim.hsim1D_setTimeStep
To testctonedim.hsim1D_getInitialSolninlined
ctonedim.hsim1D_solve
To testctonedim.hsim1D_refineinlined
ctonedim.hsim1D_setRefineCriteria
ctonedim.hsim1D_setGridMin
ctonedim.hsim1D_save
ctonedim.hsim1D_restore
To testctonedim.hsim1D_writeStatsinlined
ctonedim.hsim1D_domainIndex
ctonedim.hsim1D_value
ctonedim.hsim1D_workValue
To testctonedim.hsim1D_evalinlined
To testctonedim.hsim1D_setMaxJacAgeinlined
To testctonedim.hsim1D_setFixedTemperatureinlined

API of ctreactor.h

Documentation here.

StatusHeaderFunctionModule
ctreactor.hreactor_new
To testctreactor.hreactor_delinlined
To testctreactor.hreactor_setInitialVolumeinlined
To testctreactor.hreactor_setChemistryinlined
To testctreactor.hreactor_setEnergyinlined
To testctreactor.hreactor_setThermoMgrinlined
To testctreactor.hreactor_setKineticsMgrinlined
To testctreactor.hreactor_insertinlined
To testctreactor.hreactor_massinlined
To testctreactor.hreactor_volumeinlined
To testctreactor.hreactor_densityinlined
To testctreactor.hreactor_temperatureinlined
To testctreactor.hreactorenthalpymassinlined
To testctreactor.hreactorintEnergymassinlined
To testctreactor.hreactor_pressureinlined
To testctreactor.hreactor_massFractioninlined
To testctreactor.hreactor_nSensParamsinlined
To testctreactor.hreactor_addSensitivityReactioninlined
To testctreactor.hflowReactor_setMassFlowRateinlined
To testctreactor.hreactornet_newinlined
To testctreactor.hreactornet_delinlined
To testctreactor.hreactornet_setInitialTimeinlined
To testctreactor.hreactornet_setMaxTimeStepinlined
To testctreactor.hreactornet_setTolerancesinlined
To testctreactor.hreactornet_setSensitivityTolerancesinlined
To testctreactor.hreactornet_addreactorinlined
To testctreactor.hreactornet_advanceinlined
To testctreactor.hreactornet_stepinlined
To testctreactor.hreactornet_timeinlined
To testctreactor.hreactornet_rtolinlined
To testctreactor.hreactornet_atolinlined
ctreactor.hreactornet_sensitivity
ctreactor.hflowdev_new
To testctreactor.hflowdev_delinlined
To testctreactor.hflowdev_installinlined
To testctreactor.hflowdev_setMasterinlined
To testctreactor.hflowdev_setPrimaryinlined
To testctreactor.hflowdev_massFlowRateinlined
To testctreactor.hflowdev_setMassFlowCoeffinlined
To testctreactor.hflowdev_setValveCoeffinlined
To testctreactor.hflowdev_setPressureCoeffinlined
To testctreactor.hflowdev_setPressureFunctioninlined
To testctreactor.hflowdev_setTimeFunctioninlined
ctreactor.hwall_new
To testctreactor.hwall_delinlined
To testctreactor.hwall_installinlined
To testctreactor.hwall_vdotinlined
To testctreactor.hwall_expansionRateinlined
To testctreactor.hwall_Qinlined
To testctreactor.hwall_heatRateinlined
To testctreactor.hwall_areainlined
To testctreactor.hwall_setAreainlined
To testctreactor.hwall_setThermalResistanceinlined
To testctreactor.hwall_setHeatTransferCoeffinlined
To testctreactor.hwall_setHeatFluxinlined
To testctreactor.hwall_setExpansionRateCoeffinlined
To testctreactor.hwall_setVelocityinlined
To testctreactor.hwall_setEmissivityinlined
To testctreactor.hwall_readyinlined
To testctreactor.hreactorsurface_newinlined
To testctreactor.hreactorsurface_delinlined
To testctreactor.hreactorsurface_installinlined
To testctreactor.hreactorsurface_setkineticsinlined
To testctreactor.hreactorsurface_areainlined
To testctreactor.hreactorsurface_setAreainlined
To testctreactor.hreactorsurface_addSensitivityReactioninlined
To testctreactor.hct_clearReactorsinlined

API of ctrpath.h

Documentation here.

StatusHeaderFunctionModule
To testctrpath.hrdiag_newinlined
To testctrpath.hrdiag_delinlined
To testctrpath.hrdiag_detailedinlined
To testctrpath.hrdiag_briefinlined
To testctrpath.hrdiag_setThresholdinlined
ctrpath.hrdiag_setBoldColor
ctrpath.hrdiag_setNormalColor
ctrpath.hrdiag_setDashedColor
ctrpath.hrdiag_setDotOptions
To testctrpath.hrdiag_setBoldThresholdinlined
To testctrpath.hrdiag_setNormalThresholdinlined
To testctrpath.hrdiag_setLabelThresholdinlined
To testctrpath.hrdiag_setScaleinlined
To testctrpath.hrdiag_setFlowTypeinlined
To testctrpath.hrdiag_setArrowWidthinlined
ctrpath.hrdiag_setTitle
ctrpath.hrdiag_write
To testctrpath.hrdiag_addinlined
ctrpath.hrdiag_findMajor
ctrpath.hrdiag_setFont
To testctrpath.hrdiag_displayOnlyinlined
To testctrpath.hrbuild_newinlined
To testctrpath.hrbuild_delinlined
ctrpath.hrbuild_init
ctrpath.hrbuild_build
To testctrpath.hct_clearReactionPathinlined

API of ctsurf.h

Documentation here.

StatusHeaderFunctionModule
ctsurf.hsurf_setCoverages
ctsurf.hsurf_getCoverages
ctsurf.hsurf_setConcentrations
ctsurf.hsurf_getConcentrations
To testctsurf.hsurf_setSiteDensityinlined
To testctsurf.hsurf_siteDensityinlined
ctsurf.hsurf_setCoveragesByName

Cantera samples

+Cantera · WallyToolbox.jl

Cantera

This page documents the wrapper written around the C-API of Cantera. The status of development is documented here. Its goal is not to mimic the original API or provide an interface equivalent to the Python package, but something in line with the functioning of the parent toolbox.

Status of Cantera wrapper

This is an experimental interface to Cantera library based on its C-API version 3.0. This interface is at its early days and has developped for Julia >= 1.9.0 under Windows 10/11. When it is stable enough it will be published as a package and tested under other platforms.

API of ct.h

Documentation here.

StatusHeaderFunctionModule
Testedct.hct_appdeleteinlined
Structct.hsoln_newSolutionwrapped
ct.hsoln_newInterfacewaitlist
Testedct.hsoln_delinlined
Testedct.hsoln_nameinlined
Structct.hsoln_thermoinlined
Structct.hsoln_kineticsinlined
Structct.hsoln_transportinlined
Testedct.hsoln_setTransportModelwrapped
Testedct.hsoln_nAdjacentinlined
ct.hsoln_adjacentwaitlist
Testedct.hthermo_newFromFilewrapped
Testedct.hthermo_delinlined
Structct.hthermo_nElementsinlined
Structct.hthermo_nSpeciesinlined
Testedct.hthermo_temperatureinlined
Structct.hthermo_setTemperatureinlined
Testedct.hthermo_densityinlined
Testedct.hthermo_setDensityinlined
Testedct.hthermo_molarDensityinlined
Testedct.hthermo_setMolarDensityinlined
Testedct.hthermo_meanMolecularWeightinlined
Testedct.hthermo_moleFractioninlined
Testedct.hthermo_massFractioninlined
Structct.hthermo_getMoleFractionsinlined
Testedct.hthermo_getMassFractionsinlined
Structct.hthermo_setMoleFractionsinlined
Testedct.hthermo_setMassFractionsinlined
ct.hthermo_setMoleFractionsByName
ct.hthermo_setMassFractionsByName
ct.hthermo_getAtomicWeights
ct.hthermo_getMolecularWeights
ct.hthermo_getCharges
ct.hthermo_getElementName
ct.hthermo_getSpeciesName
ct.hthermo_getName
ct.hthermo_setName
ct.hthermo_elementIndex
ct.hthermo_speciesIndex
ct.hthermo_report
Testedct.hthermo_print
ct.hthermo_nAtoms
ct.hthermo_addElement
ct.hthermo_getEosType
To testct.hthermo_refPressureinlined
To testct.hthermo_minTempinlined
To testct.hthermo_maxTempinlined
To testct.hthermoenthalpymoleinlined
To testct.hthermointEnergymoleinlined
To testct.hthermoentropymoleinlined
To testct.hthermogibbsmoleinlined
To testct.hthermocpmoleinlined
To testct.hthermocvmoleinlined
To testct.hthermo_pressureinlined
Structct.hthermo_setPressureinlined
To testct.hthermoenthalpymassinlined
To testct.hthermointEnergymassinlined
To testct.hthermoentropymassinlined
To testct.hthermogibbsmassinlined
To testct.hthermocpmassinlined
To testct.hthermocvmassinlined
To testct.hthermo_electricPotentialinlined
To testct.hthermo_thermalExpansionCoeffinlined
To testct.hthermo_isothermalCompressibilityinlined
ct.hthermo_chemPotentials
ct.hthermogetEnthalpiesRT
ct.hthermogetEntropiesR
ct.hthermogetCpR
ct.hthermo_setElectricPotential
ct.hthermosetTP
ct.hthermosetTD
ct.hthermosetRP
ct.hthermosetDP
ct.hthermosetHP
ct.hthermosetUV
ct.hthermosetSV
ct.hthermosetSP
ct.hthermosetST
ct.hthermosetTV
ct.hthermosetPV
ct.hthermosetUP
ct.hthermosetVH
ct.hthermosetTH
ct.hthermosetSH
Testedct.hthermo_equilibrate
To testct.hthermo_critTemperatureinlined
To testct.hthermo_critPressureinlined
To testct.hthermo_critDensityinlined
To testct.hthermo_vaporFractioninlined
ct.hthermo_satTemperature
ct.hthermo_satPressure
ct.hthermosetStatePsat
ct.hthermosetStateTsat
ct.hkin_newFromFile
To testct.hkin_delinlined
To testct.hkin_nSpeciesinlined
To testct.hkin_nReactionsinlined
To testct.hkin_nPhasesinlined
ct.hkin_phaseIndex
To testct.hkin_reactionPhaseIndexinlined
ct.hkin_reactantStoichCoeff
ct.hkin_productStoichCoeff
ct.hkin_getReactionType
ct.hkin_getFwdRatesOfProgress
ct.hkin_getRevRatesOfProgress
ct.hkin_getNetRatesOfProgress
ct.hkin_getEquilibriumConstants
ct.hkin_getFwdRateConstants
ct.hkin_getRevRateConstants
ct.hkin_getDelta
ct.hkin_getCreationRates
ct.hkin_getDestructionRates
ct.hkin_getNetProductionRates
ct.hkin_getSourceTerms
To testct.hkin_multiplierinlined
ct.hkin_getReactionString
ct.hkin_setMultiplier
To testct.hkin_isReversibleinlined
ct.hkin_getType
To testct.hkin_startinlined
ct.hkin_speciesIndex
To testct.hkin_advanceCoveragesinlined
To testct.hkin_phaseinlined
To testct.htrans_newDefaultinlined
ct.htrans_new
To testct.htrans_delinlined
To testct.htrans_transportModelinlined
To testct.htrans_viscosityinlined
To testct.htrans_electricalConductivityinlined
ct.htrans_thermalConductivity
ct.htrans_getThermalDiffCoeffs
ct.htrans_getMixDiffCoeffs
ct.htrans_getBinDiffCoeffs
ct.htrans_getMultiDiffCoeffs
ct.htrans_setParameters
ct.htrans_getMolarFluxes
ct.htrans_getMassFluxes
ct.hct_getCanteraError
ct.hct_setLogWriter
ct.hct_setLogCallback
ct.hct_addCanteraDirectory
ct.hct_getDataDirectories
ct.hct_getCanteraVersion
ct.hct_getGitCommit
Testedct.hctsuppressthermo_warningsinlined
Testedct.hctuselegacyrateconstantsinlined
Testedct.hct_clearStorageinlined
Testedct.hct_resetStorageinlined

API of ctfunc.h

Documentation here.

StatusHeaderFunctionModule
ctfunc.hfunc_new
ctfunc.hfuncnewbasic
ctfunc.hfuncnewadvanced
ctfunc.hfuncnewcompound
ctfunc.hfuncnewmodified
To testctfunc.hfunc_delinlined
ctfunc.hfunc_type
To testctfunc.hfunc_valueinlined
To testctfunc.hfunc_derivativeinlined
To testctfunc.hfunc_duplicateinlined
ctfunc.hfunc_write
To testctfunc.hct_clearFuncinlined

API of ctmultiphase.h

Documentation here.

StatusHeaderFunctionModule
To testctmultiphase.hmix_newinlined
To testctmultiphase.hmix_delinlined
To testctmultiphase.hct_clearMixinlined
ctmultiphase.hmix_addPhase
To testctmultiphase.hmix_initinlined
To testctmultiphase.hmix_updatePhasesinlined
To testctmultiphase.hmix_nElementsinlined
ctmultiphase.hmix_elementIndex
ctmultiphase.hmix_speciesIndex
To testctmultiphase.hmix_nSpeciesinlined
To testctmultiphase.hmix_setTemperatureinlined
To testctmultiphase.hmix_temperatureinlined
To testctmultiphase.hmix_minTempinlined
To testctmultiphase.hmix_maxTempinlined
To testctmultiphase.hmix_chargeinlined
To testctmultiphase.hmix_phaseChargeinlined
To testctmultiphase.hmix_setPressureinlined
To testctmultiphase.hmix_pressureinlined
To testctmultiphase.hmix_nAtomsinlined
To testctmultiphase.hmix_nPhasesinlined
To testctmultiphase.hmix_phaseMolesinlined
ctmultiphase.hmix_setPhaseMoles
ctmultiphase.hmix_setMoles
ctmultiphase.hmix_setMolesByName
To testctmultiphase.hmix_speciesMolesinlined
To testctmultiphase.hmix_elementMolesinlined
ctmultiphase.hmix_equilibrate
ctmultiphase.hmix_getChemPotentials
To testctmultiphase.hmix_enthalpyinlined
To testctmultiphase.hmix_entropyinlined
To testctmultiphase.hmix_gibbsinlined
To testctmultiphase.hmix_cpinlined
To testctmultiphase.hmix_volumeinlined
To testctmultiphase.hmix_speciesPhaseIndexinlined
To testctmultiphase.hmix_moleFractioninlined

API of ctonedim.h

Documentation here.

StatusHeaderFunctionModule
To testctonedim.hct_clearOneDiminlined
ctonedim.hdomain_new
To testctonedim.hdomain_delinlined
To testctonedim.hdomain_typeinlined
ctonedim.hdomain_type3
To testctonedim.hdomain_indexinlined
To testctonedim.hdomain_nComponentsinlined
To testctonedim.hdomain_nPointsinlined
ctonedim.hdomain_componentName
ctonedim.hdomain_componentIndex
ctonedim.hdomain_setBounds
To testctonedim.hdomain_lowerBoundinlined
To testctonedim.hdomain_upperBoundinlined
ctonedim.hdomain_setSteadyTolerances
ctonedim.hdomain_setTransientTolerances
To testctonedim.hdomain_rtolinlined
To testctonedim.hdomain_atolinlined
ctonedim.hdomain_setupGrid
ctonedim.hdomain_setID
To testctonedim.hdomain_gridinlined
To testctonedim.hbdry_setMdotinlined
To testctonedim.hbdry_setTemperatureinlined
To testctonedim.hbdry_setSpreadRateinlined
ctonedim.hbdry_setMoleFractions
To testctonedim.hbdry_temperatureinlined
To testctonedim.hbdry_spreadRateinlined
To testctonedim.hbdry_massFractioninlined
To testctonedim.hbdry_mdotinlined
To testctonedim.hreactingsurf_setkineticsmgrinlined
To testctonedim.hreactingsurf_enableCoverageEqsinlined
To testctonedim.hinlet_newinlined
To testctonedim.houtlet_newinlined
To testctonedim.houtletres_newinlined
To testctonedim.hsymm_newinlined
To testctonedim.hsurf_newinlined
To testctonedim.hreactingsurf_newinlined
To testctonedim.hinlet_setSpreadRateinlined
ctonedim.hstflow_new
To testctonedim.hstflow_setTransportinlined
To testctonedim.hstflow_enableSoretinlined
To testctonedim.hstflow_setPressureinlined
To testctonedim.hstflow_pressureinlined
ctonedim.hstflow_setFixedTempProfile
To testctonedim.hstflow_solveEnergyEqninlined
ctonedim.hsim1D_new
To testctonedim.hsim1D_delinlined
ctonedim.hsim1D_setValue
ctonedim.hsim1D_setProfile
ctonedim.hsim1D_setFlatProfile
ctonedim.hsim1D_show
ctonedim.hsim1D_showSolution
ctonedim.hsim1D_setTimeStep
To testctonedim.hsim1D_getInitialSolninlined
ctonedim.hsim1D_solve
To testctonedim.hsim1D_refineinlined
ctonedim.hsim1D_setRefineCriteria
ctonedim.hsim1D_setGridMin
ctonedim.hsim1D_save
ctonedim.hsim1D_restore
To testctonedim.hsim1D_writeStatsinlined
ctonedim.hsim1D_domainIndex
ctonedim.hsim1D_value
ctonedim.hsim1D_workValue
To testctonedim.hsim1D_evalinlined
To testctonedim.hsim1D_setMaxJacAgeinlined
To testctonedim.hsim1D_setFixedTemperatureinlined

API of ctreactor.h

Documentation here.

StatusHeaderFunctionModule
ctreactor.hreactor_new
To testctreactor.hreactor_delinlined
To testctreactor.hreactor_setInitialVolumeinlined
To testctreactor.hreactor_setChemistryinlined
To testctreactor.hreactor_setEnergyinlined
To testctreactor.hreactor_setThermoMgrinlined
To testctreactor.hreactor_setKineticsMgrinlined
To testctreactor.hreactor_insertinlined
To testctreactor.hreactor_massinlined
To testctreactor.hreactor_volumeinlined
To testctreactor.hreactor_densityinlined
To testctreactor.hreactor_temperatureinlined
To testctreactor.hreactorenthalpymassinlined
To testctreactor.hreactorintEnergymassinlined
To testctreactor.hreactor_pressureinlined
To testctreactor.hreactor_massFractioninlined
To testctreactor.hreactor_nSensParamsinlined
To testctreactor.hreactor_addSensitivityReactioninlined
To testctreactor.hflowReactor_setMassFlowRateinlined
To testctreactor.hreactornet_newinlined
To testctreactor.hreactornet_delinlined
To testctreactor.hreactornet_setInitialTimeinlined
To testctreactor.hreactornet_setMaxTimeStepinlined
To testctreactor.hreactornet_setTolerancesinlined
To testctreactor.hreactornet_setSensitivityTolerancesinlined
To testctreactor.hreactornet_addreactorinlined
To testctreactor.hreactornet_advanceinlined
To testctreactor.hreactornet_stepinlined
To testctreactor.hreactornet_timeinlined
To testctreactor.hreactornet_rtolinlined
To testctreactor.hreactornet_atolinlined
ctreactor.hreactornet_sensitivity
ctreactor.hflowdev_new
To testctreactor.hflowdev_delinlined
To testctreactor.hflowdev_installinlined
To testctreactor.hflowdev_setMasterinlined
To testctreactor.hflowdev_setPrimaryinlined
To testctreactor.hflowdev_massFlowRateinlined
To testctreactor.hflowdev_setMassFlowCoeffinlined
To testctreactor.hflowdev_setValveCoeffinlined
To testctreactor.hflowdev_setPressureCoeffinlined
To testctreactor.hflowdev_setPressureFunctioninlined
To testctreactor.hflowdev_setTimeFunctioninlined
ctreactor.hwall_new
To testctreactor.hwall_delinlined
To testctreactor.hwall_installinlined
To testctreactor.hwall_vdotinlined
To testctreactor.hwall_expansionRateinlined
To testctreactor.hwall_Qinlined
To testctreactor.hwall_heatRateinlined
To testctreactor.hwall_areainlined
To testctreactor.hwall_setAreainlined
To testctreactor.hwall_setThermalResistanceinlined
To testctreactor.hwall_setHeatTransferCoeffinlined
To testctreactor.hwall_setHeatFluxinlined
To testctreactor.hwall_setExpansionRateCoeffinlined
To testctreactor.hwall_setVelocityinlined
To testctreactor.hwall_setEmissivityinlined
To testctreactor.hwall_readyinlined
To testctreactor.hreactorsurface_newinlined
To testctreactor.hreactorsurface_delinlined
To testctreactor.hreactorsurface_installinlined
To testctreactor.hreactorsurface_setkineticsinlined
To testctreactor.hreactorsurface_areainlined
To testctreactor.hreactorsurface_setAreainlined
To testctreactor.hreactorsurface_addSensitivityReactioninlined
To testctreactor.hct_clearReactorsinlined

API of ctrpath.h

Documentation here.

StatusHeaderFunctionModule
To testctrpath.hrdiag_newinlined
To testctrpath.hrdiag_delinlined
To testctrpath.hrdiag_detailedinlined
To testctrpath.hrdiag_briefinlined
To testctrpath.hrdiag_setThresholdinlined
ctrpath.hrdiag_setBoldColor
ctrpath.hrdiag_setNormalColor
ctrpath.hrdiag_setDashedColor
ctrpath.hrdiag_setDotOptions
To testctrpath.hrdiag_setBoldThresholdinlined
To testctrpath.hrdiag_setNormalThresholdinlined
To testctrpath.hrdiag_setLabelThresholdinlined
To testctrpath.hrdiag_setScaleinlined
To testctrpath.hrdiag_setFlowTypeinlined
To testctrpath.hrdiag_setArrowWidthinlined
ctrpath.hrdiag_setTitle
ctrpath.hrdiag_write
To testctrpath.hrdiag_addinlined
ctrpath.hrdiag_findMajor
ctrpath.hrdiag_setFont
To testctrpath.hrdiag_displayOnlyinlined
To testctrpath.hrbuild_newinlined
To testctrpath.hrbuild_delinlined
ctrpath.hrbuild_init
ctrpath.hrbuild_build
To testctrpath.hct_clearReactionPathinlined

API of ctsurf.h

Documentation here.

StatusHeaderFunctionModule
ctsurf.hsurf_setCoverages
ctsurf.hsurf_getCoverages
ctsurf.hsurf_setConcentrations
ctsurf.hsurf_getConcentrations
To testctsurf.hsurf_setSiteDensityinlined
To testctsurf.hsurf_siteDensityinlined
ctsurf.hsurf_setCoveragesByName

Cantera samples

diff --git a/dev/Modules/DryFlowsheet/index.html b/dev/Modules/DryFlowsheet/index.html index e580687ae..3b83913ae 100644 --- a/dev/Modules/DryFlowsheet/index.html +++ b/dev/Modules/DryFlowsheet/index.html @@ -1,2 +1,2 @@ -DryFlowsheet · WallyToolbox.jl

DryFlowsheet

DryFlowsheet.CooledCrushingMillType

Represents a crushing device with cooling system.

Models

  1. :TARGET_COOLANT_TEMP evaluates the heat transfer lost to coolant provided a target final stream temperature given by keyword argument temp_out. Product temperature is updated through an EnergyStream built with energy exchange computed through exchanged_heat, so that numerical value can be slightly different from target value.
  2. :USING_GLOBAL_HTC makes use of a global heat transfer coefficient to evaluate heat flux across the cooling stream.

Attributes

  • rawmeal: The input meal applied to crushing process.

  • product: The output material stream at the end of product pipeline.

  • coolant: The output material stream at the end of cooling pipeline.

  • power: The power applied to the crushing process [W]

  • loss: The heat exchanged in between product and cooling pipelines [W].

  • globalhtc: Global heat transfer coefficient [W/K].

source
DryFlowsheet.MaterialStreamType

Represents a material stream.

Attributes

  • : Material mass flow rate [kg/s].

  • T: Stream temperature [K].

  • P: Stream pressure [Pa].

  • Y: Components mass fractions [-].

  • pipeline: Materials pipeline associated to Y.

source
DryFlowsheet.SolidsSeparatorType

Represents a solids separator with efficiency η.

To-do's

  • Add inverse model to automatically tune efficiency η.

Attributes

  • η: Solids separation efficiency [-].

  • source: The stream to be separated into solids and others.

  • solids: The output solids stream.

  • others: The output remaining stream.

source
DryFlowsheet.TransportPipelineType

Represents a pipeline with heat transfer.

Models

  1. :TARGET_EXIT_TEMP evaluates the heat transfer lost to environment provided a target final stream temperature given by keyword argument temp_out. Product temperature is updated through an EnergyStream built with energy exchange computed through exchanged_heat, so that numerical value can be slightly different from target value.
  2. :USING_GLOBAL_HTC makes use of a global heat transfer coefficient to evaluate heat flux across the pipe.

To-do's

  • Implement heat transfer losses through a convective heat transfer coefficient (HTC) computed from a suitable Nusselt number, for use of pipeline in simulation mode.

Attributes

  • product: The output material stream at the end of pipeline.

  • power: The heat exchanged in pipeline [W].

source
+DryFlowsheet · WallyToolbox.jl

DryFlowsheet

DryFlowsheet.CooledCrushingMillType

Represents a crushing device with cooling system.

Models

  1. :TARGET_COOLANT_TEMP evaluates the heat transfer lost to coolant provided a target final stream temperature given by keyword argument temp_out. Product temperature is updated through an EnergyStream built with energy exchange computed through exchanged_heat, so that numerical value can be slightly different from target value.
  2. :USING_GLOBAL_HTC makes use of a global heat transfer coefficient to evaluate heat flux across the cooling stream.

Attributes

  • rawmeal: The input meal applied to crushing process.

  • product: The output material stream at the end of product pipeline.

  • coolant: The output material stream at the end of cooling pipeline.

  • power: The power applied to the crushing process [W]

  • loss: The heat exchanged in between product and cooling pipelines [W].

  • globalhtc: Global heat transfer coefficient [W/K].

source
DryFlowsheet.MaterialStreamType

Represents a material stream.

Attributes

  • : Material mass flow rate [kg/s].

  • T: Stream temperature [K].

  • P: Stream pressure [Pa].

  • Y: Components mass fractions [-].

  • pipeline: Materials pipeline associated to Y.

source
DryFlowsheet.SolidsSeparatorType

Represents a solids separator with efficiency η.

To-do's

  • Add inverse model to automatically tune efficiency η.

Attributes

  • η: Solids separation efficiency [-].

  • source: The stream to be separated into solids and others.

  • solids: The output solids stream.

  • others: The output remaining stream.

source
DryFlowsheet.TransportPipelineType

Represents a pipeline with heat transfer.

Models

  1. :TARGET_EXIT_TEMP evaluates the heat transfer lost to environment provided a target final stream temperature given by keyword argument temp_out. Product temperature is updated through an EnergyStream built with energy exchange computed through exchanged_heat, so that numerical value can be slightly different from target value.
  2. :USING_GLOBAL_HTC makes use of a global heat transfer coefficient to evaluate heat flux across the pipe.

To-do's

  • Implement heat transfer losses through a convective heat transfer coefficient (HTC) computed from a suitable Nusselt number, for use of pipeline in simulation mode.

Attributes

  • product: The output material stream at the end of pipeline.

  • power: The heat exchanged in pipeline [W].

source
diff --git a/dev/Modules/DryGranular/index.html b/dev/Modules/DryGranular/index.html deleted file mode 100644 index 61d69772b..000000000 --- a/dev/Modules/DryGranular/index.html +++ /dev/null @@ -1,84 +0,0 @@ - -DryGranular · WallyToolbox.jl

DryGranular

General porous media

Modeling of geometrical characteristics of porous beds is required for including both their thermal effect or role over chemistry in chemical reactors. A classical approach used in several commercial and open source tools is that of Gunn1978 [9]. In what follows we develop the ideas that lead to an analogous model which is implemented by this structure.

To build the model we will assume a reactor of constant rectangular cross-section ${A}_{r}={b}{w}$ and volume ${V}_{R}={b}{w}{h}$. Its cross-section perimeter is then ${P}_{R}=2({b}+{w})$. Inside this reactor we randomly pack cubic particles $\beta$ of surface area ${A}_{\beta}=6{l}_{\beta}^2$ and volume ${V}_{\beta}={l}_{\beta}^3$ at a porosity level ${\phi}$. Thus the total volume of solids inside the reactor is ${V}_{S}=(1-{\phi}){V}_{R}$ and the approximate number of particles ${N}=\frac{{V}_{S}}{{V}_{\beta}}$. Following a similar reasoning the total surface area of particles is ${A}_{S}={N}{A}_{\beta}$. Performing all the substitutions so far one finds the following expression

\[{A}_{S}=\frac{6(1-{\phi}){b}{w}{h}}{{l}_{\beta}}\]

Since the differential $d{A}={P}d{l}$ holds for the surface of a body over its length ${l}$, one can divide the above expression by the reactor length to get the perimeter of particles in a cross-section. We can further divide by the cross-section area itself and find the perimeter density which is a more general result, and find the expression proposed by Gunn1978 [9]. This result is summarized in the next equation where the subscript of particle size was dropped for generality.

\[{P} = \frac{6(1-{\phi})}{{l}}\]

An estimator of the number of channels per unit cross-section of reactor ${N}$ can be related to the porosity through ${N}\pi{R}^2={\phi}$. Because the above perimeter is shared between the fluid volume and solids, it holds that ${N}2\pi{R}=P$. Using these expressions one can solve for the porosity channels characteristic radius ${R}$ as given below, which is also a result reported by Gunn1978 [9].

\[{R}=\frac{{\phi}{l}}{3(1-{\phi})}\]

This model is probided in PackedBedPorosityDescriptor.

DryGranular.PackedBedPorosityDescriptorType

Provides description of porosity parameters with stochastic behavior.

  • ϕ::Union{Float64, Vector{Float64}}: Porosity volume fraction in medium [-].

  • l::Union{Float64, Vector{Float64}}: Characteristic particle size in medium [m].

  • σϕ::Union{Nothing, Float64}: Optional standard deviation of porosity volume fraction [-].

  • σl::Union{Nothing, Float64}: Optional standard deviation of characteristic particle size [m].

  • P::Union{Float64, Vector{Float64}}: Perimeter in reactor cross-section [m].

  • D::Union{Float64, Vector{Float64}}: Characteristic diameter of porosity channels [m].

  • A::Float64: Reactor area used for scaling perimeter [m²].

source

PackedBedPorosityDescriptor can be used to describe the geometry of exchange section of a packed bed for a single set of arguments.

julia> PackedBedPorosityDescriptor(; ϕ = 0.65, l = 0.10, area = 1.0)
-PackedBedPorosityDescriptor(P = 21.000000 m, D = 0.123810 m)

It can also be used to describe randomly varying reactors, what is a more realistic thing to do when using this structure to simulate real world systems.

julia> PackedBedPorosityDescriptor(;
-            ϕ  = 0.65, l  = 0.10,
-            σϕ = 0.03, σl = 0.01,
-            N = 2,
-            ϕlims = (0.4, 0.8),
-            llims = (0.0, 0.3),
-            seed = 42,
-            area = 1.0
-        )
-PackedBedPorosityDescriptor(
-    P from  21.455749 m to  24.370742 m
-    D from   0.125589 m to   0.102353 m
-)

Rotary kiln models

In a rotary kiln as proposed by Kramers1952 [10]. Its goal is to be used as a process support tool or to integrate more complex models requiring integration of the bed profile. In its classical statement, the bed height profile $h(z)$ can be evaluated from volume of flowing material conservation through the following equations. Coordinate $z=0$ represents the discharge position where initial condition must be applied. This is given by the dam height, if any, or particle size.

\[\begin{aligned} -\dfrac{dh}{dz} &= C₁ \left[\frac{h}{R}\left(2 - \frac{h}{R}\right)\right]^{-\frac{3}{2}} - C₂\\[6pt] -C₁ &= \frac{3}{4}\dfrac{Φ\tan{γ}}{π R^3 ω}\\[6pt] -C₂ &= \dfrac{\tan{β}}{\cos{γ}} -\end{aligned}\]

The structure SymbolicLinearKramersModel implements the Kramers' ordinary differential equation for prediction of bed height profile in a rotary kiln. This equation is implemented under the formalism of ModelingToolkit.

DryGranular.SymbolicLinearKramersModelType

Creates a reusable linear Kramers model for rotary kiln simulation.

  • R::Symbolics.Num: Symbolic kiln internal radius

  • Φ::Symbolics.Num: Symbolic kiln feed rate

  • ω::Symbolics.Num: Symbolic kiln rotation rate

  • β::Symbolics.Num: Symbolic kiln slope

  • γ::Symbolics.Num: Symbolic solids repose angle

  • z::Symbolics.Num: Symbolic kiln axial coordinates

  • h::Symbolics.Num: Symbolic bed height profile

  • sys::ModelingToolkit.ODESystem: Problem ordinary differential equation

source

For integration of this model we implement RotaryKilnBedSolution. It provides the solved description of a rotary kiln bed geometry computed from the solution of bed height along the kiln length. The main goal of the quantities computed here is their use with heat and mass transfer models for the simulation of rotary kiln process. A simple post-processing utilitiy plotlinearkramersmodel is also provided.

DryGranular.RotaryKilnBedSolutionType

General geometric description of a bed from Kramers equation solution.

  • z::Vector{Float64}: Solution coordinates [m]

  • h::Vector{Float64}: Solution bed height [m]

  • θ::Vector{Float64}: View angle from kiln center [rad]

  • l::Vector{Float64}: Bed-freeboard cord length [m]

  • A::Vector{Float64}: Local bed cross section area [m²]

  • η::Vector{Float64}: Local loading based on height [-]

  • ηₘ::Float64: Mean loading of kiln [%]

  • V::Float64: Bed integral volume [m³]

  • τ::Float64: Residence time of particles

  • β::Float64: Kiln slope [rad]

Arguments

Internal elements are initialized through the following constructor:

RotaryKilnBedSolution(z, h, β, R, Φ)

Where parameters are given as:

  • z: solution coordinates over length, [m].
  • h: bed profile solution over length, [m].
  • R: kiln internal radius, [m].
  • Φ: kiln feed rate, [m³/s].

An outer constructor is also provided for managing the integration of an instance of SymbolicLinearKramersModel. This is the recommended usage that is illustrated below.

Important: inputs must be provided in international system (SI) units as a better physical practice. The only exception is the rotation rate ω provided in revolution multiples. If the discharge end is held by a dam, its height must be provided instead of the particle size, as it is used as the ODE initial condition.

  • model: a symbolic kiln model.
  • L: kiln length, [m].
  • R: kiln internal radius, [m].
  • Φ: kiln feed rate, [m³/s].
  • ω: kiln rotation rate, [rev/s].
  • β: kiln slope, [rad].
  • γ: solids repose angle, [rad].
  • d: particle size or dam height, [m].
  • solver: Solver for DifferentialEquations. Defaults to Tsit5.
  • rtol: Relative integration tolerance. Defaults to 1.0e-08.
  • atol: Absolute integration tolerance. Defaults to 1.0e-08.
source
DryGranular.plotlinearkramersmodelFunction
plotlinearkramersmodel(
-    model::RotaryKilnBedSolution;
-    normz::Bool = false,
-    normh::Bool = false
-)::Figure

Standardized plotting of RotaryKilnBedSolution bed profile. It supports normalization of axes throught keywords normz for axial coordinate and normh for bed depth.

source

Data in next example is an SI conversion of an example from Kramers1952 [10].

julia> L = 13.715999999999998;  # Kiln length [m]
-
-julia> D = 1.8897599999999999;  # Kiln diameter [m]
-
-julia> β = 2.3859440303888126;  # Kiln slope [°]
-
-julia> γ = 45.0;                # Repose angle [°]
-
-julia> d = 1.0;                 # Particle/dam size [mm]
-
-julia> Φ = 10.363965852671996;  # Feed rate [m³/h]
-
-julia> ω = 3.0300000000000002;  # Rotation rate [rev/min]
-
-julia> bed = RotaryKilnBedSolution(;
-            model = SymbolicLinearKramersModel(),
-            L     = L,
-            R     = D / 2.0,
-            Φ     = Φ / 3600.0,
-            ω     = ω / 60.0,
-            β     = deg2rad(β),
-            γ     = deg2rad(γ),
-            d     = d / 1000.0
-        );
-
-julia> bed
-RotaryKilnBedSolution(τ = 13.169938 min, ηₘ = 5.913271 %)
-
-julia> bed.τ
-790.1963002204403

In the following dummy example we force a very thick analytical bed solution, filling the radius of the rotary drum.

julia> R = 1.0e+00;
-
-julia> Φ = 1.0e-02;
-
-julia> z = collect(0.0:0.1:10.0);
-
-julia> h = R * ones(size(z));
-
-julia> Aₐ = π * R^2 / 2;
-
-julia> Vₐ = Aₐ * z[end];
-
-julia> bed = RotaryKilnBedSolution(z, h, 0, R, Φ)
-RotaryKilnBedSolution(τ = 26.179939 min, ηₘ = 50.000000 %)

Next we confirm the internal evaluations of the model match the expected analytical values.

julia> mean(bed.θ) ≈ π
-true
-
-julia> mean(bed.l) ≈ 2R
-true
-
-julia> mean(bed.A) ≈ Aₐ
-true
-
-julia> mean(bed.η) ≈ 0.5
-true
-
-julia> bed.ηₘ ≈ 50.0
-true
-
-julia> bed.V ≈ Vₐ
-true
-
-julia> bed.τ ≈ Vₐ / Φ
-true

Validation of Kramers' model is provided here.

Finally a set of basic equations provided for process analysis.

diff --git a/dev/Modules/DryMaterials/index.html b/dev/Modules/DryMaterials/index.html index eae166a46..175852721 100644 --- a/dev/Modules/DryMaterials/index.html +++ b/dev/Modules/DryMaterials/index.html @@ -1,2 +1,2 @@ -DryMaterials · WallyToolbox.jl

DryMaterials

Solid Thermodynamics

Danger

The following sub-sections document structures and functions that are undergoing active development to harmonize all interfaces. Changes are expected to happen all the time before a common ground is found.

Laurent Polynomial Models

DryMaterials.SolidPolynomialPropertiesType

Arbitrary Laurent polynomial specific heat and enthalpy of materials.

  • c: Polynomial representation of specific heat [J/(kg.K)].

  • h: Polynomial representation of enthalpy [J/kg].

  • hₒ: Reference state enthalpy [J/kg].

source

Ongoing documentation

DryMaterials.SolidMineralPhaseType

Represents a solid mineral phase for thermodynamic calculations.

  • name: Name of phase.

  • ρ: Specific mass of phase [kg/m³].

  • M: Molecular mass of phase [kg/mol].

  • p: Polynomial properties of phase.

source

Hard-coded materials

+DryMaterials · WallyToolbox.jl

DryMaterials

Solid Thermodynamics

Danger

The following sub-sections document structures and functions that are undergoing active development to harmonize all interfaces. Changes are expected to happen all the time before a common ground is found.

Laurent Polynomial Models

DryMaterials.SolidPolynomialPropertiesType

Arbitrary Laurent polynomial specific heat and enthalpy of materials.

  • c: Polynomial representation of specific heat [J/(kg.K)].

  • h: Polynomial representation of enthalpy [J/kg].

  • hₒ: Reference state enthalpy [J/kg].

source

Ongoing documentation

DryMaterials.SolidMineralPhaseType

Represents a solid mineral phase for thermodynamic calculations.

  • name: Name of phase.

  • ρ: Specific mass of phase [kg/m³].

  • M: Molecular mass of phase [kg/mol].

  • p: Polynomial properties of phase.

source

Hard-coded materials

diff --git a/dev/Modules/OpenFOAM/index.html b/dev/Modules/OpenFOAM/index.html index 892f4af2a..3abf445c4 100644 --- a/dev/Modules/OpenFOAM/index.html +++ b/dev/Modules/OpenFOAM/index.html @@ -1,8 +1,8 @@ -OpenFOAM · WallyToolbox.jl

OpenFOAM

OpenFOAM.InjectionModelType

Represents a generic particle injection model.

Constraints imposed by OpenFOAM:

  • nParticle makes massFlowRate and massTotal to be ignored.

  • massTotal cannot be used in steady state simulations.

  • if flowRateProfile is not found a constant massFlowRate profile is computed from the ratio of massTotal and duration.

To-do:

  • Check if parcelBasisType from is applicable to derived types.
  • massFlowRate::Number: Particles mass flow rate if nParticle is not provided.

  • massTotal::Number: Total mass to be injected if nParticle is not provided.

  • SOI::Number: Start of injection in seconds (base).

  • duration::Number: Duration of injection in seconds (base).

  • nParticle::Number: Number of particles per parcel.

  • uniformParcelSize::UniformParcelSize: Quantity that is constant in parcels (base).

  • flowRateProfile::OpenFOAM.AbstractFlowRateProfile: Type of flow rate profile to apply.

source
OpenFOAM.PatchInjectionType

Represents a patch injection model.

  • name::String: Name to use in injection models list.

  • patchName::String: Patch where injection is applied.

  • injectionModel::InjectionModel: Object pointing to general injection model.

  • U0::Velocity: Particles injection velocity vector.

  • parcelsPerSecond::Number: Number of parcels injected per second.

  • sizeDistribution::OpenFOAM.AbstractSizeDistribution: Particle size distribution.

source
OpenFOAM.parcels_per_secondMethod
parcelstoinject2d(;
+OpenFOAM · WallyToolbox.jl

OpenFOAM

OpenFOAM.InjectionModelType

Represents a generic particle injection model.

Constraints imposed by OpenFOAM:

  • nParticle makes massFlowRate and massTotal to be ignored.

  • massTotal cannot be used in steady state simulations.

  • if flowRateProfile is not found a constant massFlowRate profile is computed from the ratio of massTotal and duration.

To-do:

  • Check if parcelBasisType from is applicable to derived types.
  • massFlowRate::Number: Particles mass flow rate if nParticle is not provided.

  • massTotal::Number: Total mass to be injected if nParticle is not provided.

  • SOI::Number: Start of injection in seconds (base).

  • duration::Number: Duration of injection in seconds (base).

  • nParticle::Number: Number of particles per parcel.

  • uniformParcelSize::UniformParcelSize: Quantity that is constant in parcels (base).

  • flowRateProfile::OpenFOAM.AbstractFlowRateProfile: Type of flow rate profile to apply.

source
OpenFOAM.PatchInjectionType

Represents a patch injection model.

  • name::String: Name to use in injection models list.

  • patchName::String: Patch where injection is applied.

  • injectionModel::InjectionModel: Object pointing to general injection model.

  • U0::Velocity: Particles injection velocity vector.

  • parcelsPerSecond::Number: Number of parcels injected per second.

  • sizeDistribution::OpenFOAM.AbstractSizeDistribution: Particle size distribution.

source
OpenFOAM.parcels_per_secondMethod
parcelstoinject2d(;
     mdot::Float64,
     rhop::Float64,
     diam::Float64,
     nParticle::Int64 = 1
-)

Computes the flow rate of parcels for a given mean particle size and number of particles per parcels. This is inteded as a helper to create a patchInjection element in the injectionModels of cloudProperties file.

source

Discrete phase models

We can verify the computation of number of parcels per second of sample case injectionChannel. Notice that the value of mdot has been reversed engineered so that it matches the expected value.

julia> parcels_per_second(; ṁ = 0.2, ρ = 1000.0, d = 650.0e-06, nParticle = 1)
-1390885
+)

Computes the flow rate of parcels for a given mean particle size and number of particles per parcels. This is inteded as a helper to create a patchInjection element in the injectionModels of cloudProperties file.

source

Discrete phase models

We can verify the computation of number of parcels per second of sample case injectionChannel. Notice that the value of mdot has been reversed engineered so that it matches the expected value.

julia> parcels_per_second(; ṁ = 0.2, ρ = 1000.0, d = 650.0e-06, nParticle = 1)
+1390885
diff --git a/dev/Modules/RadCalNet/index.html b/dev/Modules/RadCalNet/index.html index 13c46a314..6ba7045e3 100644 --- a/dev/Modules/RadCalNet/index.html +++ b/dev/Modules/RadCalNet/index.html @@ -1,5 +1,5 @@ -RadCalNet · WallyToolbox.jl

RadCalNet

Radiation properties machine learning model trained on RadCal.

In this project we use the re-implementation of RadCal Grosshandler1993 [11] to generate data and train a machine learning model for the prediction of radiative properties, i.e. emissivity and transmissivity, of common combustion flue gases.

This is done because for real-time calls of RADCAL might be computationally prohibitive, for instance in CFD applications. Thus, a neural network is trained with Flux based on the simulated data and this module provides an interface to call the network from external programs (Ansys Fluent, OpenFOAM, ...).

For details of validity ranges and sample space, please check function RadCalNet.datasampler!, where random sampling is provided. Indexing of species array is documented at RadCalNet.runradcalinput.

Below we display the quality of fitting of model. One must notice that fitting of emissivity still needs a few adjustments, while transmissivity is well predicted over the whole range.

Model testing

Usage

The following snippet illustrates everything the model was designed to do.

julia> using RadCalNet;
+RadCalNet · WallyToolbox.jl

RadCalNet

Radiation properties machine learning model trained on RadCal.

In this project we use the re-implementation of RadCal Grosshandler1993 [11] to generate data and train a machine learning model for the prediction of radiative properties, i.e. emissivity and transmissivity, of common combustion flue gases.

This is done because for real-time calls of RADCAL might be computationally prohibitive, for instance in CFD applications. Thus, a neural network is trained with Flux based on the simulated data and this module provides an interface to call the network from external programs (Ansys Fluent, OpenFOAM, ...).

For details of validity ranges and sample space, please check function RadCalNet.datasampler!, where random sampling is provided. Indexing of species array is documented at RadCalNet.runradcalinput.

Below we display the quality of fitting of model. One must notice that fitting of emissivity still needs a few adjustments, while transmissivity is well predicted over the whole range.

Model testing

Usage

The following snippet illustrates everything the model was designed to do.

julia> using RadCalNet;
 
 julia> x = Float32[1200.0; 1000.0; 2.0; 1.0; 0.1; 0.2; 0.1];
 
@@ -83,7 +83,7 @@
  0.68  0.00210072   0.00470752  0.0997078  71325.7        0.79875
  0.67  0.000770321  0.0101432   0.0812446      3.0696f5   0.815462
  0.7   0.00154008   0.0215186   0.253691   24945.7        0.478712
- 0.53  0.00133843   0.0180676   0.234852   21784.6        0.7443

To-do's

  • Broaden sample space over the whole RadCal composition spectrum.
  • Define data loading on GPU/CPU though a flag when recovering model.
  • Create database for testing outside of sampling points.
  • Improve model reload and organize a notebook for training.

Literature discussion

Verification agains Gorog's paper

Below we compare computed values with those by Gorog1981a [12]. Reference paper is found here.

Emissivity

Absorptivity

At least qualitative agreement is found and orders of magnitude are right. On the other hand, using directly the model parameters from Tam2019 [13] do not produce the expected results (not displayed, work in progress in this draft). It is not clear how the data is pre- and post-processed for use with their network.

All interfaces

RadCalNet.ModelDataType
ModelData(fpath::String; f_train::Float64 = 0.7)

Load HDF5 database stored under fpath and performs standardized workflow of data preparation for model training. The data is split under training and testing datasets with a fraction of training data of f_train.

  • scaler::StatsBase.ZScoreTransform{Float32, Vector{Float32}}: Scaler used for data transformation.

  • X_train::Matrix{Float32}: Matrix of training input data.

  • Y_train::Matrix{Float32}: Matrix of training output data.

  • X_tests::Matrix{Float32}: Matrix of testing input data.

  • Y_tests::Matrix{Float32}: Matrix of testing output data.

  • n_inputs::Int64: Number of model inputs.

  • n_outputs::Int64: Number of model outputs.

source
RadCalNet.ModelTrainerType
ModelTrainer(
+ 0.53  0.00133843   0.0180676   0.234852   21784.6        0.7443

To-do's

  • Broaden sample space over the whole RadCal composition spectrum.
  • Define data loading on GPU/CPU though a flag when recovering model.
  • Create database for testing outside of sampling points.
  • Improve model reload and organize a notebook for training.

Literature discussion

Verification agains Gorog's paper

Below we compare computed values with those by Gorog1981a [12]. Reference paper is found here.

Emissivity

Absorptivity

At least qualitative agreement is found and orders of magnitude are right. On the other hand, using directly the model parameters from Tam2019 [13] do not produce the expected results (not displayed, work in progress in this draft). It is not clear how the data is pre- and post-processed for use with their network.

All interfaces

RadCalNet.ModelDataType
ModelData(fpath::String; f_train::Float64 = 0.7)

Load HDF5 database stored under fpath and performs standardized workflow of data preparation for model training. The data is split under training and testing datasets with a fraction of training data of f_train.

  • scaler::StatsBase.ZScoreTransform{Float32, Vector{Float32}}: Scaler used for data transformation.

  • X_train::Matrix{Float32}: Matrix of training input data.

  • Y_train::Matrix{Float32}: Matrix of training output data.

  • X_tests::Matrix{Float32}: Matrix of testing input data.

  • Y_tests::Matrix{Float32}: Matrix of testing output data.

  • n_inputs::Int64: Number of model inputs.

  • n_outputs::Int64: Number of model outputs.

source
RadCalNet.ModelTrainerType
ModelTrainer(
     data::ModelData,
     model::Chain;
     batch::Int64=64,
@@ -91,7 +91,7 @@
     η::Float64=0.001,
     β::Tuple{Float64,Float64}=(0.9, 0.999),
     ϵ::Float64=1.0e-08
-)

Holds standardized model training parameters and data.

  • batch::Int64: Batch size in training loop.

  • epochs::Int64: Number of epochs to train each time.

  • data::RadCalNet.ModelData: Database structure used for training/testing.

  • model::Flux.Chain: Multi-layer perceptron used for modeling.

  • optim::NamedTuple: Internal Adam optimizer.

  • losses::Vector{Float32}: History of losses.

source
RadCalNet.createcustomdatabaseMethod
createcustomdatabase(;
+)

Holds standardized model training parameters and data.

  • batch::Int64: Batch size in training loop.

  • epochs::Int64: Number of epochs to train each time.

  • data::RadCalNet.ModelData: Database structure used for training/testing.

  • model::Flux.Chain: Multi-layer perceptron used for modeling.

  • optim::NamedTuple: Internal Adam optimizer.

  • losses::Vector{Float32}: History of losses.

source
RadCalNet.createcustomdatabaseMethod
createcustomdatabase(;
     sampler!::Function,
     repeats::Int64 = 100,
     samplesize::Int64 = 50_000,
@@ -100,11 +100,11 @@
     OMMIN::Float64 = 50.0,
     OMMAX::Float64 = 10000.0,
     override::Bool = false
-)

Creates a custom database by generating a number repeats of samples of samplesize rows. Inputs for runradcalinput are to be generated by a sampler! user-defined function which modifies in place an array of compositions, and returns T, L, P, FV, TWALL for setting up a simulation. Files are temporarilly stored under data/ with a sequential numbered naming during database creation and aggregated in a HDF5 file named after saveas. The choice to aggregate files after an initial dump is because generation can be interrupted and manually recovered in an easier way and avoiding any risk of data losses - database creation can take a very long time. If cleanup is true, all intermediate files are removed.

source
RadCalNet.datasampler!Method
datasampler!(X::Vector{Float64})::Tuple

Custom sample space to generate entries with createcustomdatabase. This function contains the parameter space used for model training.

source
RadCalNet.dumpscalerMethod
dumpscaler(scaler::ZScoreTransform{Float32,V32}, saveas::String)

Write z-score scaler mean and scale to provided saveas YAML file.

source
RadCalNet.getradcalnetMethod
getradcalnet(;
+)

Creates a custom database by generating a number repeats of samples of samplesize rows. Inputs for runradcalinput are to be generated by a sampler! user-defined function which modifies in place an array of compositions, and returns T, L, P, FV, TWALL for setting up a simulation. Files are temporarilly stored under data/ with a sequential numbered naming during database creation and aggregated in a HDF5 file named after saveas. The choice to aggregate files after an initial dump is because generation can be interrupted and manually recovered in an easier way and avoiding any risk of data losses - database creation can take a very long time. If cleanup is true, all intermediate files are removed.

source
RadCalNet.datasampler!Method
datasampler!(X::Vector{Float64})::Tuple

Custom sample space to generate entries with createcustomdatabase. This function contains the parameter space used for model training.

source
RadCalNet.dumpscalerMethod
dumpscaler(scaler::ZScoreTransform{Float32,V32}, saveas::String)

Write z-score scaler mean and scale to provided saveas YAML file.

source
RadCalNet.getradcalnetMethod
getradcalnet(;
     scale = true,
     fscaler = nothing,
     fmstate = nothing
-)

Load trained model and scaler to compose RadCalNet. If testing new models, it might be useful to use fscaler and fmstate to point to specific versions of scaler and model state files.

source
RadCalNet.makemodelMethod
makemodel(layers::Vector{Tuple{Int64, Any}}; bn = false)::Chain

Create a multi-layer perceptron for learning radiative properties with the provided layers. If bn is true, then batch normalization after each layer. The final layer has by default a sigmoid function to ensure physical outputs in range [0, 1].

source
RadCalNet.modelFunction
model(x::Vector{Float32})::Vector{Float32}

Main model interface for emissivity and transmissivity.

source
RadCalNet.plottestsMethod
plottests(trainer::ModelTrainer; num::Int64)

Evaluate model over num data points and compare the data to the expected values as computed from RadCal. Makes use of test data only - never seem by the model during training.

source
RadCalNet.runradcalinputMethod
runradcalinput(;
+)

Load trained model and scaler to compose RadCalNet. If testing new models, it might be useful to use fscaler and fmstate to point to specific versions of scaler and model state files.

source
RadCalNet.makemodelMethod
makemodel(layers::Vector{Tuple{Int64, Any}}; bn = false)::Chain

Create a multi-layer perceptron for learning radiative properties with the provided layers. If bn is true, then batch normalization after each layer. The final layer has by default a sigmoid function to ensure physical outputs in range [0, 1].

source
RadCalNet.modelFunction
model(x::Vector{Float32})::Vector{Float32}

Main model interface for emissivity and transmissivity.

source
RadCalNet.plottestsMethod
plottests(trainer::ModelTrainer; num::Int64)

Evaluate model over num data points and compare the data to the expected values as computed from RadCal. Makes use of test data only - never seem by the model during training.

source
RadCalNet.runradcalinputMethod
runradcalinput(;
     X::Dict{String, Float64} = Dict{String, Float64}(),
     T::Float64 = 300.0,
     L::Float64 = 1.0,
@@ -114,4 +114,4 @@
     OMMAX::Float64 = 10000.0,
     TWALL::Float64 = 500.0,
     radcalexe::String = "radcal_win_64.exe"
-)::Vector{Float64}

Create RADCAL.IN from template file and dump to disk.

NOTE: the user is responsible to provide a vector X of mole fractions of species that sums up to one. If this is not respected RADCAL fails. The Following list provides the indexes of available species in vector X.

IndexSpeciesIndexSpeciesIndexSpecies
1CO26C2H611CH3OH
2H2O7C3H612MMA
3CO8C3H813O2
4CH49C7H814N2
5C2H410C7H16
source
RadCalNet.trainonce!Method
trainonce!(trainer::ModelTrainer; num = 1_000)

Train model and keep track of loss for the number of epochs in trainer using its internal data and parameters. Use num data points.

source
+)::Vector{Float64}

Create RADCAL.IN from template file and dump to disk.

NOTE: the user is responsible to provide a vector X of mole fractions of species that sums up to one. If this is not respected RADCAL fails. The Following list provides the indexes of available species in vector X.

IndexSpeciesIndexSpeciesIndexSpecies
1CO26C2H611CH3OH
2H2O7C3H612MMA
3CO8C3H813O2
4CH49C7H814N2
5C2H410C7H16
source
RadCalNet.samplecolsMethod

Get sample of indexes for data retrieval.

source
RadCalNet.testsMethod

Get testing data for data loader construction.

source
RadCalNet.trainMethod

Get training data for data loader construction.

source
RadCalNet.trainonce!Method
trainonce!(trainer::ModelTrainer; num = 1_000)

Train model and keep track of loss for the number of epochs in trainer using its internal data and parameters. Use num data points.

source
diff --git a/dev/Notebooks/01-Composite-Conduction/index.html b/dev/Notebooks/01-Composite-Conduction/index.html index 96db69e0d..7484eab64 100644 --- a/dev/Notebooks/01-Composite-Conduction/index.html +++ b/dev/Notebooks/01-Composite-Conduction/index.html @@ -1,5 +1,5 @@ -Steady-state heat transfer · WallyToolbox.jl

Steady-state heat transfer

No further words, let's start by importing the required toolset:

using CairoMakie
+Steady-state heat transfer · WallyToolbox.jl

Steady-state heat transfer

No further words, let's start by importing the required toolset:

using CairoMakie
 using LinearAlgebra
 using Printf
 using Unitful
@@ -95,4 +95,4 @@
     xlims!(ax, (0.95, 3.05))
     ylims!(ax, (300, 350))
     fig
-end
+end
diff --git a/dev/Notebooks/02-Part-Radiation-Heating/index.html b/dev/Notebooks/02-Part-Radiation-Heating/index.html index c82b9f841..b86b789f4 100644 --- a/dev/Notebooks/02-Part-Radiation-Heating/index.html +++ b/dev/Notebooks/02-Part-Radiation-Heating/index.html @@ -1,5 +1,5 @@ -Transient heat transfer · WallyToolbox.jl

Transient heat transfer

No further words, let's start by importing the required toolset:

using CairoMakie
+Transient heat transfer · WallyToolbox.jl

Transient heat transfer

No further words, let's start by importing the required toolset:

using CairoMakie
 using LinearAlgebra
 using Printf
 using Unitful
@@ -170,4 +170,4 @@
     ylims!(ax2, extrema(ax2.yticks.val))
 
     fig
-end

Using ModelingToolkit

In the future...

+end

Using ModelingToolkit

In the future...

diff --git a/dev/Notebooks/03-Plug-Flow-Reactor-1/index.html b/dev/Notebooks/03-Plug-Flow-Reactor-1/index.html index 986f1f996..39e7ea33a 100644 --- a/dev/Notebooks/03-Plug-Flow-Reactor-1/index.html +++ b/dev/Notebooks/03-Plug-Flow-Reactor-1/index.html @@ -1,5 +1,5 @@ -Reator pistão · WallyToolbox.jl

Reator pistão

#plug-flow

Neste tópico abordamos modelos de reatores pistão em níveis progressivos de complexidade. Os modelos de reator estudados incluem em alguns casos aspectos voltados aos aspectos térmicos e em outros elementos de cinética química. O objetivo final é progressivamente introduzir complexidate em termos da física considerada, mas também em termos das estratégias numéricas empregadas na sua implementação

Indice de tópicos

Disponíveis atualmente

  • Introdução: solução térmica de um reator incompressível formulado em termos da temperatura. O objetivo é de realizar a introdução ao modelo de reator pistão sem entrar em detalhes involvendo não-linearidades como a dependência da densidade em termos da temperatura ou composição. Ademais, essa forma permite uma solução analítica. Introduz o uso de ModelingToolkit e do método dos volumes finitos.

  • Formulação entálpica do reator pistão: casos práticos de aplicação de reatores normalmente envolvem fluidos com propriedades que dependem da temperatura, especialmente o calor específico. Em geral a sua solução é tratada de forma mais conveniente com uma formulação em termos da entalpia. Continuamos com o mesmo caso elaborado no estudo introdutório modificando as equações para que a solução seja realizada com a entalpia como variável dependente.

Em fase de concepção

  • Reatores em contra corrente: o precedente para um par de reatores em contra-corrente.
  • Trocas em fluidos supercríticos: suporte à fluidos supercríticos (água, dióxido de carbono).

Planejados

  • O precedente generalizado para um sólido e um gás (compressível).
  • O precedente com coeficiente HTC dependente da posição.
  • O precedente com trocas térmicas com o ambiente externo.
  • O precedente com inclusão de perda de carga na fase gás.
  • O precedente com um modelo de trocas térmicas com meio poroso.
  • O precedente com um modelo de efeitos difusivos axiais no sólido.
  • O precedente com inclusão da entalpia de fusão no sólido.
  • O precedente com inclusão de cinética química no gás.

Introdução

Este é o primeiro notebook de uma série abordando reatores do tipo pistão (plug-flow) no qual os efeitos advectivos são preponderantes sobre o comportamento difusivo, seja de calor, massa, ou espécies. O estudo e modelagem desse tipo de reator apresentar diversos interesses para a pesquisa fundamental e na indústria. Muitos reatores tubulares de síntese laboratorial de materiais apresentam aproximadamente um comportamento como tal e processos nas mais diversas indústrias podem ser aproximados por um ou uma rede de reatores pistão e reatores agitados interconectados.

Começaremos por um caso simples considerando um fluido incompressível e ao longo da série aumentaremos progressivamente a complexidade dos modelos. Os notebooks nessa série vão utilizar uma estratégia focada nos resultados, o que indica que o código será na maior parte do tempo ocultado e o estudante interessado deverá executar o notebook por si mesmo para estudar as implementações.

Nesta Parte 1 vamos estuda a formulação na temperatura da equação de conservação de energia.

using WallyToolbox
+Reator pistão · WallyToolbox.jl

Reator pistão

#plug-flow

Neste tópico abordamos modelos de reatores pistão em níveis progressivos de complexidade. Os modelos de reator estudados incluem em alguns casos aspectos voltados aos aspectos térmicos e em outros elementos de cinética química. O objetivo final é progressivamente introduzir complexidate em termos da física considerada, mas também em termos das estratégias numéricas empregadas na sua implementação

Indice de tópicos

Disponíveis atualmente

  • Introdução: solução térmica de um reator incompressível formulado em termos da temperatura. O objetivo é de realizar a introdução ao modelo de reator pistão sem entrar em detalhes involvendo não-linearidades como a dependência da densidade em termos da temperatura ou composição. Ademais, essa forma permite uma solução analítica. Introduz o uso de ModelingToolkit e do método dos volumes finitos.

  • Formulação entálpica do reator pistão: casos práticos de aplicação de reatores normalmente envolvem fluidos com propriedades que dependem da temperatura, especialmente o calor específico. Em geral a sua solução é tratada de forma mais conveniente com uma formulação em termos da entalpia. Continuamos com o mesmo caso elaborado no estudo introdutório modificando as equações para que a solução seja realizada com a entalpia como variável dependente.

Em fase de concepção

  • Reatores em contra corrente: o precedente para um par de reatores em contra-corrente.
  • Trocas em fluidos supercríticos: suporte à fluidos supercríticos (água, dióxido de carbono).

Planejados

  • O precedente generalizado para um sólido e um gás (compressível).
  • O precedente com coeficiente HTC dependente da posição.
  • O precedente com trocas térmicas com o ambiente externo.
  • O precedente com inclusão de perda de carga na fase gás.
  • O precedente com um modelo de trocas térmicas com meio poroso.
  • O precedente com um modelo de efeitos difusivos axiais no sólido.
  • O precedente com inclusão da entalpia de fusão no sólido.
  • O precedente com inclusão de cinética química no gás.

Introdução

Este é o primeiro notebook de uma série abordando reatores do tipo pistão (plug-flow) no qual os efeitos advectivos são preponderantes sobre o comportamento difusivo, seja de calor, massa, ou espécies. O estudo e modelagem desse tipo de reator apresentar diversos interesses para a pesquisa fundamental e na indústria. Muitos reatores tubulares de síntese laboratorial de materiais apresentam aproximadamente um comportamento como tal e processos nas mais diversas indústrias podem ser aproximados por um ou uma rede de reatores pistão e reatores agitados interconectados.

Começaremos por um caso simples considerando um fluido incompressível e ao longo da série aumentaremos progressivamente a complexidade dos modelos. Os notebooks nessa série vão utilizar uma estratégia focada nos resultados, o que indica que o código será na maior parte do tempo ocultado e o estudante interessado deverá executar o notebook por si mesmo para estudar as implementações.

Nesta Parte 1 vamos estuda a formulação na temperatura da equação de conservação de energia.

using WallyToolbox
 
 using CairoMakie
 using DelimitedFiles
@@ -1007,4 +1007,4 @@
 #         axislegend(position = :rb)
 #         fig
 #     end
-# end
+# end
diff --git a/dev/Notebooks/04-Plug-Flow-Reactor-2/index.html b/dev/Notebooks/04-Plug-Flow-Reactor-2/index.html index 8dc6cce28..c81461926 100644 --- a/dev/Notebooks/04-Plug-Flow-Reactor-2/index.html +++ b/dev/Notebooks/04-Plug-Flow-Reactor-2/index.html @@ -1,2 +1,2 @@ -- · WallyToolbox.jl
+- · WallyToolbox.jl
diff --git a/dev/Notebooks/05-Random-Walk/index.html b/dev/Notebooks/05-Random-Walk/index.html index 1ea68d258..f4253be9c 100644 --- a/dev/Notebooks/05-Random-Walk/index.html +++ b/dev/Notebooks/05-Random-Walk/index.html @@ -1,5 +1,5 @@ -A simple random walker · WallyToolbox.jl

A simple random walker

using CairoMakie
+A simple random walker · WallyToolbox.jl

A simple random walker

using CairoMakie
 using Random
 using SpecialFunctions
 nothing; #hide
# Create a random number generator with a given seed.
@@ -137,4 +137,4 @@
     end
 end
 
-istrue
+istrue
diff --git a/dev/Notebooks/06-Heat-Transfer-FVM/index.html b/dev/Notebooks/06-Heat-Transfer-FVM/index.html index 2ce03451a..1d98552a6 100644 --- a/dev/Notebooks/06-Heat-Transfer-FVM/index.html +++ b/dev/Notebooks/06-Heat-Transfer-FVM/index.html @@ -1,5 +1,5 @@ -Heat transfer with FVM · WallyToolbox.jl

Heat transfer with FVM

using CairoMakie
+Heat transfer with FVM · WallyToolbox.jl

Heat transfer with FVM

using CairoMakie
 using DelaunayTriangulation
 using DifferentialEquations
 using FiniteVolumeMethod
@@ -90,4 +90,4 @@
 
     resize_to_layout!(fig)
     fig
-end
+end
diff --git a/dev/Notebooks/07-Air-Properties/index.html b/dev/Notebooks/07-Air-Properties/index.html index 81dc44a7e..3fa1ae764 100644 --- a/dev/Notebooks/07-Air-Properties/index.html +++ b/dev/Notebooks/07-Air-Properties/index.html @@ -1,5 +1,5 @@ -Fitting air properties · WallyToolbox.jl

Fitting air properties

In this note we show how to use Cantera to retrieve mixture properties for use in external simulations. This approach should be used only when composition dependency may be neglected or real-time evaluation becomes to expensive.

using WallyToolbox
+Fitting air properties · WallyToolbox.jl

Fitting air properties

In this note we show how to use Cantera to retrieve mixture properties for use in external simulations. This approach should be used only when composition dependency may be neglected or real-time evaluation becomes to expensive.

using WallyToolbox
 
 using CairoMakie
 using CondaPkg
@@ -695,4 +695,4 @@
 
     f, ax = plot_gas_properties(T, rets...)
     f
-end
+end
diff --git a/dev/Notebooks/08-Kramers-Model-Validation/index.html b/dev/Notebooks/08-Kramers-Model-Validation/index.html index fb9a48387..314afc653 100644 --- a/dev/Notebooks/08-Kramers-Model-Validation/index.html +++ b/dev/Notebooks/08-Kramers-Model-Validation/index.html @@ -1,6 +1,5 @@ -Kramers' model · WallyToolbox.jl

Kramers' model

using WallyToolbox
-using DryGranular
+Kramers' model · WallyToolbox.jl

Kramers' model

using WallyToolbox
 
 using CairoMakie
 using CSV
@@ -25,4 +24,4 @@
 This program contains Ipopt, a library for large-scale nonlinear optimization.
  Ipopt is released as open source code under the Eclipse Public License (EPL).
          For more information visit https://github.com/coin-or/Ipopt
-******************************************************************************

Sample reference case

Here we make use of the current implementation to check if it correctly approximates the last example provided in reference paper from [[@Kramers1952]]. To minimize rounding errors causes by unit conversions, we provide the required functions to convert from imperial to international system in the solution process.

The next table summarizes the results. It is seen that the dimensionless numbers are well approximated. It must be emphasized that the reference estimates η̄ᵣ by a graphical method – it was 1952 – and the current value is considered a good enough approximation. Additionally, the equation was not integrated numerically as done here, but engineering relationships were used in the approximation. That said, the proper loading to be considered in our days is η̄ᵢ.

4×3 DataFrame
RowQuantityReferenceComputed
StringStringString
11.151.15
2Nₖ1.171.17
3η̄ᵣ5.655.46
4η̄ᵢ4.995.91

Note: the last value in column Reference above is not provided in Kramers' paper but computed from the approximate analytical solution provided by the authors. As we see here, it may get >20% error under some circumstances.

Verification of Table 3

In the next cell we provide the kiln dimensions used by Kramers (1952) to experimentally validate the model. Some data from their Tab. 3 is then loaded and all rows are simulated with current model. Fractional hold-up seems to be well correlated at least to a few percent of the reference value.

12×5 DataFrame
Rowtan(β)nη̄ᵣη̄ᵢ
Float64Float64Float64Float64Float64
10.00940.0590.0051511.110.8
20.00940.090.002685.44.7
30.00940.1950.01328.88.9
40.00940.2320.007244.34.8
50.010.040.0063816.916.8
60.010.040.00514.413.9
70.010.0690.009215.014.6
80.010.0690.0065311.311.3
90.010.1060.01516.215.3
100.010.1590.0129.29.5
110.010.2380.01558.38.4
120.010.2380.01196.86.9

Dimensionless profiles

Next step in validation is to check profiles in dimensionless format, as done by Kramers in their Fig. 3. Notice that here we used the numerical integration curves instead of the analytical approximation of profiles, so reproduction and consequences of results are not exactly the same.

Comparison with analytical

The final step in model validation is to compare the approximate analytical solution proposed by Kramers and the results of numerical integration. It is worth mentioning that numerical integration remains the recommended method because one does not need to verify the ranges of validity of analytical approximation for every use case.

Industrial cases

The following illustrates a practical use case of the model. Next we scan a parameter space to confirm once again the model suitability as an alternative to analytical engineering estimations as per Perry's .

The following table confirms the expected values as per Perry's handbook.

4×5 DataFrame
Rowωη̄τᵢτₚ
Float64Float64Float64Float64Float64
133.60.8510.0203.0203.0
233.61.27.0141.0144.0
343.20.8513.0207.0203.0
443.21.29.0143.0144.0
+******************************************************************************

Sample reference case

Here we make use of the current implementation to check if it correctly approximates the last example provided in reference paper from [[@Kramers1952]]. To minimize rounding errors causes by unit conversions, we provide the required functions to convert from imperial to international system in the solution process.

The next table summarizes the results. It is seen that the dimensionless numbers are well approximated. It must be emphasized that the reference estimates η̄ᵣ by a graphical method – it was 1952 – and the current value is considered a good enough approximation. Additionally, the equation was not integrated numerically as done here, but engineering relationships were used in the approximation. That said, the proper loading to be considered in our days is η̄ᵢ.

4×3 DataFrame
RowQuantityReferenceComputed
StringStringString
11.151.15
2Nₖ1.171.17
3η̄ᵣ5.655.46
4η̄ᵢ4.995.91

Note: the last value in column Reference above is not provided in Kramers' paper but computed from the approximate analytical solution provided by the authors. As we see here, it may get >20% error under some circumstances.

Verification of Table 3

In the next cell we provide the kiln dimensions used by Kramers (1952) to experimentally validate the model. Some data from their Tab. 3 is then loaded and all rows are simulated with current model. Fractional hold-up seems to be well correlated at least to a few percent of the reference value.

12×5 DataFrame
Rowtan(β)nη̄ᵣη̄ᵢ
Float64Float64Float64Float64Float64
10.00940.0590.0051511.110.8
20.00940.090.002685.44.7
30.00940.1950.01328.88.9
40.00940.2320.007244.34.8
50.010.040.0063816.916.8
60.010.040.00514.413.9
70.010.0690.009215.014.6
80.010.0690.0065311.311.3
90.010.1060.01516.215.3
100.010.1590.0129.29.5
110.010.2380.01558.38.4
120.010.2380.01196.86.9

Dimensionless profiles

Next step in validation is to check profiles in dimensionless format, as done by Kramers in their Fig. 3. Notice that here we used the numerical integration curves instead of the analytical approximation of profiles, so reproduction and consequences of results are not exactly the same.

Comparison with analytical

The final step in model validation is to compare the approximate analytical solution proposed by Kramers and the results of numerical integration. It is worth mentioning that numerical integration remains the recommended method because one does not need to verify the ranges of validity of analytical approximation for every use case.

Industrial cases

The following illustrates a practical use case of the model. Next we scan a parameter space to confirm once again the model suitability as an alternative to analytical engineering estimations as per Perry's .

The following table confirms the expected values as per Perry's handbook.

4×5 DataFrame
Rowωη̄τᵢτₚ
Float64Float64Float64Float64Float64
133.60.8510.0203.0203.0
233.61.27.0141.0144.0
343.20.8513.0207.0203.0
443.21.29.0143.0144.0
diff --git a/dev/Notebooks/09-Thermodynamic-Props/index.html b/dev/Notebooks/09-Thermodynamic-Props/index.html index d443ec383..b7da513d6 100644 --- a/dev/Notebooks/09-Thermodynamic-Props/index.html +++ b/dev/Notebooks/09-Thermodynamic-Props/index.html @@ -1,5 +1,5 @@ -Thermodynamic properties · WallyToolbox.jl

Thermodynamic properties

using Revise
+Thermodynamic properties · WallyToolbox.jl

Thermodynamic properties

using Revise
 using WallyToolbox
 using CairoMakie
 
@@ -72,4 +72,4 @@
     test2 = log10(sum(abs2, cp2.(T) - c)) < -4
 
     test1 && test2
-end
+end
diff --git a/dev/Notebooks/10-Note-Sublatice-Model/index.html b/dev/Notebooks/10-Note-Sublatice-Model/index.html index d7c79289e..b20519fb7 100644 --- a/dev/Notebooks/10-Note-Sublatice-Model/index.html +++ b/dev/Notebooks/10-Note-Sublatice-Model/index.html @@ -1,5 +1,5 @@ -CALPHAD: site-fractions in 3 sublattice phase · WallyToolbox.jl

CALPHAD: site-fractions in 3 sublattice phase

In this notebook we show that a 3 sublattice phase with 2 components in a binary system introduces a new variable to the optimization, i.e. minimization of Gibbs energy, of the system.

Assume a phase such as $\gamma-AlMg$ with a model $(Mg)_{5}(Mg,Al)_{12}(Al,Mg)_{12}$. For simplicity in what follows we denote it as $(A)_{5}(A,B)_{12}(B,A)_{12}$.

The calculations are done under the framework of Symbolics.jl.

using Symbolics: @variables
+CALPHAD: site-fractions in 3 sublattice phase · WallyToolbox.jl

CALPHAD: site-fractions in 3 sublattice phase

In this notebook we show that a 3 sublattice phase with 2 components in a binary system introduces a new variable to the optimization, i.e. minimization of Gibbs energy, of the system.

Assume a phase such as $\gamma-AlMg$ with a model $(Mg)_{5}(Mg,Al)_{12}(Al,Mg)_{12}$. For simplicity in what follows we denote it as $(A)_{5}(A,B)_{12}(B,A)_{12}$.

The calculations are done under the framework of Symbolics.jl.

using Symbolics: @variables
 using Symbolics: substitute, simplify
 using Symbolics: solve_for

In terms of composition, such a binary system is defined by a single molar fraction of, say, component $A$, $x_A$, the amount of $x_B$ determined by balance:

@variables x_A
 
@@ -17,4 +17,4 @@
 expr2 = 29 * x_B - (5 * y_B1 + 12 * y_B2 + 12 * y_B3)
 nothing; #hide
expr1
expr2

From the constraints previously introduced, these expressions obviously add up to zero. We have nonetheless the constraint of $y_{A}^{(3)}$ in terms of $y_{A}^{(2)}$

y_A3_expr = solve_for(expr2, y_A3)

Which can be replaced in first expression and show the indeterminacy of the system:

mapping = Dict([y_A3 => y_A3_expr])
 
-simplify(substitute(expr1, mapping); expand=true)
+simplify(substitute(expr1, mapping); expand=true)
diff --git a/dev/Notebooks/A1-Julia-para-Cientistas/index.html b/dev/Notebooks/A1-Julia-para-Cientistas/index.html index 164b3efb4..86ac660bf 100644 --- a/dev/Notebooks/A1-Julia-para-Cientistas/index.html +++ b/dev/Notebooks/A1-Julia-para-Cientistas/index.html @@ -1,5 +1,5 @@ -Julia para Cientistas · WallyToolbox.jl

Julia para Cientistas

Julia from zero to hero com uma abordagem para computação científica.

Antes de entrar realmente nos tópicos de estudo listados abaixo, vamos falar um pouco sobre alguns elementos básicos para se seguir a série em relação a linguagem de programação Julia. Os conteúdos aqui apresentados são uma extensão daqueles providos pela JuliaAcademy em seu curso introdutório. O objetivo desta extensão é apresentar alguns elementos suplementares para a prática de computação científica. A temática de gráficos em Julia, será abordada em um tutorial distinto do curso no qual nos baseamos dada a necessidade de ir um pouco além na qualidade gráfica para publicações em journals.

Julia é uma linguagem sintaticamente similar à Python mas o estilo de programação tipicamente adotado tende a ser procedural com uso de estruturas e métodos para processar dados contidos nestas. Esta nova linguagem publicada pela primeira vez em 2012 vem ganhando grante momentum e uma comunidade bastante interessante na sua diversidade científica. Após alguns anos hesitando em me engajar no seu uso para aplicações em pesquisa em desenvolvimento, em 2023 fui convencido que é chegada hora de transferir parte dos estudos em Julia e então adaptar todos os conteúdos que produzo nesta linguagem.

Recomenda-se o estudo do presente tutorial de forma interativa em uma longa sessão de aproximadamente 4 horas de estudo. Após este primeiro contato, os tutorials mais complexos que se seguem se tornarão acessíveis mesmo para aqueles que estão tendo seu primeiro contato com computação. Este tutorial pode ao longo do estudo ser consultado para clarificar elementos da linguagem. Uma vez que se encontre confortável com o conteúdo aqui apresentado, recomenda-se estudar o manual da linguagem, o qual apresenta detalhes omitidos nesta introdução almejada para um primeiro contato.

Julia possui um largo ecossistema de pacotes implementado uma vasta gama de funcionalidades. Para conhecer mais não deixe de visitar Julia Packages.

Antes de começar, recomendo a leitura deste artigo.

Seguindo os materiais

Os conteúdos são majoritariamente sequenciais: exceto para os tópicos mais avançados (para aqueles que já programam em Julia), é necessário seguir os notebooks na ordem provida.

Um canal YouTube do curso está em fase de concepção para abordar os detalhes entre-linhas, involvendo aspectos que não necessariamente estão escritos.

Etapas à seguir para começar os estudos:

  1. Ler sobre ciência colaborativa abaixo para se familiarizar com alguns elementos que vamos abordar no que se segue.

  2. Instalar Julia na versão estável para seu sistema operacional.

  3. Instalar Pluto para visualizar e editar os notebooks do curso.

  4. Clonar este repositório com todos os materiais usando a seguinte ordem de prioridade:

    • Usando Git à través da linha de comando, forma recomendada com git clone https://github.com/wallytutor/medium-articles.git

    • Com a interface gráfica de GitHub Desktop

    • Usando o botão de Download

Caso a última opção de download tenha sido a sua escolha, observe que o arquivo .zip não contem os elementos de repositório git para controle de versão, implicando que as suas modificações e notas tomadas deverão ser geridas localmente, o que não é recomendável. Para estudantes ainda não familiarizados com git, a opção de utilizar GitHub Desktop é a mais apropriada.

Para aonde ir depois?

Para aprender mais

Julia Academy: nesta página encontram-se cursos abertos em várias temáticas comumente abordadas com a linguagem Julia. Você encontrará cursos parcialmente equivalentes aos materiais tratados aqui, mas também vários conteúdos que não são abordados nesta introdução, especialmente em tópicos ligados a Ciência de Dados.

Introduction to Computational Thinking: esse é provavelmente o melhor curso generalista para aplicações científicas da linguagem. O curso é ministrado inclusive pelo Pr. Dr. Alan Edelman um dos criadores de Julia. Os tópicos abordados vão de tratamento de imagens, séries temporais, a resolução de equações diferenciais parciais.

SciML Book: este livro é o resultado dos materiais de suporte do curso Parallel Computing and Scientific Machine Learning (SciML): Methods and Applications no MIT. Os tópicos são suportados por vídeo aulas e entram em mais profundidade nos assuntos avançados que tratamos aqui.

Exercism Julia Track: a plataforma Exercism propõe no percurso de Julia vários exercícios de algoritmos de nível fácil à intermediário-avançado. Minha recomendação é que essa prática venha a complementar os materiais propostos acima como forma de sedimentar o aprendizado da linguagem.

Julia Data Science: este livro complementa tópicos mais operacionais de análise de dados, especialemente técnicas básicas de Ciência de Dados, que omitimos neste curso. Um bom material complementar aos estudos.

Comunidade Julia

Julia Community Zulipchat: precisando de ajuda ou buscando um projeto para contribuir? Este chat aberto da comunidade Julia é o ponto de encontro para discutir acerca dos diferenter projetos e avanços na linguagem.

Julia Packages: o repositório mestre do índice de pacotes escritos na linguagem Julia ou provendo interfaces à outras ferramentas. A página contém um sistema de busca e um índice por temas.

JuliaHub: esta plataforma comercial provê tudo que é necessário para se passar da prototipagem à escala industrial de soluções concebidas em Julia. Atualmente é a norma em termos de escalabilidade para a linguagem.

Organizações recomendadas

SciML: pacotes para Machine Learning científico.

JuMP: uma linguagem de optimização matemática em Julia.

JuliaData: pacotes para Data Science em geral.

JuliaMolSim: simulação de dinâmica molecular em Julia.


Parte 1 - Primeiros passos

Tradicionalmente, o primeiro contato com uma linguagem de programação se faz através da implementação se seu programa Hello, World! que nada mas faz que imprimir esta sentença em um terminal. Em Julia usamos a função println() contendo o texto a ser apresentado entre aspas duplas (veremos mais sobre texto na próxima seção) para implementar este programa, como se segue:

println("Olá, Mundo!")
Olá, Mundo!

Tipos básicos

O interesse principal de programação é o fato de podermos atribuir valores à nomes e em seguida realizar a manipulação necessária. Uma vez implementado o algoritmo, podemos simplesmente modificar os valores e reutilizá-lo.

Esse processo chama-se atribuição de variáveis e é realizado utilizando o símbolo de igualdade = com o nome da variável à esquerda e seu valor a direita.

Cuidado

Veremos mais tarde que a comparação de igualdade se faz com um duplo sinal == e que devemos tomar cuidado com isso quando estamos tendo um primeiro contato com programação. A igualdade simples = é, na maioria das linguagens modernas, um símbolo de atribuição de valor.

Vamos criar uma variávei favorite_number_1 e atribuir seu valor:

favorite_number_1 = 13
13

Agora poderíamos realizar operações com favorite_number_1. Faremos isso mais tarde com outras variáveis porque antes é importante de introduzirmos o conceito de tipos. Toda variável é de um dado tipo de dado, o que implica o tamanho (fixo ou variável) de sua representação na memória do computador. Com a função typeof() inspecionamos o tipo de uma variável.

Vemos que o tipo de 13 – um número inteiro – é representado em Julia por Int64.

typeof(favorite_number_1)
Int64

Existem diversos tipos numéricos suportados por Julia, mas aqui vamos ver somente os tipos básicos utilizados mais comumente em computação numérica. Atribuindo um valor aproximado de π a favorite_number_2 obtemos um objeto de tipo Float64, utilizado para representar números reais em dupla precisão.

Aritmética de ponto flutuante de dupla precisão

A maioria dos números reais não podem ser representados com precisão arbitrária em um computador. Um número real em dupla precisão é representado com 64 bits na memória. Representações de precisão arbitrária são hoje em dia disponíveis mas tem um custo de operação proibitivo para a maioria das aplicações. A matemática necessária para a compreensão da representação na memória é discutida no livro texto.

favorite_number_2 = 3.141592
+Julia para Cientistas · WallyToolbox.jl

Julia para Cientistas

Julia from zero to hero com uma abordagem para computação científica.

Antes de entrar realmente nos tópicos de estudo listados abaixo, vamos falar um pouco sobre alguns elementos básicos para se seguir a série em relação a linguagem de programação Julia. Os conteúdos aqui apresentados são uma extensão daqueles providos pela JuliaAcademy em seu curso introdutório. O objetivo desta extensão é apresentar alguns elementos suplementares para a prática de computação científica. A temática de gráficos em Julia, será abordada em um tutorial distinto do curso no qual nos baseamos dada a necessidade de ir um pouco além na qualidade gráfica para publicações em journals.

Julia é uma linguagem sintaticamente similar à Python mas o estilo de programação tipicamente adotado tende a ser procedural com uso de estruturas e métodos para processar dados contidos nestas. Esta nova linguagem publicada pela primeira vez em 2012 vem ganhando grante momentum e uma comunidade bastante interessante na sua diversidade científica. Após alguns anos hesitando em me engajar no seu uso para aplicações em pesquisa em desenvolvimento, em 2023 fui convencido que é chegada hora de transferir parte dos estudos em Julia e então adaptar todos os conteúdos que produzo nesta linguagem.

Recomenda-se o estudo do presente tutorial de forma interativa em uma longa sessão de aproximadamente 4 horas de estudo. Após este primeiro contato, os tutorials mais complexos que se seguem se tornarão acessíveis mesmo para aqueles que estão tendo seu primeiro contato com computação. Este tutorial pode ao longo do estudo ser consultado para clarificar elementos da linguagem. Uma vez que se encontre confortável com o conteúdo aqui apresentado, recomenda-se estudar o manual da linguagem, o qual apresenta detalhes omitidos nesta introdução almejada para um primeiro contato.

Julia possui um largo ecossistema de pacotes implementado uma vasta gama de funcionalidades. Para conhecer mais não deixe de visitar Julia Packages.

Antes de começar, recomendo a leitura deste artigo.

Seguindo os materiais

Os conteúdos são majoritariamente sequenciais: exceto para os tópicos mais avançados (para aqueles que já programam em Julia), é necessário seguir os notebooks na ordem provida.

Um canal YouTube do curso está em fase de concepção para abordar os detalhes entre-linhas, involvendo aspectos que não necessariamente estão escritos.

Etapas à seguir para começar os estudos:

  1. Ler sobre ciência colaborativa abaixo para se familiarizar com alguns elementos que vamos abordar no que se segue.

  2. Instalar Julia na versão estável para seu sistema operacional.

  3. Instalar Pluto para visualizar e editar os notebooks do curso.

  4. Clonar este repositório com todos os materiais usando a seguinte ordem de prioridade:

    • Usando Git à través da linha de comando, forma recomendada com git clone https://github.com/wallytutor/medium-articles.git

    • Com a interface gráfica de GitHub Desktop

    • Usando o botão de Download

Caso a última opção de download tenha sido a sua escolha, observe que o arquivo .zip não contem os elementos de repositório git para controle de versão, implicando que as suas modificações e notas tomadas deverão ser geridas localmente, o que não é recomendável. Para estudantes ainda não familiarizados com git, a opção de utilizar GitHub Desktop é a mais apropriada.

Para aonde ir depois?

Para aprender mais

Julia Academy: nesta página encontram-se cursos abertos em várias temáticas comumente abordadas com a linguagem Julia. Você encontrará cursos parcialmente equivalentes aos materiais tratados aqui, mas também vários conteúdos que não são abordados nesta introdução, especialmente em tópicos ligados a Ciência de Dados.

Introduction to Computational Thinking: esse é provavelmente o melhor curso generalista para aplicações científicas da linguagem. O curso é ministrado inclusive pelo Pr. Dr. Alan Edelman um dos criadores de Julia. Os tópicos abordados vão de tratamento de imagens, séries temporais, a resolução de equações diferenciais parciais.

SciML Book: este livro é o resultado dos materiais de suporte do curso Parallel Computing and Scientific Machine Learning (SciML): Methods and Applications no MIT. Os tópicos são suportados por vídeo aulas e entram em mais profundidade nos assuntos avançados que tratamos aqui.

Exercism Julia Track: a plataforma Exercism propõe no percurso de Julia vários exercícios de algoritmos de nível fácil à intermediário-avançado. Minha recomendação é que essa prática venha a complementar os materiais propostos acima como forma de sedimentar o aprendizado da linguagem.

Julia Data Science: este livro complementa tópicos mais operacionais de análise de dados, especialemente técnicas básicas de Ciência de Dados, que omitimos neste curso. Um bom material complementar aos estudos.

Comunidade Julia

Julia Community Zulipchat: precisando de ajuda ou buscando um projeto para contribuir? Este chat aberto da comunidade Julia é o ponto de encontro para discutir acerca dos diferenter projetos e avanços na linguagem.

Julia Packages: o repositório mestre do índice de pacotes escritos na linguagem Julia ou provendo interfaces à outras ferramentas. A página contém um sistema de busca e um índice por temas.

JuliaHub: esta plataforma comercial provê tudo que é necessário para se passar da prototipagem à escala industrial de soluções concebidas em Julia. Atualmente é a norma em termos de escalabilidade para a linguagem.

Organizações recomendadas

SciML: pacotes para Machine Learning científico.

JuMP: uma linguagem de optimização matemática em Julia.

JuliaData: pacotes para Data Science em geral.

JuliaMolSim: simulação de dinâmica molecular em Julia.


Parte 1 - Primeiros passos

Tradicionalmente, o primeiro contato com uma linguagem de programação se faz através da implementação se seu programa Hello, World! que nada mas faz que imprimir esta sentença em um terminal. Em Julia usamos a função println() contendo o texto a ser apresentado entre aspas duplas (veremos mais sobre texto na próxima seção) para implementar este programa, como se segue:

println("Olá, Mundo!")
Olá, Mundo!

Tipos básicos

O interesse principal de programação é o fato de podermos atribuir valores à nomes e em seguida realizar a manipulação necessária. Uma vez implementado o algoritmo, podemos simplesmente modificar os valores e reutilizá-lo.

Esse processo chama-se atribuição de variáveis e é realizado utilizando o símbolo de igualdade = com o nome da variável à esquerda e seu valor a direita.

Cuidado

Veremos mais tarde que a comparação de igualdade se faz com um duplo sinal == e que devemos tomar cuidado com isso quando estamos tendo um primeiro contato com programação. A igualdade simples = é, na maioria das linguagens modernas, um símbolo de atribuição de valor.

Vamos criar uma variávei favorite_number_1 e atribuir seu valor:

favorite_number_1 = 13
13

Agora poderíamos realizar operações com favorite_number_1. Faremos isso mais tarde com outras variáveis porque antes é importante de introduzirmos o conceito de tipos. Toda variável é de um dado tipo de dado, o que implica o tamanho (fixo ou variável) de sua representação na memória do computador. Com a função typeof() inspecionamos o tipo de uma variável.

Vemos que o tipo de 13 – um número inteiro – é representado em Julia por Int64.

typeof(favorite_number_1)
Int64

Existem diversos tipos numéricos suportados por Julia, mas aqui vamos ver somente os tipos básicos utilizados mais comumente em computação numérica. Atribuindo um valor aproximado de π a favorite_number_2 obtemos um objeto de tipo Float64, utilizado para representar números reais em dupla precisão.

Aritmética de ponto flutuante de dupla precisão

A maioria dos números reais não podem ser representados com precisão arbitrária em um computador. Um número real em dupla precisão é representado com 64 bits na memória. Representações de precisão arbitrária são hoje em dia disponíveis mas tem um custo de operação proibitivo para a maioria das aplicações. A matemática necessária para a compreensão da representação na memória é discutida no livro texto.

favorite_number_2 = 3.141592
 typeof(favorite_number_2)
Float64

Uma particularidade de Julia dado o seu caráter científico é o suporte à números irracionais. Podemos assim representar π de maneira otimizada como discutiremos num momento oportuno.

Caracteres especiais

Julia suporta progração usando quaisquer caractéres UNICODE. Isso inclui letras gregas, subscritos, símbolos matemáticos... Em notebooks Pluto ou em editores conectados à um Julia Language Server podemos entrar esses símbolos digitando seu equivalente em $\LaTeX$ e pressionando a tecla <TAB>. Uma lista detalhada de caracteres suportados é apresentada aqui.

favorite_number_3 = π
 typeof(favorite_number_3)
Irrational{:π}

Por exemplo, também temos o número de Euler representado como irracional. Como este número é representado pela letra e, para evitar conflitos com outras variáveis ele precisa ser acessado pelo caminho completo do módulo definindo as constantes matemáticas.

favorite_number_4 = MathConstants.e
 typeof(favorite_number_4)
Irrational{:ℯ}

Outro exemplo de constante irracional é a proporção áurea.

Base.MathConstants.golden
φ = 1.6180339887498...

A lista completa pode ser acessada com names(module) como se segue:

names(MathConstants)
10-element Vector{Symbol}:
@@ -57,7 +57,7 @@
     languages[2] = "C++"
 catch err
     println("Erro: $(err)")
-end
Erro: MethodError(setindex!, (("Julia", "Python", "Octave"), "C++", 2), 0x0000000000007e05)

Existem certas subtilidades que você precisa saber sobre a imutabilidade. Observe o exemplo abaixo, aonde declaramos duas variáveis que são utilizadas para construir uma Tuple e então modificamos uma das variáveis: a Tuple continua com os valores originais do momento da sua construção.

let
+end
Erro: MethodError(setindex!, (("Julia", "Python", "Octave"), "C++", 2), 0x0000000000007e04)

Existem certas subtilidades que você precisa saber sobre a imutabilidade. Observe o exemplo abaixo, aonde declaramos duas variáveis que são utilizadas para construir uma Tuple e então modificamos uma das variáveis: a Tuple continua com os valores originais do momento da sua construção.

let
     a = 1
     b = 2
 
@@ -176,4 +176,4 @@
 #     ]
 #     scalability
 # end

O vetor with_conversion contém os tempos de execução para a criação de vetores de 1, 10, 100, 1000 e 10000 elementos com conversão de valores de inteiros para dupla-precisão. Observe que os dois primeiros elementos levaram um tempo (aqui em nano-segundos) quase idênticos: existe uma constante de tempo da criação do vetor propriamente dito, a criação dos 10 primeiros elementos é quase negligível nesse caso.

Abaixo calculamos a diferença de tempo entre os dois processos e nos deparamos com mais uma surpresa: para 100 elementos, o tempo de alocação COM conversão é MENOR que o tempo SEM conversão. Ainda é muito cedo e fora de contexto para entrarmos no código LLVM gerado por Julia para entendermos a razão dessa anomalia. O importante a reter aqui é que para vetores de tamanhos importantes (> 1000 elementos) um tempo adicional de execução é adicionado por elemento e isso deve ser levado em conta quando escrevendo código científico.

# time_diff = (without_conversion - with_conversion)
-# time_diff_per_element = time_diff ./ [10^k for k = 0:3]

Espero que a decisão de incluir essas divagações um pouco cedo no aprendizado não sejam deletérias para a motivação do estudante, mas que criem curiosidade quanto aos tópicos mais avançados que veremos mais tarde.

Ainda falta muito para se concluir a introdução à atribuição de tipos, mas esse primeiro contato era necessário para que as próximos tópicos avancem de maneira mais fluida.


Parte 5 - Laços e condicionais


Parte 6 - Funções e despacho


Parte 7 - Pacotes e ecossistema


Parte 8 - Avaliando performance


Parte 9 - Álgebra linear


Parte 10 - Expressões regulares


Parte 11 - Execução concorrente


Parte 12 - Trabalhando com arquivos


Parte 13 - Bibliotecas gráficas


Parte 14 - Gráficos para publicações


Parte 15 - Tipos e estruturas


Parte 16 - Metaprogramação


Parte 17 - Interoperação com C


Criando conteúdos

+# time_diff_per_element = time_diff ./ [10^k for k = 0:3]

Espero que a decisão de incluir essas divagações um pouco cedo no aprendizado não sejam deletérias para a motivação do estudante, mas que criem curiosidade quanto aos tópicos mais avançados que veremos mais tarde.

Ainda falta muito para se concluir a introdução à atribuição de tipos, mas esse primeiro contato era necessário para que as próximos tópicos avancem de maneira mais fluida.


Parte 5 - Laços e condicionais


Parte 6 - Funções e despacho


Parte 7 - Pacotes e ecossistema


Parte 8 - Avaliando performance


Parte 9 - Álgebra linear


Parte 10 - Expressões regulares


Parte 11 - Execução concorrente


Parte 12 - Trabalhando com arquivos


Parte 13 - Bibliotecas gráficas


Parte 14 - Gráficos para publicações


Parte 15 - Tipos e estruturas


Parte 16 - Metaprogramação


Parte 17 - Interoperação com C


Criando conteúdos

diff --git a/dev/Notebooks/A2-Ciencia-Colaborativa-e-Julia/index.html b/dev/Notebooks/A2-Ciencia-Colaborativa-e-Julia/index.html index 2e3f6ea6d..7a0da74a2 100644 --- a/dev/Notebooks/A2-Ciencia-Colaborativa-e-Julia/index.html +++ b/dev/Notebooks/A2-Ciencia-Colaborativa-e-Julia/index.html @@ -1,2 +1,2 @@ -Ciência colaborativa e Julia · WallyToolbox.jl

Ciência colaborativa e Julia

Uma dificuldade recorrente encontrada em projetos científicos contendo uma componente numérica é o despreparo dos colaboradores para a gestão de dados e documentos. Essa dificuldade não é somente técnica, mas frequentemente a origem de discórdias nos projetos.

O estudo de Julia ou qualquer outra ferramenta para suporte computacional em ciência não tem sentido sem o caráter aplicativo no contexto de um projeto, seja ele acadêmico ou industrial. Neste anexo vamos abordar algumas ferramentas complementares ao uso de Julia úteis para o cientista e apontar os caminhos para encontrá-las e aprender mais sobre elas sem entrar nos detalhes de seus usos. A lista provida não é exaustiva mas contém um esqueleto mínimo que toda pesquisa séria deveria adotar para prover materiais com controle de qualidade e versionagem adequada.

Para estudar aspectos computacionais em ciência você precisa de alguns componentes de suporte à linguagem de programação usada, em nosso caso Julia. No que se segue vamos apresentar:

  • O editor de texto recomendado VS Code e a extensão requerida.
  • A linguagem $\LaTeX$ usada para a entrada de equações nos notebooks e artigos.
  • As ferramentas necessárias para editar $\LaTeX$ fora do contexto de Julia.
  • E finalmente o sistema de versionagem Git.
  • Outras ferramentas de suporte.

VS Code

Nos últimos anos VSCode se tornou o editor mais popular da comunidade open source e com toda razão. A qualidade da ferramenta provida pela Microsoft chegou a um nível que é difícil justificar o uso de um editor de código comercial. Aliado a isso, com a extensão Julia VSCode um suporte avançado a edição de código e documentação da linguagem é disponível. Além disso, a ferramenta provê integração com o sistema de controle de versões Git que vamos discutir no que se segue.

$\LaTeX$

Para a entrada de equações nos notebooks, Julia markdown provê suporte à renderização de $\LaTeX$. É fundamental ter algum domínio desta linguagem para a elaborção de documentos científicos. As distribuições mais populares são MiKTeX para Windows e TeX Live para os demais sistemas operacionais. Ademais, artigos escritos usando a linguagem são aceitos pelas publicações mais relevantes em várias áreas do conhecimento. Outra razão para o uso de $\LaTeX$ é a estocagem de documentos em formato de texto bruto, o que permite um controle de versões com Git.

TeXStudio

Em complemento à distribuição de $\LaTeX$ é necessário um editor de texto adaptado. Embora existam extensões excelentes para realizar a compilação dos documentos [1] para VS Code, elas não são muito fáceis de se compreender para um iniciante. Por isso recomendamos TeXStudio para editar e compilar documentos escritos em $\LaTeX$.

JabRef

Embora as referências bibliográficas possam ser inseridas diretamente em documentos $\LaTeX$, o ideal é utilizar uma base de dados comum que possa ser reutilizada ao longo da carreira de pesquisa. JabRef é um gestor de bibliografia para o formato $BibTeX$ suportado por $\LaTeX$ que estoca dados diretamente em formato textual. A interface gráfica é fácil de interagir e dado o formato de documento, as bases .bib são compatíveis com Git.

Git

Falamos bastante em Git até o momento sem entrar em mais detalhes de que é uma ferramenta de controle de versões. Git elimina a prática insana de se salvar manualmente várias cópias de um mesmo documento para gerir versões. O sistema basea-se na comparação de conteúdos e propõe de se salvar unicamente os documentos modificados em um projeto. Embora seu uso básico seja bastante simples e plausível de se aprender em uma tarde de estudo, a ferramenta é bastante complexa e complexa, permitindo de voltar em pontos históricos de um projeto, publicar releases, etc. Para uma pesquisa sã e durável, o uso de documentos em formatos aceitando texto bruto em conjunto com Git é ideal.

Python

Embora esse seja um curso de Julia, é importante que o cientista também tenha conhecimento de Python. Python é uma linguagem generalista que também é bastante rica em termos de pacotes para aplicações científicas. Em termos de aprendizado é relativamente mais simples que Julia, com o porém que código nativo em Python é extremamente lento, requerindo sempre o uso de bibliotecas que na verdade são implementadas em C, Fortran, Rust, etc. Para a concepção de aplicações web especialmente a linguagem encontra-se num estado de maturidade bastante superior à Julia e não deve ser negligenciada. Ademais, encontra-se entre as linguagens mais utilizadas no mundo, enquanto Julia é uma linguagem de nicho.

GNUPlot

Embora tratemos da temática de gráficos para publicações no curso, uma alternativa sempre é interessante. GNUPlot é uma ferramenta open source contando com sua própria linguagem para geração de gráficos. É uma ferramenta interessante principalmente quando se deseja padronizar todas as figuras em um projeto através de arquivos de configuração.

  • 1Por compilação entende-se em nossos dias transformar o documento em PDF.
+Ciência colaborativa e Julia · WallyToolbox.jl

Ciência colaborativa e Julia

Uma dificuldade recorrente encontrada em projetos científicos contendo uma componente numérica é o despreparo dos colaboradores para a gestão de dados e documentos. Essa dificuldade não é somente técnica, mas frequentemente a origem de discórdias nos projetos.

O estudo de Julia ou qualquer outra ferramenta para suporte computacional em ciência não tem sentido sem o caráter aplicativo no contexto de um projeto, seja ele acadêmico ou industrial. Neste anexo vamos abordar algumas ferramentas complementares ao uso de Julia úteis para o cientista e apontar os caminhos para encontrá-las e aprender mais sobre elas sem entrar nos detalhes de seus usos. A lista provida não é exaustiva mas contém um esqueleto mínimo que toda pesquisa séria deveria adotar para prover materiais com controle de qualidade e versionagem adequada.

Para estudar aspectos computacionais em ciência você precisa de alguns componentes de suporte à linguagem de programação usada, em nosso caso Julia. No que se segue vamos apresentar:

  • O editor de texto recomendado VS Code e a extensão requerida.
  • A linguagem $\LaTeX$ usada para a entrada de equações nos notebooks e artigos.
  • As ferramentas necessárias para editar $\LaTeX$ fora do contexto de Julia.
  • E finalmente o sistema de versionagem Git.
  • Outras ferramentas de suporte.

VS Code

Nos últimos anos VSCode se tornou o editor mais popular da comunidade open source e com toda razão. A qualidade da ferramenta provida pela Microsoft chegou a um nível que é difícil justificar o uso de um editor de código comercial. Aliado a isso, com a extensão Julia VSCode um suporte avançado a edição de código e documentação da linguagem é disponível. Além disso, a ferramenta provê integração com o sistema de controle de versões Git que vamos discutir no que se segue.

$\LaTeX$

Para a entrada de equações nos notebooks, Julia markdown provê suporte à renderização de $\LaTeX$. É fundamental ter algum domínio desta linguagem para a elaborção de documentos científicos. As distribuições mais populares são MiKTeX para Windows e TeX Live para os demais sistemas operacionais. Ademais, artigos escritos usando a linguagem são aceitos pelas publicações mais relevantes em várias áreas do conhecimento. Outra razão para o uso de $\LaTeX$ é a estocagem de documentos em formato de texto bruto, o que permite um controle de versões com Git.

TeXStudio

Em complemento à distribuição de $\LaTeX$ é necessário um editor de texto adaptado. Embora existam extensões excelentes para realizar a compilação dos documentos [1] para VS Code, elas não são muito fáceis de se compreender para um iniciante. Por isso recomendamos TeXStudio para editar e compilar documentos escritos em $\LaTeX$.

JabRef

Embora as referências bibliográficas possam ser inseridas diretamente em documentos $\LaTeX$, o ideal é utilizar uma base de dados comum que possa ser reutilizada ao longo da carreira de pesquisa. JabRef é um gestor de bibliografia para o formato $BibTeX$ suportado por $\LaTeX$ que estoca dados diretamente em formato textual. A interface gráfica é fácil de interagir e dado o formato de documento, as bases .bib são compatíveis com Git.

Git

Falamos bastante em Git até o momento sem entrar em mais detalhes de que é uma ferramenta de controle de versões. Git elimina a prática insana de se salvar manualmente várias cópias de um mesmo documento para gerir versões. O sistema basea-se na comparação de conteúdos e propõe de se salvar unicamente os documentos modificados em um projeto. Embora seu uso básico seja bastante simples e plausível de se aprender em uma tarde de estudo, a ferramenta é bastante complexa e complexa, permitindo de voltar em pontos históricos de um projeto, publicar releases, etc. Para uma pesquisa sã e durável, o uso de documentos em formatos aceitando texto bruto em conjunto com Git é ideal.

Python

Embora esse seja um curso de Julia, é importante que o cientista também tenha conhecimento de Python. Python é uma linguagem generalista que também é bastante rica em termos de pacotes para aplicações científicas. Em termos de aprendizado é relativamente mais simples que Julia, com o porém que código nativo em Python é extremamente lento, requerindo sempre o uso de bibliotecas que na verdade são implementadas em C, Fortran, Rust, etc. Para a concepção de aplicações web especialmente a linguagem encontra-se num estado de maturidade bastante superior à Julia e não deve ser negligenciada. Ademais, encontra-se entre as linguagens mais utilizadas no mundo, enquanto Julia é uma linguagem de nicho.

GNUPlot

Embora tratemos da temática de gráficos para publicações no curso, uma alternativa sempre é interessante. GNUPlot é uma ferramenta open source contando com sua própria linguagem para geração de gráficos. É uma ferramenta interessante principalmente quando se deseja padronizar todas as figuras em um projeto através de arquivos de configuração.

  • 1Por compilação entende-se em nossos dias transformar o documento em PDF.
diff --git a/dev/Notebooks/Pluto/kramers-model-demo.jl b/dev/Notebooks/Pluto/kramers-model-demo.jl index b0372215b..4ebffac39 100644 --- a/dev/Notebooks/Pluto/kramers-model-demo.jl +++ b/dev/Notebooks/Pluto/kramers-model-demo.jl @@ -29,7 +29,6 @@ begin using PlutoUI using WallyToolbox - using DryGranular @info "Initializing parameters..." # Geometry diff --git a/dev/Notes/Brain/index.html b/dev/Notes/Brain/index.html index 121326efc..574edaaa6 100644 --- a/dev/Notes/Brain/index.html +++ b/dev/Notes/Brain/index.html @@ -1,5 +1,5 @@ -Excalidraw Data · WallyToolbox.jl

excalidraw-plugin: parsed tags: [excalidraw]


==⚠ Switch to EXCALIDRAW VIEW in the MORE OPTIONS menu of this document. ⚠==

Excalidraw Data

Text Elements

Brain ^bA0uK4HU

PINNs ^Pn47WBnc

Solve kiln model ^92u72gv3

ROMs ^r9eGuIr4

Harmonic Oscillator (from Brunton) ^n90Bs0Ht

Interop ^XLzsMIc3

Add Fortran, Julia, and Python interfaces to RK4 in C ^6K7UnJNp

Productivity ^bsV0my5p

Article comparing Weave, Frankling, Pluto and Jupyter for scientific computing. Maybe nteract ^RfeTVfZo

Computer vision ^559Ywru9

Introductory porosity quantification in Julia ^rhMvGIOj

Region properties of segmented pores ^Aqasmef7

ML ^HKk6xNwl

ANNs ^qKP1VQdM

Article about training RADCAL in Julia and package creation ^nC0nVVtR

Science and Computing 101 ^JWFx8npJ

Undergrad courses ^F7M8Zx94

Publishing with LaTeX 101 ^HKwKy0Eb

Shell and Linux 101 ^Z6h5wrlV

Tabular data in Python 101 ^xaKa9dGT

Automating visualization ^ObWvvjKj

GraphViz and Gnuplot for dummies ^ftoPgCWk

Matplotlib in 2h ^pPiz5TQQ

Carburizing model from PhD ^XhzzmGRp

Transport ^tCXg2mu8

Julia for Scientists ^ez3zXh1d

Basic module ^HA9n1RFk

Advanced module ^MWT5lLdz

Calphad ^C4woGMbZ

Article about detecting corners and rectangles ^xRElE6D0

OpenFOAM ^iMcRf8e2

DWSIM ^Nhq5Bdy8

Energy balanced CaCO3 calcination reaction ^NPleQcWs

Progressive PFRs ^egcFwZrB

Julia CFD ^U4ZPcmuq

Fundamentals of numerical methods ^0NhTSDQ9

Advection equation ^6KfA6RYV

Diffusion equation ^9SEZI47q

Diffusion-reaction ^P1m4LpEH

Burgers equation ^pv23Y9ct

Laplace and Poisson equations ^YHSNiC85

Navier-Stokes equations ^67lUEZ2l

Finite Volume Method ^0gX1MsRw

Article re-implementing Tomasini (2014) in Julia ^nrS1JnEA

Call OpenCALPHAD from Julia ^nLy6i1pF

CAS system ^9SNwCKSp

CaO-SiO2 ^9mh8UBUe

Al2O3-SiO2 ^125sLdxw

Al2O3-CaO ^NskFV0Yj

FEM ^t6SMVOto

DryTooling Tech ^1wnL2zxG

DryTooling.jl ^5NbIV4lV

Training ^7BAW44HS

Python for Engineers ^K5Ye0cxI

Physics-based MPC with CasADi ^tJsZLXvE

Data analysis with SciPy stack ^yOM0oEMa

Dashboards with streamlit ^I9xk1J9l

CFD post-processing with PyVista ^Bl3RsRQt

Julia for Engineers ^58Qs0CFa

Dynamical systems with ModelingToolkit.jl ^Mo2M8E43

Optimization with JuMP.jl ^ZHncvBfB

Dashboards with Genie.jl ^wB6NrZ9N

Consulting ^jEUettuQ

Process Simulation ^UlQvskQU

OpenFOAM ^VJwADgjf

Computing ^pP3j0ZqE

Opportunities assessment ^LZXWiCoV

Recruiting and head-hunting ^CrQewjXL

Infrastructure dimensioning ^9Y8DotKm

Carbonitriding model in FVM vs FEM ^VzSV6Pa2

Fe-N system ^etJ5Bq3v

Article of nitriding model with MPC automation ^O9hQBC0D

Nitriding with phase equilibria ^r8N78zxH

Al2O3-ZrO2 ^nK3zGlNj

Finish PhD thesis paper with OpenFOAM simulations ^EmDJPcmS

Carbonitriding Model ^vC5XTp0L

Solvers ^eEQP5dWH

Article about generalized Kramers equation solution ^J3CULMnw

Implement all models of Slycke's papers ^m9Tl7oEF

Fe-C system ^lNYlgd0n

JMAK Model for heat transfer ^HdsdfDcD

Process ^KK5XHEiZ

Article about chemical engineering MPC ^dFjEjkdP

Calling C/C++ from Fortran ^PMctBhDy

Nonlinear problems basics - article ^ioGzTE15

Root-finding in Python - article ^tXnq49fL

Generalization to include time-dependence ^Up57RpHf

Find optimal carbonitriding cycle for given constrains ^6rcojs0X

GPU (CUDA) ^3k44G9rm

Create Julia package with Rust ^y69kUT7J

Crate jlrs ^S4SxKEOw

Sample code ^7cQS9f9z

Basilisk ^33ZXQ1X2

%%

Drawing

N4KAkARALgngDgUwgLgAQQQDwMYEMA2AlgCYBOuA7hADTgQBuCpAzoQPYB2KqATLZMzYBXUtiRoIACyhQ4zZAHoFAc0JRJQgEYA6bGwC2CgF7N6hbEcK4OCtptbErHALRY8RMpWdx8Q1TdIEfARcZgRmBShcZQUebTiAdho6IIR9BA4oZm4AbXAwUDAi6HhxdCCiOSR+YsYWdi40AEYATgBmGsg61k4AOU4xbiamgFYAFgS2sbHOiEIOYixuCFwA
+Excalidraw Data · WallyToolbox.jl

excalidraw-plugin: parsed tags: [excalidraw]


==⚠ Switch to EXCALIDRAW VIEW in the MORE OPTIONS menu of this document. ⚠==

Excalidraw Data

Text Elements

Brain ^bA0uK4HU

PINNs ^Pn47WBnc

Solve kiln model ^92u72gv3

ROMs ^r9eGuIr4

Harmonic Oscillator (from Brunton) ^n90Bs0Ht

Interop ^XLzsMIc3

Add Fortran, Julia, and Python interfaces to RK4 in C ^6K7UnJNp

Productivity ^bsV0my5p

Article comparing Weave, Frankling, Pluto and Jupyter for scientific computing. Maybe nteract ^RfeTVfZo

Computer vision ^559Ywru9

Introductory porosity quantification in Julia ^rhMvGIOj

Region properties of segmented pores ^Aqasmef7

ML ^HKk6xNwl

ANNs ^qKP1VQdM

Article about training RADCAL in Julia and package creation ^nC0nVVtR

Science and Computing 101 ^JWFx8npJ

Undergrad courses ^F7M8Zx94

Publishing with LaTeX 101 ^HKwKy0Eb

Shell and Linux 101 ^Z6h5wrlV

Tabular data in Python 101 ^xaKa9dGT

Automating visualization ^ObWvvjKj

GraphViz and Gnuplot for dummies ^ftoPgCWk

Matplotlib in 2h ^pPiz5TQQ

Carburizing model from PhD ^XhzzmGRp

Transport ^tCXg2mu8

Julia for Scientists ^ez3zXh1d

Basic module ^HA9n1RFk

Advanced module ^MWT5lLdz

Calphad ^C4woGMbZ

Article about detecting corners and rectangles ^xRElE6D0

OpenFOAM ^iMcRf8e2

DWSIM ^Nhq5Bdy8

Energy balanced CaCO3 calcination reaction ^NPleQcWs

Progressive PFRs ^egcFwZrB

Julia CFD ^U4ZPcmuq

Fundamentals of numerical methods ^0NhTSDQ9

Advection equation ^6KfA6RYV

Diffusion equation ^9SEZI47q

Diffusion-reaction ^P1m4LpEH

Burgers equation ^pv23Y9ct

Laplace and Poisson equations ^YHSNiC85

Navier-Stokes equations ^67lUEZ2l

Finite Volume Method ^0gX1MsRw

Article re-implementing Tomasini (2014) in Julia ^nrS1JnEA

Call OpenCALPHAD from Julia ^nLy6i1pF

CAS system ^9SNwCKSp

CaO-SiO2 ^9mh8UBUe

Al2O3-SiO2 ^125sLdxw

Al2O3-CaO ^NskFV0Yj

FEM ^t6SMVOto

DryTooling Tech ^1wnL2zxG

DryTooling.jl ^5NbIV4lV

Training ^7BAW44HS

Python for Engineers ^K5Ye0cxI

Physics-based MPC with CasADi ^tJsZLXvE

Data analysis with SciPy stack ^yOM0oEMa

Dashboards with streamlit ^I9xk1J9l

CFD post-processing with PyVista ^Bl3RsRQt

Julia for Engineers ^58Qs0CFa

Dynamical systems with ModelingToolkit.jl ^Mo2M8E43

Optimization with JuMP.jl ^ZHncvBfB

Dashboards with Genie.jl ^wB6NrZ9N

Consulting ^jEUettuQ

Process Simulation ^UlQvskQU

OpenFOAM ^VJwADgjf

Computing ^pP3j0ZqE

Opportunities assessment ^LZXWiCoV

Recruiting and head-hunting ^CrQewjXL

Infrastructure dimensioning ^9Y8DotKm

Carbonitriding model in FVM vs FEM ^VzSV6Pa2

Fe-N system ^etJ5Bq3v

Article of nitriding model with MPC automation ^O9hQBC0D

Nitriding with phase equilibria ^r8N78zxH

Al2O3-ZrO2 ^nK3zGlNj

Finish PhD thesis paper with OpenFOAM simulations ^EmDJPcmS

Carbonitriding Model ^vC5XTp0L

Solvers ^eEQP5dWH

Article about generalized Kramers equation solution ^J3CULMnw

Implement all models of Slycke's papers ^m9Tl7oEF

Fe-C system ^lNYlgd0n

JMAK Model for heat transfer ^HdsdfDcD

Process ^KK5XHEiZ

Article about chemical engineering MPC ^dFjEjkdP

Calling C/C++ from Fortran ^PMctBhDy

Nonlinear problems basics - article ^ioGzTE15

Root-finding in Python - article ^tXnq49fL

Generalization to include time-dependence ^Up57RpHf

Find optimal carbonitriding cycle for given constrains ^6rcojs0X

GPU (CUDA) ^3k44G9rm

Create Julia package with Rust ^y69kUT7J

Crate jlrs ^S4SxKEOw

Sample code ^7cQS9f9z

Basilisk ^33ZXQ1X2

%%

Drawing

N4KAkARALgngDgUwgLgAQQQDwMYEMA2AlgCYBOuA7hADTgQBuCpAzoQPYB2KqATLZMzYBXUtiRoIACyhQ4zZAHoFAc0JRJQgEYA6bGwC2CgF7N6hbEcK4OCtptbErHALRY8RMpWdx8Q1TdIEfARcZgRmBShcZQUebTiAdho6IIR9BA4oZm4AbXAwUDAi6HhxdCCiOSR+YsYWdi40AEYATgBmGsg61k4AOU4xbiamgFYAFgS2sbHOiEIOYixuCFwA
 
 BmSiyEJmABFUqARibgAzAjDZkmX9GHp9fAA2SQBJBABBfABxV9emgH1VgAapHw9A2xWOhHw+AAyrBgstBB4wQIoKQ2ABrBAAdRI6m4fHyKLRmNhMHhEkRl1maL8kg44WyzVmbDguGwahgQ1Wq1m1mU5NQPMJEEw3GcPDGbW0AA57iM2tKxvdRgqJvdZpy0M5WqttKrVk1pjw2qsEvcWurhcxURiEABhNj4NikZYAYiaCA9HuREE0bPRyhpCwdTpd
 
@@ -765,4 +765,4 @@
 
 A5WC48MEAsgr5ABz5hPnJlkS4YvlpABsIJ3nsePmAJaSOgIYON5BAIYLcyMzfnvL5I/H4ANuoVEiN5LmqSwwdxCdM/1AQAC1cBgB7yAwABADOIDc0xojfuZ06whBS+foA1Pm52KvEkPmBgCQA/DRGUNpQJACMUNzAnCr4AMFAroAF7IH5LQCIxD6ArPj5dG6Ac4A4QFH5Ifl2+b3gFPnYIO8gRTapilaQJhSBAGYAwgDMAL+MbvkvSB758kh2IKr
 
-AhiBGwj/wsMTBALxAqmrRGCEg/WkLYOkA/WlJpNLwbLx2+XYASYSniC/CC2BwAFPWGwgl+ZyknEAJQmL4ZlAGcBOAQAA

%%

+AhiBGwj/wsMTBALxAqmrRGCEg/WkLYOkA/WlJpNLwbLx2+XYASYSniC/CC2BwAFPWGwgl+ZyknEAJQmL4ZlAGcBOAQAA

%%

diff --git a/dev/Notes/Conductivity-in-Porous-Media/index.html b/dev/Notes/Conductivity-in-Porous-Media/index.html index 4ca5bc57a..c117d7872 100644 --- a/dev/Notes/Conductivity-in-Porous-Media/index.html +++ b/dev/Notes/Conductivity-in-Porous-Media/index.html @@ -1,5 +1,5 @@ -Excalidraw Data · WallyToolbox.jl

excalidraw-plugin: raw tags: [excalidraw]


==⚠ Switch to EXCALIDRAW VIEW in the MORE OPTIONS menu of this document. ⚠==

Excalidraw Data

Text Elements

%%

Drawing

N4KAkARALgngDgUwgLgAQQQDwMYEMA2AlgCYBOuA7hADTgQBuCpAzoQPYB2KqATLZMzYBXUtiRoIACyhQ4zZAHoFAc0JRJQgEYA6bGwC2CgF7N6hbEcK4OCtptbErHALRY8RMpWdx8Q1TdIEfARcZgRmBShcZQUebTiAZho6IIR9BA4oZm4AbXAwUDAi6HhxdAAzQIRPKn5ixhZ2LjQAVgAOOsgG1k4AOU4xbh4ANjaARgAWBIm2jvzIQg5iLG4I
+Excalidraw Data · WallyToolbox.jl

excalidraw-plugin: raw tags: [excalidraw]


==⚠ Switch to EXCALIDRAW VIEW in the MORE OPTIONS menu of this document. ⚠==

Excalidraw Data

Text Elements

%%

Drawing

N4KAkARALgngDgUwgLgAQQQDwMYEMA2AlgCYBOuA7hADTgQBuCpAzoQPYB2KqATLZMzYBXUtiRoIACyhQ4zZAHoFAc0JRJQgEYA6bGwC2CgF7N6hbEcK4OCtptbErHALRY8RMpWdx8Q1TdIEfARcZgRmBShcZQUebTiAZho6IIR9BA4oZm4AbXAwUDAi6HhxdAAzQIRPKn5ixhZ2LjQAVgAOOsgG1k4AOU4xbh4ANjaARgAWBIm2jvzIQg5iLG4I
 
 XAAGZKKF5gARVKhq7nKCMM6IElWeUgBJAE4E/H1hgHkAdXwAFU11gCsAYVIygAsgBNHhbYrlQj4fAAZVgwVWgg8kIEUFIbAA1gg3iR1Nx1toWudmBjsQgETAkRIUZdzpi/JIOOFsmgxuc2HBcNg1DBuGN1utztZlDTUML5hBMNxnBMhed+WhnAkAOyq7QTO4tYaqkaqsbDQUcqVkzE4/5sfBsUirADEYwQjsdaIgmh5WOUjKWluttokGOszG5gUy
 
@@ -2601,4 +2601,4 @@
 
 ovSt9pi87F6uLzcXuEAGZJ83yPF5GL+sXtIAp1NNmQ8gOUACVgLKgwFQ0EiXF/GL1EANaknCBScjuJKzACUCOegYJeYyhLAChL5iAcI0IQAx+nQl/DkMWAQbAVoB0w3MwWB7IfsmJpKD6ui/Y3ExALCAF8oEqh1JayOqiE+niLov0xwDADNF7QQAQAJ2EyZQHKIKlBnc8/MKBgHLAES/HF+nqEHoSEALZQR0wfF++OF0Xr0AJABU2B00HbIYNw+0
 
-AJ9oZS93AHa3K6AdOn/b0pYCTmBnAI42tUv8pfw7AHF72L+cXrZknABDdRwWDMAMIAZgAWI9BS+80XhLxzgdOnLWB/xQfYAZL0WADIAFhVggAsIARtzOgpPg3AAEbf0o3aL5VWbDPwgBGFqLAAdhFvbzUvdgAgKh5xeaCvSjS3BywA4BoOl8zkOAAGmg3IEZJDAABqLxAgIAAA==

%%

+AJ9oZS93AHa3K6AdOn/b0pYCTmBnAI42tUv8pfw7AHF72L+cXrZknABDdRwWDMAMIAZgAWI9BS+80XhLxzgdOnLWB/xQfYAZL0WADIAFhVggAsIARtzOgpPg3AAEbf0o3aL5VWbDPwgBGFqLAAdhFvbzUvdgAgKh5xeaCvSjS3BywA4BoOl8zkOAAGmg3IEZJDAABqLxAgIAAA==

%%

diff --git a/dev/Notes/Drafts/index.html b/dev/Notes/Drafts/index.html index 5ea209fff..a90ca1485 100644 --- a/dev/Notes/Drafts/index.html +++ b/dev/Notes/Drafts/index.html @@ -1,5 +1,5 @@ -Drafts · WallyToolbox.jl

Drafts

LAMMPS

  • Do exercises
  • create a diffusion cell (one side initialized to a different type of atoms)

Julia para cientistas

  1. Lacos E Condicionais
  2. Funcoes E Despacho
  3. Pacotes E Ecossistema
  4. Avaliando Performance
  5. Algebra Linear
  6. Expressoes Regulares
  7. Execucao Concorrente
  8. Trabalhando Com Arquivos
  9. Bibliotecas Graficas
  10. Graficos Para Publicacoes
  11. Tipos De Dados E Estruturas
  12. Metaprogramacao E Macros
  13. Interoperacao Com C
  14. Equações diferenciais ordinárias
  15. Equações diferenciais parciais
  16. Redes neuronais clássicas
  17. Aprendizado com suporte físico
  18. Análise quantitativa de imagens
  19. Criando seus próprios pacotes

Basilisk

Planned studies

  • Learning steps
- [x] [Base tutorial](http://basilisk.fr/Tutorial)
+Drafts · WallyToolbox.jl

Drafts

LAMMPS

  • Do exercises
  • create a diffusion cell (one side initialized to a different type of atoms)

Julia para cientistas

  1. Lacos E Condicionais
  2. Funcoes E Despacho
  3. Pacotes E Ecossistema
  4. Avaliando Performance
  5. Algebra Linear
  6. Expressoes Regulares
  7. Execucao Concorrente
  8. Trabalhando Com Arquivos
  9. Bibliotecas Graficas
  10. Graficos Para Publicacoes
  11. Tipos De Dados E Estruturas
  12. Metaprogramacao E Macros
  13. Interoperacao Com C
  14. Equações diferenciais ordinárias
  15. Equações diferenciais parciais
  16. Redes neuronais clássicas
  17. Aprendizado com suporte físico
  18. Análise quantitativa de imagens
  19. Criando seus próprios pacotes

Basilisk

Planned studies

  • Learning steps
- [x] [Base tutorial](http://basilisk.fr/Tutorial)
 - [ ] [Review of main examples](http://basilisk.fr/src/examples/README)
 - [ ] [Review of extra examples (1)](http://basilisk.fr/sandbox/Antoonvh/README)
 - [ ] [Review of extra examples (2)](http://basilisk.fr/sandbox/M1EMN/README)
@@ -21,4 +21,4 @@
 - Under `Heat Equation` set heat conductivity
  • Create an initial condition and set temperature to 298.15 K for all bodies.

  • Create boundary conditions:

- `Heat Source`at boundary 8 and set a Dirichlet condition for temperature of 813.15 K
 - `Symmetry` at boundaries 6/7 and set heat flux to 0 W (no gradient).
 - `Soil` at boundaries 1/2 and set a Dirichlet condition for temperature of 298.15 K.
-- `Environment` at boundary 3 and provide an HTC of 10 W/m/K and temperature of 298.15 K.
  • Go to Model > Setup and check it defaults to steady state simulation.

  • Inspect Model > Summary... before generating SIF file.

  • Generate SIF with Sif > Generate.

  • Now simulation is ready to Run > Start solver, inspect logs after finish.

  • Before serious postprocessing, inspect solution with Run > Start ElmerVTK

+- `Environment` at boundary 3 and provide an HTC of 10 W/m/K and temperature of 298.15 K.
  • Go to Model > Setup and check it defaults to steady state simulation.

  • Inspect Model > Summary... before generating SIF file.

  • Generate SIF with Sif > Generate.

  • Now simulation is ready to Run > Start solver, inspect logs after finish.

  • Before serious postprocessing, inspect solution with Run > Start ElmerVTK

diff --git a/dev/Notes/Life/index.html b/dev/Notes/Life/index.html index 5ba8ef245..3d6673181 100644 --- a/dev/Notes/Life/index.html +++ b/dev/Notes/Life/index.html @@ -1,2 +1,2 @@ -- · WallyToolbox.jl

kanban-plugin: basic


Organização pessoal

  • [ ] Nouvelle acte de mariage
  • [ ] Add LibreOffice and Obsidian to scientific-environment
  • [ ] Garantia Shokz
  • [ ] Concluir/enviar dossier de naturalização
  • [ ] RDV Ophtalmologue
  • [ ] Terminar update to clubot com envio de emails
  • [ ] Atualizar CV Lattes
  • [ ] Aplicar validação do doutorado
  • [ ] Migrar planejamento de DryTooling.jl aqui
  • [ ] Check purchase of new tower
  • [ ] Pédalier Shimano Deore FC 30 dents
  • [ ] Chambre à air X2
  • [ ] Organizar e mover links de esportes à página
  • [ ] Terminar de organizar links técnicos nas páginas de bookmarks.
  • [ ] Deploy paperless
  • [ ] Deploy Wiki.js

OpenFOAM

  • [ ] Start creating a CHT case step-by-step from aachenBombSteady (compatible with radiation and wall heat losses)
  • [ ] (paper C2H2) migrate to OpenFOAM11 and publish
  • [ ] (aachenBomb) Provide post-processing
  • [ ] (aachenBombSteady) Finish case construction
  • [ ] Test this function for post-processing.
  • [ ] Add case for testing PSD
  • [ ] (sedimentationBox): export STL model from SpaceClaim and mesh in snappyHexMesh
  • [ ] (sedimentationBox): Impose flow rate at outlet with pressure inlet if possible
  • [ ] (sedimentationBox) Post-process cases
  • [ ] (horizontalMixer) Compute fractional mass in system with respected to injected (extract from log files).
  • [ ] (horizontalMixer) Work towards enabling particleTracks in cloudFunctions.
  • [ ] (horizontalMixer) Ensure individual time-steps converged during solution (residuals get first value only).
  • [ ] (horizontalMixer) Plots of data in patchFlowRate(patch=outlet, cloud:massFlux) files.
  • [ ] (horizontalMixer) Process lagrangian/cloud/patchPostProcessing1/* (Julia script ongoing).
  • [ ] (horizontalMixer) Explore solution configuration.
  • [ ] (horizontalMixer) Organize scripts as a single module and runners.
  • [ ] (horizontalMixer) Download all related papers!
  • [ ] (horizontalMixer) learn from Clérac's fvSolution for better controls

Cursos online

Portfolio

  • [ ] Comparison of drag models using a sedimentation box in OpenFOAM
  • [ ] Cyclone separator with MPPIC cloud in OpenFOAM
  • [ ] Setup of thermophysical properties with temperature dependence
  • [ ] Droplet combustion with arbitrary user-defined composition
  • [ ] Multicomponent airlock system
  • [ ] Arbitrary user-defined gas phase kinetics with Graf (2007)
  • [ ] Carbonitriding model with example of complex part
  • [ ] Spray dryer
  • [ ] Coded reactor wall coupling
  • [ ] Simplified acetylene kinetics model
  • [ ] Estudar MFiX

%% kanban:settings

{"kanban-plugin":"basic"}

%%

+- · WallyToolbox.jl

kanban-plugin: basic


Organização pessoal

  • [ ] Nouvelle acte de mariage
  • [ ] Add LibreOffice and Obsidian to scientific-environment
  • [ ] Garantia Shokz
  • [ ] Concluir/enviar dossier de naturalização
  • [ ] RDV Ophtalmologue
  • [ ] Terminar update to clubot com envio de emails
  • [ ] Atualizar CV Lattes
  • [ ] Aplicar validação do doutorado
  • [ ] Migrar planejamento de DryTooling.jl aqui
  • [ ] Check purchase of new tower
  • [ ] Pédalier Shimano Deore FC 30 dents
  • [ ] Chambre à air X2
  • [ ] Organizar e mover links de esportes à página
  • [ ] Terminar de organizar links técnicos nas páginas de bookmarks.
  • [ ] Deploy paperless
  • [ ] Deploy Wiki.js

OpenFOAM

  • [ ] Start creating a CHT case step-by-step from aachenBombSteady (compatible with radiation and wall heat losses)
  • [ ] (paper C2H2) migrate to OpenFOAM11 and publish
  • [ ] (aachenBomb) Provide post-processing
  • [ ] (aachenBombSteady) Finish case construction
  • [ ] Test this function for post-processing.
  • [ ] Add case for testing PSD
  • [ ] (sedimentationBox): export STL model from SpaceClaim and mesh in snappyHexMesh
  • [ ] (sedimentationBox): Impose flow rate at outlet with pressure inlet if possible
  • [ ] (sedimentationBox) Post-process cases
  • [ ] (horizontalMixer) Compute fractional mass in system with respected to injected (extract from log files).
  • [ ] (horizontalMixer) Work towards enabling particleTracks in cloudFunctions.
  • [ ] (horizontalMixer) Ensure individual time-steps converged during solution (residuals get first value only).
  • [ ] (horizontalMixer) Plots of data in patchFlowRate(patch=outlet, cloud:massFlux) files.
  • [ ] (horizontalMixer) Process lagrangian/cloud/patchPostProcessing1/* (Julia script ongoing).
  • [ ] (horizontalMixer) Explore solution configuration.
  • [ ] (horizontalMixer) Organize scripts as a single module and runners.
  • [ ] (horizontalMixer) Download all related papers!
  • [ ] (horizontalMixer) learn from Clérac's fvSolution for better controls

Cursos online

Portfolio

  • [ ] Comparison of drag models using a sedimentation box in OpenFOAM
  • [ ] Cyclone separator with MPPIC cloud in OpenFOAM
  • [ ] Setup of thermophysical properties with temperature dependence
  • [ ] Droplet combustion with arbitrary user-defined composition
  • [ ] Multicomponent airlock system
  • [ ] Arbitrary user-defined gas phase kinetics with Graf (2007)
  • [ ] Carbonitriding model with example of complex part
  • [ ] Spray dryer
  • [ ] Coded reactor wall coupling
  • [ ] Simplified acetylene kinetics model
  • [ ] Estudar MFiX

%% kanban:settings

{"kanban-plugin":"basic"}

%%

diff --git a/dev/Notes/Monthly/index.html b/dev/Notes/Monthly/index.html index e271bc42e..993decab6 100644 --- a/dev/Notes/Monthly/index.html +++ b/dev/Notes/Monthly/index.html @@ -1,2 +1,2 @@ -Monthly · WallyToolbox.jl

Monthly


July 2024


April 2024

  • Reviewed GPU limitations for Ansys Fluent. It remains NVIDIA only. Currently the models remain quite limited to simple flows and the classic turbulence model. Possibility of species transport but to reactions.

  • Reviewed Ansys Tutorial Guide 2023R1 chapter regarding droplets evaporation. There is nothing there I am not already using in the models I conceive. Remember to use transient tracking and check mean properties for iso-surfaces display.

  • Continued (re-)learning about UDF's. Header files seem fine if placed under an include/ directory at project root (not case root!). Simulations can be made more flexible by using Scheme variables which can be parsed by UDF's.

  • Downloading files from Analysis of Transport Phenomena at MITx.

  • Worked on random walk diffusion models at microscopic scale. Started a draft of a tutorial for moving particles in a square grid in Julia.

  • Continued working on diffusion, now writing down the draft of the course. I think an annex of thermodynamics or even dedicated chapters might be required, to be defined.

+Monthly · WallyToolbox.jl

Monthly


July 2024


April 2024

  • Reviewed GPU limitations for Ansys Fluent. It remains NVIDIA only. Currently the models remain quite limited to simple flows and the classic turbulence model. Possibility of species transport but to reactions.

  • Reviewed Ansys Tutorial Guide 2023R1 chapter regarding droplets evaporation. There is nothing there I am not already using in the models I conceive. Remember to use transient tracking and check mean properties for iso-surfaces display.

  • Continued (re-)learning about UDF's. Header files seem fine if placed under an include/ directory at project root (not case root!). Simulations can be made more flexible by using Scheme variables which can be parsed by UDF's.

  • Downloading files from Analysis of Transport Phenomena at MITx.

  • Worked on random walk diffusion models at microscopic scale. Started a draft of a tutorial for moving particles in a square grid in Julia.

  • Continued working on diffusion, now writing down the draft of the course. I think an annex of thermodynamics or even dedicated chapters might be required, to be defined.

diff --git a/dev/Notes/Naturalisation/index.html b/dev/Notes/Naturalisation/index.html index 6509f7a59..dc78d5b40 100644 --- a/dev/Notes/Naturalisation/index.html +++ b/dev/Notes/Naturalisation/index.html @@ -1,2 +1,2 @@ -- · WallyToolbox.jl

Suivi des étapes

ÉtatÉtapeNotes
FiniSaisieJuste le formulaire à remplir, le plus compliqué c'est d'avoir toutes les dates et adresses des résidences précedentes.
En coursDocumentsIl manque les traductions, certificats de travail, casier judiciaire et bordereau fiscale.

Documents

Mes informations

  • [x] Passeport
  • [x] Acte de naissance (propre)
  • [ ] Acte de naissance (propre, traduction française)
  • [x] Titre de séjour (propre)
  • [x] Diplôme français niveau >3 (notes)

Parents et fratrie

  • [ ] Acte de mariage (parents)
  • [ ] Acte de mariage (parents, traduction française)
  • [x] Acte de naissance (mère)
  • [ ] Acte de naissance (mère, traduction française)
  • [x] Acte de naissance (père)
  • [ ] Acte de naissance (père, traduction française)
  • [x] Acte de décès (père)
  • [ ] Acte de décès (père, traduction française)

Ma situation familiale

  • [x] Acte de mariage
  • [x] Titre de séjour du conjoint
  • [ ] Certificats de travail du conjoint (3 dernières années)
  • [x] Contrat de travail du conjoint
  • [x] Les 3 derniers bulletins de salaire du conjoint
  • [x] Bulletins de salaire du conjoint de novembre et décembre des 3 dernières années

Mon domicile

  • [x] Contrat de location
  • [x] Les 3 dernières quittances de loyer
  • [x] Justificatif de domicile datant de moins de 6 mois
  • [ ] Casier judiciaire étranger des pays dont vous avez la nationalité
  • [ ] Casier judiciaire étranger des pays dont vous avez la nationalité (traduction française)

Mes ressources

  • [x] Avis d’imposition des 3 dernières années
  • [ ] Bordereau de situation fiscale (modèle P. 237) (3 dernières années)
  • [ ] Les certificats de travail, concernant si possible les 3 dernières années
  • [x] Contrat de travail et ses MAJ
  • [x] Les 3 derniers bulletins de salaire
  • [x] Bulletins de salaire de novembre et décembre des 3 dernières années
+- · WallyToolbox.jl

Suivi des étapes

ÉtatÉtapeNotes
FiniSaisieJuste le formulaire à remplir, le plus compliqué c'est d'avoir toutes les dates et adresses des résidences précedentes.
En coursDocumentsIl manque les traductions, certificats de travail, casier judiciaire et bordereau fiscale.

Documents

Mes informations

  • [x] Passeport
  • [x] Acte de naissance (propre)
  • [ ] Acte de naissance (propre, traduction française)
  • [x] Titre de séjour (propre)
  • [x] Diplôme français niveau >3 (notes)

Parents et fratrie

  • [ ] Acte de mariage (parents)
  • [ ] Acte de mariage (parents, traduction française)
  • [x] Acte de naissance (mère)
  • [ ] Acte de naissance (mère, traduction française)
  • [x] Acte de naissance (père)
  • [ ] Acte de naissance (père, traduction française)
  • [x] Acte de décès (père)
  • [ ] Acte de décès (père, traduction française)

Ma situation familiale

  • [x] Acte de mariage
  • [x] Titre de séjour du conjoint
  • [ ] Certificats de travail du conjoint (3 dernières années)
  • [x] Contrat de travail du conjoint
  • [x] Les 3 derniers bulletins de salaire du conjoint
  • [x] Bulletins de salaire du conjoint de novembre et décembre des 3 dernières années

Mon domicile

  • [x] Contrat de location
  • [x] Les 3 dernières quittances de loyer
  • [x] Justificatif de domicile datant de moins de 6 mois
  • [ ] Casier judiciaire étranger des pays dont vous avez la nationalité
  • [ ] Casier judiciaire étranger des pays dont vous avez la nationalité (traduction française)

Mes ressources

  • [x] Avis d’imposition des 3 dernières années
  • [ ] Bordereau de situation fiscale (modèle P. 237) (3 dernières années)
  • [ ] Les certificats de travail, concernant si possible les 3 dernières années
  • [x] Contrat de travail et ses MAJ
  • [x] Les 3 derniers bulletins de salaire
  • [x] Bulletins de salaire de novembre et décembre des 3 dernières années
diff --git a/dev/Notes/OpenFOAM-Cases/index.html b/dev/Notes/OpenFOAM-Cases/index.html index 1483e97d0..5739d40f8 100644 --- a/dev/Notes/OpenFOAM-Cases/index.html +++ b/dev/Notes/OpenFOAM-Cases/index.html @@ -1,5 +1,5 @@ -Excalidraw Data · WallyToolbox.jl

excalidraw-plugin: parsed tags: [excalidraw]


==⚠ Switch to EXCALIDRAW VIEW in the MORE OPTIONS menu of this document. ⚠==

Excalidraw Data

Text Elements

multicomponentFluid ^qRsrcDcj

Combustion ^1jpkNYY8

Evaporation ^XEtNIadD

Liquids ^kKIsmNw6

aachenBomb ^7VdZntsW

Kinetics ^W2TJAmjK

nc7h16 ^huP8tzYR

parcelInBox ^3cqsiZ1f

Solids ^CoCpr3fT

simplifiedSiwek ^Fsq6al0O

verticalChannel ^FVJsO16x

verticalChannelLTS ^QNoyohaC

verticalChannelSteady ^iAVhia6P

%%

Drawing

N4KAkARALgngDgUwgLgAQQQDwMYEMA2AlgCYBOuA7hADTgQBuCpAzoQPYB2KqATLZMzYBXUtiRoIACyhQ4zZAHoFAc0JRJQgEYA6bGwC2CgF7N6hbEcK4OCtptbErHALRY8RMpWdx8Q1TdIEfARcZgRmBShcZQUebTiAZho6IIR9BA4oZm4AbXAwUDAi6HhxdEDsKI5lYOSiyEYWdi40AA4E/mLG1k4AOU4xbgBGAFZRgAYAFgB2IYA2DvzIQg5i
+Excalidraw Data · WallyToolbox.jl

excalidraw-plugin: parsed tags: [excalidraw]


==⚠ Switch to EXCALIDRAW VIEW in the MORE OPTIONS menu of this document. ⚠==

Excalidraw Data

Text Elements

multicomponentFluid ^qRsrcDcj

Combustion ^1jpkNYY8

Evaporation ^XEtNIadD

Liquids ^kKIsmNw6

aachenBomb ^7VdZntsW

Kinetics ^W2TJAmjK

nc7h16 ^huP8tzYR

parcelInBox ^3cqsiZ1f

Solids ^CoCpr3fT

simplifiedSiwek ^Fsq6al0O

verticalChannel ^FVJsO16x

verticalChannelLTS ^QNoyohaC

verticalChannelSteady ^iAVhia6P

%%

Drawing

N4KAkARALgngDgUwgLgAQQQDwMYEMA2AlgCYBOuA7hADTgQBuCpAzoQPYB2KqATLZMzYBXUtiRoIACyhQ4zZAHoFAc0JRJQgEYA6bGwC2CgF7N6hbEcK4OCtptbErHALRY8RMpWdx8Q1TdIEfARcZgRmBShcZQUebTiAZho6IIR9BA4oZm4AbXAwUDAi6HhxdEDsKI5lYOSiyEYWdi40AA4E/mLG1k4AOU4xbgBGAFZRgAYAFgB2IYA2DvzIQg5i
 
 LG4IXHG64sJmABFUqARibgAzAjDO5dOJEYBFemd6AFEAeQAVfYAFHlXNACyAGFcM4ADIANTmO0gZ0I+HwAGVYLUJIIPDCIMwoKQ2ABrBAAdRI6m4fCWWJx+IQyJgqPQ6JImNxfkkHHC2TQQ2uEDYcFw2DUMGG43GPOsNTKYopmG4zjm0wS8RGPOFaGcPB4I3iismCWmKop2NxBKBbHwbFIGwAxEMEHa7ZjNAK8coWaszRarRIcdZmPzAplMRQSZJ
 
@@ -129,4 +129,4 @@
 
 t/8sqf9f+d/mkBzaeqnzDP+P/mkDUeMLsNzgBwbPf5uCj3mAGABL/voDswd3sU6f+2/igFN4vTsEBnAOhLAG7+r/oHa1GJrIQF7+LwCHY2SUSnNYCA2ALiAIgdznQJu4ilkTTuGTdDf7MA9AeaD4AzruXyXoWYBtS9sNxKjoQARgPtj6AaIgwAEABcMMC7U5AcAHY6HfMtjPcJAMu5kBboCQAF+FIJjz4AZiNaBAgiYIYGGB7MEkapg2cMoBtgME
 
-DaAvA+wLYG2BpgQP7z+yAcmjPw1HnXje+4eBACU6CAGYDCAzAB+Br465rDypcDZtnCOQa+PhIUgGQFcbBA24JB6QA2AI3BHqZPpACd+KQX4zCAwuh7AZB8gXYAng8xvBwb4cAACBsAawJQGxBsXqpD+48IOECSUTEMOBAAA=

%%

+DaAvA+wLYG2BpgQP7z+yAcmjPw1HnXje+4eBACU6CAGYDCAzAB+Br465rDypcDZtnCOQa+PhIUgGQFcbBA24JB6QA2AI3BHqZPpACd+KQX4zCAwuh7AZB8gXYAng8xvBwb4cAACBsAawJQGxBsXqpD+48IOECSUTEMOBAAA=

%%

diff --git a/dev/Notes/Server/index.html b/dev/Notes/Server/index.html index 8599bdcdb..50d6467ec 100644 --- a/dev/Notes/Server/index.html +++ b/dev/Notes/Server/index.html @@ -1,5 +1,5 @@ -Excalidraw Data · WallyToolbox.jl

excalidraw-plugin: parsed tags: [excalidraw]


==⚠ Switch to EXCALIDRAW VIEW in the MORE OPTIONS menu of this document. ⚠==

Excalidraw Data

Text Elements

Mini PC Windows (300€) ^Uueo5gHK

Hard Drive 4T ^FhQ5lsif

RPI 3B + 218G ^HoeV5did

Modem ^HadSLSNc

Hard Drive 4T ^QXBMf68R

Lenovo P51 ^syyrpie8

Microsoft Go2 ^WKcG8Hqi

Simulation Tower (10k€) ^lxDKJklC

As cheap as can be but enough to navigate the internet, its ONLY goal is to synchronize OneDrive ^a52WjlNf

This will become a headless server for playing from anywhere and management. It will also provide FTP and videos. ^cojFGwIh

Screen 1 ^GKAeCKhC

Screen 2 ^cIV46vNj

5 ^P1kjNtqN

4 ^8WxijHIz

Paperless ^Me8wBIVM

VS Code ^StikJtl5

Python ^ZPRvEXu5

Julia ^diMhDImF

Jupyter ^tfXU42e5

%%

Drawing

N4KAkARALgngDgUwgLgAQQQDwMYEMA2AlgCYBOuA7hADTgQBuCpAzoQPYB2KqATLZMzYBXUtiRoIACyhQ4zZAHoFAc0JRJQgEYA6bGwC2CgF7N6hbEcK4OCtptbErHALRY8RMpWdx8Q1TdIEfARcZgRmBShcZQUebTiAdho6IIR9BA4oZm4AbXAwUDAi6HhxdCCiOSR+YsYWdi40HgSAThrIOtZOADlOMW4ARgAWBIBmAA5xgDYEmfaIQg5iLG4I
+Excalidraw Data · WallyToolbox.jl

excalidraw-plugin: parsed tags: [excalidraw]


==⚠ Switch to EXCALIDRAW VIEW in the MORE OPTIONS menu of this document. ⚠==

Excalidraw Data

Text Elements

Mini PC Windows (300€) ^Uueo5gHK

Hard Drive 4T ^FhQ5lsif

RPI 3B + 218G ^HoeV5did

Modem ^HadSLSNc

Hard Drive 4T ^QXBMf68R

Lenovo P51 ^syyrpie8

Microsoft Go2 ^WKcG8Hqi

Simulation Tower (10k€) ^lxDKJklC

As cheap as can be but enough to navigate the internet, its ONLY goal is to synchronize OneDrive ^a52WjlNf

This will become a headless server for playing from anywhere and management. It will also provide FTP and videos. ^cojFGwIh

Screen 1 ^GKAeCKhC

Screen 2 ^cIV46vNj

5 ^P1kjNtqN

4 ^8WxijHIz

Paperless ^Me8wBIVM

VS Code ^StikJtl5

Python ^ZPRvEXu5

Julia ^diMhDImF

Jupyter ^tfXU42e5

%%

Drawing

N4KAkARALgngDgUwgLgAQQQDwMYEMA2AlgCYBOuA7hADTgQBuCpAzoQPYB2KqATLZMzYBXUtiRoIACyhQ4zZAHoFAc0JRJQgEYA6bGwC2CgF7N6hbEcK4OCtptbErHALRY8RMpWdx8Q1TdIEfARcZgRmBShcZQUebTiAdho6IIR9BA4oZm4AbXAwUDAi6HhxdCCiOSR+YsYWdi40HgSAThrIOtZOADlOMW4ARgAWBIBmAA5xgDYEmfaIQg5iLG4I
 
 XAAGZKLIQmYAEVSoBGJuADMCMPmSVZCEoyMAfR5TgDEAWWIAIQGp0j3mIQAdQAasCtsVToR8PgAMqwYKrQQecECKCkNgAawQgJI6m4fHyqPRWLhMAREiR13m6L8kg44WyaAG8zYcFw2DUMEG63W82synJqF5hIgmG4zlGU3G8XWQwArPKWmMpqMeATthAuWhnEMpi14lKWnK5S0Bgl1i0hm0Rcw0ZiEABhNj4NikVYAYgGCC9XpREE07IxyhpSyd
 
@@ -201,4 +201,4 @@
 
 K9aQFej82JinSQa9cvfoCY9uwR03GkTveb36A54H92kpfiYtA1C0IOd5kw9mQ1hfGkOkqA8hAfeiDQgyniYxcuzjgqEOeETkT1GA9TK6Qe6DAAQB/g/KrTB3YnvXT36AqvW102cqsFT3BgJABNYe9FfYR2QInwM6BjQ7oEJXN9LQC8AMC8wB/DKAQknSLngewL3299bfTc6m9+vZL1YgbTB5I9WXuKQWBAZgMIDMARmJX0ZCHveKQfwnUEehzles
 
-rgDIh5SJ7bC8lQMFJmdg6bR4sgr8PR4H9tmpRqlymgBOAPOzADCA+s7NZ6Q+9W/cEDnFGGllnhAYyGMSHgQAA===

%%

+rgDIh5SJ7bC8lQMFJmdg6bR4sgr8PR4H9tmpRqlymgBOAPOzADCA+s7NZ6Q+9W/cEDnFGGllnhAYyGMSHgQAA===

%%

diff --git a/dev/Notes/carburizing/index.html b/dev/Notes/carburizing/index.html index 766e9ee02..a14f21fc5 100644 --- a/dev/Notes/carburizing/index.html +++ b/dev/Notes/carburizing/index.html @@ -1,5 +1,5 @@ -- · WallyToolbox.jl

Mass transfer

Carbon diffusion in plain iron

\[\frac{\partial{}x}{\partial{}t}=\nabla\cdotp{}(D(x)\nabla{}T)\]

\[\frac{\partial{}x}{\partial{}t}= +- · WallyToolbox.jl

Mass transfer

Carbon diffusion in plain iron

\[\frac{\partial{}x}{\partial{}t}=\nabla\cdotp{}(D(x)\nabla{}T)\]

\[\frac{\partial{}x}{\partial{}t}= \frac{\partial}{\partial{}x} \left(D(x)\frac{\partial{}x}{\partial{}z}\right)\]

\[\int_{s}^{n}\int_{0}^{\tau} \frac{\partial{}x}{\partial{}t}dtdz= @@ -34,4 +34,4 @@ a_{S} & = -\beta_{s}\\[8pt] a_{N} & = -\beta_{n}\\[8pt] a_{P} & = \alpha_{P}+\beta_{n}+\beta_{s} -\end{align}\]

\[a_Sx_S + a_Px_P + a_Nx_N = \alpha_{P}x_P^{0}\]

\[a_1x_P + a_Nx_N = \alpha_{P}x_P^{0}\quad\text{where}\quad{}a_1=\alpha_{P}+\beta_{n}\]

\[a_Sx_S + a_Rx_P = \alpha_{P}x_P^{0}+hx_\infty\quad\text{where}\quad{}a_R=\alpha_{P}+h+\beta_{s}\]

About mass intake calculation

\[\rho_{Fe} = \frac{m_{Fe}}{V_{cell}}\]

\[y_{C} = \frac{m_{C}}{m_{Fe} + m_{C}}\]

\[m_{Fe+C} = \frac{m_{Fe}}{1 - y_{C}}\]

\[\rho_{Fe+C} = \rho_{Fe}\frac{1}{1 - y_{C}}\]

\[\sigma = \int_{0}^{L}\rho(z)y_{C}(z)dz\]

\[\sigma = \rho_{Fe}\int_{0}^{L}\frac{y_{C}(z)}{1-y_{C}(z)}dz\]

\[\Delta\sigma = \rho_{Fe}\left(\int_{0}^{L}\frac{y_{C}(z)}{1-y_{C}(z)}dz\right)\biggr\vert_{t=0}^{t=t_{f}}\]

+\end{align}\]

\[a_Sx_S + a_Px_P + a_Nx_N = \alpha_{P}x_P^{0}\]

\[a_1x_P + a_Nx_N = \alpha_{P}x_P^{0}\quad\text{where}\quad{}a_1=\alpha_{P}+\beta_{n}\]

\[a_Sx_S + a_Rx_P = \alpha_{P}x_P^{0}+hx_\infty\quad\text{where}\quad{}a_R=\alpha_{P}+h+\beta_{s}\]

About mass intake calculation

\[\rho_{Fe} = \frac{m_{Fe}}{V_{cell}}\]

\[y_{C} = \frac{m_{C}}{m_{Fe} + m_{C}}\]

\[m_{Fe+C} = \frac{m_{Fe}}{1 - y_{C}}\]

\[\rho_{Fe+C} = \rho_{Fe}\frac{1}{1 - y_{C}}\]

\[\sigma = \int_{0}^{L}\rho(z)y_{C}(z)dz\]

\[\sigma = \rho_{Fe}\int_{0}^{L}\frac{y_{C}(z)}{1-y_{C}(z)}dz\]

\[\Delta\sigma = \rho_{Fe}\left(\int_{0}^{L}\frac{y_{C}(z)}{1-y_{C}(z)}dz\right)\biggr\vert_{t=0}^{t=t_{f}}\]

diff --git a/dev/Notes/read/index.html b/dev/Notes/read/index.html index d75507c63..08596c414 100644 --- a/dev/Notes/read/index.html +++ b/dev/Notes/read/index.html @@ -1,2 +1,2 @@ -- · WallyToolbox.jl
+- · WallyToolbox.jl
diff --git a/dev/References/@Aissa2015a/index.html b/dev/References/@Aissa2015a/index.html index 86efe1071..f4b3e3cb7 100644 --- a/dev/References/@Aissa2015a/index.html +++ b/dev/References/@Aissa2015a/index.html @@ -1,2 +1,2 @@ -- · WallyToolbox.jl

title: Ranz and Marshall correlations limits on heat flow between a sphere and its surrounding gas at high temperature authors: Abderrahmane Aissa, Mohamed Abdelouahab, Abdelkader Noureddine, Mohammed Elganaoui, Bernard Pateyron year: 2015 –-

+- · WallyToolbox.jl

title: Ranz and Marshall correlations limits on heat flow between a sphere and its surrounding gas at high temperature authors: Abderrahmane Aissa, Mohamed Abdelouahab, Abdelkader Noureddine, Mohammed Elganaoui, Bernard Pateyron year: 2015 –-

diff --git a/dev/References/@Amsden1989/index.html b/dev/References/@Amsden1989/index.html index bf0242551..6e2d17c6c 100644 --- a/dev/References/@Amsden1989/index.html +++ b/dev/References/@Amsden1989/index.html @@ -1,2 +1,2 @@ -- · WallyToolbox.jl

title: "KIVA-II: A computer program for chemically reactive flows with sprays" authors: A. A. Amsden, P. J. O'Rourke, T. D. Butler year: 1989 URL: https://doi.org/10.2172/6228444 –- Also check Liu1993 [14] (in OpenFOAM generalization to distortedSphereDrag).

+- · WallyToolbox.jl

title: "KIVA-II: A computer program for chemically reactive flows with sprays" authors: A. A. Amsden, P. J. O'Rourke, T. D. Butler year: 1989 URL: https://doi.org/10.2172/6228444 –- Also check Liu1993 [14] (in OpenFOAM generalization to distortedSphereDrag).

diff --git a/dev/References/@Antonelo2021a/index.html b/dev/References/@Antonelo2021a/index.html index 7f1dfff75..62ee133fd 100644 --- a/dev/References/@Antonelo2021a/index.html +++ b/dev/References/@Antonelo2021a/index.html @@ -1,2 +1,2 @@ -- · WallyToolbox.jl

title: Physics-informed neural nets for control of dynamical systems authors: Eric Aislan Antonelo, Eduardo Camponogara, Laio Oriel Seman, Eduardo Rehbein de Souza, Jean P. Jordanou, Jomi F. Hubner year: 2021 URL: https://doi.org/10.48550/arXiv.2104.02556 –-

+- · WallyToolbox.jl

title: Physics-informed neural nets for control of dynamical systems authors: Eric Aislan Antonelo, Eduardo Camponogara, Laio Oriel Seman, Eduardo Rehbein de Souza, Jean P. Jordanou, Jomi F. Hubner year: 2021 URL: https://doi.org/10.48550/arXiv.2104.02556 –-

diff --git a/dev/References/@Aparicio1994/index.html b/dev/References/@Aparicio1994/index.html index d12bbe5cd..b8507807d 100644 --- a/dev/References/@Aparicio1994/index.html +++ b/dev/References/@Aparicio1994/index.html @@ -1,2 +1,2 @@ -- · WallyToolbox.jl

title: "Ammonia synthesis kinetics: Surface chemistry, rate expressions, and kinetic analysis" authors: Luis M. Aparicio, James A. Dumesic year: 1994 –-

+- · WallyToolbox.jl

title: "Ammonia synthesis kinetics: Surface chemistry, rate expressions, and kinetic analysis" authors: Luis M. Aparicio, James A. Dumesic year: 1994 –-

diff --git a/dev/References/@Arthurs2021a/index.html b/dev/References/@Arthurs2021a/index.html index 4403cbca9..77f1b46a1 100644 --- a/dev/References/@Arthurs2021a/index.html +++ b/dev/References/@Arthurs2021a/index.html @@ -1,2 +1,2 @@ -- · WallyToolbox.jl

title: Active training of physics-informed neural networks to aggregate and interpolate parametric solutions to the Navier-Stokes equations authors: Christopher J. Arthurs, Andrew P. King year: 2021 URL: https://doi.org/10.1016/j.jcp.2021.110364 Drive: https://1drv.ms/b/s!Ar4x-UlrYAiZla8i8cvFX_ZGzT6Z9A?e=MJdHtJ –-

+- · WallyToolbox.jl

title: Active training of physics-informed neural networks to aggregate and interpolate parametric solutions to the Navier-Stokes equations authors: Christopher J. Arthurs, Andrew P. King year: 2021 URL: https://doi.org/10.1016/j.jcp.2021.110364 Drive: https://1drv.ms/b/s!Ar4x-UlrYAiZla8i8cvFX_ZGzT6Z9A?e=MJdHtJ –-

diff --git a/dev/References/@Balaji2014/index.html b/dev/References/@Balaji2014/index.html index 434ebb718..ee3b5b34f 100644 --- a/dev/References/@Balaji2014/index.html +++ b/dev/References/@Balaji2014/index.html @@ -1,2 +1,2 @@ -- · WallyToolbox.jl

title: Essentials of radiation heat transfer authors: C. Balaji year: 2014 Drive: https://1drv.ms/b/s!Ar4x-UlrYAiZoCdJkJqcjDRZVs9J?e=mbefIU –-

+- · WallyToolbox.jl

title: Essentials of radiation heat transfer authors: C. Balaji year: 2014 Drive: https://1drv.ms/b/s!Ar4x-UlrYAiZoCdJkJqcjDRZVs9J?e=mbefIU –-

diff --git a/dev/References/@Bird2001/index.html b/dev/References/@Bird2001/index.html index 86a399c82..385ebc271 100644 --- a/dev/References/@Bird2001/index.html +++ b/dev/References/@Bird2001/index.html @@ -1,2 +1,2 @@ -- · WallyToolbox.jl

title: "Transport phenomena" authors: R. B. Bird, W. E. Stewart, E. N. Lightfoot year: 2001 –-

+- · WallyToolbox.jl

title: "Transport phenomena" authors: R. B. Bird, W. E. Stewart, E. N. Lightfoot year: 2001 –-

diff --git a/dev/References/@Cai2021a/index.html b/dev/References/@Cai2021a/index.html index ce101fe6b..87ca8884d 100644 --- a/dev/References/@Cai2021a/index.html +++ b/dev/References/@Cai2021a/index.html @@ -1,2 +1,2 @@ -- · WallyToolbox.jl

title: Physics-informed neural networks for heat transfer problems authors: Shengze Cai, Zhicheng Wang, Sifan Wang, Paris Perdikaris, George Em Karniadakis year: 2021 URL: https://doi.org/10.1115/1.4050542 –-

+- · WallyToolbox.jl

title: Physics-informed neural networks for heat transfer problems authors: Shengze Cai, Zhicheng Wang, Sifan Wang, Paris Perdikaris, George Em Karniadakis year: 2021 URL: https://doi.org/10.1115/1.4050542 –-

diff --git a/dev/References/@Cheilytko2016a/index.html b/dev/References/@Cheilytko2016a/index.html index 2a8251500..b3e2722bd 100644 --- a/dev/References/@Cheilytko2016a/index.html +++ b/dev/References/@Cheilytko2016a/index.html @@ -1,2 +1,2 @@ -- · WallyToolbox.jl

title: "Finding of the generalized equation of thermal conductivity for porous heat-insulating materials" authors: Andrii Cheilytko year: 2016 –-

+- · WallyToolbox.jl

title: "Finding of the generalized equation of thermal conductivity for porous heat-insulating materials" authors: Andrii Cheilytko year: 2016 –-

diff --git a/dev/References/@Chikhi2020a/index.html b/dev/References/@Chikhi2020a/index.html index 2908ea71f..2f2c57761 100644 --- a/dev/References/@Chikhi2020a/index.html +++ b/dev/References/@Chikhi2020a/index.html @@ -1,2 +1,2 @@ -- · WallyToolbox.jl

title: "Effective thermal conductivity of porous biomaterials: Numerical investigation" authors: M. Chikhi year: 2020 –-

+- · WallyToolbox.jl

title: "Effective thermal conductivity of porous biomaterials: Numerical investigation" authors: M. Chikhi year: 2020 –-

diff --git a/dev/References/@Crank1996/index.html b/dev/References/@Crank1996/index.html index d6134eaa1..0d2d37e0a 100644 --- a/dev/References/@Crank1996/index.html +++ b/dev/References/@Crank1996/index.html @@ -1,2 +1,2 @@ -- · WallyToolbox.jl

title: "A practical method for Numerical evaluation of solutions of partial differential equations of the heat-conduction type" authors: J. Crank, P. Nicolson year: 1996 –-

+- · WallyToolbox.jl

title: "A practical method for Numerical evaluation of solutions of partial differential equations of the heat-conduction type" authors: J. Crank, P. Nicolson year: 1996 –-

diff --git a/dev/References/@Cuomo2022a/index.html b/dev/References/@Cuomo2022a/index.html index 01c7572fa..565d795a8 100644 --- a/dev/References/@Cuomo2022a/index.html +++ b/dev/References/@Cuomo2022a/index.html @@ -1,2 +1,2 @@ -- · WallyToolbox.jl

title: "Scientific machine learning through physics-informed neural networks: Where we are and what's next" authors: Salvatore Cuomo, Vincenzo Schiano di Cola, Fabio Giampaolo, Gianluigi Rozza, Maziar Raissi, Francesco Piccialli year: 2022 DOI: https://doi.org/10.48550/arXiv.2201.05624 –-

+- · WallyToolbox.jl

title: "Scientific machine learning through physics-informed neural networks: Where we are and what's next" authors: Salvatore Cuomo, Vincenzo Schiano di Cola, Fabio Giampaolo, Gianluigi Rozza, Maziar Raissi, Francesco Piccialli year: 2022 DOI: https://doi.org/10.48550/arXiv.2201.05624 –-

diff --git a/dev/References/@Fadayini2021/index.html b/dev/References/@Fadayini2021/index.html index ca58ab5db..52e69ccea 100644 --- a/dev/References/@Fadayini2021/index.html +++ b/dev/References/@Fadayini2021/index.html @@ -1,2 +1,2 @@ -- · WallyToolbox.jl

title: Simulation and optimization of an integrated process flow sheet for cement production authors: Oluwafemi M. Fadayini, Adekunle A. Obisanya, Gloria O. Ajiboye, Clement Madu, Tajudeen O. Ipaye, Taiwo O. Rabiu, Shola J. Ajayi, Joseph T. Akintola year: 2021 –-

+- · WallyToolbox.jl

title: Simulation and optimization of an integrated process flow sheet for cement production authors: Oluwafemi M. Fadayini, Adekunle A. Obisanya, Gloria O. Ajiboye, Clement Madu, Tajudeen O. Ipaye, Taiwo O. Rabiu, Shola J. Ajayi, Joseph T. Akintola year: 2021 –-

diff --git a/dev/References/@Fang2023a/index.html b/dev/References/@Fang2023a/index.html index 05c4f7fa6..bbd17ec3e 100644 --- a/dev/References/@Fang2023a/index.html +++ b/dev/References/@Fang2023a/index.html @@ -1,2 +1,2 @@ -- · WallyToolbox.jl

title: "Ensemble learning for physics informed neural networks: a gradient boosting approach" authors: Zhiwei Fang, Sifan Wang, Paris Perdikaris year: 2023 DOI: https://doi.org/10.48550/arXiv.2302.13143 –-

Discussed in [[@Guo2023c]].

+- · WallyToolbox.jl

title: "Ensemble learning for physics informed neural networks: a gradient boosting approach" authors: Zhiwei Fang, Sifan Wang, Paris Perdikaris year: 2023 DOI: https://doi.org/10.48550/arXiv.2302.13143 –-

Discussed in [[@Guo2023c]].

diff --git a/dev/References/@Fiedler2006a/index.html b/dev/References/@Fiedler2006a/index.html index 74db30bbd..e90fc45ac 100644 --- a/dev/References/@Fiedler2006a/index.html +++ b/dev/References/@Fiedler2006a/index.html @@ -1,2 +1,2 @@ -- · WallyToolbox.jl

title: "Calculations of the thermal conductivity of porous materials" authors: Thomas Fiedler, Ekaterina Pesetskaya, Andreas Öchsner, José Grácio year: 2006 –-

+- · WallyToolbox.jl

title: "Calculations of the thermal conductivity of porous materials" authors: Thomas Fiedler, Ekaterina Pesetskaya, Andreas Öchsner, José Grácio year: 2006 –-

diff --git a/dev/References/@Fiedler2007a/index.html b/dev/References/@Fiedler2007a/index.html index 756504cd8..3c8c7ae9a 100644 --- a/dev/References/@Fiedler2007a/index.html +++ b/dev/References/@Fiedler2007a/index.html @@ -1,2 +1,2 @@ -- · WallyToolbox.jl

title: "Calculation of the effective thermal conductivity in composites using finite element and monte carlo methods" authors: Thomas Fiedler, Andreas Öchsner, Nilindu Muthubandara, Irina V. Belova, Graeme E. Murch year: 2007 –-

+- · WallyToolbox.jl

title: "Calculation of the effective thermal conductivity in composites using finite element and monte carlo methods" authors: Thomas Fiedler, Andreas Öchsner, Nilindu Muthubandara, Irina V. Belova, Graeme E. Murch year: 2007 –-

diff --git a/dev/References/@Fiedler2009a/index.html b/dev/References/@Fiedler2009a/index.html index 34696b83e..f153995ac 100644 --- a/dev/References/@Fiedler2009a/index.html +++ b/dev/References/@Fiedler2009a/index.html @@ -1,2 +1,2 @@ -- · WallyToolbox.jl

title: "Computed tomography based finite element analysis of the thermal properties of cellular aluminium" authors: T. Fiedler, E. Solórzano, F. Garcia‐Moreno, A. Öchsner, I. V. Belova, G. E. Murch year: 2009 –-

+- · WallyToolbox.jl

title: "Computed tomography based finite element analysis of the thermal properties of cellular aluminium" authors: T. Fiedler, E. Solórzano, F. Garcia‐Moreno, A. Öchsner, I. V. Belova, G. E. Murch year: 2009 –-

diff --git a/dev/References/@Fogler1999/index.html b/dev/References/@Fogler1999/index.html index 1aaffae89..9ba2dff59 100644 --- a/dev/References/@Fogler1999/index.html +++ b/dev/References/@Fogler1999/index.html @@ -1,2 +1,2 @@ -- · WallyToolbox.jl

title: "Elements of chemical reaction engineering" authors: H. Scott Fogler year: 1999 –-

+- · WallyToolbox.jl

title: "Elements of chemical reaction engineering" authors: H. Scott Fogler year: 1999 –-

diff --git a/dev/References/@Garaniya2012a/index.html b/dev/References/@Garaniya2012a/index.html index ed97830c9..d0d7b9182 100644 --- a/dev/References/@Garaniya2012a/index.html +++ b/dev/References/@Garaniya2012a/index.html @@ -1,2 +1,2 @@ -- · WallyToolbox.jl

title: CFD modelling of heavy fuel oil spray combustion authors: V. Garaniya, L. Goldsworthy year: 2012 URL: https://flair.monash.edu/intranet/proceedings/18afmc/Documents/400%20-%20Garaniya.pdf Drive: https://1drv.ms/b/s!Ar4x-UlrYAiZlbEh7jKBqcgTdikWRQ?e=Zima6B –-

+- · WallyToolbox.jl

title: CFD modelling of heavy fuel oil spray combustion authors: V. Garaniya, L. Goldsworthy year: 2012 URL: https://flair.monash.edu/intranet/proceedings/18afmc/Documents/400%20-%20Garaniya.pdf Drive: https://1drv.ms/b/s!Ar4x-UlrYAiZlbEh7jKBqcgTdikWRQ?e=Zima6B –-

diff --git a/dev/References/@Garaniya2012b/index.html b/dev/References/@Garaniya2012b/index.html index 0e897c367..84f343109 100644 --- a/dev/References/@Garaniya2012b/index.html +++ b/dev/References/@Garaniya2012b/index.html @@ -1,2 +1,2 @@ -- · WallyToolbox.jl

title: Heavy fuel oil combustion modelling using continuous thermodynamics authors: Vikram Garaniya, Laurie Goldsworthy year: 2012 DOI: https://doi.org/10.5988/jime.47.871 Drive: https://1drv.ms/b/s!Ar4x-UlrYAiZlbEigrD3idko7FKcyQ?e=lNld2R –-

+- · WallyToolbox.jl

title: Heavy fuel oil combustion modelling using continuous thermodynamics authors: Vikram Garaniya, Laurie Goldsworthy year: 2012 DOI: https://doi.org/10.5988/jime.47.871 Drive: https://1drv.ms/b/s!Ar4x-UlrYAiZlbEigrD3idko7FKcyQ?e=lNld2R –-

diff --git a/dev/References/@Gidaspow1994/index.html b/dev/References/@Gidaspow1994/index.html index 2bb132d2e..553b3df97 100644 --- a/dev/References/@Gidaspow1994/index.html +++ b/dev/References/@Gidaspow1994/index.html @@ -1,2 +1,2 @@ -- · WallyToolbox.jl

title: "Multiphase flow and fluidization: continuum and kinetic theory descriptions with applications" authors: Dimitri Gidaspow year: 1994 URL: TODO –-

+- · WallyToolbox.jl

title: "Multiphase flow and fluidization: continuum and kinetic theory descriptions with applications" authors: Dimitri Gidaspow year: 1994 URL: TODO –-

diff --git a/dev/References/@Gorog1981a/index.html b/dev/References/@Gorog1981a/index.html index 216ed9d90..c61559c48 100644 --- a/dev/References/@Gorog1981a/index.html +++ b/dev/References/@Gorog1981a/index.html @@ -1,2 +1,2 @@ -- · WallyToolbox.jl

title: Radiative heat transfer in rotary kilns authors: J. P. Gorog, J. K. Brimacombe, T. N. Adams year: 1981 –-

+- · WallyToolbox.jl

title: Radiative heat transfer in rotary kilns authors: J. P. Gorog, J. K. Brimacombe, T. N. Adams year: 1981 –-

diff --git a/dev/References/@Grosshandler1993/index.html b/dev/References/@Grosshandler1993/index.html index 52111ae9f..921632ffe 100644 --- a/dev/References/@Grosshandler1993/index.html +++ b/dev/References/@Grosshandler1993/index.html @@ -1,2 +1,2 @@ -- · WallyToolbox.jl

title: Radcal – a narrow-band model for radiation calculations in a combustion environment authors: William L. Grosshandler year: 1993 –-

+- · WallyToolbox.jl

title: Radcal – a narrow-band model for radiation calculations in a combustion environment authors: William L. Grosshandler year: 1993 –-

diff --git a/dev/References/@Gunn1978/index.html b/dev/References/@Gunn1978/index.html index e921128ac..897851bff 100644 --- a/dev/References/@Gunn1978/index.html +++ b/dev/References/@Gunn1978/index.html @@ -1,2 +1,2 @@ -- · WallyToolbox.jl

title: Transfer of heat or mass to particles in fixed and fluidised beds authors: D. J. Gunn year: 1978 –-

+- · WallyToolbox.jl

title: Transfer of heat or mass to particles in fixed and fluidised beds authors: D. J. Gunn year: 1978 –-

diff --git a/dev/References/@Guo2023a/index.html b/dev/References/@Guo2023a/index.html index 191233162..c0ba71c35 100644 --- a/dev/References/@Guo2023a/index.html +++ b/dev/References/@Guo2023a/index.html @@ -1,2 +1,2 @@ -- · WallyToolbox.jl

title: "Unraveling the design pattern of physics-informed neural networks: Series 01" authors: Shuai Guo year: 2023 URL: https://towardsdatascience.com/unraveling-the-design-pattern-of-physics-informed-neural-networks-series-01-8190df459527 –-

In this post, the author discusses the work by [[@Wu2022a]] in what concerns the adaptive (resampling and refinement) residual point distribution to boost training and accuracy.

Approaches:

  • RAD: residual-based adaptive distribution (more expensive)
  • RAR-D: residual-based adaptive refinement with distribution (robust)
  • Both are less useful under smooth solutions (activate when required)

Key idea: resample with a probability proportional to residual

\[p(x) \propto \frac{\varepsilon^k(x)}{𝔼[\varepsilon^k(x)]}+C\]

Other references of interest are:

  • [[@Lu2019a]]: residual-based adaptive refinement (RAR-D with high $k$)
  • [[@Nabian2021a]]: importance sampling (RAD with $k=1$ and $c=0$)
+- · WallyToolbox.jl

title: "Unraveling the design pattern of physics-informed neural networks: Series 01" authors: Shuai Guo year: 2023 URL: https://towardsdatascience.com/unraveling-the-design-pattern-of-physics-informed-neural-networks-series-01-8190df459527 –-

In this post, the author discusses the work by [[@Wu2022a]] in what concerns the adaptive (resampling and refinement) residual point distribution to boost training and accuracy.

Approaches:

  • RAD: residual-based adaptive distribution (more expensive)
  • RAR-D: residual-based adaptive refinement with distribution (robust)
  • Both are less useful under smooth solutions (activate when required)

Key idea: resample with a probability proportional to residual

\[p(x) \propto \frac{\varepsilon^k(x)}{𝔼[\varepsilon^k(x)]}+C\]

Other references of interest are:

  • [[@Lu2019a]]: residual-based adaptive refinement (RAR-D with high $k$)
  • [[@Nabian2021a]]: importance sampling (RAD with $k=1$ and $c=0$)
diff --git a/dev/References/@Guo2023b/index.html b/dev/References/@Guo2023b/index.html index 9bb820613..8dd6adac8 100644 --- a/dev/References/@Guo2023b/index.html +++ b/dev/References/@Guo2023b/index.html @@ -1,2 +1,2 @@ -- · WallyToolbox.jl

title: "Unraveling the design pattern of physics-informed neural networks: Series 02" authors: Shuai Guo year: 2023 URL: TODO –-

+- · WallyToolbox.jl

title: "Unraveling the design pattern of physics-informed neural networks: Series 02" authors: Shuai Guo year: 2023 URL: TODO –-

diff --git a/dev/References/@Guo2023c/index.html b/dev/References/@Guo2023c/index.html index 822c63c40..4a7368da2 100644 --- a/dev/References/@Guo2023c/index.html +++ b/dev/References/@Guo2023c/index.html @@ -1,2 +1,2 @@ -- · WallyToolbox.jl

title: "Unraveling the design pattern of physics-informed neural networks: Series 03" authors: Shuai Guo year: 2023 URL: https://towardsdatascience.com/unraveling-the-design-pattern-of-physics-informed-neural-networks-part-03-fe365ef480d9 –- Discussed [[@Krishnapriyan2021a]]

+- · WallyToolbox.jl

title: "Unraveling the design pattern of physics-informed neural networks: Series 03" authors: Shuai Guo year: 2023 URL: https://towardsdatascience.com/unraveling-the-design-pattern-of-physics-informed-neural-networks-part-03-fe365ef480d9 –- Discussed [[@Krishnapriyan2021a]]

diff --git a/dev/References/@Guo2023d/index.html b/dev/References/@Guo2023d/index.html index 954c630c9..6b24e5fd9 100644 --- a/dev/References/@Guo2023d/index.html +++ b/dev/References/@Guo2023d/index.html @@ -1,2 +1,2 @@ -- · WallyToolbox.jl

title: "Unraveling the design pattern of physics-informed neural networks: Series 04" authors: Shuai Guo year: 2023 URL: https://towardsdatascience.com/unraveling-the-design-pattern-of-physics-informed-neural-networks-part-04-c778f4829dde –- Discussed [[@Yu2022a]].

+- · WallyToolbox.jl

title: "Unraveling the design pattern of physics-informed neural networks: Series 04" authors: Shuai Guo year: 2023 URL: https://towardsdatascience.com/unraveling-the-design-pattern-of-physics-informed-neural-networks-part-04-c778f4829dde –- Discussed [[@Yu2022a]].

diff --git a/dev/References/@Guo2023e/index.html b/dev/References/@Guo2023e/index.html index d9946cce7..dc182039f 100644 --- a/dev/References/@Guo2023e/index.html +++ b/dev/References/@Guo2023e/index.html @@ -1,2 +1,2 @@ -- · WallyToolbox.jl

title: "Unraveling the design pattern of physics-informed neural networks: Series 05" authors: Shuai Guo year: 2023 URL: https://towardsdatascience.com/unraveling-the-design-pattern-of-physics-informed-neural-networks-part-05-67a35a984b23 –-

+- · WallyToolbox.jl

title: "Unraveling the design pattern of physics-informed neural networks: Series 05" authors: Shuai Guo year: 2023 URL: https://towardsdatascience.com/unraveling-the-design-pattern-of-physics-informed-neural-networks-part-05-67a35a984b23 –-

diff --git a/dev/References/@Guo2023f/index.html b/dev/References/@Guo2023f/index.html index 88ce58301..088e44c4d 100644 --- a/dev/References/@Guo2023f/index.html +++ b/dev/References/@Guo2023f/index.html @@ -1,2 +1,2 @@ -- · WallyToolbox.jl

title: "Unraveling the design pattern of physics-informed neural networks: Series 06" authors: Shuai Guo year: 2023 URL: https://towardsdatascience.com/unraveling-the-design-pattern-of-physics-informed-neural-networks-part-06-bcb3557199e2 –-

+- · WallyToolbox.jl

title: "Unraveling the design pattern of physics-informed neural networks: Series 06" authors: Shuai Guo year: 2023 URL: https://towardsdatascience.com/unraveling-the-design-pattern-of-physics-informed-neural-networks-part-06-bcb3557199e2 –-

diff --git a/dev/References/@Guo2023g/index.html b/dev/References/@Guo2023g/index.html index 8166e27e6..61214c9d6 100644 --- a/dev/References/@Guo2023g/index.html +++ b/dev/References/@Guo2023g/index.html @@ -1,2 +1,2 @@ -- · WallyToolbox.jl

title: "Unraveling the design pattern of physics-informed neural networks: Series 07" authors: Shuai Guo year: 2023 URL: https://towardsdatascience.com/unraveling-the-design-pattern-of-physics-informed-neural-networks-part-07-4ecb543b616a –-

+- · WallyToolbox.jl

title: "Unraveling the design pattern of physics-informed neural networks: Series 07" authors: Shuai Guo year: 2023 URL: https://towardsdatascience.com/unraveling-the-design-pattern-of-physics-informed-neural-networks-part-07-4ecb543b616a –-

diff --git a/dev/References/@Guo2024a/index.html b/dev/References/@Guo2024a/index.html index ea97952b8..9d5097b8e 100644 --- a/dev/References/@Guo2024a/index.html +++ b/dev/References/@Guo2024a/index.html @@ -1,2 +1,2 @@ -- · WallyToolbox.jl

title: "Physics-informed neural networks: An application-centric guide" authors: Shuai Guo year: 2024 URL: https://towardsdatascience.com/physics-informed-neural-networks-an-application-centric-guide-dc1013526b02 –-

+- · WallyToolbox.jl

title: "Physics-informed neural networks: An application-centric guide" authors: Shuai Guo year: 2024 URL: https://towardsdatascience.com/physics-informed-neural-networks-an-application-centric-guide-dc1013526b02 –-

diff --git a/dev/References/@Haghighat2021sciann/index.html b/dev/References/@Haghighat2021sciann/index.html index a13fa8a42..b10027b60 100644 --- a/dev/References/@Haghighat2021sciann/index.html +++ b/dev/References/@Haghighat2021sciann/index.html @@ -1,2 +1,2 @@ -- · WallyToolbox.jl

title: "SciANN: A Keras/TensorFlow wrapper for scientific computations and physics-informed deep learning using artificial neural networks" authors: Ehsan Haghighat, Ruben Juanes year: 2021 DOI: https://doi.org/10.48550/arXiv.2005.08803 –-

+- · WallyToolbox.jl

title: "SciANN: A Keras/TensorFlow wrapper for scientific computations and physics-informed deep learning using artificial neural networks" authors: Ehsan Haghighat, Ruben Juanes year: 2021 DOI: https://doi.org/10.48550/arXiv.2005.08803 –-

diff --git a/dev/References/@Haider1989/index.html b/dev/References/@Haider1989/index.html index 27bcc588a..dc83e1957 100644 --- a/dev/References/@Haider1989/index.html +++ b/dev/References/@Haider1989/index.html @@ -1,2 +1,2 @@ -- · WallyToolbox.jl

title: Drag coefficient and terminal velocity of spherical and nonspherical particles authors: A. Haider, O. Levenspiel year: 1989 URL: TODO –-

+- · WallyToolbox.jl

title: Drag coefficient and terminal velocity of spherical and nonspherical particles authors: A. Haider, O. Levenspiel year: 1989 URL: TODO –-

diff --git a/dev/References/@Haitsiukevich2022a/index.html b/dev/References/@Haitsiukevich2022a/index.html index 20b2e3f9c..01135c8b2 100644 --- a/dev/References/@Haitsiukevich2022a/index.html +++ b/dev/References/@Haitsiukevich2022a/index.html @@ -1,2 +1,2 @@ -- · WallyToolbox.jl

title: Improved training of physics-informed neural networks with model ensembles authors: Katsiaryna Haitsiukevich, Alexander Ilin year: 2022 URL: https://doi.org/10.48550/arXiv.2204.05108 –-

+- · WallyToolbox.jl

title: Improved training of physics-informed neural networks with model ensembles authors: Katsiaryna Haitsiukevich, Alexander Ilin year: 2022 URL: https://doi.org/10.48550/arXiv.2204.05108 –-

diff --git a/dev/References/@Hanein2017/index.html b/dev/References/@Hanein2017/index.html index 2d3f09f49..7f4d68835 100644 --- a/dev/References/@Hanein2017/index.html +++ b/dev/References/@Hanein2017/index.html @@ -1,2 +1,2 @@ -- · WallyToolbox.jl

title: "One-dimensional steady-state thermal model for rotary kilns used in the manufacture of cement" authors: Theodore Hanein, Frederik P. Glasser, Marcus N. Bannerman year: 2017 –-

+- · WallyToolbox.jl

title: "One-dimensional steady-state thermal model for rotary kilns used in the manufacture of cement" authors: Theodore Hanein, Frederik P. Glasser, Marcus N. Bannerman year: 2017 –-

diff --git a/dev/References/@Hindmarsh2005/index.html b/dev/References/@Hindmarsh2005/index.html index 1830a552c..d8d342a3f 100644 --- a/dev/References/@Hindmarsh2005/index.html +++ b/dev/References/@Hindmarsh2005/index.html @@ -1,2 +1,2 @@ -- · WallyToolbox.jl

title: "SUNDIALS: Suite of nonlinear and Differential/Algebraic equation solvers" authors: Alan C. Hindmarsh, Peter N. Brown, Keith E. Grant, Steven L. Lee, Radu Serban, Dan E. Shumaker, Carol S. Woodward year: 2005 –-

+- · WallyToolbox.jl

title: "SUNDIALS: Suite of nonlinear and Differential/Algebraic equation solvers" authors: Alan C. Hindmarsh, Peter N. Brown, Keith E. Grant, Steven L. Lee, Radu Serban, Dan E. Shumaker, Carol S. Woodward year: 2005 –-

diff --git a/dev/References/@Hristov2023/index.html b/dev/References/@Hristov2023/index.html index 5905f753d..0cb295030 100644 --- a/dev/References/@Hristov2023/index.html +++ b/dev/References/@Hristov2023/index.html @@ -1,2 +1,2 @@ -- · WallyToolbox.jl

title: "Transient heat conduction with variable thermophysical properties power-law temperature-depenent heat capacity and thermal conductivity" authors: Jordan Hristov year: 2023 –-

  • Take care, paper content is poor and full of typos!
  • Derivation for semi-infinite media
  • Temperature dependent heat capacity
  • Can we really say $h=\rho{}c_{p}T$ in all cases?
  • Argument about lack of exponents in literature is poor. In fact data is fitted to polynomials mainly because simple exponentials as proposed by the author would not properly represent experimental data in most cases (and certainly not fit Calphad requirements)!
+- · WallyToolbox.jl

title: "Transient heat conduction with variable thermophysical properties power-law temperature-depenent heat capacity and thermal conductivity" authors: Jordan Hristov year: 2023 –-

  • Take care, paper content is poor and full of typos!
  • Derivation for semi-infinite media
  • Temperature dependent heat capacity
  • Can we really say $h=\rho{}c_{p}T$ in all cases?
  • Argument about lack of exponents in literature is poor. In fact data is fitted to polynomials mainly because simple exponentials as proposed by the author would not properly represent experimental data in most cases (and certainly not fit Calphad requirements)!
diff --git a/dev/References/@Jeong1995a/index.html b/dev/References/@Jeong1995a/index.html index 84e7cb974..999ca508e 100644 --- a/dev/References/@Jeong1995a/index.html +++ b/dev/References/@Jeong1995a/index.html @@ -1,2 +1,2 @@ -- · WallyToolbox.jl

title: On the identification of a vortex authors: Jinhee Jeong, Fazle Hussain year: 1995 URL: https://doi.org/10.1017/S0022112095000462 Drive: –-

+- · WallyToolbox.jl

title: On the identification of a vortex authors: Jinhee Jeong, Fazle Hussain year: 1995 URL: https://doi.org/10.1017/S0022112095000462 Drive: –-

diff --git a/dev/References/@Joos1958/index.html b/dev/References/@Joos1958/index.html index fb53e188d..a2ee91d1f 100644 --- a/dev/References/@Joos1958/index.html +++ b/dev/References/@Joos1958/index.html @@ -1,2 +1,2 @@ -- · WallyToolbox.jl

title: "Theoretical physics" authors: Georg Joos year: 1986 –-

+- · WallyToolbox.jl

title: "Theoretical physics" authors: Georg Joos year: 1986 –-

diff --git a/dev/References/@Karniadakis2021a/index.html b/dev/References/@Karniadakis2021a/index.html index 9ee8abee8..16c97ab84 100644 --- a/dev/References/@Karniadakis2021a/index.html +++ b/dev/References/@Karniadakis2021a/index.html @@ -1,2 +1,2 @@ -- · WallyToolbox.jl

title: Physics-informed machine learning authors: George Em Karniadakis, Ioannis G. Kevrekidis, Lu Lu, Paris Perdikaris, Sifan Wang, Liu Yang year: 2021 –-

+- · WallyToolbox.jl

title: Physics-informed machine learning authors: George Em Karniadakis, Ioannis G. Kevrekidis, Lu Lu, Paris Perdikaris, Sifan Wang, Liu Yang year: 2021 –-

diff --git a/dev/References/@Kee2017/index.html b/dev/References/@Kee2017/index.html index d58c5a42b..9dd40de49 100644 --- a/dev/References/@Kee2017/index.html +++ b/dev/References/@Kee2017/index.html @@ -1,2 +1,2 @@ -- · WallyToolbox.jl

title: "Chemically reacting flow theory, modeling, and simulation" authors: Robert J. Kee, Michael E. Coltrin, Peter Glarborg, Huayang Zhu year: 2017 –-

+- · WallyToolbox.jl

title: "Chemically reacting flow theory, modeling, and simulation" authors: Robert J. Kee, Michael E. Coltrin, Peter Glarborg, Huayang Zhu year: 2017 –-

diff --git a/dev/References/@Koh1971a/index.html b/dev/References/@Koh1971a/index.html index d29ff3230..a47d8906f 100644 --- a/dev/References/@Koh1971a/index.html +++ b/dev/References/@Koh1971a/index.html @@ -1,2 +1,2 @@ -- · WallyToolbox.jl

title: "Thermal conductivity and electrical resistivity of porous metallic materials" authors: J. C. Y. Koh, Anthony Fortini year: 1971 –-

+- · WallyToolbox.jl

title: "Thermal conductivity and electrical resistivity of porous metallic materials" authors: J. C. Y. Koh, Anthony Fortini year: 1971 –-

diff --git a/dev/References/@Koh1973a/index.html b/dev/References/@Koh1973a/index.html index dd3bb7757..5fd701ae3 100644 --- a/dev/References/@Koh1973a/index.html +++ b/dev/References/@Koh1973a/index.html @@ -1,2 +1,2 @@ -- · WallyToolbox.jl

title: "Prediction of thermal conductivity and electrical resistivity of porous metallic materials" authors: J. C. Y. Koh, Anthony Fortini year: 1973 –-

+- · WallyToolbox.jl

title: "Prediction of thermal conductivity and electrical resistivity of porous metallic materials" authors: J. C. Y. Koh, Anthony Fortini year: 1973 –-

diff --git a/dev/References/@Kramers1952/index.html b/dev/References/@Kramers1952/index.html index 7de142476..da8bd6127 100644 --- a/dev/References/@Kramers1952/index.html +++ b/dev/References/@Kramers1952/index.html @@ -1,2 +1,2 @@ -- · WallyToolbox.jl

title: The passage of granular solids through inclined rotary kilns authors: H. Kramers, P. Croockewit year: 1952 –-

+- · WallyToolbox.jl

title: The passage of granular solids through inclined rotary kilns authors: H. Kramers, P. Croockewit year: 1952 –-

diff --git a/dev/References/@Krishnapriyan2021a/index.html b/dev/References/@Krishnapriyan2021a/index.html index f12fd9ed8..dcae9d7a9 100644 --- a/dev/References/@Krishnapriyan2021a/index.html +++ b/dev/References/@Krishnapriyan2021a/index.html @@ -1,2 +1,2 @@ -- · WallyToolbox.jl

title: Characterizing possible failure modes in physics-informed neural networks authors: Aditi S. Krishnapriyan, Amir Gholami, Shandian Zhe, Robert M. Kirby, Michael W. Mahoney year: 2021 DOI: https://doi.org/10.48550/arXiv.2109.01050 Drive: https://1drv.ms/b/s!Ar4x-UlrYAiZla8bwpowG74YkMl_tA?e=DmUIjw –-

+- · WallyToolbox.jl

title: Characterizing possible failure modes in physics-informed neural networks authors: Aditi S. Krishnapriyan, Amir Gholami, Shandian Zhe, Robert M. Kirby, Michael W. Mahoney year: 2021 DOI: https://doi.org/10.48550/arXiv.2109.01050 Drive: https://1drv.ms/b/s!Ar4x-UlrYAiZla8bwpowG74YkMl_tA?e=DmUIjw –-

diff --git a/dev/References/@Lagaris1997a/index.html b/dev/References/@Lagaris1997a/index.html index 95cea51a0..0ecf3bc10 100644 --- a/dev/References/@Lagaris1997a/index.html +++ b/dev/References/@Lagaris1997a/index.html @@ -1,2 +1,2 @@ -- · WallyToolbox.jl

title: Artificial neural networks for solving ordinary and partial differential equations authors: I. E. Lagaris, A. Likas, D. I. Fotiadis year: 1997 –-

+- · WallyToolbox.jl

title: Artificial neural networks for solving ordinary and partial differential equations authors: I. E. Lagaris, A. Likas, D. I. Fotiadis year: 1997 –-

diff --git a/dev/References/@Launder1974/index.html b/dev/References/@Launder1974/index.html index 13123c2e7..45a5f45a2 100644 --- a/dev/References/@Launder1974/index.html +++ b/dev/References/@Launder1974/index.html @@ -1,2 +1,2 @@ -- · WallyToolbox.jl

title: The numerical computation of turbulent flows authors: B. E. Launder, D. B. Spalding year: 1974 –-

+- · WallyToolbox.jl

title: The numerical computation of turbulent flows authors: B. E. Launder, D. B. Spalding year: 1974 –-

diff --git a/dev/References/@Lawn1987/index.html b/dev/References/@Lawn1987/index.html index aac8c463c..5065efc21 100644 --- a/dev/References/@Lawn1987/index.html +++ b/dev/References/@Lawn1987/index.html @@ -1,7 +1,7 @@ -- · WallyToolbox.jl

title: Principles of combustion engineering for boilers authors: C. J. Lawn year: 1987 –-

Chapter 2 - The combustion of HFO

Main constituents: paraffins, naphthenes ($C_5-C_9$), and aromatics. Specially useful due to its high specific energy content and high density (easy to transport), easily atomized, and almost completely combustible.

Correlation index $CI$ against relative density $S$ and reciprocal of average boiling point is a good indicator of oil major components:

\[CI = 473.9S - 456.8 + \frac{48640}{T_B} +- · WallyToolbox.jl


title: Principles of combustion engineering for boilers authors: C. J. Lawn year: 1987 –-

Chapter 2 - The combustion of HFO

Main constituents: paraffins, naphthenes ($C_5-C_9$), and aromatics. Specially useful due to its high specific energy content and high density (easy to transport), easily atomized, and almost completely combustible.

Correlation index $CI$ against relative density $S$ and reciprocal of average boiling point is a good indicator of oil major components:

\[CI = 473.9S - 456.8 + \frac{48640}{T_B} \quad\begin{cases} CI > 50 & \text{Predominantly aromatic components}\\[6pt] 15 < CI < 50 & \text{Mainly naphthenes or a mixture of all types}\\[6pt] 15 > CI & \text{Predominantly paraffinic components} -\end{cases}\]

Typical elemental composition (given in mass percentages):

Elementwt%
Carbon83-87
Hydrogen10-14
Suphur0.05-6
Nitrogen0.1-2
Oxygen0.05-1.5

Viscosity is highly dependent on temperature and used to control the characteristics of atomization in burners; for class G (main industrial application) of BS 2869 the typical kinematic viscosity at 80 °C is limited to 85 cSt; its maximum water content is 1% and ash production 0f 0.25% (see Table II for details and other classes). Viscosity is known to deviate from Newtonian at near pour point and the boiling point of its more volatile components.

When decreasing the hydrogen to carbon ratio the specific energy is also decreased, and this follows an increase of specific density of fuels. According to BS 2869, the net calorific value can be estimated from the density of the oil $\rho_{l}\:[kg\cdotp{}l^ {-1}]$ at 15 °C:

\[\Delta{}H_{net}=\left(46.423-8.792\rho_{l}^{2}+3.170\rho_{l}\right)\left(1-x-y-s\right)+9.420s-2.449x\]

where $x$ is the mass fraction of water, $y$ the mass fraction of ash, and $s$ the mass fraction of Sulphur; the resulting value is provided in $MJ\cdotp{}kg^{-1}$. Deviations are reported to be less than 1% when compared to bomb calorimetry data. Regarding specific heat a quite old (Cragoe, 1929) relationship based on relative density $S$ is given in $J\cdotp{}kg^{-1}$ as:

\[c_{p} = \frac{1683 + 3.39T}{S}\]

Typical value of surface tension are generally around $24-38\times{}10^{-3}\:N\cdotp{}m^{-1}$ at 20 °C and present a typical slope of $-0.07\times{}10^{-3}\:N\cdotp{}m^{-1}K^{-1}$ from room temperature up to 120 °C. Notice that this may be highly affected by actual fuel composition, so estimations must be used with care.

Combustion characteristics in general: maximum droplet heating rate around $10^5\:{}K\cdotp{}s^{-1}$ and flame temperatures of $2120\:{}K$, with a fuel residence time $<2\:{}s$. Droplets are generally injected from fractions of micron to $500\:{}\mu{}m$. The mechanism of combustion generally happens as follows:

  1. Volatiles phase: occurs between 250-350 °C and is characterized by the formation of a volatiles shell around the droplets, giving an aspect of granularity. It evolves till the unset of boiling, which occurs quite sharply somewhere in range 300-400 °C. Boiling leads to distortion and swealing, favoring breakup; several ejections might occur at this stage. The competing mechanisms during this phase are distillation and pyrolysis; the fuel composition and heating rate will determine the prevailing one.

See figures 8-9 of reference for more details regarding droplet history.

+\end{cases}\]

Typical elemental composition (given in mass percentages):

Elementwt%
Carbon83-87
Hydrogen10-14
Suphur0.05-6
Nitrogen0.1-2
Oxygen0.05-1.5

Viscosity is highly dependent on temperature and used to control the characteristics of atomization in burners; for class G (main industrial application) of BS 2869 the typical kinematic viscosity at 80 °C is limited to 85 cSt; its maximum water content is 1% and ash production 0f 0.25% (see Table II for details and other classes). Viscosity is known to deviate from Newtonian at near pour point and the boiling point of its more volatile components.

When decreasing the hydrogen to carbon ratio the specific energy is also decreased, and this follows an increase of specific density of fuels. According to BS 2869, the net calorific value can be estimated from the density of the oil $\rho_{l}\:[kg\cdotp{}l^ {-1}]$ at 15 °C:

\[\Delta{}H_{net}=\left(46.423-8.792\rho_{l}^{2}+3.170\rho_{l}\right)\left(1-x-y-s\right)+9.420s-2.449x\]

where $x$ is the mass fraction of water, $y$ the mass fraction of ash, and $s$ the mass fraction of Sulphur; the resulting value is provided in $MJ\cdotp{}kg^{-1}$. Deviations are reported to be less than 1% when compared to bomb calorimetry data. Regarding specific heat a quite old (Cragoe, 1929) relationship based on relative density $S$ is given in $J\cdotp{}kg^{-1}$ as:

\[c_{p} = \frac{1683 + 3.39T}{S}\]

Typical value of surface tension are generally around $24-38\times{}10^{-3}\:N\cdotp{}m^{-1}$ at 20 °C and present a typical slope of $-0.07\times{}10^{-3}\:N\cdotp{}m^{-1}K^{-1}$ from room temperature up to 120 °C. Notice that this may be highly affected by actual fuel composition, so estimations must be used with care.

Combustion characteristics in general: maximum droplet heating rate around $10^5\:{}K\cdotp{}s^{-1}$ and flame temperatures of $2120\:{}K$, with a fuel residence time $<2\:{}s$. Droplets are generally injected from fractions of micron to $500\:{}\mu{}m$. The mechanism of combustion generally happens as follows:

  1. Volatiles phase: occurs between 250-350 °C and is characterized by the formation of a volatiles shell around the droplets, giving an aspect of granularity. It evolves till the unset of boiling, which occurs quite sharply somewhere in range 300-400 °C. Boiling leads to distortion and swealing, favoring breakup; several ejections might occur at this stage. The competing mechanisms during this phase are distillation and pyrolysis; the fuel composition and heating rate will determine the prevailing one.

See figures 8-9 of reference for more details regarding droplet history.

diff --git a/dev/References/@Lay2012/index.html b/dev/References/@Lay2012/index.html index 00ba54e31..c69c889a9 100644 --- a/dev/References/@Lay2012/index.html +++ b/dev/References/@Lay2012/index.html @@ -1,2 +1,2 @@ -- · WallyToolbox.jl

title: "Linear algebra and its applications" authors: David C. Lay year: 2012 –-

+- · WallyToolbox.jl

title: "Linear algebra and its applications" authors: David C. Lay year: 2012 –-

diff --git a/dev/References/@Lehrer1930/index.html b/dev/References/@Lehrer1930/index.html index 045955d7f..3829da647 100644 --- a/dev/References/@Lehrer1930/index.html +++ b/dev/References/@Lehrer1930/index.html @@ -1,2 +1,2 @@ -- · WallyToolbox.jl

title: Über das eisen-wasserstoff- ammoniak-gleichgewicht authors: E. Lehrer year: 1930 –-

+- · WallyToolbox.jl

title: Über das eisen-wasserstoff- ammoniak-gleichgewicht authors: E. Lehrer year: 1930 –-

diff --git a/dev/References/@Liu1993/index.html b/dev/References/@Liu1993/index.html index 2dc0c03cb..6d6ac8e48 100644 --- a/dev/References/@Liu1993/index.html +++ b/dev/References/@Liu1993/index.html @@ -1,2 +1,2 @@ -- · WallyToolbox.jl

title: Modeling the effects of drop drag and breakup on fuel sprays authors: Alex B. Liu, Daniel Mather, Rolf D. Reitz year: 1993 URL: " https://doi.org/10.4271/930072." –- Also check Reitz1987 [15].

+- · WallyToolbox.jl

title: Modeling the effects of drop drag and breakup on fuel sprays authors: Alex B. Liu, Daniel Mather, Rolf D. Reitz year: 1993 URL: " https://doi.org/10.4271/930072." –- Also check Reitz1987 [15].

diff --git a/dev/References/@Lu2019a/index.html b/dev/References/@Lu2019a/index.html index 5585ff5c5..4b3178801 100644 --- a/dev/References/@Lu2019a/index.html +++ b/dev/References/@Lu2019a/index.html @@ -1,2 +1,2 @@ -- · WallyToolbox.jl

title: "DeepXDE: A deep learning library for solving differential equations" authors: Lu Lu, Xuhui Meng, Zhiping Mao, George E. Karniadakis year: 2019 URL: https://doi.org/10.48550/arXiv.1907.04502 Drive: https://1drv.ms/b/s!Ar4x-UlrYAiZla8eg-cL7mDKg_muqQ?e=hcIqTb –-

+- · WallyToolbox.jl

title: "DeepXDE: A deep learning library for solving differential equations" authors: Lu Lu, Xuhui Meng, Zhiping Mao, George E. Karniadakis year: 2019 URL: https://doi.org/10.48550/arXiv.1907.04502 Drive: https://1drv.ms/b/s!Ar4x-UlrYAiZla8eg-cL7mDKg_muqQ?e=hcIqTb –-

diff --git a/dev/References/@Lu2021a/index.html b/dev/References/@Lu2021a/index.html index 8eea4b3a8..6ee0e6177 100644 --- a/dev/References/@Lu2021a/index.html +++ b/dev/References/@Lu2021a/index.html @@ -1,2 +1,2 @@ -- · WallyToolbox.jl

title: Physics-informed neural networks with hard constraints for inverse design authors: Lu Lu, Raphael Pestourie, Wenjie Yao, Zhicheng Wang, Francesc Verdugo, Steven G. Johnson year: 2021 URL: https://doi.org/10.48550/arXiv.2102.04626 –-

+- · WallyToolbox.jl

title: Physics-informed neural networks with hard constraints for inverse design authors: Lu Lu, Raphael Pestourie, Wenjie Yao, Zhicheng Wang, Francesc Verdugo, Steven G. Johnson year: 2021 URL: https://doi.org/10.48550/arXiv.2102.04626 –-

diff --git a/dev/References/@Luikov1968a/index.html b/dev/References/@Luikov1968a/index.html index ac65ef48e..d4ff2e29e 100644 --- a/dev/References/@Luikov1968a/index.html +++ b/dev/References/@Luikov1968a/index.html @@ -1,2 +1,2 @@ -- · WallyToolbox.jl

title: "Thermal conductivity of porous systems" authors: A.V. Luikov, A.G. Shashkov, L.L. Vasiliev, Yu.E. Fraiman year: 1968 –-

+- · WallyToolbox.jl

title: "Thermal conductivity of porous systems" authors: A.V. Luikov, A.G. Shashkov, L.L. Vasiliev, Yu.E. Fraiman year: 1968 –-

diff --git a/dev/References/@MaierKelley1932/index.html b/dev/References/@MaierKelley1932/index.html index c64be19ce..2b81e72c6 100644 --- a/dev/References/@MaierKelley1932/index.html +++ b/dev/References/@MaierKelley1932/index.html @@ -1,2 +1,2 @@ -- · WallyToolbox.jl

title: "An equation for the representation of high-temperature heat content data" authors: Charles G. Maier, Kenneth Keith Kelley year: 1932 –-

+- · WallyToolbox.jl

title: "An equation for the representation of high-temperature heat content data" authors: Charles G. Maier, Kenneth Keith Kelley year: 1932 –-

diff --git a/dev/References/@Malinen2013a/index.html b/dev/References/@Malinen2013a/index.html index e8181ab78..2af3fa181 100644 --- a/dev/References/@Malinen2013a/index.html +++ b/dev/References/@Malinen2013a/index.html @@ -1,2 +1,2 @@ -- · WallyToolbox.jl

title: "Elmer finite element solver for multiphysics and multiscale problems" authors: Mika Malinen, Peter Råback year: 2013 –-

+- · WallyToolbox.jl

title: "Elmer finite element solver for multiphysics and multiscale problems" authors: Mika Malinen, Peter Råback year: 2013 –-

diff --git a/dev/References/@Masamune1963a/index.html b/dev/References/@Masamune1963a/index.html index 743e96e78..477f9bd49 100644 --- a/dev/References/@Masamune1963a/index.html +++ b/dev/References/@Masamune1963a/index.html @@ -1,2 +1,2 @@ -- · WallyToolbox.jl

title: "Thermal conductivity of beds of spherical particles" authors: Shinobu Masamune, J. M. Smith year: 1963 –-

+- · WallyToolbox.jl

title: "Thermal conductivity of beds of spherical particles" authors: Shinobu Masamune, J. M. Smith year: 1963 –-

diff --git a/dev/References/@Mehrer2007/index.html b/dev/References/@Mehrer2007/index.html index 79a5c7c87..a0aa25b4b 100644 --- a/dev/References/@Mehrer2007/index.html +++ b/dev/References/@Mehrer2007/index.html @@ -1,2 +1,2 @@ -- · WallyToolbox.jl

title: "Diffusion in solids : Fundamentals, methods, materials, diffusion-controlled processes" authors: Helmut Mehrer year: 2007 –-

+- · WallyToolbox.jl

title: "Diffusion in solids : Fundamentals, methods, materials, diffusion-controlled processes" authors: Helmut Mehrer year: 2007 –-

diff --git a/dev/References/@Mittemeijer1988/index.html b/dev/References/@Mittemeijer1988/index.html index 635a8ce46..74b4e8b6d 100644 --- a/dev/References/@Mittemeijer1988/index.html +++ b/dev/References/@Mittemeijer1988/index.html @@ -1,2 +1,2 @@ -- · WallyToolbox.jl

title: "Analysis of nonisothermal transformation kinetics; tempering of iron-carbon and iron-nitrogen martensites" authors: E. J. Mittemeijer, Liu Cheng, P. J. van der Schaaf, C. M. Brakman, B. M. Korevaar year: 1988 –-

+- · WallyToolbox.jl

title: "Analysis of nonisothermal transformation kinetics; tempering of iron-carbon and iron-nitrogen martensites" authors: E. J. Mittemeijer, Liu Cheng, P. J. van der Schaaf, C. M. Brakman, B. M. Korevaar year: 1988 –-

diff --git a/dev/References/@Mraz2021a/index.html b/dev/References/@Mraz2021a/index.html index b5a6a375b..6af290334 100644 --- a/dev/References/@Mraz2021a/index.html +++ b/dev/References/@Mraz2021a/index.html @@ -1,2 +1,2 @@ -- · WallyToolbox.jl

title: "Thermal conductivity of porous oxide layer: A numerical model based on CT data" authors: Krystof Mraz, Jan Bohacek, Ondrej Resl, Martin Chabicovsky, Ebrahim Karimi-Sibaki year: 2021 –-

+- · WallyToolbox.jl

title: "Thermal conductivity of porous oxide layer: A numerical model based on CT data" authors: Krystof Mraz, Jan Bohacek, Ondrej Resl, Martin Chabicovsky, Ebrahim Karimi-Sibaki year: 2021 –-

diff --git a/dev/References/@Mujumdar2006i/index.html b/dev/References/@Mujumdar2006i/index.html index a5093e1bf..cef0d23bd 100644 --- a/dev/References/@Mujumdar2006i/index.html +++ b/dev/References/@Mujumdar2006i/index.html @@ -1,2 +1,2 @@ -- · WallyToolbox.jl

title: "Simulation of rotary cement kilns using a one-dimensional model" authors: Kaustubh S. Mujumdar, Vivek V. Ranade year: 2006 –-

+- · WallyToolbox.jl

title: "Simulation of rotary cement kilns using a one-dimensional model" authors: Kaustubh S. Mujumdar, Vivek V. Ranade year: 2006 –-

diff --git a/dev/References/@Nabian2021a/index.html b/dev/References/@Nabian2021a/index.html index 839550b11..ca260d970 100644 --- a/dev/References/@Nabian2021a/index.html +++ b/dev/References/@Nabian2021a/index.html @@ -1,2 +1,2 @@ -- · WallyToolbox.jl

title: Efficient training of physics-informed neural networks via importance sampling authors: Mohammad Amin Nabian, Rini Jasmine Gladstone, Hadi Meidani year: 2021 URL: https://doi.org/10.48550/arXiv.2104.12325 –-

+- · WallyToolbox.jl

title: Efficient training of physics-informed neural networks via importance sampling authors: Mohammad Amin Nabian, Rini Jasmine Gladstone, Hadi Meidani year: 2021 URL: https://doi.org/10.48550/arXiv.2104.12325 –-

diff --git a/dev/References/@Nakayama2023/index.html b/dev/References/@Nakayama2023/index.html index de969a7c0..a255f8700 100644 --- a/dev/References/@Nakayama2023/index.html +++ b/dev/References/@Nakayama2023/index.html @@ -1,2 +1,2 @@ -- · WallyToolbox.jl

title: "Effective thermal conductivity of porous media" authors: Akira Nakayama year: 2023 –-

+- · WallyToolbox.jl

title: "Effective thermal conductivity of porous media" authors: Akira Nakayama year: 2023 –-

diff --git a/dev/References/@Nowruzi2014/index.html b/dev/References/@Nowruzi2014/index.html index 937121de6..c1bcbd9f0 100644 --- a/dev/References/@Nowruzi2014/index.html +++ b/dev/References/@Nowruzi2014/index.html @@ -1,2 +1,2 @@ -- · WallyToolbox.jl

title: Numerical simulation of non-evaporating and non-reacting heavy fuel oil injection spray in medium speed engines using OpenFOAM authors: Hashem Nowruzi, Parviz Ghadimi, Mehdi Yousefifard, Mohammad A. Feiz Chekab year: 2014 URL: https://doi.org/10.14810/ijmech.2014.3206 Drive: https://1drv.ms/b/s!Ar4x-UlrYAiZlbEf-L95SgshO8_Nhg?e=jKpxyO –-

+- · WallyToolbox.jl

title: Numerical simulation of non-evaporating and non-reacting heavy fuel oil injection spray in medium speed engines using OpenFOAM authors: Hashem Nowruzi, Parviz Ghadimi, Mehdi Yousefifard, Mohammad A. Feiz Chekab year: 2014 URL: https://doi.org/10.14810/ijmech.2014.3206 Drive: https://1drv.ms/b/s!Ar4x-UlrYAiZlbEf-L95SgshO8_Nhg?e=jKpxyO –-

diff --git a/dev/References/@ORourke2010/index.html b/dev/References/@ORourke2010/index.html index 311a2ef6a..24f4c2378 100644 --- a/dev/References/@ORourke2010/index.html +++ b/dev/References/@ORourke2010/index.html @@ -1,2 +1,2 @@ -- · WallyToolbox.jl

title: An improved collision damping time for MP-PIC calculations of dense particle flows with applications to polydisperse sedimenting beds and colliding particle jets authors: Peter J. O’Rourke, Dale M. Snider year: 2010 URL: https://doi.org/10.1016/j.ces.2010.08.032 –-

+- · WallyToolbox.jl

title: An improved collision damping time for MP-PIC calculations of dense particle flows with applications to polydisperse sedimenting beds and colliding particle jets authors: Peter J. O’Rourke, Dale M. Snider year: 2010 URL: https://doi.org/10.1016/j.ces.2010.08.032 –-

diff --git a/dev/References/@Onsager1931/index.html b/dev/References/@Onsager1931/index.html index 57a16f745..baf2c244b 100644 --- a/dev/References/@Onsager1931/index.html +++ b/dev/References/@Onsager1931/index.html @@ -1,2 +1,2 @@ -- · WallyToolbox.jl

title: Reciprocal relations in irreversible processes. I. authors: Lars Onsager year: 1931 –-

+- · WallyToolbox.jl

title: Reciprocal relations in irreversible processes. I. authors: Lars Onsager year: 1931 –-

diff --git a/dev/References/@Onsager1931a/index.html b/dev/References/@Onsager1931a/index.html index 4fae09da1..47a912a51 100644 --- a/dev/References/@Onsager1931a/index.html +++ b/dev/References/@Onsager1931a/index.html @@ -1,2 +1,2 @@ -- · WallyToolbox.jl

title: Reciprocal relations in irreversible processes. II. authors: Lars Onsager year: 1931 –-

+- · WallyToolbox.jl

title: Reciprocal relations in irreversible processes. II. authors: Lars Onsager year: 1931 –-

diff --git a/dev/References/@Patankar1980/index.html b/dev/References/@Patankar1980/index.html index b88d12d10..b2e00f9b9 100644 --- a/dev/References/@Patankar1980/index.html +++ b/dev/References/@Patankar1980/index.html @@ -1,2 +1,2 @@ -- · WallyToolbox.jl

title: Numerical heat transfer and fluid flow authors: Suhas V. Patankar year: 1980 –-

+- · WallyToolbox.jl

title: Numerical heat transfer and fluid flow authors: Suhas V. Patankar year: 1980 –-

diff --git a/dev/References/@Pena2001a/index.html b/dev/References/@Pena2001a/index.html index 67c9dff0b..717e1183c 100644 --- a/dev/References/@Pena2001a/index.html +++ b/dev/References/@Pena2001a/index.html @@ -1,2 +1,2 @@ -- · WallyToolbox.jl

title: Stability of Turing patterns in the Brusselator model authors: B. Peña, C. Pérez-García year: 2001 URL: https://doi.org/10.1103/PhysRevE.64.056213 Drive: –-

+- · WallyToolbox.jl

title: Stability of Turing patterns in the Brusselator model authors: B. Peña, C. Pérez-García year: 2001 URL: https://doi.org/10.1103/PhysRevE.64.056213 Drive: –-

diff --git a/dev/References/@Pia2016a/index.html b/dev/References/@Pia2016a/index.html index f9ff95590..01a93042e 100644 --- a/dev/References/@Pia2016a/index.html +++ b/dev/References/@Pia2016a/index.html @@ -1,2 +1,2 @@ -- · WallyToolbox.jl

title: "Porosity and pore size distribution influence on thermal conductivity of yttria-stabilized zirconia: Experimental findings and model predictions" authors: Giorgio Pia, Ludovica Casnedi, Ulrico Sanna year: 2016 –-

+- · WallyToolbox.jl

title: "Porosity and pore size distribution influence on thermal conductivity of yttria-stabilized zirconia: Experimental findings and model predictions" authors: Giorgio Pia, Ludovica Casnedi, Ulrico Sanna year: 2016 –-

diff --git a/dev/References/@Plessis1988/index.html b/dev/References/@Plessis1988/index.html index 0dd0e8271..0ce48cd91 100644 --- a/dev/References/@Plessis1988/index.html +++ b/dev/References/@Plessis1988/index.html @@ -1,2 +1,2 @@ -- · WallyToolbox.jl

title: Mathematical modelling of flow through consolidated isotropic porous media authors: J. Prieur Du Plessis, Jacob H. Masliyah year: 1988 URL: TODO –-

+- · WallyToolbox.jl

title: Mathematical modelling of flow through consolidated isotropic porous media authors: J. Prieur Du Plessis, Jacob H. Masliyah year: 1988 URL: TODO –-

diff --git a/dev/References/@Qiu2018a/index.html b/dev/References/@Qiu2018a/index.html index 761436502..d20485f7b 100644 --- a/dev/References/@Qiu2018a/index.html +++ b/dev/References/@Qiu2018a/index.html @@ -1,2 +1,2 @@ -- · WallyToolbox.jl

title: "Inhomogeneity in pore size appreciably lowering thermal conductivity for porous thermal insulators" authors: Lin Qiu, Hanying Zou, Dawei Tang, Dongsheng Wen, Yanhui Feng, Xinxin Zhang year: 2018 –-

+- · WallyToolbox.jl

title: "Inhomogeneity in pore size appreciably lowering thermal conductivity for porous thermal insulators" authors: Lin Qiu, Hanying Zou, Dawei Tang, Dongsheng Wen, Yanhui Feng, Xinxin Zhang year: 2018 –-

diff --git a/dev/References/@Raissi2017/index.html b/dev/References/@Raissi2017/index.html index 7e6d28ca1..613e2f756 100644 --- a/dev/References/@Raissi2017/index.html +++ b/dev/References/@Raissi2017/index.html @@ -1,2 +1,2 @@ -- · WallyToolbox.jl

title: "Physics informed deep learning (part I): Data-driven solutions of nonlinear partial differential equations" authors: Maziar Raissi, Paris Perdikaris, George Em Karniadakis year: 2017 DOI: https://doi.org/10.48550/arXiv.1711.10561 Drive: https://1drv.ms/b/s!Ar4x-UlrYAiZla5YwhmbwapFcSs-8A?e=XiDCyF –-

+- · WallyToolbox.jl

title: "Physics informed deep learning (part I): Data-driven solutions of nonlinear partial differential equations" authors: Maziar Raissi, Paris Perdikaris, George Em Karniadakis year: 2017 DOI: https://doi.org/10.48550/arXiv.1711.10561 Drive: https://1drv.ms/b/s!Ar4x-UlrYAiZla5YwhmbwapFcSs-8A?e=XiDCyF –-

diff --git a/dev/References/@Ranz1952/index.html b/dev/References/@Ranz1952/index.html index 8b48e59b0..4401bd7b5 100644 --- a/dev/References/@Ranz1952/index.html +++ b/dev/References/@Ranz1952/index.html @@ -1,2 +1,2 @@ -- · WallyToolbox.jl

title: Evaporation from drops authors: W. Ranz, W. Marshall year: 1952 –-

+- · WallyToolbox.jl

title: Evaporation from drops authors: W. Ranz, W. Marshall year: 1952 –-

diff --git a/dev/References/@Reitz1987/index.html b/dev/References/@Reitz1987/index.html index 1d5be5cc0..ce89fcc10 100644 --- a/dev/References/@Reitz1987/index.html +++ b/dev/References/@Reitz1987/index.html @@ -1,2 +1,2 @@ -- · WallyToolbox.jl

title: Structure of high-pressure fuel sprays authors: Rolf D. Reitz, R. Diwakar year: 1987 URL: https://doi.org/10.4271/870598 –-

+- · WallyToolbox.jl

title: Structure of high-pressure fuel sprays authors: Rolf D. Reitz, R. Diwakar year: 1987 URL: https://doi.org/10.4271/870598 –-

diff --git a/dev/References/@Saario2005a/index.html b/dev/References/@Saario2005a/index.html index 8b03e5622..4b938ac16 100644 --- a/dev/References/@Saario2005a/index.html +++ b/dev/References/@Saario2005a/index.html @@ -1,2 +1,2 @@ -- · WallyToolbox.jl

title: Heavy fuel oil combustion in a cylindrical laboratory furnace: measurements and modeling authors: A. Saario, A. Rebola, P. Coelho, M. Costa, A. Oksanen year: 2005 –-

+- · WallyToolbox.jl

title: Heavy fuel oil combustion in a cylindrical laboratory furnace: measurements and modeling authors: A. Saario, A. Rebola, P. Coelho, M. Costa, A. Oksanen year: 2005 –-

diff --git a/dev/References/@Sanchez2023a/index.html b/dev/References/@Sanchez2023a/index.html index aa8b921da..9f548e4d6 100644 --- a/dev/References/@Sanchez2023a/index.html +++ b/dev/References/@Sanchez2023a/index.html @@ -1,2 +1,2 @@ -- · WallyToolbox.jl

title: "Biomass combustion modeling using OpenFOAM: Development of a simple computational model and study of the combustion performance of lippia origanoides bagasse" authors: Gabriel Fernando García Sánchez, Jorge Luis Chacón Velasco, David Alfredo Fuentes Díaz, Yesid Javier Rueda-Ordóñez, David Patiño, Juan Jesús Rico, Jairo René Martínez Morales year: 2023 URL: https://doi.org/10.3390/en16062932 Drive: https://1drv.ms/b/s!Ar4x-UlrYAiZlbEgWeJ66H4-cfxBiQ?e=YQGseW –-

+- · WallyToolbox.jl

title: "Biomass combustion modeling using OpenFOAM: Development of a simple computational model and study of the combustion performance of lippia origanoides bagasse" authors: Gabriel Fernando García Sánchez, Jorge Luis Chacón Velasco, David Alfredo Fuentes Díaz, Yesid Javier Rueda-Ordóñez, David Patiño, Juan Jesús Rico, Jairo René Martínez Morales year: 2023 URL: https://doi.org/10.3390/en16062932 Drive: https://1drv.ms/b/s!Ar4x-UlrYAiZlbEgWeJ66H4-cfxBiQ?e=YQGseW –-

diff --git a/dev/References/@Sanyal2022a/index.html b/dev/References/@Sanyal2022a/index.html index c54374d51..3a1fd2e81 100644 --- a/dev/References/@Sanyal2022a/index.html +++ b/dev/References/@Sanyal2022a/index.html @@ -1,2 +1,2 @@ -- · WallyToolbox.jl

title: "RAMP-Net: A robust adaptive MPC for quadrotors via physics-informed neural network" authors: Sourav Sanyal, Kaushik Roy year: 2022 URL: https://doi.org/10.48550/arXiv.2209.09025 –-

+- · WallyToolbox.jl

title: "RAMP-Net: A robust adaptive MPC for quadrotors via physics-informed neural network" authors: Sourav Sanyal, Kaushik Roy year: 2022 URL: https://doi.org/10.48550/arXiv.2209.09025 –-

diff --git a/dev/References/@Schneider1978a/index.html b/dev/References/@Schneider1978a/index.html index 701a95498..5bd7b989b 100644 --- a/dev/References/@Schneider1978a/index.html +++ b/dev/References/@Schneider1978a/index.html @@ -1,2 +1,2 @@ -- · WallyToolbox.jl

title: "Molecular-dynamics study of a three-dimensional one-component model for distortive phase transitions" authors: T. Schneider, E. Stoll year: 1978 –-

+- · WallyToolbox.jl

title: "Molecular-dynamics study of a three-dimensional one-component model for distortive phase transitions" authors: T. Schneider, E. Stoll year: 1978 –-

diff --git a/dev/References/@Shirzad2023/index.html b/dev/References/@Shirzad2023/index.html index dedc4d65a..e2bf885c0 100644 --- a/dev/References/@Shirzad2023/index.html +++ b/dev/References/@Shirzad2023/index.html @@ -1,2 +1,2 @@ -- · WallyToolbox.jl

title: "A critical review on applications of the Avrami equation beyond materials science" authors: Kiana Shirzad, Christopher Viney year: 2023 –-

+- · WallyToolbox.jl

title: "A critical review on applications of the Avrami equation beyond materials science" authors: Kiana Shirzad, Christopher Viney year: 2023 –-

diff --git a/dev/References/@Shomate1954/index.html b/dev/References/@Shomate1954/index.html index 335197d1f..5e5b21c3d 100644 --- a/dev/References/@Shomate1954/index.html +++ b/dev/References/@Shomate1954/index.html @@ -1,2 +1,2 @@ -- · WallyToolbox.jl

title: A method for evaluating and correlating thermodynamic data authors: C. Howard Shomate year: 1954 –-

+- · WallyToolbox.jl

title: A method for evaluating and correlating thermodynamic data authors: C. Howard Shomate year: 1954 –-

diff --git a/dev/References/@Smith2013a/index.html b/dev/References/@Smith2013a/index.html index c3967e29d..451f0cd48 100644 --- a/dev/References/@Smith2013a/index.html +++ b/dev/References/@Smith2013a/index.html @@ -1,2 +1,2 @@ -- · WallyToolbox.jl

title: "Thermal conductivity of porous materials" authors: David S. Smith, Arnaud Alzina, Julie Bourret, Benoît Nait-Ali, Fabienne Pennec, Nicolas Tessier-Doyen, Kodai Otsu, Hideaki Matsubara, Pierre Elser, Urs T. Gonzenbach year: 2013 –-

+- · WallyToolbox.jl

title: "Thermal conductivity of porous materials" authors: David S. Smith, Arnaud Alzina, Julie Bourret, Benoît Nait-Ali, Fabienne Pennec, Nicolas Tessier-Doyen, Kodai Otsu, Hideaki Matsubara, Pierre Elser, Urs T. Gonzenbach year: 2013 –-

diff --git a/dev/References/@Sweldens1998a/index.html b/dev/References/@Sweldens1998a/index.html index 4d0f20cea..6b668e703 100644 --- a/dev/References/@Sweldens1998a/index.html +++ b/dev/References/@Sweldens1998a/index.html @@ -1,2 +1,2 @@ -- · WallyToolbox.jl

title: "The lifting scheme: A construction of second generation wavelets" authors: Wim Sweldens year: 1998 URL: https://doi.org/10.1137/S0036141095289051 Drive: –-

+- · WallyToolbox.jl

title: "The lifting scheme: A construction of second generation wavelets" authors: Wim Sweldens year: 1998 URL: https://doi.org/10.1137/S0036141095289051 Drive: –-

diff --git a/dev/References/@Tam2019/index.html b/dev/References/@Tam2019/index.html index 2bdf5d188..1f7d6e90a 100644 --- a/dev/References/@Tam2019/index.html +++ b/dev/References/@Tam2019/index.html @@ -1,2 +1,2 @@ -- · WallyToolbox.jl

title: OpenSC: an open-source calculation tool for combustion mixture emissivity/absorptivity authors: Wai Cheong Tam, Walter W. Yuen year: 2019 –-

+- · WallyToolbox.jl

title: OpenSC: an open-source calculation tool for combustion mixture emissivity/absorptivity authors: Wai Cheong Tam, Walter W. Yuen year: 2019 –-

diff --git a/dev/References/@Tensorflow2015Whitepaper/index.html b/dev/References/@Tensorflow2015Whitepaper/index.html index d56fe50a3..e2a115650 100644 --- a/dev/References/@Tensorflow2015Whitepaper/index.html +++ b/dev/References/@Tensorflow2015Whitepaper/index.html @@ -1,2 +1,2 @@ -- · WallyToolbox.jl

title: "TensorFlow: Large-scale machine learning on heterogeneous systems" authors: Martín Abadi, Ashish Agarwal, Paul Barham, Eugene Brevdo, Zhifeng Chen, Craig Citro, Greg S. Corrado, Andy Davis, Jeffrey Dean, Matthieu Devin, Sanjay Ghemawat, Ian Goodfellow, Andrew Harp, Geoffrey Irving, Michael Isard, Yangqing Jia, Rafal Jozefowicz, Lukasz Kaiser, Manjunath Kudlur, Josh Levenberg, Dandelion Mané, Rajat Monga, Sherry Moore, Derek Murray, Chris Olah, Mike Schuster, Jonathon Shlens, Benoit Steiner, Ilya Sutskever, Kunal Talwar, Paul Tucker, Vincent Vanhoucke, Vijay Vasudevan, Fernanda Viégas, Oriol Vinyals, Pete Warden, Martin Wattenberg, Martin Wicke, Yuan Yu, Xiaoqiang Zheng year: 2015 DOI: https://doi.org/10.5281/zenodo.4724125 –-

+- · WallyToolbox.jl

title: "TensorFlow: Large-scale machine learning on heterogeneous systems" authors: Martín Abadi, Ashish Agarwal, Paul Barham, Eugene Brevdo, Zhifeng Chen, Craig Citro, Greg S. Corrado, Andy Davis, Jeffrey Dean, Matthieu Devin, Sanjay Ghemawat, Ian Goodfellow, Andrew Harp, Geoffrey Irving, Michael Isard, Yangqing Jia, Rafal Jozefowicz, Lukasz Kaiser, Manjunath Kudlur, Josh Levenberg, Dandelion Mané, Rajat Monga, Sherry Moore, Derek Murray, Chris Olah, Mike Schuster, Jonathon Shlens, Benoit Steiner, Ilya Sutskever, Kunal Talwar, Paul Tucker, Vincent Vanhoucke, Vijay Vasudevan, Fernanda Viégas, Oriol Vinyals, Pete Warden, Martin Wattenberg, Martin Wicke, Yuan Yu, Xiaoqiang Zheng year: 2015 DOI: https://doi.org/10.5281/zenodo.4724125 –-

diff --git a/dev/References/@Wang2022a/index.html b/dev/References/@Wang2022a/index.html index 1a36e5b94..3a91dbda9 100644 --- a/dev/References/@Wang2022a/index.html +++ b/dev/References/@Wang2022a/index.html @@ -1,2 +1,2 @@ -- · WallyToolbox.jl

title: Respecting causality is all you need for training physics-informed neural networks authors: Sifan Wang, Shyam Sankaran, Paris Perdikaris year: 2022 URL: https://doi.org/10.48550/arXiv.2203.07404 Drive: https://1drv.ms/b/s!Ar4x-UlrYAiZla8hHROyjqNuK7otnA?e=U8kabk –-

Supporting materials at GitHub.

+- · WallyToolbox.jl

title: Respecting causality is all you need for training physics-informed neural networks authors: Sifan Wang, Shyam Sankaran, Paris Perdikaris year: 2022 URL: https://doi.org/10.48550/arXiv.2203.07404 Drive: https://1drv.ms/b/s!Ar4x-UlrYAiZla8hHROyjqNuK7otnA?e=U8kabk –-

Supporting materials at GitHub.

diff --git a/dev/References/@Wang2023a/index.html b/dev/References/@Wang2023a/index.html index d52fb6f42..8609871b2 100644 --- a/dev/References/@Wang2023a/index.html +++ b/dev/References/@Wang2023a/index.html @@ -1,2 +1,2 @@ -- · WallyToolbox.jl

title: "Auto-PINN: Understanding and optimizing physics-informed neural architecture" authors: Yicheng Wang, Xiaotian Han, Chia-Yuan Chang, Daochen Zha, Ulisses Braga-Neto, Xia Hu year: 2023 URL: https://doi.org/10.48550/arXiv.2205.13748 Drive: https://1drv.ms/b/s!Ar4x-UlrYAiZla8gKwrbEVbpOVfBQg?e=5kcaTy –-

+- · WallyToolbox.jl

title: "Auto-PINN: Understanding and optimizing physics-informed neural architecture" authors: Yicheng Wang, Xiaotian Han, Chia-Yuan Chang, Daochen Zha, Ulisses Braga-Neto, Xia Hu year: 2023 URL: https://doi.org/10.48550/arXiv.2205.13748 Drive: https://1drv.ms/b/s!Ar4x-UlrYAiZla8gKwrbEVbpOVfBQg?e=5kcaTy –-

diff --git a/dev/References/@Wu2022a/index.html b/dev/References/@Wu2022a/index.html index 42bd0df11..2e81d7b7b 100644 --- a/dev/References/@Wu2022a/index.html +++ b/dev/References/@Wu2022a/index.html @@ -1,2 +1,2 @@ -- · WallyToolbox.jl

title: A comprehensive study of non-adaptive and residual-based adaptive sampling for physics-informed neural networks authors: Chenxi Wu, Min Zhu, Qinyang Tan, Yadhu Kartha, Lu Lu year: 2022 URL: https://doi.org/10.48550/arXiv.2207.10289 Drive: https://1drv.ms/b/s!Ar4x-UlrYAiZla5WOX3yVxsVYZ1BSQ?e=RJSrB2 –-

+- · WallyToolbox.jl

title: A comprehensive study of non-adaptive and residual-based adaptive sampling for physics-informed neural networks authors: Chenxi Wu, Min Zhu, Qinyang Tan, Yadhu Kartha, Lu Lu year: 2022 URL: https://doi.org/10.48550/arXiv.2207.10289 Drive: https://1drv.ms/b/s!Ar4x-UlrYAiZla5WOX3yVxsVYZ1BSQ?e=RJSrB2 –-

diff --git a/dev/References/@Wurth2023a/index.html b/dev/References/@Wurth2023a/index.html index daeb8c424..82536dc1a 100644 --- a/dev/References/@Wurth2023a/index.html +++ b/dev/References/@Wurth2023a/index.html @@ -1,2 +1,2 @@ -- · WallyToolbox.jl

title: Physics-informed neural networks for data-free surrogate modelling and engineering optimization – An example from composite manufacturing authors: Tobias Würth, Constantin Krauß, Clemens Zimmerling, Luise Kärger year: 2023 URL: https://doi.org/10.5445/IR/1000159290 Drive: https://1drv.ms/b/s!Ar4x-UlrYAiZla5XEQtEiYnlp5ggtA?e=6TW8va –-

  • PINNs are alternative to SBO methods

  • Reference 6: one NN per output

  • Used same weight for all losses (domain, B.C., I.C.)

  • NNs provide automatic jacobian and hessian evaluations, what can be used for great benefit of optimization algorithms

  • Implemented in SciANN [[@Haghighat2021sciann]] wrapper to [[@Tensorflow2015Whitepaper]]

  • Solves the diffusion equation

  • Kamal-Malkin model can be seem as a more general parametrization as JMKA $\rightarrow$ maybe useful in cement hydration modeling?

  • Interesting to write a tutorial about!

+- · WallyToolbox.jl

title: Physics-informed neural networks for data-free surrogate modelling and engineering optimization – An example from composite manufacturing authors: Tobias Würth, Constantin Krauß, Clemens Zimmerling, Luise Kärger year: 2023 URL: https://doi.org/10.5445/IR/1000159290 Drive: https://1drv.ms/b/s!Ar4x-UlrYAiZla5XEQtEiYnlp5ggtA?e=6TW8va –-

  • PINNs are alternative to SBO methods

  • Reference 6: one NN per output

  • Used same weight for all losses (domain, B.C., I.C.)

  • NNs provide automatic jacobian and hessian evaluations, what can be used for great benefit of optimization algorithms

  • Implemented in SciANN [[@Haghighat2021sciann]] wrapper to [[@Tensorflow2015Whitepaper]]

  • Solves the diffusion equation

  • Kamal-Malkin model can be seem as a more general parametrization as JMKA $\rightarrow$ maybe useful in cement hydration modeling?

  • Interesting to write a tutorial about!

diff --git a/dev/References/@Yu2022a/index.html b/dev/References/@Yu2022a/index.html index 0ab90da3b..c2693ec3d 100644 --- a/dev/References/@Yu2022a/index.html +++ b/dev/References/@Yu2022a/index.html @@ -1,2 +1,2 @@ -- · WallyToolbox.jl

title: Gradient-enhanced physics-informed neural networks for forward and inverse PDE problems authors: Jeremy Yu, Lu Lu, Xuhui Meng, George Em Karniadakis year: 2022 URL: https://doi.org/10.48550/arXiv.2111.02801 Drive: https://1drv.ms/b/s!Ar4x-UlrYAiZla8fqTeJApcwO8Ng?e=lpsaxB –-

+- · WallyToolbox.jl

title: Gradient-enhanced physics-informed neural networks for forward and inverse PDE problems authors: Jeremy Yu, Lu Lu, Xuhui Meng, George Em Karniadakis year: 2022 URL: https://doi.org/10.48550/arXiv.2111.02801 Drive: https://1drv.ms/b/s!Ar4x-UlrYAiZla8fqTeJApcwO8Ng?e=lpsaxB –-

diff --git a/dev/References/@Zuo2000a/index.html b/dev/References/@Zuo2000a/index.html index cd8e069ff..ce4bd54e2 100644 --- a/dev/References/@Zuo2000a/index.html +++ b/dev/References/@Zuo2000a/index.html @@ -1,2 +1,2 @@ -- · WallyToolbox.jl

title: Modelling superheated fuel sprays and vaproization authors: B. Zuo, A. M. Gomes, C. J. Rutland year: 2000 URL: https://doi.org/10.1243/1468087001545218 –-

+- · WallyToolbox.jl

title: Modelling superheated fuel sprays and vaproization authors: B. Zuo, A. M. Gomes, C. J. Rutland year: 2000 URL: https://doi.org/10.1243/1468087001545218 –-

diff --git a/dev/References/index.html b/dev/References/index.html index 3d39d2c31..050091b6d 100644 --- a/dev/References/index.html +++ b/dev/References/index.html @@ -1,2 +1,2 @@ -References · WallyToolbox.jl

References

This page contains the literature and external references cited along the toolbox documentation or supporting materials. For a full bibtex file for citing them, please check this database file.

[1]
C. G. Maier and K. K. Kelley. An equation for the representation of high-temperature heat content data. Journal of the American Chemical Society 54, 3243–3246 (1932).
[2]
C. H. Shomate. A method for evaluating and correlating thermodynamic data. The Journal of Physical Chemistry 58, 368–372 (1954).
[3]
C. J. Lawn. Principles of combustion engineering for boilers. Combustion treatise (Academic Press, 1987). Includes bibliography and index.
[4]
R. B. Bird, W. E. Stewart and E. N. Lightfoot. Transport phenomena. 2nd Edition (John Wiley and Sons, 2001).
[5]
C. Balaji. Essentials of radiation heat transfer (Wiley, Chichester, 2014).
[6]
A. A. Amsden, P. J. O'Rourke and T. D. Butler. KIVA-II: A computer program for chemically reactive flows with sprays (Los Alamos National Laboratory, May 1989).
[7]
T. Hanein, F. P. Glasser and M. N. Bannerman. One-dimensional steady-state thermal model for rotary kilns used in the manufacture of cement. Advances in Applied Ceramics 116, 207–215 (2017).
[8]
K. S. Mujumdar and V. V. Ranade. Simulation of rotary cement kilns using a one-dimensional model. Chemical Engineering Research and Design 84, 165–177 (2006).
[9]
D. J. Gunn. Transfer of heat or mass to particles in fixed and fluidised beds. International Journal of Heat and Mass Transfer 21, 467–476 (1978).
[10]
H. Kramers and P. Croockewit. The passage of granular solids through inclined rotary kilns. Chemical Engineering Science 1, 259–265 (1952).
[11]
W. L. Grosshandler. Radcal – a narrow-band model for radiation calculations in a combustion environment (National Institute of Standards and Technology, 1993).
[12]
J. P. Gorog, J. K. Brimacombe and T. N. Adams. Radiative heat transfer in rotary kilns. Metallurgical Transactions B 12, 55–70 (1981).
[13]
W. C. Tam and W. W. Yuen. OpenSC: an open-source calculation tool for combustion mixture emissivity/absorptivity (National Institute of Standards and Technology, 2019).
[14]
A. B. Liu, D. Mather and R. D. Reitz. Modeling the Effects of Drop Drag and Breakup on Fuel Sprays. In: SAE Technical Paper Series, ANNUAL (SAE International, Mar 1993).
[15]
R. D. Reitz and R. Diwakar. Structure of high-pressure fuel sprays. In: SAE Technical Paper Series, ANNUAL (SAE International, Feb 1987).
[16]
W. Ranz and W. Marshall. Evaporation from drops. Chemical Engineering Progress 48, 141–146 (1952).
[17]
A. Aissa, M. Abdelouahab, A. Noureddine, M. Elganaoui and B. Pateyron. Ranz and Marshall correlations limits on heat flow between a sphere and its surrounding gas at high temperature. Thermal Science 19, 1521–1528 (2015).
[18]
B. Zuo, A. M. Gomes and C. J. Rutland. Modelling superheated fuel sprays and vaproization. International Journal of Engine Research 1, 321–336 (2000).
[19]
B. Peña and C. Pérez-García. Stability of Turing patterns in the Brusselator model. Physical Review E 64, 056213 (2001).
[20]
W. Sweldens. The Lifting Scheme: A Construction of Second Generation Wavelets. SIAM Journal on Mathematical Analysis 29, 511–546 (1998).
[21]
J. Jeong and F. Hussain. On the identification of a vortex. Journal of Fluid Mechanics 285, 69–94 (1995).
[22]
T. Schneider and E. Stoll. Molecular-dynamics study of a three-dimensional one-component model for distortive phase transitions. Physical Review B 17, 1302–1322 (1978).
[23]
G. Joos. Theoretical physics. Third Edition (Dover Publications, New York, 1986).
[24]
S. V. Patankar. Numerical heat transfer and fluid flow (Taylor & Francis, 1980); p. 197.
[25]
J. Crank and P. Nicolson. A practical method for Numerical evaluation of solutions of partial differential equations of the heat-conduction type. Advances in Computational Mathematics 6, 207–226 (1996), reprinted from Proc. Camb. Phil. Soc. 43 (1947) 50-67.
[26]
J. Hristov. Transient heat conduction with variable thermophysical properties power-law temperature-depenent heat capacity and thermal conductivity. Thermal Science 27, 411–422 (2023).
[27]
K. Shirzad and C. Viney. A critical review on applications of the Avrami equation beyond materials science. Journal of The Royal Society Interface 20 (2023).
[28]
E. J. Mittemeijer, L. Cheng, P. J. van der Schaaf, C. M. Brakman and B. M. Korevaar. Analysis of nonisothermal transformation kinetics; tempering of iron-carbon and iron-nitrogen martensites. Metallurgical Transactions A 19, 925–932 (1988).
[29]
H. Mehrer. Diffusion in Solids : Fundamentals, Methods, Materials, Diffusion-Controlled Processes. Vol. 155 of Springer Series in Solid-State Sciences (Springer Berlin Heidelberg, 2007).
[30]
L. Onsager. Reciprocal relations in irreversible processes. I. Physical Review 37, 405–426 (1931).
[31]
L. Onsager. Reciprocal relations in irreversible processes. II. Physical Review 38, 2265–2279 (1931).
[32]
M. Raissi, P. Perdikaris and G. E. Karniadakis. Physics Informed Deep Learning (Part I): Data-driven Solutions of Nonlinear Partial Differential Equations, arXiv (2017).
[33]
[34]
[35]
C. Wu, M. Zhu, Q. Tan, Y. Kartha and L. Lu. A comprehensive study of non-adaptive and residual-based adaptive sampling for physics-informed neural networks. Computer Methods in Applied Mechanics and Engineering 403, 115671 (2023).
[36]
[37]
K. Haitsiukevich and A. Ilin. Improved Training of Physics-Informed Neural Networks with Model Ensembles, arXiv (2022).
[38]
[39]
Z. Fang, S. Wang and P. Perdikaris. Ensemble learning for Physics Informed Neural Networks: a Gradient Boosting approach, arXiv (2023).
[40]
[41]
J. Yu, L. Lu, X. Meng and G. E. Karniadakis. Gradient-enhanced physics-informed neural networks for forward and inverse PDE problems. Computer Methods in Applied Mechanics and Engineering 393, 114823 (2022).
[42]
[43]
Y. Wang, X. Han, C.-Y. Chang, D. Zha, U. Braga-Neto and X. Hu. Auto-PINN: Understanding and Optimizing Physics-Informed Neural Architecture, arXiv (2023), arXiv:2205.13748 [cs.LG].
[44]
[45]
S. Wang, S. Sankaran and P. Perdikaris. Respecting causality is all you need for training physics-informed neural networks, arXiv (2022), arXiv:2203.07404 [cs.LG].
[46]
[47]
C. J. Arthurs and A. P. King. Active training of physics-informed neural networks to aggregate and interpolate parametric solutions to the Navier-Stokes equations. Journal of Computational Physics 438, 110364 (2021).
[48]
I. E. Lagaris, A. Likas and D. I. Fotiadis. Artificial neural networks for solving ordinary and partial differential equations. IEEE Transactions on Neural Networks 9, 987–1000 (1998).
[49]
E. A. Antonelo, E. Camponogara, L. O. Seman, J. P. Jordanou, E. R. de Souza and J. F. Hübner. Physics-informed neural nets for control of dynamical systems. Neurocomputing 579, 127419 (2024).
[50]
S. Cai, Z. Wang, S. Wang, P. Perdikaris and G. E. Karniadakis. Physics-Informed Neural Networks for Heat Transfer Problems. Journal of Heat Transfer 143 (2021).
[51]
S. Cuomo, V. S. di Cola, F. Giampaolo, G. Rozza, M. Raissi and F. Piccialli. Scientific Machine Learning through Physics-Informed Neural Networks: Where we are and What's next, arXiv (2022).
[52]
G. E. Karniadakis, I. G. Kevrekidis, L. Lu, P. Perdikaris, S. Wang and L. Yang. Physics-informed machine learning. Nature Reviews Physics 3, 422–440 (2021).
[53]
L. Lu, X. Meng, Z. Mao and G. E. Karniadakis. DeepXDE: A Deep Learning Library for Solving Differential Equations. SIAM Review 63, 208–228 (2021).
[54]
L. Lu, R. Pestourie, W. Yao, Z. Wang, F. Verdugo and S. G. Johnson. Physics-informed neural networks with hard constraints for inverse design, arXiv (2021).
[55]
M. A. Nabian, R. J. Gladstone and H. Meidani. Efficient training of physics‐informed neural networks via importance sampling. Computer-Aided Civil and Infrastructure Engineering 36, 962–977 (2021).
[56]
S. Sanyal and K. Roy. RAMP-Net: A Robust Adaptive MPC for Quadrotors via Physics-informed Neural Network, arXiv (2022).
[57]
T. Würth, C. Krauß, C. Zimmerling and L. Kärger. Physics-informed neural networks for data-free surrogate modelling and engineering optimization – An example from composite manufacturing. Materials & Design 231, 112034 (2023).
[58]
M. Malinen and P. Råback. Elmer finite element solver for multiphysics and multiscale problems. In: Multiscale modelling methods for applications in materials science, Vol. 19, edited by I. Kondov and G. Sutmann (Forschungszentrum, Zentralbibliothek, 2013); pp. 101–113. Literaturangaben.
[59]
S. Masamune and J. M. Smith. Thermal conductivity of beds of spherical particles. Industrial and Engineering Chemistry Fundamentals 2, 136–143 (1963).
[60]
A. Luikov, A. Shashkov, L. Vasiliev and Y. Fraiman. Thermal conductivity of porous systems. International Journal of Heat and Mass Transfer 11, 117–140 (1968).
[61]
[62]
J. C. Koh and A. Fortini. Prediction of thermal conductivity and electrical resistivity of porous metallic materials. International Journal of Heat and Mass Transfer 16, 2013–2022 (1973).
[63]
T. Fiedler, E. Pesetskaya, A. Öchsner and J. Grácio. Calculations of the thermal conductivity of porous materials. Materials Science Forum 514–516, 754–758 (2006).
[64]
T. Fiedler, A. Öchsner, N. Muthubandara, I. V. Belova and G. E. Murch. Calculation of the Effective Thermal Conductivity in Composites Using Finite Element and Monte Carlo Methods. Materials Science Forum 553, 51–56 (2007).
[65]
T. Fiedler, E. Solórzano, F. Garcia‐Moreno, A. Öchsner, I. V. Belova and G. E. Murch. Computed tomography based finite element analysis of the thermal properties of cellular aluminium. Materialwissenschaft und Werkstofftechnik 40, 139–143 (2009).
[66]
D. S. Smith, A. Alzina, J. Bourret, B. Nait-Ali, F. Pennec, N. Tessier-Doyen, K. Otsu, H. Matsubara, P. Elser and U. T. Gonzenbach. Thermal conductivity of porous materials. Journal of Materials Research 28, 2260–2272 (2013).
[67]
A. Cheilytko. Finding of the generalized equation of thermal conductivity for porous heat-insulating materials. Technology audit and production reserves 5, 4–10 (2016).
[68]
G. Pia, L. Casnedi and U. Sanna. Porosity and pore size distribution influence on thermal conductivity of yttria-stabilized zirconia: Experimental findings and model predictions. Ceramics International 42, 5802–5809 (2016).
[69]
L. Qiu, H. Zou, D. Tang, D. Wen, Y. Feng and X. Zhang. Inhomogeneity in pore size appreciably lowering thermal conductivity for porous thermal insulators. Applied Thermal Engineering 130, 1004–1011 (2018).
[70]
M. Chikhi. Effective thermal conductivity of porous biomaterials: Numerical investigation. Journal of Building Engineering 32, 101763 (2020).
[71]
K. Mraz, J. Bohacek, O. Resl, M. Chabicovsky and E. Karimi-Sibaki. Thermal conductivity of porous oxide layer: A numerical model based on CT data. Materials Today Communications 28, 102705 (2021).
[72]
P. J. O'Rourke and D. M. Snider. An improved collision damping time for MP-PIC calculations of dense particle flows with applications to polydisperse sedimenting beds and colliding particle jets. Chemical Engineering Science 65, 6014–6028 (2010).
[73]
V. Garaniya and L. Goldsworthy. Heavy Fuel Oil Combustion Modelling Using Continuous Thermodynamics. Marine Engineering 47, 871–877 (2012).
[74]
R. J. Kee, M. E. Coltrin, P. Glarborg and H. Zhu. Chemically reacting flow theory, modeling, and simulation (Wiley & Sons, Incorporated, John, 2017); p. 792.
[75]
H. S. Fogler. Elements of Chemical Reaction Engineering (Prentice Hall International Series in Physical and Chemical Engineering Sciences, 1999).
[76]
B. E. Launder and D. B. Spalding. The numerical computation of turbulent flows. Computer Methods in Applied Mechanics and Engineering 3, 269–289 (1974).
[77]
[78]
J. P. Du Plessis and J. H. Masliyah. Mathematical modelling of flow through consolidated isotropic porous media. Transport in Porous Media 3, 145–161 (1988).
[79]
A. Haider and O. Levenspiel. Drag coefficient and terminal velocity of spherical and nonspherical particles. Powder Technology 58, 63–70 (1989).
[80]
D. C. Lay. Linear algebra and its applications. Fourth Edition (Addison-Wesley, 2012).
+References · WallyToolbox.jl

References

This page contains the literature and external references cited along the toolbox documentation or supporting materials. For a full bibtex file for citing them, please check this database file.

[1]
C. G. Maier and K. K. Kelley. An equation for the representation of high-temperature heat content data. Journal of the American Chemical Society 54, 3243–3246 (1932).
[2]
C. H. Shomate. A method for evaluating and correlating thermodynamic data. The Journal of Physical Chemistry 58, 368–372 (1954).
[3]
C. J. Lawn. Principles of combustion engineering for boilers. Combustion treatise (Academic Press, 1987). Includes bibliography and index.
[4]
R. B. Bird, W. E. Stewart and E. N. Lightfoot. Transport phenomena. 2nd Edition (John Wiley and Sons, 2001).
[5]
C. Balaji. Essentials of radiation heat transfer (Wiley, Chichester, 2014).
[6]
A. A. Amsden, P. J. O'Rourke and T. D. Butler. KIVA-II: A computer program for chemically reactive flows with sprays (Los Alamos National Laboratory, May 1989).
[7]
T. Hanein, F. P. Glasser and M. N. Bannerman. One-dimensional steady-state thermal model for rotary kilns used in the manufacture of cement. Advances in Applied Ceramics 116, 207–215 (2017).
[8]
K. S. Mujumdar and V. V. Ranade. Simulation of rotary cement kilns using a one-dimensional model. Chemical Engineering Research and Design 84, 165–177 (2006).
[9]
D. J. Gunn. Transfer of heat or mass to particles in fixed and fluidised beds. International Journal of Heat and Mass Transfer 21, 467–476 (1978).
[10]
H. Kramers and P. Croockewit. The passage of granular solids through inclined rotary kilns. Chemical Engineering Science 1, 259–265 (1952).
[11]
W. L. Grosshandler. Radcal – a narrow-band model for radiation calculations in a combustion environment (National Institute of Standards and Technology, 1993).
[12]
J. P. Gorog, J. K. Brimacombe and T. N. Adams. Radiative heat transfer in rotary kilns. Metallurgical Transactions B 12, 55–70 (1981).
[13]
W. C. Tam and W. W. Yuen. OpenSC: an open-source calculation tool for combustion mixture emissivity/absorptivity (National Institute of Standards and Technology, 2019).
[14]
A. B. Liu, D. Mather and R. D. Reitz. Modeling the Effects of Drop Drag and Breakup on Fuel Sprays. In: SAE Technical Paper Series, ANNUAL (SAE International, Mar 1993).
[15]
R. D. Reitz and R. Diwakar. Structure of high-pressure fuel sprays. In: SAE Technical Paper Series, ANNUAL (SAE International, Feb 1987).
[16]
W. Ranz and W. Marshall. Evaporation from drops. Chemical Engineering Progress 48, 141–146 (1952).
[17]
A. Aissa, M. Abdelouahab, A. Noureddine, M. Elganaoui and B. Pateyron. Ranz and Marshall correlations limits on heat flow between a sphere and its surrounding gas at high temperature. Thermal Science 19, 1521–1528 (2015).
[18]
B. Zuo, A. M. Gomes and C. J. Rutland. Modelling superheated fuel sprays and vaproization. International Journal of Engine Research 1, 321–336 (2000).
[19]
B. Peña and C. Pérez-García. Stability of Turing patterns in the Brusselator model. Physical Review E 64, 056213 (2001).
[20]
W. Sweldens. The Lifting Scheme: A Construction of Second Generation Wavelets. SIAM Journal on Mathematical Analysis 29, 511–546 (1998).
[21]
J. Jeong and F. Hussain. On the identification of a vortex. Journal of Fluid Mechanics 285, 69–94 (1995).
[22]
T. Schneider and E. Stoll. Molecular-dynamics study of a three-dimensional one-component model for distortive phase transitions. Physical Review B 17, 1302–1322 (1978).
[23]
G. Joos. Theoretical physics. Third Edition (Dover Publications, New York, 1986).
[24]
S. V. Patankar. Numerical heat transfer and fluid flow (Taylor & Francis, 1980); p. 197.
[25]
J. Crank and P. Nicolson. A practical method for Numerical evaluation of solutions of partial differential equations of the heat-conduction type. Advances in Computational Mathematics 6, 207–226 (1996), reprinted from Proc. Camb. Phil. Soc. 43 (1947) 50-67.
[26]
J. Hristov. Transient heat conduction with variable thermophysical properties power-law temperature-depenent heat capacity and thermal conductivity. Thermal Science 27, 411–422 (2023).
[27]
K. Shirzad and C. Viney. A critical review on applications of the Avrami equation beyond materials science. Journal of The Royal Society Interface 20 (2023).
[28]
E. J. Mittemeijer, L. Cheng, P. J. van der Schaaf, C. M. Brakman and B. M. Korevaar. Analysis of nonisothermal transformation kinetics; tempering of iron-carbon and iron-nitrogen martensites. Metallurgical Transactions A 19, 925–932 (1988).
[29]
H. Mehrer. Diffusion in Solids : Fundamentals, Methods, Materials, Diffusion-Controlled Processes. Vol. 155 of Springer Series in Solid-State Sciences (Springer Berlin Heidelberg, 2007).
[30]
L. Onsager. Reciprocal relations in irreversible processes. I. Physical Review 37, 405–426 (1931).
[31]
L. Onsager. Reciprocal relations in irreversible processes. II. Physical Review 38, 2265–2279 (1931).
[32]
M. Raissi, P. Perdikaris and G. E. Karniadakis. Physics Informed Deep Learning (Part I): Data-driven Solutions of Nonlinear Partial Differential Equations, arXiv (2017).
[33]
[34]
[35]
C. Wu, M. Zhu, Q. Tan, Y. Kartha and L. Lu. A comprehensive study of non-adaptive and residual-based adaptive sampling for physics-informed neural networks. Computer Methods in Applied Mechanics and Engineering 403, 115671 (2023).
[36]
[37]
K. Haitsiukevich and A. Ilin. Improved Training of Physics-Informed Neural Networks with Model Ensembles, arXiv (2022).
[38]
[39]
Z. Fang, S. Wang and P. Perdikaris. Ensemble learning for Physics Informed Neural Networks: a Gradient Boosting approach, arXiv (2023).
[40]
[41]
J. Yu, L. Lu, X. Meng and G. E. Karniadakis. Gradient-enhanced physics-informed neural networks for forward and inverse PDE problems. Computer Methods in Applied Mechanics and Engineering 393, 114823 (2022).
[42]
[43]
Y. Wang, X. Han, C.-Y. Chang, D. Zha, U. Braga-Neto and X. Hu. Auto-PINN: Understanding and Optimizing Physics-Informed Neural Architecture, arXiv (2023), arXiv:2205.13748 [cs.LG].
[44]
[45]
S. Wang, S. Sankaran and P. Perdikaris. Respecting causality is all you need for training physics-informed neural networks, arXiv (2022), arXiv:2203.07404 [cs.LG].
[46]
[47]
C. J. Arthurs and A. P. King. Active training of physics-informed neural networks to aggregate and interpolate parametric solutions to the Navier-Stokes equations. Journal of Computational Physics 438, 110364 (2021).
[48]
I. E. Lagaris, A. Likas and D. I. Fotiadis. Artificial neural networks for solving ordinary and partial differential equations. IEEE Transactions on Neural Networks 9, 987–1000 (1998).
[49]
E. A. Antonelo, E. Camponogara, L. O. Seman, J. P. Jordanou, E. R. de Souza and J. F. Hübner. Physics-informed neural nets for control of dynamical systems. Neurocomputing 579, 127419 (2024).
[50]
S. Cai, Z. Wang, S. Wang, P. Perdikaris and G. E. Karniadakis. Physics-Informed Neural Networks for Heat Transfer Problems. Journal of Heat Transfer 143 (2021).
[51]
S. Cuomo, V. S. di Cola, F. Giampaolo, G. Rozza, M. Raissi and F. Piccialli. Scientific Machine Learning through Physics-Informed Neural Networks: Where we are and What's next, arXiv (2022).
[52]
G. E. Karniadakis, I. G. Kevrekidis, L. Lu, P. Perdikaris, S. Wang and L. Yang. Physics-informed machine learning. Nature Reviews Physics 3, 422–440 (2021).
[53]
L. Lu, X. Meng, Z. Mao and G. E. Karniadakis. DeepXDE: A Deep Learning Library for Solving Differential Equations. SIAM Review 63, 208–228 (2021).
[54]
L. Lu, R. Pestourie, W. Yao, Z. Wang, F. Verdugo and S. G. Johnson. Physics-informed neural networks with hard constraints for inverse design, arXiv (2021).
[55]
M. A. Nabian, R. J. Gladstone and H. Meidani. Efficient training of physics‐informed neural networks via importance sampling. Computer-Aided Civil and Infrastructure Engineering 36, 962–977 (2021).
[56]
S. Sanyal and K. Roy. RAMP-Net: A Robust Adaptive MPC for Quadrotors via Physics-informed Neural Network, arXiv (2022).
[57]
T. Würth, C. Krauß, C. Zimmerling and L. Kärger. Physics-informed neural networks for data-free surrogate modelling and engineering optimization – An example from composite manufacturing. Materials & Design 231, 112034 (2023).
[58]
M. Malinen and P. Råback. Elmer finite element solver for multiphysics and multiscale problems. In: Multiscale modelling methods for applications in materials science, Vol. 19, edited by I. Kondov and G. Sutmann (Forschungszentrum, Zentralbibliothek, 2013); pp. 101–113. Literaturangaben.
[59]
S. Masamune and J. M. Smith. Thermal conductivity of beds of spherical particles. Industrial and Engineering Chemistry Fundamentals 2, 136–143 (1963).
[60]
A. Luikov, A. Shashkov, L. Vasiliev and Y. Fraiman. Thermal conductivity of porous systems. International Journal of Heat and Mass Transfer 11, 117–140 (1968).
[61]
[62]
J. C. Koh and A. Fortini. Prediction of thermal conductivity and electrical resistivity of porous metallic materials. International Journal of Heat and Mass Transfer 16, 2013–2022 (1973).
[63]
T. Fiedler, E. Pesetskaya, A. Öchsner and J. Grácio. Calculations of the thermal conductivity of porous materials. Materials Science Forum 514–516, 754–758 (2006).
[64]
T. Fiedler, A. Öchsner, N. Muthubandara, I. V. Belova and G. E. Murch. Calculation of the Effective Thermal Conductivity in Composites Using Finite Element and Monte Carlo Methods. Materials Science Forum 553, 51–56 (2007).
[65]
T. Fiedler, E. Solórzano, F. Garcia‐Moreno, A. Öchsner, I. V. Belova and G. E. Murch. Computed tomography based finite element analysis of the thermal properties of cellular aluminium. Materialwissenschaft und Werkstofftechnik 40, 139–143 (2009).
[66]
D. S. Smith, A. Alzina, J. Bourret, B. Nait-Ali, F. Pennec, N. Tessier-Doyen, K. Otsu, H. Matsubara, P. Elser and U. T. Gonzenbach. Thermal conductivity of porous materials. Journal of Materials Research 28, 2260–2272 (2013).
[67]
A. Cheilytko. Finding of the generalized equation of thermal conductivity for porous heat-insulating materials. Technology audit and production reserves 5, 4–10 (2016).
[68]
G. Pia, L. Casnedi and U. Sanna. Porosity and pore size distribution influence on thermal conductivity of yttria-stabilized zirconia: Experimental findings and model predictions. Ceramics International 42, 5802–5809 (2016).
[69]
L. Qiu, H. Zou, D. Tang, D. Wen, Y. Feng and X. Zhang. Inhomogeneity in pore size appreciably lowering thermal conductivity for porous thermal insulators. Applied Thermal Engineering 130, 1004–1011 (2018).
[70]
M. Chikhi. Effective thermal conductivity of porous biomaterials: Numerical investigation. Journal of Building Engineering 32, 101763 (2020).
[71]
K. Mraz, J. Bohacek, O. Resl, M. Chabicovsky and E. Karimi-Sibaki. Thermal conductivity of porous oxide layer: A numerical model based on CT data. Materials Today Communications 28, 102705 (2021).
[72]
P. J. O'Rourke and D. M. Snider. An improved collision damping time for MP-PIC calculations of dense particle flows with applications to polydisperse sedimenting beds and colliding particle jets. Chemical Engineering Science 65, 6014–6028 (2010).
[73]
V. Garaniya and L. Goldsworthy. Heavy Fuel Oil Combustion Modelling Using Continuous Thermodynamics. Marine Engineering 47, 871–877 (2012).
[74]
R. J. Kee, M. E. Coltrin, P. Glarborg and H. Zhu. Chemically reacting flow theory, modeling, and simulation (Wiley & Sons, Incorporated, John, 2017); p. 792.
[75]
H. S. Fogler. Elements of Chemical Reaction Engineering (Prentice Hall International Series in Physical and Chemical Engineering Sciences, 1999).
[76]
B. E. Launder and D. B. Spalding. The numerical computation of turbulent flows. Computer Methods in Applied Mechanics and Engineering 3, 269–289 (1974).
[77]
[78]
J. P. Du Plessis and J. H. Masliyah. Mathematical modelling of flow through consolidated isotropic porous media. Transport in Porous Media 3, 145–161 (1988).
[79]
A. Haider and O. Levenspiel. Drag coefficient and terminal velocity of spherical and nonspherical particles. Powder Technology 58, 63–70 (1989).
[80]
D. C. Lay. Linear algebra and its applications. Fourth Edition (Addison-Wesley, 2012).
diff --git a/dev/Science/01-Theoretical-Physics/index.html b/dev/Science/01-Theoretical-Physics/index.html index 9896f63f3..ee3f2fe6c 100644 --- a/dev/Science/01-Theoretical-Physics/index.html +++ b/dev/Science/01-Theoretical-Physics/index.html @@ -1,2 +1,2 @@ -Theoretical Physics · WallyToolbox.jl

Theoretical Physics

This notes track my studies of theoretical physics rather than providing content by themselves. Currently I am following the text by Joos1958 [23] because of its self-contained aspects. The text assumes previous knowledge of Calculus, and the reader familiar with the subject may simply skim the first part; in some topics the author provide better physical context than normal Calculus textbooks, what may be interesting.

+Theoretical Physics · WallyToolbox.jl

Theoretical Physics

This notes track my studies of theoretical physics rather than providing content by themselves. Currently I am following the text by Joos1958 [23] because of its self-contained aspects. The text assumes previous knowledge of Calculus, and the reader familiar with the subject may simply skim the first part; in some topics the author provide better physical context than normal Calculus textbooks, what may be interesting.

diff --git a/dev/Science/02-Computational-Physics/index.html b/dev/Science/02-Computational-Physics/index.html index 8c32840c8..b7da4451a 100644 --- a/dev/Science/02-Computational-Physics/index.html +++ b/dev/Science/02-Computational-Physics/index.html @@ -1,5 +1,5 @@ -Computational Physics · WallyToolbox.jl

Computational Physics

Molecular Dynamics (MD)

The Materials Project has many interesting for those working on MD and especially DFT. Theoretical basis can be found in the work by Hinchliffe which maybe will require some refreshing on the The Feynman Lectures on Physics to be followed.

Since molecular dynamics is a field essentially related to simulation (there is no MD without simulation!), it is worth listing the major open source projects related to the field, LAMMPS, ESPReSo, and Gromacs. Other interesting projects include HOOMD and the popular NAMD; I have refrained from the last given its greedy licensing scheme. My studies are currently focused in LAMMPS because its fields of application and system portability.

Density Functional Theory (DFT)

Finite Element Method

Personal path towards mastering finite element method (FEM).

The goal of this repository is to track my learning path of finite element method. As a secondary goal, all tools included in the study must be open source with a permissive license. Finally, I will study again some subjects related to the physics of applied problems that will be solved through FEM.

<details> <summary> It is not my first time trying this and I learned a few things in the past failures. Below I expose my reasoning about the choices I make today for structuring this repository and its future. </summary> <br>

  1. During my college years I almost neglected solid mechanics and statics. It happens that most quality materials for learning FEM are applied to structural analysis (because that is the most import numerical method in that field). Because my applied work is mostly related to fluids and heat transfer, doing some bibliographic research I found the books by Lewis et al. and its newer edition by Nithiarasu et al. adapted to my expertise level.

  2. From a mathematical standpoint the most accessible material I have studied so far is the draft book by H. P. Langtangen and K.-A. Mardal. Unfortunatelly the main author deceased just after the release of the final draft and the material remained unfinished. That is not really a blocking point because the content is pretty much finished from a non-specialist standpoint. Furthermore, its exercises where converted into notebooks by Mojtaba Barzegari and the material is quite accessible.

  3. During the years I have tested several FEM packages and libraries. The most promissing FEM package in the open source world is certainly FEniCSx, but it comes with the disadvantage of requiring Linux/WSL and having an unclear documentation. In terms of power I couldn't find anything comparable to MOOSE - if you see the list of developer labs it becomes pretty clear why - but it is something to experienced FEM users since it requires low level implementation of the problems in C++. Elmer could be a candidate package for learning the practice, but for going into the mathematics of FEM it is not the right tool. Next comes Kratos but its documentation is messy and things moved around too much over the years. Finally we have FreeFEM++. It is a pretty old software what means that it outlived most of the other applications and now is very stable. What is interesting about FreeFEM++ is its portability across operating systems and good documentation. In what follows I will stick with FreeFEM++ and later with FEniCSx.

  4. Learning a numerical method for continuum mechanics is essentially useless without the capacity to apply it to real world geometries. Unfortunatelly the field of open source CAD is very poor so we have just a few options. Although Gmsh is pretty powerfull with respect to its meshing capabilities, conceiving the geometry with the software can quickly scale to trigonometry hell level. I have been using the software for many years for 2D cases but systematically fall back to proprietary software when things become complex. In this study I intend to reach a sorcerer Gmsh mastery level. It can be complemented by STL files generation with Blender or CAD in FreeCAD.

  5. Advanced post-processing is also a must, so we will also follow some tutorials to improve ParaView skills.

</details>

Software version

While doing such an ambitious study, it is important to stick with software versions.

In what follows we will be using exclusivelly the following software:

  • Gmsh 4.11.1
  • FreeFEM++ 4.13
  • ParaView 5.10.1
  • FreeCAD 0.21.1
  • Blender 4.0.2

Processing utilities in Julia and/or Python will have their own versioning so they are not reported here.

Study planning

Because it can become frustrating to progress in the study and not be able to apply the knowledge to real cases, we will start by growing competencies in geometry and meshing before entering the mathematical and software aspects. Planning is idealized in a weekly basis.

Because of its simpler format, Nithiarasu's book is followed at a faster pace than Langtangen's. At some point the subjects being studied at Langtangen's book will become a review and deepening of previously studied subjects.

For materials that were not cited above, here follow the links:

The book series by O.C. Zienkiewicz and collaborators will be included later since its in depth and general approach trespasses my current capacity on how to organize their study. After learning the basics over the next months I hope to be able to skecth a learning strategy to go over those books and feed this time-line.

Complementary studies to take at any time during the series:

  • The first 4 videos of this playlist.
  • The first 5 videos of this playlist.
  • This video and the sequence (no playlist created).
  • This video with a full Gmsh introduction.

Review and in-depth studies for solidification of knowledge:

Week 1

  • [ ] Follow 21 tutorials provided with Gmsh
  • [x] Follow this short course on FreeCAD.
  • [x] Follow this tutorial on FreeFEM without practicing.
  • [x] Nithiarasu (2016), chapters 1 and 2
  • [x] Langtangen (2016), chapters 1 and 2 (1/3)
  • [ ] Barzegari's notebook associated to Langtangens chapter 1
  • [ ] Engineering Statics | Lectures videos 1 to 10
  • [ ] Intro to the Finite Element Method | Lectures 1

Week 2

  • [ ] Nithiarasu (2016), chapter 3 (1/2)
  • [ ] Langtangen (2016), chapter 2 (2/3)
  • [ ] FreeFEM++ guided tutorials 2.1 to 2.9
  • [ ] Engineering Statics | Lectures videos 11 to 14
  • [ ] Solid Mechanics | Theory (all at once)
  • [ ] Intro to Continuum Mechanics | Seminars 1
  • [ ] Intro to the Finite Element Method | Lectures 2

Week 3

  • [ ] Nithiarasu (2016), chapter 3 (2/2)
  • [ ] Langtangen (2016), chapter 2 (3/3)
  • [ ] Barzegari's notebook associated to Langtangens chapter 2
  • [ ] FreeFEM++ guided tutorials 2.10 to 2.13
  • [ ] Engineering Statics | Lectures videos 15 to 18
  • [ ] Intro to Continuum Mechanics | Seminars 2
  • [ ] Intro to the Finite Element Method | Lectures 3

Week 4

  • [ ] Nithiarasu (2016), chapter 4
  • [ ] Langtangen (2016), chapter 3 (1/5)
  • [ ] FreeFEM++ guided tutorials 2.14 to 2.19
  • [ ] Engineering Statics | Lectures videos 19 to 22
  • [ ] Intro to Continuum Mechanics | Seminars 3
  • [ ] Intro to the Finite Element Method | Lectures 4
  • [ ] Follow these ParaView tutorials.

Week 5

  • [ ] Nithiarasu (2016), chapter 5
  • [ ] Langtangen (2016), chapter 3 (2/5)
  • [ ] Engineering Statics | Lectures videos 23 to 24
  • [ ] Intro to Continuum Mechanics | Seminars 4
  • [ ] Intro to the Finite Element Method | Lectures 5
  • [ ] Follow these ParaView tutorials.

Week 6

  • [ ] Nithiarasu (2016), chapter 6
  • [ ] Langtangen (2016), chapter 3 (3/5)
  • [ ] Intro to Continuum Mechanics | Seminars 5
  • [ ] Intro to the Finite Element Method | Lectures 6
  • [ ] Follow this ParaView seminar.

Week 7

  • [ ] Nithiarasu (2016), chapter 7 (1/3)
  • [ ] Langtangen (2016), chapter 3 (4/5)
  • [ ] Intro to Continuum Mechanics | Seminars 6
  • [ ] Intro to the Finite Element Method | Lectures 7
  • [ ] Follow this ParaView seminar.

Week 8

  • [ ] Nithiarasu (2016), chapter 7 (2/3)
  • [ ] Langtangen (2016), chapter 3 (5/5)
  • [ ] Barzegari's notebook associated to Langtangens chapter 3
  • [ ] Intro to Continuum Mechanics | Seminars 7
  • [ ] Intro to the Finite Element Method | Lectures 8
  • [ ] Follow this ParaView seminar.

Week 9

  • [ ] Nithiarasu (2016), chapter 7 (3/3)
  • [ ] Langtangen (2016), chapter 4 (1/2)
  • [ ] Intro to Continuum Mechanics | Seminars 8
  • [ ] Intro to the Finite Element Method | Lectures 9
  • [ ] Follow this ParaView seminar.

Week 10

  • [ ] Nithiarasu (2016), chapter 8
  • [ ] Langtangen (2016), chapter 4 (2/2)
  • [ ] Barzegari's notebook associated to Langtangens chapter 4
  • [ ] Intro to Continuum Mechanics | Seminars 9
  • [ ] Intro to the Finite Element Method | Lectures 10
  • [ ] Follow this ParaView seminar.

Week 11

  • [ ] Follow 7 extended tutorials provided with Gmsh (Python)
  • [ ] Nithiarasu (2016), chapter 9
  • [ ] Langtangen (2016), chapter 5 (1/3)
  • [ ] Intro to Continuum Mechanics | Seminars 10
  • [ ] Follow this ParaView seminar.

Week 12

  • [ ] Nithiarasu (2016), chapter 10
  • [ ] Langtangen (2016), chapter 5 (2/3)

Week 13

  • [ ] Nithiarasu (2016), chapter 11
  • [ ] Langtangen (2016), chapter 5 (3/3)
  • [ ] Barzegari's notebook associated to Langtangens chapter 5

Week 14

  • [ ] Nithiarasu (2016), chapter 12
  • [ ] Langtangen (2016), chapter 6 (1/2)

Week 15

  • [ ] Nithiarasu (2016), chapter 13
  • [ ] Langtangen (2016), chapter 6 (2/2)
  • [ ] Barzegari's notebook associated to Langtangens chapter 6

Week 16

  • [ ] Nithiarasu (2016), chapter 14 and 15
  • [ ] Langtangen (2016), chapter 7
  • [ ] Barzegari's notebook associated to Langtangens chapter 7

Week 17

  • [ ] Langtangen (2016), chapter 8
  • [ ] Barzegari's notebook associated to Langtangens chapter 8

Week 18

  • [ ] Langtangen (2016), chapter 9 (1/4)

Week 19

  • [ ] Langtangen (2016), chapter 9 (2/4)

Week 20

  • [ ] Langtangen (2016), chapter 9 (3/4)

Week 21

  • [ ] Langtangen (2016), chapter 9 (4/4)
  • [ ] Barzegari's notebook associated to Langtangens chapter 9

Week 22

  • [ ] Langtangen (2016), chapter 10

Week 23

  • [ ] Langtangen (2016), chapter 11

Finite Volume Method

Formulations of heat conduction

Temperature formulation

Before attempting to derive heat conduction equation in terms of enthalpy, it is worth warming up with its handling in temperature formulation. In this case, the equation is solved directly in terms of temperature as dependent variable which is also used in the governing potential (Fourier's law). This simple case is applicable to many engineering problems. First we formulate the problem with constant thermophysical properties before proceeding to variable density and specific heat.

Constant thermophysical properties

Heat equation formulated with temperature as dependent variable applied to constant density $\rho$ and specific heat $c_{p}$ can be stated as:

\[\rho{}c_{p}\frac{\partial{}T}{\partial{}t}=\nabla\cdotp{}(k\nabla{}T)\]

Applying the divergence operator to the right hand side to a single coordinate and expanding the gradient term for different coordinate systems (cartesian, cylindrical, and spherical) leads to the following expressions. Notice that coordinate was expressed as $r$ even in cartesian coordinates for homogeneity of notation in what follows.

\[\rho{}c_{p}\dfrac{\partial{}T}{\partial{}t}=\begin{cases} +Computational Physics · WallyToolbox.jl

Computational Physics

Molecular Dynamics (MD)

The Materials Project has many interesting for those working on MD and especially DFT. Theoretical basis can be found in the work by Hinchliffe which maybe will require some refreshing on the The Feynman Lectures on Physics to be followed.

Since molecular dynamics is a field essentially related to simulation (there is no MD without simulation!), it is worth listing the major open source projects related to the field, LAMMPS, ESPReSo, and Gromacs. Other interesting projects include HOOMD and the popular NAMD; I have refrained from the last given its greedy licensing scheme. My studies are currently focused in LAMMPS because its fields of application and system portability.

Density Functional Theory (DFT)

Finite Element Method

Personal path towards mastering finite element method (FEM).

The goal of this repository is to track my learning path of finite element method. As a secondary goal, all tools included in the study must be open source with a permissive license. Finally, I will study again some subjects related to the physics of applied problems that will be solved through FEM.

<details> <summary> It is not my first time trying this and I learned a few things in the past failures. Below I expose my reasoning about the choices I make today for structuring this repository and its future. </summary> <br>

  1. During my college years I almost neglected solid mechanics and statics. It happens that most quality materials for learning FEM are applied to structural analysis (because that is the most import numerical method in that field). Because my applied work is mostly related to fluids and heat transfer, doing some bibliographic research I found the books by Lewis et al. and its newer edition by Nithiarasu et al. adapted to my expertise level.

  2. From a mathematical standpoint the most accessible material I have studied so far is the draft book by H. P. Langtangen and K.-A. Mardal. Unfortunatelly the main author deceased just after the release of the final draft and the material remained unfinished. That is not really a blocking point because the content is pretty much finished from a non-specialist standpoint. Furthermore, its exercises where converted into notebooks by Mojtaba Barzegari and the material is quite accessible.

  3. During the years I have tested several FEM packages and libraries. The most promissing FEM package in the open source world is certainly FEniCSx, but it comes with the disadvantage of requiring Linux/WSL and having an unclear documentation. In terms of power I couldn't find anything comparable to MOOSE - if you see the list of developer labs it becomes pretty clear why - but it is something to experienced FEM users since it requires low level implementation of the problems in C++. Elmer could be a candidate package for learning the practice, but for going into the mathematics of FEM it is not the right tool. Next comes Kratos but its documentation is messy and things moved around too much over the years. Finally we have FreeFEM++. It is a pretty old software what means that it outlived most of the other applications and now is very stable. What is interesting about FreeFEM++ is its portability across operating systems and good documentation. In what follows I will stick with FreeFEM++ and later with FEniCSx.

  4. Learning a numerical method for continuum mechanics is essentially useless without the capacity to apply it to real world geometries. Unfortunatelly the field of open source CAD is very poor so we have just a few options. Although Gmsh is pretty powerfull with respect to its meshing capabilities, conceiving the geometry with the software can quickly scale to trigonometry hell level. I have been using the software for many years for 2D cases but systematically fall back to proprietary software when things become complex. In this study I intend to reach a sorcerer Gmsh mastery level. It can be complemented by STL files generation with Blender or CAD in FreeCAD.

  5. Advanced post-processing is also a must, so we will also follow some tutorials to improve ParaView skills.

</details>

Software version

While doing such an ambitious study, it is important to stick with software versions.

In what follows we will be using exclusivelly the following software:

  • Gmsh 4.11.1
  • FreeFEM++ 4.13
  • ParaView 5.10.1
  • FreeCAD 0.21.1
  • Blender 4.0.2

Processing utilities in Julia and/or Python will have their own versioning so they are not reported here.

Study planning

Because it can become frustrating to progress in the study and not be able to apply the knowledge to real cases, we will start by growing competencies in geometry and meshing before entering the mathematical and software aspects. Planning is idealized in a weekly basis.

Because of its simpler format, Nithiarasu's book is followed at a faster pace than Langtangen's. At some point the subjects being studied at Langtangen's book will become a review and deepening of previously studied subjects.

For materials that were not cited above, here follow the links:

The book series by O.C. Zienkiewicz and collaborators will be included later since its in depth and general approach trespasses my current capacity on how to organize their study. After learning the basics over the next months I hope to be able to skecth a learning strategy to go over those books and feed this time-line.

Complementary studies to take at any time during the series:

  • The first 4 videos of this playlist.
  • The first 5 videos of this playlist.
  • This video and the sequence (no playlist created).
  • This video with a full Gmsh introduction.

Review and in-depth studies for solidification of knowledge:

Week 1

  • [ ] Follow 21 tutorials provided with Gmsh
  • [x] Follow this short course on FreeCAD.
  • [x] Follow this tutorial on FreeFEM without practicing.
  • [x] Nithiarasu (2016), chapters 1 and 2
  • [x] Langtangen (2016), chapters 1 and 2 (1/3)
  • [ ] Barzegari's notebook associated to Langtangens chapter 1
  • [ ] Engineering Statics | Lectures videos 1 to 10
  • [ ] Intro to the Finite Element Method | Lectures 1

Week 2

  • [ ] Nithiarasu (2016), chapter 3 (1/2)
  • [ ] Langtangen (2016), chapter 2 (2/3)
  • [ ] FreeFEM++ guided tutorials 2.1 to 2.9
  • [ ] Engineering Statics | Lectures videos 11 to 14
  • [ ] Solid Mechanics | Theory (all at once)
  • [ ] Intro to Continuum Mechanics | Seminars 1
  • [ ] Intro to the Finite Element Method | Lectures 2

Week 3

  • [ ] Nithiarasu (2016), chapter 3 (2/2)
  • [ ] Langtangen (2016), chapter 2 (3/3)
  • [ ] Barzegari's notebook associated to Langtangens chapter 2
  • [ ] FreeFEM++ guided tutorials 2.10 to 2.13
  • [ ] Engineering Statics | Lectures videos 15 to 18
  • [ ] Intro to Continuum Mechanics | Seminars 2
  • [ ] Intro to the Finite Element Method | Lectures 3

Week 4

  • [ ] Nithiarasu (2016), chapter 4
  • [ ] Langtangen (2016), chapter 3 (1/5)
  • [ ] FreeFEM++ guided tutorials 2.14 to 2.19
  • [ ] Engineering Statics | Lectures videos 19 to 22
  • [ ] Intro to Continuum Mechanics | Seminars 3
  • [ ] Intro to the Finite Element Method | Lectures 4
  • [ ] Follow these ParaView tutorials.

Week 5

  • [ ] Nithiarasu (2016), chapter 5
  • [ ] Langtangen (2016), chapter 3 (2/5)
  • [ ] Engineering Statics | Lectures videos 23 to 24
  • [ ] Intro to Continuum Mechanics | Seminars 4
  • [ ] Intro to the Finite Element Method | Lectures 5
  • [ ] Follow these ParaView tutorials.

Week 6

  • [ ] Nithiarasu (2016), chapter 6
  • [ ] Langtangen (2016), chapter 3 (3/5)
  • [ ] Intro to Continuum Mechanics | Seminars 5
  • [ ] Intro to the Finite Element Method | Lectures 6
  • [ ] Follow this ParaView seminar.

Week 7

  • [ ] Nithiarasu (2016), chapter 7 (1/3)
  • [ ] Langtangen (2016), chapter 3 (4/5)
  • [ ] Intro to Continuum Mechanics | Seminars 6
  • [ ] Intro to the Finite Element Method | Lectures 7
  • [ ] Follow this ParaView seminar.

Week 8

  • [ ] Nithiarasu (2016), chapter 7 (2/3)
  • [ ] Langtangen (2016), chapter 3 (5/5)
  • [ ] Barzegari's notebook associated to Langtangens chapter 3
  • [ ] Intro to Continuum Mechanics | Seminars 7
  • [ ] Intro to the Finite Element Method | Lectures 8
  • [ ] Follow this ParaView seminar.

Week 9

  • [ ] Nithiarasu (2016), chapter 7 (3/3)
  • [ ] Langtangen (2016), chapter 4 (1/2)
  • [ ] Intro to Continuum Mechanics | Seminars 8
  • [ ] Intro to the Finite Element Method | Lectures 9
  • [ ] Follow this ParaView seminar.

Week 10

  • [ ] Nithiarasu (2016), chapter 8
  • [ ] Langtangen (2016), chapter 4 (2/2)
  • [ ] Barzegari's notebook associated to Langtangens chapter 4
  • [ ] Intro to Continuum Mechanics | Seminars 9
  • [ ] Intro to the Finite Element Method | Lectures 10
  • [ ] Follow this ParaView seminar.

Week 11

  • [ ] Follow 7 extended tutorials provided with Gmsh (Python)
  • [ ] Nithiarasu (2016), chapter 9
  • [ ] Langtangen (2016), chapter 5 (1/3)
  • [ ] Intro to Continuum Mechanics | Seminars 10
  • [ ] Follow this ParaView seminar.

Week 12

  • [ ] Nithiarasu (2016), chapter 10
  • [ ] Langtangen (2016), chapter 5 (2/3)

Week 13

  • [ ] Nithiarasu (2016), chapter 11
  • [ ] Langtangen (2016), chapter 5 (3/3)
  • [ ] Barzegari's notebook associated to Langtangens chapter 5

Week 14

  • [ ] Nithiarasu (2016), chapter 12
  • [ ] Langtangen (2016), chapter 6 (1/2)

Week 15

  • [ ] Nithiarasu (2016), chapter 13
  • [ ] Langtangen (2016), chapter 6 (2/2)
  • [ ] Barzegari's notebook associated to Langtangens chapter 6

Week 16

  • [ ] Nithiarasu (2016), chapter 14 and 15
  • [ ] Langtangen (2016), chapter 7
  • [ ] Barzegari's notebook associated to Langtangens chapter 7

Week 17

  • [ ] Langtangen (2016), chapter 8
  • [ ] Barzegari's notebook associated to Langtangens chapter 8

Week 18

  • [ ] Langtangen (2016), chapter 9 (1/4)

Week 19

  • [ ] Langtangen (2016), chapter 9 (2/4)

Week 20

  • [ ] Langtangen (2016), chapter 9 (3/4)

Week 21

  • [ ] Langtangen (2016), chapter 9 (4/4)
  • [ ] Barzegari's notebook associated to Langtangens chapter 9

Week 22

  • [ ] Langtangen (2016), chapter 10

Week 23

  • [ ] Langtangen (2016), chapter 11

Finite Volume Method

Formulations of heat conduction

Temperature formulation

Before attempting to derive heat conduction equation in terms of enthalpy, it is worth warming up with its handling in temperature formulation. In this case, the equation is solved directly in terms of temperature as dependent variable which is also used in the governing potential (Fourier's law). This simple case is applicable to many engineering problems. First we formulate the problem with constant thermophysical properties before proceeding to variable density and specific heat.

Constant thermophysical properties

Heat equation formulated with temperature as dependent variable applied to constant density $\rho$ and specific heat $c_{p}$ can be stated as:

\[\rho{}c_{p}\frac{\partial{}T}{\partial{}t}=\nabla\cdotp{}(k\nabla{}T)\]

Applying the divergence operator to the right hand side to a single coordinate and expanding the gradient term for different coordinate systems (cartesian, cylindrical, and spherical) leads to the following expressions. Notice that coordinate was expressed as $r$ even in cartesian coordinates for homogeneity of notation in what follows.

\[\rho{}c_{p}\dfrac{\partial{}T}{\partial{}t}=\begin{cases} \dfrac{\partial}{\partial{}r} \left(k\dfrac{\partial{}T}{\partial{}r}\right) & \text{cartesian}\\[12pt] % @@ -243,4 +243,4 @@ \Delta{}T &= T^{\tau,k+1}-T^{\tau,k}\\ T^{\tau,k+1} &= T^{\tau,k}+(1-\alpha)\Delta{}T\\ \varepsilon^{k+1} &= \vert\Delta{}T\vert\\ -\end{align}\]

+\end{align}\]

diff --git a/dev/Science/04-Continuum-Mechanics/index.html b/dev/Science/04-Continuum-Mechanics/index.html index 4ac3c6f28..9fc1a9ff1 100644 --- a/dev/Science/04-Continuum-Mechanics/index.html +++ b/dev/Science/04-Continuum-Mechanics/index.html @@ -1,5 +1,5 @@ -Continuum Mechanics · WallyToolbox.jl

Continuum Mechanics


Analysis of transport phenomena

Theses notes intend to provide in a very concise way overview of the mathematical fundamentals of transport phenomena. In this sense, they are devoted to generalities rather than specific closure models. You can even see them as a cheat-sheet or simple lecture notes.

In that sense, they try to be straightforward and mostly self-contained in the fundamental topics, with increased reference to external sources in applied subjects. They were first redacted based on the MITx series Analysis of Transport Phenomena by Pr. Dr. Martin Bazant and further extended based on several sources cited along the way.

The main goal is to provide a general approach of transport phenomena applied to Materials Science and Process Engineering, but readers of other fields might also be interested in parts of the contents.

Note: this is still a work in progress and quickly evolving. Please let me know if you found any typos or conceptual mistakes. I am still to ask some friends to review them.

Transport phenomena foundations

Most physical phenomena are actually discrete processes (particles); many phenomena such as heat transfer are actual discrete vibrations in materials. Such systems are described by large systems of coupled ordinary differential equations (ODE's) which quickly become intractable and require numerical solution. Continuum approximations, i.e. an averaging process over a representative volume element (RVE), are used to generate a single partial differential equation (PDE) from many such ODE's. This transformation leads to the concept of conservation equations.

Say we have a quantity $b$ such as it represents a number $\#$ concentration of a given physical quantity. Associated to this quantity we have a flux density $\vec{F}$ through the boundaries of the system and a rate production in volume $B_v$ as summarized in the following table.

\[\begin{align*} +Continuum Mechanics · WallyToolbox.jl

Continuum Mechanics


Analysis of transport phenomena

Theses notes intend to provide in a very concise way overview of the mathematical fundamentals of transport phenomena. In this sense, they are devoted to generalities rather than specific closure models. You can even see them as a cheat-sheet or simple lecture notes.

In that sense, they try to be straightforward and mostly self-contained in the fundamental topics, with increased reference to external sources in applied subjects. They were first redacted based on the MITx series Analysis of Transport Phenomena by Pr. Dr. Martin Bazant and further extended based on several sources cited along the way.

The main goal is to provide a general approach of transport phenomena applied to Materials Science and Process Engineering, but readers of other fields might also be interested in parts of the contents.

Note: this is still a work in progress and quickly evolving. Please let me know if you found any typos or conceptual mistakes. I am still to ask some friends to review them.

Transport phenomena foundations

Most physical phenomena are actually discrete processes (particles); many phenomena such as heat transfer are actual discrete vibrations in materials. Such systems are described by large systems of coupled ordinary differential equations (ODE's) which quickly become intractable and require numerical solution. Continuum approximations, i.e. an averaging process over a representative volume element (RVE), are used to generate a single partial differential equation (PDE) from many such ODE's. This transformation leads to the concept of conservation equations.

Say we have a quantity $b$ such as it represents a number $\#$ concentration of a given physical quantity. Associated to this quantity we have a flux density $\vec{F}$ through the boundaries of the system and a rate production in volume $B_v$ as summarized in the following table.

\[\begin{align*} b &= \dfrac{\#}{\text{volume}} &\qquad\text{concentration} \\ \vec{F} &= \dfrac{\#}{\text{area}\cdotp{}\text{time}} &\qquad\text{flux density} \\ B_{v} &= \dfrac{\#}{\text{volume}\cdotp{}\text{time}} &\qquad\text{production rate} @@ -52,4 +52,4 @@ \begin{cases} \delta &\sim& \dfrac{D}{u}\\[12pt] \mathrm{Pe} &=& \dfrac{uL}{D} -\end{cases}\]

In the limiting case of $\mathrm{Pe}\gg{1}$ diffusion is much slower than convection and the flow can be approximated as purely advective; this characterizes the plug-flow regime.

024

025

+\end{cases}\]

In the limiting case of $\mathrm{Pe}\gg{1}$ diffusion is much slower than convection and the flow can be approximated as purely advective; this characterizes the plug-flow regime.

024

025

diff --git a/dev/Science/05-Machine-Learning/index.html b/dev/Science/05-Machine-Learning/index.html index 479bed7a8..9e428729c 100644 --- a/dev/Science/05-Machine-Learning/index.html +++ b/dev/Science/05-Machine-Learning/index.html @@ -1,2 +1,2 @@ -Machine Learning · WallyToolbox.jl

Machine Learning

Data Driven Science and Engineering

Notes based on Data-Driven Science and Engineering by Steven L. Brunton and J. Nathan Kurz. Their proposed teaching materials for the book can be found here. Supplementary notes that might be useful for understanding the concepts are provided in course AMATH301. The set of open source materials proposed by Kurz's team is found here.

Singular Value Decomposition

Fourier and Wavelet Transforms

Sparsity and Compressed Sensing

Regression and Model Selection

Clustering and Classification

Neural Networks and Deep Learning

Data-Driven Dynamical Systems

Linear Control Theory

Balanced Models for Control

Data-Driven Control

Reduced Order Models (ROMs)

POD for Partial Differential equations (11.1)

  • Proxy models are much faster (lower dimensional)
  • Classical discretization (FD) lead to high dimensional schemes
  • Model expansion can produce much lower dimension problems

\[u(x,t) = \sum_{k=1}^{n}a_{k}(t)\psi_k(x)\]

  • Idea: plug the modal expansion in the PDE and expand it
  • With modal basis the approximations are non-local (global)
  • Option 1: Fourier mode expansion - FFT

\[\psi_k(x)=\frac{1}{L}\exp\left(i\frac{2\pi{}kx}{L}\right)\]

  • Goal: try to approximate with $r$ basis instead of large $n$
  • Example: try to approximate a Gaussian with FME
  • Localized structures require more expansion modes
  • Construction similar to spectral methods

Optimal Basis Elements (11.2)

  • Key idea: simulate the dynamics of the system and save snapshots of time-step solutions to then identify a modal expansion.
  • The $\tilde{U}$ POD basis $\psi_k$ found by truncating the SVD matrix $U$ at rank $r$ is the optimal in the $L^2$ sense for the given data.
  • Use energy accumulated in modes as discussed in Chapter 1 Singular Value Decomposition to define the optimal (or good enough) value of $r$.
  • The produced ROM is not assured to be safe outside the subspace to which it was identified, though that is fine for several physics.

POD and Soliton Dynamics (11.3)

Continuous Formulation of POD

POD with Symmetries

Interpolation for Parametric ROMs

Additional materials

Professor Nick Trefethen, University of Oxford, Linear Algebra Optimization


Physics-Informed Neural Networks

Physics-Informed Neural Networks (PINNs) were first introduced by Raissi2017 [32] in the context of providing data-driven solutions of nonlinear PDE's. In what follows we review the basic concepts and approaches developed in this field during the past few years. Both mathematical and application aspects will be treated in the review.

Common applications

As per Guo2024a [33] the following common applications arise from PINNs:

Predictive modeling and simulations

  • Solution of dynamical systems (even high-dimensional)
  • Acceleration of multi-physics simulations

Optimization and systems control

  • Surrogate models for design optimization
  • Inverse design (finding conditions)
  • Model predictive control
  • Optimal sensor placement

Data-driven insights

Data-driven enhancement

Monitoring, diagnostic, and health assessment

Key Ideas

  • Inject the prediction values in the governing equations to compose the loss function, enforcing the NN to obey the underlying physics.

  • There are 2 components in the loss function, the physical loss evaluated from the deviation from training data (as is commonplace in NN training) and the PDE loss, which is further divided into boundary and initial condition losses.

  • Collocation points is how we call the temporal and spacial coordinates where evaluation of physical properties are computed, corresponding to nodes or cell centers in classical numerical schemes.

Research opportunities

  • Following Guo2023a [34] citing the work by Wu2022a [35], resampling and refinement methods could be improved by better PDF's and the use of active or reinforcement learning to improve sampling.

References

Unraveling the design pattern of physics-informed neural networks:

PostSubjectMain reference(s)
Guo2023a [34]Resampling of residual pointsWu2022a [35]
Guo2023b [36]Ensemble learning and dynamic solution interval expansionHaitsiukevich2022a [37]
Guo2023c [38]Improving performance through gradient boostingFang2023a [39]
Guo2023d [40]Incorporate the gradient of residual terms as an additional loss term for stiff problemsYu2022a [41]
Guo2023e [42]Wang2023a [43]
Guo2023f [44]Wang2022a [45]
Guo2023g [46]Arthurs2021a [47]
ReferenceSubject
Lagaris1997a [48]Seminal work on PINNs.
Antonelo2021a [49]
Cai2021a [50]
Cuomo2022a [51]
Haitsiukevich2022a [37]
Karniadakis2021a [52]
Lu2019a [53]
Lu2021a [54]
Nabian2021a [55]
Sanyal2022a [56]
Wurth2023a [57]Use of PINNs to solve diffusion equation (heat transfer) during the curing of composites. The paper is more focused in the application than in the implementation. Benchmark against FDM/FEM.

Other current readings:

+Machine Learning · WallyToolbox.jl

Machine Learning

Data Driven Science and Engineering

Notes based on Data-Driven Science and Engineering by Steven L. Brunton and J. Nathan Kurz. Their proposed teaching materials for the book can be found here. Supplementary notes that might be useful for understanding the concepts are provided in course AMATH301. The set of open source materials proposed by Kurz's team is found here.

Singular Value Decomposition

Fourier and Wavelet Transforms

Sparsity and Compressed Sensing

Regression and Model Selection

Clustering and Classification

Neural Networks and Deep Learning

Data-Driven Dynamical Systems

Linear Control Theory

Balanced Models for Control

Data-Driven Control

Reduced Order Models (ROMs)

POD for Partial Differential equations (11.1)

  • Proxy models are much faster (lower dimensional)
  • Classical discretization (FD) lead to high dimensional schemes
  • Model expansion can produce much lower dimension problems

\[u(x,t) = \sum_{k=1}^{n}a_{k}(t)\psi_k(x)\]

  • Idea: plug the modal expansion in the PDE and expand it
  • With modal basis the approximations are non-local (global)
  • Option 1: Fourier mode expansion - FFT

\[\psi_k(x)=\frac{1}{L}\exp\left(i\frac{2\pi{}kx}{L}\right)\]

  • Goal: try to approximate with $r$ basis instead of large $n$
  • Example: try to approximate a Gaussian with FME
  • Localized structures require more expansion modes
  • Construction similar to spectral methods

Optimal Basis Elements (11.2)

  • Key idea: simulate the dynamics of the system and save snapshots of time-step solutions to then identify a modal expansion.
  • The $\tilde{U}$ POD basis $\psi_k$ found by truncating the SVD matrix $U$ at rank $r$ is the optimal in the $L^2$ sense for the given data.
  • Use energy accumulated in modes as discussed in Chapter 1 Singular Value Decomposition to define the optimal (or good enough) value of $r$.
  • The produced ROM is not assured to be safe outside the subspace to which it was identified, though that is fine for several physics.

POD and Soliton Dynamics (11.3)

Continuous Formulation of POD

POD with Symmetries

Interpolation for Parametric ROMs

Additional materials

Professor Nick Trefethen, University of Oxford, Linear Algebra Optimization


Physics-Informed Neural Networks

Physics-Informed Neural Networks (PINNs) were first introduced by Raissi2017 [32] in the context of providing data-driven solutions of nonlinear PDE's. In what follows we review the basic concepts and approaches developed in this field during the past few years. Both mathematical and application aspects will be treated in the review.

Common applications

As per Guo2024a [33] the following common applications arise from PINNs:

Predictive modeling and simulations

  • Solution of dynamical systems (even high-dimensional)
  • Acceleration of multi-physics simulations

Optimization and systems control

  • Surrogate models for design optimization
  • Inverse design (finding conditions)
  • Model predictive control
  • Optimal sensor placement

Data-driven insights

Data-driven enhancement

Monitoring, diagnostic, and health assessment

Key Ideas

  • Inject the prediction values in the governing equations to compose the loss function, enforcing the NN to obey the underlying physics.

  • There are 2 components in the loss function, the physical loss evaluated from the deviation from training data (as is commonplace in NN training) and the PDE loss, which is further divided into boundary and initial condition losses.

  • Collocation points is how we call the temporal and spacial coordinates where evaluation of physical properties are computed, corresponding to nodes or cell centers in classical numerical schemes.

Research opportunities

  • Following Guo2023a [34] citing the work by Wu2022a [35], resampling and refinement methods could be improved by better PDF's and the use of active or reinforcement learning to improve sampling.

References

Unraveling the design pattern of physics-informed neural networks:

PostSubjectMain reference(s)
Guo2023a [34]Resampling of residual pointsWu2022a [35]
Guo2023b [36]Ensemble learning and dynamic solution interval expansionHaitsiukevich2022a [37]
Guo2023c [38]Improving performance through gradient boostingFang2023a [39]
Guo2023d [40]Incorporate the gradient of residual terms as an additional loss term for stiff problemsYu2022a [41]
Guo2023e [42]Wang2023a [43]
Guo2023f [44]Wang2022a [45]
Guo2023g [46]Arthurs2021a [47]
ReferenceSubject
Lagaris1997a [48]Seminal work on PINNs.
Antonelo2021a [49]
Cai2021a [50]
Cuomo2022a [51]
Haitsiukevich2022a [37]
Karniadakis2021a [52]
Lu2019a [53]
Lu2021a [54]
Nabian2021a [55]
Sanyal2022a [56]
Wurth2023a [57]Use of PINNs to solve diffusion equation (heat transfer) during the curing of composites. The paper is more focused in the application than in the implementation. Benchmark against FDM/FEM.

Other current readings:

diff --git a/dev/Science/06-Maths-Cheatsheet/index.html b/dev/Science/06-Maths-Cheatsheet/index.html index 042d508fb..626e8b5b4 100644 --- a/dev/Science/06-Maths-Cheatsheet/index.html +++ b/dev/Science/06-Maths-Cheatsheet/index.html @@ -1,2 +1,2 @@ -Mathematics · WallyToolbox.jl

Mathematics


Linear algebra

For a full review of linear algebra, please consult Lay2012 [80].

A linear system of equations may have (1) no solution, (2) exactly one solution, or (3) infinitely many solutions. Solving and analyzing them is the task of linear algebra.

Definitions

  • Echelon form
  • Pivot position
  • Span subset of $\mathbb{R}^n$
  • Matrix-vector product as a linear combination of columns

Theorems

  • Uniqueness of the reduced echelon form: each matrix is row equivalent to one and only one reduced echelon matrix.

  • Existence and uniqueness: a linear system is consistent if and only if the rightmost column of the augmented matrix is not a pivot column. In this case, the solution set contains either (1) a unique solution (no free variables), or (2) infinitely many solutions (at least one free variable).

  • A system $A\mathbf{x}=\mathbf{b}$ has the same solution set as the augmented linear system composed of the columns of $A$ appended by $\mathrm{b}$. The same is true for the equivalent vector equation, but that is self-evident from the definition of matrix-vector product.


Calculus


Differential equations

+Mathematics · WallyToolbox.jl

Mathematics


Linear algebra

For a full review of linear algebra, please consult Lay2012 [80].

A linear system of equations may have (1) no solution, (2) exactly one solution, or (3) infinitely many solutions. Solving and analyzing them is the task of linear algebra.

Definitions

  • Echelon form
  • Pivot position
  • Span subset of $\mathbb{R}^n$
  • Matrix-vector product as a linear combination of columns

Theorems

  • Uniqueness of the reduced echelon form: each matrix is row equivalent to one and only one reduced echelon matrix.

  • Existence and uniqueness: a linear system is consistent if and only if the rightmost column of the augmented matrix is not a pivot column. In this case, the solution set contains either (1) a unique solution (no free variables), or (2) infinitely many solutions (at least one free variable).

  • A system $A\mathbf{x}=\mathbf{b}$ has the same solution set as the augmented linear system composed of the columns of $A$ appended by $\mathrm{b}$. The same is true for the equivalent vector equation, but that is self-evident from the definition of matrix-vector product.


Calculus


Differential equations

diff --git a/dev/Science/08-Conductivity-Porous-Solids/index.html b/dev/Science/08-Conductivity-Porous-Solids/index.html index 403536356..07c896aa4 100644 --- a/dev/Science/08-Conductivity-Porous-Solids/index.html +++ b/dev/Science/08-Conductivity-Porous-Solids/index.html @@ -1,2 +1,2 @@ -Porous Solids · WallyToolbox.jl

Thermal conductivity of porous solids

Porous solids are characterized by the presence of voidance; they may be formed, for instance, through the sintering of particles with a given size distribution or through a foaming process. The former will lead to pores presenting a mostly convex geometry due to particle-particle contacts of while the latter leads to concave pores, generally due to former gas bubbles during foaming process; these morphologies and the scale of porosity will lead to a broad range of properties in macroscopic behavior of materials. Other features related to the porosity might include the communicating character of pores or the validity of continuum mechanics in a given problem due to pore sizes. This subject has been treated by scholars of many fields because of its relevance to industrial processes, heat transfer in furnaces, biological systems, and more recently in heat storage and recovery devices, not to try to be exhaustive here; specific citations come next.

In what follows we will briefly review some of the afore mentioned applications and historical developments in the field before tackling the problem of modeling heat transfer in arbitrary materials. The goal of our literature review is to determine the limits of applicability and how well accepted are the available methods proposed in the past, but also to identify potential use cases of computational methods in materials design before proposing our own scenarios. The study will comprise situations allowing for analytical solution for solver validation, reproduction of previous published results, and the modeling of arbitrary solids. Unless stated otherwise, numerical studies in two and three dimensions are carried out with Elmer Malinen2013a [58] finite element method (FEM) solver. Additional simulations with pore filling with inclusions are also included in the study, providing a basis for composite materials. A database of predicted materials properties is composed for future studies.

Literature survey

  • Masamune1963a [59]: studied the role of gas pressure below and up to atmospheric pressure over the effective thermal conductivity $k_{e}$ of a bed of spherical particles by carrying out measurements at 42 °C; mechanisms of heat transfer can be classified as transport through (1) conduction and radiation in voids, (2) effective solid-path and gas-path lengths, and (3) solid conduction through contacts. Although the authors acknowledge the role of radiation in heat transfer, it is not included in their expression, but low Knudsen number effects were considered for thermal conductivity when necessary by considering a pressure dependence in gas thermal conductivity $k_{g}^{\star}$.

  • Luikov1968a [60]:

  • Koh1971a [61]:

  • Koh1973a [62]:

  • Fiedler2006a [63]:

  • Fiedler2007a [64]:

  • Fiedler2009a [65]:

  • Smith2013a [66]:

  • Cheilytko2016a [67]:

  • Pia2016a [68]:

  • Qiu2018a [69]:

  • Chikhi2020a [70]:

  • Mraz2021a [71]:

Experimental design

No.CaseStatusGoal
1Analytical solution of dense, $k=k_{ref}$
2Analytical solution of dense, $k=k_{ref}-bT$
3Simulation of dense, $k=k_{ref}$
4Simulation of dense, $k=k_{ref}-bT$
5

Summary of results

+Porous Solids · WallyToolbox.jl

Thermal conductivity of porous solids

Porous solids are characterized by the presence of voidance; they may be formed, for instance, through the sintering of particles with a given size distribution or through a foaming process. The former will lead to pores presenting a mostly convex geometry due to particle-particle contacts of while the latter leads to concave pores, generally due to former gas bubbles during foaming process; these morphologies and the scale of porosity will lead to a broad range of properties in macroscopic behavior of materials. Other features related to the porosity might include the communicating character of pores or the validity of continuum mechanics in a given problem due to pore sizes. This subject has been treated by scholars of many fields because of its relevance to industrial processes, heat transfer in furnaces, biological systems, and more recently in heat storage and recovery devices, not to try to be exhaustive here; specific citations come next.

In what follows we will briefly review some of the afore mentioned applications and historical developments in the field before tackling the problem of modeling heat transfer in arbitrary materials. The goal of our literature review is to determine the limits of applicability and how well accepted are the available methods proposed in the past, but also to identify potential use cases of computational methods in materials design before proposing our own scenarios. The study will comprise situations allowing for analytical solution for solver validation, reproduction of previous published results, and the modeling of arbitrary solids. Unless stated otherwise, numerical studies in two and three dimensions are carried out with Elmer Malinen2013a [58] finite element method (FEM) solver. Additional simulations with pore filling with inclusions are also included in the study, providing a basis for composite materials. A database of predicted materials properties is composed for future studies.

Literature survey

  • Masamune1963a [59]: studied the role of gas pressure below and up to atmospheric pressure over the effective thermal conductivity $k_{e}$ of a bed of spherical particles by carrying out measurements at 42 °C; mechanisms of heat transfer can be classified as transport through (1) conduction and radiation in voids, (2) effective solid-path and gas-path lengths, and (3) solid conduction through contacts. Although the authors acknowledge the role of radiation in heat transfer, it is not included in their expression, but low Knudsen number effects were considered for thermal conductivity when necessary by considering a pressure dependence in gas thermal conductivity $k_{g}^{\star}$.

  • Luikov1968a [60]:

  • Koh1971a [61]:

  • Koh1973a [62]:

  • Fiedler2006a [63]:

  • Fiedler2007a [64]:

  • Fiedler2009a [65]:

  • Smith2013a [66]:

  • Cheilytko2016a [67]:

  • Pia2016a [68]:

  • Qiu2018a [69]:

  • Chikhi2020a [70]:

  • Mraz2021a [71]:

Experimental design

No.CaseStatusGoal
1Analytical solution of dense, $k=k_{ref}$
2Analytical solution of dense, $k=k_{ref}-bT$
3Simulation of dense, $k=k_{ref}$
4Simulation of dense, $k=k_{ref}-bT$
5

Summary of results

diff --git a/dev/Science/10-Continuum-Mechanics/index.html b/dev/Science/10-Continuum-Mechanics/index.html index 52d162a54..c2d745787 100644 --- a/dev/Science/10-Continuum-Mechanics/index.html +++ b/dev/Science/10-Continuum-Mechanics/index.html @@ -1,5 +1,5 @@ -Reatores pistão · WallyToolbox.jl

Reatores pistão

#plug-flow

Escoamentos nos quais a componente axial do transporte por advecção é dominante sobre o transporte difusivo aproximam-se do comportamento dito pistão. Neste caso o número de Péclet (ver transport para mais detalhes) tende ao infinito.

A temática de reatores pistão apresenta grande interesse para o cientista e engenheiro dados os fatos de que (1) frequentemente instalações experimentais no laboratório podem ser caracterizadas como estando neste regime limite e (2) com a composição de reatores pistão e agitados é possível compor modelos de reatores mais complexos de utilidade industrial. A introdução desenvolvida aqui parte da apresentação feita por Kee2017 [74] para então desenvolver uma abordagem algorítmica para solução de reatores quaisquer. A abordagem de engenharia de reatores empregando modelos compostos não será apresentada, o leitor interessado podendo encontrá-la em Fogler1999 [75].

Um primeiro modelo

Para a introdução do tópico vamos aborda o estabelecimento do modelo e as equações de conservação necessárias. No presente caso, isso será feiro na ausência de reações químicas e trocas de matéria com o ambiente - o reator é um tubo fechado - precisamos estabelecer a conservação de massa e energia apenas. Como dito, o reator em questão conserva a massa transportada, o que é matematicamente expresso pela ausência de variação axial do fluxo de matéria, ou seja

\[\frac{d(\rho{}u)}{dz}=0\]

Mesmo que trivial, esse resultado é frequentemente útil na simplificação das outras equações de conservação para um reator pistão, como veremos (com frequência) mais tarde.

Embora não trocando matéria com o ambiente a través das paredes, vamos considerar aqui trocas térmicas. Afinal não parece muito útil um modelo de reator sem trocas de nenhum tipo nem reações. Da primeira lei da Termodinâmica temos que a taxa de variação da energia interna $E$ é igual a soma das taxas de trocas de energia $Q$ e do trabalho realizado $W$.

\[\frac{dE}{dt}= \frac{dQ}{dt}+ \frac{dW}{dt}\]

Podemos reescrever essa equação para uma seção transversal do reator de área $A_{c}$ em termos das grandezas específicas e densidade $\rho$ com as integrais

#divergence-theorem

\[\int_{\Omega}\rho{}e\mathbf{V}\cdotp\mathbf{n}dA_{c}= +Reatores pistão · WallyToolbox.jl

Reatores pistão

#plug-flow

Escoamentos nos quais a componente axial do transporte por advecção é dominante sobre o transporte difusivo aproximam-se do comportamento dito pistão. Neste caso o número de Péclet (ver transport para mais detalhes) tende ao infinito.

A temática de reatores pistão apresenta grande interesse para o cientista e engenheiro dados os fatos de que (1) frequentemente instalações experimentais no laboratório podem ser caracterizadas como estando neste regime limite e (2) com a composição de reatores pistão e agitados é possível compor modelos de reatores mais complexos de utilidade industrial. A introdução desenvolvida aqui parte da apresentação feita por Kee2017 [74] para então desenvolver uma abordagem algorítmica para solução de reatores quaisquer. A abordagem de engenharia de reatores empregando modelos compostos não será apresentada, o leitor interessado podendo encontrá-la em Fogler1999 [75].

Um primeiro modelo

Para a introdução do tópico vamos aborda o estabelecimento do modelo e as equações de conservação necessárias. No presente caso, isso será feiro na ausência de reações químicas e trocas de matéria com o ambiente - o reator é um tubo fechado - precisamos estabelecer a conservação de massa e energia apenas. Como dito, o reator em questão conserva a massa transportada, o que é matematicamente expresso pela ausência de variação axial do fluxo de matéria, ou seja

\[\frac{d(\rho{}u)}{dz}=0\]

Mesmo que trivial, esse resultado é frequentemente útil na simplificação das outras equações de conservação para um reator pistão, como veremos (com frequência) mais tarde.

Embora não trocando matéria com o ambiente a través das paredes, vamos considerar aqui trocas térmicas. Afinal não parece muito útil um modelo de reator sem trocas de nenhum tipo nem reações. Da primeira lei da Termodinâmica temos que a taxa de variação da energia interna $E$ é igual a soma das taxas de trocas de energia $Q$ e do trabalho realizado $W$.

\[\frac{dE}{dt}= \frac{dQ}{dt}+ \frac{dW}{dt}\]

Podemos reescrever essa equação para uma seção transversal do reator de área $A_{c}$ em termos das grandezas específicas e densidade $\rho$ com as integrais

#divergence-theorem

\[\int_{\Omega}\rho{}e\mathbf{V}\cdotp\mathbf{n}dA_{c}= \dot{Q}- \int_{\Omega}p\mathbf{V}\cdotp\mathbf{n}dA_{c}\]

Com a definição de entalpia $h$ podemos simplificar essa equação e obter

\[\int_{\Omega}\rho{}h\mathbf{V}\cdotp\mathbf{n}dA_{c}= \dot{Q}\qquad{}\text{aonde}\qquad{}h = e+\frac{p}{\rho}\]

Usando o teorema de Gauss transformamos essa integral sobre a superfície num integral de divergência sobre o volume diferencial $dV$, o que é útil na manipulação de equações de conservação

\[\int_{\Omega}\rho{}h\mathbf{V}\cdotp\mathbf{n}dA_{c}= @@ -71,4 +71,4 @@ f_{N-2,N-1} \\ f_{N-1,N} \\ \end{bmatrix}\]

No vetor do lado direito introduzimos uma função de $f$ dada por

\[f_{i,j} = 2aT_{s} - a(T_{i}+T_{j})\]

Solução em volumes finitos

#finite-volume-method

Como as temperaturas usadas no lado direito da equação não são conhecidas inicialmente, o problema tem um caráter iterativo intrínseco. Inicializamos o lado direito da equação para em seguida resolver o problema na entalpia, que deve ser invertida (equações não lineares) para se atualizar as temperaturas. Isso se repete até que a solução entre duas iterações consecutivas atinja um critério de convergência.

Como a estimativa inicial do campo de temperaturas pode ser extremamente ruim, usamos um método com relaxações consecutivas da solução no caminho da convergência. A ideia de base é evitar atualizações bruscas que podem gerar temperaturas negativas ou simplesmente divergir para o infinito. A cada passo, partindo das temperaturas $T^{(m)}$, aonde $m$ é o índice da iteração, resolvemos o sistema não-linear para encontrar $T^{(m+1)^\prime}$. Pelas razões citadas, não é razoável utilizar essa solução diretamente, portanto realizamos a ponderação, dita relaxação, que se segue

\[T^{(m+1)}=(1-\alpha)T^{(m+1)^\prime}+αT^{(m)}\]

O fator $\alpha$ representa neste caso a fração de contribuição da solução anterior a nova estimativa. Essa é somente a ponta do iceberg em termos de relaxação e ao longo da série veremos em mais detalhes o conceito. Como critério de parada do cálculo, o que chamamos convergência, queremos que a máxima atualização $\Delta{}T$ relativa do campo de temperaturas seja menor que um critério $\varepsilon$, ou seja

\[\max\frac{\vert{}T^{(m+1)}-T^{(m)}\vert}{\vert{}\max{T^{(m)}}\vert}= -\max\biggr\vert{}\frac{\Delta{}T{}}{\max{}T^{(m)}}\biggr\vert<\varepsilon\]

Para evitar cálculos separados da nova temperatura e então da variação, podemos usar as definições acima para chegar à

\[\Delta{}T{} = (1-\alpha)(T^{(m+1)^\prime}-T^{(m)})\]

e então atualizar a solução com $T^{(m+1)}=T^{(m)}+\Delta{}T{}$.

To-do

  • Abordagem do modelo apresentado em Bird2001 [4] 10.5.
  • Nusselt variável segundo Bird2001 [4] Tab. 14.2.
+\max\biggr\vert{}\frac{\Delta{}T{}}{\max{}T^{(m)}}\biggr\vert<\varepsilon\]

Para evitar cálculos separados da nova temperatura e então da variação, podemos usar as definições acima para chegar à

\[\Delta{}T{} = (1-\alpha)(T^{(m+1)^\prime}-T^{(m)})\]

e então atualizar a solução com $T^{(m+1)}=T^{(m)}+\Delta{}T{}$.

To-do

  • Abordagem do modelo apresentado em Bird2001 [4] 10.5.
  • Nusselt variável segundo Bird2001 [4] Tab. 14.2.
diff --git a/dev/Science/Drafts/index.html b/dev/Science/Drafts/index.html index 3499bd23f..d3e8a6020 100644 --- a/dev/Science/Drafts/index.html +++ b/dev/Science/Drafts/index.html @@ -1,2 +1,2 @@ -- · WallyToolbox.jl

Courses to follow:

\item\href{https://ocw.mit.edu/courses/mathematics/18-075-advanced-calculus-for-engineers-fall-2004/}{Advanced Calculus}

\item\href{https://ocw.mit.edu/courses/mechanical-engineering/2-06-fluid-dynamics-spring-2013/}{Fluid Dynamics}:

\item\href{https://ocw.mit.edu/courses/mechanical-engineering/2-25-advanced-fluid-mechanics-fall-2013/}{Advanced Fluid Mecanics}

\item\href{https://ocw.mit.edu/courses/mechanical-engineering/2-27-turbulent-flow-and-transport-spring-2002/}{Turbulent Flow and Transport}

\item\href{https://ocw.mit.edu/courses/mechanical-engineering/2-051-introduction-to-heat-transfer-fall-2015/}{Introduction to Heat Transfer}

\item\href{https://ocw.mit.edu/courses/mechanical-engineering/2-51-intermediate-heat-and-mass-transfer-fall-2008/}{Intermediate Heat Transfer}

\item\href{https://ocw.mit.edu/courses/mechanical-engineering/2-58j-radiative-transfer-spring-2006/}{Radiative Transfer}

\item\href{https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-336j-introduction-to-numerical-simulation-sma-5211-fall-2003/}{Introduction to Simulation}

\item\href{https://ocw.mit.edu/courses/aeronautics-and-astronautics/16-920j-numerical-methods-for-partial-differential-equations-sma-5212-spring-2003/}{Numerical Methods for PDE}

\item\href{https://ocw.mit.edu/courses/mechanical-engineering/2-29-numerical-fluid-mechanics-spring-2015/}{Numerical Fluid Mechanics}

\item\href{https://ppc.cs.aalto.fi/}{Programming Parallel Computers} (and its extension to \href{https://github.com/parallel-rust-cpp}{Rust})

\item\href{https://www.youtube.com/playlist?list=PLfF–3o8i4r82vJ0kjCVYgqKgyVM5QwN0}{Fluid Mechanics (classical)}

\item\href{https://www.youtube.com/playlist?list=PL6S8U84PCLB27bdd15l1xnTSQKf3AOOoj}{Turbulent mixing conference (ICTP)}

\item\href{https://www.youtube.com/playlist?list=PL80xBr8Wq0b5qXRPwyTxmGDOhO4obKOiC}{Turbulent flows}

\item\href{https://www.youtube.com/playlist?list=PLp0hSY2uBeP8rhCbecD1Icahfbr6GSZ19}{Mathematical methods (ICTP)}

\item\href{https://www.youtube.com/playlist?list=PLp0hSY2uBeP_7jL7uqlsxDmvimK2q6eF5}{Fluid dynamics (ICTP)}

\item\href{https://www.youtube.com/channel/UCYlD7XynaJIBuYvmXlRBtnQ}{Pr. Dr. Carlos Thompson channel}

  • [ ] Proof of mean value theorem (null integral implies null integrand)
  • [ ] Derivation of Gauss (divergence) theorem

Thermodynamics quick review

  • When order increases entropy decreases.
  • An endothermic process is a process that absorbs heat from its surroundings; on the other hand, an exothermic process releases heat to its surroundings.

Granular flows

  • Parcel is a computational particle unit that may be composed of several particles which are all identical sharing a state, which include velocity, size, temperature, etc. See ORourke2010 [72] for details.

  • Cloud is the term OpenFOAM uses to describe particle flows. Here we will use both MPPICCloud andcollidingCloud, other types being available for reacting or multiphase solvers, such as thermoCloud.

Technological

  • Siwek chamber is a reactor often used to determine the dispersion of solid fuels for combustion. Validation of simulations can be done through this and this paper. Other than the OpenFOAM case there is also this setup available on Fetch CFD.

Mathematical

  • Hopf bifurcation  is a critical point where, as a parameter changes, a system's stability switches and a periodic solution arises. (see this).

Combustion

  • HyChem is an approach for modeling combustion of real liquid fuels by decomposing the problem into a lumped parameter model of evaporation/devolatilization and a detailed or simplified chemical kinetics approach applied to the gas phase. It is available for high-end fuels such as jet fuel and gasoline.

Condensate fuel combustion

This matter enters a intrinsically multiphysics domain and problem formulation needs to take into account at what level the model is required to act. For liquids, that might include spray droplets formation, evaporation, devolatilization, mass transfer to gas phase, and finally, oxidation kinetics of gas products. In the case of solids, due to high uncertainty and variability in material properties, and complex mass transfer phenomena, one must expect qualitative or semi-quantitative agreement of models and measurements. Furthermore, lumped-parameter modeling is a requirement in the field, making it difficult to be generalized to a physical level as of today.

[[@Saario2005a]] used Ansys Fluent to simulate HFO (heavy-fuel oil) combustion using the standard mixture fraction approach coupled to a Lagrangian particle tracking for evaporating droplets and $k-\epsilon$ turbulence modeling. This is a highly standard industrial application of global combustion simulation from an energy standpoint but lacks the generality of considering a detailed chemistry of gas phase (for instance, for coupling with solid calcination reactions, if that is the case).

[[@Garaniya2012a]] used StarCD to simulate HFO in the context of ship engines. From the same authors Garaniya2012b [73], we also have the the thermodynamic formulation of the problem.

[[@Nowruzi2014]] successfully simulated a spray jet of HFO with OpenFOAM without accounting for chemistry and combustion. In the absence of a proper PSD (particle size-distribution) this step is required to initialize a simulation, but can hardly be integrated in a reacting flow simulation, which would become overly complex.

[[@Sanchez2023a]] studied the combustion of biomass with help of OpenFOAM with some semi-quantitative results within 13% from the measurements, what is already considered a very good agreement in the field.

  • [ ] Continue the research here.

Combustion of heavy oil fuel

[[@Lawn1987]]

+- · WallyToolbox.jl

Courses to follow:

\item\href{https://ocw.mit.edu/courses/mathematics/18-075-advanced-calculus-for-engineers-fall-2004/}{Advanced Calculus}

\item\href{https://ocw.mit.edu/courses/mechanical-engineering/2-06-fluid-dynamics-spring-2013/}{Fluid Dynamics}:

\item\href{https://ocw.mit.edu/courses/mechanical-engineering/2-25-advanced-fluid-mechanics-fall-2013/}{Advanced Fluid Mecanics}

\item\href{https://ocw.mit.edu/courses/mechanical-engineering/2-27-turbulent-flow-and-transport-spring-2002/}{Turbulent Flow and Transport}

\item\href{https://ocw.mit.edu/courses/mechanical-engineering/2-051-introduction-to-heat-transfer-fall-2015/}{Introduction to Heat Transfer}

\item\href{https://ocw.mit.edu/courses/mechanical-engineering/2-51-intermediate-heat-and-mass-transfer-fall-2008/}{Intermediate Heat Transfer}

\item\href{https://ocw.mit.edu/courses/mechanical-engineering/2-58j-radiative-transfer-spring-2006/}{Radiative Transfer}

\item\href{https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-336j-introduction-to-numerical-simulation-sma-5211-fall-2003/}{Introduction to Simulation}

\item\href{https://ocw.mit.edu/courses/aeronautics-and-astronautics/16-920j-numerical-methods-for-partial-differential-equations-sma-5212-spring-2003/}{Numerical Methods for PDE}

\item\href{https://ocw.mit.edu/courses/mechanical-engineering/2-29-numerical-fluid-mechanics-spring-2015/}{Numerical Fluid Mechanics}

\item\href{https://ppc.cs.aalto.fi/}{Programming Parallel Computers} (and its extension to \href{https://github.com/parallel-rust-cpp}{Rust})

\item\href{https://www.youtube.com/playlist?list=PLfF–3o8i4r82vJ0kjCVYgqKgyVM5QwN0}{Fluid Mechanics (classical)}

\item\href{https://www.youtube.com/playlist?list=PL6S8U84PCLB27bdd15l1xnTSQKf3AOOoj}{Turbulent mixing conference (ICTP)}

\item\href{https://www.youtube.com/playlist?list=PL80xBr8Wq0b5qXRPwyTxmGDOhO4obKOiC}{Turbulent flows}

\item\href{https://www.youtube.com/playlist?list=PLp0hSY2uBeP8rhCbecD1Icahfbr6GSZ19}{Mathematical methods (ICTP)}

\item\href{https://www.youtube.com/playlist?list=PLp0hSY2uBeP_7jL7uqlsxDmvimK2q6eF5}{Fluid dynamics (ICTP)}

\item\href{https://www.youtube.com/channel/UCYlD7XynaJIBuYvmXlRBtnQ}{Pr. Dr. Carlos Thompson channel}

  • [ ] Proof of mean value theorem (null integral implies null integrand)
  • [ ] Derivation of Gauss (divergence) theorem

Thermodynamics quick review

  • When order increases entropy decreases.
  • An endothermic process is a process that absorbs heat from its surroundings; on the other hand, an exothermic process releases heat to its surroundings.

Granular flows

  • Parcel is a computational particle unit that may be composed of several particles which are all identical sharing a state, which include velocity, size, temperature, etc. See ORourke2010 [72] for details.

  • Cloud is the term OpenFOAM uses to describe particle flows. Here we will use both MPPICCloud andcollidingCloud, other types being available for reacting or multiphase solvers, such as thermoCloud.

Technological

  • Siwek chamber is a reactor often used to determine the dispersion of solid fuels for combustion. Validation of simulations can be done through this and this paper. Other than the OpenFOAM case there is also this setup available on Fetch CFD.

Mathematical

  • Hopf bifurcation  is a critical point where, as a parameter changes, a system's stability switches and a periodic solution arises. (see this).

Combustion

  • HyChem is an approach for modeling combustion of real liquid fuels by decomposing the problem into a lumped parameter model of evaporation/devolatilization and a detailed or simplified chemical kinetics approach applied to the gas phase. It is available for high-end fuels such as jet fuel and gasoline.

Condensate fuel combustion

This matter enters a intrinsically multiphysics domain and problem formulation needs to take into account at what level the model is required to act. For liquids, that might include spray droplets formation, evaporation, devolatilization, mass transfer to gas phase, and finally, oxidation kinetics of gas products. In the case of solids, due to high uncertainty and variability in material properties, and complex mass transfer phenomena, one must expect qualitative or semi-quantitative agreement of models and measurements. Furthermore, lumped-parameter modeling is a requirement in the field, making it difficult to be generalized to a physical level as of today.

[[@Saario2005a]] used Ansys Fluent to simulate HFO (heavy-fuel oil) combustion using the standard mixture fraction approach coupled to a Lagrangian particle tracking for evaporating droplets and $k-\epsilon$ turbulence modeling. This is a highly standard industrial application of global combustion simulation from an energy standpoint but lacks the generality of considering a detailed chemistry of gas phase (for instance, for coupling with solid calcination reactions, if that is the case).

[[@Garaniya2012a]] used StarCD to simulate HFO in the context of ship engines. From the same authors Garaniya2012b [73], we also have the the thermodynamic formulation of the problem.

[[@Nowruzi2014]] successfully simulated a spray jet of HFO with OpenFOAM without accounting for chemistry and combustion. In the absence of a proper PSD (particle size-distribution) this step is required to initialize a simulation, but can hardly be integrated in a reacting flow simulation, which would become overly complex.

[[@Sanchez2023a]] studied the combustion of biomass with help of OpenFOAM with some semi-quantitative results within 13% from the measurements, what is already considered a very good agreement in the field.

  • [ ] Continue the research here.

Combustion of heavy oil fuel

[[@Lawn1987]]

diff --git a/dev/Software/Basilisk/index.html b/dev/Software/Basilisk/index.html index 6ca748361..a5edf5a0e 100644 --- a/dev/Software/Basilisk/index.html +++ b/dev/Software/Basilisk/index.html @@ -1,5 +1,5 @@ -Basilisk · WallyToolbox.jl

Basilisk

The goal of this material is to provide support to teaching introductory computational fluid mechanics with aid of Basilisk. The studies are based on commented tutorials and a documentation guide extending what is already provided with the package.

Before going over the tutorials, you need some C knowledge. In the future I intend to provide a synthetic version applied to Basilisk students only. For now, the referred one is pretty good.

First steps

The source code for the studies is provided here. The repository keeps a copy of Basilisk at a version that will work with all modified tutorials. It may be eventually updated, but in that case functioning of tutorials will be tested. You will need to clone it then following the steps to compile Basilisk before starting. After building Basilisk, instead of adding variables to your environment, consider sourcing them temporarily with help of source activate.sh using the provided script.

All tutorials are found under src. Just enter the tutorials you want to follow using the command line and run make. This not only will compile, but will also run and post-process results.

Project management

Although Basilisk is a very interesting dialect of C, its documentation is still old-fashioned and lack some structuration. Also sample programs are not written to be easily managed and extended for use in variant cases. Here we propose a structure for creating better projects with Basilisk:

  • A Basilisk project lives in its own folder: one executable means one directory.

  • A simpler Makefile than Basilisk's default one is used for project building.

  • The main file is called app.c and contains a very simple structure as provided in the dummy listing bellow. All the logic of a project, i.e. the events, is implemented in separate header files that are included after Basilisk includes.

// Definitions
+Basilisk · WallyToolbox.jl

Basilisk

The goal of this material is to provide support to teaching introductory computational fluid mechanics with aid of Basilisk. The studies are based on commented tutorials and a documentation guide extending what is already provided with the package.

Before going over the tutorials, you need some C knowledge. In the future I intend to provide a synthetic version applied to Basilisk students only. For now, the referred one is pretty good.

First steps

The source code for the studies is provided here. The repository keeps a copy of Basilisk at a version that will work with all modified tutorials. It may be eventually updated, but in that case functioning of tutorials will be tested. You will need to clone it then following the steps to compile Basilisk before starting. After building Basilisk, instead of adding variables to your environment, consider sourcing them temporarily with help of source activate.sh using the provided script.

All tutorials are found under src. Just enter the tutorials you want to follow using the command line and run make. This not only will compile, but will also run and post-process results.

Project management

Although Basilisk is a very interesting dialect of C, its documentation is still old-fashioned and lack some structuration. Also sample programs are not written to be easily managed and extended for use in variant cases. Here we propose a structure for creating better projects with Basilisk:

  • A Basilisk project lives in its own folder: one executable means one directory.

  • A simpler Makefile than Basilisk's default one is used for project building.

  • The main file is called app.c and contains a very simple structure as provided in the dummy listing bellow. All the logic of a project, i.e. the events, is implemented in separate header files that are included after Basilisk includes.

// Definitions
 #define LEVEL 7
 #define ...
 
@@ -18,4 +18,4 @@
 	init_grid(1 << LEVEL);
 	...
 	run();
-}

Parallel computing

Currently I have not tried Basilisk in parallel (actually I did so a few years back but don't really remember the steps). Since there is no dedicated tutorial for going parallel, here are the notes I am taking for writing something in that sense:

  • Tutorial isotropic.c has notes on how to run parallel in some of its parent universities supercomputers. Probably some steps there might be recycled here.

Introductory tutorials

Basilisk basics

ReferenceTutorial
Code01-Tutorial-Basics
NotesBasilisk is a conceptual solver for investigating problems in a Cartesian domain.<br><br>Different steps of the simulations are set by event's, which use a specific syntax do indicate whether they depend on a time or iteration condition. These steps might include setup of initial conditions, storage of intermediate results or solution, grid refinement, etc.<br><br>For iterating over arrays Basilisk provides a foreach()loop extending the C-language.<br><br>A standard Makefile is provided by Basilisk for managing common workflows.<br><br>Check the tips.

Game of life

ReferenceConway’s game of life
Code02-Game-of-life
NotesA simple implementation of Conway's game of life to get used with syntax.

Brusselator

ReferenceCoupled reaction-diffusion equations
Code03-Brusselator
NotesSolves the 2D Brusselator, a theoretical autocatalytic reaction diffusion system. The set of parameters used in the study for the stable Turin points where the ones proposed by Pena2001a [19]. Interesting material for preparing courses extending this to other oscillating systems can be found here.

Ginzburg-Landau

ReferenceThe complex Ginzburg-Landau equation
Code04-Ginzburg-Landau
NotesSolves the complex Ginzburg-Landau equation describing the nonlinear evolution of disturbances near the transition from a stable to unstable state of a system. Additional materials are provided here. It would be a good project to include the term $\alpha$ in the equation and the Laplacian term that goes with it.

Distance field

ReferenceDistance field computation from a 3D model
Code05-Distance-Field
NotesThis can be seen as a particular case of pre-/post-processing. It can prove useful when initializing domains with scanned surfaces in STL or other compatible format. Additional steps must be taken for compilation with rendering (modifications to Makefile). Iteration over dimensions can be done with foreach_dimension().

Wavelet transform

ReferenceWavelet transforms and filtering
Code06-Wavelet-Transform
NotesProvides a tutorial on wavelet transform and associated filters. It is presented as the basis to understand mesh adaptation in Basilisk. Recommended reading of Sweldens1998a [20].

Decaying turbulence

ReferenceDecaying two-dimensional turbulence
Code07-Decaying-Turbulence
NotesFor solving Euler equation with vorticity-stream formulation one uses header file navier-stokes/stream.h. The examples makes a first usage of dimensional quantities for vorticity initialization.

Vortex street

ReferenceBénard–von Kármán Vortex Street for flow around a cylinder
Code08-Vortex-Street
NotesSolves the flow around a solid object using the navier-stokes/centered.h solver and introduced the use of passive scalars (tracer). Notice we modify L0, which among many other magic variables is defined in common.h. Illustrates the use of solid and intersection to accomplish complex domains.

Vortex shedding

ReferenceVortex shedding behind a sphere
Code09-Vortex-Shedding
NotesSolution of Navier-Stokes equations in an adaptive domain embedding an sphere. Vortex detection is made with functionalities from lambda2.h implemented following Jeong1995a [21].

Porous medium

ReferenceStokes flow through a complex 3D porous medium
Code10-Porous-Medium
Notes

Periodic box

ReferenceForced isotropic turbulence in a triply-periodic box
Code11-Periodic-Box
Notes

Two-phase flows

Pulsed atomization

ReferenceAtomisation of a pulsed liquid jet
Code12-Pulsed-Atomisation
Notes

Bubble rising

ReferenceBubble rising in a large tank
Code13-Bubble-Rising
Notes

Rotating cylinder

ReferenceFlow in a rotating bottom-driven cylindrical container
Code14-Rotating-Cylinder
Notes

Moving Tangaroa

ReferenceTwo-phase flow around RV Tangaroa
Code15-Moving-Tangaroa
Notes

Geophysical applications

Indian Tsunami

ReferenceThe 2004 Indian Ocean tsunami
Code16-Indian-Tsunami
Notes

Tohoku Tsunami

ReferenceThe 2011 Tohoku tsunami
Code17-Tohoku-Tsunami
Notes

Train of Solitons

ReferenceBreakup of a rectangular perturbation into a train of solitons
Code18-Train-of-Solitons
Notes

Lee Waves

ReferenceTidally-induced internal lee waves
Code19-Lee-Waves
Notes

Ellipsoidal Shoal

ReferencePeriodic wave propagation over an ellipsoidal shoal
Code20-Ellipsoidal-Shoal
Notes

Ellipsoidal Shoal Multilayer

ReferencePeriodic wave propagation over an ellipsoidal shoal (multilayer)
Code21-Ellipsoidal-Shoal-Multilayer
NotesCheck for source code in current version.

Stokes Wave

Reference3D breaking Stokes wave (multilayer solver)
Code22-Stokes-Wave
Notes

Transcritical Flow

ReferenceTranscritical flow over a bump
Code23-Transcritical-Flow
Notes

Shock Instability

ReferenceA Shallow Water Analogue for the Standing Accretion Shock Instability
Code24-Shock-Instability
Notes

Python interface

Basic usage

ReferencePython interface
Code25-Python-Interface
Notes

Poisson equation

ReferencePoisson problem with Python
Code26-Python-Poisson
Notes

Built-in solvers

Basic component solvers:

It is upon these that the Navier-Stokes equation can be assembled in:

HeaderDescription
navier-stokes/stream.hSolves a 2D incompressible, constant density, constant viscosity Navier-Stokes equation formulated in the vorticity $\omega$. This is and advection-diffusion equation solved with a flux-based advection scheme in advection.h. Given its form, the stream function $\psi$ is solver through the poisson.h solver.
navier-stokes/centered.h
navier-stokes/perfs.hNot a solver by itself, it supports other headers under the Navier-Stokes family to follow performance during solution.

Other equations:

Headers files

FileUsage
common.h
distance.h
embed.hAllow the creation of general shape boundary conditions inside the domain.
fractions.h
lambda2.hDetection of vortex using the criteria by Jeong1995a [21]
run.hA generic time loop which executes until termination (to be avoided!).
tracer.hProvides an event to integrate the advection of tracer elements.
utils.h
view.h
FileUsage
grid/cartesian.h
grid/multigrid.h
grid/octree.h
grid/bitree.h

Data types

  • scalar
  • vector
  • face
  • msgstats convergence statistics of (multigrid?) solver.

Functions

FunctionDefinitionUses
origincommon.hSet the origin of cartesian system.
init_gridgrid/ (overloaded)Level of refinement (size) of initial grid.
size
periodicSet periodic boundary conditions.
statsfutils.hRetrieve statistics of a scalar field.
output_ppmoutput.hGenerate a image and video output.
adapt_waveletgrid/tree-common.hAdaptive grid refinement routine.
runrun.h (overloaded)Generic time loop for events execution.
noiseGenerate random noise in $[-1; 1]$.
swapSwap values of two scalar arrays.
input_stldistance.hRead an STL file as an array of triplets.
bounding_boxdistance.hDetermines the bounding box of inputs (segments or triangles).
distancedistance.hDistance to coordinate.
viewdraw.hSetup of viewing (camera) parameters.
isosurfacedraw.hDisplays an isosurface of a field.
draw_vofdraw.hDisplay VOF reconstructed interfaces.
cleardraw.hRemoves previous objects.
saveview.hDumps image(s) to file.
refine_biquadradicgrid/multigrid-common.h
waveletgrid/multigrid-common.h
inverse_waveletgrid/multigrid-common.h
boundary_level
unrefine
vorticityutils.hComputes the vorticity from a velocity field.
+}

Parallel computing

Currently I have not tried Basilisk in parallel (actually I did so a few years back but don't really remember the steps). Since there is no dedicated tutorial for going parallel, here are the notes I am taking for writing something in that sense:

  • Tutorial isotropic.c has notes on how to run parallel in some of its parent universities supercomputers. Probably some steps there might be recycled here.

Introductory tutorials

Basilisk basics

ReferenceTutorial
Code01-Tutorial-Basics
NotesBasilisk is a conceptual solver for investigating problems in a Cartesian domain.<br><br>Different steps of the simulations are set by event's, which use a specific syntax do indicate whether they depend on a time or iteration condition. These steps might include setup of initial conditions, storage of intermediate results or solution, grid refinement, etc.<br><br>For iterating over arrays Basilisk provides a foreach()loop extending the C-language.<br><br>A standard Makefile is provided by Basilisk for managing common workflows.<br><br>Check the tips.

Game of life

ReferenceConway’s game of life
Code02-Game-of-life
NotesA simple implementation of Conway's game of life to get used with syntax.

Brusselator

ReferenceCoupled reaction-diffusion equations
Code03-Brusselator
NotesSolves the 2D Brusselator, a theoretical autocatalytic reaction diffusion system. The set of parameters used in the study for the stable Turin points where the ones proposed by Pena2001a [19]. Interesting material for preparing courses extending this to other oscillating systems can be found here.

Ginzburg-Landau

ReferenceThe complex Ginzburg-Landau equation
Code04-Ginzburg-Landau
NotesSolves the complex Ginzburg-Landau equation describing the nonlinear evolution of disturbances near the transition from a stable to unstable state of a system. Additional materials are provided here. It would be a good project to include the term $\alpha$ in the equation and the Laplacian term that goes with it.

Distance field

ReferenceDistance field computation from a 3D model
Code05-Distance-Field
NotesThis can be seen as a particular case of pre-/post-processing. It can prove useful when initializing domains with scanned surfaces in STL or other compatible format. Additional steps must be taken for compilation with rendering (modifications to Makefile). Iteration over dimensions can be done with foreach_dimension().

Wavelet transform

ReferenceWavelet transforms and filtering
Code06-Wavelet-Transform
NotesProvides a tutorial on wavelet transform and associated filters. It is presented as the basis to understand mesh adaptation in Basilisk. Recommended reading of Sweldens1998a [20].

Decaying turbulence

ReferenceDecaying two-dimensional turbulence
Code07-Decaying-Turbulence
NotesFor solving Euler equation with vorticity-stream formulation one uses header file navier-stokes/stream.h. The examples makes a first usage of dimensional quantities for vorticity initialization.

Vortex street

ReferenceBénard–von Kármán Vortex Street for flow around a cylinder
Code08-Vortex-Street
NotesSolves the flow around a solid object using the navier-stokes/centered.h solver and introduced the use of passive scalars (tracer). Notice we modify L0, which among many other magic variables is defined in common.h. Illustrates the use of solid and intersection to accomplish complex domains.

Vortex shedding

ReferenceVortex shedding behind a sphere
Code09-Vortex-Shedding
NotesSolution of Navier-Stokes equations in an adaptive domain embedding an sphere. Vortex detection is made with functionalities from lambda2.h implemented following Jeong1995a [21].

Porous medium

ReferenceStokes flow through a complex 3D porous medium
Code10-Porous-Medium
Notes

Periodic box

ReferenceForced isotropic turbulence in a triply-periodic box
Code11-Periodic-Box
Notes

Two-phase flows

Pulsed atomization

ReferenceAtomisation of a pulsed liquid jet
Code12-Pulsed-Atomisation
Notes

Bubble rising

ReferenceBubble rising in a large tank
Code13-Bubble-Rising
Notes

Rotating cylinder

ReferenceFlow in a rotating bottom-driven cylindrical container
Code14-Rotating-Cylinder
Notes

Moving Tangaroa

ReferenceTwo-phase flow around RV Tangaroa
Code15-Moving-Tangaroa
Notes

Geophysical applications

Indian Tsunami

ReferenceThe 2004 Indian Ocean tsunami
Code16-Indian-Tsunami
Notes

Tohoku Tsunami

ReferenceThe 2011 Tohoku tsunami
Code17-Tohoku-Tsunami
Notes

Train of Solitons

ReferenceBreakup of a rectangular perturbation into a train of solitons
Code18-Train-of-Solitons
Notes

Lee Waves

ReferenceTidally-induced internal lee waves
Code19-Lee-Waves
Notes

Ellipsoidal Shoal

ReferencePeriodic wave propagation over an ellipsoidal shoal
Code20-Ellipsoidal-Shoal
Notes

Ellipsoidal Shoal Multilayer

ReferencePeriodic wave propagation over an ellipsoidal shoal (multilayer)
Code21-Ellipsoidal-Shoal-Multilayer
NotesCheck for source code in current version.

Stokes Wave

Reference3D breaking Stokes wave (multilayer solver)
Code22-Stokes-Wave
Notes

Transcritical Flow

ReferenceTranscritical flow over a bump
Code23-Transcritical-Flow
Notes

Shock Instability

ReferenceA Shallow Water Analogue for the Standing Accretion Shock Instability
Code24-Shock-Instability
Notes

Python interface

Basic usage

ReferencePython interface
Code25-Python-Interface
Notes

Poisson equation

ReferencePoisson problem with Python
Code26-Python-Poisson
Notes

Built-in solvers

Basic component solvers:

It is upon these that the Navier-Stokes equation can be assembled in:

HeaderDescription
navier-stokes/stream.hSolves a 2D incompressible, constant density, constant viscosity Navier-Stokes equation formulated in the vorticity $\omega$. This is and advection-diffusion equation solved with a flux-based advection scheme in advection.h. Given its form, the stream function $\psi$ is solver through the poisson.h solver.
navier-stokes/centered.h
navier-stokes/perfs.hNot a solver by itself, it supports other headers under the Navier-Stokes family to follow performance during solution.

Other equations:

Headers files

FileUsage
common.h
distance.h
embed.hAllow the creation of general shape boundary conditions inside the domain.
fractions.h
lambda2.hDetection of vortex using the criteria by Jeong1995a [21]
run.hA generic time loop which executes until termination (to be avoided!).
tracer.hProvides an event to integrate the advection of tracer elements.
utils.h
view.h
FileUsage
grid/cartesian.h
grid/multigrid.h
grid/octree.h
grid/bitree.h

Data types

  • scalar
  • vector
  • face
  • msgstats convergence statistics of (multigrid?) solver.

Functions

FunctionDefinitionUses
origincommon.hSet the origin of cartesian system.
init_gridgrid/ (overloaded)Level of refinement (size) of initial grid.
size
periodicSet periodic boundary conditions.
statsfutils.hRetrieve statistics of a scalar field.
output_ppmoutput.hGenerate a image and video output.
adapt_waveletgrid/tree-common.hAdaptive grid refinement routine.
runrun.h (overloaded)Generic time loop for events execution.
noiseGenerate random noise in $[-1; 1]$.
swapSwap values of two scalar arrays.
input_stldistance.hRead an STL file as an array of triplets.
bounding_boxdistance.hDetermines the bounding box of inputs (segments or triangles).
distancedistance.hDistance to coordinate.
viewdraw.hSetup of viewing (camera) parameters.
isosurfacedraw.hDisplays an isosurface of a field.
draw_vofdraw.hDisplay VOF reconstructed interfaces.
cleardraw.hRemoves previous objects.
saveview.hDumps image(s) to file.
refine_biquadradicgrid/multigrid-common.h
waveletgrid/multigrid-common.h
inverse_waveletgrid/multigrid-common.h
boundary_level
unrefine
vorticityutils.hComputes the vorticity from a velocity field.
diff --git a/dev/Software/Elmer/index.html b/dev/Software/Elmer/index.html index 3f3045a6e..1f9772367 100644 --- a/dev/Software/Elmer/index.html +++ b/dev/Software/Elmer/index.html @@ -1,5 +1,5 @@ -Elmer Multiphysics · WallyToolbox.jl

Elmer Multiphysics

Elmer is a multiphysics finite element method (FEM) solver mainly developed by CSC and maintained at GitHub. Several resources can be found in is official webpage and in the community portal and in the forum. There is also an YouTube channel with several tutorials and illustration of the package capabilities.

The goal of this page is not to supersede the documentation, but to make it (partially) available as a webpage where search and navigation become more intuitive. Notice that this will be fed according to my personal projects and learning, so any contribution to accelerate the process is welcome. Here you find a user-guide-style page with more details are provided below in the selected notes of Elmer documentation.


Read me first

Quick answers

  • Is Elmer the adequate tool for my projects? In this document you find a short introduction to what Elmer can do and the main executables.

  • How do I start learning Elmer? Simply put, Elmer does not require basic users to master all the fundamentals of FEM, so following the getting started guide seems a good starting point. There you learn how to install, configure, and run the software.

  • Where do I get the binaries of Elmer? If willing to run in Windows, the previous link provides the compiled binaries; there are also instructions for installing directly in Ubuntu as well as all the documentation and other test and sample cases.

  • I feel alone, where do I find other users? The forum seems to be moderately active, so you can go there to chat with other users and developers if you are not in a hurry.

Limitations and issues

  • Currently the GUI is not able to import SIF files generated manually because it stores its state in a XML file; to be able to re-run cases from the GUI users need to create the equivalent case (eventually using the free text fields) in the GUI itself before regenerating a SIF file. Notice that this will overwrite the SIF file, so keep in mind to backup the file in another directory; that is especially required for highly customized cases.

  • When exporting meshes from gmsh, consider using the extension .msh and not .msh2 as is often seen as a reminder of format 2 mesh; Elmer GUI is unable to render the mesh in this case. Notice that this has apparently no effect if running from command line.

Ongoing work

Retrieving materials

Because there are plenty of interesting materials in Elmer public directory, it is worth downloading it all and selecting what to keep later. In a Linux terminal one could run the following command. If you also want to retrieve the animations, binaries, and virtual machines, consider removing and/or modifying the -X options.

#!/usr/bin/env bash
+Elmer Multiphysics · WallyToolbox.jl

Elmer Multiphysics

Elmer is a multiphysics finite element method (FEM) solver mainly developed by CSC and maintained at GitHub. Several resources can be found in is official webpage and in the community portal and in the forum. There is also an YouTube channel with several tutorials and illustration of the package capabilities.

The goal of this page is not to supersede the documentation, but to make it (partially) available as a webpage where search and navigation become more intuitive. Notice that this will be fed according to my personal projects and learning, so any contribution to accelerate the process is welcome. Here you find a user-guide-style page with more details are provided below in the selected notes of Elmer documentation.


Read me first

Quick answers

  • Is Elmer the adequate tool for my projects? In this document you find a short introduction to what Elmer can do and the main executables.

  • How do I start learning Elmer? Simply put, Elmer does not require basic users to master all the fundamentals of FEM, so following the getting started guide seems a good starting point. There you learn how to install, configure, and run the software.

  • Where do I get the binaries of Elmer? If willing to run in Windows, the previous link provides the compiled binaries; there are also instructions for installing directly in Ubuntu as well as all the documentation and other test and sample cases.

  • I feel alone, where do I find other users? The forum seems to be moderately active, so you can go there to chat with other users and developers if you are not in a hurry.

Limitations and issues

  • Currently the GUI is not able to import SIF files generated manually because it stores its state in a XML file; to be able to re-run cases from the GUI users need to create the equivalent case (eventually using the free text fields) in the GUI itself before regenerating a SIF file. Notice that this will overwrite the SIF file, so keep in mind to backup the file in another directory; that is especially required for highly customized cases.

  • When exporting meshes from gmsh, consider using the extension .msh and not .msh2 as is often seen as a reminder of format 2 mesh; Elmer GUI is unable to render the mesh in this case. Notice that this has apparently no effect if running from command line.

Ongoing work

Retrieving materials

Because there are plenty of interesting materials in Elmer public directory, it is worth downloading it all and selecting what to keep later. In a Linux terminal one could run the following command. If you also want to retrieve the animations, binaries, and virtual machines, consider removing and/or modifying the -X options.

#!/usr/bin/env bash
 
 URL="https://www.nic.funet.fi/pub/sci/physics/elmer/"
 
@@ -157,4 +157,4 @@
     Real MATC "1.0 - tx * (2.5E-03 - 1.2E-06 * tx)"

Sourcing functions from user modules

Models can become too complex to code in a single line. Hopefully MATC provides functions which can be declared in external modules. I avoid coding MATC directly in SIF because their syntax is different and that can quickly lead to unmaintainable code. An example of such external sourcing is provided in this case. You need to remember to call source("module") in Simulation section of SIF so that the functions can be used elsewhere. The call of a function become something as

  Concentration Diffusivity = Variable Concentration
     Real MATC "diffusivity(tx)"

if independent variable is concentration or for time

  Mass Transfer Coefficient = Variable Time
     Real MATC "masstransfercoef(tx)"

You can even use multiple variables, e.g.

  Mass Transfer Coefficient = Variable Time, Temperature
-    Real MATC "masstransfercoef(tx(0), tx(1))"

PS: I managed to use a single source in SIF, although the documentation does not state that many sources are forbidden; for some reason multiple sources work when sourcing from a file.

For more complex cases such as this one it is worth writing actual MATC function modules; since there is no syntax highlighter available for MATC in VS Code, the .ini extension seems to provide better readability to the code. The problem was split in two parts: the models which take care of sourcing the conditions, so that basic users could only edit the latter and run their variant calculations with no coding skills. Notice that the symbols that are used in SIF are exported from this line instead of being set as global variables.

User-defined functions

TODO

+    Real MATC "masstransfercoef(tx(0), tx(1))"

PS: I managed to use a single source in SIF, although the documentation does not state that many sources are forbidden; for some reason multiple sources work when sourcing from a file.

For more complex cases such as this one it is worth writing actual MATC function modules; since there is no syntax highlighter available for MATC in VS Code, the .ini extension seems to provide better readability to the code. The problem was split in two parts: the models which take care of sourcing the conditions, so that basic users could only edit the latter and run their variant calculations with no coding skills. Notice that the symbols that are used in SIF are exported from this line instead of being set as global variables.

User-defined functions

TODO

diff --git a/dev/Software/Fluent/index.html b/dev/Software/Fluent/index.html index fd8e9fea1..f73011b11 100644 --- a/dev/Software/Fluent/index.html +++ b/dev/Software/Fluent/index.html @@ -1,2 +1,2 @@ -Ansys Fluent · WallyToolbox.jl

Ansys Fluent

General purpose

MacroNotes
Data_Valid_PTest if parameters required by UDF have been initialized. It is a good practice to use this macro on top of UDF's to avoid crashes.
MessageDisplays a message, to be used from host.
ErrorDisplay and throw an error message. Compiled only.

Macro parallelization

MacroNotes
PRINCIPAL_FACE_PWhen looping across faces in a thread using begin_f_loop (or another equivalent macro) in a parallel setting, we might access elements that actually belong to other nodes (because of how MPI works). This macro allows us to check the current face is part of the chunk belonging to current node, what allows us to avoid computing a quantity multiple times, leading to wrong results. Compiled only.
RP_HOSTUsed in #if directives to tell code must be evaluated only in host.
RP_NODEUsed in #if directives to tell code must be evaluated only in nodes.
PRF_GRSUM1Performs aggregation of real R values through sum SUM1. This function is called in nodes and there are other cousins for different aggregations.
node_to_host_{type}_{n}Pass n values of type from node to host. It is called after, e.g. aggregations such as PRF_GRSUM1 are used in node. There is also an equivalent host_to_node_{type}_{n}.
+Ansys Fluent · WallyToolbox.jl

Ansys Fluent

General purpose

MacroNotes
Data_Valid_PTest if parameters required by UDF have been initialized. It is a good practice to use this macro on top of UDF's to avoid crashes.
MessageDisplays a message, to be used from host.
ErrorDisplay and throw an error message. Compiled only.

Macro parallelization

MacroNotes
PRINCIPAL_FACE_PWhen looping across faces in a thread using begin_f_loop (or another equivalent macro) in a parallel setting, we might access elements that actually belong to other nodes (because of how MPI works). This macro allows us to check the current face is part of the chunk belonging to current node, what allows us to avoid computing a quantity multiple times, leading to wrong results. Compiled only.
RP_HOSTUsed in #if directives to tell code must be evaluated only in host.
RP_NODEUsed in #if directives to tell code must be evaluated only in nodes.
PRF_GRSUM1Performs aggregation of real R values through sum SUM1. This function is called in nodes and there are other cousins for different aggregations.
node_to_host_{type}_{n}Pass n values of type from node to host. It is called after, e.g. aggregations such as PRF_GRSUM1 are used in node. There is also an equivalent host_to_node_{type}_{n}.
diff --git a/dev/Software/LAMMPS/index.html b/dev/Software/LAMMPS/index.html index b4311dacc..119b40bf9 100644 --- a/dev/Software/LAMMPS/index.html +++ b/dev/Software/LAMMPS/index.html @@ -1,5 +1,5 @@ -LAMMPS · WallyToolbox.jl

LAMMPS

Large-scale Atomic/Molecular Massively Parallel Simulator or simply LAMMPS is a popular molecular dynamics software. It has probably the largest community and is highly mature, reasons why I have chosen this software to learn molecular dynamics at first. Later on I intend learning Molly.jl and maybe GROMACS or some other popular package.

In what follows I will be mostly guided by the LAMMPS tutorials by Simon Gravelle in what concerns the contents, with some touches of automation by myself. Interesting materials are also inspired in what is provided by the MEJK Course. There are also interesting links in the LAMMPS Tutorials. The official documentation of LAMMPS can be found here.

Resources

These are complementary to LAMMPS and might be required in some cases, mainly for post-processing and rendering of simulation results as nice videos.

Workflow of a simulation

System initialization

Comprises all basic definitions, such as domain boundaries specification, types of atoms, potentials, etc. This step is common to most simulations and it is worth writing parts of it as shared scripts in larger projects.

The basic building blocks of a simulation include the definition of units, dimension and boundary; these are followed by a number of styles, which are responsible by defining the types of particles, how they interact between themselves, bond types, …, etc. The following snippet provides a minimal setup for a system consisting of atoms only, the simplest atom_style.

units           lj
+LAMMPS · WallyToolbox.jl

LAMMPS

Large-scale Atomic/Molecular Massively Parallel Simulator or simply LAMMPS is a popular molecular dynamics software. It has probably the largest community and is highly mature, reasons why I have chosen this software to learn molecular dynamics at first. Later on I intend learning Molly.jl and maybe GROMACS or some other popular package.

In what follows I will be mostly guided by the LAMMPS tutorials by Simon Gravelle in what concerns the contents, with some touches of automation by myself. Interesting materials are also inspired in what is provided by the MEJK Course. There are also interesting links in the LAMMPS Tutorials. The official documentation of LAMMPS can be found here.

Resources

These are complementary to LAMMPS and might be required in some cases, mainly for post-processing and rendering of simulation results as nice videos.

Workflow of a simulation

System initialization

Comprises all basic definitions, such as domain boundaries specification, types of atoms, potentials, etc. This step is common to most simulations and it is worth writing parts of it as shared scripts in larger projects.

The basic building blocks of a simulation include the definition of units, dimension and boundary; these are followed by a number of styles, which are responsible by defining the types of particles, how they interact between themselves, bond types, …, etc. The following snippet provides a minimal setup for a system consisting of atoms only, the simplest atom_style.

units           lj
 dimension       3
 boundary        p p p
 
@@ -55,4 +55,4 @@
     f
 end
 
-fig

For proper representation of results, following the VDM tutorial one can further:

  • Learn to represent atoms with proper scaling using VWD representation and after manipulation dump the state in the same directory as the trajectories file for ease of reloading; in this case it is simply a matter of File > Load Visualization State....

  • Generate animation using the included Internal Tachyon (unless you have a local Tachyon installation) library and process with FFmpeg with command ffmpeg -framerate 30 -i "results.%05d.bmp" -vf "select=not(mod(n\,3)),scale=372x360" animation.gif. For selecting every n-th frame use this approach.

+fig

For proper representation of results, following the VDM tutorial one can further:

  • Learn to represent atoms with proper scaling using VWD representation and after manipulation dump the state in the same directory as the trajectories file for ease of reloading; in this case it is simply a matter of File > Load Visualization State....

  • Generate animation using the included Internal Tachyon (unless you have a local Tachyon installation) library and process with FFmpeg with command ffmpeg -framerate 30 -i "results.%05d.bmp" -vf "select=not(mod(n\,3)),scale=372x360" animation.gif. For selecting every n-th frame use this approach.

diff --git a/dev/Software/OpenFOAM11/aachenBombSteady/index.html b/dev/Software/OpenFOAM11/aachenBombSteady/index.html index c37a2fc80..59e7ef853 100644 --- a/dev/Software/OpenFOAM11/aachenBombSteady/index.html +++ b/dev/Software/OpenFOAM11/aachenBombSteady/index.html @@ -1,5 +1,5 @@ -- · WallyToolbox.jl

Breakdown into sub-models

  • [x] Incompressible flow only for mesh and conditions check with incompressibleFluid:
- After a first run with a system length of 1 m it was decided to increase the domain to 2 m in order to ensure a better development of flow profile (at least 10 times the cross section size) and double the number of cells in transversal directions.
+- · WallyToolbox.jl

Breakdown into sub-models

  • [x] Incompressible flow only for mesh and conditions check with incompressibleFluid:
- After a first run with a system length of 1 m it was decided to increase the domain to 2 m in order to ensure a better development of flow profile (at least 10 times the cross section size) and double the number of cells in transversal directions.
 - It was confirmed that the inlet mean velocity profile respects the expected value from the imposed mass flow rate evaluated during parameters setup, but outlet is controversial. This is probably because the case should be run as turbulent or grid is too coarse.
 - Mass conservation was monitored and confirmed through field `phi`.
 - It must be emphasized that boundary layer resolution is not accurate since no grading is applied and mesh is very coarse, but since the goal is flare development far from the walls this is acceptable at this stage and will be dealt with at a later stage.
@@ -22,4 +22,4 @@
 C2              1.92;
 C3              0;
 sigmak          1;
-sigmaEps        1.3;
  • [ ] Add convergence criteria PIMPLE: No convergence criteria found.

  • [ ] Consider a possible adaptive mesh refinement at case setup (not runtime!).

Reminders

  • Because of potentialFlow initialization, a dictionary corresponding to this must be present in fvSolution as well as a solver for Phi (copy defaults for pressure). Because this solver does not have information about temperature or composition of fluid, a field rhoInlet is required in inlets.

Initial tentative setup

  • This case aims producing a steady state liquid fuel combustion model using aachenBomb case as a starting point, but does not directly tries to reproduce the results of that case. It was modified so that there is an inlet and an outlet for flame development.

  • To perform the setup we retrieve several modifications from verticalChannelSteady and verticalChannelLTS. The first because it is the only case under multicomponentFluid solver currently using a steadyState time-stepping scheme and the latter due to the use of localEuler, which is often used to produce pseudo-steady solutions when a direct steady state calculations becomes unstable (as it is the case in most combustion calculations).

  • Modify controlDict to integer steps (that is, each step is an iteration) for both time-step and write controls, and enable purgeWrite to keep case cleaner. Notice that this is also valid if using a localEuler time-stepping scheme. Change time-stepping method accordingly in fvSchemes.

  • To increase robustness of solution, it is recommended to compute a potential flow with potentialFoam as in reference case verticalChannelLTS. This requires a solver control field Phi in fvSolution and a reference rhoInlet value to be provided in inlet flow velocity. Other parameters, but specially maxCo are also copied from reference case.

  • Some dictionaries in cloudProperties require steady-state specific commands, such as adding calcFrequency to solution, resetOnStartup to solution.sourceTerms, and injection models must use massFlowRate, what is physically understandable.

  • Combustion is quite sensitive and Seulex alone does not seem able to handle it with an EDC approach. First flow was developed further during 100 steps before activating chemistry. For now using a single step infinitelyFastChemistry to try to stabilize the behavior before trying back to use the EDC model.

+sigmaEps 1.3;
  • [ ] Add convergence criteria PIMPLE: No convergence criteria found.

  • [ ] Consider a possible adaptive mesh refinement at case setup (not runtime!).

Reminders

  • Because of potentialFlow initialization, a dictionary corresponding to this must be present in fvSolution as well as a solver for Phi (copy defaults for pressure). Because this solver does not have information about temperature or composition of fluid, a field rhoInlet is required in inlets.

Initial tentative setup

  • This case aims producing a steady state liquid fuel combustion model using aachenBomb case as a starting point, but does not directly tries to reproduce the results of that case. It was modified so that there is an inlet and an outlet for flame development.

  • To perform the setup we retrieve several modifications from verticalChannelSteady and verticalChannelLTS. The first because it is the only case under multicomponentFluid solver currently using a steadyState time-stepping scheme and the latter due to the use of localEuler, which is often used to produce pseudo-steady solutions when a direct steady state calculations becomes unstable (as it is the case in most combustion calculations).

  • Modify controlDict to integer steps (that is, each step is an iteration) for both time-step and write controls, and enable purgeWrite to keep case cleaner. Notice that this is also valid if using a localEuler time-stepping scheme. Change time-stepping method accordingly in fvSchemes.

  • To increase robustness of solution, it is recommended to compute a potential flow with potentialFoam as in reference case verticalChannelLTS. This requires a solver control field Phi in fvSolution and a reference rhoInlet value to be provided in inlet flow velocity. Other parameters, but specially maxCo are also copied from reference case.

  • Some dictionaries in cloudProperties require steady-state specific commands, such as adding calcFrequency to solution, resetOnStartup to solution.sourceTerms, and injection models must use massFlowRate, what is physically understandable.

  • Combustion is quite sensitive and Seulex alone does not seem able to handle it with an EDC approach. First flow was developed further during 100 steps before activating chemistry. For now using a single step infinitelyFastChemistry to try to stabilize the behavior before trying back to use the EDC model.

diff --git a/dev/Software/OpenFOAM11/horizontalMixer/index.html b/dev/Software/OpenFOAM11/horizontalMixer/index.html index 04fd72e21..0802db1b6 100644 --- a/dev/Software/OpenFOAM11/horizontalMixer/index.html +++ b/dev/Software/OpenFOAM11/horizontalMixer/index.html @@ -1,2 +1,2 @@ -- · WallyToolbox.jl

The following numerical experiments concern the horizontalMixer sample case.

Conceptual phase

Minimal working examples:

  • 000: no models active other than patchInteraction rebound.

Case 000

  • 001: no models active other than patchInteraction standardWallInteraction.

Case 001

  • 002: no models active other than patchInteraction localInteraction.

Case 002

If there are outlets in the system, rebound model is not suitable. Because of this, all the next cases, unless stated otherwise, will use localInteraction given the better control it provides over individual patches with respect to standardWallInteraction (although it is much slower than the latter).

  • 007: compare solution for same (approximate) mass flow with using multiple particles per parcel - with respect to the single particle per parcel performed in the reference case 002. The overall cloud shape remains the same but some spatial resolution is lost. For conception studies it seems valid to use a higher number of particles per parcel.

Case 007

Using the basic patchInteraction localInteraction add these variants (notice that the option none for all these models is already covered by the reference case 002. After comparing cases 002 and 007 the following variants were modified to match 007 as a reference case given the much lower computational time (more particles per parcel).

  • 003: packingModel explicit.

Case 003

  • 004: packingModel implicit.

Case 004

  • 005: dampingModel relaxation. Particle velocities are relaxed towards the local mean over a time-scale. Notice that reference paper intended to improve MP-PIC for polydisperse sedimenting particle clouds.

Case 005

  • 006 isotropyModel stochastic. According to the reference paper collisions cause numerical particles to scatter in MP-PIC calculations, just as physical particles do in particle/fluid flows, just as the generated animation implies.

Case 006

Implicit packing so far is the only model for which particles left the system and turbulence effects and segregation becomes apparent. In fact without implicit packing the results do not even look physical, so it is probably a requirement to activate this model. Damping and isotropy models produce similar results, with a little more dispersed cloud when isotropy is active, as stated above from its reference.

Hypotheses testing cases:

  • 008: modify case 004 to test if with rebound patch interaction particles are able to quit the system. Confirmed that this patch interaction does not handle outlets.

Case 008

  • 009: modify case 004 to test if with standardWallInteraction patch interaction particles are able to quit the system. Confirmed that this patch interaction does handle outlets similarly to the localInteraction. It was not possible to confirm if inlets also allow backflow since reporting is not provided by patch.

Case 009

  • 010: check the role of gravity option over implicit packing model. Here we derive a variant of 009 because it runs faster than with localInteraction.

Case 010

  • 011: in fact the role of gravity in 010 was pretty devastating over the sedimentation rate (quite unexpected given the particle sizes that were used) so a variant of this case was manually initialized from last state and left to run for a much longer physical time (100 s) using maxCo 2.0 for faster execution. CALCULATION DIVERGED, REDO!

Physical refinement phase

ModelTakings
InjectionModelCONFIRM CONCLUSIONS WITH POLYDISTRIBUTED CLOUDS (particles per parcel)!
PatchInteractionModelThis model is key for the simulation of particles coupled to a fluid. Unless different behavior is expected in the different walls so customization of interaction is required, it is much faster to use a standardWallInteraction approach. For understanding the role of parameters e and mu over rebound one can check lines 144-168 of source code and confirm the model is the same as the one implemented in localInteraction in lines 366-391 of sources.
PackingModel
DampingModel
IsotropyModel
ParticleForceThis will be discussed in this section.

Solution with different drag models:

ModelResults
sphereDragCase 012 012
WenYuDrag (used in injectionChannel) implemented from equation (2.12) of Gidaspow1994 [77].Case 013 013
ErgunWenYuDrag (used in Goldschmidt, cyclone, and column) implemented from equation (5.11) of Gidaspow1994 [77].Case 014 014

Other drag models:

ModelDetails
PlessisMasliyahDragUsed in GoldschmidtMPPIC. Implemented from Plessis1988 [78] is adapted for flow through consolidated isotropic porous media. This is outside the scope of the current study but functionality is tested anyways from a computational point of view and to understand its behavior far from its reference application. Calculation diverged, so no results are available.
distortedSphereDragNot used in any tutorial. Implemented as per Liu1993 [14] is conceived for the simulation of the effects of drop drag and breakup on fuel sprays. This is far from our scope and is not tested.
nonSphereDragNot used in any tutorial. Implemented as per Haider1989 [79] is a drag model for non-spherical particles. Its most important parameter is phi, the ratio of the surface area of a sphere with the same volume as the particle to the actual surface area of the particle.
SchillerNaumannDragNot used in any tutorial. Implemented according the classical paper by Schiller (1935) for modeling drag over spheres.

Solution with different sizeDistribution:

  • [ ] fixedValue
  • [ ] normal
  • [ ] RosinRammler
  • [ ] tabulatedDensity

Solution with different cloud types

  • MPPICCloud
  • collidingCloud

For the PackingModelone needs to specify the ParticleStressModel among the following:

ModelDetails
HarrisCrighton
Lun

For both DampingModel and IsotropyModel one needs a TimeScaleModel

OptionDetails
equilibrium
isotropic
nonEquilibrium
+- · WallyToolbox.jl

The following numerical experiments concern the horizontalMixer sample case.

Conceptual phase

Minimal working examples:

  • 000: no models active other than patchInteraction rebound.

Case 000

  • 001: no models active other than patchInteraction standardWallInteraction.

Case 001

  • 002: no models active other than patchInteraction localInteraction.

Case 002

If there are outlets in the system, rebound model is not suitable. Because of this, all the next cases, unless stated otherwise, will use localInteraction given the better control it provides over individual patches with respect to standardWallInteraction (although it is much slower than the latter).

  • 007: compare solution for same (approximate) mass flow with using multiple particles per parcel - with respect to the single particle per parcel performed in the reference case 002. The overall cloud shape remains the same but some spatial resolution is lost. For conception studies it seems valid to use a higher number of particles per parcel.

Case 007

Using the basic patchInteraction localInteraction add these variants (notice that the option none for all these models is already covered by the reference case 002. After comparing cases 002 and 007 the following variants were modified to match 007 as a reference case given the much lower computational time (more particles per parcel).

  • 003: packingModel explicit.

Case 003

  • 004: packingModel implicit.

Case 004

  • 005: dampingModel relaxation. Particle velocities are relaxed towards the local mean over a time-scale. Notice that reference paper intended to improve MP-PIC for polydisperse sedimenting particle clouds.

Case 005

  • 006 isotropyModel stochastic. According to the reference paper collisions cause numerical particles to scatter in MP-PIC calculations, just as physical particles do in particle/fluid flows, just as the generated animation implies.

Case 006

Implicit packing so far is the only model for which particles left the system and turbulence effects and segregation becomes apparent. In fact without implicit packing the results do not even look physical, so it is probably a requirement to activate this model. Damping and isotropy models produce similar results, with a little more dispersed cloud when isotropy is active, as stated above from its reference.

Hypotheses testing cases:

  • 008: modify case 004 to test if with rebound patch interaction particles are able to quit the system. Confirmed that this patch interaction does not handle outlets.

Case 008

  • 009: modify case 004 to test if with standardWallInteraction patch interaction particles are able to quit the system. Confirmed that this patch interaction does handle outlets similarly to the localInteraction. It was not possible to confirm if inlets also allow backflow since reporting is not provided by patch.

Case 009

  • 010: check the role of gravity option over implicit packing model. Here we derive a variant of 009 because it runs faster than with localInteraction.

Case 010

  • 011: in fact the role of gravity in 010 was pretty devastating over the sedimentation rate (quite unexpected given the particle sizes that were used) so a variant of this case was manually initialized from last state and left to run for a much longer physical time (100 s) using maxCo 2.0 for faster execution. CALCULATION DIVERGED, REDO!

Physical refinement phase

ModelTakings
InjectionModelCONFIRM CONCLUSIONS WITH POLYDISTRIBUTED CLOUDS (particles per parcel)!
PatchInteractionModelThis model is key for the simulation of particles coupled to a fluid. Unless different behavior is expected in the different walls so customization of interaction is required, it is much faster to use a standardWallInteraction approach. For understanding the role of parameters e and mu over rebound one can check lines 144-168 of source code and confirm the model is the same as the one implemented in localInteraction in lines 366-391 of sources.
PackingModel
DampingModel
IsotropyModel
ParticleForceThis will be discussed in this section.

Solution with different drag models:

ModelResults
sphereDragCase 012 012
WenYuDrag (used in injectionChannel) implemented from equation (2.12) of Gidaspow1994 [77].Case 013 013
ErgunWenYuDrag (used in Goldschmidt, cyclone, and column) implemented from equation (5.11) of Gidaspow1994 [77].Case 014 014

Other drag models:

ModelDetails
PlessisMasliyahDragUsed in GoldschmidtMPPIC. Implemented from Plessis1988 [78] is adapted for flow through consolidated isotropic porous media. This is outside the scope of the current study but functionality is tested anyways from a computational point of view and to understand its behavior far from its reference application. Calculation diverged, so no results are available.
distortedSphereDragNot used in any tutorial. Implemented as per Liu1993 [14] is conceived for the simulation of the effects of drop drag and breakup on fuel sprays. This is far from our scope and is not tested.
nonSphereDragNot used in any tutorial. Implemented as per Haider1989 [79] is a drag model for non-spherical particles. Its most important parameter is phi, the ratio of the surface area of a sphere with the same volume as the particle to the actual surface area of the particle.
SchillerNaumannDragNot used in any tutorial. Implemented according the classical paper by Schiller (1935) for modeling drag over spheres.

Solution with different sizeDistribution:

  • [ ] fixedValue
  • [ ] normal
  • [ ] RosinRammler
  • [ ] tabulatedDensity

Solution with different cloud types

  • MPPICCloud
  • collidingCloud

For the PackingModelone needs to specify the ParticleStressModel among the following:

ModelDetails
HarrisCrighton
Lun

For both DampingModel and IsotropyModel one needs a TimeScaleModel

OptionDetails
equilibrium
isotropic
nonEquilibrium
diff --git a/dev/Software/OpenFOAM11/index.html b/dev/Software/OpenFOAM11/index.html index 3b51509b5..5959e73f3 100644 --- a/dev/Software/OpenFOAM11/index.html +++ b/dev/Software/OpenFOAM11/index.html @@ -1,5 +1,5 @@ -OpenFOAM 11 · WallyToolbox.jl

OpenFOAM 11

Tips and reminders

General topics

  • When converting to OpenFOAM v11 viscosityModel instead of transportModel in physicalProperties files. Currently setting transportModel Newtonian does not raise any errors.

  • When working with a 2-D extruded mesh (1-cell in thickness), the mass flow rate must be scaled by the width of the domain to keep consistency with what would be expected in 3-D.

Granular flows

  • It is a good idea to set SOI to a value higher than zero (dimensioned to match the global time-scale of the problem) so that flow is fully developed before particles arrive.

  • If it makes sense to do so, make parameter U0 in the entries of injectionModels of cloudProperties identical to the velocity specified for the corresponding path. In most cases this applies, except when modeling a particle jet that originates from another source outside of the computational domain.

Troubleshooting

  • Wedge patch '<name>' is not planar.: in some cases a warning regarding the precision of face normal vectors might be issued in axisymmetric cases. As it has been reported by Gerhard Holzinger, when generating the mesh the value of writePrecision in controlDict might be the cause of this problem. Increasing its value should be enough for solving the problem, and if you want to save disk space with unnecessary precision, it can be decreased back for problem solution. Notice that if running in parallel, renumberMesh and decomposePar must be run before falling back to the lower write precision.

Solver modules

multicomponentFluid

In OpenFOAM v11 solver module multicomponentFluid provides approaches for setting up the simulation of fluids with multiple species, including combustion.

Tutorial cases

  • DLRALTS
  • SandiaD_LTS
  • aachenBomb: global combustion kinetics of droplets released in a box.
  • counterFlowFlame2D
  • counterFlowFlame2DLTS
  • counterFlowFlame2DLTSGRITDAC
  • counterFlowFlame2D_GRI
  • counterFlowFlame2DGRITDAC
  • filter
  • lockExchange
  • membrane
  • nc7h16: zero dimensional model of homogeneous kinetics.
  • parcelInBox: evaporation of a single water particle in a closed box.
  • simplifiedSiwek: co-combustion of coal and limestone clouds in Siwek chamber.
  • smallPoolFire2D
  • smallPoolFire3D
  • verticalChannel: water droplet evaporation in a vertical channel.
  • verticalChannelLTS: same as verticalChannel but with local time-stepping.
  • verticalChannelSteady: same as verticalChannel but at steady state.

Built cases

  • aachenBombSteady: this case was created as a tentative to simulate a steady spray combustion starting from aachenBomb tutorial but after several failures it became a case of its own. The case we have today was built bottom-up, from a simple flow in a box to the level of combustion, including several intermediate steps used to understand how the different options and models interacted. For now its name will remain like this in reference to where it started, but in the future I might come up with a better one.

incompressibleDenseParticleFluid

In OpenFOAM v11 solver module incompressibleDenseParticleFluid provides approaches for setting up a transient flow interacting with particles. It handles incompressible isothermal flows with fluid-particle interactions, including cases with dense packing of particles, such as packed beds or initialization of fluidized beds for solution with other approaches.

Tutorial cases

  • Goldschmidt
  • GoldschmidtMPPIC
  • column
  • cyclone
  • injectionChannel

Boundary fields

Boundary fields in general are almost the same as any case in pure fluid simulations but transported quantities must be named by appending the name of the continuous phase specified in constant/physicalProperties as continuousPhaseName <phase>. To make it simple let's call this phase air in what follows. Notice that pressure file name remains unchanged since it is not really transported as you don't have an equation in the form of Reynolds transport theorem for it.

That said, we have things as k.air and U.air. The particularity here is that you must provide phi for all hydrodynamic solution variables (such as k.air, U.air) in outlets, what is implicit in single phase flow models. That means that an outlet for velocity should include something as

outlet
+OpenFOAM 11 · WallyToolbox.jl

OpenFOAM 11

Tips and reminders

General topics

  • When converting to OpenFOAM v11 viscosityModel instead of transportModel in physicalProperties files. Currently setting transportModel Newtonian does not raise any errors.

  • When working with a 2-D extruded mesh (1-cell in thickness), the mass flow rate must be scaled by the width of the domain to keep consistency with what would be expected in 3-D.

Granular flows

  • It is a good idea to set SOI to a value higher than zero (dimensioned to match the global time-scale of the problem) so that flow is fully developed before particles arrive.

  • If it makes sense to do so, make parameter U0 in the entries of injectionModels of cloudProperties identical to the velocity specified for the corresponding path. In most cases this applies, except when modeling a particle jet that originates from another source outside of the computational domain.

Troubleshooting

  • Wedge patch '<name>' is not planar.: in some cases a warning regarding the precision of face normal vectors might be issued in axisymmetric cases. As it has been reported by Gerhard Holzinger, when generating the mesh the value of writePrecision in controlDict might be the cause of this problem. Increasing its value should be enough for solving the problem, and if you want to save disk space with unnecessary precision, it can be decreased back for problem solution. Notice that if running in parallel, renumberMesh and decomposePar must be run before falling back to the lower write precision.

Solver modules

multicomponentFluid

In OpenFOAM v11 solver module multicomponentFluid provides approaches for setting up the simulation of fluids with multiple species, including combustion.

Tutorial cases

  • DLRALTS
  • SandiaD_LTS
  • aachenBomb: global combustion kinetics of droplets released in a box.
  • counterFlowFlame2D
  • counterFlowFlame2DLTS
  • counterFlowFlame2DLTSGRITDAC
  • counterFlowFlame2D_GRI
  • counterFlowFlame2DGRITDAC
  • filter
  • lockExchange
  • membrane
  • nc7h16: zero dimensional model of homogeneous kinetics.
  • parcelInBox: evaporation of a single water particle in a closed box.
  • simplifiedSiwek: co-combustion of coal and limestone clouds in Siwek chamber.
  • smallPoolFire2D
  • smallPoolFire3D
  • verticalChannel: water droplet evaporation in a vertical channel.
  • verticalChannelLTS: same as verticalChannel but with local time-stepping.
  • verticalChannelSteady: same as verticalChannel but at steady state.

Built cases

  • aachenBombSteady: this case was created as a tentative to simulate a steady spray combustion starting from aachenBomb tutorial but after several failures it became a case of its own. The case we have today was built bottom-up, from a simple flow in a box to the level of combustion, including several intermediate steps used to understand how the different options and models interacted. For now its name will remain like this in reference to where it started, but in the future I might come up with a better one.

incompressibleDenseParticleFluid

In OpenFOAM v11 solver module incompressibleDenseParticleFluid provides approaches for setting up a transient flow interacting with particles. It handles incompressible isothermal flows with fluid-particle interactions, including cases with dense packing of particles, such as packed beds or initialization of fluidized beds for solution with other approaches.

Tutorial cases

  • Goldschmidt
  • GoldschmidtMPPIC
  • column
  • cyclone
  • injectionChannel

Boundary fields

Boundary fields in general are almost the same as any case in pure fluid simulations but transported quantities must be named by appending the name of the continuous phase specified in constant/physicalProperties as continuousPhaseName <phase>. To make it simple let's call this phase air in what follows. Notice that pressure file name remains unchanged since it is not really transported as you don't have an equation in the form of Reynolds transport theorem for it.

That said, we have things as k.air and U.air. The particularity here is that you must provide phi for all hydrodynamic solution variables (such as k.air, U.air) in outlets, what is implicit in single phase flow models. That means that an outlet for velocity should include something as

outlet
 {
 	type            pressureInletOutletVelocity;
 	phi             phi.air;
@@ -17,4 +17,4 @@
 \dfrac{24}{\mathrm{Re}_{d}}\left(1 + \dfrac{\mathrm{Re}_{d}^{2/3}}{6}\right){} &\mathrm{Re}_{d}\le{}1000\\[12pt]
 %
 0.424{}&\text{otherwise}
-\end{cases}\]

where $\mathrm{Re}_{d}$ is expressed as

\[\mathrm{Re}_{d} = \dfrac{\rho\vert{}u+u^\prime-v|d}{\mu(\hat{T})}\quad\text{where}\quad\hat{T}=\dfrac{T+2T_{d}}{3}\]

With these expressions and making $C_{D}^\prime=C_{D}\mathrm{Re}_{d}$ we have the drag force over a particle of diameter $d$ expressed as

\[\vec{F}=\dfrac{3}{4}\dfrac{m\mu(\hat{T})C_{D}^\prime}{\rho_{d}d^2}\]

[!todo] The code implementation already provides both $\mu(\hat{T})$ and $\mathrm{Re}_{d}$ computed to the drag model. Additional inspection on how these quantities are evaluated is required. Also note that Amsden1989 [6] provides the equations formulated in the radius, not diameter, what might generate some confusion.

This formulation is also used as part of distortedSphereDrag implementation , which makes use of the same $C_{D}$ now referred to as $C_{D,sphere}$ with a modified law accounting for particle distortion in the breakup mechanism of fuel sprays, as discussed by Liu1993 [14]. The updated drag coefficient is then expressed in terms of drop distortion $y$ from TAB (Taylor Analogy Breakup) model from Reitz1987 [15].

\[C_{D} = C_{D,sphere}(1+2.632y)\]

[!info] The distortedSphereDrag model is not available for MPPIC clouds and it is also not used anywhere in the tutorials or source code. For not it does not work yet apparently.

Combustion models

Models inheriting from combustionModel base class. If you are reading this section you might also be interested in building the case and testing the combustion with OpenSmoke++ or Cantera.

TypeGroupDescription
EDCTurbulentEddy Dissipation Concept turbulent combustion model. Probably the most popular approach for simulation of gas combustion in industrial processes.
laminarLaminar
PaSRLaminar
FDSSingle-step
infinitelyFastChemistrySingle-step
diffusionSingle-step
zoneCombustionFilterEnable the reactions within the specified list of cell-zones and set to zero elsewhere.
noCombustionDummyDummy combustion model for 'no combustion'.

Cloud models

In OpenFOAM, a cloud designate the injection of a secondary phase, generally solid particles or droplets, in a primary continuous carrier phase. The dictionary cloudProperties is identified in tutorials related to the following solver modules:

  • incompressibleDenseParticleFluid
  • incompressibleFluid
  • multicomponentFluid
  • multiRegion

The default version of the dictionary provided here is not yet documented as of OpenFOAM v11 and does not contain any solver specific configurations, so the users must refer to the tutorial cases for setting up their studies. A post-processing particle tracking function associated to the dictionary is provided here (untested).

Currently OpenFOAM implements the following cloud types:

CloudDescription
CollidingCloudAdds collisions to clouds.
MomentumCloudTemplated base class for momentum cloud. Adds particle forces and dispersion, injection, patch interaction, stochastic collision, and surface film models to clouds.
ParcelCloudOutermost template for parcel clouds.
ThermoCloudTemplated base class for thermodynamic cloud. Adds heat transfer.
MPPICCloudAdds MPPIC modelling to clouds.
ReactingCloudTemplated base class for reacting cloud. Supports single phase with variable composition and phase change modeling.
ReactingMultiphaseCloudTemplated base class for multiphase reacting cloud. Supports multiphase composition, devolatilization, and surface reactions.
SprayCloudTemplated base class for spray cloud. Supports atomization and break-up models.

CollidingCloud models

Collision models

These inherit from CollisionModel.

TypeDescription
NoCollisionDummy class for the none option.
PairCollisionMaterial properties can be set in detail in sub-dictionary constantProperties. Notice that this is computationally expensive

MomentumCloud models

Dispersion models

Injection models

These inherit from InjectionModel and implement how particles are injected into a continuous medium. The following table summarizes some of the available models.

TypeDescription
coneInjectionInject particles in a number of oriented cones. Particles can be generated from a single point or over a disk. Injection can be made at constant velocity, pressure, or with a flow rate and discharge coefficient.

Patch interaction models

Stochastic collision models

Surface film models

ThermoCloud models

Heat transfer models

These inherit from HeatTransferModel. It is possible to provide a Stefan flow approximation to the models by using flag BirdCorrection in the models dictionaries.

TypeDescription
NoHeatTransferDummy class for the none option.
RanzMarshallThe Ranz-Marshall Ranz1952 [16] correlation for heat transfer. For a more recent review, see e.g. Aissa2015a [17].

MPPICCloud models

Packing models

Isotropy models

Damping models

ReactingCloud models

Phase change models

These inherit from PhaseChangeModel.

TypeDescription
NoPhaseChangeDummy class for the none option.
LiquidEvaporationLiquid evaporation model using ideal gas assumption.
LiquidEvaporationBoilLiquid evaporation model using ideal gas assumption and includes boiling model based on Zuo2000a [18].

ReactingMultiphaseCloud models

Devolatilization models

Surface reaction models

SprayCloud models

Atomization models

Breakup models

These inherit from BreakupModel for handling particle breakup.

TypeDescription
NoBreakup
PilchErdman
ReitzDiwakarSecondary breakup model adapted to high pressure fuel sprays.
ReitzKHRTSecondary breakup model which uses the Kelvin-Helmholtz instability theory to predict the stripped droplets and the Raleigh-Taylor instability as well.
SHF
ETABEnhanced TAB model for non-evaporating fuel sprays.
TAB

Composition models

These inherit from CompositionModel and consists of carrier species (via thermo package), and additional liquids and solids. They are not attached to a type of cloud and each model supports their own cloud types.

TypeDescriptionSupport
NoCompositionDummy class for the none option.
SingleMixtureFractionTemplated parcel multi-phase, multi-component class.ReactingMultiphaseCloud
SinglePhaseMixtureTemplated parcel single phase, multi-component class.SprayCloud, ReactingCloud
+\end{cases}\]

where $\mathrm{Re}_{d}$ is expressed as

\[\mathrm{Re}_{d} = \dfrac{\rho\vert{}u+u^\prime-v|d}{\mu(\hat{T})}\quad\text{where}\quad\hat{T}=\dfrac{T+2T_{d}}{3}\]

With these expressions and making $C_{D}^\prime=C_{D}\mathrm{Re}_{d}$ we have the drag force over a particle of diameter $d$ expressed as

\[\vec{F}=\dfrac{3}{4}\dfrac{m\mu(\hat{T})C_{D}^\prime}{\rho_{d}d^2}\]

[!todo] The code implementation already provides both $\mu(\hat{T})$ and $\mathrm{Re}_{d}$ computed to the drag model. Additional inspection on how these quantities are evaluated is required. Also note that Amsden1989 [6] provides the equations formulated in the radius, not diameter, what might generate some confusion.

This formulation is also used as part of distortedSphereDrag implementation , which makes use of the same $C_{D}$ now referred to as $C_{D,sphere}$ with a modified law accounting for particle distortion in the breakup mechanism of fuel sprays, as discussed by Liu1993 [14]. The updated drag coefficient is then expressed in terms of drop distortion $y$ from TAB (Taylor Analogy Breakup) model from Reitz1987 [15].

\[C_{D} = C_{D,sphere}(1+2.632y)\]

[!info] The distortedSphereDrag model is not available for MPPIC clouds and it is also not used anywhere in the tutorials or source code. For not it does not work yet apparently.

Combustion models

Models inheriting from combustionModel base class. If you are reading this section you might also be interested in building the case and testing the combustion with OpenSmoke++ or Cantera.

TypeGroupDescription
EDCTurbulentEddy Dissipation Concept turbulent combustion model. Probably the most popular approach for simulation of gas combustion in industrial processes.
laminarLaminar
PaSRLaminar
FDSSingle-step
infinitelyFastChemistrySingle-step
diffusionSingle-step
zoneCombustionFilterEnable the reactions within the specified list of cell-zones and set to zero elsewhere.
noCombustionDummyDummy combustion model for 'no combustion'.

Cloud models

In OpenFOAM, a cloud designate the injection of a secondary phase, generally solid particles or droplets, in a primary continuous carrier phase. The dictionary cloudProperties is identified in tutorials related to the following solver modules:

  • incompressibleDenseParticleFluid
  • incompressibleFluid
  • multicomponentFluid
  • multiRegion

The default version of the dictionary provided here is not yet documented as of OpenFOAM v11 and does not contain any solver specific configurations, so the users must refer to the tutorial cases for setting up their studies. A post-processing particle tracking function associated to the dictionary is provided here (untested).

Currently OpenFOAM implements the following cloud types:

CloudDescription
CollidingCloudAdds collisions to clouds.
MomentumCloudTemplated base class for momentum cloud. Adds particle forces and dispersion, injection, patch interaction, stochastic collision, and surface film models to clouds.
ParcelCloudOutermost template for parcel clouds.
ThermoCloudTemplated base class for thermodynamic cloud. Adds heat transfer.
MPPICCloudAdds MPPIC modelling to clouds.
ReactingCloudTemplated base class for reacting cloud. Supports single phase with variable composition and phase change modeling.
ReactingMultiphaseCloudTemplated base class for multiphase reacting cloud. Supports multiphase composition, devolatilization, and surface reactions.
SprayCloudTemplated base class for spray cloud. Supports atomization and break-up models.

CollidingCloud models

Collision models

These inherit from CollisionModel.

TypeDescription
NoCollisionDummy class for the none option.
PairCollisionMaterial properties can be set in detail in sub-dictionary constantProperties. Notice that this is computationally expensive

MomentumCloud models

Dispersion models

Injection models

These inherit from InjectionModel and implement how particles are injected into a continuous medium. The following table summarizes some of the available models.

TypeDescription
coneInjectionInject particles in a number of oriented cones. Particles can be generated from a single point or over a disk. Injection can be made at constant velocity, pressure, or with a flow rate and discharge coefficient.

Patch interaction models

Stochastic collision models

Surface film models

ThermoCloud models

Heat transfer models

These inherit from HeatTransferModel. It is possible to provide a Stefan flow approximation to the models by using flag BirdCorrection in the models dictionaries.

TypeDescription
NoHeatTransferDummy class for the none option.
RanzMarshallThe Ranz-Marshall Ranz1952 [16] correlation for heat transfer. For a more recent review, see e.g. Aissa2015a [17].

MPPICCloud models

Packing models

Isotropy models

Damping models

ReactingCloud models

Phase change models

These inherit from PhaseChangeModel.

TypeDescription
NoPhaseChangeDummy class for the none option.
LiquidEvaporationLiquid evaporation model using ideal gas assumption.
LiquidEvaporationBoilLiquid evaporation model using ideal gas assumption and includes boiling model based on Zuo2000a [18].

ReactingMultiphaseCloud models

Devolatilization models

Surface reaction models

SprayCloud models

Atomization models

Breakup models

These inherit from BreakupModel for handling particle breakup.

TypeDescription
NoBreakup
PilchErdman
ReitzDiwakarSecondary breakup model adapted to high pressure fuel sprays.
ReitzKHRTSecondary breakup model which uses the Kelvin-Helmholtz instability theory to predict the stripped droplets and the Raleigh-Taylor instability as well.
SHF
ETABEnhanced TAB model for non-evaporating fuel sprays.
TAB

Composition models

These inherit from CompositionModel and consists of carrier species (via thermo package), and additional liquids and solids. They are not attached to a type of cloud and each model supports their own cloud types.

TypeDescriptionSupport
NoCompositionDummy class for the none option.
SingleMixtureFractionTemplated parcel multi-phase, multi-component class.ReactingMultiphaseCloud
SinglePhaseMixtureTemplated parcel single phase, multi-component class.SprayCloud, ReactingCloud
diff --git a/dev/WallyToolbox/Internals/Documents/index.html b/dev/WallyToolbox/Internals/Documents/index.html index a42fdddbb..1988f5769 100644 --- a/dev/WallyToolbox/Internals/Documents/index.html +++ b/dev/WallyToolbox/Internals/Documents/index.html @@ -1,2 +1,2 @@ -Documents · WallyToolbox.jl

Documents

The following functionalities are intended mostly for the own toolbox maintenance and documentation generation. This can also be imported as a replacement for some boilerplate code in other projects. The use of the functions provided in this module is essentially illustrated in docs/make.jl.

Because most of my work is done with Obsidian and the tool does not support Julia math blocks and a few other features, the functions below were conceived to help documentation conversion without modifications to standard $\LaTeX$ syntacs in Obsidian.

Finally, we wrap up a standard workflow for converting Pluto notebooks.

+Documents · WallyToolbox.jl

Documents

The following functionalities are intended mostly for the own toolbox maintenance and documentation generation. This can also be imported as a replacement for some boilerplate code in other projects. The use of the functions provided in this module is essentially illustrated in docs/make.jl.

Because most of my work is done with Obsidian and the tool does not support Julia math blocks and a few other features, the functions below were conceived to help documentation conversion without modifications to standard $\LaTeX$ syntacs in Obsidian.

Finally, we wrap up a standard workflow for converting Pluto notebooks.

diff --git a/dev/WallyToolbox/constants/index.html b/dev/WallyToolbox/constants/index.html index a6c42662e..c163d0886 100644 --- a/dev/WallyToolbox/constants/index.html +++ b/dev/WallyToolbox/constants/index.html @@ -1,2 +1,2 @@ -Constants · WallyToolbox.jl

Constants

Physical constants

Reference states

Unit conversion

+Constants · WallyToolbox.jl

Constants

Physical constants

Reference states

Unit conversion

diff --git a/dev/WallyToolbox/setup-guide/index.html b/dev/WallyToolbox/setup-guide/index.html index 321bb0633..e60504914 100644 --- a/dev/WallyToolbox/setup-guide/index.html +++ b/dev/WallyToolbox/setup-guide/index.html @@ -1,5 +1,5 @@ -Setup guide · WallyToolbox.jl

Setup guide

You probably ended up here because you are looking for a full working setup of a reasonable computing environment under Windows and that is exactly the goal of this guide: to provide an easy way to setup a portable toolbox for working with scientific computing and development under Windows. It is intended to leave minimal track on host system[1], but I am not enforcing this in its development, so take care if you are not allowed to execute some software in a given computer. Except for the fact that you will probably want Microsoft MPI to be able to perform parallel computations, everything else can be deployed without administration rights.

Warn

Notice that this guide is under development and instructions may still be incomplete; do not hesitate to reach me for more detailed instructions.

Workflow description

First of all, you have to clone WallyToolbox.jl somewhere in the target computer. You can consider using GitHub Desktop at this stage, assuming you do not have Git yet. Everything else we perform here will be done under its tools/ directory. Before anything, read all the elements provided below, simply trying to follow them in order will certainly lead to errors or confusion.

For each of the applications you will install, make sure to perform the following generic steps:

  1. Download the portable (often a compressed file) version of the application; the links to the currently supported applications are provided in the next section. It is recommended to create a sandbox/ directory under tools/ to save these files, it is ignored by version control.

  2. If it is a compressed file, inspect it to check whether the software is contained in a compressed directory or if files are straight at the container root; in the later case create a directory with the software name and version under tools/bin/ and copy the file inside before extraction; otherwise extract it to that same directory. Several packages are stored directly at zip roots and that may be messy to clean. Once finished, you can delete the copy of the compressed file to free space.

  3. Under tools/bin/ you find source.bat which is responsible by making sure all the executables may be found in your newly created environment. This file is a batch script and modifying it is the trickiest step of this guide. To open it you cannot click the file, but right-click and edit, as Windows see these as executables. First you need to find the section marked by the comment @REM NEW SYMBOLS and identify the variable associated to the software you are trying to install. Modify its value to the name of the directory you just created, that is everything you need to for most software.

Once you have finished installing everything, comment out all set PATH related to software you are not installing; this way you avoid telling the system to search for executables under non-existing directories. Other commands such as call to non-existing scripts might break your system. Also remove any REG ADD that is not being used.

Now you can launch the editor with access to the deployed software by clicking tools/code.vbs. It is recommended you create a symbolic link to this file in your desktop for each of use later, as navigating to this directory every time may be excruciating.

Minimal working environment

These are required to get your system working for the first time. After installing VS Code, enable its portable mode and install required extensions (Python and Julia support, ...). Also notice that there is a tools/vscode/ directory for keeping user configurations in a version controlled way.

From a VS Code terminal launched using code.vbs script you can run wjulia as an alias to launch the toolbox; notice that launching this way is the only meaningful way to work with the toolbox as described here since that script will set all the required environment variables.

To be able to use module WallyToolbox.Notebook or launch its exported interface for literate programming in the utilities, an user-defined value of environment variable JUPYTER_DATA_DIR must be provided to avoid conflict with system files. It must be noticed that this utility module is intentionally undocumented.

Python modules are currently second-grade citizens to WallyToolbox; they consist mostly of domain-specific code that I did not yet migrate to Julia. Nonetheless, some code will remain in Python because fields such as computer vision and overall machine learning have a much broader community and thus quality tools. Wrapping these in Julia through PythonCall is not considered as an alternative for now.

# Install `virtualenv`:
+Setup guide · WallyToolbox.jl

Setup guide

You probably ended up here because you are looking for a full working setup of a reasonable computing environment under Windows and that is exactly the goal of this guide: to provide an easy way to setup a portable toolbox for working with scientific computing and development under Windows. It is intended to leave minimal track on host system[1], but I am not enforcing this in its development, so take care if you are not allowed to execute some software in a given computer. Except for the fact that you will probably want Microsoft MPI to be able to perform parallel computations, everything else can be deployed without administration rights.

Warn

Notice that this guide is under development and instructions may still be incomplete; do not hesitate to reach me for more detailed instructions.

Workflow description

First of all, you have to clone WallyToolbox.jl somewhere in the target computer. You can consider using GitHub Desktop at this stage, assuming you do not have Git yet. Everything else we perform here will be done under its tools/ directory. Before anything, read all the elements provided below, simply trying to follow them in order will certainly lead to errors or confusion.

For each of the applications you will install, make sure to perform the following generic steps:

  1. Download the portable (often a compressed file) version of the application; the links to the currently supported applications are provided in the next section. It is recommended to create a sandbox/ directory under tools/ to save these files, it is ignored by version control.

  2. If it is a compressed file, inspect it to check whether the software is contained in a compressed directory or if files are straight at the container root; in the later case create a directory with the software name and version under tools/bin/ and copy the file inside before extraction; otherwise extract it to that same directory. Several packages are stored directly at zip roots and that may be messy to clean. Once finished, you can delete the copy of the compressed file to free space.

  3. Under tools/bin/ you find source.bat which is responsible by making sure all the executables may be found in your newly created environment. This file is a batch script and modifying it is the trickiest step of this guide. To open it you cannot click the file, but right-click and edit, as Windows see these as executables. First you need to find the section marked by the comment @REM NEW SYMBOLS and identify the variable associated to the software you are trying to install. Modify its value to the name of the directory you just created, that is everything you need to for most software.

Once you have finished installing everything, comment out all set PATH related to software you are not installing; this way you avoid telling the system to search for executables under non-existing directories. Other commands such as call to non-existing scripts might break your system. Also remove any REG ADD that is not being used.

Now you can launch the editor with access to the deployed software by clicking tools/code.vbs. It is recommended you create a symbolic link to this file in your desktop for each of use later, as navigating to this directory every time may be excruciating.

Minimal working environment

These are required to get your system working for the first time. After installing VS Code, enable its portable mode and install required extensions (Python and Julia support, ...). Also notice that there is a tools/vscode/ directory for keeping user configurations in a version controlled way.

From a VS Code terminal launched using code.vbs script you can run wjulia as an alias to launch the toolbox; notice that launching this way is the only meaningful way to work with the toolbox as described here since that script will set all the required environment variables.

To be able to use module WallyToolbox.Notebook or launch its exported interface for literate programming in the utilities, an user-defined value of environment variable JUPYTER_DATA_DIR must be provided to avoid conflict with system files. It must be noticed that this utility module is intentionally undocumented.

Python modules are currently second-grade citizens to WallyToolbox; they consist mostly of domain-specific code that I did not yet migrate to Julia. Nonetheless, some code will remain in Python because fields such as computer vision and overall machine learning have a much broader community and thus quality tools. Wrapping these in Julia through PythonCall is not considered as an alternative for now.

# Install `virtualenv`:
 pip install virtualenv
 
 # Create a virtual environment:
@@ -14,4 +14,4 @@
 # Install dependencies, if any:
 pip install -r requirements.txt

Although LaTeX is not mandatory, it is highly encouraged; otherwise, what is the point of doing any scientific computing and not publishing its results? Also for a fully operational Jupyter notebook environment you need both pandoc and inkscape.

Globally install pip install Pygments for enabling syntax highlight in LaTeX using minted; that is the most flexible highlighting method for adding code snippets to your documents.

To append to TEXMF variable one can use the MiKTeX Console graphical interface and under Settings > Directories navigate and select the local path. Alternativelly on can add to bin/<miktex-dir>/texmfs/install/miktex/config/miktexstartup.ini a line as

CommonRoots=C:/Path/To/Local/TeX/Tree

pointing to a directory implementing the user's TeX Directory Structure.

Domain-specific

Science and Engineering

Since these are mostly domain-specific, it is up to you to select from the list.

For DualSPHysics one might also want to install this FreeCAD addon and this Blender addon.

Read comments in tools/bin/source.bat for additional instructions, e.g. how to setup a Frankenstein LAMMPS installation. It requires a good familiarity with the inner workings of software and libraries; in the future I will reach LAMMPS maintainers to make this simpler and part of the official releases.

Geometry and preprocessing

Again some domain-specific software, select what you need.

Additional languages

It is highly discouraged to use Octave for any large project, but it might be interesting to use it for teaching linear algebra and the basics of numerical mathematics, so it is also supported.

Possible roadmap

  • 7-zip
  • Dyssol
  • Fiji
  • FileZilla
  • Ipopt
  • lazarus
  • MSYS2
  • MUSEN
  • Notepad
  • nteract
  • nvim
  • OpenCALPHAD
  • Orange3
  • puTTy
  • Scilab
  • strawberry-perl
  • Tabby
  • ZeroBraneStudio

Documentation build

Documentation is generated by a GitHub Actions workflow at every commit to the main branch. Because of the multiple modules in a repository structure, this documentation follows intrinsically a rolling release logic. Because the package and modules are not registered, they also do not appear in the docs/Project.toml. So it is up to the maintainers to ensure that section [deps] of docs/Project.toml points to ALL dependencies of ALL sub-packages.

For generating the documentation locally, run julia --project=docs/ and in REPL run the following command:

julia> include("docs/make.jl")
    Resolving package versions...
-   ...
  • 1Probably a few files and directories on your user home directory or under AppData.
+ ...
  • 1Probably a few files and directories on your user home directory or under AppData.
diff --git a/dev/WallyToolbox/thermochemistry/index.html b/dev/WallyToolbox/thermochemistry/index.html index 3335c0293..a8e19b4ce 100644 --- a/dev/WallyToolbox/thermochemistry/index.html +++ b/dev/WallyToolbox/thermochemistry/index.html @@ -1,5 +1,5 @@ -Thermochemistry · WallyToolbox.jl

Thermochemistry

Composition manipulation

The core functionality is provided through the Stoichiometry structure:

WallyToolbox.StoichiometryType

Compound stoichiometry for ease of data manipulation.

This type provide a simple interface for declaring chemical compounds from stable ELEMENTS and computing molecular masses. Its main use is intended for compound creation during parsing of thermodynamic databases. Below we illustrate the creation of compounds and the algebra of creation of derived compounds.

julia> al2o3 = Stoichiometry(Al=2, O=3)
+Thermochemistry · WallyToolbox.jl

Thermochemistry

Composition manipulation

The core functionality is provided through the Stoichiometry structure:

WallyToolbox.StoichiometryType

Compound stoichiometry for ease of data manipulation.

This type provide a simple interface for declaring chemical compounds from stable ELEMENTS and computing molecular masses. Its main use is intended for compound creation during parsing of thermodynamic databases. Below we illustrate the creation of compounds and the algebra of creation of derived compounds.

julia> al2o3 = Stoichiometry(Al=2, O=3)
 Stoichiometry(Pair{Symbol, <:Number}[:Al => 2, :O => 3])
 
 julia> molecularmass(al2o3)
@@ -12,14 +12,14 @@
 Stoichiometry(Pair{Symbol, <:Number}[:Al => 4, :Ca => 1, :O => 7])
 
 julia> molecularmass(c1a2)
-0.25999715360000003

Please notice that ChemicalCompound creation should be done as early as possible as Stoichiometry has no state other than the number of atoms. Its recurrent use may lead to high computational cost for the evaluation of molecular masses.

source

Once the composition of a compound has been set with Stoichiometry, the preferred method of working is through the creation of a ChemicalCompound, as follows:

WallyToolbox.ChemicalCompoundType

A chemical compound with internal values pre-computed for recurrent use.

julia> al2o3 = Stoichiometry(Al=2, O=3);
+0.25999715360000003

Please notice that ChemicalCompound creation should be done as early as possible as Stoichiometry has no state other than the number of atoms. Its recurrent use may lead to high computational cost for the evaluation of molecular masses.

source

Once the composition of a compound has been set with Stoichiometry, the preferred method of working is through the creation of a ChemicalCompound, as follows:

WallyToolbox.ChemicalCompoundType

A chemical compound with internal values pre-computed for recurrent use.

julia> al2o3 = Stoichiometry(Al=2, O=3);
 
 julia> ca1o1 = Stoichiometry(Ca=1, O=1);
 
 julia> CA = ChemicalCompound(ca1o1 + al2o3);
 
 julia> molecularmass(CA)
-0.1580370768
source

The following methods and types are available for operation over compositions and elements.

Thermodynamic properties

Materials properties are often reported according to the formalism of MaierKelley1932 [1] or Shomate1954 [2]. To be able to handle data under these formats, the following structures are provided.

Empirical fuels

In industrial practice of CFD one is often confronted with simulating empirical fuels. This is how one generally calls a fuel provided in elemental mass fractions of elements and is the most common reporting format for heavy-fuel oil. Using EmpiricalFuel one can quickly perform conversions and find out the required air flow rate for setting up a process simulation or furnace operation.

WallyToolbox.EmpiricalFuelType

Provides description of an empirical fuel based on elemental mass fractions.

  • elements::Vector{Symbol}: Chemical elements reported in fuel.

  • Y::Vector{Float64}: Array of provided masses per kilogram of fuel.

  • X::Vector{Float64}: Array of computed moles per kilogram of fuel.

Below we illustrate how to create a fuel with the approximate mass fractions of carbon and hydrogen in naphtalene; next we check its string representation.

julia> fuel = EmpiricalFuel([0.937, 0.063, 0.0]; scaler=:C=>10.0);
+0.1580370768
source

The following methods and types are available for operation over compositions and elements.

Thermodynamic properties

Materials properties are often reported according to the formalism of MaierKelley1932 [1] or Shomate1954 [2]. To be able to handle data under these formats, the following structures are provided.

Empirical fuels

In industrial practice of CFD one is often confronted with simulating empirical fuels. This is how one generally calls a fuel provided in elemental mass fractions of elements and is the most common reporting format for heavy-fuel oil. Using EmpiricalFuel one can quickly perform conversions and find out the required air flow rate for setting up a process simulation or furnace operation.

WallyToolbox.EmpiricalFuelType

Provides description of an empirical fuel based on elemental mass fractions.

Fields

  • elements::Vector{Symbol}: Chemical elements reported in fuel.

  • Y::Vector{Float64}: Array of provided masses per kilogram of fuel.

  • X::Vector{Float64}: Array of computed moles per kilogram of fuel.

Examples

Below we illustrate how to create a fuel with the approximate mass fractions of carbon and hydrogen in naphtalene; next we check its string representation.

julia> fuel = EmpiricalFuel([0.937, 0.063, 0.0]; scaler=:C=>10.0);
 
 julia> fuel.X
 3-element Vector{Float64}:
@@ -28,7 +28,7 @@
   0.0
 
 julia> String(fuel)
-"C(10.0000)H(8.0116)O(0.0000)"
source

A simple empirical fuel complete combustion can be represented by the following chemical equation:

\[1\:\mathrm{C}_x\mathrm{H}_y\mathrm{O}_z + a\:\mathrm{O}_2 + b\:\mathrm{N}_2 \rightarrow +"C(10.0000)H(8.0116)O(0.0000)"

source

A simple empirical fuel complete combustion can be represented by the following chemical equation:

\[1\:\mathrm{C}_x\mathrm{H}_y\mathrm{O}_z + a\:\mathrm{O}_2 + b\:\mathrm{N}_2 \rightarrow x\:\mathrm{CO}_2 + \dfrac{y}{2}\:\mathrm{H}_2\mathrm{O} + b\:\mathrm{N}_2\]

Because for HFO representation will generally provide sulfur and nitrogen, the oxidation of these elements may be included in the balance and the previous reaction can be modified to:

\[1\:\mathrm{C}_x\mathrm{H}_y\mathrm{O}_z\mathrm{N}_n\mathrm{S}_s + a\:\mathrm{O}_2 + b\:\mathrm{N}_2 @@ -42,10 +42,10 @@ + b\:\mathrm{N}_2\]

Each element in carbon, hydrogen, sulfur, and nitrogen is present in a single oxide (here we assume $\mathrm{N}_2$ does not participate in oxidation, what would require equilibrium calculations with an enthalpy of formation of the empirical fuel that is generally unavailable - otherwise we would use the actual molecular representation of the substance), and balancing the right-hand side of the equation is trivial; one can derive the value of $a$ that remains compatible with oxygen content in fuel as:

\[a = \dfrac{1}{2}\left(2x+2s+n+\dfrac{y}{2}-z\right)\]

With this value it is trivial to find out the required mass flow rate of oxidizer. This is implemented in oxidizer_mass_flow_rate as documented below. Notice that this function will fail if one of the required elements in the above equation is missing. The presence of nitrogen oxides and sulfur is fuel is neglected in this calculations and one must assess whether they should be considered in a certain analysis prior to using this function.

WallyToolbox.oxidizer_mass_flow_rateFunction
oxidizer_mass_flow_rate(f::EmpiricalFuel; y_o2 = 0.23)

Computes the required amount of oxidizer to perform complete combustion of 1 kg provided empirical fuel. The value of y_o2 represents the mass fraction of oxygen in oxidizer; default value is typical for air.

julia> fuel = EmpiricalFuel([0.937, 0.063, 0.0]; scaler=:C=>10);
 
 julia> oxidizer_mass_flow_rate(fuel)
-13.02691759229764
source

Heavy fuel-oils

Combustion of heavy-fuel oils (HFO) is discussed in detail by Lawn1987 [3]. Some relations that might be useful for the industrial combustion specialist are under implementation here to be integrated in larger models e.g. using DryFlowsheet, or simple calculations.

WallyToolbox.hfo_empirical_formulaFunction
hfo_empirical_formula(Y; scaler = nothing)

Wrapper for EmpiricalFuel ensuring all HFO instances are created with all typical elements, say C, H, O, N, and S, provided in this same order.

source
WallyToolbox.hfo_specific_heatFunction
hfo_specific_heat(T::Float64, S::Float64)::Float64

Heavy fuel-oil specific heat estimation in terms of relative density $S$ as provided by Cragoe (1929). Temperature in kelvin.

source

Heavy fuel-oils

Combustion of heavy-fuel oils (HFO) is discussed in detail by Lawn1987 [3]. Some relations that might be useful for the industrial combustion specialist are under implementation here to be integrated in larger models e.g. using DryFlowsheet, or simple calculations.

WallyToolbox.hfo_empirical_formulaFunction
hfo_empirical_formula(Y; scaler = nothing)

Wrapper for EmpiricalFuel ensuring all HFO instances are created with all typical elements, say C, H, O, N, and S, provided in this same order.

source
WallyToolbox.hfo_specific_heatFunction
hfo_specific_heat(T::Float64, S::Float64)::Float64

Heavy fuel-oil specific heat estimation in terms of relative density $S$ as provided by Cragoe (1929). Temperature in kelvin.

source
WallyToolbox.hfo_enthalpy_net_bs2869Function
hfo_enthalpy_net_bs2869(;
     ρ::Float64,
     x::Float64,
     y::Float64,
     s::Float64
 )::Float64

Heavy fuel-oil net energy capacity accordinto to BS2869:1983. Value is computed in [MJ/kg]. Parameters are given as:

  • ρ: HFO density at 15 °C, [kg/m³].
  • water: Mass percentage of water, [%].
  • ash: Mass percentage of ashes, [%].
  • sulphur: Mass percentage of sulphur, [%].
julia> hfo_enthalpy_net_bs2869(; ρ = 1020.0, water = 0.1, ash = 0.05, sulphur = 1.0)
-40.13509836320001
source

Discrete phase model

WallyToolbox.fit_rosinrammlerFunction
fit_rosinrammler(d₀, P₀; m=3.5)

Find parameter for particle size distribution with Weibull distribution, often called after Rosin-Rammler in the field of particles - based on characteristic size and associated cumulative density function (CDF) value. Parameter d₀ is the droplet size at which Weibull CDF evaluates to probability P₀. The value of m is generally recommended for a certain technology; a common value is provided by default.

source
+40.13509836320001
source

Discrete phase model

WallyToolbox.fit_rosinrammlerFunction
fit_rosinrammler(d₀, P₀; m=3.5)

Find parameter for particle size distribution with Weibull distribution, often called after Rosin-Rammler in the field of particles - based on characteristic size and associated cumulative density function (CDF) value. Parameter d₀ is the droplet size at which Weibull CDF evaluates to probability P₀. The value of m is generally recommended for a certain technology; a common value is provided by default.

source
WallyToolbox.plot_rosinrammlerFunction

Display Rosin-Rammler distribution and optionally reference data.

source
diff --git a/dev/WallyToolbox/transport/index.html b/dev/WallyToolbox/transport/index.html index 784bda31a..466f065ed 100644 --- a/dev/WallyToolbox/transport/index.html +++ b/dev/WallyToolbox/transport/index.html @@ -1,11 +1,11 @@ -Transport · WallyToolbox.jl

Transport

Dimensionless groups

When dealing with fluid flow and reactor models, it is always useful to be able to quickly compute approximate dimensionless numbers for the studied case. In what follows we provide a brief description of some of these quantities and some context for their use whenever possible. Definitions might vary according to the author or field of application and here we follow mostly Bird2001 [4].

Although quite unusual, it seems it is time to start this list with the Knudsen number, which evaluates the particles mean free path over system characteristic dimension. Division between rarefied gas (Boltzmann) and continuum mechanics (Navier-Stokes).

Although an implementation is not yet provided here, users are encouraged to estimate its value based on some mean free path estimation for their system before following with the analysis of a transport problem. Generally speaking, if continuum mechanics hypothesis is not valid, i.e Knudsen number is too high, most of what follows cannot be applied, thus justifying why this group comes first.

Common dimensionless groups

Reynolds

Reynolds dimensionless group is named for Osborne Reynolds (1842-1912), professor of engineering at the University of Manchester. He studied the laminar-turbulent transition, turbulent heat transfer, and theory of lubrication Bird2001 [4]. In general we denote Reynolds number by $\mathrm{Re}$ and it is used to delineate flow regimes. For circular tubes it is defined as:

\[\mathrm{Re} = \frac{\rho \langle v_{z} \rangle D}{\mu}\]

where $\langle{}v_{z}\rangle$ is the average flow velocity in axial direction and $D$ is the tube diameter. For values up 2100 the flow is assumed laminar if steady state is established and density is constant. For more, see Bird2001 [4], Chapter 2.

Nusselt

The Nusselt number provides the ratio of convective to conductive heat transfer at a boundary in a fluid, defined as

\[\mathrm{Nu}=\frac{hL}{k}\]

Often in buoyancy-driven flow analysis it is correlated as $\mathrm{Nu}=a\mathrm{Ra}^b$. A Nusselt number of value one represents heat transfer by pure conduction. Increasing this number implies a laminar conductive-dominant flow and then a convective dominant turbulent flow.

Prandtl

Prandtl represents the ratio of momentum diffusivity to thermal diffusivity $\mathrm{Pr}=\frac{\nu}{\alpha}$. High $\mathrm{Pr}$ indicates that momentum transfer is more effective than heat transfer (oils), while low values (liquid metals) indicate thermal boundary layer is more important than viscous one.

Ludwig Prandtl (1875-1953) (pronounced "Prahn-t'), who taught in Hannover and Gottingen and later served as the Director of the Kaiser Wilhelm Institute for Fluid Dynamics, was one of the people who shaped the future of his field at the beginning of the twentieth century; he made contributions to turbulent flow and heat transfer, but his development of the boundary-layer equations was his crowning achievement Bird2001 [4]. The dimensionless quantity appear under two forms of interest for the analysis of reactors: its thermal and its chemical versions. In thermal version, this number compares the kinematic viscosity $\nu$ to the thermal diffusivity $\alpha$, which is replaced by species diffusivity in its chemical version, which is more often referred to as Schmidt number. Ernst Heinrich Wilhelm Schmidt (1892-1975), who taught at the universities in Gdansk, Braunschweig, and Munich (where he was the successor to Nusselt) Bird2001 [4]_. The ratio $\frac{\nu}{\alpha}$ indicates the relative ease of momentum and energy or species transport in flow systems. This dimensionless ratio in thermal form is given by

\[\mathrm{Pr} = \frac{\nu}{\alpha} = \frac{C_{p} \mu}{k}\]

If transport properties for a gas are not available, thermal Prandtl number can be estimated at low pressure and non-polar molecules mixtures with help of Eucken formula as

\[\mathrm{Pr} = \frac{C_{p}}{C_{p} + \frac{5}{4}R}\]

Péclet

Péclet Jean-Claude-Eugene Peclet (pronounced "Pay-clay" with the second syllable accented) (1793-1857) authored several books including one on heat conduction Bird2001 [4]. This number is nothing more than the multiplication of Reynolds and Prandtl or Schmidt numbers. By simplifying factors one easily determines that it represents the ratio of convective by diffusive transport (thermal or species). High $\mathrm{Pe}$ limit represents the #plug-flow behavior.

\[\mathrm{Pe}_{th} = \mathrm{Re} \mathrm{Pr}\qquad -\mathrm{Pe}_{ch} = \mathrm{Re} \mathrm{Sc}\]

Grashof

Grashof number named after Franz Grashof (1826-1893) (pronounced "Grahss-hoff). He was professor of applied mechanics in Karlsruhe and one of the founders of the Verein Deutscher Ingenieure in 1856 Bird2001 [4]. The Grashof number is the characteristic group occurring in analyses of free convection. It approximates the ratio of the buoyancy to viscous force acting on a fluid, defined as

\[\mathrm{Gr}=\frac{g\beta(T_s-T_{\infty})L^3}{\nu^2}\]

and is analogous to Reynolds number in natural convection. Increasing the value of this number above a given threshold promotes buoyancy driven flow.

Rayleigh

Rayleigh number is the product of Grashof $\mathrm{Gr}$ and Prandtl $\mathrm{Pr}$ numbers. Related to the transition from laminar to turbulent in buoyancy-driven flows. Laminar to turbulent is assumed to take place at $10^9$ Balaji2014 [5].

Mass transfer groups

Schmidt

Schmidt number is the mass diffusion equivalent of Prandtl's. Its range can be much broader than its thermal relative, Prandtl number. This is given by the effects of cross-section and molar weight determining mass diffusivity of gas species. For more, see Bird2001 [4], Chapter 9.

\[\mathrm{Sc} = \frac{\nu}{D}\]

Sherwood

Sherwood number, also called the mass transfer Nusselt number is a dimensionless number used in mass-transfer operation. It represents the ratio of the total mass transfer rate (convection + diffusion) to the rate of diffusive mass transport, and is named in honor of Thomas Kilgore Sherwood.

Multiphase-specific

Weber

Weber group is often found in applications of multiphase flows where strongly curved surfaces are present. It represents the ratio of drag forces to cohesion forces, and can be thought of as a measure of the relative importance of the fluid's inertia compared to its surface tension. As reminded by Amsden1989 [6], for $\mathrm{We}>1$, drop oscillations, distortions, and breakup must be considered, requiring other sub-models other than simple drag to describe the flow.

Groups by application

Heat transfer coefficients

WallyToolbox.htcFunction

Implements the interface for heat transfer coefficient evaluation.

Notice that although temperature is provided in this interface, it is used only for Pr calculation. Other properties might have arbitrarily complex dependencies and types, so it was chosen by design to keep their evaluation to the user before calling this.

Also, to ensure internal consistency because of Nusselt number dependency on Prandtl number, thermal conductivity is evaluated from specific heat and viscosity. It is up to the user to make sure the provided Prandtl number is compatible.

source

Property models

Medium properties often are non-constant and require description through different sorts of models for representing their dependence on solution quantities, such as temperature, pressure, composition, etc. This section is devoted to document such models.

Polynomial properties

The most commonly used representation of thermal conductivity of materials is through polynomial fits of temperature. Although this approach does not provide any physical-based representation, it is easy to use and fast to evaluate in most computational science problems. A common interface for polynomial properties is given by the following structure.

WallyToolbox.TempPolynomialHeatConductivityType

Wrapper for a polynomial temperature-dependent heat conductivity.

  • p::Polynomials.Polynomial: Heat conductivity polynomial.

The general use case of this is to create objects compatible with the function object approach employed for properties evaluation across the module.

julia> k = TempPolynomialHeatConductivity([1.5, -0.001])
+Transport · WallyToolbox.jl

Transport

Dimensionless groups

When dealing with fluid flow and reactor models, it is always useful to be able to quickly compute approximate dimensionless numbers for the studied case. In what follows we provide a brief description of some of these quantities and some context for their use whenever possible. Definitions might vary according to the author or field of application and here we follow mostly Bird2001 [4].

Although quite unusual, it seems it is time to start this list with the Knudsen number, which evaluates the particles mean free path over system characteristic dimension. Division between rarefied gas (Boltzmann) and continuum mechanics (Navier-Stokes).

Although an implementation is not yet provided here, users are encouraged to estimate its value based on some mean free path estimation for their system before following with the analysis of a transport problem. Generally speaking, if continuum mechanics hypothesis is not valid, i.e Knudsen number is too high, most of what follows cannot be applied, thus justifying why this group comes first.

Common dimensionless groups

Reynolds

Reynolds dimensionless group is named for Osborne Reynolds (1842-1912), professor of engineering at the University of Manchester. He studied the laminar-turbulent transition, turbulent heat transfer, and theory of lubrication Bird2001 [4]. In general we denote Reynolds number by $\mathrm{Re}$ and it is used to delineate flow regimes. For circular tubes it is defined as:

\[\mathrm{Re} = \frac{\rho \langle v_{z} \rangle D}{\mu}\]

where $\langle{}v_{z}\rangle$ is the average flow velocity in axial direction and $D$ is the tube diameter. For values up 2100 the flow is assumed laminar if steady state is established and density is constant. For more, see Bird2001 [4], Chapter 2.

Nusselt

The Nusselt number provides the ratio of convective to conductive heat transfer at a boundary in a fluid, defined as

\[\mathrm{Nu}=\frac{hL}{k}\]

Often in buoyancy-driven flow analysis it is correlated as $\mathrm{Nu}=a\mathrm{Ra}^b$. A Nusselt number of value one represents heat transfer by pure conduction. Increasing this number implies a laminar conductive-dominant flow and then a convective dominant turbulent flow.

Prandtl

Prandtl represents the ratio of momentum diffusivity to thermal diffusivity $\mathrm{Pr}=\frac{\nu}{\alpha}$. High $\mathrm{Pr}$ indicates that momentum transfer is more effective than heat transfer (oils), while low values (liquid metals) indicate thermal boundary layer is more important than viscous one.

Ludwig Prandtl (1875-1953) (pronounced "Prahn-t'), who taught in Hannover and Gottingen and later served as the Director of the Kaiser Wilhelm Institute for Fluid Dynamics, was one of the people who shaped the future of his field at the beginning of the twentieth century; he made contributions to turbulent flow and heat transfer, but his development of the boundary-layer equations was his crowning achievement Bird2001 [4]. The dimensionless quantity appear under two forms of interest for the analysis of reactors: its thermal and its chemical versions. In thermal version, this number compares the kinematic viscosity $\nu$ to the thermal diffusivity $\alpha$, which is replaced by species diffusivity in its chemical version, which is more often referred to as Schmidt number. Ernst Heinrich Wilhelm Schmidt (1892-1975), who taught at the universities in Gdansk, Braunschweig, and Munich (where he was the successor to Nusselt) Bird2001 [4]_. The ratio $\frac{\nu}{\alpha}$ indicates the relative ease of momentum and energy or species transport in flow systems. This dimensionless ratio in thermal form is given by

\[\mathrm{Pr} = \frac{\nu}{\alpha} = \frac{C_{p} \mu}{k}\]

If transport properties for a gas are not available, thermal Prandtl number can be estimated at low pressure and non-polar molecules mixtures with help of Eucken formula as

\[\mathrm{Pr} = \frac{C_{p}}{C_{p} + \frac{5}{4}R}\]

Péclet

Péclet Jean-Claude-Eugene Peclet (pronounced "Pay-clay" with the second syllable accented) (1793-1857) authored several books including one on heat conduction Bird2001 [4]. This number is nothing more than the multiplication of Reynolds and Prandtl or Schmidt numbers. By simplifying factors one easily determines that it represents the ratio of convective by diffusive transport (thermal or species). High $\mathrm{Pe}$ limit represents the #plug-flow behavior.

\[\mathrm{Pe}_{th} = \mathrm{Re} \mathrm{Pr}\qquad +\mathrm{Pe}_{ch} = \mathrm{Re} \mathrm{Sc}\]

Grashof

Grashof number named after Franz Grashof (1826-1893) (pronounced "Grahss-hoff). He was professor of applied mechanics in Karlsruhe and one of the founders of the Verein Deutscher Ingenieure in 1856 Bird2001 [4]. The Grashof number is the characteristic group occurring in analyses of free convection. It approximates the ratio of the buoyancy to viscous force acting on a fluid, defined as

\[\mathrm{Gr}=\frac{g\beta(T_s-T_{\infty})L^3}{\nu^2}\]

and is analogous to Reynolds number in natural convection. Increasing the value of this number above a given threshold promotes buoyancy driven flow.

Rayleigh

Rayleigh number is the product of Grashof $\mathrm{Gr}$ and Prandtl $\mathrm{Pr}$ numbers. Related to the transition from laminar to turbulent in buoyancy-driven flows. Laminar to turbulent is assumed to take place at $10^9$ Balaji2014 [5].

Mass transfer groups

Schmidt

Schmidt number is the mass diffusion equivalent of Prandtl's. Its range can be much broader than its thermal relative, Prandtl number. This is given by the effects of cross-section and molar weight determining mass diffusivity of gas species. For more, see Bird2001 [4], Chapter 9.

\[\mathrm{Sc} = \frac{\nu}{D}\]

Sherwood

Sherwood number, also called the mass transfer Nusselt number is a dimensionless number used in mass-transfer operation. It represents the ratio of the total mass transfer rate (convection + diffusion) to the rate of diffusive mass transport, and is named in honor of Thomas Kilgore Sherwood.

Multiphase-specific

Weber

Weber group is often found in applications of multiphase flows where strongly curved surfaces are present. It represents the ratio of drag forces to cohesion forces, and can be thought of as a measure of the relative importance of the fluid's inertia compared to its surface tension. As reminded by Amsden1989 [6], for $\mathrm{We}>1$, drop oscillations, distortions, and breakup must be considered, requiring other sub-models other than simple drag to describe the flow.

Groups by application

Heat transfer coefficients

WallyToolbox.htcFunction

Implements the interface for heat transfer coefficient evaluation.

Notice that although temperature is provided in this interface, it is used only for Pr calculation. Other properties might have arbitrarily complex dependencies and types, so it was chosen by design to keep their evaluation to the user before calling this.

Also, to ensure internal consistency because of Nusselt number dependency on Prandtl number, thermal conductivity is evaluated from specific heat and viscosity. It is up to the user to make sure the provided Prandtl number is compatible.

source

Property models

Medium properties often are non-constant and require description through different sorts of models for representing their dependence on solution quantities, such as temperature, pressure, composition, etc. This section is devoted to document such models.

Polynomial properties

The most commonly used representation of thermal conductivity of materials is through polynomial fits of temperature. Although this approach does not provide any physical-based representation, it is easy to use and fast to evaluate in most computational science problems. A common interface for polynomial properties is given by the following structure.

WallyToolbox.TempPolynomialHeatConductivityType

Wrapper for a polynomial temperature-dependent heat conductivity.

Fields

  • p::Polynomials.Polynomial: Heat conductivity polynomial.

Examples

The general use case of this is to create objects compatible with the function object approach employed for properties evaluation across the module.

julia> k = TempPolynomialHeatConductivity([1.5, -0.001])
 TempPolynomialHeatConductivity(Polynomial(1.5 - 0.001*T))
 
 julia> k(1000.0)
 0.5

Although not the most efficienty way, a simple wrapper for providing constant heat conductivity remaining compatible with other funcionalities is provided:

julia> k = constheatconductivity(5.0)
-TempPolynomialHeatConductivity(Polynomial(5.0))
source

An analogous interface is also provided for viscosity temperature dependence.

Other temperature dependences

In numerical simulation one often faces the task to represent melting of solution solids that soften over a temperature range. An easy way to set this up with a volume-of-fluid (VOF) approach is to have some sort of exponential temperature-dependent viscosity. This structure encapsulates the evaluation of a viscosity function based on Fermi distribution - a sort of sigmoid function - to this end. This can be expressed as (definitions in the structure documentation):

\[\mu(T) = \mu_{\infty} + +TempPolynomialHeatConductivity(Polynomial(5.0))

source

An analogous interface is also provided for viscosity temperature dependence.

Other temperature dependences

In numerical simulation one often faces the task to represent melting of solution solids that soften over a temperature range. An easy way to set this up with a volume-of-fluid (VOF) approach is to have some sort of exponential temperature-dependent viscosity. This structure encapsulates the evaluation of a viscosity function based on Fermi distribution - a sort of sigmoid function - to this end. This can be expressed as (definitions in the structure documentation):

\[\mu(T) = \mu_{\infty} + \dfrac{\mu_{0}-\mu_{\infty}}{1+\exp\left(\dfrac{T-\Theta}{\Delta}\right)} % \quad\text{where}\quad @@ -13,7 +13,7 @@ \begin{cases} \Theta &= \dfrac{T_{e}+T_{s}}{2}\\[12pt] \Delta &= \dfrac{T_{e}-T_{s}}{\kappa} -\end{cases}\]

WallyToolbox.TempFermiLikeMeltingViscosityType

Temperature-dependent viscosity with a Fermi-like distribution dependency.

  • Θ::Float64: Center temperature of melting range [K].

  • Δ::Float64: Spread factor over melting range [K].

  • δ::Float64: Viscosity change during melting [Pa.s].

  • μ∞::Float64: High temperature viscosity [Pa.s].

  • μ₀::Float64: Low temperature viscosity [Pa.s].

  • κ::Float64: Spread coefficient used to compute Δ.

  • Ts::Float64: Melting start temperature [K].

  • Te::Float64: Melting end temperature [K].

The following example shows the evaluation of such a function below, in the middle, and above melting range.

julia> μ = TempFermiLikeMeltingViscosity(1300.0, 1700.0, 1000.0, 0.1, 10);
+\end{cases}\]

WallyToolbox.TempFermiLikeMeltingViscosityType

Temperature-dependent viscosity with a Fermi-like distribution dependency.

Fields

  • Θ::Float64: Center temperature of melting range [K].

  • Δ::Float64: Spread factor over melting range [K].

  • δ::Float64: Viscosity change during melting [Pa.s].

  • μ∞::Float64: High temperature viscosity [Pa.s].

  • μ₀::Float64: Low temperature viscosity [Pa.s].

  • κ::Float64: Spread coefficient used to compute Δ.

  • Ts::Float64: Melting start temperature [K].

  • Te::Float64: Melting end temperature [K].

Examples

The following example shows the evaluation of such a function below, in the middle, and above melting range.

julia> μ = TempFermiLikeMeltingViscosity(1300.0, 1700.0, 1000.0, 0.1, 10);
 
 julia> μ(300.0)
 999.9999999999065
@@ -22,17 +22,101 @@
 500.05
 
 julia> μ(2000.0)
-0.10372626662025815
source

Granular media

According to Hanein2017 [7] the representation of effective thermal conductivity of a solids bed in a rotary kiln can be approximated through a Maxell model based on effective medium theory. To keep track of eventually temperature-dependent properties and make use of this model, the following interfaces are provided.

WallyToolbox.GranularMediumHeatConductivityType

Provides the heat conductivity of a solids granular medium embeded in gas.

  • ks::WallyToolbox.AbstractHeatCondTemperatureDep: Heat conductivity model for solid phase.

  • kg::WallyToolbox.AbstractHeatCondTemperatureDep: Heat conductivity model for gas phase.

  • ϕ::Float64: Solids packing fraction.

This composite type relies on a gas and a solid; below we illustrate how to evaluate a granular medium effective heat conductivity using this structure.

julia> ks = constheatconductivity(5.0);
+0.10372626662025815
source

Granular media

According to Hanein2017 [7] the representation of effective thermal conductivity of a solids bed in a rotary kiln can be approximated through a Maxell model based on effective medium theory. To keep track of eventually temperature-dependent properties and make use of this model, the following interfaces are provided.

WallyToolbox.GranularMediumHeatConductivityType

Provides the heat conductivity of a solids granular medium embeded in gas.

Fields

  • ks::WallyToolbox.AbstractHeatCondTemperatureDep: Heat conductivity model for solid phase.

  • kg::WallyToolbox.AbstractHeatCondTemperatureDep: Heat conductivity model for gas phase.

  • ϕ::Float64: Solids packing fraction.

Examples

This composite type relies on a gas and a solid; below we illustrate how to evaluate a granular medium effective heat conductivity using this structure.

julia> ks = constheatconductivity(5.0);
 
 julia> kg = constheatconductivity(0.092);
 
 julia> kb = GranularMediumHeatConductivity(ks, kg, 0.36);
 
 julia> kb(300.0)
-0.23471049304677621
source
WallyToolbox.maxwell_eff_conductivityFunction
maxwell_eff_conductivity(kg, ks, ϕ)

Maxwell effective medium theory of thermal conductivity computed in terms of gas thermal conductivity kg, solids thermal conductivity ks, and solids packing fraction ϕ.

source

Air properties

For the simulation of rotary kilns, Mujumdar2006i [8] proposes some data for air properties implemented by the following interfaces. It must be noted that the thermal conductivity proposed by the authors quickly diverges above 1500 K and users must be aware of its implications.

WallyToolbox.maxwell_eff_conductivityFunction
maxwell_eff_conductivity(kg, ks, ϕ)

Maxwell effective medium theory of thermal conductivity computed in terms of gas thermal conductivity kg, solids thermal conductivity ks, and solids packing fraction ϕ.

source

Air properties

For the simulation of rotary kilns, Mujumdar2006i [8] proposes some data for air properties implemented by the following interfaces. It must be noted that the thermal conductivity proposed by the authors quickly diverges above 1500 K and users must be aware of its implications.

+1.837988950255163e-5source

General porous media

Modeling of geometrical characteristics of porous beds is required for including both their thermal effect or role over chemistry in chemical reactors. A classical approach used in several commercial and open source tools is that of Gunn1978 [9]. In what follows we develop the ideas that lead to an analogous model which is implemented by this structure.

To build the model we will assume a reactor of constant rectangular cross-section ${A}_{r}={b}{w}$ and volume ${V}_{R}={b}{w}{h}$. Its cross-section perimeter is then ${P}_{R}=2({b}+{w})$. Inside this reactor we randomly pack cubic particles $\beta$ of surface area ${A}_{\beta}=6{l}_{\beta}^2$ and volume ${V}_{\beta}={l}_{\beta}^3$ at a porosity level ${\phi}$. Thus the total volume of solids inside the reactor is ${V}_{S}=(1-{\phi}){V}_{R}$ and the approximate number of particles ${N}=\frac{{V}_{S}}{{V}_{\beta}}$. Following a similar reasoning the total surface area of particles is ${A}_{S}={N}{A}_{\beta}$. Performing all the substitutions so far one finds the following expression

\[{A}_{S}=\frac{6(1-{\phi}){b}{w}{h}}{{l}_{\beta}}\]

Since the differential $d{A}={P}d{l}$ holds for the surface of a body over its length ${l}$, one can divide the above expression by the reactor length to get the perimeter of particles in a cross-section. We can further divide by the cross-section area itself and find the perimeter density which is a more general result, and find the expression proposed by Gunn1978 [9]. This result is summarized in the next equation where the subscript of particle size was dropped for generality.

\[{P} = \frac{6(1-{\phi})}{{l}}\]

An estimator of the number of channels per unit cross-section of reactor ${N}$ can be related to the porosity through ${N}\pi{R}^2={\phi}$. Because the above perimeter is shared between the fluid volume and solids, it holds that ${N}2\pi{R}=P$. Using these expressions one can solve for the porosity channels characteristic radius ${R}$ as given below, which is also a result reported by Gunn1978 [9].

\[{R}=\frac{{\phi}{l}}{3(1-{\phi})}\]

This model is provided in PackedBedPorosityDescriptor.

WallyToolbox.PackedBedPorosityDescriptorType

Provides description of porosity parameters with stochastic behavior.

Fields

  • ϕ::Union{Float64, Vector{Float64}}: Porosity volume fraction in medium [-].

  • l::Union{Float64, Vector{Float64}}: Characteristic particle size in medium [m].

  • σϕ::Union{Nothing, Float64}: Optional standard deviation of porosity volume fraction [-].

  • σl::Union{Nothing, Float64}: Optional standard deviation of characteristic particle size [m].

  • P::Union{Float64, Vector{Float64}}: Perimeter in reactor cross-section [m].

  • D::Union{Float64, Vector{Float64}}: Characteristic diameter of porosity channels [m].

  • A::Float64: Reactor area used for scaling perimeter [m²].

Examples

PackedBedPorosityDescriptor can be used to describe the geometry of exchange section of a packed bed for a single set of arguments.

julia> PackedBedPorosityDescriptor(; ϕ = 0.65, l = 0.10, area = 1.0)
+PackedBedPorosityDescriptor(P = 21.000000 m, D = 0.123810 m)

It can also be used to describe randomly varying reactors, what is a more realistic thing to do when using this structure to simulate real world systems.

julia> PackedBedPorosityDescriptor(;
+            ϕ  = 0.65, l  = 0.10,
+            σϕ = 0.03, σl = 0.01,
+            N = 2,
+            ϕlims = (0.4, 0.8),
+            llims = (0.0, 0.3),
+            seed = 42,
+            area = 1.0
+        )
+PackedBedPorosityDescriptor(
+    P from  21.455749 m to  24.370742 m
+    D from   0.125589 m to   0.102353 m
+)
source

Rotary kiln models

In a rotary kiln as proposed by Kramers1952 [10]. Its goal is to be used as a process support tool or to integrate more complex models requiring integration of the bed profile. In its classical statement, the bed height profile $h(z)$ can be evaluated from volume of flowing material conservation through the following equations. Coordinate $z=0$ represents the discharge position where initial condition must be applied. This is given by the dam height, if any, or particle size.

\[\begin{aligned} +\dfrac{dh}{dz} &= C₁ \left[\frac{h}{R}\left(2 - \frac{h}{R}\right)\right]^{-\frac{3}{2}} - C₂\\[6pt] +C₁ &= \frac{3}{4}\dfrac{Φ\tan{γ}}{π R^3 ω}\\[6pt] +C₂ &= \dfrac{\tan{β}}{\cos{γ}} +\end{aligned}\]

The structure SymbolicLinearKramersModel implements the Kramers' ordinary differential equation for prediction of bed height profile in a rotary kiln. This equation is implemented under the formalism of ModelingToolkit.

WallyToolbox.SymbolicLinearKramersModelType

Creates a reusable linear Kramers model for rotary kiln simulation.

Fields

  • R::Symbolics.Num: Symbolic kiln internal radius

  • Φ::Symbolics.Num: Symbolic kiln feed rate

  • ω::Symbolics.Num: Symbolic kiln rotation rate

  • β::Symbolics.Num: Symbolic kiln slope

  • γ::Symbolics.Num: Symbolic solids repose angle

  • z::Symbolics.Num: Symbolic kiln axial coordinates

  • h::Symbolics.Num: Symbolic bed height profile

  • sys::ModelingToolkit.ODESystem: Problem ordinary differential equation

source

For integration of this model we implement RotaryKilnBedSolution. It provides the solved description of a rotary kiln bed geometry computed from the solution of bed height along the kiln length. The main goal of the quantities computed here is their use with heat and mass transfer models for the simulation of rotary kiln process. A simple post-processing utilitiy plotlinearkramersmodel is also provided.

WallyToolbox.RotaryKilnBedSolutionType

General geometric description of a bed from Kramers equation solution.

Fields

  • z::Vector{Float64}: Solution coordinates [m]

  • h::Vector{Float64}: Solution bed height [m]

  • θ::Vector{Float64}: View angle from kiln center [rad]

  • l::Vector{Float64}: Bed-freeboard cord length [m]

  • A::Vector{Float64}: Local bed cross section area [m²]

  • η::Vector{Float64}: Local loading based on height [-]

  • ηₘ::Float64: Mean loading of kiln [%]

  • V::Float64: Bed integral volume [m³]

  • τ::Float64: Residence time of particles

  • β::Float64: Kiln slope [rad]

Arguments

Internal elements are initialized through the following constructor:

RotaryKilnBedSolution(z, h, β, R, Φ)

Where parameters are given as:

  • z: solution coordinates over length, [m].
  • h: bed profile solution over length, [m].
  • R: kiln internal radius, [m].
  • Φ: kiln feed rate, [m³/s].

An outer constructor is also provided for managing the integration of an instance of SymbolicLinearKramersModel. This is the recommended usage that is illustrated below.

Important: inputs must be provided in international system (SI) units as a better physical practice. The only exception is the rotation rate ω provided in revolution multiples. If the discharge end is held by a dam, its height must be provided instead of the particle size, as it is used as the ODE initial condition.

  • model: a symbolic kiln model.
  • L: kiln length, [m].
  • R: kiln internal radius, [m].
  • Φ: kiln feed rate, [m³/s].
  • ω: kiln rotation rate, [rev/s].
  • β: kiln slope, [rad].
  • γ: solids repose angle, [rad].
  • d: particle size or dam height, [m].
  • solver: Solver for DifferentialEquations. Defaults to Tsit5.
  • rtol: Relative integration tolerance. Defaults to 1.0e-08.
  • atol: Absolute integration tolerance. Defaults to 1.0e-08.

Examples

Data in next example is an SI conversion of an example from ([[@Kramers1952]]).

julia> L = 13.715999999999998;  # Kiln length [m]
+
+julia> D = 1.8897599999999999;  # Kiln diameter [m]
+
+julia> β = 2.3859440303888126;  # Kiln slope [°]
+
+julia> γ = 45.0;                # Repose angle [°]
+
+julia> d = 1.0;                 # Particle/dam size [mm]
+
+julia> Φ = 10.363965852671996;  # Feed rate [m³/h]
+
+julia> ω = 3.0300000000000002;  # Rotation rate [rev/min]
+
+julia> bed = RotaryKilnBedSolution(;
+            model = SymbolicLinearKramersModel(),
+            L     = L,
+            R     = D / 2.0,
+            Φ     = Φ / 3600.0,
+            ω     = ω / 60.0,
+            β     = deg2rad(β),
+            γ     = deg2rad(γ),
+            d     = d / 1000.0
+        );
+
+julia> bed
+RotaryKilnBedSolution(τ = 13.169938 min, ηₘ = 5.913271 %)
+
+julia> bed.τ
+790.1963002204403

In the following dummy example we force a very thick analytical bed solution, filling the radius of the rotary drum. Next we confirm the internal evaluations of the model match the expected analytical values.

julia> R = 1.0e+00;
+
+julia> Φ = 1.0e-02;
+
+julia> z = collect(0.0:0.1:10.0);
+
+julia> h = R * ones(size(z));
+
+julia> Aₐ = π * R^2 / 2;
+
+julia> Vₐ = Aₐ * z[end];
+
+julia> bed = RotaryKilnBedSolution(z, h, 0, R, Φ)
+RotaryKilnBedSolution(τ = 26.179939 min, ηₘ = 50.000000 %)
+
+julia> mean(bed.θ) ≈ π
+true
+
+julia> mean(bed.l) ≈ 2R
+true
+
+julia> mean(bed.A) ≈ Aₐ
+true
+
+julia> mean(bed.η) ≈ 0.5
+true
+
+julia> bed.ηₘ ≈ 50.0
+true
+
+julia> bed.V ≈ Vₐ
+true
+
+julia> bed.τ ≈ Vₐ / Φ
+true
source
WallyToolbox.plotlinearkramersmodelFunction
plotlinearkramersmodel(
+    model::RotaryKilnBedSolution;
+    normz::Bool = false,
+    normh::Bool = false
+)::Figure

Standardized plotting of RotaryKilnBedSolution bed profile. It supports normalization of axes throught keywords normz for axial coordinate and normh for bed depth.

source

Validation of Kramers' model is provided here.

Finally a set of basic equations provided for process analysis.

WallyToolbox.sullivansηₘFunction

Sullivans approximation to kiln filling.

source
WallyToolbox.dimlessNΦFunction

Kramers (1952) dimensionless group NΦ.

source
WallyToolbox.dimlessNₖFunction

Kramers (1952) dimensionless group Nₖ.

source
WallyToolbox.perryresidenceFunction

Compute residence time from Perry's equation.

source
WallyToolbox.kramersnlapproxFunction

Nonlinear formulation of Kramers model approximate solution.

source
diff --git a/dev/WallyToolbox/unstable/index.html b/dev/WallyToolbox/unstable/index.html index de49e707d..e75f5e35c 100644 --- a/dev/WallyToolbox/unstable/index.html +++ b/dev/WallyToolbox/unstable/index.html @@ -1,5 +1,5 @@ -Unstable · WallyToolbox.jl

Unstable

DryUtilities

Danger

This module is deprecated and is progressivelly migrating to the root.

Handling of discontinuous functions

Discontinuous functions are all over in real world applications. Whether they handle discrete signals sent to controllers or represent a material property change in the solution domain of a heat transfer simulation, they are often represented by a single or a composition of Heaviside step functions. Again, because its implementation is pretty simple and optimization routines require a differentiable form of this function, DryUtilities implements heaviside and interval as proposed in this StackOverflow answer.

julia> heaviside(-1) == 0
+Unstable · WallyToolbox.jl

Unstable

DryUtilities

Danger

This module is deprecated and is progressivelly migrating to the root.

Handling of discontinuous functions

Discontinuous functions are all over in real world applications. Whether they handle discrete signals sent to controllers or represent a material property change in the solution domain of a heat transfer simulation, they are often represented by a single or a composition of Heaviside step functions. Again, because its implementation is pretty simple and optimization routines require a differentiable form of this function, DryUtilities implements heaviside and interval as proposed in this StackOverflow answer.

julia> heaviside(-1) == 0
 true
 
 julia> heaviside(-1.0) == 0.0
@@ -18,7 +18,7 @@
  0.0
  0.5
  1.0
- 1.0
DryUtilities.heavisideFunction
heaviside(t)

Provides a Heaviside function compatible with automatic differentiation. This is a requirement for conceiving, e.g., model predictive controls with discontinuous functions under ModelingToolkit.

source

By implementation inheritance that is also the case for interval:

julia> interval(0:6; a = 2, b = 5)
+ 1.0
DryUtilities.heavisideFunction
heaviside(t)

Provides a Heaviside function compatible with automatic differentiation. This is a requirement for conceiving, e.g., model predictive controls with discontinuous functions under ModelingToolkit.

source

By implementation inheritance that is also the case for interval:

julia> interval(0:6; a = 2, b = 5)
 7-element Vector{Float64}:
  0.0
  0.0
@@ -26,7 +26,7 @@
  1.0
  1.0
  0.5
- 0.0

As it is the case for representation of specific heats using NASA7/NASA9 or Shomate polynomials, functions defined by parts with an specific change point are also required in physical modeling. To this end, a stepwise function can be established with makestepwise1d. If keyword differentialble = true, then the function makes use of the above interval and remains compatible with ModelingToolkit, for instance.

julia> f = makestepwise1d(x->x, x->x^2, 1.0; differentiable = true);
+ 0.0

As it is the case for representation of specific heats using NASA7/NASA9 or Shomate polynomials, functions defined by parts with an specific change point are also required in physical modeling. To this end, a stepwise function can be established with makestepwise1d. If keyword differentialble = true, then the function makes use of the above interval and remains compatible with ModelingToolkit, for instance.

julia> f = makestepwise1d(x->x, x->x^2, 1.0; differentiable = true);
 
 julia> f(0:0.2:2.0)
 11-element Vector{Float64}:
@@ -48,7 +48,7 @@
 1-element Vector{Num}:
  x
 
-julia> f(x); # Output is too long, try by yourself.
DryUtilities.makestepwise1dFunction
makestepwise1d(lo, hi, xc)

Creates an univariate function that is composed of two parts, the first evaluated before a critical domain point xc, and the second above that value. This is often required, for instance, for the evaluation of NASA polynomials for thermodynamic properties. If differentiable, then the returned function is compatible with symbolic argument as required when using package ModelingToolkit, etc.

source

Rounding numbers and automatic axes

Danger

This section documents functions that are used in a very unstable context.

Simple rounding is not enough. Getting values that are rounded close to a power of a given number and rounded to floor or ceil is often the case. This is standardized in DryTooling through closestpowerofx:

julia> closestpowerofx(10)
+julia> f(x); # Output is too long, try by yourself.
DryUtilities.makestepwise1dFunction
makestepwise1d(lo, hi, xc)

Creates an univariate function that is composed of two parts, the first evaluated before a critical domain point xc, and the second above that value. This is often required, for instance, for the evaluation of NASA polynomials for thermodynamic properties. If differentiable, then the returned function is compatible with symbolic argument as required when using package ModelingToolkit, etc.

source

Rounding numbers and automatic axes

Danger

This section documents functions that are used in a very unstable context.

Simple rounding is not enough. Getting values that are rounded close to a power of a given number and rounded to floor or ceil is often the case. This is standardized in DryTooling through closestpowerofx:

julia> closestpowerofx(10)
 10
 
 julia> closestpowerofx(11)
@@ -71,11 +71,11 @@
     v::Number;
     x::Number = 10,
     roundf::Function = ceil
-)::Int64

Compute the integer power of x closest to v using roundf as rouding method. This might be useful for automatic setting more reasonable limits to plot axis or similar applications. Changing the rouding method through roundf is also possible.

source

Below we illustrate the usage of axesunitscaler.

NOTE: this function is not yet stable. In the future it will instead return labels using symbols like k, M, G, etc., for the units through a flag provided by the user.

julia> axesunitscaler(1)
+)::Int64

Compute the integer power of x closest to v using roundf as rouding method. This might be useful for automatic setting more reasonable limits to plot axis or similar applications. Changing the rouding method through roundf is also possible.

source

Below we illustrate the usage of axesunitscaler.

NOTE: this function is not yet stable. In the future it will instead return labels using symbols like k, M, G, etc., for the units through a flag provided by the user.

julia> axesunitscaler(1)
 ("", 1)
 
 julia> axesunitscaler(1000)
 ("[×1000]", 1000)
 
 julia> axesunitscaler(1000000)
-("[×1000000]", 1000000)
DryUtilities.axesunitscalerFunction
axesunitscaler(x::Number)::Tuple{String, Int64}

Find scaling factor for multiples of 1000 units. Together with closestpowerofx this can be used to produce better automatic plot axes limits. The returned values provide the string for modifying the axis label and the associated scaling factor.

source

Computation of changes and residuals

Danger

This section documents functions that are used in a very unstable context.

Unit conversion

+("[×1000000]", 1000000)
DryUtilities.axesunitscalerFunction
axesunitscaler(x::Number)::Tuple{String, Int64}

Find scaling factor for multiples of 1000 units. Together with closestpowerofx this can be used to produce better automatic plot axes limits. The returned values provide the string for modifying the axis label and the associated scaling factor.

source

Computation of changes and residuals

Danger

This section documents functions that are used in a very unstable context.

DryUtilities.maxabsolutechangeFunction

Maximum absolute change in a solution array.

source
DryUtilities.maxrelativechangeFunction

Maximum relative change in a solution array.

source

Unit conversion

DryUtilities.nm3_h_to_kg_hFunction

Convert [Nm³/h] to [kg/h].

source
DryUtilities.kg_h_to_nm3_hFunction

Convert [kg/h] to [Nm³/h].

source
diff --git a/dev/WallyToolbox/utilities/index.html b/dev/WallyToolbox/utilities/index.html index 562b8623c..fc5eaf420 100644 --- a/dev/WallyToolbox/utilities/index.html +++ b/dev/WallyToolbox/utilities/index.html @@ -1,5 +1,5 @@ -Utilities · WallyToolbox.jl

Utilities

Haskell-like array slicing

Those who know Haskell probably started learning it by manipulating lists with head and tail. Those functionalities are not available in Julia by default and array slicing - with an ugly syntax - is required. Since this is done often in the fields of application of WallyToolbox, both head and tail together with a body functions are available in its core. They are simple wrapers over the @view macro and work with both iterable types and arrays. The following snippet illustrates their usage.

julia> v = collect(1:4);
+Utilities · WallyToolbox.jl

Utilities

Haskell-like array slicing

Those who know Haskell probably started learning it by manipulating lists with head and tail. Those functionalities are not available in Julia by default and array slicing - with an ugly syntax - is required. Since this is done often in the fields of application of WallyToolbox, both head and tail together with a body functions are available in its core. They are simple wrapers over the @view macro and work with both iterable types and arrays. The following snippet illustrates their usage.

julia> v = collect(1:4);
 
 julia> head(v) == [1; 2; 3]
 true
@@ -15,15 +15,15 @@
 3-element view(::Vector{Int64}, 1:3) with eltype Int64:
  1
  2
- 3
source
WallyToolbox.tailFunction
tail(z)

Access view of array tail. See also head and body.

julia> tail([1, 2, 3, 4])
 3-element view(::Vector{Int64}, 2:4) with eltype Int64:
  2
  3
  4
 julia> tail(1:4)
-2:4
source
WallyToolbox.bodyFunction
body(z)

Access view of array body. See also head and tail.

julia> body([1, 2, 3, 4])
 2-element view(::Vector{Int64}, 2:3) with eltype Int64:
  2
  3
 julia> body(1:4)
-2:3
source

General utilities

Literate programming

Because WallyToolbox is intended to be run from a portable Julia environment without footprint in the local system, some particularities arise in setting a Jupyter toolset. The following tools tools provide launchers for starting local Jupyter Notebook and Jupyterlab sessions.

Note

Notice it is up to the user to define the path JUPYTER_DATA_DIR as an environment variable; default Jupyter configuration is not accepted because it might break the local system.

+2:3source

General utilities

WallyToolbox.defaultvalueFunction

Syntax sugar for handling a possibly nothing value.

source
WallyToolbox.redirect_to_filesFunction

Helper function to redirect outputs to the right files.

source
WallyToolbox.test_exhaustiveFunction

Run all assertions before throwing an error.

source

Literate programming

Because WallyToolbox is intended to be run from a portable Julia environment without footprint in the local system, some particularities arise in setting a Jupyter toolset. The following tools tools provide launchers for starting local Jupyter Notebook and Jupyterlab sessions.

Note

Notice it is up to the user to define the path JUPYTER_DATA_DIR as an environment variable; default Jupyter configuration is not accepted because it might break the local system.

WallyToolbox.Notebook.launch_notebookFunction

Launch Jupyter notebook session with WallyToolbox kernel.

source
WallyToolbox.Notebook.launch_jupyterlabFunction

Launch Jupyterlab session with WallyToolbox kernel.

source
diff --git a/dev/index.html b/dev/index.html index 30bae8c71..946f45674 100644 --- a/dev/index.html +++ b/dev/index.html @@ -1,2 +1,2 @@ -Home · WallyToolbox.jl

WallyToolbox

General tools I use everyday for everything.

About the toolbox

My name is Walter (CV) and I like writing about science and engineering topics. I have more than a decade of scientific computing experience and a broad experience with open source software, especially in the fields of fluid dynamics and gas phase kinetics; a little of it being shared here.

During the years I tried to different formats to organize my study materials and working tools, but it was only recently that I realized that coupling my knowledge base with the documentation of my personal code was the best approach in terms of maintenance. Obviously I cannot migrate all the content I have ever produced here at once, so my decision was to restructure everything and have a fresh start, feeding content as required, i.e. somebody asked me a hand in a certain subject or I need to refresh certain skill at work. In this page you will also find the supporting materials of my Medium articles and some additional content.

The core package of WallyToolbox ecosystem provides shared functionalities and types that are used in more specialized packages. It is an unpublished rolling release package composed of several sub-modules not making part of the main one and currently not following any versioning semantics. That means that new features are added and only the commits track differences. Its main goal is to provide a portable working environment that runs smoothly (at least) under Windows; anyone working in the numerical world knows the struggle with IT to have a proper Linux working system, especially in a portable device.

This unification over a central package allows for standardization of interfaces, employed quantities, and avoid boilerplate code. This page organizes everything (or tries to) to facilitate the understanding of the end-user.

Info

Over the time it is expected that many functionalities from other modules will integrate WallyToolbox as they become stable. In some cases, entire modules may become sub-modules on integrated directly under WallyToolbox, so you might need to check where to import some utilities as this package is rolling release. This is temporary and will be modified when all the old code base that is giving origing to the package is migrated here, what will take me a few years. Nonetheless, the package will probably not be published to Julia registries because of the way its governance works. WallyToolbox.jl tries to be self-contained in several aspects because of the needs of perfect integration between functionalities of several of its foreseen end applications. That is currently incompatible with using some of the state-of-the-art packages from Julia ecosystem.

Using the modules

The simplest way to use WallyToolbox is by launching Julia the root directory of WallyToolbox.jl as a project from command line, such as julia --project=.[1]; this way one has access to most Julia modules packaged within the toolbox. Notice that for a full availability one needs to consider the extra steps provided in the setup guide, which is the preferred way to deploy a working system with WallyToolbox.

Contact and citing

For quick questions and proposals, please prefer Zulip Chat. If you found and error or bug, please create an issue. That will make me more efficient at handling everything. If none of those work for you, you can contact me by mail.

Found it useful? See CITATION.bib for the relevant reference.

  • 1You might need to enter pkg mode and instantiate the project to get all dependencies installed. You can find more about this here.
+Home · WallyToolbox.jl

WallyToolbox

General tools I use everyday for everything.

About the toolbox

My name is Walter (CV) and I like writing about science and engineering topics. I have more than a decade of scientific computing experience and a broad experience with open source software, especially in the fields of fluid dynamics and gas phase kinetics; a little of it being shared here.

During the years I tried to different formats to organize my study materials and working tools, but it was only recently that I realized that coupling my knowledge base with the documentation of my personal code was the best approach in terms of maintenance. Obviously I cannot migrate all the content I have ever produced here at once, so my decision was to restructure everything and have a fresh start, feeding content as required, i.e. somebody asked me a hand in a certain subject or I need to refresh certain skill at work. In this page you will also find the supporting materials of my Medium articles and some additional content.

The core package of WallyToolbox ecosystem provides shared functionalities and types that are used in more specialized packages. It is an unpublished rolling release package composed of several sub-modules not making part of the main one and currently not following any versioning semantics. That means that new features are added and only the commits track differences. Its main goal is to provide a portable working environment that runs smoothly (at least) under Windows; anyone working in the numerical world knows the struggle with IT to have a proper Linux working system, especially in a portable device.

This unification over a central package allows for standardization of interfaces, employed quantities, and avoid boilerplate code. This page organizes everything (or tries to) to facilitate the understanding of the end-user.

Info

Over the time it is expected that many functionalities from other modules will integrate WallyToolbox as they become stable. In some cases, entire modules may become sub-modules on integrated directly under WallyToolbox, so you might need to check where to import some utilities as this package is rolling release. This is temporary and will be modified when all the old code base that is giving origing to the package is migrated here, what will take me a few years. Nonetheless, the package will probably not be published to Julia registries because of the way its governance works. WallyToolbox.jl tries to be self-contained in several aspects because of the needs of perfect integration between functionalities of several of its foreseen end applications. That is currently incompatible with using some of the state-of-the-art packages from Julia ecosystem.

Using the modules

The simplest way to use WallyToolbox is by launching Julia the root directory of WallyToolbox.jl as a project from command line, such as julia --project=.[1]; this way one has access to most Julia modules packaged within the toolbox. Notice that for a full availability one needs to consider the extra steps provided in the setup guide, which is the preferred way to deploy a working system with WallyToolbox.

Contact and citing

For quick questions and proposals, please prefer Zulip Chat. If you found and error or bug, please create an issue. That will make me more efficient at handling everything. If none of those work for you, you can contact me by mail.

Found it useful? See CITATION.bib for the relevant reference.

  • 1You might need to enter pkg mode and instantiate the project to get all dependencies installed. You can find more about this here.
diff --git a/dev/objects.inv b/dev/objects.inv index 11d8e6521..3513e5e42 100644 Binary files a/dev/objects.inv and b/dev/objects.inv differ diff --git a/dev/search_index.js b/dev/search_index.js index 1807b6a24..8c1f53245 100644 --- a/dev/search_index.js +++ b/dev/search_index.js @@ -1,3 +1,3 @@ var documenterSearchIndex = {"docs": -[{"location":"Science/Drafts/","page":"-","title":"-","text":"Courses to follow:","category":"page"},{"location":"Science/Drafts/","page":"-","title":"-","text":"\\item\\href{https://ocw.mit.edu/courses/mathematics/18-075-advanced-calculus-for-engineers-fall-2004/}{Advanced Calculus}","category":"page"},{"location":"Science/Drafts/","page":"-","title":"-","text":"\\item\\href{https://ocw.mit.edu/courses/mechanical-engineering/2-06-fluid-dynamics-spring-2013/}{Fluid Dynamics}:","category":"page"},{"location":"Science/Drafts/","page":"-","title":"-","text":"\\item\\href{https://ocw.mit.edu/courses/mechanical-engineering/2-25-advanced-fluid-mechanics-fall-2013/}{Advanced Fluid Mecanics}","category":"page"},{"location":"Science/Drafts/","page":"-","title":"-","text":"\\item\\href{https://ocw.mit.edu/courses/mechanical-engineering/2-27-turbulent-flow-and-transport-spring-2002/}{Turbulent Flow and Transport}","category":"page"},{"location":"Science/Drafts/","page":"-","title":"-","text":"\\item\\href{https://ocw.mit.edu/courses/mechanical-engineering/2-051-introduction-to-heat-transfer-fall-2015/}{Introduction to Heat Transfer}","category":"page"},{"location":"Science/Drafts/","page":"-","title":"-","text":"\\item\\href{https://ocw.mit.edu/courses/mechanical-engineering/2-51-intermediate-heat-and-mass-transfer-fall-2008/}{Intermediate Heat Transfer}","category":"page"},{"location":"Science/Drafts/","page":"-","title":"-","text":"\\item\\href{https://ocw.mit.edu/courses/mechanical-engineering/2-58j-radiative-transfer-spring-2006/}{Radiative Transfer}","category":"page"},{"location":"Science/Drafts/","page":"-","title":"-","text":"\\item\\href{https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-336j-introduction-to-numerical-simulation-sma-5211-fall-2003/}{Introduction to Simulation}","category":"page"},{"location":"Science/Drafts/","page":"-","title":"-","text":"\\item\\href{https://ocw.mit.edu/courses/aeronautics-and-astronautics/16-920j-numerical-methods-for-partial-differential-equations-sma-5212-spring-2003/}{Numerical Methods for PDE}","category":"page"},{"location":"Science/Drafts/","page":"-","title":"-","text":"\\item\\href{https://ocw.mit.edu/courses/mechanical-engineering/2-29-numerical-fluid-mechanics-spring-2015/}{Numerical Fluid Mechanics}","category":"page"},{"location":"Science/Drafts/","page":"-","title":"-","text":"\\item\\href{https://ppc.cs.aalto.fi/}{Programming Parallel Computers} (and its extension to \\href{https://github.com/parallel-rust-cpp}{Rust})","category":"page"},{"location":"Science/Drafts/","page":"-","title":"-","text":"\\item\\href{https://www.youtube.com/playlist?list=PLfF–3o8i4r82vJ0kjCVYgqKgyVM5QwN0}{Fluid Mechanics (classical)}","category":"page"},{"location":"Science/Drafts/","page":"-","title":"-","text":"\\item\\href{https://www.youtube.com/playlist?list=PL6S8U84PCLB27bdd15l1xnTSQKf3AOOoj}{Turbulent mixing conference (ICTP)}","category":"page"},{"location":"Science/Drafts/","page":"-","title":"-","text":"\\item\\href{https://www.youtube.com/playlist?list=PL80xBr8Wq0b5qXRPwyTxmGDOhO4obKOiC}{Turbulent flows}","category":"page"},{"location":"Science/Drafts/","page":"-","title":"-","text":"\\item\\href{https://www.youtube.com/playlist?list=PLp0hSY2uBeP8rhCbecD1Icahfbr6GSZ19}{Mathematical methods (ICTP)}","category":"page"},{"location":"Science/Drafts/","page":"-","title":"-","text":"\\item\\href{https://www.youtube.com/playlist?list=PLp0hSY2uBeP_7jL7uqlsxDmvimK2q6eF5}{Fluid dynamics (ICTP)}","category":"page"},{"location":"Science/Drafts/","page":"-","title":"-","text":"\\item\\href{https://www.youtube.com/channel/UCYlD7XynaJIBuYvmXlRBtnQ}{Pr. Dr. Carlos Thompson channel}","category":"page"},{"location":"Science/Drafts/","page":"-","title":"-","text":"[ ] Proof of mean value theorem (null integral implies null integrand)\n[ ] Derivation of Gauss (divergence) theorem","category":"page"},{"location":"Science/Drafts/#Thermodynamics-quick-review","page":"-","title":"Thermodynamics quick review","text":"","category":"section"},{"location":"Science/Drafts/","page":"-","title":"-","text":"When order increases entropy decreases.\nAn endothermic process is a process that absorbs heat from its surroundings; on the other hand, an exothermic process releases heat to its surroundings.","category":"page"},{"location":"Science/Drafts/#Granular-flows","page":"-","title":"Granular flows","text":"","category":"section"},{"location":"Science/Drafts/","page":"-","title":"-","text":"Parcel is a computational particle unit that may be composed of several particles which are all identical sharing a state, which include velocity, size, temperature, etc. See ORourke2010 [72] for details.\nCloud is the term OpenFOAM uses to describe particle flows. Here we will use both MPPICCloud andcollidingCloud, other types being available for reacting or multiphase solvers, such as thermoCloud.","category":"page"},{"location":"Science/Drafts/#Technological","page":"-","title":"Technological","text":"","category":"section"},{"location":"Science/Drafts/","page":"-","title":"-","text":"Siwek chamber is a reactor often used to determine the dispersion of solid fuels for combustion. Validation of simulations can be done through this and this paper. Other than the OpenFOAM case there is also this setup available on Fetch CFD.","category":"page"},{"location":"Science/Drafts/#Mathematical","page":"-","title":"Mathematical","text":"","category":"section"},{"location":"Science/Drafts/","page":"-","title":"-","text":"Hopf bifurcation  is a critical point where, as a parameter changes, a system's stability switches and a periodic solution arises. (see this).","category":"page"},{"location":"Science/Drafts/#Combustion","page":"-","title":"Combustion","text":"","category":"section"},{"location":"Science/Drafts/","page":"-","title":"-","text":"HyChem is an approach for modeling combustion of real liquid fuels by decomposing the problem into a lumped parameter model of evaporation/devolatilization and a detailed or simplified chemical kinetics approach applied to the gas phase. It is available for high-end fuels such as jet fuel and gasoline.","category":"page"},{"location":"Science/Drafts/#Condensate-fuel-combustion","page":"-","title":"Condensate fuel combustion","text":"","category":"section"},{"location":"Science/Drafts/","page":"-","title":"-","text":"This matter enters a intrinsically multiphysics domain and problem formulation needs to take into account at what level the model is required to act. For liquids, that might include spray droplets formation, evaporation, devolatilization, mass transfer to gas phase, and finally, oxidation kinetics of gas products. In the case of solids, due to high uncertainty and variability in material properties, and complex mass transfer phenomena, one must expect qualitative or semi-quantitative agreement of models and measurements. Furthermore, lumped-parameter modeling is a requirement in the field, making it difficult to be generalized to a physical level as of today.","category":"page"},{"location":"Science/Drafts/","page":"-","title":"-","text":"[[@Saario2005a]] used Ansys Fluent to simulate HFO (heavy-fuel oil) combustion using the standard mixture fraction approach coupled to a Lagrangian particle tracking for evaporating droplets and k-epsilon turbulence modeling. This is a highly standard industrial application of global combustion simulation from an energy standpoint but lacks the generality of considering a detailed chemistry of gas phase (for instance, for coupling with solid calcination reactions, if that is the case).","category":"page"},{"location":"Science/Drafts/","page":"-","title":"-","text":"[[@Garaniya2012a]] used StarCD to simulate HFO in the context of ship engines. From the same authors Garaniya2012b [73], we also have the the thermodynamic formulation of the problem.","category":"page"},{"location":"Science/Drafts/","page":"-","title":"-","text":"[[@Nowruzi2014]] successfully simulated a spray jet of HFO with OpenFOAM without accounting for chemistry and combustion. In the absence of a proper PSD (particle size-distribution) this step is required to initialize a simulation, but can hardly be integrated in a reacting flow simulation, which would become overly complex. ","category":"page"},{"location":"Science/Drafts/","page":"-","title":"-","text":"[[@Sanchez2023a]] studied the combustion of biomass with help of OpenFOAM with some semi-quantitative results within 13% from the measurements, what is already considered a very good agreement in the field.","category":"page"},{"location":"Science/Drafts/","page":"-","title":"-","text":"[ ] Continue the research here.","category":"page"},{"location":"Science/Drafts/#Combustion-of-heavy-oil-fuel","page":"-","title":"Combustion of heavy oil fuel","text":"","category":"section"},{"location":"Science/Drafts/","page":"-","title":"-","text":"[[@Lawn1987]]","category":"page"},{"location":"Notebooks/05-Random-Walk/#A-simple-random-walker","page":"A simple random walker","title":"A simple random walker","text":"","category":"section"},{"location":"Notebooks/05-Random-Walk/","page":"A simple random walker","title":"A simple random walker","text":"using CairoMakie\nusing Random\nusing SpecialFunctions\nnothing; #hide","category":"page"},{"location":"Notebooks/05-Random-Walk/","page":"A simple random walker","title":"A simple random walker","text":"# Create a random number generator with a given seed.\nconst RNG = MersenneTwister(42)\nnothing; #hide","category":"page"},{"location":"Notebooks/05-Random-Walk/","page":"A simple random walker","title":"A simple random walker","text":"function random_walker(p, n, N, K, xn, yn, A)\n for tn ∈ 1:N\n # Sample the distance to try to move.\n Δx, Δy = rand(RNG, -K:K, 2)\n\n # Compute new hypothetical position.\n xm = mod(xn + Δx, n)\n ym = mod(yn + Δy, n)\n\n # Compute distance from current point.\n z = hypot(xn - xm, yn - ym)\n\n # Take shot on current movement.\n bullet = rand(RNG)\n threshold = p(z, K)\n\n # Always move or should I use RNG?\n # if true #bullet < threshold\n if bullet < threshold\n # FIXME: last r/c is being skipped!\n # Make sure wrapping around is respected.\n xm = (1 <= xm <= n) ? xm : n+xm\n ym = (1 <= ym <= n) ? ym : n+ym\n # xm = (xm>0) ? xm : n+xm-1\n # ym = (ym>0) ? ym : n+ym-1\n\n # Update position.\n xn, yn = xm, ym\n A[xn, yn] += 1\n end\n end\nend","category":"page"},{"location":"Notebooks/05-Random-Walk/","page":"A simple random walker","title":"A simple random walker","text":"function simulation(N, M, n, p, K)\n # Allocate matrix for tracking presence history.\n A = zeros(Int64, (n, n))\n \n # Get initial position of *particle*.\n xn, yn = rand(RNG, 1:n, 2)\n # xn, yn = div(n, 2), div(n, 2)\n \n # Store initial position for display later.\n x0, y0 = xn, yn\n \n # Start sampling loop.\n for rm ∈ 1:M\n # NO: Feed particle to its initial position.\n # The initial particle is *outside* the domain!\n # A[xn+1, yn+1] += 1\n \n # Start random-walk loop.\n random_walker(p, n, N, K, xn, yn, A)\n \n # Reinitialize particle position.\n xn, yn = x0, y0\n end\n\n return A\nend","category":"page"},{"location":"Notebooks/05-Random-Walk/","page":"A simple random walker","title":"A simple random walker","text":"function workflow(p, K, n, N, M)\n A = simulation(N, M, n, p, K)\n \n with_theme() do\n n = first(size(A))\n nn = div(n, 2) + 1\n \n a1 = reshape(sum(A; dims=1), n)[nn:end-1]\n a2 = reshape(sum(A; dims=2), n)[nn:end-1]\n \n a1 /= sum(a1)\n a2 /= sum(a2)\n \n a1 /= maximum(a1)\n a2 /= maximum(a2)\n \n # This is obviously wrong!\n # x = 1:nn\n # t = N\n # D = K / 6 # HOW SHOULD I? (Meher, 2007)\n # C = 1.0\n # Constant surface concentration solution:\n # an = @. C * erfc(x/(2sqrt(D*t)))\n \n f = Figure(size = (1000, 500))\n \n ax1 = Axis(f[1, 1]; aspect = 1)\n heatmap!(ax1, A[1:end-1, 1:end-1]; colormap = :thermal)\n \n ax2 = Axis(f[1, 2]; aspect = 1)\n lines!(ax2, a1; color=:black)\n lines!(ax2, a2; color=:red)\n # lines!(ax2, an; color=:blue) \n xlims!(ax2, 0, nn)\n ylims!(ax2, 0, 1.5)\n \n f\n end\nend","category":"page"},{"location":"Notebooks/05-Random-Walk/","page":"A simple random walker","title":"A simple random walker","text":"let\n # Probility of moving a distance y, step size K.\n p(z, K) = exp(-z / K)\n \n # Characteristic maximum step.\n K = 2\n \n # Size of square domain (matrix) for random walks.\n n = 50\n \n # If N > n, then *neighbors* interact!\n # Number of random walk steps to perform.\n N = 5n\n \n # Number of repeats for sampling\n M = 1000\n\n workflow(p, K, n, N, M)\nend","category":"page"},{"location":"Notebooks/05-Random-Walk/","page":"A simple random walker","title":"A simple random walker","text":"n = 50\n\nistrue = true\n\nfor _n in 1:10\n for _ in 1:20\n x = rand(RNG, -(n-1):n)\n v = (1 <= n+x <= n) ? n+x : x\n \n if (v == 0) || (v > n)\n println(x, \" \", v)\n end\n \n if !(1 <= v <= n)\n println(\"WTH: $(v)\")\n end\n \n istrue = istrue && (1 <= v <= n)\n end\nend\n\nistrue","category":"page"},{"location":"Notebooks/05-Random-Walk/","page":"A simple random walker","title":"A simple random walker","text":"","category":"page"},{"location":"Notebooks/05-Random-Walk/","page":"A simple random walker","title":"A simple random walker","text":"","category":"page"},{"location":"References/@Guo2023d/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Guo2023d/","page":"-","title":"-","text":"title: \"Unraveling the design pattern of physics-informed neural networks: Series 04\" authors: Shuai Guo year: 2023 URL: https://towardsdatascience.com/unraveling-the-design-pattern-of-physics-informed-neural-networks-part-04-c778f4829dde –- Discussed [[@Yu2022a]].","category":"page"},{"location":"Modules/RadCalNet/#RadCalNet","page":"RadCalNet","title":"RadCalNet","text":"","category":"section"},{"location":"Modules/RadCalNet/","page":"RadCalNet","title":"RadCalNet","text":"CurrentModule = RadCalNet\nEditURL = \"https://github.com/wallytutor/WallyToolbox.jl/blob/main/docs/src/Modules/RadCalNet.md\"","category":"page"},{"location":"Modules/RadCalNet/","page":"RadCalNet","title":"RadCalNet","text":"Radiation properties machine learning model trained on RadCal.","category":"page"},{"location":"Modules/RadCalNet/","page":"RadCalNet","title":"RadCalNet","text":"In this project we use the re-implementation of RadCal Grosshandler1993 [11] to generate data and train a machine learning model for the prediction of radiative properties, i.e. emissivity and transmissivity, of common combustion flue gases.","category":"page"},{"location":"Modules/RadCalNet/","page":"RadCalNet","title":"RadCalNet","text":"This is done because for real-time calls of RADCAL might be computationally prohibitive, for instance in CFD applications. Thus, a neural network is trained with Flux based on the simulated data and this module provides an interface to call the network from external programs (Ansys Fluent, OpenFOAM, ...).","category":"page"},{"location":"Modules/RadCalNet/","page":"RadCalNet","title":"RadCalNet","text":"For details of validity ranges and sample space, please check function RadCalNet.datasampler!, where random sampling is provided. Indexing of species array is documented at RadCalNet.runradcalinput.","category":"page"},{"location":"Modules/RadCalNet/","page":"RadCalNet","title":"RadCalNet","text":"Below we display the quality of fitting of model. One must notice that fitting of emissivity still needs a few adjustments, while transmissivity is well predicted over the whole range.","category":"page"},{"location":"Modules/RadCalNet/","page":"RadCalNet","title":"RadCalNet","text":"(Image: Model testing)","category":"page"},{"location":"Modules/RadCalNet/#Usage","page":"RadCalNet","title":"Usage","text":"","category":"section"},{"location":"Modules/RadCalNet/","page":"RadCalNet","title":"RadCalNet","text":"The following snippet illustrates everything the model was designed to do.","category":"page"},{"location":"Modules/RadCalNet/","page":"RadCalNet","title":"RadCalNet","text":"julia> using RadCalNet;\n\njulia> x = Float32[1200.0; 1000.0; 2.0; 1.0; 0.1; 0.2; 0.1];\n\njulia> y = RadCalNet.model(x)\n2-element Vector{Float32}:\n 0.3231391\n 0.6287435","category":"page"},{"location":"Modules/RadCalNet/","page":"RadCalNet","title":"RadCalNet","text":"The array of inputs x is defined below, and y provides gas emissitivy and transmissivity, respectively. Notice that x must be a column vector with entries of type Float32.","category":"page"},{"location":"Modules/RadCalNet/","page":"RadCalNet","title":"RadCalNet","text":"Index Quantity Units Minimum Maximum\n1 Wall temperature K 300 2500\n2 Gas temperature K 300 2500\n3 Depth m 0.1 3.0\n4 Pressure atm 0.5 1.5\n5 CO2 mole fraction - 0.0 0.25\n6 H2O mole fraction - 0.0 0.30\n7 CO mole fraction - 0.0 0.20","category":"page"},{"location":"Modules/RadCalNet/","page":"RadCalNet","title":"RadCalNet","text":"For practical applications, one generally is interested in calling the model with a large inputs set. Belowe we illustrate how to do this with a block of data and verify the predictions are within the model tolerance on average.","category":"page"},{"location":"Modules/RadCalNet/","page":"RadCalNet","title":"RadCalNet","text":"using WallyToolbox\nusing RadCalNet\nusing Flux: mae\n\n# Loss after last training.\nLOSS = 0.0022\n\n# Random sample data randomly extracted (20 rows).\nTESTDATA = Float32[\n 1670.0 960.0 1.9 0.5 0.15 0.18 0.03 0.161774 0.820025\n 1230.0 320.0 1.9 1.0 0.04 0.08 0.18 0.20205 0.79694\n 1760.0 770.0 2.1 1.5 0.22 0.24 0.12 0.309017 0.669564\n 1770.0 960.0 1.9 0.5 0.15 0.0 0.13 0.0721235 0.919333\n 350.0 1590.0 1.9 1.0 0.06 0.29 0.12 0.357215 0.169437\n 2330.0 1820.0 1.1 1.5 0.13 0.08 0.13 0.100282 0.840802\n 1220.0 2070.0 0.2 0.5 0.11 0.17 0.09 0.0361672 0.902581\n 760.0 1380.0 1.9 1.5 0.1 0.01 0.10 0.188531 0.69798\n 1870.0 1880.0 0.2 1.5 0.14 0.28 0.17 0.0819803 0.858508\n 1910.0 2220.0 1.3 1.5 0.2 0.3 0.09 0.202592 0.63856\n 2290.0 360.0 1.8 0.5 0.0 0.23 0.07 0.0755366 0.914045\n 1330.0 640.0 1.7 1.5 0.21 0.04 0.06 0.227428 0.764363\n 1090.0 1260.0 1.9 1.5 0.17 0.18 0.18 0.381407 0.501751\n 1250.0 1590.0 0.4 1.5 0.13 0.27 0.18 0.191725 0.688272\n 990.0 2320.0 0.5 1.0 0.23 0.27 0.03 0.118285 0.633932\n 1920.0 720.0 0.3 1.0 0.05 0.03 0.18 0.0496579 0.945693\n 1250.0 310.0 0.6 1.0 0.04 0.18 0.15 0.171857 0.827273\n 1990.0 1020.0 1.3 1.0 0.09 0.11 0.15 0.140596 0.837042\n 1180.0 1830.0 0.3 0.5 0.09 0.29 0.02 0.0682171 0.851304\n 2120.0 1230.0 2.9 1.5 0.03 0.06 0.17 0.168034 0.791942\n]\n\n# Predictors and targets transposed.\nX = transpose(TESTDATA[:, 1:7])\nY = transpose(TESTDATA[:, 8:9])\n\nmae(RadCalNet.model(X), Y) <= LOSS\n\n# output\n\ntrue","category":"page"},{"location":"Modules/RadCalNet/","page":"RadCalNet","title":"RadCalNet","text":"The following test can also be seen as a tutorial for data generation, where we make the verification of data generation with provided seed. See RadCalNet.createcustomdatabase for more details. An alternative RadCalNet.datasampler! can be provided for specific problems.","category":"page"},{"location":"Modules/RadCalNet/","page":"RadCalNet","title":"RadCalNet","text":"import Random\nusing WallyToolbox\nusing RadCalNet\n\nfunction sampledatabase()\n #XXX: documentation is run from root directory!\n testname = joinpath(joinpath(@__DIR__, \"src/Modules/data/RadCalNet/sample.dat\"))\n\n # Provide a seed at start-up for *maybe* reproducible builds.\n Random.seed!(42)\n\n if !isfile(testname)\n RadCalNet.createcustomdatabase(;\n sampler! = RadCalNet.datasampler!,\n repeats = 3,\n samplesize = 3,\n cleanup = true,\n saveas = testname,\n override = true\n )\n end\n\n return RadCalNet.loaddatabase(testname)\nend\n\nA = sampledatabase()[:, end-5:end]\n\n# output\n\n9×6 Matrix{Float32}:\n 0.61 0.0006522 0.00680899 0.127997 1.4369f5 0.784483\n 0.63 0.00147905 0.0163017 0.256072 52761.9 0.493376\n 0.8 0.00181013 0.0525569 0.209679 1712.82 0.743175\n 0.69 0.000962085 0.0317917 0.0917254 3.80101f5 0.88582\n 0.69 0.00246231 0.0538234 0.418247 1442.63 0.479691\n 0.68 0.00210072 0.00470752 0.0997078 71325.7 0.79875\n 0.67 0.000770321 0.0101432 0.0812446 3.0696f5 0.815462\n 0.7 0.00154008 0.0215186 0.253691 24945.7 0.478712\n 0.53 0.00133843 0.0180676 0.234852 21784.6 0.7443","category":"page"},{"location":"Modules/RadCalNet/#To-do's","page":"RadCalNet","title":"To-do's","text":"","category":"section"},{"location":"Modules/RadCalNet/","page":"RadCalNet","title":"RadCalNet","text":"Broaden sample space over the whole RadCal composition spectrum.\nDefine data loading on GPU/CPU though a flag when recovering model.\nCreate database for testing outside of sampling points.\nImprove model reload and organize a notebook for training.","category":"page"},{"location":"Modules/RadCalNet/#Literature-discussion","page":"RadCalNet","title":"Literature discussion","text":"","category":"section"},{"location":"Modules/RadCalNet/","page":"RadCalNet","title":"RadCalNet","text":"using DelimitedFiles\nusing HDF5\nusing Plots\nusing Printf\n\nusing WallyToolbox\nimport RadCalNet\n\nfunction gorogcomposition()\n X = zeros(14)\n X[1] = 0.2\n X[2] = 0.2\n X[end] = 1.0 - sum(X[1:2])\n return X\nend\n\nfunction gorogsemissivitydata()\n pr = collect(0.0:0.015:3.2)\n Tg = [830.0, 1110.0, 1390.0]\n\n X = gorogcomposition()\n prod = Iterators.product(pr, Tg)\n samplesize = length(pr) * length(Tg)\n table = zeros(samplesize, 26)\n\n for (k, (p, T)) in enumerate(prod)\n table[k, 1:end] = RadCalNet.runradcalinput(;\n X = X,\n T = T,\n L = p / sum(X[1:2]),\n TWALL = 300.0,\n FV = 1.0e-15\n )\n end\n\n return table\nend\n\nfunction gorogsabsorptivitydata()\n pr = collect(0.0:0.01:1.6)\n Tw = [277.0, 555.0, 833.0]\n\n X = gorogcomposition()\n prod = Iterators.product(pr, Tw)\n samplesize = length(pr) * length(Tw)\n table = zeros(samplesize, 26)\n\n for (k, (p, T)) in enumerate(prod)\n table[k, 1:end] = RadCalNet.runradcalinput(;\n X = X,\n T = 1110.0,\n L = p / sum(X[1:2]),\n TWALL = T,\n FV = 1.0e-15\n )\n end\n\n return table\nend\n\nfunction plotgorogsemissitivity(εdata, εgorog)\n p = plot(dpi = 100, legend = :topleft)\n scatter!(p, εdata[1][:, 1], εdata[1][:, 2],\n markerstrokewidth = 0.0, label = \"Gorog\")\n\n for T in unique(εgorog[:, 4])\n sel = εgorog[εgorog[:, 4] .== T, :]\n pr = sum(sel[:, 8:9], dims = 2) .* sel[:, 5]\n εg = sel[:, 24]\n plot!(p, pr, εg, label = @sprintf(\"%4.0f K\", T))\n end\n\n xlims!(p, 0.0, 3.2)\n ylims!(p, 0.0, 0.7)\n xticks!(p, 0.0:0.4:3.2)\n yticks!(p, 0.0:0.1:0.7)\n\n xlabel!(p, \"Optical thickness [m-atm]\")\n ylabel!(p, \"Emissivity\")\n\n p\nend\n\nfunction plotgorogsabsorptivitydata(αdata, αgorog)\n p = plot(dpi = 100, legend = :topleft)\n scatter!(p, αdata[1][:, 1], αdata[1][:, 2],\n markerstrokewidth = 0.0, label = \"Gorog\")\n\n for T in unique(αgorog[:, 3])\n sel = αgorog[αgorog[:, 3] .== T, :]\n pr = sum(sel[:, 8:9], dims = 2) .* sel[:, 5]\n αg = 1.0 .- sel[:, end]\n plot!(p, pr, αg, label = @sprintf(\"%4.0f K\", T))\n end\n\n xlims!(p, 0.0, 1.6)\n ylims!(p, 0.0, 1.0)\n xticks!(p, 0.0:0.2:1.6)\n yticks!(p, 0.0:0.2:1.0)\n\n xlabel!(p, \"Optical thickness [m-atm]\")\n ylabel!(p, \"Absorptivity\")\n\n p\nend\n\ndatadir = @__DIR__\n\nεfig = joinpath(datadir, \"media/RadCalNet/emissivity.png\")\nαfig = joinpath(datadir, \"media/RadCalNet/absorptivity.png\")\n\nεfile = joinpath(datadir, \"data/RadCalNet/emissivity.csv\")\nαfile = joinpath(datadir, \"data/RadCalNet/absorptivity.csv\")\n\nif !isfile(εfig)\n εdata = readdlm(εfile, ',', Float64, header = true)\n εgorog = gorogsemissivitydata()\n p = plotgorogsemissitivity(εdata, εgorog)\n png(p, εfig)\nend\n\nif !isfile(αfig)\n αdata = readdlm(αfile, ',', Float64, header = true)\n αgorog = gorogsabsorptivitydata()\n p = plotgorogsabsorptivitydata(αdata, αgorog)\n png(p, αfig)\nend","category":"page"},{"location":"Modules/RadCalNet/#Verification-agains-Gorog's-paper","page":"RadCalNet","title":"Verification agains Gorog's paper","text":"","category":"section"},{"location":"Modules/RadCalNet/","page":"RadCalNet","title":"RadCalNet","text":"Below we compare computed values with those by Gorog1981a [12]. Reference paper is found here.","category":"page"},{"location":"Modules/RadCalNet/","page":"RadCalNet","title":"RadCalNet","text":"(Image: Emissivity)","category":"page"},{"location":"Modules/RadCalNet/","page":"RadCalNet","title":"RadCalNet","text":"(Image: Absorptivity)","category":"page"},{"location":"Modules/RadCalNet/","page":"RadCalNet","title":"RadCalNet","text":"At least qualitative agreement is found and orders of magnitude are right. On the other hand, using directly the model parameters from Tam2019 [13] do not produce the expected results (not displayed, work in progress in this draft). It is not clear how the data is pre- and post-processed for use with their network.","category":"page"},{"location":"Modules/RadCalNet/#All-interfaces","page":"RadCalNet","title":"All interfaces","text":"","category":"section"},{"location":"Modules/RadCalNet/","page":"RadCalNet","title":"RadCalNet","text":"Modules = [ RadCalNet ]","category":"page"},{"location":"Modules/RadCalNet/#RadCalNet.ModelData","page":"RadCalNet","title":"RadCalNet.ModelData","text":"ModelData(fpath::String; f_train::Float64 = 0.7)\n\nLoad HDF5 database stored under fpath and performs standardized workflow of data preparation for model training. The data is split under training and testing datasets with a fraction of training data of f_train.\n\nscaler::StatsBase.ZScoreTransform{Float32, Vector{Float32}}: Scaler used for data transformation.\nX_train::Matrix{Float32}: Matrix of training input data.\nY_train::Matrix{Float32}: Matrix of training output data.\nX_tests::Matrix{Float32}: Matrix of testing input data.\nY_tests::Matrix{Float32}: Matrix of testing output data.\nn_inputs::Int64: Number of model inputs.\nn_outputs::Int64: Number of model outputs.\n\n\n\n\n\n","category":"type"},{"location":"Modules/RadCalNet/#RadCalNet.ModelTrainer","page":"RadCalNet","title":"RadCalNet.ModelTrainer","text":"ModelTrainer(\n data::ModelData,\n model::Chain;\n batch::Int64=64,\n epochs::Int64=100,\n η::Float64=0.001,\n β::Tuple{Float64,Float64}=(0.9, 0.999),\n ϵ::Float64=1.0e-08\n)\n\nHolds standardized model training parameters and data.\n\nbatch::Int64: Batch size in training loop.\nepochs::Int64: Number of epochs to train each time.\ndata::RadCalNet.ModelData: Database structure used for training/testing.\nmodel::Flux.Chain: Multi-layer perceptron used for modeling.\noptim::NamedTuple: Internal Adam optimizer.\nlosses::Vector{Float32}: History of losses.\n\n\n\n\n\n","category":"type"},{"location":"Modules/RadCalNet/#RadCalNet.createcustomdatabase-Tuple{}","page":"RadCalNet","title":"RadCalNet.createcustomdatabase","text":"createcustomdatabase(;\n sampler!::Function,\n repeats::Int64 = 100,\n samplesize::Int64 = 50_000,\n cleanup::Bool = false,\n saveas::String = \"database.h5\",\n OMMIN::Float64 = 50.0,\n OMMAX::Float64 = 10000.0,\n override::Bool = false\n)\n\nCreates a custom database by generating a number repeats of samples of samplesize rows. Inputs for runradcalinput are to be generated by a sampler! user-defined function which modifies in place an array of compositions, and returns T, L, P, FV, TWALL for setting up a simulation. Files are temporarilly stored under data/ with a sequential numbered naming during database creation and aggregated in a HDF5 file named after saveas. The choice to aggregate files after an initial dump is because generation can be interrupted and manually recovered in an easier way and avoiding any risk of data losses - database creation can take a very long time. If cleanup is true, all intermediate files are removed.\n\n\n\n\n\n","category":"method"},{"location":"Modules/RadCalNet/#RadCalNet.datasampler!-Tuple{Vector{Float64}}","page":"RadCalNet","title":"RadCalNet.datasampler!","text":"datasampler!(X::Vector{Float64})::Tuple\n\nCustom sample space to generate entries with createcustomdatabase. This function contains the parameter space used for model training.\n\n\n\n\n\n","category":"method"},{"location":"Modules/RadCalNet/#RadCalNet.defaultmodel-Tuple{}","page":"RadCalNet","title":"RadCalNet.defaultmodel","text":"defaultmodel()\n\nBuild model structure with which RadCalNet is trained.\n\n\n\n\n\n","category":"method"},{"location":"Modules/RadCalNet/#RadCalNet.dumpscaler-Tuple{StatsBase.ZScoreTransform{Float32, Vector{Float32}}, String}","page":"RadCalNet","title":"RadCalNet.dumpscaler","text":"dumpscaler(scaler::ZScoreTransform{Float32,V32}, saveas::String)\n\nWrite z-score scaler mean and scale to provided saveas YAML file.\n\n\n\n\n\n","category":"method"},{"location":"Modules/RadCalNet/#RadCalNet.getradcalnet-Tuple{}","page":"RadCalNet","title":"RadCalNet.getradcalnet","text":"getradcalnet(;\n scale = true,\n fscaler = nothing,\n fmstate = nothing\n)\n\nLoad trained model and scaler to compose RadCalNet. If testing new models, it might be useful to use fscaler and fmstate to point to specific versions of scaler and model state files.\n\n\n\n\n\n","category":"method"},{"location":"Modules/RadCalNet/#RadCalNet.loaddatabase-Tuple{String}","page":"RadCalNet","title":"RadCalNet.loaddatabase","text":"loaddatabase(fname::String)\n\nRetrieve database from HDF5 file and access table as a matrix.\n\n\n\n\n\n","category":"method"},{"location":"Modules/RadCalNet/#RadCalNet.loadscaler-Tuple{String}","page":"RadCalNet","title":"RadCalNet.loadscaler","text":"loadscaler(fname::String)::Function\n\nLoad z-scaler in functional format from YAML fname file.\n\n\n\n\n\n","category":"method"},{"location":"Modules/RadCalNet/#RadCalNet.makemodel-Tuple{Vector{Tuple{Int64, Any}}}","page":"RadCalNet","title":"RadCalNet.makemodel","text":"makemodel(layers::Vector{Tuple{Int64, Any}}; bn = false)::Chain\n\nCreate a multi-layer perceptron for learning radiative properties with the provided layers. If bn is true, then batch normalization after each layer. The final layer has by default a sigmoid function to ensure physical outputs in range [0, 1].\n\n\n\n\n\n","category":"method"},{"location":"Modules/RadCalNet/#RadCalNet.model","page":"RadCalNet","title":"RadCalNet.model","text":"model(x::Vector{Float32})::Vector{Float32}\n\nMain model interface for emissivity and transmissivity.\n\n\n\n\n\n","category":"function"},{"location":"Modules/RadCalNet/#RadCalNet.plottests-Tuple{RadCalNet.ModelTrainer}","page":"RadCalNet","title":"RadCalNet.plottests","text":"plottests(trainer::ModelTrainer; num::Int64)\n\nEvaluate model over num data points and compare the data to the expected values as computed from RadCal. Makes use of test data only - never seem by the model during training.\n\n\n\n\n\n","category":"method"},{"location":"Modules/RadCalNet/#RadCalNet.runradcalinput-Tuple{}","page":"RadCalNet","title":"RadCalNet.runradcalinput","text":"runradcalinput(;\n X::Dict{String, Float64} = Dict{String, Float64}(),\n T::Float64 = 300.0,\n L::Float64 = 1.0,\n P::Float64 = 1.0,\n FV::Float64 = 0.0,\n OMMIN::Float64 = 50.0,\n OMMAX::Float64 = 10000.0,\n TWALL::Float64 = 500.0,\n radcalexe::String = \"radcal_win_64.exe\"\n)::Vector{Float64}\n\nCreate RADCAL.IN from template file and dump to disk.\n\nNOTE: the user is responsible to provide a vector X of mole fractions of species that sums up to one. If this is not respected RADCAL fails. The Following list provides the indexes of available species in vector X.\n\nIndex Species Index Species Index Species\n1 CO2 6 C2H6 11 CH3OH\n2 H2O 7 C3H6 12 MMA\n3 CO 8 C3H8 13 O2\n4 CH4 9 C7H8 14 N2\n5 C2H4 10 C7H16 \n\n\n\n\n\n","category":"method"},{"location":"Modules/RadCalNet/#RadCalNet.samplecols-Tuple{Int64, Int64}","page":"RadCalNet","title":"RadCalNet.samplecols","text":"Get sample of indexes for data retrieval. \n\n\n\n\n\n","category":"method"},{"location":"Modules/RadCalNet/#RadCalNet.tests-Tuple{RadCalNet.ModelData, Int64}","page":"RadCalNet","title":"RadCalNet.tests","text":"Get testing data for data loader construction. \n\n\n\n\n\n","category":"method"},{"location":"Modules/RadCalNet/#RadCalNet.train-Tuple{RadCalNet.ModelData, Int64}","page":"RadCalNet","title":"RadCalNet.train","text":"Get training data for data loader construction. \n\n\n\n\n\n","category":"method"},{"location":"Modules/RadCalNet/#RadCalNet.trainonce!-Tuple{RadCalNet.ModelTrainer}","page":"RadCalNet","title":"RadCalNet.trainonce!","text":"trainonce!(trainer::ModelTrainer; num = 1_000)\n\nTrain model and keep track of loss for the number of epochs in trainer using its internal data and parameters. Use num data points.\n\n\n\n\n\n","category":"method"},{"location":"Science/04-Continuum-Mechanics/#Continuum-Mechanics","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"","category":"section"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"","category":"page"},{"location":"Science/04-Continuum-Mechanics/#Analysis-of-transport-phenomena","page":"Continuum Mechanics","title":"Analysis of transport phenomena","text":"","category":"section"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"Theses notes intend to provide in a very concise way overview of the mathematical fundamentals of transport phenomena. In this sense, they are devoted to generalities rather than specific closure models. You can even see them as a cheat-sheet or simple lecture notes. ","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"In that sense, they try to be straightforward and mostly self-contained in the fundamental topics, with increased reference to external sources in applied subjects. They were first redacted based on the MITx series Analysis of Transport Phenomena by Pr. Dr. Martin Bazant and further extended based on several sources cited along the way. ","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"The main goal is to provide a general approach of transport phenomena applied to Materials Science and Process Engineering, but readers of other fields might also be interested in parts of the contents.","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"Note: this is still a work in progress and quickly evolving. Please let me know if you found any typos or conceptual mistakes. I am still to ask some friends to review them.","category":"page"},{"location":"Science/04-Continuum-Mechanics/#Transport-phenomena-foundations","page":"Continuum Mechanics","title":"Transport phenomena foundations","text":"","category":"section"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"Most physical phenomena are actually discrete processes (particles); many phenomena such as heat transfer are actual discrete vibrations in materials. Such systems are described by large systems of coupled ordinary differential equations (ODE's) which quickly become intractable and require numerical solution. Continuum approximations, i.e. an averaging process over a representative volume element (RVE), are used to generate a single partial differential equation (PDE) from many such ODE's. This transformation leads to the concept of conservation equations.","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"Say we have a quantity b such as it represents a number concentration of a given physical quantity. Associated to this quantity we have a flux density vecF through the boundaries of the system and a rate production in volume B_v as summarized in the following table.","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"beginalign*\nb = dfractextvolume qquadtextconcentration \nvecF = dfractextareacdotptexttime qquadtextflux density \nB_v = dfractextvolumecdotptexttime qquadtextproduction rate\nendalign*","category":"page"},{"location":"Science/04-Continuum-Mechanics/#General-conservation-equation","page":"Continuum Mechanics","title":"General conservation equation","text":"","category":"section"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"Using the above definitions and the conventions presented in the next figure, the most general statement of conservation of this quantity b writes then:","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"fracddtleft(int_VbdVright) = -int_OmegavecncdotpvecFdA+int_VB_vdV","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"Using the previous notation for units it is important to notice that each term of the above equation is given in units of quantity per volume per time.","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"(Image: )","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"#divergence-theorem","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"This multivariate vector equation describe transport in three-dimensional space. To be able to process further this expression one needs to incorporate the divergence theorem ideas to be able to formulate it in terms of volume only.","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"Say we have the vector field vecF, represented above by a number of lines; this could be any flow of some conserved quantity in the system being analyzed, as we shall see later. A control volume (CV) with a volume of V and a surface area of A is illustrated with a boundary Omega denoted by the outward pointing unit normal hatn at each point on the surface. The divergence theorem states:","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"int_VnablacdotpvecFdV=int_OmegavecncdotpvecFdA","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"In this expression,   nablacdotpvecF at each interior point inside V – a scalar quantity – gives the rate at which the conserved quantity spreads out from that point, while hatncdotpvecF at each boundary point on A – also a scalar quantity – gives the rate at which the conserved quantity leaks out at that point. Thus we may summarize the divergence theorem by saying that there are two equally valid ways to compute the total rate at which the conserved quantity leaves the control volume: either by integrating nablacdotpvecF at each interior point over V, or by integrating hatncdotpvecF at each boundary point over A. Using this ideas the previous conservation law can be converted into:","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"fracddtleft(int_VbdVright) = -int_VnablacdotpvecFdV+int_VB_vdV","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"Assuming an Eulerian reference frame (fixed) to the volume V we can move the time derivative of the above expression inside the left-hand side integral. Rearranging we have","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"int_Vleft(fracpartialbpartialt + nablacdotpvecF - B_vright)dV = 0","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"For a differential volume dV the integrand must be identically zero, from which the PDE arise:","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"fracpartialbpartialt + nablacdotpvecF - B_v = 0","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"Physically speaking this expression simply puts that the rate of accumulation equals the inflow (notice that this assumes a balance according to normal vector convection established above) plus the rate of production inside the control volume. This expression serves as the basis to the governing equations of different transport phenomena when constitutive relationships are included for describing a certain physics.","category":"page"},{"location":"Science/04-Continuum-Mechanics/#Conservation-at-system-boundaries","page":"Continuum Mechanics","title":"Conservation at system boundaries","text":"","category":"section"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"So far we have a PDE describing the conservation inside the RVE of the system being described. To be able to solve such a system we also need to provide a description of its interactions with its surroundings through the specification of boundary conditions.","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"Assume a volume of thickness l enclosing a boundary S splitting domains V_1 and V_2, where discontinuities in properties and all quantities describing the system may be present. We can write the continuity equation for this thick boundary as","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"fracddtleft(int_VbdVright) = -int_OmegavecncdotpvecFdA+int_VB_vdV+int_OmegaB_sdA","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"where the last term has been added to describe the net surface production rate of b. Collapsing the volume over the boundary S by taking the limit where lto0, it should be evident that all volume integrals in the above vanish. The integral form of boundary condition then simplifies to","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"int_OmegavecncdotpvecFdA=int_OmegaB_sdA","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"Defining as positive the normal of S pointing outwards V_1 the integrant on right-hand side can be written as vecnleft(vecF_2-vecF_1right). Applying mean value theorem as if all terms where in the same side of the equation (that vanishes overall) leads to the differential form of boundary condition","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"vecnleft(vecF_2-vecF_1right)=B_s","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"This expression has a very straightforward interpretation. If there is no creation rate B_s at the interface, flux is continuous across interface; otherwise some arbitrary form of discontinuity should arise, whose form would depend on the volume governing equations at each side of S. Below we have an illustration of a non-zero value of B_s at the interface, with a net increase in the flow in region 2.","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"![[imagesTY010105.svg]]","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"[!todo] The following is something I need to abstract better, although I fully understand the mathematical origins. The argument that it is formulated in the interface reference frame but viewed from the observer frame bothers me.","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"In the case of moving interfaces, the previous formulation needs to account for the relative motion of the boundary and the associated fictitious fluxes that follow it. In the interface reference frame, a relative flux b_ivecv_s needs to be accounted for, resulting in the modified boundary condition","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"vecnleft(vecF_2-b_2vecv_sright)-vecnleft(vecF_1-b_1vecv_sright)=B_s","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"From this condition it arrises that the magnitude of the normal component of the interface velocity is constrained to the following expression. No matter what physics is governing the movement, this compatibility constraint must be verified.","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"v_s = fracvecnleft(vecF_2-vecF_1right)-B_sb_2-b_1","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"[!todo] In the growing and shrinking bubble example, Pr. Bazant comes up with a variant of this expression where the fluxes are given by rhov, but I cannot realize how can the velocity v_1neqv_2neqv_s in this case.","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"For instance, consider the case that vecF_2-vecF_1=0 and B_s0, then the interface is consuming b; because the quantity cannot be supplied through fluxes, then the interface S moves towards the side richer in b.","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"[!todo] Complete this paragraph with water solidification example.","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"","category":"page"},{"location":"Science/04-Continuum-Mechanics/#Mass-and-energy-transfer","page":"Continuum Mechanics","title":"Mass and energy transfer","text":"","category":"section"},{"location":"Science/04-Continuum-Mechanics/#Derivation-of-conservation-equations","page":"Continuum Mechanics","title":"Derivation of conservation equations","text":"","category":"section"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"In the nineteenth century, Fick demonstrated empirically that the flux density of a species submitted to gradient field responded linearly to its concentration c gradient. Notice here c takes the place of the more general b in the conservation form derivation. In the more general case we should use subindexes for species concentrations and diffusivities, but that will be neglected here.","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"vecFpropto-nablac","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"This is actually the simplest form of diffusion modeling and, in general, is valid only in very specific cases, i.e. when a single species is being transported in a system without the effect of other components. Introducing a proportionality coefficient D, the diffusivity, we have:","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"vecF=-Dnablac","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"Using this expression in our conservation equation leads to:","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"fracpartialcpartialt - nablacdotpleft(Dnablacright) - R_v = 0","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"Under the very specific case where there is no volumetric production rate R_v, i.e. no chemical reactions, and constant diffusivity D, i.e. no composition or space dependence, this simplifies to the well-studied form of the so called Fick's second law:","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"fracpartialcpartialt = Dnabla^2c","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"This expression happens to be isomorph with heat diffusion equation for a constant specific heat medium because Fourier's law is analogous to Fick's first law, leading to the same final mathematical form. Using the thermodynamic definition dh=rhoc_pdT we have","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"fracpartialTpartialt = frackrhoc_pnabla^2T","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"It must be noticed that in the general case, the quantity being transported in heat equation is the enthalpy density h and the potential field is linearized in terms of temperature T through Fourier's equation. Without the constant specific heat simplification and with variable thermal conductivity k it is stated as:","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"fracpartialhpartialt = nablacdotpleft(knablaTright)","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"Other than for very simple enthalpy-specific heat relationships (such as the constant approximation discussed above), this PDE must be solved numerically with a coupled system of nonlinear equations for computing the field of temperatures in terms of enthalpies. In the above we neglect the volumetric heat production rate, which would be present, e.g. in a reacting system or a material undergoing nuclear fission.","category":"page"},{"location":"Science/04-Continuum-Mechanics/#Formulation-of-boundary-conditions","page":"Continuum Mechanics","title":"Formulation of boundary conditions","text":"","category":"section"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"When dealing with mass and heat transfer in the absence of more exotic physics such as electromagnetic effects, a pair of possible descriptions for the boundary fluxes arise; the first must be provided as a closure model for the surface species production rates R_s for mass transfer, and heat generation rate q_s for heat transfer; the other possibility is to assume the medium outside of the modeled domain is a reservoir with constant b_infty, the the proper b depending on the phenomena being described. The latter is generally modeled through a constitutive law under the form vecF=hleft(b-b_inftyright), where h is introduced as a transfer coefficient.","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"-vecncdotpDnablac=\nbegincases\nR_s6pt\nh_m(c-c_infty)\nendcases\nqquadtextandqquad\n-vecncdotpknablaT=\nbegincases\nq_s6pt\nh_e(T-T_infty)\nendcases","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"The actual meaning of h, be for mass transfer h_m or energy h_e depends of the physics being approximated in the external reservoir. There are specific, generally (semi-)empirical methods for evaluating reasonable values for the analysis of their values; this will be the subject of a future topic because the current context is still focused in general principles.","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"As a side note, it is worth mentioning here that in analytical methods the b_infty is treated as constant because otherwise analysis could grow exponentially in complexity. For the numerical solution of models it can be often treated as an explicit time function. For instance, imagine a material treatment where pulses of a reacting species are controlled and their concentration in the reactor is known in time; if modeling the solid state uncoupled from the reactor - what is generally the case due to computational time limitations - then the value of b_infty can be provided explicitly, keeping in mind that h can also be a function of this value or surface concentration, depending on the closure model used for the specific simulation.","category":"page"},{"location":"Science/04-Continuum-Mechanics/#Microscopic-models-of-diffusion","page":"Continuum Mechanics","title":"Microscopic models of diffusion","text":"","category":"section"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"The models discussed so far are in fact the macroscopic response to discrete phenomena happening at the atomic and molecular scales. Particles moving randomly due to thermal energy in a fluid or solid follow a path described by a probability density function in steps that in most cases happen at a typical rate due to these thermal fluctuations.","category":"page"},{"location":"Science/04-Continuum-Mechanics/#Diluted-mixtures","page":"Continuum Mechanics","title":"Diluted mixtures","text":"","category":"section"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"In the most simple of cases, a non-interacting particle in a dilute mixture performs a random walk; when many such particles are present in one part of the domain, as we will show later, the resulting gradient of concentration that will be established over a sufficiently large amount of time leads to Fick's law. The terminology was created by Pearson (1905) for which Rayleigh (1905) had already found a solution many years beforehand; is also appears in the solution of Brownian motion by Einstein (1905) (translated here) and turbulent diffusion by Taylor (1922).","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"In the derivation of diffusion equation, following the already mentioned non-interacting particles hypothesis, one also needs steps to be independent, identically distributed (IDD) and limited by a finite variance sigma^2, i.e. p(xpmKsigma)to0 quickly for some finite K.","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"P_N+1(x) = intP_N(x-y)p(y)dy = (P_N ast p)(x)","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"The probability P_N+1(x) that a particle is found at x at step N+1 is equal to the sum of the probabilities p(y) of particles at a distance y from x execute a movement of such amplitude to reach x times the probability of a particle being at the position P_N(x-y).","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"P_N = (P_0 ast p ast p ast dots p)(x) = (P_0 ast p^astN)(x)","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"beginalign*\nP_N+1(x)\n= intleft(P_N(x) - yP_N^prime(x) + dfrac12y^2P_N^primeprime(x)right)p(y)dy\n\n=P_N(x)intp(y)dy - P_N^prime(x)intyp(y)dy + dfrac12P_N^primeprime(x)inty^2p(y)dy\n\n=P_N(x) - langleyrangleP_N^prime(x) + dfrac12langley^2rangleP_N^primeprime(x)\nendalign*","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"The fourth and last requirement now is that process take place with a finite mean step langletaurangle:","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"dfracP_N+1(x) - P_N(x)langletaurangle + dfraclangleyranglelangletaurangleP_N^prime(x) = dfraclangley^2rangle2langletaurangleP_N^primeprime(x)","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"Introducing c(x-vtt)simP_N(x-vt) with t=Nlangletaurangle","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"[!todo] Finish the additional Taylor expansion from the above expression to get formally to the final result provided below.","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"dfracpartialcpartialt + vdfracpartialcpartialx = Ddfracpartial^2cpartialx^2\n\nquadtextwherequadv=dfraclangleyranglelangletaurangle\n\nquadtextandquadD=dfraclangley^2rangle-langleyrangle^22langletaurangle","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"[!info] More about this in chapter 4 of Mehrer2007 [29].","category":"page"},{"location":"Science/04-Continuum-Mechanics/#Concentrated-mixtures","page":"Continuum Mechanics","title":"Concentrated mixtures","text":"","category":"section"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"On the other limit one finds the concentrated mixtures for which particle-particle interactions intervene on the probability distribution of motion and results obtained through non-equilibrium thermodynamics lead to a more complex law. Particle interactions may be simple collisions or involve more complex physics, such as electrodynamic forces; a direct solution through statistical approaches in this case quickly becomes intractable mathematically.","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"In what follows we will derive the diffusion equation from the aforementioned thermodynamic principles. The chemical potential is defined as the sensitivity of Gibbs free energy G with respect to the number of moles N of a substance. Expressed in terms of activity a we have:","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"mu = dfracpartialGpartialN=mu^theta+k_BTln(a)","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"The activity of non-ideal solutions is itself a function of a relative concentration tildec through a proportionality coefficient gamma, the so-called activity coefficient, which by its turn can also be a function of composition. The reference concentration c_sat to the definition of tildec is the concentration at which a phase change happens; that said, the activity may be seen as a measure of the tendency towards phase change. This is all expressed as","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"a=gammatildecqquadtextwhereqquadtildec=dfraccc_sat","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"Now let's Einstein relationship between mobility M and the diffusivity D. Mobility is defined as the capacity a given force is able to produce a net drift velocity in the system; it is related to D as","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"M = dfractextdrift velocitytextforce =dfracDk_BT","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"From linear irreversible thermodynamics (LIT) we can express the flux as","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"vecF=-Mcnablamu=vecv_driftcqquadtextwhereqquadvecv_drift = -Mnablamu","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"[!info] The development of (LIT) is found in Onsager1931 [30] and the following Onsager1931a [31]. Notice that the above paragraph needs more grounding, it has been thrown in the text as a truth without first-principles demonstration and that is against our goals here!","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"Because log(tildec)=log(c)-log(c_sat) and c_sat is a constant, then developing nablamu leads to","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"nablamu = k_BTleft(dfrac1c+dfrac1gammadfracpartialgammapartialcright)nablac","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"Applying this result to the previous expression and reworking the terms leads to","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"vecF=-Dleft(1 + dfraccgammadfracpartialgammapartialcright)nablac=-Dleft(1 + dfracpartiallngammapartiallncright)nablac","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"Here we can identify the chemical diffusivity by comparison with Fick's law as","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"D_chem = -Dleft(1 + dfracpartiallngammapartiallncright)","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"In the above expression, the second term in the sum is called the thermodynamic factor. In the limit of dilute system for which gamma=1 we fall back to D_chem=D, showing that the concentrated mixture approach is a proper generalization of the previous model for diluted systems.","category":"page"},{"location":"Science/04-Continuum-Mechanics/#Application-to-diffusion-in-a-lattice","page":"Continuum Mechanics","title":"Application to diffusion in a lattice","text":"","category":"section"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"","category":"page"},{"location":"Science/04-Continuum-Mechanics/#Fluid-mechanics","page":"Continuum Mechanics","title":"Fluid mechanics","text":"","category":"section"},{"location":"Science/04-Continuum-Mechanics/#Derivation-of-continuity-equation","page":"Continuum Mechanics","title":"Derivation of continuity equation","text":"","category":"section"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"Moving towards a fluid mechanics application, one often needs to express the continuity equation for the overall mass of the system and the flowing species.","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"In this case, term b of previous formulation is replaced by the mass density rho_m of the fluid. Flux is expressed as vecF_m=vecv_mrho_m, where vecv_m is the mass averaged velocity. It is useful to introduce this quantity vecv_m because in many multi-species formulations it might become difficult to find a single velocity representing the fluid motion.","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"In the absence of creation rates B_v the continuity equation writes","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"fracpartialrho_mpartialt+nablacdotpleft(rho_mvecv_mright)=0","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"For incompressible flows (constant rho_m) the time derivative is by definition null and the divergent term can be expanded in terms of its components gradients as","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"nablacdotpleft(rho_mvecv_mright)=rho_mnablavecv_m+vecv_mnablarho_m=0","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"#incompressible-flow","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"Since rho_m is constant, this simplifies to the so-called incompressible fluid continuity equation","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"nablavecv_m=0","category":"page"},{"location":"Science/04-Continuum-Mechanics/#Application-to-advection-diffusion-reaction","page":"Continuum Mechanics","title":"Application to advection-diffusion-reaction","text":"","category":"section"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"Now assume a flow where chemical species c_i are advected by the velocity vecv_i and diffuse following the negative of their gradient. The flux in this case is given as F_i = c_ivecv_i-D_inablac_i. Applying this to the equation of conservation of c_i leads to","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"fracpartialc_ipartialt+nablacdotpleft(c_ivecv_i-D_inablac_iright)=R_v","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"Splitting the terms under the divergence operator in right-hand side and reorganizing:","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"fracpartialc_ipartialt+nablacdotpleft(c_ivecv_iright)=nablacdotpleft(D_inablac_iright)+R_v","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"It is often beneficial to further expand the divergence of convection term so that the equation can be reshaped as follows:","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"fracDc_iDt=\nfracpartialc_ipartialt+\nvecv_inablac_i=\nnablacdotpleft(D_inablac_iright)-\nc_inablacdotpvecv_i\n+R_v","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"In this expression the big-D notation represents a material or convective derivative. It provides us the behavior of transported quantity in the fluid reference frame, what can be useful for some local analysis. Even more useful than that, under this form we can promptly simplify the remaining terms in the left-hand side for cases of constant diffusivity, incompressible flow, and absence of chemical reactions (in the order of appearance of terms). For numerical solution of transport equations for incompressible flows, using the null divergent of velocity can save us a lot of trouble.","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"","category":"page"},{"location":"Science/04-Continuum-Mechanics/#Notes-by-video-lecture","page":"Continuum Mechanics","title":"Notes by video lecture","text":"","category":"section"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"The playlist with all lectures is found here.","category":"page"},{"location":"Science/04-Continuum-Mechanics/#019","page":"Continuum Mechanics","title":"019","text":"","category":"section"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"The scale estimates of penetration depth, boundary flux, and total concentration match the analytical values for steady-state first order linear reaction-diffusion equation submitted to a Dirichlet condition on one side of a semi-infinite medium:","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"Ddfracpartial^2Cpartialx^2-kC=0impliesbegincases\ndelta sim sqrtdfracDk12pt\n\nF sim C_0sqrtDk12pt\n\nC_infty sim C_0sqrtdfracDk\nendcases","category":"page"},{"location":"Science/04-Continuum-Mechanics/#020","page":"Continuum Mechanics","title":"020","text":"","category":"section"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"#dimless-damkohler","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"Damköhler number arises from reaction diffusion-equation discussed in lecture 019; we can make the equation dimensionless by making tildex=xL^-1, Theta=CC_0, and dividing everything by k, then we can define:","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"dfracpartial^2Thetapartialtildex^2-mathrmDaTheta=0\n\nquadtextwherequad\n\nmathrmDa=frackDL^2=left(fracLdeltaright)^2","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"Limiting cases are:","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"mathrmDall1\n: fast diffusion limit, length scale delta is much larger than L, so diffusion crosses the domain; interaction of diffusion fronts is possible. On may be interested in e.g computing the deviation from surface concentration C_0 at the body core, DeltaCC_0simsqrtmathrmDa.\nmathrmDagg1\n: fast reaction-limited transport; a thin layer of reaction products limits the affected depth and diffusion layer is thin beyond that. The relative amount of material that diffuses with respect to the other limiting case is C(C_0L^d-1)sim1sqrtmathrmDa.","category":"page"},{"location":"Science/04-Continuum-Mechanics/#021","page":"Continuum Mechanics","title":"021","text":"","category":"section"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"In fact it is in this lecture that the stripping of dimensions of the equation as presented above in 020 is formalized; do not even try to solve a problem before making it dimensionless. The general procedure for making differential operators dimensionless is summarized as follows:","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"tildex_i = dfracx_iL_i implies\n\nbegincases\ndfracddtildex_i=L_idfracddx_i12pt\ndfracd^ndtildex_i^n=L_i^ndfracd^ndx_i^n12pt\nendcases","category":"page"},{"location":"Science/04-Continuum-Mechanics/#022","page":"Continuum Mechanics","title":"022","text":"","category":"section"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"#bessel-function","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"Always start any modeling with the simplest geometry that captures the basic features of the system being modeled; e.g. when expanding a solution of reaction-diffusion into exponential terms, it is worth noticing that they can be replaced by hyperbolic functions, and since sinh breaks the symmetry, that term may be eliminated already during constant identification from boundary conditions.","category":"page"},{"location":"Science/04-Continuum-Mechanics/#023","page":"Continuum Mechanics","title":"023","text":"","category":"section"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"#dimless-peclet #plug-flow ","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"Similarly to lecture 019, here we develop convection-diffusion equation instead; in this case the flux of a transported concentration C is given by the following expression: ","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"vecF=vecuC-DnablaC","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"Applying the general conservation law to steady state and incompressible (nablavecu=0) gives:","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"vecucdotpnablaC-Dnabla^2C=0","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"Using the same approach to make the equation dimensionless as in lecture 019 we have:","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"beginalign*\ndfracDL^2tildenabla^2Theta-dfracuLtildenablaTheta=012pt\ndfrac1tau_dtildenabla^2Theta-dfrac1tau_ctildenablaTheta=0\nendalign*","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"where tau_c is the characteristic convection time and tau_d the characteristic diffusion time; to reach the final dimensionless equation we can multiply the whole equation by tau_d, what introduces the ratio of diffusion to advection times, commonly called the Péclet number. The results may be summarized as","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"tildenabla^2Theta-mathrmPetildenablaTheta=0\nimplies\nbegincases\ndelta sim dfracDu12pt\nmathrmPe = dfracuLD\nendcases","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"In the limiting case of mathrmPegg1 diffusion is much slower than convection and the flow can be approximated as purely advective; this characterizes the plug-flow regime.","category":"page"},{"location":"Science/04-Continuum-Mechanics/#024","page":"Continuum Mechanics","title":"024","text":"","category":"section"},{"location":"Science/04-Continuum-Mechanics/#025","page":"Continuum Mechanics","title":"025","text":"","category":"section"},{"location":"References/@Reitz1987/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Reitz1987/","page":"-","title":"-","text":"title: Structure of high-pressure fuel sprays authors: Rolf D. Reitz, R. Diwakar year: 1987 URL: https://doi.org/10.4271/870598 –-","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/#Julia-para-Cientistas","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"","category":"section"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Julia from zero to hero com uma abordagem para computação científica.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Antes de entrar realmente nos tópicos de estudo listados abaixo, vamos falar um pouco sobre alguns elementos básicos para se seguir a série em relação a linguagem de programação Julia. Os conteúdos aqui apresentados são uma extensão daqueles providos pela JuliaAcademy em seu curso introdutório. O objetivo desta extensão é apresentar alguns elementos suplementares para a prática de computação científica. A temática de gráficos em Julia, será abordada em um tutorial distinto do curso no qual nos baseamos dada a necessidade de ir um pouco além na qualidade gráfica para publicações em journals.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Julia é uma linguagem sintaticamente similar à Python mas o estilo de programação tipicamente adotado tende a ser procedural com uso de estruturas e métodos para processar dados contidos nestas. Esta nova linguagem publicada pela primeira vez em 2012 vem ganhando grante momentum e uma comunidade bastante interessante na sua diversidade científica. Após alguns anos hesitando em me engajar no seu uso para aplicações em pesquisa em desenvolvimento, em 2023 fui convencido que é chegada hora de transferir parte dos estudos em Julia e então adaptar todos os conteúdos que produzo nesta linguagem.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Recomenda-se o estudo do presente tutorial de forma interativa em uma longa sessão de aproximadamente 4 horas de estudo. Após este primeiro contato, os tutorials mais complexos que se seguem se tornarão acessíveis mesmo para aqueles que estão tendo seu primeiro contato com computação. Este tutorial pode ao longo do estudo ser consultado para clarificar elementos da linguagem. Uma vez que se encontre confortável com o conteúdo aqui apresentado, recomenda-se estudar o manual da linguagem, o qual apresenta detalhes omitidos nesta introdução almejada para um primeiro contato.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Julia possui um largo ecossistema de pacotes implementado uma vasta gama de funcionalidades. Para conhecer mais não deixe de visitar Julia Packages.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Antes de começar, recomendo a leitura deste artigo.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/#Seguindo-os-materiais","page":"Julia para Cientistas","title":"Seguindo os materiais","text":"","category":"section"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Os conteúdos são majoritariamente sequenciais: exceto para os tópicos mais avançados (para aqueles que já programam em Julia), é necessário seguir os notebooks na ordem provida.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Um canal YouTube do curso está em fase de concepção para abordar os detalhes entre-linhas, involvendo aspectos que não necessariamente estão escritos.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Etapas à seguir para começar os estudos:","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Ler sobre ciência colaborativa abaixo para se familiarizar com alguns elementos que vamos abordar no que se segue.\nInstalar Julia na versão estável para seu sistema operacional.\nInstalar Pluto para visualizar e editar os notebooks do curso.\nClonar este repositório com todos os materiais usando a seguinte ordem de prioridade:\nUsando Git à través da linha de comando, forma recomendada com git clone https://github.com/wallytutor/medium-articles.git\nCom a interface gráfica de GitHub Desktop\nUsando o botão de Download","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Caso a última opção de download tenha sido a sua escolha, observe que o arquivo .zip não contem os elementos de repositório git para controle de versão, implicando que as suas modificações e notas tomadas deverão ser geridas localmente, o que não é recomendável. Para estudantes ainda não familiarizados com git, a opção de utilizar GitHub Desktop é a mais apropriada.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/#Para-aonde-ir-depois?","page":"Julia para Cientistas","title":"Para aonde ir depois?","text":"","category":"section"},{"location":"Notebooks/A1-Julia-para-Cientistas/#Para-aprender-mais","page":"Julia para Cientistas","title":"Para aprender mais","text":"","category":"section"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Julia Academy: nesta página encontram-se cursos abertos em várias temáticas comumente abordadas com a linguagem Julia. Você encontrará cursos parcialmente equivalentes aos materiais tratados aqui, mas também vários conteúdos que não são abordados nesta introdução, especialmente em tópicos ligados a Ciência de Dados.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Introduction to Computational Thinking: esse é provavelmente o melhor curso generalista para aplicações científicas da linguagem. O curso é ministrado inclusive pelo Pr. Dr. Alan Edelman um dos criadores de Julia. Os tópicos abordados vão de tratamento de imagens, séries temporais, a resolução de equações diferenciais parciais.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"SciML Book: este livro é o resultado dos materiais de suporte do curso Parallel Computing and Scientific Machine Learning (SciML): Methods and Applications no MIT. Os tópicos são suportados por vídeo aulas e entram em mais profundidade nos assuntos avançados que tratamos aqui.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Exercism Julia Track: a plataforma Exercism propõe no percurso de Julia vários exercícios de algoritmos de nível fácil à intermediário-avançado. Minha recomendação é que essa prática venha a complementar os materiais propostos acima como forma de sedimentar o aprendizado da linguagem.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Julia Data Science: este livro complementa tópicos mais operacionais de análise de dados, especialemente técnicas básicas de Ciência de Dados, que omitimos neste curso. Um bom material complementar aos estudos.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/#Comunidade-Julia","page":"Julia para Cientistas","title":"Comunidade Julia","text":"","category":"section"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Julia Community Zulipchat: precisando de ajuda ou buscando um projeto para contribuir? Este chat aberto da comunidade Julia é o ponto de encontro para discutir acerca dos diferenter projetos e avanços na linguagem.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Julia Packages: o repositório mestre do índice de pacotes escritos na linguagem Julia ou provendo interfaces à outras ferramentas. A página contém um sistema de busca e um índice por temas.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"JuliaHub: esta plataforma comercial provê tudo que é necessário para se passar da prototipagem à escala industrial de soluções concebidas em Julia. Atualmente é a norma em termos de escalabilidade para a linguagem.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/#Organizações-recomendadas","page":"Julia para Cientistas","title":"Organizações recomendadas","text":"","category":"section"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"SciML: pacotes para Machine Learning científico.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"JuMP: uma linguagem de optimização matemática em Julia.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"JuliaData: pacotes para Data Science em geral.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"JuliaMolSim: simulação de dinâmica molecular em Julia.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/#Parte-1-Primeiros-passos","page":"Julia para Cientistas","title":"Parte 1 - Primeiros passos","text":"","category":"section"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Tradicionalmente, o primeiro contato com uma linguagem de programação se faz através da implementação se seu programa Hello, World! que nada mas faz que imprimir esta sentença em um terminal. Em Julia usamos a função println() contendo o texto a ser apresentado entre aspas duplas (veremos mais sobre texto na próxima seção) para implementar este programa, como se segue:","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"println(\"Olá, Mundo!\")","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/#Tipos-básicos","page":"Julia para Cientistas","title":"Tipos básicos","text":"","category":"section"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"O interesse principal de programação é o fato de podermos atribuir valores à nomes e em seguida realizar a manipulação necessária. Uma vez implementado o algoritmo, podemos simplesmente modificar os valores e reutilizá-lo.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Esse processo chama-se atribuição de variáveis e é realizado utilizando o símbolo de igualdade = com o nome da variável à esquerda e seu valor a direita.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"warn: Cuidado\nVeremos mais tarde que a comparação de igualdade se faz com um duplo sinal == e que devemos tomar cuidado com isso quando estamos tendo um primeiro contato com programação. A igualdade simples = é, na maioria das linguagens modernas, um símbolo de atribuição de valor.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Vamos criar uma variávei favorite_number_1 e atribuir seu valor:","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"favorite_number_1 = 13","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Agora poderíamos realizar operações com favorite_number_1. Faremos isso mais tarde com outras variáveis porque antes é importante de introduzirmos o conceito de tipos. Toda variável é de um dado tipo de dado, o que implica o tamanho (fixo ou variável) de sua representação na memória do computador. Com a função typeof() inspecionamos o tipo de uma variável.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Vemos que o tipo de 13 – um número inteiro – é representado em Julia por Int64.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"typeof(favorite_number_1)","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Existem diversos tipos numéricos suportados por Julia, mas aqui vamos ver somente os tipos básicos utilizados mais comumente em computação numérica. Atribuindo um valor aproximado de π a favorite_number_2 obtemos um objeto de tipo Float64, utilizado para representar números reais em dupla precisão.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"note: Aritmética de ponto flutuante de dupla precisão\nA maioria dos números reais não podem ser representados com precisão arbitrária em um computador. Um número real em dupla precisão é representado com 64 bits na memória. Representações de precisão arbitrária são hoje em dia disponíveis mas tem um custo de operação proibitivo para a maioria das aplicações. A matemática necessária para a compreensão da representação na memória é discutida no livro texto.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"favorite_number_2 = 3.141592\ntypeof(favorite_number_2)","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Uma particularidade de Julia dado o seu caráter científico é o suporte à números irracionais. Podemos assim representar π de maneira otimizada como discutiremos num momento oportuno.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"note: Caracteres especiais\nJulia suporta progração usando quaisquer caractéres UNICODE. Isso inclui letras gregas, subscritos, símbolos matemáticos... Em notebooks Pluto ou em editores conectados à um Julia Language Server podemos entrar esses símbolos digitando seu equivalente em LaTeX e pressionando a tecla . Uma lista detalhada de caracteres suportados é apresentada aqui.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"favorite_number_3 = π\ntypeof(favorite_number_3)","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Por exemplo, também temos o número de Euler representado como irracional. Como este número é representado pela letra e, para evitar conflitos com outras variáveis ele precisa ser acessado pelo caminho completo do módulo definindo as constantes matemáticas.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"favorite_number_4 = MathConstants.e\ntypeof(favorite_number_4)","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Outro exemplo de constante irracional é a proporção áurea.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Base.MathConstants.golden","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"A lista completa pode ser acessada com names(module) como se segue:","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"names(MathConstants)","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"O nome de variáveis também pode ser um emoji – evite isso em programas, evidentemente.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"🥰 = \"Julia\"\ntypeof(🥰)","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Usando essa possibilidade podemos brincar com o conceito como abaixo:","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"🐶 = 1\n😀 = 0\n😞 = -1\n# Vamos ver se a expressão a seguir é avaliada como verdadeira.\n# Todo texto após um `#` é considerado um comentário por Julia.\n# Abaixo vemos um novo operador de comparação de igualdade `==`.\n🐶 + 😞 == 😀","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/#Comentários","page":"Julia para Cientistas","title":"Comentários","text":"","category":"section"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Vimos no bloco acima o primeiro bloco de comentários identificado por linhas iniciando com #. Como comentários não são expressões, vemos abaixo que múltiplas linhas são aceitas em uma única célula contando que haja apenas uma expressão no contexto. Comentários são desejáveis para que entendamos mais tarde qual era o objetivo de uma dada operação. Confie em mim, anos mais tarde um código que parecia evidente no momento da sua escritura, quando você tem o conceito a ser expresso fresco na cabeça, pode parecer um texto em basco.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"# Em Julia, toda linha começando por um `#` é considerada um\n# comentário. Comentários após declarações também são possíveis:\n\ncomment = 1; # Um comentário após uma declaração.\n\n#=\nComentários de multiplas linhas também podem ser escritos usando\no par `#=` seguido de texto e então `=#` no lugar de iniciar\ndiversas linhas com `#`, o que torna sua edição mais fácil.\n=#\n\nnothing; #hide","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/#Aritmética-básica","page":"Julia para Cientistas","title":"Aritmética básica","text":"","category":"section"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Podemos usar Julia em modo interativo como uma calculadora.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Vemos abaixo a adição + e subtração -,...","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"1 + 3, 1 - 3","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"... multiplicação * e divisão /, ...","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"2 * 5, 2 / 3","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"... e uma comparação entre a divisão racional e normal.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"2 // 3 * 3, 2 / 3 * 3","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Julia possui suporte incluso a números racionais, o que pode ser útil para evitar propagação de erros em vários contextos aonde frações de números inteiros podem eventualmente ser simplificadas. Verificamos o tipo da variável com typeof().","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"typeof(2 // 3)","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"O quociente de uma divisão inteira pode ser calculado com a função div(). Para aproximar essa expressão da notação matemática é também possível utilizar 2 ÷ 3.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"div(2, 3)","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"O resto de uma divisão pode ser encontrado com mod(). Novamente essa função possui uma sintaxe alternativa – como em diversas outras linguagem nesse caso – utilizando o símbolo de percentual como em 11 % 3.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"mod(11, 3)","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Para concluir as operações básicas, incluímos ainda a expoenciação ^.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"2^5","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Outra particularidade de Julia é o suporte à multiplicação implícita – use essa funcionalidade com cuidado, erros estranhos podem ocorrer em programas complexos.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"a_number = 234.0;\n2a_number","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"O valor de π também pode ser representado por pi. Observe que a multiplicação de um inteiro 2 por pi (de tipo Irrational{:π}) produz como resultado um número Float64.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"typeof(2pi)","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/#Conversão-explícita","page":"Julia para Cientistas","title":"Conversão explícita","text":"","category":"section"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Se um número real pode ser representado por um tipo inteiro, podemos utilizar a função convert() para a transformação desejada. Caso a representação integral não seja possível, talvez você possa obter o resultado almejado usando uma das funções round(), floor(), ou ceil(), as quais você pode verificar na documentação da linguagem.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"a_number = 234.0;\nconvert(Int64, a_number) == 234","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Funções em Julia também podem ser aplicadas a múltiplos argumentos de maneira sequencial em se adicionando um ponto entre o nome da função e o parêntesis de abertura dos argumentos. Por exemplo, para trabalhar com cores RGB é usual empregar-se o tipo UInt8 que é limitado à 255, reduzindo a sua representação em memória.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"A conversão abaixo se aplica a sequência de números color individualmente.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"color = (255.0, 20.0, 21.0)\nconvert.(UInt8, color)","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Finalmente, formas textuais podem ser interpretadas como números usando parse().","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"parse(Int64, \"1\")","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/#Parte-2-Manipulação-textual","page":"Julia para Cientistas","title":"Parte 2 - Manipulação textual","text":"","category":"section"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Uma habilidade frequentemente negligenciada pelo grande público de computação científica nos seus primeiros passos é a capacidade de manipulação textual. Não podemos esquecer que programas necessitam interfaces pelas quais alimentamos as condições do problema a ser solucionado e resultados são esperados ao fim da computação. Para problemas que tomam um tempo computacional importante, é extremamente útil ter mensagens de estado de progresso. Nessa seção introduzimos os primeiros elementos necessários para a manipulação textual em Julia.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Uma variável do tipo String declara-se com aspas duplas, como vimos inicialmente no programa Hello, World!. Deve-se tomar cuidado em Julia pois caracteres individuais (tipo Char) tem um significado distinto de uma coleção de caracteres String.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Por exemplo, avaliando o tipo de 'a' obtemos:","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"typeof('a')","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/#Declaração-de-Strings","page":"Julia para Cientistas","title":"Declaração de Strings","text":"","category":"section"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Estudaremos caracteres mais tarde. Por enquanto nos interessamos por expressões como:","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"text1 = \"Olá, eu sou uma String\"\n\ntypeof(text1)","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Eventualmente necessitamos utilizar aspas duplas no interior do texto. Neste caso, a primeira solução provida por Julia é utilizar três aspas duplas para a abertura e fechamento do texto. Observamos abaixo que o texto é transformado para adicionar uma barra invertida antes das aspas que estão no corpo do texto.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"text2 = \"\"\"Eu sou uma String que pode incluir \"aspas duplas\".\"\"\"","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Neste caso, Julia aplicou automaticamente um caractere de escape no símbolo a ser interpretado de maneira especial. Existem diversos casos aonde a aplicação manual pode ser útil, por exemplo quando entrando texto em UNICODE por códigos. No exemplo abaixo utilizamos a técnica manual com o texto precedente.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"text3 = \"Eu sou uma String que pode incluir \\\"aspas duplas\\\".\"","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Para averiguar o funcionamento correto, testamos de imprimir text3 no terminal.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"println(text3)","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"O exemplo a seguir ilustra o uso do caracter de escape para representar UNICODE.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"pounds = \"\\U000A3\"","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/#Interpolação-de-Strings","page":"Julia para Cientistas","title":"Interpolação de Strings","text":"","category":"section"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Para gerar mensagens automáticas frequentemente dispomos de um texto que deve ter partes substituidas. Ilustramos abaixo o uso de um símbolo de dólar $ seguido de parêntesis com a variável de substituição para realizar o que chamamos de interpolação textual.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"note: Múltiplas variáveis em uma linha\nObserve aqui a introdução da declaração de múltiplas variáveis em uma linha.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"name, age = \"Walter\", 34\nprintln(\"Olá, $(name), você tem $(age) anos!\")","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"warn: Prática não recomendada\nPara nomes simples de variáveis e sem formatação explícita, o código a seguir também é valido, mas é pode ser considerado uma má prática de programação.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"println(\"Olá, $name, você tem $age anos!\")","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Em alguns casos, como na contagem de operações em um laço, podemos também realizar operações e avaliação de funções diretamente na String sendo interpolada.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"println(\"Também é possível realizar operações, e.g 2³ = $(2^3).\")","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/#Formatação-de-números","page":"Julia para Cientistas","title":"Formatação de números","text":"","category":"section"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"using Printf\n\nprintln(@sprintf(\"%g\", 12.0))\n\nprintln(@sprintf(\"%.6f\", 12.0))\n\nprintln(@sprintf(\"%.6e\", 12.0))\n\nprintln(@sprintf(\"%15.8e %15.8E\", 12.0, 13))\n\nprintln(@sprintf(\"%6d\", 12.0))\n\nprintln(@sprintf(\"%06d\", 12))","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/#Concatenação-de-Strings","page":"Julia para Cientistas","title":"Concatenação de Strings","text":"","category":"section"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Na maioria das linguagens de programação a concatenação textual se faz com o símbolo de adição +. Data suas origens já voltadas para a computação numérica, Julia adota para esta finalidade o asterísco * utilizado para multiplicação, o que se deve à sua utilização em álgebra abstrata para indicar operações não-comutativas, como clarificado no manual.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"bark = \"Au!\"\n\nbark * bark * bark","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"O circunflexo ^ utilizado para a exponenciação também pode ser utilizado para uma repetição múltipla de uma data String.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"bark^10","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Finalmente o construtor string() permite de contactenar não somente Strings, mas simultanêamente Strings e objetos que suportam conversão textual.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"string(\"Unido um número \", 10, \" ou \", 12.0, \" a outro \", \"texto!\")","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/#Funções-básicas","page":"Julia para Cientistas","title":"Funções básicas","text":"","category":"section"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Diversos outros métodos são disponíveis para Strings. Dado o suporte UNICODE de Julia, devemos enfatizar com o uso de length() e sizeof() que o comprimento textual de uma String pode não corresponder ao seu tamanho em bytes, o que pode levar ao usuário desavisado a erros numa tentativa de acesso à caracteres por índices.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"length(\"∀\"), sizeof(\"∀\")","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Uma função que é bastante útil é startswith() que permite verificar se uma String inicia por um outro bloco de caracteres visado. Testes mais complexos podem ser feitos com expressões regulares, como veremos mais tarde.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"startswith(\"align\", \"al\")","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/#Parte-3-Estruturas-de-dados-I","page":"Julia para Cientistas","title":"Parte 3 - Estruturas de dados I","text":"","category":"section"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Nesta seção vamos estudar alguns tipos de estruturas de dados. Essas formas compostas são construídas sobre elementos que já vimos mas podem também ir além destes. Abordaremos apenas as características básicas de cada uma das estruturas apresentadas e os casos de aplicação se tornarão evidentes. Os diversos métodos comuns à essas coleções é descrito nesta página.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/#*Tuples*","page":"Julia para Cientistas","title":"Tuples","text":"","category":"section"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Uma tuple é constituída de uma sequência de elementos, que podem ser de tipos diferentes, declarada entre parêntesis. A característica de base de uma tuple é sua imutabilidade: uma vez declarada, seus elementos não podem ser alterados.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"note: Já vimos isso antes\nVoltando a seção aonde realizamos a conversão explícita de tipos acima, você pode verificar que na realidade já utilizamos uma tuple de números indicando as intensidades RGB de uma cor.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Declaremos uma sequência fixa de linguagens de programação dadas por seus nomes como Strings:","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"languages = (\"Julia\", \"Python\", \"Octave\")","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Inspecionando o tipo desta variável aprendemos mais uma característica importante inerente a definição de Tuple feita acima quanto ao seu caráter imutável: o tipo de uma Tuple inclui individualmente o tipo de cada um de seus elementos. Dito de outra maneira, uma sequência composta de um número definido de objetos de dados tipos caracteriza por ela mesmo um novo tipo de dados.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"typeof(languages)","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Os elementos de uma Tuple podem ser acessados por seus índices.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"warn: Indices em Julia\nÉ o momento de mencionar que em Julia a indexação inicia com 1.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"@show languages[1]","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Vamos tentar modificar o segundo elemento da Tuple.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"note: Sintaxe de controle de erros\nAinda é cedo para entrar nos detalhes, mas aproveite o bloco abaixo para ter um primeiro contato com a gestão de erros em Julia.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"try\n languages[2] = \"C++\"\ncatch err\n println(\"Erro: $(err)\")\nend","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Existem certas subtilidades que você precisa saber sobre a imutabilidade. Observe o exemplo abaixo, aonde declaramos duas variáveis que são utilizadas para construir uma Tuple e então modificamos uma das variáveis: a Tuple continua com os valores originais do momento da sua construção.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"let\n a = 1\n b = 2\n\n test_tuple = (a, b)\n\n a = 5\n test_tuple\nend","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"warn: Isso nem sempre é verdade!\nSe o elemento compondo a Tuple for de um tipo mutável, como é o caso de Array's, como veremos no que se segue, os elementos desta variável podem ser modificados e impactam a Tuple diretamente. Isso se dá porque neste caso a Tuple conserva a referência ao objeto em questão, e não uma cópia dos valores, como é o caso para tipos de base.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"let\n a = 1\n b = [1, 2]\n\n test_tuple = (a, b)\n\n b[1] = 999\n test_tuple\nend","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/#*Named-tuples*","page":"Julia para Cientistas","title":"Named tuples","text":"","category":"section"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Esta extensão à Tuples adiciona a possibilidade de acesso aos componentes por um nome no lugar de um simples índice – que continua funcional como veremos abaixo. Esse tipo de estrutura é bastante útil quando necessitamos criar abstrações de coisas bastante simples para as quais a criação de um novo tipo não se justifica. Discutiremos mais tarde quando vamos estudar a criação de novos tipos.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"named_languages = (julia = \"Julia\", python = \"Python\")","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Observe o fato de que agora os nomes utilizados no índex fazem parte do tipo.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"typeof(named_languages)","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Abaixo verificamos que além do acesso por nomes, NamedTuples também respeitam a ordem de declaração dos elementos: :julia é o primeiro índice. A sintaxe de acesso aos elementos neste caso é com a notação típica utilizando um ponto, comum a diversas linguages de programação.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"named_languages[1] == named_languages.julia","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/#Dicionários","page":"Julia para Cientistas","title":"Dicionários","text":"","category":"section"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Objetos do tipo Dict possuem a similaridade com NamedTuples em que seus elementos podem ser acessados por nome. No entanto a sintaxe é diferente e os valores desta estrutura são mutáveis.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"organs = Dict(\"brain\" => \"🧠\", \"heart\" => \"❤\")","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"O acesso a elementos se faz com colchetes contendo o índex como se segue:","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"organs[\"brain\"]","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"E como dissemos, os elementos são mutáveis: vamos atribuir um burrito ao cérebro.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"organs[\"brain\"] = \"🌯\"","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Não só os elementos, mas o dicionário como um todo, pode ser alterado. Para adicionar novos elementos simplesmente acessamos a palavra-chave e atribuímos um valor:","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"organs[\"eyes\"] = \"👀\"","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Internamente para evitar nova alocação de memória a cada tentativa de se adicionar um novo elemento, um dicionário realiza a alocação de slots que são renovados cada vez que sua capacidade é ultrapassada. Observe que a lista retornada abaixo é composta majoritariamente de 0x00, que é o endereço de memória nulo, enquanto 3 elementos indicam um valor não-nulo, correspondendo aos elementos já adicionados ao dicionário. Disto vemos que adicionalmente um dicionário não preserva necessariamente uma sequência ordenada. Esses detalhes ultrapassam o presente escopo mas vão abrindo as portas para assuntos mais complexos.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"organs.slots\norgans","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Para remover elementos utilizamos a função pop!. Por convenção em Julia, funções que terminam por um ponto de exclamação modificam os argumentos que são passados. No caso de pop! o dicionário é modificado e o valor de retorno é aquele do elemento removido.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"pop!(organs, \"brain\")","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"A tentativa de remover um elemento inexistente obviamente conduz à um erro:","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"try\n pop!(organs, \"leg\")\ncatch err\n println(\"Erro: $(err)\")\nend\norgans","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Para evitar essa possibilidade podemos usar a função haskey().","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"haskey(organs, \"liver\")","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Uma última coisa a notar é que praticamente qualquer tipo básico pode ser empregado como a chave de um dicionário em Julia. Veja o exemplo à seguir:","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"music = Dict(:violin => \"🎻\", 1 => 2)","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Como as chaves são de tipos diferentes (um Symbol e um Int64), assim como os valores (uma String e um Int64), a função typeof() nos retorna tipos Any.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"typeof(music)","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Ainda nos restam alguns detalhes e tipos de dados, mas o tutorial começa a ficar longo... e não queremos te perder por aqui!","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/#Parte-4-Estruturas-de-dados-II","page":"Julia para Cientistas","title":"Parte 4 - Estruturas de dados II","text":"","category":"section"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Neste notebook estudamos a sequência de estruturas de dados básicas iniciada no precedente. O foco aqui são tipos úteis em cálculo numérico e álgebra linear, embora suas aplicação vaiam muito além.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/#*Arrays*","page":"Julia para Cientistas","title":"Arrays","text":"","category":"section"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"A estrutura Array se diferencia de Tuple pelo fato de ser mutável e de Dict pela noção de ordem. Dadas essas características não é surpreendente que seja esse o tipo de base sobre o qual Julia constrói vetores e matrizes, embora um Array seja mais genérico que esses conceitos matemáticos. Podemos, por exemplo, construir um Array contendo sub-Array's de tamanho variável, o que não constituiria uma matriz. Ou então misturar tipos de dados nos elementos de um Array, como mostramos ser possível com Tuple.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Em termos de sintaxe, usamos nesse caso colchetes [] para limitar a sequência.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Considere por exemplo a seguinte lista de países...","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"countries = [\"France\", \"Brazil\", \"Germany\"]","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"...ou então de números,...","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"numbers = [1, 2, 3.1]","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"..., ou simplesmente informações pessoais.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"personal_info = [\"Walter\", 34, \"Lyon\"]","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"O acesso a elementos se faz através de índices, como em Tuple.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"personal_info[2]","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Como essa estrutura é mutável ela suporta – entre muitos outros – o método push!() para se adicionar um elemento após o último.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"push!(personal_info, \"Engineer\")","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"De maneira similar ao que vimos para Dict, uma implementação de pop!() é disponível para o tipo Array, realizando a operação inversa de push!().","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"pop!(personal_info)","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"O exemplo de uma não-matriz citado na introdução é apresentado a seguir.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"not_a_matrix = [[1, 2, 3], [4, 5], [6, 7, 8, 9]]","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Usando typeof() descobrimos que se trata de um Vector de Vector e que na verdade Julia usa Vector com um alias para um Array{T, 1}, aonde T denota o tipo de dado.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"typeof(not_a_matrix)","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"A função rand() pode ser usada para criar uma matriz de números aleatórios – e outras estruturas de ordem superior – como se segue. Observe o tipo Matrix{Float64} indicado.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"a_matrix = rand(3, 3)","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Repetindo a verificação de tipo como fizemos para of vetor de vetores anteriormente, descobrimos que uma Matrix em Julia não é interpretada da mesma maneira, mas como um Array com duas dimensões. Isso é a forma que a linguagem emprega para assegurar as dimensões constantes segundo cada direção da matriz.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"typeof(a_matrix)","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Vamos agora atribuir nossa a_matrix à uma outra variável e então modificar a matrix original.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"maybe_another_matrix = a_matrix\na_matrix[1, 1] = 999\na_matrix","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Tal como para a Tuple com objetos mutáveis, atribuir um novo nome à uma matriz não cria uma nova matriz, apenas referencia o seu endereço de memória: observamos abaixo que a tentativa de cópia maybe_another_matriz também é modificada em razão da operação sobre a_matrix.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"maybe_another_matrix","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Quando uma cópia da matriz é necessária devemos utilizar copy(). Nas próximas células criamos uma matriz e então uma cópia, a qual é modificada, e verificamos não haver impacto na matriz original, validando a cópia em um novo endereço de memória.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"another_matrix = rand(2, 2)\nagain_a_matrix = copy(another_matrix)\nagain_a_matrix[1, 2] = 0\nagain_a_matrix\nanother_matrix","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/#*Ranges*","page":"Julia para Cientistas","title":"Ranges","text":"","category":"section"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Julia implementa uma variedade de tipos de ranges, iteradores para enumerações ou números espaçados segundo uma regra definida. Os tipos existentes encontram-se documentados em collections. O leitor pode interessar-se também pela função mais genérica range da biblioteca padrão.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Vamos começar com a declaração de um UnitRange de números 1 à 10 que pode ser construido com a sintaxe simplificada abaixo.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"range_of_numbers = 1:10","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Confirmamos que trata-se de um UnitRange especializado para o tipo inteiro da arquitetura do computador, 64-bits, tal como o tipo dos elementos usados na construção.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"typeof(range_of_numbers)","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Essa sintaxe mostrada acima é simplesmente um syntatic sugar para a chamada do construtor padrão deste tipo, como averiguamos na próxima célula.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"UnitRange(1, 10)","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Uma particularidade da sequência criada é que ela não é expandida na memória, mas tão somente a regra de construção para iteração é definida. Verificamos na próxima célula que esta sequência não possui os elementos que esperaríamos.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"range_of_numbers","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Isso é fundamental para se permitir laços de tamanhos enormes, frequentes em computação científica; pode-se, por exemplo, criar uma sequência inteira entre 1 e o máximo valor possível para o tipo Int64:","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"1:typemax(Int64)","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Para se expandir a sequência devemos coletar seus valores com collect:","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"arr = collect(range_of_numbers)","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"O resultado dessa operação é um Vector especializado no tipo usado para a sequência.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"typeof(arr)","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"A inserção de um elemento adicional na sintaxe do tipo start:step:end permite a criação de sequências com um passo determinado. Abaixo usamos um passo de tipo Float64 que por razões de precedência numérica vai gerar uma sequência de tipo equivalente, como verificamos no que se segue.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"float_range = 0:0.6:10\ntypeof(float_range)","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Acima utilizamos um passo de 0.6 para ilustrar uma particularidade do tipo StepRangeLen que não inclui o último elemento da sequência caso esse não seja um múltiplo inteiro do passo utilizado, de maneira a assegurar que todos os elementos sejam igualmente espaçados.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"collect(float_range)","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Finalmente, Julia provê LinRange, que será bastante útil para aqueles interessados em métodos numéricos de tipo diferenças finitas ou volumes finitos. Criamos um LinRange fornecendo os limites do intervalo e o número de elementos igualmente espaçados a retornar.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"LinRange(1.0, 10.0, 10)","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/#Atribuição-de-tipos","page":"Julia para Cientistas","title":"Atribuição de tipos","text":"","category":"section"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Até o momento criamos objetos em Julia sem anotar os tipos de dados requeridos. O compilador de Julia realiza inferência de tipos de maneira bastante avançada para determinar como especializar funções para as entradas dadas. Prover explicitamente tipos, principalmente em interfaces de funções, como veremos no futuro, é altamente recomendável e evita dores de cabeça quanto a validação de um programa quando este ganha em complexidade. Ademais, para computação numérica e aprendizado de máquina, a especificação de tipos tem implicação direta sobre a precisão e performance dos cálculos. É comum, por exemplo, treinar-se redes neurais com dados truncados à Float32, tipo que apresenta performance optimizada nas GPU's específicas deste ramo, enquanto um cálculo DEM (Discrete Element Method) de colisão de partículas necessida dados Float64 (e uma carta gráfica de alto nível adaptada) para prover resultados realistas.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Em Julia especificamos tipos com a sintaxe a::TipoDeA. Isso é valido para variáveis quaisquer, elementos de estruturas de dados, interfaces de funções, etc. Por exemplo, declaremos a seguinte variável:","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"a::Float32 = 1\ntypeof(a)","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Anotamos o tipo Float32 para a variável a. No entanto o argumento à direita do sinal de atribuição é um inteiro 1. Se deixássemos a descoberta de tipos ao compilador, neste caso obteríamos:","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"a = 1\ntypeof(a)","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Esse resultado pode ser indesejável e incompatível com a interface de alguma função aonde desejamos empregar o valor de a.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Vejamos agora alguns exemplos do impacto no tempo de execução de se prover valores ao lado direito da igualdade adaptados aos tipos esperados na especificação de dados. Vamos usar os ranges que aprendemos logo acima e collect para criar um Vector{Int64}.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"note: Uso de macros\nA macro @benchmark vai executar o código algumas vezes e retornar estatísticas de execução. Não se preocupe com ela por agora, vamos voltar na temática de benchmarking muito em breve.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"# using BenchmarkTools, Statistics\n# @benchmark a::Vector{Int64} = collect(1:10)","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Vemos que o tempo de execução é da ordem de 30 ns. Abaixo repetimos essa avaliação para algumas ordens de grandeza de tamanho de arrays. Vemos que o tempo de execução para a criação dos objetos escala com o logaritmo na base 10 do número de elementos.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"#scalability = [\n# mean((@benchmark a::Vector{Int64} = collect(1:10^1)).times)\n# mean((@benchmark a::Vector{Int64} = collect(1:10^2)).times)\n# mean((@benchmark a::Vector{Int64} = collect(1:10^3)).times)\n# mean((@benchmark a::Vector{Int64} = collect(1:10^4)).times)\n#]\n#log10.(scalability)","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Tentemos agora criar um vetor de Float64 usando o mesmo método.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"#@benchmark a::Vector{Float64} = collect(1:10)","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"O tempo de execução mais que dobrou e a memória estimada foi multiplicada por dois! Isso ocorre porque ao lado direito da expressão fornecemos números inteiros e o compilador é obrigado a incluir uma etapa de conversão de tipos, o que adiciona operações e alocações de memória.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Se na criação do range utilizarmos o tipo esperado de dados voltamos a linha de base da alocação do vetor de inteiros, da ordem de 30 ns e 144 bytes.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"#@benchmark b::Vector{Float64} = collect(1.0:10.0)","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Repetimos o benchmark para comparar a criação de vetores de dupla-precisão inicializados por inteiros e números de dupla precisão. Incluímos no novo benchmark um vetor com um único elemento para entendermos um pouco mais do processo.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"# with_conversion = let\n# scalability = [\n# mean((@benchmark a::Vector{Float64} = collect(1:10^0)).times)\n# mean((@benchmark a::Vector{Float64} = collect(1:10^1)).times)\n# mean((@benchmark a::Vector{Float64} = collect(1:10^2)).times)\n# mean((@benchmark a::Vector{Float64} = collect(1:10^3)).times)\n# ]\n# scalability\n# end","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"# without_conversion = let\n# scalability = [\n# mean((@benchmark a::Vector{Float64} = collect(1.0:10.0^0)).times)\n# mean((@benchmark a::Vector{Float64} = collect(1.0:10.0^1)).times)\n# mean((@benchmark a::Vector{Float64} = collect(1.0:10.0^2)).times)\n# mean((@benchmark a::Vector{Float64} = collect(1.0:10.0^3)).times)\n# ]\n# scalability\n# end","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"O vetor with_conversion contém os tempos de execução para a criação de vetores de 1, 10, 100, 1000 e 10000 elementos com conversão de valores de inteiros para dupla-precisão. Observe que os dois primeiros elementos levaram um tempo (aqui em nano-segundos) quase idênticos: existe uma constante de tempo da criação do vetor propriamente dito, a criação dos 10 primeiros elementos é quase negligível nesse caso.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Abaixo calculamos a diferença de tempo entre os dois processos e nos deparamos com mais uma surpresa: para 100 elementos, o tempo de alocação COM conversão é MENOR que o tempo SEM conversão. Ainda é muito cedo e fora de contexto para entrarmos no código LLVM gerado por Julia para entendermos a razão dessa anomalia. O importante a reter aqui é que para vetores de tamanhos importantes (> 1000 elementos) um tempo adicional de execução é adicionado por elemento e isso deve ser levado em conta quando escrevendo código científico.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"# time_diff = (without_conversion - with_conversion)\n# time_diff_per_element = time_diff ./ [10^k for k = 0:3]","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Espero que a decisão de incluir essas divagações um pouco cedo no aprendizado não sejam deletérias para a motivação do estudante, mas que criem curiosidade quanto aos tópicos mais avançados que veremos mais tarde.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Ainda falta muito para se concluir a introdução à atribuição de tipos, mas esse primeiro contato era necessário para que as próximos tópicos avancem de maneira mais fluida.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/#Parte-5-Laços-e-condicionais","page":"Julia para Cientistas","title":"Parte 5 - Laços e condicionais","text":"","category":"section"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/#Parte-6-Funções-e-despacho","page":"Julia para Cientistas","title":"Parte 6 - Funções e despacho","text":"","category":"section"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/#Parte-7-Pacotes-e-ecossistema","page":"Julia para Cientistas","title":"Parte 7 - Pacotes e ecossistema","text":"","category":"section"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/#Parte-8-Avaliando-performance","page":"Julia para Cientistas","title":"Parte 8 - Avaliando performance","text":"","category":"section"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/#Parte-9-Álgebra-linear","page":"Julia para Cientistas","title":"Parte 9 - Álgebra linear","text":"","category":"section"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/#Parte-10-Expressões-regulares","page":"Julia para Cientistas","title":"Parte 10 - Expressões regulares","text":"","category":"section"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/#Parte-11-Execução-concorrente","page":"Julia para Cientistas","title":"Parte 11 - Execução concorrente","text":"","category":"section"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/#Parte-12-Trabalhando-com-arquivos","page":"Julia para Cientistas","title":"Parte 12 - Trabalhando com arquivos","text":"","category":"section"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/#Parte-13-Bibliotecas-gráficas","page":"Julia para Cientistas","title":"Parte 13 - Bibliotecas gráficas","text":"","category":"section"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/#Parte-14-Gráficos-para-publicações","page":"Julia para Cientistas","title":"Parte 14 - Gráficos para publicações","text":"","category":"section"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/#Parte-15-Tipos-e-estruturas","page":"Julia para Cientistas","title":"Parte 15 - Tipos e estruturas","text":"","category":"section"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/#Parte-16-Metaprogramação","page":"Julia para Cientistas","title":"Parte 16 - Metaprogramação","text":"","category":"section"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/#Parte-17-Interoperação-com-C","page":"Julia para Cientistas","title":"Parte 17 - Interoperação com C","text":"","category":"section"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/#Criando-conteúdos","page":"Julia para Cientistas","title":"Criando conteúdos","text":"","category":"section"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Weave\nFranklin\nPluto\nQuarto","category":"page"},{"location":"References/@Arthurs2021a/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Arthurs2021a/","page":"-","title":"-","text":"title: Active training of physics-informed neural networks to aggregate and interpolate parametric solutions to the Navier-Stokes equations authors: Christopher J. Arthurs, Andrew P. King year: 2021 URL: https://doi.org/10.1016/j.jcp.2021.110364 Drive: https://1drv.ms/b/s!Ar4x-UlrYAiZla8i8cvFX_ZGzT6Z9A?e=MJdHtJ –-","category":"page"},{"location":"References/@Amsden1989/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Amsden1989/","page":"-","title":"-","text":"title: \"KIVA-II: A computer program for chemically reactive flows with sprays\" authors: A. A. Amsden, P. J. O'Rourke, T. D. Butler year: 1989 URL: https://doi.org/10.2172/6228444 –- Also check Liu1993 [14] (in OpenFOAM generalization to distortedSphereDrag).","category":"page"},{"location":"References/@Fiedler2009a/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Fiedler2009a/","page":"-","title":"-","text":"title: \"Computed tomography based finite element analysis of the thermal properties of cellular aluminium\" authors: T. Fiedler, E. Solórzano, F. Garcia‐Moreno, A. Öchsner, I. V. Belova, G. E. Murch year: 2009 –-","category":"page"},{"location":"Notes/OpenFOAM-Cases/","page":"Excalidraw Data","title":"Excalidraw Data","text":"","category":"page"},{"location":"Notes/OpenFOAM-Cases/","page":"Excalidraw Data","title":"Excalidraw Data","text":"excalidraw-plugin: parsed tags: [excalidraw]","category":"page"},{"location":"Notes/OpenFOAM-Cases/","page":"Excalidraw Data","title":"Excalidraw Data","text":"","category":"page"},{"location":"Notes/OpenFOAM-Cases/","page":"Excalidraw Data","title":"Excalidraw Data","text":"==⚠ Switch to EXCALIDRAW VIEW in the MORE OPTIONS menu of this document. ⚠==","category":"page"},{"location":"Notes/OpenFOAM-Cases/#Excalidraw-Data","page":"Excalidraw Data","title":"Excalidraw Data","text":"","category":"section"},{"location":"Notes/OpenFOAM-Cases/#Text-Elements","page":"Excalidraw Data","title":"Text Elements","text":"","category":"section"},{"location":"Notes/OpenFOAM-Cases/","page":"Excalidraw Data","title":"Excalidraw Data","text":"multicomponentFluid ^qRsrcDcj","category":"page"},{"location":"Notes/OpenFOAM-Cases/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Combustion ^1jpkNYY8","category":"page"},{"location":"Notes/OpenFOAM-Cases/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Evaporation ^XEtNIadD","category":"page"},{"location":"Notes/OpenFOAM-Cases/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Liquids ^kKIsmNw6","category":"page"},{"location":"Notes/OpenFOAM-Cases/","page":"Excalidraw Data","title":"Excalidraw Data","text":"aachenBomb ^7VdZntsW","category":"page"},{"location":"Notes/OpenFOAM-Cases/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Kinetics ^W2TJAmjK","category":"page"},{"location":"Notes/OpenFOAM-Cases/","page":"Excalidraw Data","title":"Excalidraw Data","text":"nc7h16 ^huP8tzYR","category":"page"},{"location":"Notes/OpenFOAM-Cases/","page":"Excalidraw Data","title":"Excalidraw Data","text":"parcelInBox ^3cqsiZ1f","category":"page"},{"location":"Notes/OpenFOAM-Cases/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Solids ^CoCpr3fT","category":"page"},{"location":"Notes/OpenFOAM-Cases/","page":"Excalidraw Data","title":"Excalidraw Data","text":"simplifiedSiwek ^Fsq6al0O","category":"page"},{"location":"Notes/OpenFOAM-Cases/","page":"Excalidraw Data","title":"Excalidraw Data","text":"verticalChannel ^FVJsO16x","category":"page"},{"location":"Notes/OpenFOAM-Cases/","page":"Excalidraw Data","title":"Excalidraw Data","text":"verticalChannelLTS ^QNoyohaC","category":"page"},{"location":"Notes/OpenFOAM-Cases/","page":"Excalidraw Data","title":"Excalidraw Data","text":"verticalChannelSteady ^iAVhia6P","category":"page"},{"location":"Notes/OpenFOAM-Cases/","page":"Excalidraw Data","title":"Excalidraw Data","text":"%%","category":"page"},{"location":"Notes/OpenFOAM-Cases/#Drawing","page":"Excalidraw Data","title":"Drawing","text":"","category":"section"},{"location":"Notes/OpenFOAM-Cases/","page":"Excalidraw Data","title":"Excalidraw Data","text":"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","category":"page"},{"location":"Notes/OpenFOAM-Cases/","page":"Excalidraw Data","title":"Excalidraw Data","text":"%%","category":"page"},{"location":"Science/02-Computational-Physics/#Computational-Physics","page":"Computational Physics","title":"Computational Physics","text":"","category":"section"},{"location":"Science/02-Computational-Physics/#Molecular-Dynamics-(MD)","page":"Computational Physics","title":"Molecular Dynamics (MD)","text":"","category":"section"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"The Materials Project has many interesting for those working on MD and especially DFT. Theoretical basis can be found in the work by Hinchliffe which maybe will require some refreshing on the The Feynman Lectures on Physics to be followed.","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"Since molecular dynamics is a field essentially related to simulation (there is no MD without simulation!), it is worth listing the major open source projects related to the field, LAMMPS, ESPReSo, and Gromacs. Other interesting projects include HOOMD and the popular NAMD; I have refrained from the last given its greedy licensing scheme. My studies are currently focused in LAMMPS because its fields of application and system portability.","category":"page"},{"location":"Science/02-Computational-Physics/#Density-Functional-Theory-(DFT)","page":"Computational Physics","title":"Density Functional Theory (DFT)","text":"","category":"section"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"Abinit webpage\nBigDFT\nCP2K\nDalton/LSDalton\nDIRAC webpage\nFLEUR webpage\nQuantum Espresso webpage\nSiesta\nYambo","category":"page"},{"location":"Science/02-Computational-Physics/#Finite-Element-Method","page":"Computational Physics","title":"Finite Element Method","text":"","category":"section"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"Personal path towards mastering finite element method (FEM).","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"The goal of this repository is to track my learning path of finite element method. As a secondary goal, all tools included in the study must be open source with a permissive license. Finally, I will study again some subjects related to the physics of applied problems that will be solved through FEM.","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"
It is not my first time trying this and I learned a few things in the past failures. Below I expose my reasoning about the choices I make today for structuring this repository and its future.
","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"During my college years I almost neglected solid mechanics and statics. It happens that most quality materials for learning FEM are applied to structural analysis (because that is the most import numerical method in that field). Because my applied work is mostly related to fluids and heat transfer, doing some bibliographic research I found the books by Lewis et al. and its newer edition by Nithiarasu et al. adapted to my expertise level.\nFrom a mathematical standpoint the most accessible material I have studied so far is the draft book by H. P. Langtangen and K.-A. Mardal. Unfortunatelly the main author deceased just after the release of the final draft and the material remained unfinished. That is not really a blocking point because the content is pretty much finished from a non-specialist standpoint. Furthermore, its exercises where converted into notebooks by Mojtaba Barzegari and the material is quite accessible.\nDuring the years I have tested several FEM packages and libraries. The most promissing FEM package in the open source world is certainly FEniCSx, but it comes with the disadvantage of requiring Linux/WSL and having an unclear documentation. In terms of power I couldn't find anything comparable to MOOSE - if you see the list of developer labs it becomes pretty clear why - but it is something to experienced FEM users since it requires low level implementation of the problems in C++. Elmer could be a candidate package for learning the practice, but for going into the mathematics of FEM it is not the right tool. Next comes Kratos but its documentation is messy and things moved around too much over the years. Finally we have FreeFEM++. It is a pretty old software what means that it outlived most of the other applications and now is very stable. What is interesting about FreeFEM++ is its portability across operating systems and good documentation. In what follows I will stick with FreeFEM++ and later with FEniCSx.\nLearning a numerical method for continuum mechanics is essentially useless without the capacity to apply it to real world geometries. Unfortunatelly the field of open source CAD is very poor so we have just a few options. Although Gmsh is pretty powerfull with respect to its meshing capabilities, conceiving the geometry with the software can quickly scale to trigonometry hell level. I have been using the software for many years for 2D cases but systematically fall back to proprietary software when things become complex. In this study I intend to reach a sorcerer Gmsh mastery level. It can be complemented by STL files generation with Blender or CAD in FreeCAD.\nAdvanced post-processing is also a must, so we will also follow some tutorials to improve ParaView skills.","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"
","category":"page"},{"location":"Science/02-Computational-Physics/#Software-version","page":"Computational Physics","title":"Software version","text":"","category":"section"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"While doing such an ambitious study, it is important to stick with software versions.","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"In what follows we will be using exclusivelly the following software:","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"Gmsh 4.11.1\nFreeFEM++ 4.13\nParaView 5.10.1\nFreeCAD 0.21.1\nBlender 4.0.2","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"Processing utilities in Julia and/or Python will have their own versioning so they are not reported here.","category":"page"},{"location":"Science/02-Computational-Physics/#Study-planning","page":"Computational Physics","title":"Study planning","text":"","category":"section"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"Because it can become frustrating to progress in the study and not be able to apply the knowledge to real cases, we will start by growing competencies in geometry and meshing before entering the mathematical and software aspects. Planning is idealized in a weekly basis.","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"Because of its simpler format, Nithiarasu's book is followed at a faster pace than Langtangen's. At some point the subjects being studied at Langtangen's book will become a review and deepening of previously studied subjects.","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"For materials that were not cited above, here follow the links:","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"Engineering Statics | Lectures\nIntro to Continuum Mechanics | Seminars\nSolid Mechanics | Theory\nIntro to the Finite Element Method | Lectures","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"The book series by O.C. Zienkiewicz and collaborators will be included later since its in depth and general approach trespasses my current capacity on how to organize their study. After learning the basics over the next months I hope to be able to skecth a learning strategy to go over those books and feed this time-line.","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"Complementary studies to take at any time during the series:","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"The first 4 videos of this playlist.\nThe first 5 videos of this playlist.\nThis video and the sequence (no playlist created).\nThis video with a full Gmsh introduction.","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"Review and in-depth studies for solidification of knowledge:","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"Continuum physics\nIntroduction to finite element methods\nWolfgang Bangerth's video lectures","category":"page"},{"location":"Science/02-Computational-Physics/#Week-1","page":"Computational Physics","title":"Week 1","text":"","category":"section"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"[ ] Follow 21 tutorials provided with Gmsh\n[x] Follow this short course on FreeCAD.\n[x] Follow this tutorial on FreeFEM without practicing.\n[x] Nithiarasu (2016), chapters 1 and 2\n[x] Langtangen (2016), chapters 1 and 2 (1/3)\n[ ] Barzegari's notebook associated to Langtangens chapter 1\n[ ] Engineering Statics | Lectures videos 1 to 10\n[ ] Intro to the Finite Element Method | Lectures 1","category":"page"},{"location":"Science/02-Computational-Physics/#Week-2","page":"Computational Physics","title":"Week 2","text":"","category":"section"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"[ ] Nithiarasu (2016), chapter 3 (1/2)\n[ ] Langtangen (2016), chapter 2 (2/3) \n[ ] FreeFEM++ guided tutorials 2.1 to 2.9\n[ ] Engineering Statics | Lectures videos 11 to 14\n[ ] Solid Mechanics | Theory (all at once)\n[ ] Intro to Continuum Mechanics | Seminars 1\n[ ] Intro to the Finite Element Method | Lectures 2","category":"page"},{"location":"Science/02-Computational-Physics/#Week-3","page":"Computational Physics","title":"Week 3","text":"","category":"section"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"[ ] Nithiarasu (2016), chapter 3 (2/2)\n[ ] Langtangen (2016), chapter 2 (3/3) \n[ ] Barzegari's notebook associated to Langtangens chapter 2\n[ ] FreeFEM++ guided tutorials 2.10 to 2.13\n[ ] Engineering Statics | Lectures videos 15 to 18\n[ ] Intro to Continuum Mechanics | Seminars 2\n[ ] Intro to the Finite Element Method | Lectures 3","category":"page"},{"location":"Science/02-Computational-Physics/#Week-4","page":"Computational Physics","title":"Week 4","text":"","category":"section"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"[ ] Nithiarasu (2016), chapter 4\n[ ] Langtangen (2016), chapter 3 (1/5) \n[ ] FreeFEM++ guided tutorials 2.14 to 2.19\n[ ] Engineering Statics | Lectures videos 19 to 22\n[ ] Intro to Continuum Mechanics | Seminars 3\n[ ] Intro to the Finite Element Method | Lectures 4\n[ ] Follow these ParaView tutorials.","category":"page"},{"location":"Science/02-Computational-Physics/#Week-5","page":"Computational Physics","title":"Week 5","text":"","category":"section"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"[ ] Nithiarasu (2016), chapter 5\n[ ] Langtangen (2016), chapter 3 (2/5) \n[ ] Engineering Statics | Lectures videos 23 to 24\n[ ] Intro to Continuum Mechanics | Seminars 4\n[ ] Intro to the Finite Element Method | Lectures 5\n[ ] Follow these ParaView tutorials.","category":"page"},{"location":"Science/02-Computational-Physics/#Week-6","page":"Computational Physics","title":"Week 6","text":"","category":"section"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"[ ] Nithiarasu (2016), chapter 6\n[ ] Langtangen (2016), chapter 3 (3/5) \n[ ] Intro to Continuum Mechanics | Seminars 5\n[ ] Intro to the Finite Element Method | Lectures 6\n[ ] Follow this ParaView seminar.","category":"page"},{"location":"Science/02-Computational-Physics/#Week-7","page":"Computational Physics","title":"Week 7","text":"","category":"section"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"[ ] Nithiarasu (2016), chapter 7 (1/3)\n[ ] Langtangen (2016), chapter 3 (4/5) \n[ ] Intro to Continuum Mechanics | Seminars 6\n[ ] Intro to the Finite Element Method | Lectures 7\n[ ] Follow this ParaView seminar.","category":"page"},{"location":"Science/02-Computational-Physics/#Week-8","page":"Computational Physics","title":"Week 8","text":"","category":"section"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"[ ] Nithiarasu (2016), chapter 7 (2/3)\n[ ] Langtangen (2016), chapter 3 (5/5) \n[ ] Barzegari's notebook associated to Langtangens chapter 3\n[ ] Intro to Continuum Mechanics | Seminars 7\n[ ] Intro to the Finite Element Method | Lectures 8\n[ ] Follow this ParaView seminar.","category":"page"},{"location":"Science/02-Computational-Physics/#Week-9","page":"Computational Physics","title":"Week 9","text":"","category":"section"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"[ ] Nithiarasu (2016), chapter 7 (3/3)\n[ ] Langtangen (2016), chapter 4 (1/2) \n[ ] Intro to Continuum Mechanics | Seminars 8\n[ ] Intro to the Finite Element Method | Lectures 9\n[ ] Follow this ParaView seminar.","category":"page"},{"location":"Science/02-Computational-Physics/#Week-10","page":"Computational Physics","title":"Week 10","text":"","category":"section"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"[ ] Nithiarasu (2016), chapter 8\n[ ] Langtangen (2016), chapter 4 (2/2) \n[ ] Barzegari's notebook associated to Langtangens chapter 4\n[ ] Intro to Continuum Mechanics | Seminars 9\n[ ] Intro to the Finite Element Method | Lectures 10\n[ ] Follow this ParaView seminar.","category":"page"},{"location":"Science/02-Computational-Physics/#Week-11","page":"Computational Physics","title":"Week 11","text":"","category":"section"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"[ ] Follow 7 extended tutorials provided with Gmsh (Python)\n[ ] Nithiarasu (2016), chapter 9\n[ ] Langtangen (2016), chapter 5 (1/3) \n[ ] Intro to Continuum Mechanics | Seminars 10\n[ ] Follow this ParaView seminar.","category":"page"},{"location":"Science/02-Computational-Physics/#Week-12","page":"Computational Physics","title":"Week 12","text":"","category":"section"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"[ ] Nithiarasu (2016), chapter 10\n[ ] Langtangen (2016), chapter 5 (2/3) ","category":"page"},{"location":"Science/02-Computational-Physics/#Week-13","page":"Computational Physics","title":"Week 13","text":"","category":"section"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"[ ] Nithiarasu (2016), chapter 11\n[ ] Langtangen (2016), chapter 5 (3/3) \n[ ] Barzegari's notebook associated to Langtangens chapter 5","category":"page"},{"location":"Science/02-Computational-Physics/#Week-14","page":"Computational Physics","title":"Week 14","text":"","category":"section"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"[ ] Nithiarasu (2016), chapter 12\n[ ] Langtangen (2016), chapter 6 (1/2) ","category":"page"},{"location":"Science/02-Computational-Physics/#Week-15","page":"Computational Physics","title":"Week 15","text":"","category":"section"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"[ ] Nithiarasu (2016), chapter 13\n[ ] Langtangen (2016), chapter 6 (2/2) \n[ ] Barzegari's notebook associated to Langtangens chapter 6","category":"page"},{"location":"Science/02-Computational-Physics/#Week-16","page":"Computational Physics","title":"Week 16","text":"","category":"section"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"[ ] Nithiarasu (2016), chapter 14 and 15\n[ ] Langtangen (2016), chapter 7 \n[ ] Barzegari's notebook associated to Langtangens chapter 7","category":"page"},{"location":"Science/02-Computational-Physics/#Week-17","page":"Computational Physics","title":"Week 17","text":"","category":"section"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"[ ] Langtangen (2016), chapter 8\n[ ] Barzegari's notebook associated to Langtangens chapter 8","category":"page"},{"location":"Science/02-Computational-Physics/#Week-18","page":"Computational Physics","title":"Week 18","text":"","category":"section"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"[ ] Langtangen (2016), chapter 9 (1/4)","category":"page"},{"location":"Science/02-Computational-Physics/#Week-19","page":"Computational Physics","title":"Week 19","text":"","category":"section"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"[ ] Langtangen (2016), chapter 9 (2/4)","category":"page"},{"location":"Science/02-Computational-Physics/#Week-20","page":"Computational Physics","title":"Week 20","text":"","category":"section"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"[ ] Langtangen (2016), chapter 9 (3/4)","category":"page"},{"location":"Science/02-Computational-Physics/#Week-21","page":"Computational Physics","title":"Week 21","text":"","category":"section"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"[ ] Langtangen (2016), chapter 9 (4/4)\n[ ] Barzegari's notebook associated to Langtangens chapter 9","category":"page"},{"location":"Science/02-Computational-Physics/#Week-22","page":"Computational Physics","title":"Week 22","text":"","category":"section"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"[ ] Langtangen (2016), chapter 10","category":"page"},{"location":"Science/02-Computational-Physics/#Week-23","page":"Computational Physics","title":"Week 23","text":"","category":"section"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"[ ] Langtangen (2016), chapter 11","category":"page"},{"location":"Science/02-Computational-Physics/#Finite-Volume-Method","page":"Computational Physics","title":"Finite Volume Method","text":"","category":"section"},{"location":"Science/02-Computational-Physics/#Formulations-of-heat-conduction","page":"Computational Physics","title":"Formulations of heat conduction","text":"","category":"section"},{"location":"Science/02-Computational-Physics/#Temperature-formulation","page":"Computational Physics","title":"Temperature formulation","text":"","category":"section"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"Before attempting to derive heat conduction equation in terms of enthalpy, it is worth warming up with its handling in temperature formulation. In this case, the equation is solved directly in terms of temperature as dependent variable which is also used in the governing potential (Fourier's law). This simple case is applicable to many engineering problems. First we formulate the problem with constant thermophysical properties before proceeding to variable density and specific heat.","category":"page"},{"location":"Science/02-Computational-Physics/#Constant-thermophysical-properties","page":"Computational Physics","title":"Constant thermophysical properties","text":"","category":"section"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"Heat equation formulated with temperature as dependent variable applied to constant density rho and specific heat c_p can be stated as:","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"rhoc_pfracpartialTpartialt=nablacdotp(knablaT)","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"Applying the divergence operator to the right hand side to a single coordinate and expanding the gradient term for different coordinate systems (cartesian, cylindrical, and spherical) leads to the following expressions. Notice that coordinate was expressed as r even in cartesian coordinates for homogeneity of notation in what follows.","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"rhoc_pdfracpartialTpartialt=begincases\ndfracpartialpartialr\nleft(kdfracpartialTpartialrright) textcartesian12pt\n\ndfrac1rdfracpartialpartialr\nleft(rkdfracpartialTpartialrright) textcylindrical12pt\n\ndfrac1r^2dfracpartialpartialr\nleft(r^2kdfracpartialTpartialrright) textspherical\nendcases","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"Stated this way the problem can be reformulated with a simpler notation as","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"rhoc_pdfracpartialTpartialt=\ndfrac1betadfracpartialpartialr\nleft(betakdfracpartialTpartialrright)\nqquadtextwhereqquadbeta=\nbegincases\n1 textcartesian12pt\n\nr textcylindrical12pt\n\nr^2 textspherical\nendcases","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"To proceed with the finite volume discretization we perform the integration of both sides of the equation over the relevant variables. The order of integration is chosen according to the nature of the derivative term, as discussed by Patankar1980 [24]. Care must be taken in the definition of the space integration - which is non-trivial in cylindrical and spherical coordinates systems - and must be carried over the differential volume dV.","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"int_Vint_0^tau\nrhoc_pdfracpartialTpartialtdtdV=\nint_0^tauint_V\nfrac1betadfracpartialpartialr\nleft(betakdfracpartialTpartialrright)dVdt","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"dV=\nbegincases\ndrdydz textcartesian12pt\n\nrdrdthetadz textcylindrical12pt\n\nr^2sinphidrdthetadphi textspherical\nendcases","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"The components of volume integration not explicitly appearing in the 1-D differential formulation can be moved out of the integrand. For cartesian coordinates the terms leads to the area of the perpendicular plane; for cylindrical coordinates this corresponds to the azimuth and axial components and integration produces a factor 2piz; lastly, for spherical coordinates we have the polar and azimuth components moved out and a factor 4pi. Since these terms appear in both sides of the equation, they end by cancelling out.","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"Phi=\nbegincases\nA=displaystyleint_0^Zint_0^Ydydz\n textcartesian12pt\n\n2piz=displaystyleint_0^zint_0^2pidthetadz\n textcylindrical12pt\n\n4pi=displaystyleint_0^piint_0^2pisinphidthetadphi\n textspherical\nendcases","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"Applying the remaining component of differential volume to the equations lead to the following expressions. Notice that the meaning of beta is now clear: it is simply the factor multiplying dr in the different coordinate systems. It will make the multiplied factor simplify in the right-hand side and appear back in the left-hand side. You should try performing this step by yourself to get a full insight of what is happening here. So far the equations remain formulated identically.","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"int_s^nint_0^tau\nbetarhoc_pdfracpartialTpartialtdtdr=\ndisplaystyleint_0^tauint_s^n\ndfracpartialpartialr\nleft(betakdfracpartialTpartialrright)drdt","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"In the above expression, instead of integrating over the full domain, we applied limits over the north and south interfaces of a single finite volume cell (logically using a cell-centered formulation). Because beta is not time-dependent, we can effect the integration of the inner term and move out constant terms from the integrals, leading to:","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"rhoc_pleft(T_P^tau-T_P^0right)int_s^nbetadr=\nint_0^tau\nleft(betakfracpartialTpartialrright)biggvert_s^ndt","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"For simplicity, in what follows we use an unbounded first-order approximation scheme for space derivatives, i.e. they are approximated as:","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"fracpartialTpartialrapproxfracT_i+1-T_idelta_ii+1\nqquadtextwhereqquad\ndelta_ii+1=r_i+1-r_i","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"Applying a general Crank-Nicolson Crank1996 [25] scheme we integrate numerically the right-hand side. The weighting factor f introduces the implicit degree: for f=1 we have a fully implicit solution, which f=0 represents a standard Euler integration. It should be self evident that sumf^(I)=1. Notice that the parenthetical superscript notation (I) does not imply exponentiation, but the instant at which the corresponding values are to be evaluated.","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"fracrhoc_ptauleft(T_P^tau-T_P^0right)int_s^nbetadr=\nsum_I=0tau\n\nf^(I)left\n beta_nk_n^(I)fracT_N^(I)-T_P^(I)delta_PN-\n beta_sk_s^(I)fracT_P^(I)-T_S^(I)delta_PS\nright","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"Integration of the remaining space integral is trivial given the definition of beta; to remain generic no matter what coordinate system we introduce the constant gamma. Notice that for cartesian coordinates this corresponds simply to the cell length and for other coordinate systems other relationships associated to cell volume can be interpreted.","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"int_s^nbetadr=fracr_n^gammagamma-fracr_s^gammagamma\nqquadtextwhereqquadgamma=\nbegincases\n1 textcartesian12pt\n\n2 textcylindrical12pt\n\n3 textspherical\nendcases","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"Putting it all together leads to the final expression:","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"fracrhoc_ptauleft(T_P^tau-T_P^0right)\nleft(fracr_n^gammagamma-fracr_s^gammagammaright)=\nsum_I=0tau\nf^Ileft\n beta_nk_n^IfracT_N^I-T_P^Idelta_PN-\n beta_sk_s^IfracT_P^I-T_S^Idelta_PS\nright","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"Some coefficients appearing in the above equations are now grouped. Notice that for thermal conductivity k which is a function of temperature, the corresponding instant (I) temperature must be used for its evaluation. For kappa_j the lower case j represents the evaluation at the interface with control volume J, a very specific notation used here.","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"beginaligned\n alpha_P = fracrhoc_pgammatauleft(r_n^gamma-r_s^gammaright)8pt\n kappa_j = fracbeta_jk_jdelta_PJ\nendaligned","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"Using these definitions the equation can be reworked as:","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"alpha_Pleft(T_P^tau-T_P^0right)=\nsum_I=0tau\nf^(I)left\n kappa_n^(I)left(T_N^(I)-T_P^(I)right)-\n kappa_s^(I)left(T_P^(I)-T_S^(I)right)\nright","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"To get the matrix form of the problem we start by expanding all products. For conciseness we make f=f^(0) and g=f^(tau); also everything that is evaluated at t=tau has the superscript dropped; using these ideas the expression is rewritten as:","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"-fkappa_sT_S+\n(alpha_P+fkappa_n+fkappa_s)T_P\n-fkappa_nT_N\n=\ngkappa_s^(0)T_S^(0)+\n(alpha_P-gkappa_n^(0)-gkappa_s^(0))T_P^(0)+\ngkappa_n^(0)T_N^(0)","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"For the fully implicit time-stepping scheme f=1 the expression reduces to","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"-kappa_sT_S+\n(alpha_P+kappa_n+kappa_s)T_P\n-kappa_nT_N\n=\na_P^(0)T_P^(0)","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"where the following coefficients are identified","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"beginaligned\n a_S = -kappa_s8pt\n a_N = -kappa_n8pt\n a_P = alpha_P+kappa_n+kappa_s8pt\n a_P^(0) = alpha_P\nendaligned","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"and the standard finite volume formalism discretization is reached","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"a_ST_S + a_PT_P + a_NT_N = a_P^(0)T_P^(0)","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"The interested reader may wish to derive the boundary conditions to this case. We will refrain from that here because it will be done for the rather more general case in the following sections.","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"","category":"page"},{"location":"Science/02-Computational-Physics/#Variable-thermophysical-properties","page":"Computational Physics","title":"Variable thermophysical properties","text":"","category":"section"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"To enter the variable thermophysical properties formulation it is worth saying a few words ahead of time about the next subject, the enthalpy formulation. That is because for variable density rho(T) and specific heat capacity c_p(T) under constant pressure the left-hand side of heat equation can be better expressed in terms of enthalpy H(T)=rho(T)h(T)=rho(T)c_p(T)T. Such a formulation is a requirement when dealing with phase change, such as solidification and melting - where we find discontinuities in enthalpy function; it is also needed in situations where material properties change above a certain degree for which constant properties could no longer be assumed over the foreseeable temperature range.","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"info: Info\nIn practical applications, especially in high-dimensional problems coupled to fluid dynamics, it is worth performing a sensitivity analysis with different sampling points over rho(T)c_p(T) to determine whether solving the problem with temperature-dependent properties is really required. For most cases this can lead to impressive speed-ups in simulations.","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"Although of high practical relevance, it is almost incredible that most standard engineering textbooks ignore this sort of development. A recent paper by Hristov2023 [26] tries to handle this sort of formalism analytically with properties expanded as simple temperature functions. Expanding the left-hand side of heat equation formulated in H(T) leads to","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"fracpartialHpartialt=\nrhoc_pfracpartialTpartialt+\nc_pTfracpartialrhopartialt+\nrhoTfracpartialc_ppartialt","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"If (continuous) relationships for rho(T) and c_p(T) are available, it can be expanded to","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"fracpartialHpartialt=\nleft(\n\trhoc_p+\n\tc_pTfracpartialrhopartialT+\n\trhoTfracpartialc_ppartialT\nright)\nfracpartialTpartialt","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"so that heat equation writes with the proper divergence operator as","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"left(\n\trhoc_p+\n\tc_pTfracpartialrhopartialT+\n\trhoTfracpartialc_ppartialT\nright)\nfracpartialTpartialt=\nnablacdotp(knablaT)","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"It is worth mentioning here, although we will not develop further for now, that in materials science and other fields, when involving a phase transformation kinetics described by an Avrami-like formalism such as discussed by Shirzad2023 [27], we could end with a system of coupled partial differential equations. For instance, if density only is changed through an arbitrary kinetics f(trhoTdotT), the next (unrealistic) model would arise. In fact, as discussed by Mittemeijer1988 [28], we should solve for a new non-equilibrium thermodynamic state beta for the kinetics and analytically evaluate a JMAK expression for density, but that is beyond our scope here (for now!).","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"beginalign\nleft(\n\trhoc_p+\n\trhoTfracpartialc_ppartialT\nright)fracpartialTpartialt\n=nablacdotp(knablaT)-c_pTfracpartialrhopartialt12pt\nfracpartialrhopartialt=f(trhoTdotT)\nendalign","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"The base development of the integral form of the heat equation in different coordinate systems being already treated in the previous sections, we use that result here to get","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"int_s^nint_0^tau\nbeta\nleft(\n\trhoc_p+\n\tc_pTfracpartialrhopartialT+\n\trhoTfracpartialc_ppartialT\nright)\ndfracpartialTpartialtdtdr=\ndisplaystyleint_0^tauint_s^n\ndfracpartialpartialr\nleft(betakdfracpartialTpartialrright)drdt","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"Solving left-hand side of this integral is non-trivial and we will skip it for now; consider then the non-expanded version of the enthalpy problem:","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"int_s^nint_0^tau\nbeta\ndfracpartial(rhoc_pT)partialtdtdr=\ndisplaystyleint_0^tauint_s^n\ndfracpartialpartialr\nleft(betakdfracpartialTpartialrright)drdt","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"Next we integrate both sides of the equation at once and apply a fully implicit interpolation to the right-hand side; for the analogous details provided for constant thermophysical properties, please check the previous section. This leads to the following discrete equation:","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"fracr_n^gamma-r_s^gammagammatau\nleft(rhoc_pT_P)-(rhoc_pT_P)^0right\n=\nbeta_nk_nfracT_N-T_Pdelta_PN-\nbeta_sk_sfracT_P-T_Sdelta_PS","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"where we can identify the following coefficients (not exactly the same as before!):","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"beginaligned\nalpha_P = fracr_n^gamma-r_s^gammagammatau8pt\nkappa_j = fracbeta_jk_jdelta_PJ\nendaligned","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"-kappa_nT_N\n+(alpha_P(rhoc_p)^(star)+kappa_n+kappa_s)T_P\n-kappa_sT_S\n=\nalpha_P(rhoc_p)^(0)T_P^(0)","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"where the following coefficients are identified","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"beginaligned\n a_S = -kappa_s8pt\n a_N = -kappa_n8pt\n a_P = alpha_P(rhoc_p)^(star)+kappa_n+kappa_s8pt\n a_P^(0) = alpha_P(rhoc_p)^(0)\nendaligned","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"There are two main differences in the above coefficients with respect to the constant properties case: both a_P and a_P^(0) need to be updated. Since the previous case already considered variable thermal conductivity, it was intrinsically non-linear and solution should already be iterative. In that sense, using a (star) superscript in (rhoc_p)^(star) is not needed because the kappa already need to be updated on a iteration basis until time-step convergence; nonetheless, it was kept to emphasize the different in the present formulation. The final problem statement remains the same, say","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"a_ST_S + a_PT_P + a_NT_N = a_P^(0)T_P^(0)","category":"page"},{"location":"Science/02-Computational-Physics/#Boundary-conditions","page":"Computational Physics","title":"Boundary conditions","text":"","category":"section"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"TODO","category":"page"},{"location":"Science/02-Computational-Physics/#Special-cases-coordinates","page":"Computational Physics","title":"Special cases coordinates","text":"","category":"section"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"For cylindrical and spherical systems, a condition for symmetry is that no flux traverses the center of the cylinder at r=0. That implies that south derivatives in discrete form of the equation must vanish to enforce dotq(0t)=0, so the first row of the problem is modified to","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"a_1T_P + a_NT_N = alpha_PT_P^0quadtextwherequada_1=alpha_P+beta_n","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"a_1T_P + a_NT_N = alpha_PT_P^0quadtextwherequada_1=alpha_P+beta_n","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"Over the external radius r=R a Robin boundary condition is imposed. In this case the heat flux dotq=U(T_infty-T_P) takes the place of north term in FVM discretization and the equation writes","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"a_ST_S + a_RT_P = alpha_PT_P^0+UT_inftyquadtextwherequada_R=alpha_P+U+beta_s","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"It must be noted here that U=betah, where the actual heat transfer coefficient is h. This should be self-evident from a dimensional analysis.","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"danger: Danger\nFrom here on everything is in draft mode.","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"","category":"page"},{"location":"Science/02-Computational-Physics/#Enthalpy-formulation","page":"Computational Physics","title":"Enthalpy formulation","text":"","category":"section"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"Enthalpy formulation is less trivial from the perspective that both sides of the equation do not use the same variable; balance is performed over enthalpy while driving force remains the temperature gradient (as per Fourier's law). In this case an extra step is added to the solution, solve a (generally) nonlinear equation for T=f(h). Quite often this is formulated as a root finding problem stated as h-hath(T)=0, where h represents the integrate enthalpy in a control volume and hath the provided function relating temperature to enthalpy. The equation is this case is stated as:","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"fracpartial(rhoh)partialt=nablacdotp(knablaT)","category":"page"},{"location":"Science/02-Computational-Physics/#Spherical-coordinates-1-D","page":"Computational Physics","title":"Spherical coordinates 1-D","text":"","category":"section"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"For computing the heating dynamics in a sphere, using the definition of divergence in spherical coordinates and using the gradient expansion over the radius we have","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"rhofracpartialhpartialt=\nfrac1r^2fracpartialpartialr\nleft(r^2kfracpartialTpartialrright)","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"This is now integrated over the differential volume dV as described in previous sections and for conciseness we skip that discussion. The integration over radial coordinate introduces the r^2dr factor from the differential volume and we get the final form of the equation to integrate.","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"int_s^nint_0^tau\nrhofracpartialhpartialtr^2dtdr=\nint_0^tauint_s^n\nfracpartialpartialr\nleft(r^2kfracpartialTpartialrright)drdt","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"After effecting the inner integrations and moving out constant terms from the integrals and expanding the evaluation of the definite integral between control volume boundaries s and n and performing a Crank-Nicolson integration of the right-hand side one gets","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"beginalign\nfracrhotau\nleft(h_P^tau-h_P^0right)\nleft(fracr_n^33-fracr_s^33right)\n=fleft\nr_n^2k_nfracT_N^tau-T_P^taudelta_PN-\nr_s^2k_sfracT_P^tau-T_S^taudelta_PS\nright8pt\n+(1-f)left\nr_n^2k_nfracT_N^0-T_P^0delta_PN-\nr_s^2k_sfracT_P^0-T_S^0delta_PS\nright\nendalign","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"Some coefficients appearing in the above equations are now grouped. Notice that for thermal conductivity k which is a function of temperature, the corresponding time-step temperature must be used for its evaluation. For beta_j the lower case j represents the evaluation at the interface with control volume J, what is a very specific notation.","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"beginalign\nalpha_P = fracrho3tauleft(r_n^3-r_s^3right)8pt\nbeta_j = fracr_j^2k_jdelta_PJ\nendalign","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"For conciseness we make g=(1-f) and simplify the expression with the new coefficients as","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"beginalign\nalpha_Ph_P^tau-alpha_Ph_P^0\n\n=fbeta_nT_N^tau-f(beta_n+beta_s)T_P^tau-fbeta_sT_S^tau\n8pt\n+gbeta_nT_N^0-g(beta_n+beta_s)T_P^0-gbeta_sT_S^0\nendalign","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"For the fully implicit time-stepping scheme f=1 and making gamma_j^k=alpha_P^-1beta_j^k one gets","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"h_P^tau-h_P^0-gamma_n^kT_N^tauk+(gamma_n^k+gamma_s^k)T_P^tauk-gamma_s^kT_S^tauk=0","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"A condition for symmetry is that no flux traverses the center of the sphere at r=0. That implies that south derivatives in discretizes form of the equation must vanish to enforce dotq(0t)=0, so the first row of the problem is modified to","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"h_P^tau-h_P^0-gamma_n^kT_N^tauk+gamma_n^kT_P^tauk=0","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"Over the external radius r=R a Robin boundary condition is imposed. In this case the heat flux dotq=U(T_infty-T_P) takes the place of north term in FVM discretization and the equation writes","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"h_P^tau-h_P^0-alpha_P^-1UT_infty+(alpha_P^-1U+gamma_s^k)T_P^tauk-gamma_s^kT_S^tauk=0","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"It must be noted here that U=R^2h, where the actual heat transfer coefficient is h. This should be self-evident from a dimensional analysis.","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"This is no longer a linear problem and thus cannot be solved directly. We need now an strategy for solving this coupled system of nonlinear equations. The iterative solution of the problem is indicated in the above equations through the introduction of superscript k indicating the iteration number. One can rework the system as","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"beginalign\n-gamma_12^kT_2^tauk+gamma_12^kT_1^tauk+h_1^tau=h_1^0\ndots \n-gamma_n^kT_N^tauk+(gamma_n^k+gamma_s^k)T_P^tauk-gamma_s^kT_S^tauk+h_P^tau=h_P^0\ndots \n(alpha_K^-1U+gamma_K-1K^k)T_K^tauk-gamma_K-1K^kT_K-1^tauk+h_K^tau=h_K^0+alpha_K^-1UT_infty\nendalign","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"It is clear now that for implementation purposes one can store the required coefficients in a tridiagonal matrix A^k. Making Gamma_i=(gamma_i-1i+gamma_ii+1) and tildeU=alpha_K^-1U we can identify the terms in","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"beginpmatrix\nH_1^k \nH_2^k \nH_3^k \nvdots \nH_K-1^k \nH_K^k \nendpmatrix\n=\nbeginpmatrix\n gamma_12^k -gamma_12^k 0 dots 0 0 \n-gamma_12^k Gamma_2^k -gamma_23^k dots 0 0 \n 0 -gamma_23^k Gamma_3^k -gamma_34^kddots 0 0 \nvdots ddots ddots ddots ddots vdots \n 0 0 0 -gamma_K-2K-1^k Gamma_K-1^k -gamma_K-1K^k \n 0 0 0 0 -gamma_K-1K^k tildeU+gamma_K-1K^k \nendpmatrix\nbeginpmatrix\nT_1^tauk \nT_2^tauk \nT_3^tauk \nvdots \nT_K-1^tauk \nT_N^tauk \nendpmatrix","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"Since the temperature vector T^tauk is updated every iteration, the coefficients of A^k must also be updated. With the intermediate vector H^tauk the nonlinear problem is rewritten as","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"beginpmatrix\nH_1^k \nH_2^k \nH_3^k \nvdots \nH_K-1^k \nH_K^k \nendpmatrix\n+\nbeginpmatrix\nh_1^tau \nh_2^tau \nh_3^tau \nvdots \nh_K-1^tau \nh_K^tau \nendpmatrix\n=\nbeginpmatrix\nh_1^0 \nh_2^0 \nh_3^0 \nvdots \nh_K-1^0 \nh_K^0 + tildeUT_infty \nendpmatrix","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"The choice not to write the problem in this format reflects the fact that the term H^tauk on the left-hand side is updated on a iteration basis, while the vector b^0 is computed once per time step. This last vector was called b^0 instead of h^0 because it also includes the boundary condition in its last element. This is useful for the conception of the inner and outer loop functions used for solution update.","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"The traditional approach to solve this sort of problems is to provide a initial guess T^tau0=T^0.","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"beginalign\nh^tau0 = b^0-A^0T^tau0\nh(T^tau1)-h^tau0 = 0\nDeltaT = T^tau1-T^tau0\nT^tau1 = T^tau0+(1-alpha)DeltaT\nvarepsilon^1 = vertDeltaTvert\ntextrepeat\nh^tau1 = b^0-A^1T^tau1\nh(T^tau2)-h^tau1 = 0\nDeltaT = T^tau2-T^tau1\nT^tau2 = T^tau1+(1-alpha)DeltaT\nvarepsilon^2 = vertDeltaTvert\ndots\nh^tauk = b^0-A^kT^tauk\nh(T^tauk+1)-h^tauk = 0\nDeltaT = T^tauk+1-T^tauk\nT^tauk+1 = T^tauk+(1-alpha)DeltaT\nvarepsilon^k+1 = vertDeltaTvert\nendalign","category":"page"},{"location":"References/@Cheilytko2016a/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Cheilytko2016a/","page":"-","title":"-","text":"title: \"Finding of the generalized equation of thermal conductivity for porous heat-insulating materials\" authors: Andrii Cheilytko year: 2016 –-","category":"page"},{"location":"Science/05-Machine-Learning/#Machine-Learning","page":"Machine Learning","title":"Machine Learning","text":"","category":"section"},{"location":"Science/05-Machine-Learning/#Data-Driven-Science-and-Engineering","page":"Machine Learning","title":"Data Driven Science and Engineering","text":"","category":"section"},{"location":"Science/05-Machine-Learning/","page":"Machine Learning","title":"Machine Learning","text":"Notes based on Data-Driven Science and Engineering by Steven L. Brunton and J. Nathan Kurz. Their proposed teaching materials for the book can be found here. Supplementary notes that might be useful for understanding the concepts are provided in course AMATH301. The set of open source materials proposed by Kurz's team is found here.","category":"page"},{"location":"Science/05-Machine-Learning/#Singular-Value-Decomposition","page":"Machine Learning","title":"Singular Value Decomposition","text":"","category":"section"},{"location":"Science/05-Machine-Learning/#Fourier-and-Wavelet-Transforms","page":"Machine Learning","title":"Fourier and Wavelet Transforms","text":"","category":"section"},{"location":"Science/05-Machine-Learning/#Sparsity-and-Compressed-Sensing","page":"Machine Learning","title":"Sparsity and Compressed Sensing","text":"","category":"section"},{"location":"Science/05-Machine-Learning/#Regression-and-Model-Selection","page":"Machine Learning","title":"Regression and Model Selection","text":"","category":"section"},{"location":"Science/05-Machine-Learning/#Clustering-and-Classification","page":"Machine Learning","title":"Clustering and Classification","text":"","category":"section"},{"location":"Science/05-Machine-Learning/#Neural-Networks-and-Deep-Learning","page":"Machine Learning","title":"Neural Networks and Deep Learning","text":"","category":"section"},{"location":"Science/05-Machine-Learning/#Data-Driven-Dynamical-Systems","page":"Machine Learning","title":"Data-Driven Dynamical Systems","text":"","category":"section"},{"location":"Science/05-Machine-Learning/#Linear-Control-Theory","page":"Machine Learning","title":"Linear Control Theory","text":"","category":"section"},{"location":"Science/05-Machine-Learning/#Balanced-Models-for-Control","page":"Machine Learning","title":"Balanced Models for Control","text":"","category":"section"},{"location":"Science/05-Machine-Learning/#Data-Driven-Control","page":"Machine Learning","title":"Data-Driven Control","text":"","category":"section"},{"location":"Science/05-Machine-Learning/#Reduced-Order-Models-(ROMs)","page":"Machine Learning","title":"Reduced Order Models (ROMs)","text":"","category":"section"},{"location":"Science/05-Machine-Learning/#POD-for-Partial-Differential-equations-(11.1)","page":"Machine Learning","title":"POD for Partial Differential equations (11.1)","text":"","category":"section"},{"location":"Science/05-Machine-Learning/","page":"Machine Learning","title":"Machine Learning","text":"(Image: )","category":"page"},{"location":"Science/05-Machine-Learning/","page":"Machine Learning","title":"Machine Learning","text":"Proxy models are much faster (lower dimensional)\nClassical discretization (FD) lead to high dimensional schemes\nModel expansion can produce much lower dimension problems","category":"page"},{"location":"Science/05-Machine-Learning/","page":"Machine Learning","title":"Machine Learning","text":"u(xt) = sum_k=1^na_k(t)psi_k(x)","category":"page"},{"location":"Science/05-Machine-Learning/","page":"Machine Learning","title":"Machine Learning","text":"Idea: plug the modal expansion in the PDE and expand it\nWith modal basis the approximations are non-local (global)\nOption 1: Fourier mode expansion - FFT","category":"page"},{"location":"Science/05-Machine-Learning/","page":"Machine Learning","title":"Machine Learning","text":"psi_k(x)=frac1Lexpleft(ifrac2pikxLright)","category":"page"},{"location":"Science/05-Machine-Learning/","page":"Machine Learning","title":"Machine Learning","text":"Goal: try to approximate with r basis instead of large n\nExample: try to approximate a Gaussian with FME\nLocalized structures require more expansion modes\nConstruction similar to spectral methods","category":"page"},{"location":"Science/05-Machine-Learning/#Optimal-Basis-Elements-(11.2)","page":"Machine Learning","title":"Optimal Basis Elements (11.2)","text":"","category":"section"},{"location":"Science/05-Machine-Learning/","page":"Machine Learning","title":"Machine Learning","text":"(Image: )","category":"page"},{"location":"Science/05-Machine-Learning/","page":"Machine Learning","title":"Machine Learning","text":"Key idea: simulate the dynamics of the system and save snapshots of time-step solutions to then identify a modal expansion.\nThe tildeU POD basis psi_k found by truncating the SVD matrix U at rank r is the optimal in the L^2 sense for the given data.\nUse energy accumulated in modes as discussed in Chapter 1 Singular Value Decomposition to define the optimal (or good enough) value of r.\nThe produced ROM is not assured to be safe outside the subspace to which it was identified, though that is fine for several physics.","category":"page"},{"location":"Science/05-Machine-Learning/#POD-and-Soliton-Dynamics-(11.3)","page":"Machine Learning","title":"POD and Soliton Dynamics (11.3)","text":"","category":"section"},{"location":"Science/05-Machine-Learning/","page":"Machine Learning","title":"Machine Learning","text":"(Image: )","category":"page"},{"location":"Science/05-Machine-Learning/#Continuous-Formulation-of-POD","page":"Machine Learning","title":"Continuous Formulation of POD","text":"","category":"section"},{"location":"Science/05-Machine-Learning/","page":"Machine Learning","title":"Machine Learning","text":"(Image: )","category":"page"},{"location":"Science/05-Machine-Learning/#POD-with-Symmetries","page":"Machine Learning","title":"POD with Symmetries","text":"","category":"section"},{"location":"Science/05-Machine-Learning/","page":"Machine Learning","title":"Machine Learning","text":"(Image: )","category":"page"},{"location":"Science/05-Machine-Learning/#Interpolation-for-Parametric-ROMs","page":"Machine Learning","title":"Interpolation for Parametric ROMs","text":"","category":"section"},{"location":"Science/05-Machine-Learning/#Additional-materials","page":"Machine Learning","title":"Additional materials","text":"","category":"section"},{"location":"Science/05-Machine-Learning/","page":"Machine Learning","title":"Machine Learning","text":"(Image: Professor Nick Trefethen, University of Oxford, Linear Algebra Optimization)","category":"page"},{"location":"Science/05-Machine-Learning/","page":"Machine Learning","title":"Machine Learning","text":"","category":"page"},{"location":"Science/05-Machine-Learning/#Physics-Informed-Neural-Networks","page":"Machine Learning","title":"Physics-Informed Neural Networks","text":"","category":"section"},{"location":"Science/05-Machine-Learning/","page":"Machine Learning","title":"Machine Learning","text":"Physics-Informed Neural Networks (PINNs) were first introduced by Raissi2017 [32] in the context of providing data-driven solutions of nonlinear PDE's. In what follows we review the basic concepts and approaches developed in this field during the past few years. Both mathematical and application aspects will be treated in the review.","category":"page"},{"location":"Science/05-Machine-Learning/#Common-applications","page":"Machine Learning","title":"Common applications","text":"","category":"section"},{"location":"Science/05-Machine-Learning/","page":"Machine Learning","title":"Machine Learning","text":"As per Guo2024a [33] the following common applications arise from PINNs:","category":"page"},{"location":"Science/05-Machine-Learning/","page":"Machine Learning","title":"Machine Learning","text":"Predictive modeling and simulations","category":"page"},{"location":"Science/05-Machine-Learning/","page":"Machine Learning","title":"Machine Learning","text":"Solution of dynamical systems (even high-dimensional)\nAcceleration of multi-physics simulations","category":"page"},{"location":"Science/05-Machine-Learning/","page":"Machine Learning","title":"Machine Learning","text":"Optimization and systems control","category":"page"},{"location":"Science/05-Machine-Learning/","page":"Machine Learning","title":"Machine Learning","text":"Surrogate models for design optimization\nInverse design (finding conditions)\nModel predictive control\nOptimal sensor placement","category":"page"},{"location":"Science/05-Machine-Learning/","page":"Machine Learning","title":"Machine Learning","text":"Data-driven insights","category":"page"},{"location":"Science/05-Machine-Learning/","page":"Machine Learning","title":"Machine Learning","text":"Data-driven enhancement","category":"page"},{"location":"Science/05-Machine-Learning/","page":"Machine Learning","title":"Machine Learning","text":"Monitoring, diagnostic, and health assessment","category":"page"},{"location":"Science/05-Machine-Learning/#Key-Ideas","page":"Machine Learning","title":"Key Ideas","text":"","category":"section"},{"location":"Science/05-Machine-Learning/","page":"Machine Learning","title":"Machine Learning","text":"Inject the prediction values in the governing equations to compose the loss function, enforcing the NN to obey the underlying physics.\nThere are 2 components in the loss function, the physical loss evaluated from the deviation from training data (as is commonplace in NN training) and the PDE loss, which is further divided into boundary and initial condition losses.\nCollocation points is how we call the temporal and spacial coordinates where evaluation of physical properties are computed, corresponding to nodes or cell centers in classical numerical schemes.","category":"page"},{"location":"Science/05-Machine-Learning/#Research-opportunities","page":"Machine Learning","title":"Research opportunities","text":"","category":"section"},{"location":"Science/05-Machine-Learning/","page":"Machine Learning","title":"Machine Learning","text":"Following Guo2023a [34] citing the work by Wu2022a [35], resampling and refinement methods could be improved by better PDF's and the use of active or reinforcement learning to improve sampling.","category":"page"},{"location":"Science/05-Machine-Learning/#References","page":"Machine Learning","title":"References","text":"","category":"section"},{"location":"Science/05-Machine-Learning/","page":"Machine Learning","title":"Machine Learning","text":"Unraveling the design pattern of physics-informed neural networks:","category":"page"},{"location":"Science/05-Machine-Learning/","page":"Machine Learning","title":"Machine Learning","text":"Post Subject Main reference(s)\nGuo2023a [34] Resampling of residual points Wu2022a [35]\nGuo2023b [36] Ensemble learning and dynamic solution interval expansion Haitsiukevich2022a [37]\nGuo2023c [38] Improving performance through gradient boosting Fang2023a [39]\nGuo2023d [40] Incorporate the gradient of residual terms as an additional loss term for stiff problems Yu2022a [41]\nGuo2023e [42] Wang2023a [43]\nGuo2023f [44] Wang2022a [45]\nGuo2023g [46] Arthurs2021a [47]","category":"page"},{"location":"Science/05-Machine-Learning/","page":"Machine Learning","title":"Machine Learning","text":"Reference Subject\nLagaris1997a [48] Seminal work on PINNs.\nAntonelo2021a [49] \nCai2021a [50] \nCuomo2022a [51] \nHaitsiukevich2022a [37] \nKarniadakis2021a [52] \nLu2019a [53] \nLu2021a [54] \nNabian2021a [55] \nSanyal2022a [56] \nWurth2023a [57] Use of PINNs to solve diffusion equation (heat transfer) during the curing of composites. The paper is more focused in the application than in the implementation. Benchmark against FDM/FEM.","category":"page"},{"location":"Science/05-Machine-Learning/","page":"Machine Learning","title":"Machine Learning","text":"Other current readings:","category":"page"},{"location":"Science/05-Machine-Learning/","page":"Machine Learning","title":"Machine Learning","text":"[ ] Discovering Differential Equations with Physics-Informed Neural Networks and Symbolic Regression\n[ ] Solving Inverse Problems With Physics-Informed DeepONet: A Practical Guide With Code Implementation\n[ ] Introduction to Physics-informed Neural Networks\n[ ] Solving ODE system with PINN\n[ ] Mathematics for Machine Learning and Simulation\n[ ] Physics-Informed Neural Networks (PINNs) - An Introduction - Ben Moseley | The Science Circle\n[ ] Teaching Neural Network to Solve Navier-Stokes Equations\n[ ] Physics-Informed Neural Networks in Julia\n[ ] Scientific AI: Domain Models With Integrated Machine Learning | Chris Rackauckas | JuliaCon 2019","category":"page"},{"location":"Notes/Life/","page":"-","title":"-","text":"","category":"page"},{"location":"Notes/Life/","page":"-","title":"-","text":"kanban-plugin: basic","category":"page"},{"location":"Notes/Life/","page":"-","title":"-","text":"","category":"page"},{"location":"Notes/Life/#Organização-pessoal","page":"-","title":"Organização pessoal","text":"","category":"section"},{"location":"Notes/Life/","page":"-","title":"-","text":"[ ] Nouvelle acte de mariage\n[ ] Add LibreOffice and Obsidian to scientific-environment\n[ ] Garantia Shokz\n[ ] Concluir/enviar dossier de naturalização\n[ ] RDV Ophtalmologue\n[ ] Terminar update to clubot com envio de emails\n[ ] Atualizar CV Lattes\n[ ] Aplicar validação do doutorado\n[ ] Migrar planejamento de DryTooling.jl aqui\n[ ] Check purchase of new tower\n[ ] Pédalier Shimano Deore FC 30 dents\n[ ] Chambre à air X2\n[ ] Organizar e mover links de esportes à página\n[ ] Terminar de organizar links técnicos nas páginas de bookmarks.\n[ ] Deploy paperless\n[ ] Deploy Wiki.js","category":"page"},{"location":"Notes/Life/#OpenFOAM","page":"-","title":"OpenFOAM","text":"","category":"section"},{"location":"Notes/Life/","page":"-","title":"-","text":"[ ] Start creating a CHT case step-by-step from aachenBombSteady (compatible with radiation and wall heat losses)\n[ ] (paper C2H2) migrate to OpenFOAM11 and publish\n[ ] (aachenBomb) Provide post-processing\n[ ] (aachenBombSteady) Finish case construction\n[ ] Test this function for post-processing.\n[ ] Add case for testing PSD\n[ ] (sedimentationBox): export STL model from SpaceClaim and mesh in snappyHexMesh\n[ ] (sedimentationBox): Impose flow rate at outlet with pressure inlet if possible\n[ ] (sedimentationBox) Post-process cases\n[ ] (horizontalMixer) Compute fractional mass in system with respected to injected (extract from log files).\n[ ] (horizontalMixer) Work towards enabling particleTracks in cloudFunctions.\n[ ] (horizontalMixer) Ensure individual time-steps converged during solution (residuals get first value only).\n[ ] (horizontalMixer) Plots of data in patchFlowRate(patch=outlet, cloud:massFlux) files.\n[ ] (horizontalMixer) Process lagrangian/cloud/patchPostProcessing1/* (Julia script ongoing).\n[ ] (horizontalMixer) Explore solution configuration.\n[ ] (horizontalMixer) Organize scripts as a single module and runners.\n[ ] (horizontalMixer) Download all related papers!\n[ ] (horizontalMixer) learn from Clérac's fvSolution for better controls","category":"page"},{"location":"Notes/Life/#Cursos-online","page":"-","title":"Cursos online","text":"","category":"section"},{"location":"Notes/Life/","page":"-","title":"-","text":"[ ] Computational thinking\n[ ] Course SciML\n[ ] Mecânica Newtoniana\n[ ] Mêcânica de pontos materiais\n[ ] Mêcânica de corpos massivos\n[ ] Mecânica Lagrangiana\n[ ] Cursos MITx (ver dashboard)\n[ ] Cursos EDx (ver dashboard)\n[ ] Videos OpenFOAM 9\n[ ] Tutorials Doggo dot Jl\n[ ] Concluir Introduction to Simulation (EDX)\n[ ] Concluir Ansys Track\n[ ] Concluir Cornell SimCafe\n[ ] Introduction to numerical analysis\n[ ] Michigan State FEM + deal.ii\n[ ] Computational methods on aerospace engineering\n[ ] Boltzmann Law EDX\n[ ] Verificar pacotes FEM\n[ ] Code Saturne\n[ ] Yade-OpenFOAM coupling\n[ ] Kratos\n[ ] Tutoriais Simon Gravelle\n[ ] Tutoriais Mark Tschopp\n[ ] Tutoriais Nuwan Dewapriya\n[ ] Estudar ESPResSo\n[ ] Estudar Quantum Espresso","category":"page"},{"location":"Notes/Life/#Portfolio","page":"-","title":"Portfolio","text":"","category":"section"},{"location":"Notes/Life/","page":"-","title":"-","text":"[ ] Comparison of drag models using a sedimentation box in OpenFOAM\n[ ] Cyclone separator with MPPIC cloud in OpenFOAM\n[ ] Setup of thermophysical properties with temperature dependence\n[ ] Droplet combustion with arbitrary user-defined composition\n[ ] Multicomponent airlock system\n[ ] Arbitrary user-defined gas phase kinetics with Graf (2007)\n[ ] Carbonitriding model with example of complex part\n[ ] Spray dryer\n[ ] Coded reactor wall coupling\n[ ] Simplified acetylene kinetics model\n[ ] Estudar MFiX","category":"page"},{"location":"Notes/Life/","page":"-","title":"-","text":"%% kanban:settings","category":"page"},{"location":"Notes/Life/","page":"-","title":"-","text":"{\"kanban-plugin\":\"basic\"}","category":"page"},{"location":"Notes/Life/","page":"-","title":"-","text":"%%","category":"page"},{"location":"References/@Mittemeijer1988/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Mittemeijer1988/","page":"-","title":"-","text":"title: \"Analysis of nonisothermal transformation kinetics; tempering of iron-carbon and iron-nitrogen martensites\" authors: E. J. Mittemeijer, Liu Cheng, P. J. van der Schaaf, C. M. Brakman, B. M. Korevaar year: 1988 –-","category":"page"},{"location":"References/@Guo2023c/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Guo2023c/","page":"-","title":"-","text":"title: \"Unraveling the design pattern of physics-informed neural networks: Series 03\" authors: Shuai Guo year: 2023 URL: https://towardsdatascience.com/unraveling-the-design-pattern-of-physics-informed-neural-networks-part-03-fe365ef480d9 –- Discussed [[@Krishnapriyan2021a]]","category":"page"},{"location":"Science/10-Continuum-Mechanics/#Reatores-pistão","page":"Reatores pistão","title":"Reatores pistão","text":"","category":"section"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"#plug-flow","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"Escoamentos nos quais a componente axial do transporte por advecção é dominante sobre o transporte difusivo aproximam-se do comportamento dito pistão. Neste caso o número de Péclet (ver transport para mais detalhes) tende ao infinito.","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"A temática de reatores pistão apresenta grande interesse para o cientista e engenheiro dados os fatos de que (1) frequentemente instalações experimentais no laboratório podem ser caracterizadas como estando neste regime limite e (2) com a composição de reatores pistão e agitados é possível compor modelos de reatores mais complexos de utilidade industrial. A introdução desenvolvida aqui parte da apresentação feita por Kee2017 [74] para então desenvolver uma abordagem algorítmica para solução de reatores quaisquer. A abordagem de engenharia de reatores empregando modelos compostos não será apresentada, o leitor interessado podendo encontrá-la em Fogler1999 [75].","category":"page"},{"location":"Science/10-Continuum-Mechanics/#Um-primeiro-modelo","page":"Reatores pistão","title":"Um primeiro modelo","text":"","category":"section"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"Para a introdução do tópico vamos aborda o estabelecimento do modelo e as equações de conservação necessárias. No presente caso, isso será feiro na ausência de reações químicas e trocas de matéria com o ambiente - o reator é um tubo fechado - precisamos estabelecer a conservação de massa e energia apenas. Como dito, o reator em questão conserva a massa transportada, o que é matematicamente expresso pela ausência de variação axial do fluxo de matéria, ou seja","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"fracd(rhou)dz=0","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"Mesmo que trivial, esse resultado é frequentemente útil na simplificação das outras equações de conservação para um reator pistão, como veremos (com frequência) mais tarde.","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"Embora não trocando matéria com o ambiente a través das paredes, vamos considerar aqui trocas térmicas. Afinal não parece muito útil um modelo de reator sem trocas de nenhum tipo nem reações. Da primeira lei da Termodinâmica temos que a taxa de variação da energia interna E é igual a soma das taxas de trocas de energia Q e do trabalho realizado W.","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"fracdEdt= fracdQdt+ fracdWdt","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"Podemos reescrever essa equação para uma seção transversal do reator de área A_c em termos das grandezas específicas e densidade rho com as integrais","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"#divergence-theorem","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"int_OmegarhoemathbfVcdotpmathbfndA_c=\ndotQ-\nint_OmegapmathbfVcdotpmathbfndA_c","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"Com a definição de entalpia h podemos simplificar essa equação e obter","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"int_OmegarhohmathbfVcdotpmathbfndA_c=\ndotQqquadtextaondeqquadh = e+fracprho","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"Usando o teorema de Gauss transformamos essa integral sobre a superfície num integral de divergência sobre o volume diferencial dV, o que é útil na manipulação de equações de conservação","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"int_OmegarhohmathbfVcdotpmathbfndA_c=\nint_Vnablacdotp(rhohmathbfV)dV","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"Nos resta ainda determinar dotQ. O tipo de interação com ambiente, numa escala macroscópica, não pode ser representado por leis físicas fundamentais. Para essa representação necessitamos de uma lei constitutiva que modela o fenômeno em questão. Para fluxos térmicos convectivos à partir de uma parede com temperatura fixa T_s a forma análoga a uma condição limite de Robin expressa o dotQ como","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"dotQ=hathA_s(T_s-T)=hath(Pdz)(T_s-T)","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"O coeficiente de troca térmica convectiva hath é frequentemente determinado à partir do tipo de escoamento usando fórmulas empíricas sobre o número de Nusselt. A abordagem desse tópico vai além do nosso escopo e assume-se que seu valor seja conhecido. Nessa expressão já transformamos a área superficial do reator A_s=Pdz o que nos permite agrupar os resultados em","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"int_Vnablacdotp(rhohmathbfV)dV=\nhath(Pdz)(T_w-T)","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"Em uma dimensão z o divergente é simplemente a derivada nessa coordenada. Usando a relação diverencial deltaV=A_cdz podemos simplificar a equação para a forma diferencial como se segue","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"fracd(rhouh)dz=\nfrachathPdzdeltaV(T_w-T)\nimplies\nfracd(rhouh)dz=\nfrachathPA_c(T_w-T)","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"A expressão acima já consitui um modelo para o reator pistão, mas sua forma não é facilmente tratável analiticamente. Empregando a propriedade multiplicativa da diferenciaÇão podemos expandir o lado esquedo da equação como","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"rhoufracdhdz+hfracd(rhou)dz=\nfrachathPA_c(T_w-T)","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"O segundo termo acima é nulo em razão da conservação da matéria, como discutimos anteriormente. Da definição diferencial de entalpia dh=c_pdT chegamos a formulação do modelo na temperatura como dado no título dessa seção.","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"rhouc_pA_cfracdTdz=\nhathP(T_w-T)","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"Vamos agora empregar esse modelo para o cálculo da distribuição axial de temperatura ao longo do reator. No que se segue assume-se um reator tubular de seção circular de raio R e todos os parâmetros do modelo são constantes.","category":"page"},{"location":"Science/10-Continuum-Mechanics/#Integração-analítica","page":"Reatores pistão","title":"Integração analítica","text":"","category":"section"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"Esse problema permite uma solução analítica simples que desenvolvemos de maneira um pouco abrupta no que se segue. Separando os termos em T (variável dependente) e z (variável independente) e integrando sobre os limites adequados obtemos","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"int_T_0^TfracdTT_w-T=\nfrachathPrhouc_pA_cint_0^zdz=\nmathcalC_0z","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"Na expressão acima mathcalC_0 não é uma constante de integração mas apenas regrupa os parâmetros do modelo. O termo em T pode ser integrado por uma substituição trivial","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"u=T_w-T implies -intfracduu=log(u)biggrvert_u_0^u+mathcalC_1","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"Realizando a integração definida e resolvendo para T chegamos a","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"T=T_w-(T_w-T_0)expleft(-mathcalC_0z+mathcalC_1right)","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"É trivial verificar com T(z=0)=T_0 que mathcalC_1=0 o que conduz à solução analítica:","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"T=T_w-(T_w-T_0)expleft(-frachathPrhouc_pA_czright)","category":"page"},{"location":"Science/10-Continuum-Mechanics/#Método-dos-volumes-finitos","page":"Reatores pistão","title":"Método dos volumes finitos","text":"","category":"section"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"#finite-volume-method","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"Quando integrando apenas um reator, o método de integração numérica da equação é geralmente a escolha mais simples. No entanto, em situações nas quais desejamos integrar trocas entre diferentes reatores aquela abordagem pode se tornar proibitiva. Uma dificuldade que aparece é a necessidade de solução iterativa até convergência dados os fluxos pelas paredes do reator, o que demandaria um código extremamente complexo para se gerir em integração direta. Outro caso são trocadores de calor que podem ser representados por conjuntos de reatores em contra-corrente, um exemplo que vamos tratar mais tarde nesta série. Nestes casos podemos ganhar em simplicidade e tempo de cálculo empregando métodos que linearizam o problema para então resolvê-lo por uma simples álgebra linear.","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"Na temática de fenômenos de transporte, o método provavelmente mais frequentemente utilizado é o dos volumes finitos (em inglês abreviado FVM). Note que em uma dimensão com coeficientes constantes pode-se mostrar que o método é equivalente à diferenças finitas (FDM), o que é nosso caso neste problema. No entanto vamos insistir na tipologia empregada com FVM para manter a consistência textual nos casos em que o problema não pode ser reduzido à um simples FDM.","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"No que se segue vamos usar uma malha igualmente espaçada de maneira que nossas coordenadas de solução estão em zin0delta2deltadotsNdelta e as interfaces das células encontram-se nos pontos intermediários. Isso dito, a primeira e última célula do sistema são meias células, o que chamaremos de condição limite imersa, contrariamente à uma condição ao limite com uma célula fantasma na qual o primeiro ponto da solução estaria em z=delta2. Trataremos esse caso em outra ocasião.","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"O problema de transporte por advecção em um reator pistão é essencialmente upwind, o que indica que a solução em uma célula E a leste de uma célula P depende exclusivamente da solução em P. Veremos o impacto disto na forma matricial trivial que obteremos na sequência. Para a sua construção, começamos pela integração do problema entre P e E, da qual se segue a separação de variáveis","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"int_T_P^T_Erhouc_pA_cdT=\nint_0^deltahathP(T_s-T^star)dz","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"Observe que introduzimos a variável T^star no lado direito da equação e não sob a integral em dT. Essa escolha se fez porque ainda não precisamos definir qual a temperatura mais representativa deve-se usar para o cálculo do fluxo térmico. Logo vamos interpretá-la como uma constante que pode ser movida para fora da integral","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"rhouc_pA_cint_T_P^T_EdT=\nhathP(T_s-T^star)int_0^deltadz","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"Realizando-se a integração definida obtemos a forma paramétrica","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"rhouc_pA_c(T_E-T_P)=\nhathPdelta(T_s-T^star)","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"Para o tratamento com FVM agrupamos parâmetros para a construção matricial, o que conduz à","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"aT_E-aT_P=\nT_s-T^star","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"No método dos volumes finitos consideramos que a solução é constante através de uma célula. Essa hipótese é a base para construção de um modelo para o parâmetro T^star na presente EDO. Isso não deve ser confundido com os esquemas de interpolação que encontramos em equações diferenciais parciais.","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"A ideia é simples: tomemos um par de células P e E com suas respectivas temperaturas T_P e T_E. O limite dessas duas células encontra-se no ponto médio entre seus centros, que estão distantes de um comprimento delta. Como a solução é constante em cada célula, entre P e a parede o fluxo de calor total entre seu centro e a fronteira e com a célula E é","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"dotQ_P-e = hathP(T_s-T_P)delta_P-e=\nfrachathPdelta2(T_s - T_P)","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"De maneira análoga, o fluxo entre a fronteira e e o centro de E temos","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"dotQ_e-E = hathP(T_s-T_E)delta_e-E=\nfrachathPdelta2(T_s-T_E)","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"Nas expressões acima usamos a notação em letras minúsculas para indicar fronteiras entre células. A célula de referência* é normalmente designada P, e logo chamamos a fronteira pela letra correspondendo a célula vizinha em questão, aqui E. O fluxo convectivo total entre P e E é portanto","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"dotQ_P-E=dotQ_P-e+dotQ_e-E=\nhathPleftT_s-frac(T_E+T_P)2right","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"de onde adotamos o modelo","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"T^star=fracT_E+T_P2","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"A troca convectiva com a parede não seria corretamente representada se escolhessemos T_P como referência para o cálculo do fluxo (o que seria o caso em FDM). Obviamente aproximações de ordem superior são possíveis empregando-se mais de duas células mas isso ultrapassa o nível de complexidade que almejamos entrar no momento.","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"Aplicando-se esta expressão na forma numérica precedente, após manipulação chega-se à","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"(2a + 1)T_E=\n(2a - 1)T_P + 2T_w","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"Com algumas manipulações adicionais obtemos a forma que será usada na sequência","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"-A^-T_P + A^+T_E=1\nquadtextaondequad\nA^pm = frac2a pm 12T_w","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"A expressão acima é válida entre todos os pares de células PrightarrowE no sistema, exceto pela primeira. Como se trata de uma EDO, a primeira célula do sistema contém a condição inicial T_0 e não é precedida por nenhuma outra célula e evidentemente não precisamos resolver uma equação adicional para esta. Considerando o par de vizinhos PrightarrowEequiv0rightarrow1, substituindo o valor da condição inicial obtemos a modificação da equação para a condição inicial imersa","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"A^+T_1=1 + A^-T_0","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"Como não se trata de um problema de condições de contorno, nada é necessário para a última célula do sistema. Podemos agora escrever a forma matricial do problema que se dá por","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"beginbmatrix\n A^+ 0 0 dots 0 0 \n-A^- A^+ 0 dots 0 0 \n 0 -A^- A^+ ddots 0 0 \nvdots ddots ddots ddots ddots vdots \n 0 0 0 -A^- A^+ 0 \n 0 0 0 0 -A^- A^+ \nendbmatrix\nbeginbmatrix\nT_1 \nT_2 \nT_3 \nvdots \nT_N-1 \nT_N \nendbmatrix\n=\nbeginbmatrix\n1 + A^-T_0 \n1 \n1 \nvdots \n1 \n1 \nendbmatrix","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"A dependência de E somente em P faz com que tenhamos uma matriz diagonal inferior, aonde os -A^- são os coeficientes de T_P na formulação algébrica anterior. A condição inicial modifica o primeiro elemento do vetor constante à direita da igualdade.","category":"page"},{"location":"Science/10-Continuum-Mechanics/#Formulação-na-entalpia","page":"Reatores pistão","title":"Formulação na entalpia","text":"","category":"section"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"Em diversos casos a forma expressa na temperatura não é conveniente. Esse geralmente é o caso quando se inclui transformações de fase no sistema. Nessas situações a solução não suporta integração direta e devemos recorrer a um método iterativo baseado na entalpia. Isso se dá pela adição de uma etapa suplementar da solução de equações não lineares para se encontrar a temperatura à qual a entalpia corresponde para se poder avaliar as trocas térmicas.","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"Para se efetuar a integração partimos do modelo derivado anteriormente numa etapa antes da simplificação final para solução na temperatura e agrupamos os parâmetros livres em a","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"fracdhdz=frachathPrhouA_c(T_s-T^star)=a(T_s-T^star)","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"É interessante observar que toda a discussão precedente acerca de porque não integrar sobre T^star perde seu sentido aqui: a temperatura é claramente um parâmetro.","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"int_h_P^h_Ndh=a^primeint_0^delta(T_s-T^star)dz","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"Seguindo um procedimento de integração similar ao aplicado na formulação usando a temperatura chegamos a equação do gradiente fazendo a=a^primedelta","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"h_E-h_P=aT_s-aT^star","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"Seguindo a mesma lógica discutida na formulação na temperatura, introduzimos a relação de interpolação T^star=(12)(T_E+T_P) e aplicando-se esta expressão na forma numérica final, após manipulação chega-se à","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"-2h_P+2h_E=2aT_s-aT_E-aT_P","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"Essa expressão permite a solução da entalpia e a atualização do campo de temperaturas se faz através da solução de uma equação não linear do tipo h(T_P)-h_P=0 por célula.","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"Substituindo a temperatura inicial T_0 e sua entalpia associada h_0 na forma algébrica do problema encontramos a primeira linha da matriz que explicita as modificações para se implementar a condição inicial do problema","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"2h_1=2aT_s-aT_1-aT_0-2h_0","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"Completamos assim as derivações para se escrever a forma matricial","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"beginbmatrix\n 2 0 0 dots 0 0 \n-2 2 0 dots 0 0 \n 0 -2 2 ddots 0 0 \nvdots ddots ddots ddots ddots vdots \n 0 0 0 -2 2 0 \n 0 0 0 0 -2 2 \nendbmatrix\nbeginbmatrix\nh_1 \nh_2 \nh_3 \nvdots \nh_N-1 \nh_N \nendbmatrix\n=\nbeginbmatrix\nf_01 + 2h(T_0) \nf_12 \nf_23 \nvdots \nf_N-2N-1 \nf_N-1N \nendbmatrix","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"No vetor do lado direito introduzimos uma função de f dada por","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"f_ij = 2aT_s - a(T_i+T_j)","category":"page"},{"location":"Science/10-Continuum-Mechanics/#Solução-em-volumes-finitos","page":"Reatores pistão","title":"Solução em volumes finitos","text":"","category":"section"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"#finite-volume-method ","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"Como as temperaturas usadas no lado direito da equação não são conhecidas inicialmente, o problema tem um caráter iterativo intrínseco. Inicializamos o lado direito da equação para em seguida resolver o problema na entalpia, que deve ser invertida (equações não lineares) para se atualizar as temperaturas. Isso se repete até que a solução entre duas iterações consecutivas atinja um critério de convergência.","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"Como a estimativa inicial do campo de temperaturas pode ser extremamente ruim, usamos um método com relaxações consecutivas da solução no caminho da convergência. A ideia de base é evitar atualizações bruscas que podem gerar temperaturas negativas ou simplesmente divergir para o infinito. A cada passo, partindo das temperaturas T^(m), aonde m é o índice da iteração, resolvemos o sistema não-linear para encontrar T^(m+1)^prime. Pelas razões citadas, não é razoável utilizar essa solução diretamente, portanto realizamos a ponderação, dita relaxação, que se segue","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"T^(m+1)=(1-alpha)T^(m+1)^prime+αT^(m)","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"O fator alpha representa neste caso a fração de contribuição da solução anterior a nova estimativa. Essa é somente a ponta do iceberg em termos de relaxação e ao longo da série veremos em mais detalhes o conceito. Como critério de parada do cálculo, o que chamamos convergência, queremos que a máxima atualização DeltaT relativa do campo de temperaturas seja menor que um critério varepsilon, ou seja","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"maxfracvertT^(m+1)-T^(m)vertvertmaxT^(m)vert=\nmaxbiggrvertfracDeltaTmaxT^(m)biggrvertvarepsilon","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"Para evitar cálculos separados da nova temperatura e então da variação, podemos usar as definições acima para chegar à","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"DeltaT = (1-alpha)(T^(m+1)^prime-T^(m))","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"e então atualizar a solução com T^(m+1)=T^(m)+DeltaT.","category":"page"},{"location":"Science/10-Continuum-Mechanics/#To-do","page":"Reatores pistão","title":"To-do","text":"","category":"section"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"Abordagem do modelo apresentado em Bird2001 [4] 10.5.\nNusselt variável segundo Bird2001 [4] Tab. 14.2.","category":"page"},{"location":"Notebooks/09-Thermodynamic-Props/#Thermodynamic-properties","page":"Thermodynamic properties","title":"Thermodynamic properties","text":"","category":"section"},{"location":"Notebooks/09-Thermodynamic-Props/","page":"Thermodynamic properties","title":"Thermodynamic properties","text":"using Revise\nusing WallyToolbox\nusing CairoMakie\n\ndisable_thermo_warnings()","category":"page"},{"location":"Notebooks/09-Thermodynamic-Props/","page":"Thermodynamic properties","title":"Thermodynamic properties","text":"data = ThermoDatabase(; selected_compounds = \"*\")\ncompounds(data)","category":"page"},{"location":"Notebooks/09-Thermodynamic-Props/#Comparison-of-silica-properties","page":"Thermodynamic properties","title":"Comparison of silica properties","text":"","category":"section"},{"location":"Notebooks/09-Thermodynamic-Props/","page":"Thermodynamic properties","title":"Thermodynamic properties","text":"with_theme() do\n f = Figure()\n ax = Axis(f[1, 1])\n \n selected_compounds = [\"SIO2_ALPHA\"]\n data = ThermoDatabase(; selected_compounds)\n display(compounds(data))\n\n T = LinRange(300.0, 847.0, 100)\n cp1l(t) = specific_heat(data.compounds[1], t)\n cp2l(t) = specific_heat(data.compounds[2], t)\n lines!(ax, T, cp1l.(T); color = :black)\n lines!(ax, T, cp2l.(T); color = :red)\n\n\n selected_compounds = [\"SIO2_BETA\"]\n data = ThermoDatabase(; selected_compounds)\n display(compounds(data))\n \n T = LinRange(847.0, 1996.0, 100)\n cp1h(t) = specific_heat(data.compounds[1], t)\n cp2h(t) = specific_heat(data.compounds[2], t)\n lines!(ax, T, cp1h.(T); color = :black, label = \"Chase (1998)\")\n lines!(ax, T, cp2h.(T); color = :red, label = \"Schieltz (1964)\")\n axislegend(ax; position = :lt)\n\n xlims!(ax, 300, 2000)\n ylims!(ax, 700, 1400)\n f\nend","category":"page"},{"location":"Notebooks/09-Thermodynamic-Props/#Comparison-of-alumina-properties","page":"Thermodynamic properties","title":"Comparison of alumina properties","text":"","category":"section"},{"location":"Notebooks/09-Thermodynamic-Props/","page":"Thermodynamic properties","title":"Thermodynamic properties","text":"with_theme() do\n f = Figure()\n ax = Axis(f[1, 1])\n \n selected_compounds = [\"AL2O3_GAMMA\"]\n data = ThermoDatabase(; selected_compounds)\n display(compounds(data))\n \n T = LinRange(300.0, 2000.0, 100)\n cp1(t) = specific_heat(data.compounds[1], t)\n cp2(t) = specific_heat(data.compounds[2], t)\n lines!(ax, T, cp1.(T); color = :black, label = \"Chase (1998)\")\n lines!(ax, T, cp2.(T); color = :red, label = \"Schieltz (1964)\")\n axislegend(ax; position = :lt)\n f\nend","category":"page"},{"location":"Notebooks/09-Thermodynamic-Props/#Testing-silica-values","page":"Thermodynamic properties","title":"Testing silica values","text":"","category":"section"},{"location":"Notebooks/09-Thermodynamic-Props/","page":"Thermodynamic properties","title":"Thermodynamic properties","text":"let\n selected_compounds = [\"SIO2_ALPHA\"]\n data = ThermoDatabase(; selected_compounds)\n # display(compounds(data))\n \n T = [298.0, 300.0, 400.0]\n c = [44.57, 44.77, 53.43]\n \n sio2 = data.compounds[1]\n cp1(t) = specific_heat(sio2, t) * molecularmass(sio2)\n test1 = log10(sum(abs2, cp1.(T) - c)) < -4\n\n selected_compounds = [\"SIO2_BETA\"]\n data = ThermoDatabase(; selected_compounds)\n # display(compounds(data))\n \n T = [847.0, 900.0, 1900.0]\n c = [67.42, 67.95, 77.99]\n \n sio2 = data.compounds[1]\n cp2(t) = specific_heat(sio2, t) * molecularmass(sio2)\n test2 = log10(sum(abs2, cp2.(T) - c)) < -4\n\n test1 && test2\nend","category":"page"},{"location":"Computing/05-Postprocessing/#Postprocessing","page":"Postprocessing","title":"Postprocessing","text":"","category":"section"},{"location":"Computing/05-Postprocessing/#ParaView","page":"Postprocessing","title":"ParaView","text":"","category":"section"},{"location":"Computing/05-Postprocessing/","page":"Postprocessing","title":"Postprocessing","text":"Video tutorial by Cyprien Rusu\nVideo tutorial at TuxRiders","category":"page"},{"location":"References/@Antonelo2021a/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Antonelo2021a/","page":"-","title":"-","text":"title: Physics-informed neural nets for control of dynamical systems authors: Eric Aislan Antonelo, Eduardo Camponogara, Laio Oriel Seman, Eduardo Rehbein de Souza, Jean P. Jordanou, Jomi F. Hubner year: 2021 URL: https://doi.org/10.48550/arXiv.2104.02556 –-","category":"page"},{"location":"References/@Gorog1981a/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Gorog1981a/","page":"-","title":"-","text":"title: Radiative heat transfer in rotary kilns authors: J. P. Gorog, J. K. Brimacombe, T. N. Adams year: 1981 –-","category":"page"},{"location":"References/@Pena2001a/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Pena2001a/","page":"-","title":"-","text":"title: Stability of Turing patterns in the Brusselator model authors: B. Peña, C. Pérez-García year: 2001 URL: https://doi.org/10.1103/PhysRevE.64.056213 Drive: –-","category":"page"},{"location":"References/@Tam2019/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Tam2019/","page":"-","title":"-","text":"title: OpenSC: an open-source calculation tool for combustion mixture emissivity/absorptivity authors: Wai Cheong Tam, Walter W. Yuen year: 2019 –-","category":"page"},{"location":"References/@Onsager1931/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Onsager1931/","page":"-","title":"-","text":"title: Reciprocal relations in irreversible processes. I. authors: Lars Onsager year: 1931 –-","category":"page"},{"location":"Software/Elmer/#Elmer-Multiphysics","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"","category":"section"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"Elmer is a multiphysics finite element method (FEM) solver mainly developed by CSC and maintained at GitHub. Several resources can be found in is official webpage and in the community portal and in the forum. There is also an YouTube channel with several tutorials and illustration of the package capabilities.","category":"page"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"The goal of this page is not to supersede the documentation, but to make it (partially) available as a webpage where search and navigation become more intuitive. Notice that this will be fed according to my personal projects and learning, so any contribution to accelerate the process is welcome. Here you find a user-guide-style page with more details are provided below in the selected notes of Elmer documentation.","category":"page"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"","category":"page"},{"location":"Software/Elmer/#Read-me-first","page":"Elmer Multiphysics","title":"Read me first","text":"","category":"section"},{"location":"Software/Elmer/#Quick-answers","page":"Elmer Multiphysics","title":"Quick answers","text":"","category":"section"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"Is Elmer the adequate tool for my projects? In this document you find a short introduction to what Elmer can do and the main executables. \nHow do I start learning Elmer? Simply put, Elmer does not require basic users to master all the fundamentals of FEM, so following the getting started guide seems a good starting point. There you learn how to install, configure, and run the software.\nWhere do I get the binaries of Elmer? If willing to run in Windows, the previous link provides the compiled binaries; there are also instructions for installing directly in Ubuntu as well as all the documentation and other test and sample cases.\nI feel alone, where do I find other users? The forum seems to be moderately active, so you can go there to chat with other users and developers if you are not in a hurry.","category":"page"},{"location":"Software/Elmer/#Limitations-and-issues","page":"Elmer Multiphysics","title":"Limitations and issues","text":"","category":"section"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"Currently the GUI is not able to import SIF files generated manually because it stores its state in a XML file; to be able to re-run cases from the GUI users need to create the equivalent case (eventually using the free text fields) in the GUI itself before regenerating a SIF file. Notice that this will overwrite the SIF file, so keep in mind to backup the file in another directory; that is especially required for highly customized cases.\nWhen exporting meshes from gmsh, consider using the extension .msh and not .msh2 as is often seen as a reminder of format 2 mesh; Elmer GUI is unable to render the mesh in this case. Notice that this has apparently no effect if running from command line.","category":"page"},{"location":"Software/Elmer/#Ongoing-work","page":"Elmer Multiphysics","title":"Ongoing work","text":"","category":"section"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"Development of a VS Code syntax highlight extension with help of data provided in SOLVER.KEYWORDS.","category":"page"},{"location":"Software/Elmer/#Retrieving-materials","page":"Elmer Multiphysics","title":"Retrieving materials","text":"","category":"section"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"Because there are plenty of interesting materials in Elmer public directory, it is worth downloading it all and selecting what to keep later. In a Linux terminal one could run the following command. If you also want to retrieve the animations, binaries, and virtual machines, consider removing and/or modifying the -X options.","category":"page"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"#!/usr/bin/env bash\n\nURL=\"https://www.nic.funet.fi/pub/sci/physics/elmer/\"\n\nwget -r -l 20 --no-parent \\\n -X /pub/sci/physics/elmer/anim/ \\\n -X /pub/sci/physics/elmer/bin/ \\\n -R \"index.html*\" \\\n ${URL}","category":"page"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"","category":"page"},{"location":"Software/Elmer/#Elmer-Fundamentals","page":"Elmer Multiphysics","title":"Elmer Fundamentals","text":"","category":"section"},{"location":"Software/Elmer/#Preprocessing-steps","page":"Elmer Multiphysics","title":"Preprocessing steps","text":"","category":"section"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"Other than the native ElmerGrid, several other software can be used for conceiving a geometry and mesh generation workflow. Users are encouraged to use external tools such as gmsh or Salome to generate computational meshes, built-in support in Elmer bein limited to very simple geometries only. For complex geometries FreeCAD is a standout alternative. For more consider reading Geometry and Preprocessing.\nNot all gmsh standard mesh formats are supported, but only version 2 (as for OpenFOAM); that said, users are encouraged to export mesh in UNV format to avoid compatibility issues, and also because both proposed tools support it. You can control the element orders in command line using option -order ; gmsh operates this way so that the same script can generate any supported element type.\nFor importing meshes one uses ElmerGrid , where the format arguments are documented in the manual sections 1.3 and 1.4. The UNV input is given by number 8 while standard ElmerSolver output by number 2, so that the conversion command would start with ElmerGrid 8 2 . Always verify the number of nodes remain untouched after conversion - or if it changed when using option -merge , merging nodes that are closer than the user-defined .\nRemember to use Coherence; with OpenCASCADE factory in gmsh scripts to automatically strip internal faces; that might not be enough for complex cases, see below. Note: I tried doing so and unless Physical Surfaces naming the external boundaries are provided every interface is dumped and imported by Elmer; maybe I misunderstood the use of command!\nBecause faces are not named in Elmer, i.e. no matter what Physical Surface names you provide in gmsh, even for the advanced user working from command line it might be interesting to use the interactive zone grouping capabilities of ElmerGUI. That might even become a requirement as geometric complexity grows.","category":"page"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"Software Notes\nFreeCAD Geometry only for now, probably the best in the list; good parametric modeling support.\nSalome Can export UNV (8) meshes readable by Elmer. An extension to call Elmer directly from Salome is under development.\ngmsh Can export MSH2 (14) and UNV (8) formats readable by Elmer.\nnetgen Is able to write native Elmer linear meshes; can be used as a plug-in.\ntetgen Can be used as a plug-in.","category":"page"},{"location":"Software/Elmer/#Using-Elmer","page":"Elmer Multiphysics","title":"Using Elmer","text":"","category":"section"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"Newcomers might be interested in ElmerGUI; although very intuitive, the interface is quite limited and for complex programs running from command line is the preferred mode.\nMost users will finally end setting up an workflow employing both to ElmerSolver (to run the simulations) and ElmerGrid (to prepare the grid and setup parallelization).\nThere is also ViewFactors which might be useful in special cases involving radiation and other executables but they are not mentioned here because they fall in the legacy code family.\nUsers must be aware that Elmer has no default unit system; one must take care that units are coherent across the different models and materials.\nSupport to mathematical operations in SIF through MATC, which has its own syntax and documentation. It can be used, e.g. for computing temperature dependent properties, what can be helpful for simple expressions (instead of writing Fortran 90 code for extensions).","category":"page"},{"location":"Software/Elmer/#Parallel-computing","page":"Elmer Multiphysics","title":"Parallel computing","text":"","category":"section"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"Before running in parallel a working case running in serial is required; using ElmerGUI this can be enabled in Run > Parallel settings.... Notice that after running postprocessing of .pvtu needs to be done in ParaView directly.\nTo partition the mesh from command line one needs to run ElmerGrid 2 2 -partdual -metiskway , which will convert from Elmer mesh format (2) into itself (thus the 2 2 in the command) and dump the resulting mesh in partitions., with being the number of physical cores to run the simulation.\nParallel cases can be run with mpiexec -n ElmerSolver_mpi. Notice that under Linux the MPI runner is called mpirun instead of mpiexec.","category":"page"},{"location":"Software/Elmer/#Tips-and-ideas","page":"Elmer Multiphysics","title":"Tips and ideas","text":"","category":"section"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"Use Coordinate Mapping to rotate meshes with oriented particles\nScaling of a single direction can be done with Coordinate Scaling\nTime step can be changed with a list of elements in Timestep Intervals, e.g.","category":"page"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"! Run 10 time-steps of 0.1 s, then 100 with 1.0 s.\nTimestep Intervals(2) = 10 100\nTimestep Sizes(2) = 0.1 1.0","category":"page"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"Take care with Linear System Abort Not Converged = True for physical consistency; generally continuing a simulation after a failed step is worthless unless one is pseudo-stepping towards a difficult (highly nonlinear) steady-state.","category":"page"},{"location":"Software/Elmer/#Material-properties","page":"Elmer Multiphysics","title":"Material properties","text":"","category":"section"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"Material properties can be specified as:","category":"page"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"Constant: just the default numeric input in SIF files\nTabulated linearly or using a cubic spline, e.g.","category":"page"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"! Linear interpolation\nViscosity = Variable Temperature\n Real\n\t298.15 1.0\n\t! ... more data here\n\t373.15 2.0\nEnd\n\n! Cubic spline interpolation\nViscosity = Variable Temperature\n Real cubic\n\t298.15 1.0\n\t315.15 1.1\n\t345.15 1.5\n\t! ... more data here\n\t373.15 2.0\nEnd","category":"page"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"Arrays: for representing anisotropic bodies, e.g.","category":"page"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"Heat Conductivity(3,3) = 1 0 0\\\n 0 1 0\\\n 0 0 2","category":"page"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"Using MATC as explained below in this page. Notice that sourcing files in MATC is the recommended way to get reusable code; coding MATC in SIF files requires to escape all lines and quickly becomes messy.\nUser-defined functions (UDF) can also be provided in Fortran; notice that even when MATC can be used, this may lead to a speed-up of calculations with the inconvenient of needing more code. So for cases that are intended to be reused, it is important to consider writing proper extensions in Fortran. The following example illustrates a temperature dependent thermal conductivity function which is evaluated by Elmer at all nodes. In most cases a simple USE DefUtils is enough to get the required Elmer API to write the extension.","category":"page"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"FUNCTION conductivity(model, n, time) RESULT(k)\n !**************************************************************\n ! Load Elmer library.\n !**************************************************************\n \n USE DefUtils\n IMPLICIT None\n\n !**************************************************************\n ! Function interface.\n !**************************************************************\n \n TYPE(Model_t) :: model\n INTEGER :: n\n REAL(KIND=dp) :: time, k\n\n !**************************************************************\n ! Function internals.\n !**************************************************************\n \n TYPE(Variable_t), POINTER :: varptr\n REAL(KIND=dp) :: T\n INTEGER :: idx\n\n !**************************************************************\n ! Actual implementation\n !**************************************************************\n\n ! Retrieve pointer to the temperature variable.\n varptr => VariableGet(model%Variables, 'Temperature')\n\n ! Access index of current node.\n idx = varptr%Perm(n)\n\n ! Retrieve nodal temperature.\n T = varptr%Values(idx)\n\n ! Compute heat conductivity from NodalTemperature, k=k(T)\n k = 2.0 - T * (2.5e-03 - 1.0e-06 * T)\nEND FUNCTION conductivity","category":"page"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"In order to compile the above assume it is written to properties.f90 file; then one can call elmerf90 properties.f90 –o properties to generate the required shared library that is loaded in runtime by Elmer. Below we illustrate the use of Procedure to attach this library to a given material; first one provides the name of the shared library then the name of the function. A single library can in fact contain several functionalities.","category":"page"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"Material 1\n Name = \"Solid\"\n Heat Conductivity = Variable Time\n Procedure \"properties\" \"conductivity\"\n Heat Capacity = 1000\n Density = 2500\nEnd","category":"page"},{"location":"Software/Elmer/#Postprocessing","page":"Elmer Multiphysics","title":"Postprocessing","text":"","category":"section"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"For postprocessing the recommended way is by using external tools as ParaView and PyVista, both handling well the VTK format of outputs. Nonetheless there are a some in-solver processing utilities that are worth knowing, especially in what concerns extracting and filtering data from certain regions, creating new fields, and computing fluxes.","category":"page"},{"location":"Software/Elmer/#Creating-a-new-scalar","page":"Elmer Multiphysics","title":"Creating a new scalar","text":"","category":"section"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"The keyword set of materials is actually not fixed; one can, for instance, create composition field in different units with MATC, as illustrated below (case here):","category":"page"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"MoleFraction = Variable Concentration\n Real MATC \"carbonmolefraction(tx)\"","category":"page"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"Then in solver SaveMaterials, this new name MoleFraction can be used as a variable:","category":"page"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"Solver 1\n Equation = SaveMaterials\n Parameter 1 = Concentration Diffusivity\n Parameter 2 = MoleFraction\n Procedure = \"SaveData\" \"SaveMaterials\"\n Exec Solver = After Timestep\nEnd","category":"page"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"Another situation that can be frequently found is unit conversion for temperature. It was chosen to implement it in this case because it is multi-material; that is a reminder that in such cases the new variable needs to be created for all materials (as this is a tweak, since the temperature is not a material property, but a global field). If forgotten in one material, an error will show up in ParaView telling you that the field is not available in some regions.","category":"page"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"","category":"page"},{"location":"Software/Elmer/#Solver-Input-Files-(SIF)","page":"Elmer Multiphysics","title":"Solver Input Files (SIF)","text":"","category":"section"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"Once you get serious with Elmer it is a natural evolution to prefer to work with SIF files instead of the GUI most of the time. This is also true in a majority of scientific computing software. The documentation of SIF is spread over the whole documentation of Elmer and this page tries to consolidate the most of it. For the beginner, this video is a good starting point, this page being more of a reference manual.","category":"page"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"Because syntax highlighting is important for productivity, I am working in a minimalistic extension for VS Code. Its partial development can be found here. After cloning the repository, simply copy the sif/ directory under %USERPROFILE%/.vscode/extensions on in the equivalent directory documented here.","category":"page"},{"location":"Software/Elmer/#MATC","page":"Elmer Multiphysics","title":"MATC","text":"","category":"section"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"Elmer provides a few extension methods. For complex models you might be prompted to use directly Fortran 90. For simpler things, such as providing temperature dependent thermophysical properties, it has its own parser for use in SIF, the metalanguage MATC. Expressions provided in MATC can be evaluated when file is read or during simulation execution.","category":"page"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"Because it is quite concise, I summarized the whole of MATC syntax and functions in this page. For the official documentation please refer to this document.","category":"page"},{"location":"Software/Elmer/#Declaring-variables","page":"Elmer Multiphysics","title":"Declaring variables","text":"","category":"section"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"Variables in MATC can be matrices and strings; nonetheless, both are stored as double precision arrays so creating large arrays of strings can represent a waste of memory. For some weird reason I could not yet figure out, MATC language can be quite counterintuitive.","category":"page"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"Let's start by creating a variable, say x below; attribution, such a in Python, creates the variable. It was stated that everything is a matrix or string; since x is not a string, it is actually a 1times1 matrix and in this case we can omit the indexing when allocating its memory.","category":"page"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"x = 1","category":"page"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"So far nothing weird; when declaring a string as k below we are actually creating a 1times5 row matrix, what is not unusual in many programming languages (except for being double precision here). Furthermore, we use the typical double-quotes notation for strings.","category":"page"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"k = \"hello\"","category":"page"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"Matrix indexing is zero-based, as in C or Python. Matrix slicing is done as in many scripting languages, such as Python, Julia, Octave, ..., and we can reverse the order of the first six elements of an array y as follows: ","category":"page"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"y(0, 0:5) = y(0, 5:0)","category":"page"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"Notice above the fact that matrix slicing is last-inclusive, as in Julia, meaning that all elements from index zero to five inclusive are included in the slice. Weirdness starts when you do something like","category":"page"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"z(0:9) = 142857","category":"page"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"which according to the documentation will produce an array 1 4 2 8 5 7 1 4 2 8; I could not verify this behavior yet. Additionally, the following produces another unexpected result:","category":"page"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"z(9, 9) = 1","category":"page"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"If matrix z does not exist, this results in a 10times10 matrix with all zeros except the explicitly declared element. The size of variables are dynamic, so in the above if z already existed but wa smaller, it would be padded with zeros instead.","category":"page"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"Finally, logical indexing is also allowed:","category":"page"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"x(x < 0.05) = 0.05","category":"page"},{"location":"Software/Elmer/#Control-structures","page":"Elmer Multiphysics","title":"Control structures","text":"","category":"section"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"MATC provides conditionals and loops as control structures. Below we have the if-else statement, which can be declared inline of using a C-style declaration using braces.","category":"page"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"if ( expr ) expr; else expr;\n\nif ( expr )\n{\n expr;\n ...\n expr;\n} else {\n expr;\n ...\n expr;\n}","category":"page"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"Loops can be declared using both for or while. There is no mechanism of generating values within a for loop and one must provide a vector of indexes for repetition. In the official documentation there is no reference to a continue or break statement and I could not verify their existence yet.","category":"page"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"for( i=vector ) expr;\n\nfor( i=vector )\n{\n expr;\n ...\n expr;\n}\n\nwhile( expr ) expr;\n\nwhile( expr )\n{\n expr;\n ...\n expr;\n}","category":"page"},{"location":"Software/Elmer/#Operators","page":"Elmer Multiphysics","title":"Operators","text":"","category":"section"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"Assume the following definitions:","category":"page"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"a, b and c ordinary matrices \nl, t and r logical matrices \ns, n and m scalars ","category":"page"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":" \nb = a' is transpose of matrix a.\nb = @a evaluate content of a string variable a as a MATC statement.\nt = ~l elementwise logical not of if x is not zero.\nb = a ^ s if a is a square matrix and s is integral, a matrix power is computed, otherwise an elementwise power.\nc = a * b if a and b are compatible for matrix product, that is computed, otherwise if they are of the same size or at least one of them is scalar, an elementwise product is computed.\nc = a # b elementwise multiplication of a and b.\nc = a / b is fraction of a and b computed elementwise.\nc = a + b is sum of matrices a and b computed elementwise.\nc = a - b is difference of matrices a and b computed elementwise.\nl = a == b equality of matrices a and b elementwise.\nl = a <> b inequality of matrices a and b elementwise.\nl = a < b true if a is less than b computed elementwise.\nl = a > b true if a is greater than b computed elementwise.\nl = a <= b true if a is less than or equal to b computed elementwise.\nl = a >= b true if a is greater than or equal to b computed elementwise.\na = n : m return a vector of values starting from n and ending to m by increment of (plus-minus) one.\nr = l & t elementwise logical and of a and b.\nl = a | b elementwise logical or of a and b.\nc = a ? b reduction: set values of a where b is zero to zero.\nb = n m % a resize a to matrix of size n by m.\nb = a assigning a to b.","category":"page"},{"location":"Software/Elmer/#Function-definitions","page":"Elmer Multiphysics","title":"Function definitions","text":"","category":"section"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"The syntax of the function definition is similar to that of Julia and is given below. The function body is enclosed by braces. Instead of using a return statement, the resulting value is attributed to a variable named after the function with a leading underscore. Notice the ! denoting comments in the description of the function.","category":"page"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"function name(arg1, arg2, ...)\n!\n! Optional function description (seen with help(\"name\"))\n!\nimport var1, var2\nexport var3, var4\n{\n expr;\n ...\n expr;\n\n _name = value\n}","category":"page"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"Functions have their own list of variables. Global variables are not seen in this function unless imported by import or given as arguments. Local variables can be made global by the export statement. ","category":"page"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"Functions, if returning matrices, behave in many ways as variables do. So if you have defined function mult as follows ","category":"page"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"function mult(a, b)\n{\n _mult = a * b;\n}","category":"page"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"You can get element (3,5) of the a times b matrix with mult(x,y)[3,5] or the diagonal values of the same matrix by diag(mult(x, y)).","category":"page"},{"location":"Software/Elmer/#Built-in-functions","page":"Elmer Multiphysics","title":"Built-in functions","text":"","category":"section"},{"location":"Software/Elmer/#C-style-math","page":"Elmer Multiphysics","title":"C-style math","text":"","category":"section"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"The following listing provides a series of mathematical functions which follow a their meaning in C. The only exceptions are ln denoting the natural logarithm and log used here for base 10 logarithms.","category":"page"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"r = sin(x)\n\nr = cos(x)\n\nr = tan(x)\n\nr = asin(x)\n\nr = acos(x)\n\nr = atan(x)\n\nr = sinh(x)\n\nr = cosh(x)\n\nr = tanh(x)\n\nr = exp(x)\n\nr = ln(x)\n\nr = log(x)\n\nr = sqrt(x)\n\nr = ceil(x)\n\nr = floor(x)\n\nr = abs(x)\n\nr = pow(x,y) ","category":"page"},{"location":"Software/Elmer/#General-utilities","page":"Elmer Multiphysics","title":"General utilities","text":"","category":"section"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":" \nfuncdel(name) Delete given function definition from parser.\nfunclist(name) Give header of the function given by name.\nenv(name) Get value of environment variable of the operating system.\nexists(name) Return true (non-zero) if variable by given name exists otherwise return false (=0).\nsource(name) Execute commands from file given name.\nformat(precision) Set number of digits used in printing values in MATC.\nr = eval(str) Evaluate content of string str. Another form of this command is @str.\nwho Give list of currently defined variables.\nhelp or help(\"symbol\") First form of the command gives list of available commands. Second form gives help on specific routine.","category":"page"},{"location":"Software/Elmer/#String-and-I/O-functions","page":"Elmer Multiphysics","title":"String and I/O functions","text":"","category":"section"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":" \nstr = sprintf(fmt[,vec]) Return a string formatted using fmt and values from vec. A call to corresponding C-language function is made.\nvec = sscanf(str,fmt) Return values from str using format fmt. A call to corresponding C-language function is made.\nstr = fread(fp,n) Read n bytes from file given by fp. File pointer fp should have been obtained from a call to fopen or freopen, or be the standard input file stdin. Data is returned as function value.\nvec = fscanf(fp,fmt) Read file fp as given in format. Format fmt is equal to C-language format. File pointer fp should have been obtained from a call to fopen or freopen, or be the standard input.\nstr = fgets(fp) Read next line from fp. File pointer fp should have been obtained from a call to fopen or freopen or be the standard input.\nn = fwrite(fp,buf,n) Write n bytes from buf to file fp. File pointer fp should have been obtained from a call to fopen or freopen or be the standard output (stdout) or standard error (stderr). Return value is number of bytes actually written. Note that one matrix element reserves 8 bytes of space.\nn = fprintf(fp,fmt[, vec]) Write formatted string to file fp. File pointer fp should have been obtained from a call to fopen or freopen or be the standard output (stdout) or standard error (stderr). The format fmt is equal to C-language format.\nfputs(fp,str) Write string str to file fp. File pointer fp should have been obtained from a call to fopen or freopen or be the standard input (stdin).\nfp = fopen(name,mode) Reopen file given previous file pointer, name and access mode. The most usual modes are \"r\" for reading and \"w\" for writing. Return value fp is used in functions reading and writing the file.\nfp = freopen(fp,name,mode) Reopen file given previous file pointer, name and access mode. The most usual modes are \"r\" for reading and \"w\" for writing. Return value fp is used in functions reading and writing the file.\nfclose(fp) Close file previously opened with fopen or freopen.\nsave(name, a[,ascii_flag]) Close file previously opened with fopen or freopen.\nr = load(name) Load matrix from a file given name and in format used by save command.","category":"page"},{"location":"Software/Elmer/#Numerical-utilities","page":"Elmer Multiphysics","title":"Numerical utilities","text":"","category":"section"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":" \nr = min(matrix) Return value is a vector containing smallest element in columns of given matrix. r = min(min(matrix)) gives smallest element of the matrix.\nr = max(matrix) Return value is a vector containing largest element in columns of given matrix. r = max(max(matrix)) gives largest element of the matrix.\nr = sum(matrix) Return vector is column sums of given matrix. r = sum(sum(matrix)) gives the total sum of elements of the matrix.\nr = zeros(n,m) Return n by m matrix with elements initialized to zero.\nr = ones(n,m) Return n by m matrix with elements initialized to one.\nr = rand(n,m) Return n by m matrix with elements initialized with random numbers from zero to one.\nr = diag(a) Given matrix return diagonal entries as a vector. Given vector return matrix with diagonal elements from vector. r = diag(diag(a)) gives matrix with diagonal elements from matrix a, otherwise elements are zero.\nr = vector(start,end,inc) Return vector of values going from start to end by inc.\nr = size(matrix) Return size of given matrix.\nr = resize(matrix,n,m) Make a matrix to look as a n by m matrix. This is the same as r = n m % matrix.\nr = where(a) Return a row vector giving linear index to a where a is not zero.\nr = matcvt(matrix, type) Makes a type conversion from MATC matrix double precision array to given type, which can be one of the following: \"int\", \"char\" or \"float\".\nr = cvtmat(special, type) Makes a type conversion from given type to MATC matrix. Type can be one of the following: \"int\", \"char\" or \"float\".","category":"page"},{"location":"Software/Elmer/#Linear-algebra","page":"Elmer Multiphysics","title":"Linear algebra","text":"","category":"section"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":" \nr = trace(matrix) Return value is the sum of matrix diagonal elements.\nr = det(matrix) Return value is determinant of given square matrix.\nr = inv(matrix) Invert given square matrix. Computed also by operator ^-1\nr = tril(x) Return the lower triangle of the matrix x.\nr = triu(x) Return the upper triangle of the matrix x.\nr = eig(matrix) Return eigenvalues of given square matrix. The expression r(n,0) is real part of the n:th eigenvalue, r(n,1) is the imaginary part respectively.\nr = jacob(a,b,eps) Solve symmetric positive definite eigenvalue problem by Jacob iteration. Return values are the eigenvalues. Also a variable eigv is created containing eigenvectors.\nr = lud(matrix) Return value is LUD decomposition of given matrix.\nr = hesse(matrix) Return the upper hessenberg form of given matrix.\nr = eye(n) Return n by n identity matrix.","category":"page"},{"location":"Software/Elmer/#Usage","page":"Elmer Multiphysics","title":"Usage","text":"","category":"section"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"Although the language is pretty fast for most simple uses, it is much slower than Fortran extensions, so use with case when scalability is needed. Another point is overuse of MATC; do not use it with simple numerical expressions, e.g. OneThird = Real $1.0/3.0 is much faster than its MATC counterpart OneThird = Real MATC \"1.0/3.0\".","category":"page"},{"location":"Software/Elmer/#Direct-expression-coding","page":"Elmer Multiphysics","title":"Direct expression coding","text":"","category":"section"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"One thing that in my opinion lacks in the documentation are examples of use in conjunction with SIF. For instance, for setting the thermal conductivity of a material as temperature-dependent one could use the following snippet and modify the string to match the desired expression. An example of its usage is provided in this case.","category":"page"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"  Heat Conductivity = Variable Temperature\n    Real MATC \"1.0 - tx * (2.5E-03 - 1.2E-06 * tx)\"","category":"page"},{"location":"Software/Elmer/#Sourcing-functions-from-user-modules","page":"Elmer Multiphysics","title":"Sourcing functions from user modules","text":"","category":"section"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"Models can become too complex to code in a single line. Hopefully MATC provides functions which can be declared in external modules. I avoid coding MATC directly in SIF because their syntax is different and that can quickly lead to unmaintainable code. An example of such external sourcing is provided in this case. You need to remember to call source(\"module\") in Simulation section of SIF so that the functions can be used elsewhere. The call of a function become something as","category":"page"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"  Concentration Diffusivity = Variable Concentration\n    Real MATC \"diffusivity(tx)\"","category":"page"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"if independent variable is concentration or for time","category":"page"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"  Mass Transfer Coefficient = Variable Time\n    Real MATC \"masstransfercoef(tx)\"","category":"page"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"You can even use multiple variables, e.g.","category":"page"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"  Mass Transfer Coefficient = Variable Time, Temperature\n    Real MATC \"masstransfercoef(tx(0), tx(1))\"","category":"page"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"PS: I managed to use a single source in SIF, although the documentation does not state that many sources are forbidden; for some reason multiple sources work when sourcing from a file.","category":"page"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"For more complex cases such as this one it is worth writing actual MATC function modules; since there is no syntax highlighter available for MATC in VS Code, the .ini extension seems to provide better readability to the code. The problem was split in two parts: the models which take care of sourcing the conditions, so that basic users could only edit the latter and run their variant calculations with no coding skills. Notice that the symbols that are used in SIF are exported from this line instead of being set as global variables.","category":"page"},{"location":"Software/Elmer/#User-defined-functions","page":"Elmer Multiphysics","title":"User-defined functions","text":"","category":"section"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"TODO","category":"page"},{"location":"References/@Fang2023a/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Fang2023a/","page":"-","title":"-","text":"title: \"Ensemble learning for physics informed neural networks: a gradient boosting approach\" authors: Zhiwei Fang, Sifan Wang, Paris Perdikaris year: 2023 DOI: https://doi.org/10.48550/arXiv.2302.13143 –-","category":"page"},{"location":"References/@Fang2023a/","page":"-","title":"-","text":"Discussed in [[@Guo2023c]].","category":"page"},{"location":"WallyToolbox/utilities/#Utilities","page":"Utilities","title":"Utilities","text":"","category":"section"},{"location":"WallyToolbox/utilities/","page":"Utilities","title":"Utilities","text":"EditURL = \"https://github.com/wallytutor/WallyToolbox.jl/blob/main/docs/src/WallyToolbox/utilities.md\"\nCurrentModule = WallyToolbox\nDocTestSetup = quote\n using WallyToolbox\nend","category":"page"},{"location":"WallyToolbox/utilities/#Haskell-like-array-slicing","page":"Utilities","title":"Haskell-like array slicing","text":"","category":"section"},{"location":"WallyToolbox/utilities/","page":"Utilities","title":"Utilities","text":"Those who know Haskell probably started learning it by manipulating lists with head and tail. Those functionalities are not available in Julia by default and array slicing - with an ugly syntax - is required. Since this is done often in the fields of application of WallyToolbox, both head and tail together with a body functions are available in its core. They are simple wrapers over the @view macro and work with both iterable types and arrays. The following snippet illustrates their usage.","category":"page"},{"location":"WallyToolbox/utilities/","page":"Utilities","title":"Utilities","text":"julia> v = collect(1:4);\n\njulia> head(v) == [1; 2; 3]\ntrue\n\njulia> tail(v) == [2; 3; 4]\ntrue\n\njulia> body(v) == [2; 3]\ntrue","category":"page"},{"location":"WallyToolbox/utilities/","page":"Utilities","title":"Utilities","text":"More examples are provided in the documentation of each of the functions.","category":"page"},{"location":"WallyToolbox/utilities/","page":"Utilities","title":"Utilities","text":"WallyToolbox.head\nWallyToolbox.tail\nWallyToolbox.body","category":"page"},{"location":"WallyToolbox/utilities/#WallyToolbox.head","page":"Utilities","title":"WallyToolbox.head","text":"head(z)\n\nAccess view of array head. See also tail and body.\n\njulia> head(1:4)\n1:3\n\njulia> head([1, 2, 3, 4])\n3-element view(::Vector{Int64}, 1:3) with eltype Int64:\n 1\n 2\n 3\n\n\n\n\n\n","category":"function"},{"location":"WallyToolbox/utilities/#WallyToolbox.tail","page":"Utilities","title":"WallyToolbox.tail","text":"tail(z)\n\nAccess view of array tail. See also head and body.\n\njulia> tail([1, 2, 3, 4])\n3-element view(::Vector{Int64}, 2:4) with eltype Int64:\n 2\n 3\n 4\njulia> tail(1:4)\n2:4\n\n\n\n\n\n","category":"function"},{"location":"WallyToolbox/utilities/#WallyToolbox.body","page":"Utilities","title":"WallyToolbox.body","text":"body(z)\n\nAccess view of array body. See also head and tail.\n\njulia> body([1, 2, 3, 4])\n2-element view(::Vector{Int64}, 2:3) with eltype Int64:\n 2\n 3\njulia> body(1:4)\n2:3\n\n\n\n\n\n","category":"function"},{"location":"WallyToolbox/utilities/#General-utilities","page":"Utilities","title":"General utilities","text":"","category":"section"},{"location":"WallyToolbox/utilities/","page":"Utilities","title":"Utilities","text":"WallyToolbox.defaultvalue\nWallyToolbox.redirect_to_files\nWallyToolbox.test_exhaustive","category":"page"},{"location":"WallyToolbox/utilities/#WallyToolbox.defaultvalue","page":"Utilities","title":"WallyToolbox.defaultvalue","text":"Syntax sugar for handling a possibly nothing value.\n\n\n\n\n\n","category":"function"},{"location":"WallyToolbox/utilities/#WallyToolbox.redirect_to_files","page":"Utilities","title":"WallyToolbox.redirect_to_files","text":"Helper function to redirect outputs to the right files.\n\n\n\n\n\n","category":"function"},{"location":"WallyToolbox/utilities/#WallyToolbox.test_exhaustive","page":"Utilities","title":"WallyToolbox.test_exhaustive","text":"Run all assertions before throwing an error.\n\n\n\n\n\n","category":"function"},{"location":"WallyToolbox/utilities/#Literate-programming","page":"Utilities","title":"Literate programming","text":"","category":"section"},{"location":"WallyToolbox/utilities/","page":"Utilities","title":"Utilities","text":"Because WallyToolbox is intended to be run from a portable Julia environment without footprint in the local system, some particularities arise in setting a Jupyter toolset. The following tools tools provide launchers for starting local Jupyter Notebook and Jupyterlab sessions. ","category":"page"},{"location":"WallyToolbox/utilities/","page":"Utilities","title":"Utilities","text":"note: Note\nNotice it is up to the user to define the path JUPYTER_DATA_DIR as an environment variable; default Jupyter configuration is not accepted because it might break the local system.","category":"page"},{"location":"WallyToolbox/utilities/","page":"Utilities","title":"Utilities","text":"WallyToolbox.launch_notebook\nWallyToolbox.launch_jupyterlab","category":"page"},{"location":"WallyToolbox/utilities/#WallyToolbox.Notebook.launch_notebook","page":"Utilities","title":"WallyToolbox.Notebook.launch_notebook","text":"Launch Jupyter notebook session with WallyToolbox kernel.\n\n\n\n\n\n","category":"function"},{"location":"WallyToolbox/utilities/#WallyToolbox.Notebook.launch_jupyterlab","page":"Utilities","title":"WallyToolbox.Notebook.launch_jupyterlab","text":"Launch Jupyterlab session with WallyToolbox kernel.\n\n\n\n\n\n","category":"function"},{"location":"References/@Karniadakis2021a/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Karniadakis2021a/","page":"-","title":"-","text":"title: Physics-informed machine learning authors: George Em Karniadakis, Ioannis G. Kevrekidis, Lu Lu, Paris Perdikaris, Sifan Wang, Liu Yang year: 2021 –-","category":"page"},{"location":"References/@Guo2023b/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Guo2023b/","page":"-","title":"-","text":"title: \"Unraveling the design pattern of physics-informed neural networks: Series 02\" authors: Shuai Guo year: 2023 URL: TODO –-","category":"page"},{"location":"References/@Lehrer1930/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Lehrer1930/","page":"-","title":"-","text":"title: Über das eisen-wasserstoff- ammoniak-gleichgewicht authors: E. Lehrer year: 1930 –-","category":"page"},{"location":"Notebooks/02-Part-Radiation-Heating/#Transient-heat-transfer","page":"Transient heat transfer","title":"Transient heat transfer","text":"","category":"section"},{"location":"Notebooks/02-Part-Radiation-Heating/","page":"Transient heat transfer","title":"Transient heat transfer","text":"No further words, let's start by importing the required toolset:","category":"page"},{"location":"Notebooks/02-Part-Radiation-Heating/","page":"Transient heat transfer","title":"Transient heat transfer","text":"using CairoMakie\nusing LinearAlgebra\nusing Printf\nusing Unitful\n\n# Stefan-Boltzmann constant.\nconst σ = 5.67e-08u\"W/(m^2*K^4)\"\n\nnothing; #hide","category":"page"},{"location":"Notebooks/02-Part-Radiation-Heating/#First-problem","page":"Transient heat transfer","title":"First problem","text":"","category":"section"},{"location":"Notebooks/02-Part-Radiation-Heating/","page":"Transient heat transfer","title":"Transient heat transfer","text":"Implementation of section 2.3 of Nithiarasu et al. (2016) of a transient heat transfer problem. This is the logical extension of what has been explored in a previous study. The overall problem is stated in terms of the inertia matrix mathbfC, the stiffness mathbfK and the forcing function mathbff. The following first order differential equation of temperature mathcalT is to be solved:","category":"page"},{"location":"Notebooks/02-Part-Radiation-Heating/","page":"Transient heat transfer","title":"Transient heat transfer","text":"mathbfCdotmathcalT+mathbfKmathcalT=mathbff","category":"page"},{"location":"Notebooks/02-Part-Radiation-Heating/","page":"Transient heat transfer","title":"Transient heat transfer","text":"Notice here that the temperature mathcalT here is a vector corresponding to the three problem components, the steel part, the furnace gas, and the outer refractory walls.","category":"page"},{"location":"Notebooks/02-Part-Radiation-Heating/","page":"Transient heat transfer","title":"Transient heat transfer","text":"Because the model is stated in lumped form, i.e. simplified to a zero-dimensional space, we add a phase of calculation of the heat capacities of materials in compatible units to remain within the formulation proposed in the reference. In this lumped format, the elements of matrix mathbfC are given in units of energy per unit temperature because they already incorporate the effect bodies masses through C_ii=m_ic_Pi where i indicates de component index.","category":"page"},{"location":"Notebooks/02-Part-Radiation-Heating/","page":"Transient heat transfer","title":"Transient heat transfer","text":"To get a dynamics that is interpretable in the real world we will start by computing reasonable orders of magnitude of the C_ii by providing the masses of the bodies and typical values of specific heats for the involved materials. Considering a steel sphere of 10 cm placed floating in a 40 cm air environment limited by a spherical refractory with outer shell of 60 cm we can estimate these masses, in the same order, as:","category":"page"},{"location":"Notebooks/02-Part-Radiation-Heating/","page":"Transient heat transfer","title":"Transient heat transfer","text":"m = 1u\"kg\" * [4.2, 0.033, 240.0]\n\nnothing; # hide","category":"page"},{"location":"Notebooks/02-Part-Radiation-Heating/","page":"Transient heat transfer","title":"Transient heat transfer","text":"Next we provide the specific heats of the materials already multiplied by the above masses:","category":"page"},{"location":"Notebooks/02-Part-Radiation-Heating/","page":"Transient heat transfer","title":"Transient heat transfer","text":"cp(T) = m[1] * 6.00e+03u\"J/(kg*K)\"\ncg(T) = m[2] * 1.00e+03u\"J/(kg*K)\"\ncw(T) = m[3] * 9.00e+02u\"J/(kg*K)\"\n\nnothing; # hide","category":"page"},{"location":"Notebooks/02-Part-Radiation-Heating/","page":"Transient heat transfer","title":"Transient heat transfer","text":"Since our goal is to make the problem fully treated in matrix form, we stack the specific heats together. Since matrix mathrmC is diagonal and composed by these specific heats, its inverse is simply the reciprocal of its diagonal elements, what is trivial to prove. This allows the problem to be reworked as","category":"page"},{"location":"Notebooks/02-Part-Radiation-Heating/","page":"Transient heat transfer","title":"Transient heat transfer","text":"dotmathcalT+mathbfC^-1mathbfKmathcalT=mathbfC^-1mathbff","category":"page"},{"location":"Notebooks/02-Part-Radiation-Heating/","page":"Transient heat transfer","title":"Transient heat transfer","text":"Setting the derivative term to be alone could be interesting for testing different time-stepping strategies, for instance. Matrix mathrmC^-1 is provided by inertiainv below:","category":"page"},{"location":"Notebooks/02-Part-Radiation-Heating/","page":"Transient heat transfer","title":"Transient heat transfer","text":"specificheat(T) = [cp(T[1]); cg(T[2]); cw(T[3])]\n\ninertiainv(T) = diagm(1 ./ specificheat(T))\n\nnothing; # hide","category":"page"},{"location":"Notebooks/02-Part-Radiation-Heating/","page":"Transient heat transfer","title":"Transient heat transfer","text":"We inspect the inverse inertia matrix:","category":"page"},{"location":"Notebooks/02-Part-Radiation-Heating/","page":"Transient heat transfer","title":"Transient heat transfer","text":"inertiainv([300.0, 300.0, 300.0])","category":"page"},{"location":"Notebooks/02-Part-Radiation-Heating/","page":"Transient heat transfer","title":"Transient heat transfer","text":"Stiffness matrix mathrmK in this problem provides the convective heat transfer terms. It is given by","category":"page"},{"location":"Notebooks/02-Part-Radiation-Heating/","page":"Transient heat transfer","title":"Transient heat transfer","text":"mathbfK = beginbmatrix\nh_pA_p -h_pA_p 0 \n-h_pA_p h_pA_p + h_gA_g -h_gA_g \n0 -h_gA_g h_gA_g + h_wA_w\nendbmatrix","category":"page"},{"location":"Notebooks/02-Part-Radiation-Heating/","page":"Transient heat transfer","title":"Transient heat transfer","text":"Since this matrix does not contain any element that depends on temperature it needs to be computed only once and we will not seek an optimized way to evaluate it. The code below is generic for any layered structure as the one being modelled here. Notice that the pairwise interactions lead to a tridiagonal structure.","category":"page"},{"location":"Notebooks/02-Part-Radiation-Heating/","page":"Transient heat transfer","title":"Transient heat transfer","text":"function stiffness(h, A)\n p = @. h * A\n q = -1 * p[1:end-1]\n p[2:end] -= q\n return diagm(0=>p, -1=>q, 1=>q)\nend\n\nnothing; # hide","category":"page"},{"location":"Notebooks/02-Part-Radiation-Heating/","page":"Transient heat transfer","title":"Transient heat transfer","text":"For testing its implementation and later simulating the system we provide already the set of convective heat transfer coefficients on h and heat transfer areas in A. The order of magnitude of areas was kept compatible with the geometrical description provided before.","category":"page"},{"location":"Notebooks/02-Part-Radiation-Heating/","page":"Transient heat transfer","title":"Transient heat transfer","text":"h = [100.0, 100.0, 10.0] * 1u\"W/(m^2*K)\"\nA = [0.032, 0.500, 1.15] * 1u\"m^2\"\n\nstiffness(h, A)","category":"page"},{"location":"Notebooks/02-Part-Radiation-Heating/","page":"Transient heat transfer","title":"Transient heat transfer","text":"To conclude problem specification, a function forcing for evaluation of mathbff is provided below. Vector mathbff is mainly where the description of radiative heat transfer is represented and is given as:","category":"page"},{"location":"Notebooks/02-Part-Radiation-Heating/","page":"Transient heat transfer","title":"Transient heat transfer","text":"mathbff = beginbmatrix\n-epsilon_psigmaA_p(mathcalT_p^4-mathcalT_w^4) \n0 \nh_wA_wT_a + epsilon_psigmaA_p(mathcalT_p^4-mathcalT_w^4) \n- epsilon_wsigmaA_w(mathcalT_w^4-T_a^4)\nendbmatrix","category":"page"},{"location":"Notebooks/02-Part-Radiation-Heating/","page":"Transient heat transfer","title":"Transient heat transfer","text":"function forcing(T, h, A, Ta, ϵp, ϵw)\n f1 = -ϵp*σ*A[1]*(T[1]^4-T[3]^4)\n f3 = h[3]*A[3]*Ta - f1 - ϵw*σ*A[3]*(T[3]^4 - Ta^4)\n return [ f1; 0u\"W\"; f3 ]\nend\n\nnothing; #hide","category":"page"},{"location":"Notebooks/02-Part-Radiation-Heating/","page":"Transient heat transfer","title":"Transient heat transfer","text":"The remaining parameters to close the problem are the emissivity of the materials and external temperature, all provided below.","category":"page"},{"location":"Notebooks/02-Part-Radiation-Heating/","page":"Transient heat transfer","title":"Transient heat transfer","text":"ϵp = 0.8\nϵw = 0.3\nTa = 313.15u\"K\"\n\nforcing([Ta, Ta, Ta], h, A, Ta, ϵp, ϵw)","category":"page"},{"location":"Notebooks/02-Part-Radiation-Heating/","page":"Transient heat transfer","title":"Transient heat transfer","text":"With that last element of the base equation in hands we can derive the time-stepping approach to be used. The derivative term is expanded as a forward finite difference as","category":"page"},{"location":"Notebooks/02-Part-Radiation-Heating/","page":"Transient heat transfer","title":"Transient heat transfer","text":"fracmathcalT_n+1-mathcalT_ntau + mathbfL^primemathcalT\n=mathbfR^primemathbff","category":"page"},{"location":"Notebooks/02-Part-Radiation-Heating/","page":"Transient heat transfer","title":"Transient heat transfer","text":"If you go back to the inspection of the inverse inertia matrix above, you will observe that the term corresponding to the gas is about 3 orders of magnitude above the others. That means that the dynamics of that component of the system is much slower than the others and the problem is somewhat stiff. To introduce a first layer of robustness in the integration we can try an implicit scheme by evaluating all terms in the above equation at instant n+1:","category":"page"},{"location":"Notebooks/02-Part-Radiation-Heating/","page":"Transient heat transfer","title":"Transient heat transfer","text":"mathcalT_n+1-mathcalT_n + taumathbfL^prime_n+1mathcalT_n+1\n=taumathbfR^prime_n+1mathbff_n+1","category":"page"},{"location":"Notebooks/02-Part-Radiation-Heating/","page":"Transient heat transfer","title":"Transient heat transfer","text":"This equation can be rearranged by splitting linear terms in mathcalT_n+1 on the left-hand side as:","category":"page"},{"location":"Notebooks/02-Part-Radiation-Heating/","page":"Transient heat transfer","title":"Transient heat transfer","text":"left(mathbfI+taumathbfL^prime_n+1right)mathcalT_n+1=\ntaumathbfR^prime_n+1mathbff_n+1+mathcalT_n","category":"page"},{"location":"Notebooks/02-Part-Radiation-Heating/","page":"Transient heat transfer","title":"Transient heat transfer","text":"this can be further simplified with the notation:","category":"page"},{"location":"Notebooks/02-Part-Radiation-Heating/","page":"Transient heat transfer","title":"Transient heat transfer","text":"mathbfL_n+1mathcalT_n+1=mathbfR_n+1+mathcalT_n","category":"page"},{"location":"Notebooks/02-Part-Radiation-Heating/","page":"Transient heat transfer","title":"Transient heat transfer","text":"It is useful to simplify thing until last step because it tells us what functionalities we need in a computer implementation. The problem of finding mathcalT_n+1 can be seem as a nonlinear iteration mathcalT_n+1=L^-1_n+1(R_n+1+mathcalT_n) followed by update of both mathbfL_n+1 and mathbfR_n+1 with the new estimate of temperatures. Thus, we need functions to update both these matrices during the solution. Since these rely on several parameters we can encapsulate then in a higher order function with all fixed parameters and return a function that performs the update for the new temperature estimate, as implemented below.","category":"page"},{"location":"Notebooks/02-Part-Radiation-Heating/","page":"Transient heat transfer","title":"Transient heat transfer","text":"function buildlhsmatrix(τ, h, A)\n K = stiffness(h, A)\n I = diagm([1, 1, 1] * 1u\"1\")\n return (Tₖ) -> I + τ * inertiainv(Tₖ) * K\nend\n\nnothing; # hide","category":"page"},{"location":"Notebooks/02-Part-Radiation-Heating/","page":"Transient heat transfer","title":"Transient heat transfer","text":"function buildrhsvector(τ, h, A, Ta, ϵp, ϵw)\n F(T) = τ * forcing(T, h, A, Ta, ϵp, ϵw)\n return (Tₖ) -> inertiainv(Tₖ) * F(Tₖ)\nend\n\nnothing; # hide","category":"page"},{"location":"Notebooks/02-Part-Radiation-Heating/","page":"Transient heat transfer","title":"Transient heat transfer","text":"As per the previous discussion, the following snipped emulates one time-step iteration:","category":"page"},{"location":"Notebooks/02-Part-Radiation-Heating/","page":"Transient heat transfer","title":"Transient heat transfer","text":"T = [1273.0u\"K\", Ta, Ta]\nτ = 1.0u\"s\"\n\nK = buildlhsmatrix(τ, h, A)\nB = buildrhsvector(τ, h, A, Ta, ϵp, ϵw)\n\n# Because of factorization this does not works with Unitful.\n# Units are stripped and system becomes inconsistent.\n# Tnew = K(T) \\ (B(T) .+ T)\n\nTnew = inv(K(T)) * (B(T) .+ T)","category":"page"},{"location":"Notebooks/02-Part-Radiation-Heating/","page":"Transient heat transfer","title":"Transient heat transfer","text":"Function steptime below performs up to a maximum number of iterations as illustrated above and checks for convergence of the time-step.","category":"page"},{"location":"Notebooks/02-Part-Radiation-Heating/","page":"Transient heat transfer","title":"Transient heat transfer","text":"function steptime(T₀, K, B; maxiter = 50, rtol = 1.0e-12, β = 1.0)\n Tᵢ = copy(T₀)\n Tⱼ = copy(T₀)\n Δ = 9.0e+100\n\n for j in range(1, maxiter)\n Tⱼ[:] = inv(K(Tⱼ)) * (B(Tⱼ) .+ T₀)\n Tⱼ[:] = relaxation(Tᵢ, Tⱼ, β)\n Δ = residual(Tᵢ, Tⱼ)\n Tᵢ[:] = Tⱼ[:]\n\n if Δ < rtol\n return Tᵢ, j, Δ\n end\n end\n\n @warn(\"No convergence during step @ $(@sprintf(\"%.6e\", Δ))\")\n return Tᵢ, maxiter, Δ\nend\n\nnothing; # hide","category":"page"},{"location":"Notebooks/02-Part-Radiation-Heating/","page":"Transient heat transfer","title":"Transient heat transfer","text":"A relaxation step for eventually helping convergence was introduced above as:","category":"page"},{"location":"Notebooks/02-Part-Radiation-Heating/","page":"Transient heat transfer","title":"Transient heat transfer","text":"relaxation(Tᵢ, Tⱼ, β) = @. β * Tⱼ + (1-β) * Tᵢ\n\nnothing; # hide","category":"page"},{"location":"Notebooks/02-Part-Radiation-Heating/","page":"Transient heat transfer","title":"Transient heat transfer","text":"A common choice of residual in this sort of problem is the maximum relative absolute change:","category":"page"},{"location":"Notebooks/02-Part-Radiation-Heating/","page":"Transient heat transfer","title":"Transient heat transfer","text":"residual(Tᵢ, Tⱼ) = maximum(abs.(Tⱼ .- Tᵢ) ./ Tᵢ)\n\nnothing; # hide","category":"page"},{"location":"Notebooks/02-Part-Radiation-Heating/","page":"Transient heat transfer","title":"Transient heat transfer","text":"Time integration is now just a matter of repeating time-stepping and storing solution:","category":"page"},{"location":"Notebooks/02-Part-Radiation-Heating/","page":"Transient heat transfer","title":"Transient heat transfer","text":"function integrate(t, T, K, B; maxiter, rtol, β)\n U = copy(T)\n nvars = length(T)\n solution = zeros(length(t), nvars + 2)\n solution[1, 1:nvars] = ustrip(U)\n\n for (i, tᵢ) in enumerate(t[1:end])\n (U[:], niters, Δ) = steptime(U, K, B; maxiter, rtol, β)\n solution[i, 1:nvars] = ustrip(U)\n solution[i, nvars+1] = niters\n solution[i, nvars+2] = Δ\n end\n\n return solution\nend\n\nnothing; # hide","category":"page"},{"location":"Notebooks/02-Part-Radiation-Heating/","page":"Transient heat transfer","title":"Transient heat transfer","text":"This completes the tooling for simulation of the process. Below we simulate 24 hours of the dynamics starting with a hot metallic sphere and the furnace equilibrated with the external environment. ","category":"page"},{"location":"Notebooks/02-Part-Radiation-Heating/","page":"Transient heat transfer","title":"Transient heat transfer","text":"tend = 24*3600\n\nT = [1273.0u\"K\", Ta, Ta]\nt = range(0, tend, convert(Int64, tend / 8))\nτ = step(t) * 1u\"s\"\n\nK = buildlhsmatrix(τ, h, A)\nB = buildrhsvector(τ, h, A, Ta, ϵp, ϵw)\n\nmaxiter = 80\nrtol = 1.0e-12\nβ = 0.99\n\n@time solution = integrate(t, T, K, B; maxiter, rtol, β);","category":"page"},{"location":"Notebooks/02-Part-Radiation-Heating/","page":"Transient heat transfer","title":"Transient heat transfer","text":"Below we can inspect the solution and the residuals at the end of each time-step. For the solution to make sense it is important that every single step must converge during time advancement. Note the leap in gas temperature during the first time steps resulting from the problem stiffness. As a matter of fact, a smaller time-step should have been used for properly resolving its dynamics in the early stages or even better, an adaptative time-stepping approach should have been adopted.","category":"page"},{"location":"Notebooks/02-Part-Radiation-Heating/","page":"Transient heat transfer","title":"Transient heat transfer","text":"with_theme() do\n tk = t / 3600\n\n fig = Figure(size = (700, 700))\n \n ax1 = Axis(fig[1, 1])\n lines!(ax1, tk, solution[:, 1]; color = :black, label = \"Metal\")\n hlines!(ax1, ustrip(Ta); color = :blue, label = \"Environment\")\n axislegend(ax1; position = :rt)\n\t\n ax2 = Axis(fig[2, 1])\n lines!(ax2, tk, solution[:, 2]; color = :green, label = \"Gas\")\n lines!(ax2, tk, solution[:, 3]; color = :red, label = \"Wall\")\n hlines!(ax2, ustrip(Ta); color = :blue, label = \"Environment\")\n axislegend(ax2; position = :rt)\n \n ax3 = Axis(fig[3, 1])\n lines!(ax3, tk, solution[:, 5]; color = :black)\n\n ax3.xlabel = \"Time [h]\"\n ax1.ylabel = \"Temperature [K]\"\n ax2.ylabel = \"Temperature [K]\"\n ax3.ylabel = \"Residual\"\n \n ax1.xticks = 0:2:tk[end]\n ax2.xticks = 0:2:tk[end]\n ax3.xticks = 0:2:tk[end]\n \n ax1.yticks = 300:200:1300\n ax2.yticks = 300:20:400\n \n xlims!(ax1, extrema(ax1.xticks.val))\n xlims!(ax2, extrema(ax2.xticks.val))\n xlims!(ax3, extrema(ax3.xticks.val))\n \n ylims!(ax1, extrema(ax1.yticks.val))\n ylims!(ax2, extrema(ax2.yticks.val))\n\n fig\nend","category":"page"},{"location":"Notebooks/02-Part-Radiation-Heating/#Using-ModelingToolkit","page":"Transient heat transfer","title":"Using ModelingToolkit","text":"","category":"section"},{"location":"Notebooks/02-Part-Radiation-Heating/","page":"Transient heat transfer","title":"Transient heat transfer","text":"In the future...","category":"page"},{"location":"References/@Liu1993/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Liu1993/","page":"-","title":"-","text":"title: Modeling the effects of drop drag and breakup on fuel sprays authors: Alex B. Liu, Daniel Mather, Rolf D. Reitz year: 1993 URL: \" https://doi.org/10.4271/930072.\" –- Also check Reitz1987 [15].","category":"page"},{"location":"References/@Plessis1988/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Plessis1988/","page":"-","title":"-","text":"title: Mathematical modelling of flow through consolidated isotropic porous media authors: J. Prieur Du Plessis, Jacob H. Masliyah year: 1988 URL: TODO –-","category":"page"},{"location":"References/@Smith2013a/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Smith2013a/","page":"-","title":"-","text":"title: \"Thermal conductivity of porous materials\" authors: David S. Smith, Arnaud Alzina, Julie Bourret, Benoît Nait-Ali, Fabienne Pennec, Nicolas Tessier-Doyen, Kodai Otsu, Hideaki Matsubara, Pierre Elser, Urs T. Gonzenbach year: 2013 –-","category":"page"},{"location":"Modules/OpenFOAM/#OpenFOAM","page":"OpenFOAM","title":"OpenFOAM","text":"","category":"section"},{"location":"Modules/OpenFOAM/","page":"OpenFOAM","title":"OpenFOAM","text":"CurrentModule = OpenFOAM\nDocTestSetup = quote\n using OpenFOAM\nend\nEditURL = \"https://github.com/wallytutor/WallyToolbox.jl/blob/main/docs/src/Modules/OpenFOAM.md\"","category":"page"},{"location":"Modules/OpenFOAM/","page":"OpenFOAM","title":"OpenFOAM","text":"Modules = [ OpenFOAM ]","category":"page"},{"location":"Modules/OpenFOAM/#OpenFOAM.OPENFOAMBANNER","page":"OpenFOAM","title":"OpenFOAM.OPENFOAMBANNER","text":"Banner for all OpenFOAM files with right version.\n\n\n\n\n\n","category":"constant"},{"location":"Modules/OpenFOAM/#OpenFOAM.AbstractFlowRateProfile","page":"OpenFOAM","title":"OpenFOAM.AbstractFlowRateProfile","text":"Abstract type for flow rate profile distributions.\n\n\n\n\n\n","category":"type"},{"location":"Modules/OpenFOAM/#OpenFOAM.AbstractInjectionModel","page":"OpenFOAM","title":"OpenFOAM.AbstractInjectionModel","text":"Abstract type for injection models.\n\n\n\n\n\n","category":"type"},{"location":"Modules/OpenFOAM/#OpenFOAM.AbstractSizeDistribution","page":"OpenFOAM","title":"OpenFOAM.AbstractSizeDistribution","text":"Abstract type for particle size distributions.\n\n\n\n\n\n","category":"type"},{"location":"Modules/OpenFOAM/#OpenFOAM.ConstantFlowRateProfile","page":"OpenFOAM","title":"OpenFOAM.ConstantFlowRateProfile","text":"Constant flow rate profile.\n\n\n\n\n\n","category":"type"},{"location":"Modules/OpenFOAM/#OpenFOAM.InjectionModel","page":"OpenFOAM","title":"OpenFOAM.InjectionModel","text":"Represents a generic particle injection model.\n\nConstraints imposed by OpenFOAM:\n\nnParticle makes massFlowRate and massTotal to be ignored.\nmassTotal cannot be used in steady state simulations.\nif flowRateProfile is not found a constant massFlowRate profile is computed from the ratio of massTotal and duration.\n\nTo-do:\n\nCheck if parcelBasisType from is applicable to derived types.\n\nmassFlowRate::Number: Particles mass flow rate if nParticle is not provided.\nmassTotal::Number: Total mass to be injected if nParticle is not provided.\nSOI::Number: Start of injection in seconds (base).\nduration::Number: Duration of injection in seconds (base).\nnParticle::Number: Number of particles per parcel.\nuniformParcelSize::UniformParcelSize: Quantity that is constant in parcels (base).\nflowRateProfile::OpenFOAM.AbstractFlowRateProfile: Type of flow rate profile to apply.\n\n\n\n\n\n","category":"type"},{"location":"Modules/OpenFOAM/#OpenFOAM.PatchInjection","page":"OpenFOAM","title":"OpenFOAM.PatchInjection","text":"Represents a patch injection model.\n\nname::String: Name to use in injection models list.\npatchName::String: Patch where injection is applied.\ninjectionModel::InjectionModel: Object pointing to general injection model.\nU0::Velocity: Particles injection velocity vector.\nparcelsPerSecond::Number: Number of parcels injected per second.\nsizeDistribution::OpenFOAM.AbstractSizeDistribution: Particle size distribution.\n\n\n\n\n\n","category":"type"},{"location":"Modules/OpenFOAM/#OpenFOAM.TableFlowRateProfile","page":"OpenFOAM","title":"OpenFOAM.TableFlowRateProfile","text":"Table flow rate profile.\n\n\n\n\n\n","category":"type"},{"location":"Modules/OpenFOAM/#OpenFOAM.TabulatedDensity","page":"OpenFOAM","title":"OpenFOAM.TabulatedDensity","text":"Tabulated density size distribution.\n\n\n\n\n\n","category":"type"},{"location":"Modules/OpenFOAM/#OpenFOAM.UniformParcelSize","page":"OpenFOAM","title":"OpenFOAM.UniformParcelSize","text":"Types of uniform parcel sizes.\n\n\n\n\n\n","category":"type"},{"location":"Modules/OpenFOAM/#OpenFOAM.Velocity","page":"OpenFOAM","title":"OpenFOAM.Velocity","text":"Simple wraper velocity vector.\n\n\n\n\n\n","category":"type"},{"location":"Modules/OpenFOAM/#OpenFOAM.asint-Tuple{Any}","page":"OpenFOAM","title":"OpenFOAM.asint","text":"Round and convert number to an integer.\n\n\n\n\n\n","category":"method"},{"location":"Modules/OpenFOAM/#OpenFOAM.parcels_per_second-Tuple{}","page":"OpenFOAM","title":"OpenFOAM.parcels_per_second","text":"parcelstoinject2d(;\n mdot::Float64,\n rhop::Float64,\n diam::Float64,\n nParticle::Int64 = 1\n)\n\nComputes the flow rate of parcels for a given mean particle size and number of particles per parcels. This is inteded as a helper to create a patchInjection element in the injectionModels of cloudProperties file.\n\n\n\n\n\n","category":"method"},{"location":"Modules/OpenFOAM/#OpenFOAM.spheremass-Tuple{Any, Any}","page":"OpenFOAM","title":"OpenFOAM.spheremass","text":"The mass of a sphere of density rho and diameter diam.\n\n\n\n\n\n","category":"method"},{"location":"Modules/OpenFOAM/#OpenFOAM.spherevolume-Tuple{Any}","page":"OpenFOAM","title":"OpenFOAM.spherevolume","text":"The volume of a sphere of diameter diam.\n\n\n\n\n\n","category":"method"},{"location":"Modules/OpenFOAM/#OpenFOAM.tabulate-Tuple{Any, Any}","page":"OpenFOAM","title":"OpenFOAM.tabulate","text":"Compose table entries in typical OpenFOAM format.\n\n\n\n\n\n","category":"method"},{"location":"Modules/OpenFOAM/#Discrete-phase-models","page":"OpenFOAM","title":"Discrete phase models","text":"","category":"section"},{"location":"Modules/OpenFOAM/","page":"OpenFOAM","title":"OpenFOAM","text":"We can verify the computation of number of parcels per second of sample case injectionChannel. Notice that the value of mdot has been reversed engineered so that it matches the expected value.","category":"page"},{"location":"Modules/OpenFOAM/","page":"OpenFOAM","title":"OpenFOAM","text":"julia> parcels_per_second(; ṁ = 0.2, ρ = 1000.0, d = 650.0e-06, nParticle = 1)\n1390885","category":"page"},{"location":"References/@Haitsiukevich2022a/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Haitsiukevich2022a/","page":"-","title":"-","text":"title: Improved training of physics-informed neural networks with model ensembles authors: Katsiaryna Haitsiukevich, Alexander Ilin year: 2022 URL: https://doi.org/10.48550/arXiv.2204.05108 –-","category":"page"},{"location":"WallyToolbox/unstable/#Unstable","page":"Unstable","title":"Unstable","text":"","category":"section"},{"location":"WallyToolbox/unstable/","page":"Unstable","title":"Unstable","text":"EditURL = \"https://github.com/wallytutor/WallyToolbox.jl/blob/main/docs/src/WallyToolbox/unstable.md\"\nCurrentModule = WallyToolbox\nDocTestSetup = quote\n using WallyToolbox\nend","category":"page"},{"location":"WallyToolbox/unstable/#DryUtilities","page":"Unstable","title":"DryUtilities","text":"","category":"section"},{"location":"WallyToolbox/unstable/","page":"Unstable","title":"Unstable","text":"danger: Danger\nThis module is deprecated and is progressivelly migrating to the root.","category":"page"},{"location":"WallyToolbox/unstable/","page":"Unstable","title":"Unstable","text":"CurrentModule = DryUtilities\nDocTestSetup = quote\n using DryUtilities\n using DryUtilities: heaviside, interval, makestepwise1d\n using DryUtilities: closestpowerofx, axesunitscaler\n using DryUtilities: maxrelativechange, maxabsolutechange\nend","category":"page"},{"location":"WallyToolbox/unstable/#Handling-of-discontinuous-functions","page":"Unstable","title":"Handling of discontinuous functions","text":"","category":"section"},{"location":"WallyToolbox/unstable/","page":"Unstable","title":"Unstable","text":"Discontinuous functions are all over in real world applications. Whether they handle discrete signals sent to controllers or represent a material property change in the solution domain of a heat transfer simulation, they are often represented by a single or a composition of Heaviside step functions. Again, because its implementation is pretty simple and optimization routines require a differentiable form of this function, DryUtilities implements heaviside and interval as proposed in this StackOverflow answer.","category":"page"},{"location":"WallyToolbox/unstable/","page":"Unstable","title":"Unstable","text":"julia> heaviside(-1) == 0\ntrue\n\njulia> heaviside(-1.0) == 0.0\ntrue\n\njulia> heaviside(0.0) == 0.5\ntrue\n\njulia> heaviside(1.0) == 1.0\ntrue\n\njulia> interval(10; a = 0, b = 10) == 0.5\ntrue","category":"page"},{"location":"WallyToolbox/unstable/","page":"Unstable","title":"Unstable","text":"We see below that heaviside also works on ranges","category":"page"},{"location":"WallyToolbox/unstable/","page":"Unstable","title":"Unstable","text":"julia> heaviside(-2:2)\n5-element Vector{Float64}:\n 0.0\n 0.0\n 0.5\n 1.0\n 1.0","category":"page"},{"location":"WallyToolbox/unstable/","page":"Unstable","title":"Unstable","text":"DryUtilities.heaviside","category":"page"},{"location":"WallyToolbox/unstable/#DryUtilities.heaviside","page":"Unstable","title":"DryUtilities.heaviside","text":"heaviside(t)\n\nProvides a Heaviside function compatible with automatic differentiation. This is a requirement for conceiving, e.g., model predictive controls with discontinuous functions under ModelingToolkit.\n\n\n\n\n\n","category":"function"},{"location":"WallyToolbox/unstable/","page":"Unstable","title":"Unstable","text":"By implementation inheritance that is also the case for interval:","category":"page"},{"location":"WallyToolbox/unstable/","page":"Unstable","title":"Unstable","text":"julia> interval(0:6; a = 2, b = 5)\n7-element Vector{Float64}:\n 0.0\n 0.0\n 0.5\n 1.0\n 1.0\n 0.5\n 0.0","category":"page"},{"location":"WallyToolbox/unstable/","page":"Unstable","title":"Unstable","text":"DryUtilities.interval","category":"page"},{"location":"WallyToolbox/unstable/#DryUtilities.interval","page":"Unstable","title":"DryUtilities.interval","text":"interval(x; a=-Inf, b=Inf)\n\nReturns 1 if x (a b), 1/2 for x = a x = b, or 0.\n\n\n\n\n\n","category":"function"},{"location":"WallyToolbox/unstable/","page":"Unstable","title":"Unstable","text":"As it is the case for representation of specific heats using NASA7/NASA9 or Shomate polynomials, functions defined by parts with an specific change point are also required in physical modeling. To this end, a stepwise function can be established with makestepwise1d. If keyword differentialble = true, then the function makes use of the above interval and remains compatible with ModelingToolkit, for instance.","category":"page"},{"location":"WallyToolbox/unstable/","page":"Unstable","title":"Unstable","text":"julia> f = makestepwise1d(x->x, x->x^2, 1.0; differentiable = true);\n\njulia> f(0:0.2:2.0)\n11-element Vector{Float64}:\n 0.0\n 0.2\n 0.4\n 0.6\n 0.8\n 1.0\n 1.44\n 1.9599999999999997\n 2.5600000000000005\n 3.24\n 4.0\n\njulia> using ModelingToolkit\n\njulia> @variables x\n1-element Vector{Num}:\n x\n\njulia> f(x); # Output is too long, try by yourself.","category":"page"},{"location":"WallyToolbox/unstable/","page":"Unstable","title":"Unstable","text":"DryUtilities.makestepwise1d","category":"page"},{"location":"WallyToolbox/unstable/#DryUtilities.makestepwise1d","page":"Unstable","title":"DryUtilities.makestepwise1d","text":"makestepwise1d(lo, hi, xc)\n\nCreates an univariate function that is composed of two parts, the first evaluated before a critical domain point xc, and the second above that value. This is often required, for instance, for the evaluation of NASA polynomials for thermodynamic properties. If differentiable, then the returned function is compatible with symbolic argument as required when using package ModelingToolkit, etc.\n\n\n\n\n\n","category":"function"},{"location":"WallyToolbox/unstable/#Rounding-numbers-and-automatic-axes","page":"Unstable","title":"Rounding numbers and automatic axes","text":"","category":"section"},{"location":"WallyToolbox/unstable/","page":"Unstable","title":"Unstable","text":"danger: Danger\nThis section documents functions that are used in a very unstable context.","category":"page"},{"location":"WallyToolbox/unstable/","page":"Unstable","title":"Unstable","text":"Simple rounding is not enough. Getting values that are rounded close to a power of a given number and rounded to floor or ceil is often the case. This is standardized in DryTooling through closestpowerofx:","category":"page"},{"location":"WallyToolbox/unstable/","page":"Unstable","title":"Unstable","text":"julia> closestpowerofx(10)\n10\n\njulia> closestpowerofx(11)\n20\n\njulia> closestpowerofx(11, roundf = floor)\n10\n\njulia> closestpowerofx(11, x = 5, roundf = floor)\n10\n\njulia> closestpowerofx(12.0; x = 10)\n20\n\njulia> closestpowerofx(12.0; x = 10, roundf = floor)\n10\n\njulia> closestpowerofx(12.0; x = 10, roundf = round)\n10","category":"page"},{"location":"WallyToolbox/unstable/","page":"Unstable","title":"Unstable","text":"DryUtilities.closestpowerofx","category":"page"},{"location":"WallyToolbox/unstable/#DryUtilities.closestpowerofx","page":"Unstable","title":"DryUtilities.closestpowerofx","text":"closestpowerofx(\n v::Number;\n x::Number = 10,\n roundf::Function = ceil\n)::Int64\n\nCompute the integer power of x closest to v using roundf as rouding method. This might be useful for automatic setting more reasonable limits to plot axis or similar applications. Changing the rouding method through roundf is also possible.\n\n\n\n\n\n","category":"function"},{"location":"WallyToolbox/unstable/","page":"Unstable","title":"Unstable","text":"Below we illustrate the usage of axesunitscaler.","category":"page"},{"location":"WallyToolbox/unstable/","page":"Unstable","title":"Unstable","text":"NOTE: this function is not yet stable. In the future it will instead return labels using symbols like k, M, G, etc., for the units through a flag provided by the user.","category":"page"},{"location":"WallyToolbox/unstable/","page":"Unstable","title":"Unstable","text":"julia> axesunitscaler(1)\n(\"\", 1)\n\njulia> axesunitscaler(1000)\n(\"[×1000]\", 1000)\n\njulia> axesunitscaler(1000000)\n(\"[×1000000]\", 1000000)","category":"page"},{"location":"WallyToolbox/unstable/","page":"Unstable","title":"Unstable","text":"DryUtilities.axesunitscaler","category":"page"},{"location":"WallyToolbox/unstable/#DryUtilities.axesunitscaler","page":"Unstable","title":"DryUtilities.axesunitscaler","text":"axesunitscaler(x::Number)::Tuple{String, Int64}\n\nFind scaling factor for multiples of 1000 units. Together with closestpowerofx this can be used to produce better automatic plot axes limits. The returned values provide the string for modifying the axis label and the associated scaling factor.\n\n\n\n\n\n","category":"function"},{"location":"WallyToolbox/unstable/#Computation-of-changes-and-residuals","page":"Unstable","title":"Computation of changes and residuals","text":"","category":"section"},{"location":"WallyToolbox/unstable/","page":"Unstable","title":"Unstable","text":"danger: Danger\nThis section documents functions that are used in a very unstable context.","category":"page"},{"location":"WallyToolbox/unstable/","page":"Unstable","title":"Unstable","text":"DryUtilities.maxabsolutechange\nDryUtilities.maxrelativechange","category":"page"},{"location":"WallyToolbox/unstable/#DryUtilities.maxabsolutechange","page":"Unstable","title":"DryUtilities.maxabsolutechange","text":"Maximum absolute change in a solution array.\n\n\n\n\n\n","category":"function"},{"location":"WallyToolbox/unstable/#DryUtilities.maxrelativechange","page":"Unstable","title":"DryUtilities.maxrelativechange","text":"Maximum relative change in a solution array.\n\n\n\n\n\n","category":"function"},{"location":"WallyToolbox/unstable/#Unit-conversion","page":"Unstable","title":"Unit conversion","text":"","category":"section"},{"location":"WallyToolbox/unstable/","page":"Unstable","title":"Unstable","text":"DryUtilities.nm3_h_to_kg_h\nDryUtilities.kg_h_to_nm3_h","category":"page"},{"location":"WallyToolbox/unstable/#DryUtilities.nm3_h_to_kg_h","page":"Unstable","title":"DryUtilities.nm3_h_to_kg_h","text":"Convert [Nm³/h] to [kg/h].\n\n\n\n\n\n","category":"function"},{"location":"WallyToolbox/unstable/#DryUtilities.kg_h_to_nm3_h","page":"Unstable","title":"DryUtilities.kg_h_to_nm3_h","text":"Convert [kg/h] to [Nm³/h].\n\n\n\n\n\n","category":"function"},{"location":"References/@Guo2023e/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Guo2023e/","page":"-","title":"-","text":"title: \"Unraveling the design pattern of physics-informed neural networks: Series 05\" authors: Shuai Guo year: 2023 URL: https://towardsdatascience.com/unraveling-the-design-pattern-of-physics-informed-neural-networks-part-05-67a35a984b23 –-","category":"page"},{"location":"References/@Fogler1999/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Fogler1999/","page":"-","title":"-","text":"title: \"Elements of chemical reaction engineering\" authors: H. Scott Fogler year: 1999 –-","category":"page"},{"location":"References/@Balaji2014/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Balaji2014/","page":"-","title":"-","text":"title: Essentials of radiation heat transfer authors: C. Balaji year: 2014 Drive: https://1drv.ms/b/s!Ar4x-UlrYAiZoCdJkJqcjDRZVs9J?e=mbefIU –-","category":"page"},{"location":"References/@Kramers1952/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Kramers1952/","page":"-","title":"-","text":"title: The passage of granular solids through inclined rotary kilns authors: H. Kramers, P. Croockewit year: 1952 –-","category":"page"},{"location":"References/@Lawn1987/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Lawn1987/","page":"-","title":"-","text":"title: Principles of combustion engineering for boilers authors: C. J. Lawn year: 1987 –-","category":"page"},{"location":"References/@Lawn1987/#Chapter-2-The-combustion-of-HFO","page":"-","title":"Chapter 2 - The combustion of HFO","text":"","category":"section"},{"location":"References/@Lawn1987/","page":"-","title":"-","text":"Main constituents: paraffins, naphthenes (C_5-C_9), and aromatics. Specially useful due to its high specific energy content and high density (easy to transport), easily atomized, and almost completely combustible.","category":"page"},{"location":"References/@Lawn1987/","page":"-","title":"-","text":"Correlation index CI against relative density S and reciprocal of average boiling point is a good indicator of oil major components:","category":"page"},{"location":"References/@Lawn1987/","page":"-","title":"-","text":"CI = 4739S - 4568 + frac48640T_B\nquadbegincases\nCI 50 textPredominantly aromatic components6pt\n15 CI 50 textMainly naphthenes or a mixture of all types6pt\n15 CI textPredominantly paraffinic components\nendcases","category":"page"},{"location":"References/@Lawn1987/","page":"-","title":"-","text":"Typical elemental composition (given in mass percentages):","category":"page"},{"location":"References/@Lawn1987/","page":"-","title":"-","text":"Element wt%\nCarbon 83-87\nHydrogen 10-14\nSuphur 0.05-6\nNitrogen 0.1-2\nOxygen 0.05-1.5","category":"page"},{"location":"References/@Lawn1987/","page":"-","title":"-","text":"Viscosity is highly dependent on temperature and used to control the characteristics of atomization in burners; for class G (main industrial application) of BS 2869 the typical kinematic viscosity at 80 °C is limited to 85 cSt; its maximum water content is 1% and ash production 0f 0.25% (see Table II for details and other classes). Viscosity is known to deviate from Newtonian at near pour point and the boiling point of its more volatile components.","category":"page"},{"location":"References/@Lawn1987/","page":"-","title":"-","text":"When decreasing the hydrogen to carbon ratio the specific energy is also decreased, and this follows an increase of specific density of fuels. According to BS 2869, the net calorific value can be estimated from the density of the oil rho_lkgcdotpl^ -1 at 15 °C:","category":"page"},{"location":"References/@Lawn1987/","page":"-","title":"-","text":"DeltaH_net=left(46423-8792rho_l^2+3170rho_lright)left(1-x-y-sright)+9420s-2449x","category":"page"},{"location":"References/@Lawn1987/","page":"-","title":"-","text":"where x is the mass fraction of water, y the mass fraction of ash, and s the mass fraction of Sulphur; the resulting value is provided in MJcdotpkg^-1. Deviations are reported to be less than 1% when compared to bomb calorimetry data. Regarding specific heat a quite old (Cragoe, 1929) relationship based on relative density S is given in Jcdotpkg^-1 as:","category":"page"},{"location":"References/@Lawn1987/","page":"-","title":"-","text":"c_p = frac1683 + 339TS","category":"page"},{"location":"References/@Lawn1987/","page":"-","title":"-","text":"Typical value of surface tension are generally around 24-38times10^-3Ncdotpm^-1 at 20 °C and present a typical slope of -007times10^-3Ncdotpm^-1K^-1 from room temperature up to 120 °C. Notice that this may be highly affected by actual fuel composition, so estimations must be used with care.","category":"page"},{"location":"References/@Lawn1987/","page":"-","title":"-","text":"Combustion characteristics in general: maximum droplet heating rate around 10^5Kcdotps^-1 and flame temperatures of 2120K, with a fuel residence time 2s. Droplets are generally injected from fractions of micron to 500mum. The mechanism of combustion generally happens as follows:","category":"page"},{"location":"References/@Lawn1987/","page":"-","title":"-","text":"Volatiles phase: occurs between 250-350 °C and is characterized by the formation of a volatiles shell around the droplets, giving an aspect of granularity. It evolves till the unset of boiling, which occurs quite sharply somewhere in range 300-400 °C. Boiling leads to distortion and swealing, favoring breakup; several ejections might occur at this stage. The competing mechanisms during this phase are distillation and pyrolysis; the fuel composition and heating rate will determine the prevailing one.\n","category":"page"},{"location":"References/@Lawn1987/","page":"-","title":"-","text":"See figures 8-9 of reference for more details regarding droplet history.","category":"page"},{"location":"References/@Haider1989/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Haider1989/","page":"-","title":"-","text":"title: Drag coefficient and terminal velocity of spherical and nonspherical particles authors: A. Haider, O. Levenspiel year: 1989 URL: TODO –-","category":"page"},{"location":"References/@Crank1996/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Crank1996/","page":"-","title":"-","text":"title: \"A practical method for Numerical evaluation of solutions of partial differential equations of the heat-conduction type\" authors: J. Crank, P. Nicolson year: 1996 –-","category":"page"},{"location":"References/@Masamune1963a/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Masamune1963a/","page":"-","title":"-","text":"title: \"Thermal conductivity of beds of spherical particles\" authors: Shinobu Masamune, J. M. Smith year: 1963 –-","category":"page"},{"location":"References/@Onsager1931a/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Onsager1931a/","page":"-","title":"-","text":"title: Reciprocal relations in irreversible processes. II. authors: Lars Onsager year: 1931 –-","category":"page"},{"location":"References/@Sanchez2023a/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Sanchez2023a/","page":"-","title":"-","text":"title: \"Biomass combustion modeling using OpenFOAM: Development of a simple computational model and study of the combustion performance of lippia origanoides bagasse\" authors: Gabriel Fernando García Sánchez, Jorge Luis Chacón Velasco, David Alfredo Fuentes Díaz, Yesid Javier Rueda-Ordóñez, David Patiño, Juan Jesús Rico, Jairo René Martínez Morales year: 2023 URL: https://doi.org/10.3390/en16062932 Drive: https://1drv.ms/b/s!Ar4x-UlrYAiZlbEgWeJ66H4-cfxBiQ?e=YQGseW –-","category":"page"},{"location":"Notes/Server/","page":"Excalidraw Data","title":"Excalidraw Data","text":"","category":"page"},{"location":"Notes/Server/","page":"Excalidraw Data","title":"Excalidraw Data","text":"excalidraw-plugin: parsed tags: [excalidraw]","category":"page"},{"location":"Notes/Server/","page":"Excalidraw Data","title":"Excalidraw Data","text":"","category":"page"},{"location":"Notes/Server/","page":"Excalidraw Data","title":"Excalidraw Data","text":"==⚠ Switch to EXCALIDRAW VIEW in the MORE OPTIONS menu of this document. ⚠==","category":"page"},{"location":"Notes/Server/#Excalidraw-Data","page":"Excalidraw Data","title":"Excalidraw Data","text":"","category":"section"},{"location":"Notes/Server/#Text-Elements","page":"Excalidraw Data","title":"Text Elements","text":"","category":"section"},{"location":"Notes/Server/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Mini PC Windows (300€) ^Uueo5gHK","category":"page"},{"location":"Notes/Server/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Hard Drive 4T ^FhQ5lsif","category":"page"},{"location":"Notes/Server/","page":"Excalidraw Data","title":"Excalidraw Data","text":"RPI 3B + 218G ^HoeV5did","category":"page"},{"location":"Notes/Server/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Modem ^HadSLSNc","category":"page"},{"location":"Notes/Server/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Hard Drive 4T ^QXBMf68R","category":"page"},{"location":"Notes/Server/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Lenovo P51 ^syyrpie8","category":"page"},{"location":"Notes/Server/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Microsoft Go2 ^WKcG8Hqi","category":"page"},{"location":"Notes/Server/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Simulation Tower (10k€) ^lxDKJklC","category":"page"},{"location":"Notes/Server/","page":"Excalidraw Data","title":"Excalidraw Data","text":"As cheap as can be but enough to navigate the internet, its ONLY goal is to synchronize OneDrive ^a52WjlNf","category":"page"},{"location":"Notes/Server/","page":"Excalidraw Data","title":"Excalidraw Data","text":"This will become a headless server for playing from anywhere and management. It will also provide FTP and videos. ^cojFGwIh","category":"page"},{"location":"Notes/Server/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Screen 1 ^GKAeCKhC","category":"page"},{"location":"Notes/Server/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Screen 2 ^cIV46vNj","category":"page"},{"location":"Notes/Server/","page":"Excalidraw Data","title":"Excalidraw Data","text":"5 ^P1kjNtqN","category":"page"},{"location":"Notes/Server/","page":"Excalidraw Data","title":"Excalidraw Data","text":"4 ^8WxijHIz","category":"page"},{"location":"Notes/Server/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Paperless ^Me8wBIVM","category":"page"},{"location":"Notes/Server/","page":"Excalidraw Data","title":"Excalidraw Data","text":"VS Code ^StikJtl5","category":"page"},{"location":"Notes/Server/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Python ^ZPRvEXu5","category":"page"},{"location":"Notes/Server/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Julia ^diMhDImF","category":"page"},{"location":"Notes/Server/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Jupyter ^tfXU42e5","category":"page"},{"location":"Notes/Server/","page":"Excalidraw Data","title":"Excalidraw Data","text":"%%","category":"page"},{"location":"Notes/Server/#Drawing","page":"Excalidraw Data","title":"Drawing","text":"","category":"section"},{"location":"Notes/Server/","page":"Excalidraw Data","title":"Excalidraw Data","text":"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=","category":"page"},{"location":"Notes/Server/","page":"Excalidraw Data","title":"Excalidraw Data","text":"%%","category":"page"},{"location":"References/@Sweldens1998a/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Sweldens1998a/","page":"-","title":"-","text":"title: \"The lifting scheme: A construction of second generation wavelets\" authors: Wim Sweldens year: 1998 URL: https://doi.org/10.1137/S0036141095289051 Drive: –-","category":"page"},{"location":"Computing/02-General-Computing-Skills/#General-computing-skills","page":"General computing skills","title":"General computing skills","text":"","category":"section"},{"location":"Computing/02-General-Computing-Skills/","page":"General computing skills","title":"General computing skills","text":"","category":"page"},{"location":"Computing/02-General-Computing-Skills/#Git-version-control","page":"General computing skills","title":"Git version control","text":"","category":"section"},{"location":"Computing/02-General-Computing-Skills/#Version-control-in-Windows","page":"General computing skills","title":"Version control in Windows","text":"","category":"section"},{"location":"Computing/02-General-Computing-Skills/","page":"General computing skills","title":"General computing skills","text":"TortoiseGIT: for Windows users, this applications add the possibility of managing version control and other features directly from the file explorer.","category":"page"},{"location":"Computing/02-General-Computing-Skills/#Adding-submodules","page":"General computing skills","title":"Adding submodules","text":"","category":"section"},{"location":"Computing/02-General-Computing-Skills/","page":"General computing skills","title":"General computing skills","text":"Generally speaking adding a submodule to a repository should be a simple matter of:","category":"page"},{"location":"Computing/02-General-Computing-Skills/","page":"General computing skills","title":"General computing skills","text":"git submodule add https:////","category":"page"},{"location":"Computing/02-General-Computing-Skills/","page":"General computing skills","title":"General computing skills","text":"Nonetheless this might fail, especially for large sized repositories; I faced this issue which I tried to fix by increasing buffer size as reported in the link. This solved the issue but led me to another problem which could be solved by degrading HTTP protocol.","category":"page"},{"location":"Computing/02-General-Computing-Skills/","page":"General computing skills","title":"General computing skills","text":"","category":"page"},{"location":"Computing/02-General-Computing-Skills/#Working-on-Windows","page":"General computing skills","title":"Working on Windows","text":"","category":"section"},{"location":"Computing/02-General-Computing-Skills/#Creating-a-portable-launcher","page":"General computing skills","title":"Creating a portable launcher","text":"","category":"section"},{"location":"Computing/02-General-Computing-Skills/","page":"General computing skills","title":"General computing skills","text":"A simple way to create a portable launcher requiring to source extra variables is by writing a simple batch script exporting or calling another script with the definitions:","category":"page"},{"location":"Computing/02-General-Computing-Skills/","page":"General computing skills","title":"General computing skills","text":"@echo off\n\n@REM Add variables to be sourced here such as\n@REM set PATH=\"/path/to/some/dir\";%PATH%\n@REM ... or call another shared script doing so.\n@REM call %~dp0\\env\n\nMyCode.exe","category":"page"},{"location":"Computing/02-General-Computing-Skills/","page":"General computing skills","title":"General computing skills","text":"Because a batch script will keep a console window open, create a VB file with the following","category":"page"},{"location":"Computing/02-General-Computing-Skills/","page":"General computing skills","title":"General computing skills","text":"Set oShell = CreateObject (\"Wscript.Shell\") \nDim strArgs\nstrArgs = \"cmd /c MyCode.bat\"\noShell.Run strArgs, 0, false","category":"page"},{"location":"Computing/02-General-Computing-Skills/","page":"General computing skills","title":"General computing skills","text":"In the example we assume the program is called MyCode.exe and the batch script has been named in an analogous way MyCode.bat. Some real world examples are provided here.","category":"page"},{"location":"Computing/02-General-Computing-Skills/#Mount-a-network-drive-in-WSL","page":"General computing skills","title":"Mount a network drive in WSL","text":"","category":"section"},{"location":"Computing/02-General-Computing-Skills/","page":"General computing skills","title":"General computing skills","text":"Here we assume we will mount drive Z: at /mnt/z:","category":"page"},{"location":"Computing/02-General-Computing-Skills/","page":"General computing skills","title":"General computing skills","text":"# Create the mount point (if required):\nsudo mkdir /mnt/z\n\n# Mount the network drive in WSL:\nsudo mount -t drvfs Z: /mnt/z","category":"page"},{"location":"Computing/02-General-Computing-Skills/","page":"General computing skills","title":"General computing skills","text":"","category":"page"},{"location":"Computing/02-General-Computing-Skills/#Regular-expressions","page":"General computing skills","title":"Regular expressions","text":"","category":"section"},{"location":"Computing/02-General-Computing-Skills/","page":"General computing skills","title":"General computing skills","text":"Regular expressions (or simply regex) processing is a must-have skill for anyone doing scientific computing. Most programs produce results or logs in plain text and do not support specific data extraction from those. There regex becomes your best friend. Unfortunately during the years many flavors of regex appeared, each claiming to offer advantages or to be more formal than its predecessors. Due to this, learning regex is often language-specific (most of the time you create and process regex from your favorite language) and sometimes even package-specific. Needless to say, regex may be more difficult to master than assembly programming.","category":"page"},{"location":"Computing/02-General-Computing-Skills/","page":"General computing skills","title":"General computing skills","text":"Useful web applications can be found in regex101 and regexr.\nMatch all characters between two strings with lookbehind and look ahead patterns. Notice that this will require the enclosing strings to be fixed (at least under PCRE). For processing WallyTutor.jl documentation I have used a more generic approach but less general than what is proposed here.\nMatch any character across multiple lines with (.|\\n)*.\nCurrently joining regexes in Julia might be tricky (because of escaping characters); a solution is proposed here and seems to work just fine with minimal extra coding.","category":"page"},{"location":"Computing/02-General-Computing-Skills/","page":"General computing skills","title":"General computing skills","text":"","category":"page"},{"location":"Computing/02-General-Computing-Skills/#\\LaTeX","page":"General computing skills","title":"LaTeX","text":"","category":"section"},{"location":"Computing/02-General-Computing-Skills/#Math-typesetting-with-\\LaTeX","page":"General computing skills","title":"Math typesetting with LaTeX","text":"","category":"section"},{"location":"Computing/02-General-Computing-Skills/","page":"General computing skills","title":"General computing skills","text":"For integrals to display the same size as fractions expanded with \\dfrac, place a \\displaystyle in front of the \\int command.","category":"page"},{"location":"Computing/02-General-Computing-Skills/#Code-typesetting-with-\\LaTeX","page":"General computing skills","title":"Code typesetting with LaTeX","text":"","category":"section"},{"location":"Computing/02-General-Computing-Skills/","page":"General computing skills","title":"General computing skills","text":"For some reason minted blocks \\begin{minted}...\\end{minted} have problems to render in Beamer (something related to multilevel macros). I managed to insert code blocks with \\inputminted as reported here.\nBeamer have some issues with footnotes, especially when use column environments; a quick fix for this is through \\footnotemark and \\footnotetext[]{} as described here. Notice that \\footnotemark automatically generates the counter for use as in \\footnotetext.\nFor setting a background watermark in Beamer one can use package background and display it using a Beamer template as described here.","category":"page"},{"location":"Computing/02-General-Computing-Skills/#MiKTeX","page":"General computing skills","title":"MiKTeX","text":"","category":"section"},{"location":"Computing/02-General-Computing-Skills/","page":"General computing skills","title":"General computing skills","text":"mathkerncmssi source file could not be found\nInstalling user packages and classes","category":"page"},{"location":"Computing/02-General-Computing-Skills/#LaTeX-Workshop","page":"General computing skills","title":"LaTeX Workshop","text":"","category":"section"},{"location":"Computing/02-General-Computing-Skills/","page":"General computing skills","title":"General computing skills","text":"Configuring builds in VS Code with LaTeX Workshop for building with pdflatex. Finally I ended creating my own workflows in this file.","category":"page"},{"location":"Computing/04-Geometry-and-Preprocessing/#Geometry-and-Preprocessing","page":"Geometry and Preprocessing","title":"Geometry and Preprocessing","text":"","category":"section"},{"location":"Computing/04-Geometry-and-Preprocessing/#Computer-assisted-design","page":"Geometry and Preprocessing","title":"Computer assisted design","text":"","category":"section"},{"location":"Computing/04-Geometry-and-Preprocessing/#[FreeCAD](https://www.freecad.org/)","page":"Geometry and Preprocessing","title":"FreeCAD","text":"","category":"section"},{"location":"Computing/04-Geometry-and-Preprocessing/","page":"Geometry and Preprocessing","title":"Geometry and Preprocessing","text":"","category":"page"},{"location":"Computing/04-Geometry-and-Preprocessing/#[Salome](https://www.salome-platform.org/)","page":"Geometry and Preprocessing","title":"Salome","text":"","category":"section"},{"location":"Computing/04-Geometry-and-Preprocessing/","page":"Geometry and Preprocessing","title":"Geometry and Preprocessing","text":"Documentation","category":"page"},{"location":"Computing/04-Geometry-and-Preprocessing/#Rotating-reactor","page":"Geometry and Preprocessing","title":"Rotating reactor","text":"","category":"section"},{"location":"Computing/04-Geometry-and-Preprocessing/","page":"Geometry and Preprocessing","title":"Geometry and Preprocessing","text":"In this tutorial we illustrate how to produce a STL surface for use with DEM simulation or meshing with other tools (such as snappyHexMesh).","category":"page"},{"location":"Computing/04-Geometry-and-Preprocessing/","page":"Geometry and Preprocessing","title":"Geometry and Preprocessing","text":"The first step in Salome Shaper to create a geometry is to add a part using the button indicated below:","category":"page"},{"location":"Computing/04-Geometry-and-Preprocessing/","page":"Geometry and Preprocessing","title":"Geometry and Preprocessing","text":"(Image: 00-create-part.png)","category":"page"},{"location":"Computing/04-Geometry-and-Preprocessing/","page":"Geometry and Preprocessing","title":"Geometry and Preprocessing","text":"To add a sketch, select the created part on the object tree and click on button Sketch:","category":"page"},{"location":"Computing/04-Geometry-and-Preprocessing/","page":"Geometry and Preprocessing","title":"Geometry and Preprocessing","text":"(Image: 01-add-sketch-to-part.png)","category":"page"},{"location":"Computing/04-Geometry-and-Preprocessing/","page":"Geometry and Preprocessing","title":"Geometry and Preprocessing","text":"Then select the sketching plane and set plane view to start drawing:","category":"page"},{"location":"Computing/04-Geometry-and-Preprocessing/","page":"Geometry and Preprocessing","title":"Geometry and Preprocessing","text":"(Image: 02-select-set-plane-view.png)","category":"page"},{"location":"Computing/04-Geometry-and-Preprocessing/","page":"Geometry and Preprocessing","title":"Geometry and Preprocessing","text":"Reactor body will be a cylinder with lifters. Here we start by drawing a circle for later extruding it. It is important to snap the center of the cylinder to the origin of coordinate systems and Salome will handle the constraint automatically.","category":"page"},{"location":"Computing/04-Geometry-and-Preprocessing/","page":"Geometry and Preprocessing","title":"Geometry and Preprocessing","text":"(Image: 03-start-sketching-part.png)","category":"page"},{"location":"Computing/04-Geometry-and-Preprocessing/","page":"Geometry and Preprocessing","title":"Geometry and Preprocessing","text":"Using the radius tool you can now constraint the size of shape. Notice that this could also employ symbolic values declarer in the dedicated manager.","category":"page"},{"location":"Computing/04-Geometry-and-Preprocessing/","page":"Geometry and Preprocessing","title":"Geometry and Preprocessing","text":"(Image: 04-add-geometrical-constraints.png)","category":"page"},{"location":"Computing/04-Geometry-and-Preprocessing/","page":"Geometry and Preprocessing","title":"Geometry and Preprocessing","text":"Using the line tool we can draw the lifters profile. Again we can make use of Salome auto-constraning functionality by placing the cursor over the circle before starting the sketch, so that it becomes light blue. By doing this, once we try to set dimensions of the newly drawn lines, their tips will follow along the circle path.","category":"page"},{"location":"Computing/04-Geometry-and-Preprocessing/","page":"Geometry and Preprocessing","title":"Geometry and Preprocessing","text":"(Image: 05-draw-with-constraints.png)","category":"page"},{"location":"Computing/04-Geometry-and-Preprocessing/","page":"Geometry and Preprocessing","title":"Geometry and Preprocessing","text":"It is also important to notice that if you draw perfectly vertical or horizontal lines, Salome Shaper will again apply auto-constraints, as depicted below:","category":"page"},{"location":"Computing/04-Geometry-and-Preprocessing/","page":"Geometry and Preprocessing","title":"Geometry and Preprocessing","text":"(Image: 06-draw-with-constraints.png)","category":"page"},{"location":"Computing/04-Geometry-and-Preprocessing/","page":"Geometry and Preprocessing","title":"Geometry and Preprocessing","text":"With the horizontal distance tool you can set distances between objects:","category":"page"},{"location":"Computing/04-Geometry-and-Preprocessing/","page":"Geometry and Preprocessing","title":"Geometry and Preprocessing","text":"(Image: 07-constrain-other-parts.png)","category":"page"},{"location":"Computing/04-Geometry-and-Preprocessing/","page":"Geometry and Preprocessing","title":"Geometry and Preprocessing","text":"Similarly, you can also set lengths with the adequate tool:","category":"page"},{"location":"Computing/04-Geometry-and-Preprocessing/","page":"Geometry and Preprocessing","title":"Geometry and Preprocessing","text":"(Image: 08-add-constraints-till-end.png)","category":"page"},{"location":"Computing/04-Geometry-and-Preprocessing/","page":"Geometry and Preprocessing","title":"Geometry and Preprocessing","text":"Using the trimming tool you can remove segments that are intercepted by points:","category":"page"},{"location":"Computing/04-Geometry-and-Preprocessing/","page":"Geometry and Preprocessing","title":"Geometry and Preprocessing","text":"(Image: 09-trim-undesired-lines.png)","category":"page"},{"location":"Computing/04-Geometry-and-Preprocessing/","page":"Geometry and Preprocessing","title":"Geometry and Preprocessing","text":"Once sketch is ready, you can validate to pursue 3D modeling:","category":"page"},{"location":"Computing/04-Geometry-and-Preprocessing/","page":"Geometry and Preprocessing","title":"Geometry and Preprocessing","text":"(Image: 10-finish-sketch-clicking-on-V.png)","category":"page"},{"location":"Computing/04-Geometry-and-Preprocessing/","page":"Geometry and Preprocessing","title":"Geometry and Preprocessing","text":"Among the several possible extrusion methods, you can select to extrude only the profile. Do not forget to select the objects, direction and depth to extrude. Using auxiliary lines it is virtually possible to extrude in any direction other than perpendicular to sketch plane.","category":"page"},{"location":"Computing/04-Geometry-and-Preprocessing/","page":"Geometry and Preprocessing","title":"Geometry and Preprocessing","text":"(Image: 11-extrude-the-profile-only.png)","category":"page"},{"location":"Computing/04-Geometry-and-Preprocessing/","page":"Geometry and Preprocessing","title":"Geometry and Preprocessing","text":"Here we are ready to go to menu File > Export > To CAD format... and select STL option and the path to the target file. Notice that if the design was composed of several parts, in this step you would need to export them individually by selecting one part at a time.","category":"page"},{"location":"Computing/04-Geometry-and-Preprocessing/","page":"Geometry and Preprocessing","title":"Geometry and Preprocessing","text":"(Image: 12-export-to-stl-file.png)","category":"page"},{"location":"Computing/04-Geometry-and-Preprocessing/","page":"Geometry and Preprocessing","title":"Geometry and Preprocessing","text":"Now you have a reactor profile for use in a simulation setup.","category":"page"},{"location":"Computing/04-Geometry-and-Preprocessing/#Grid-generation","page":"Geometry and Preprocessing","title":"Grid generation","text":"","category":"section"},{"location":"Computing/04-Geometry-and-Preprocessing/#[gmsh](https://gmsh.info/)","page":"Geometry and Preprocessing","title":"gmsh","text":"","category":"section"},{"location":"Computing/04-Geometry-and-Preprocessing/#[netgen](https://ngsolve.org/)","page":"Geometry and Preprocessing","title":"netgen","text":"","category":"section"},{"location":"Computing/04-Geometry-and-Preprocessing/#[tetgen](https://wias-berlin.de/software/tetgen/1.5/index.html)","page":"Geometry and Preprocessing","title":"tetgen","text":"","category":"section"},{"location":"References/@Koh1971a/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Koh1971a/","page":"-","title":"-","text":"title: \"Thermal conductivity and electrical resistivity of porous metallic materials\" authors: J. C. Y. Koh, Anthony Fortini year: 1971 –-","category":"page"},{"location":"References/@Mujumdar2006i/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Mujumdar2006i/","page":"-","title":"-","text":"title: \"Simulation of rotary cement kilns using a one-dimensional model\" authors: Kaustubh S. Mujumdar, Vivek V. Ranade year: 2006 –-","category":"page"},{"location":"References/@Tensorflow2015Whitepaper/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Tensorflow2015Whitepaper/","page":"-","title":"-","text":"title: \"TensorFlow: Large-scale machine learning on heterogeneous systems\" authors: Martín Abadi, Ashish Agarwal, Paul Barham, Eugene Brevdo, Zhifeng Chen, Craig Citro, Greg S. Corrado, Andy Davis, Jeffrey Dean, Matthieu Devin, Sanjay Ghemawat, Ian Goodfellow, Andrew Harp, Geoffrey Irving, Michael Isard, Yangqing Jia, Rafal Jozefowicz, Lukasz Kaiser, Manjunath Kudlur, Josh Levenberg, Dandelion Mané, Rajat Monga, Sherry Moore, Derek Murray, Chris Olah, Mike Schuster, Jonathon Shlens, Benoit Steiner, Ilya Sutskever, Kunal Talwar, Paul Tucker, Vincent Vanhoucke, Vijay Vasudevan, Fernanda Viégas, Oriol Vinyals, Pete Warden, Martin Wattenberg, Martin Wicke, Yuan Yu, Xiaoqiang Zheng year: 2015 DOI: https://doi.org/10.5281/zenodo.4724125 –-","category":"page"},{"location":"References/@Fiedler2006a/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Fiedler2006a/","page":"-","title":"-","text":"title: \"Calculations of the thermal conductivity of porous materials\" authors: Thomas Fiedler, Ekaterina Pesetskaya, Andreas Öchsner, José Grácio year: 2006 –-","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"excalidraw-plugin: parsed tags: [excalidraw]","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"==⚠ Switch to EXCALIDRAW VIEW in the MORE OPTIONS menu of this document. ⚠==","category":"page"},{"location":"Notes/Brain/#Excalidraw-Data","page":"Excalidraw Data","title":"Excalidraw Data","text":"","category":"section"},{"location":"Notes/Brain/#Text-Elements","page":"Excalidraw Data","title":"Text Elements","text":"","category":"section"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Brain ^bA0uK4HU","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"PINNs ^Pn47WBnc","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Solve kiln model ^92u72gv3","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"ROMs ^r9eGuIr4","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Harmonic Oscillator (from Brunton) ^n90Bs0Ht","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Interop ^XLzsMIc3","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Add Fortran, Julia, and Python interfaces to RK4 in C ^6K7UnJNp","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Productivity ^bsV0my5p","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Article comparing Weave, Frankling, Pluto and Jupyter for scientific computing. Maybe nteract ^RfeTVfZo","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Computer vision ^559Ywru9","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Introductory porosity quantification in Julia ^rhMvGIOj","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Region properties of segmented pores ^Aqasmef7","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"ML ^HKk6xNwl","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"ANNs ^qKP1VQdM","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Article about training RADCAL in Julia and package creation ^nC0nVVtR","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Science and Computing 101 ^JWFx8npJ","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Undergrad courses ^F7M8Zx94","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Publishing with LaTeX 101 ^HKwKy0Eb","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Shell and Linux 101 ^Z6h5wrlV","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Tabular data in Python 101 ^xaKa9dGT","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Automating visualization ^ObWvvjKj","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"GraphViz and Gnuplot for dummies ^ftoPgCWk","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Matplotlib in 2h ^pPiz5TQQ","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Carburizing model from PhD ^XhzzmGRp","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Transport ^tCXg2mu8","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Julia for Scientists ^ez3zXh1d","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Basic module ^HA9n1RFk","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Advanced module ^MWT5lLdz","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Calphad ^C4woGMbZ","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Article about detecting corners and rectangles ^xRElE6D0","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"OpenFOAM ^iMcRf8e2","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"DWSIM ^Nhq5Bdy8","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Energy balanced CaCO3 calcination reaction ^NPleQcWs","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Progressive PFRs ^egcFwZrB","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Julia CFD ^U4ZPcmuq","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Fundamentals of numerical methods ^0NhTSDQ9","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Advection equation ^6KfA6RYV","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Diffusion equation ^9SEZI47q","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Diffusion-reaction ^P1m4LpEH","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Burgers equation ^pv23Y9ct","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Laplace and Poisson equations ^YHSNiC85","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Navier-Stokes equations ^67lUEZ2l","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Finite Volume Method ^0gX1MsRw","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Article re-implementing Tomasini (2014) in Julia ^nrS1JnEA","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Call OpenCALPHAD from Julia ^nLy6i1pF","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"CAS system ^9SNwCKSp","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"CaO-SiO2 ^9mh8UBUe","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Al2O3-SiO2 ^125sLdxw","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Al2O3-CaO ^NskFV0Yj","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"FEM ^t6SMVOto","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"DryTooling Tech ^1wnL2zxG","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"DryTooling.jl ^5NbIV4lV","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Training ^7BAW44HS","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Python for Engineers ^K5Ye0cxI","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Physics-based MPC with CasADi ^tJsZLXvE","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Data analysis with SciPy stack ^yOM0oEMa","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Dashboards with streamlit ^I9xk1J9l","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"CFD post-processing with PyVista ^Bl3RsRQt","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Julia for Engineers ^58Qs0CFa","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Dynamical systems with ModelingToolkit.jl ^Mo2M8E43","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Optimization with JuMP.jl ^ZHncvBfB","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Dashboards with Genie.jl ^wB6NrZ9N","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Consulting ^jEUettuQ","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Process Simulation ^UlQvskQU","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"OpenFOAM ^VJwADgjf","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Computing ^pP3j0ZqE","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Opportunities assessment ^LZXWiCoV","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Recruiting and head-hunting ^CrQewjXL","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Infrastructure dimensioning ^9Y8DotKm","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Carbonitriding model in FVM vs FEM ^VzSV6Pa2","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Fe-N system ^etJ5Bq3v","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Article of nitriding model with MPC automation ^O9hQBC0D","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Nitriding with phase equilibria ^r8N78zxH","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Al2O3-ZrO2 ^nK3zGlNj","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Finish PhD thesis paper with OpenFOAM simulations ^EmDJPcmS","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Carbonitriding Model ^vC5XTp0L","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Solvers ^eEQP5dWH","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Article about generalized Kramers equation solution ^J3CULMnw","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Implement all models of Slycke's papers ^m9Tl7oEF","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Fe-C system ^lNYlgd0n","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"JMAK Model for heat transfer ^HdsdfDcD","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Process ^KK5XHEiZ","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Article about chemical engineering MPC ^dFjEjkdP","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Calling C/C++ from Fortran ^PMctBhDy","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Nonlinear problems basics - article ^ioGzTE15","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Root-finding in Python - article ^tXnq49fL","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Generalization to include time-dependence ^Up57RpHf","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Find optimal carbonitriding cycle for given constrains ^6rcojs0X","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"GPU (CUDA) ^3k44G9rm","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Create Julia package with Rust ^y69kUT7J","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Crate jlrs ^S4SxKEOw","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Sample code ^7cQS9f9z","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Basilisk ^33ZXQ1X2","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"%%","category":"page"},{"location":"Notes/Brain/#Drawing","page":"Excalidraw Data","title":"Drawing","text":"","category":"section"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"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","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"%%","category":"page"},{"location":"References/@Aissa2015a/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Aissa2015a/","page":"-","title":"-","text":"title: Ranz and Marshall correlations limits on heat flow between a sphere and its surrounding gas at high temperature authors: Abderrahmane Aissa, Mohamed Abdelouahab, Abdelkader Noureddine, Mohammed Elganaoui, Bernard Pateyron year: 2015 –-","category":"page"},{"location":"References/@Mraz2021a/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Mraz2021a/","page":"-","title":"-","text":"title: \"Thermal conductivity of porous oxide layer: A numerical model based on CT data\" authors: Krystof Mraz, Jan Bohacek, Ondrej Resl, Martin Chabicovsky, Ebrahim Karimi-Sibaki year: 2021 –-","category":"page"},{"location":"References/@Joos1958/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Joos1958/","page":"-","title":"-","text":"title: \"Theoretical physics\" authors: Georg Joos year: 1986 –-","category":"page"},{"location":"References/@Zuo2000a/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Zuo2000a/","page":"-","title":"-","text":"title: Modelling superheated fuel sprays and vaproization authors: B. Zuo, A. M. Gomes, C. J. Rutland year: 2000 URL: https://doi.org/10.1243/1468087001545218 –-","category":"page"},{"location":"toc/#Table-of-contents","page":"Table of contents","title":"Table of contents","text":"","category":"section"},{"location":"toc/","page":"Table of contents","title":"Table of contents","text":"Depth = 4","category":"page"},{"location":"References/@Bird2001/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Bird2001/","page":"-","title":"-","text":"title: \"Transport phenomena\" authors: R. B. Bird, W. E. Stewart, E. N. Lightfoot year: 2001 –-","category":"page"},{"location":"Software/OpenFOAM11/aachenBombSteady/#Breakdown-into-sub-models","page":"-","title":"Breakdown into sub-models","text":"","category":"section"},{"location":"Software/OpenFOAM11/aachenBombSteady/","page":"-","title":"-","text":"[x] Incompressible flow only for mesh and conditions check with incompressibleFluid:","category":"page"},{"location":"Software/OpenFOAM11/aachenBombSteady/","page":"-","title":"-","text":"- After a first run with a system length of 1 m it was decided to increase the domain to 2 m in order to ensure a better development of flow profile (at least 10 times the cross section size) and double the number of cells in transversal directions.\n- It was confirmed that the inlet mean velocity profile respects the expected value from the imposed mass flow rate evaluated during parameters setup, but outlet is controversial. This is probably because the case should be run as turbulent or grid is too coarse.\n- Mass conservation was monitored and confirmed through field `phi`.\n- It must be emphasized that boundary layer resolution is not accurate since no grading is applied and mesh is very coarse, but since the goal is flare development far from the walls this is acceptable at this stage and will be dealt with at a later stage.\n- All residuals are going down adequately, allowing us to move to the next step. \n- Calculation took approximately 10 seconds with 1 core.","category":"page"},{"location":"Software/OpenFOAM11/aachenBombSteady/","page":"-","title":"-","text":"[x] Previous case is copied and support to RAS k-varepsilon Launder1974 [76] is implemented:","category":"page"},{"location":"Software/OpenFOAM11/aachenBombSteady/","page":"-","title":"-","text":"- With inclusion of turbulence the actual outlet velocity matches the expected value (that was unphysical in the previous simulation), validating the approach.\n- Entry length is verified through velocity and turbulent viscosity, confirming the need to extend the domain for a proper development.\n- The number of iterations was increased to 200 to ensure that everything has properly converged, reaching an extremely low residuals level for all variables.\n- Other previous observations are still valid, allowing us to move to the next step.\n- Calculation took approximately 11 seconds with 1 core to perform 100 iterations. After 100 iterations the step convergence becomes slow because of the already low residuals, leading to a calculation time of 38 seconds.","category":"page"},{"location":"Software/OpenFOAM11/aachenBombSteady/","page":"-","title":"-","text":"[x] Adding compressible flow with multicomponentFluid to the above:","category":"page"},{"location":"Software/OpenFOAM11/aachenBombSteady/","page":"-","title":"-","text":"- The temperature field is added prior to handling any combustion aspects in this step to avoid having interaction between these elements in convergence checks. \n- Nonetheless, gravity was already added here after a first run without it for a basic check. A vertical pressure profile is observed in the cross-section, showing the expected buoyancy effects.\n- Other Impacted files include physical properties, which now incorporate more detailed thermodynamics, `alphat` and, at least, the main chemical component file with boundary and initial conditions. \n- The mean value of `phi` in the outlet can now be compared to the imposed mass flow rate, validating the boundary condition setup.\n- Calculation took approximately 13 seconds with 1 core to perform 100 iterations. Again an important slow down is observed leading to 125 seconds to perform 300 iterations.","category":"page"},{"location":"Software/OpenFOAM11/aachenBombSteady/","page":"-","title":"-","text":"[x] The next logical step is to include evaporation of fuel in the gas, without enabling reactions:","category":"page"},{"location":"Software/OpenFOAM11/aachenBombSteady/","page":"-","title":"-","text":"- The simples way of doing so is adding the required chemical and associated initial file without adding any combustion or reaction parameters. It was chosen to use the actual species name instead of simply *fuel* to keep created files compatible with next steps. Simulation was checked before adding the cloud, which exponentially complexifies the setup.\n- A `patchPostProcessing` cloud function was tested at first to check if conditions were leading to complete fuel evaporation. It is kept commented-out for future debug if required. To make results easier to interpret, a fixed size PSD was adopted at this stage.\n- As expected, convergence is bad and the only strategy that seems to work is mesh refinement. Otherwise pressure coupling becomes difficult and trying to change numerical parameters (solver correctors, linear solver, divergence and Laplacian schemes, relaxation level) do not improve anything. Tried to use `SOI` at a later iteration to let flow converge before injection, but apparently the steady solver ignores this. Even with `localEuler` pseudo-time stepping (requires to add residuals for `rho` in `fvSolution`) it does not seem to take `SOI` into account. Also tried deactivating clouds and converging before reactivating it (what would be equivalent to the later `SOI` approach) and that does not work either, confirming it is a physical coupling problem.\n- Because of mesh refinement, now parallelization becomes a requirement unless we work with mesh grading, what is out of the present scope (to be done only in production scenario). Nonetheless, parallelization does not seem to be of great advantage.","category":"page"},{"location":"Software/OpenFOAM11/aachenBombSteady/","page":"-","title":"-","text":"[ ] Activation of global chemistry and combustion modeling:","category":"page"},{"location":"Software/OpenFOAM11/aachenBombSteady/","page":"-","title":"-","text":"- From now on the level of physics start becoming too complex and pre-computation of fields should be done whenever compatible. That means that prior to chemistry activation it seems a good idea to let evaporation of droplets converge (testing 1000 iterations).\n- To keep things general, instead of setting up the case with a fixed database of species thermodynamics, it is better to convert Chemkin files.\n-","category":"page"},{"location":"Software/OpenFOAM11/aachenBombSteady/","page":"-","title":"-","text":"[ ] Add radiation modeling\n[ ] Add arbitrary empirical fuel modeling","category":"page"},{"location":"Software/OpenFOAM11/aachenBombSteady/","page":"-","title":"-","text":"After modification the cases were run again getting the following performances, from which it becomes clear that for the present grid size the parallelization saturates quickly.","category":"page"},{"location":"Software/OpenFOAM11/aachenBombSteady/","page":"-","title":"-","text":"Step 1 processor 32 processors\n0 77 14\n1 35\n2 80\n3 \n4 ","category":"page"},{"location":"Software/OpenFOAM11/aachenBombSteady/#Future-improvements","page":"-","title":"Future improvements","text":"","category":"section"},{"location":"Software/OpenFOAM11/aachenBombSteady/","page":"-","title":"-","text":"[ ] Add the following to the parameters file for full turbulence model controls:","category":"page"},{"location":"Software/OpenFOAM11/aachenBombSteady/","page":"-","title":"-","text":"Cmu 0.09;\nC1 1.44;\nC2 1.92;\nC3 0;\nsigmak 1;\nsigmaEps 1.3;","category":"page"},{"location":"Software/OpenFOAM11/aachenBombSteady/","page":"-","title":"-","text":"[ ] Add convergence criteria PIMPLE: No convergence criteria found.\n[ ] Consider a possible adaptive mesh refinement at case setup (not runtime!).","category":"page"},{"location":"Software/OpenFOAM11/aachenBombSteady/#Reminders","page":"-","title":"Reminders","text":"","category":"section"},{"location":"Software/OpenFOAM11/aachenBombSteady/","page":"-","title":"-","text":"Because of potentialFlow initialization, a dictionary corresponding to this must be present in fvSolution as well as a solver for Phi (copy defaults for pressure). Because this solver does not have information about temperature or composition of fluid, a field rhoInlet is required in inlets.","category":"page"},{"location":"Software/OpenFOAM11/aachenBombSteady/#Initial-tentative-setup","page":"-","title":"Initial tentative setup","text":"","category":"section"},{"location":"Software/OpenFOAM11/aachenBombSteady/","page":"-","title":"-","text":"This case aims producing a steady state liquid fuel combustion model using aachenBomb case as a starting point, but does not directly tries to reproduce the results of that case. It was modified so that there is an inlet and an outlet for flame development.\nTo perform the setup we retrieve several modifications from verticalChannelSteady and verticalChannelLTS. The first because it is the only case under multicomponentFluid solver currently using a steadyState time-stepping scheme and the latter due to the use of localEuler, which is often used to produce pseudo-steady solutions when a direct steady state calculations becomes unstable (as it is the case in most combustion calculations).\nModify controlDict to integer steps (that is, each step is an iteration) for both time-step and write controls, and enable purgeWrite to keep case cleaner. Notice that this is also valid if using a localEuler time-stepping scheme. Change time-stepping method accordingly in fvSchemes.\nTo increase robustness of solution, it is recommended to compute a potential flow with potentialFoam as in reference case verticalChannelLTS. This requires a solver control field Phi in fvSolution and a reference rhoInlet value to be provided in inlet flow velocity. Other parameters, but specially maxCo are also copied from reference case.\nSome dictionaries in cloudProperties require steady-state specific commands, such as adding calcFrequency to solution, resetOnStartup to solution.sourceTerms, and injection models must use massFlowRate, what is physically understandable.\nCombustion is quite sensitive and Seulex alone does not seem able to handle it with an EDC approach. First flow was developed further during 100 steps before activating chemistry. For now using a single step infinitelyFastChemistry to try to stabilize the behavior before trying back to use the EDC model.","category":"page"},{"location":"Software/OpenFOAM11/horizontalMixer/","page":"-","title":"-","text":"The following numerical experiments concern the horizontalMixer sample case.","category":"page"},{"location":"Software/OpenFOAM11/horizontalMixer/#Conceptual-phase","page":"-","title":"Conceptual phase","text":"","category":"section"},{"location":"Software/OpenFOAM11/horizontalMixer/","page":"-","title":"-","text":"Minimal working examples:","category":"page"},{"location":"Software/OpenFOAM11/horizontalMixer/","page":"-","title":"-","text":"000: no models active other than patchInteraction rebound.","category":"page"},{"location":"Software/OpenFOAM11/horizontalMixer/","page":"-","title":"-","text":"(Image: Case 000)","category":"page"},{"location":"Software/OpenFOAM11/horizontalMixer/","page":"-","title":"-","text":"001: no models active other than patchInteraction standardWallInteraction.","category":"page"},{"location":"Software/OpenFOAM11/horizontalMixer/","page":"-","title":"-","text":"(Image: Case 001)","category":"page"},{"location":"Software/OpenFOAM11/horizontalMixer/","page":"-","title":"-","text":"002: no models active other than patchInteraction localInteraction.","category":"page"},{"location":"Software/OpenFOAM11/horizontalMixer/","page":"-","title":"-","text":"(Image: Case 002)","category":"page"},{"location":"Software/OpenFOAM11/horizontalMixer/","page":"-","title":"-","text":"If there are outlets in the system, rebound model is not suitable. Because of this, all the next cases, unless stated otherwise, will use localInteraction given the better control it provides over individual patches with respect to standardWallInteraction (although it is much slower than the latter).","category":"page"},{"location":"Software/OpenFOAM11/horizontalMixer/","page":"-","title":"-","text":"007: compare solution for same (approximate) mass flow with using multiple particles per parcel - with respect to the single particle per parcel performed in the reference case 002. The overall cloud shape remains the same but some spatial resolution is lost. For conception studies it seems valid to use a higher number of particles per parcel.","category":"page"},{"location":"Software/OpenFOAM11/horizontalMixer/","page":"-","title":"-","text":"(Image: Case 007)","category":"page"},{"location":"Software/OpenFOAM11/horizontalMixer/","page":"-","title":"-","text":"Using the basic patchInteraction localInteraction add these variants (notice that the option none for all these models is already covered by the reference case 002. After comparing cases 002 and 007 the following variants were modified to match 007 as a reference case given the much lower computational time (more particles per parcel).","category":"page"},{"location":"Software/OpenFOAM11/horizontalMixer/","page":"-","title":"-","text":"003: packingModel explicit.","category":"page"},{"location":"Software/OpenFOAM11/horizontalMixer/","page":"-","title":"-","text":"(Image: Case 003)","category":"page"},{"location":"Software/OpenFOAM11/horizontalMixer/","page":"-","title":"-","text":"004: packingModel implicit.","category":"page"},{"location":"Software/OpenFOAM11/horizontalMixer/","page":"-","title":"-","text":"(Image: Case 004)","category":"page"},{"location":"Software/OpenFOAM11/horizontalMixer/","page":"-","title":"-","text":"005: dampingModel relaxation. Particle velocities are relaxed towards the local mean over a time-scale. Notice that reference paper intended to improve MP-PIC for polydisperse sedimenting particle clouds.","category":"page"},{"location":"Software/OpenFOAM11/horizontalMixer/","page":"-","title":"-","text":"(Image: Case 005)","category":"page"},{"location":"Software/OpenFOAM11/horizontalMixer/","page":"-","title":"-","text":"006 isotropyModel stochastic. According to the reference paper collisions cause numerical particles to scatter in MP-PIC calculations, just as physical particles do in particle/fluid flows, just as the generated animation implies.","category":"page"},{"location":"Software/OpenFOAM11/horizontalMixer/","page":"-","title":"-","text":"(Image: Case 006)","category":"page"},{"location":"Software/OpenFOAM11/horizontalMixer/","page":"-","title":"-","text":"Implicit packing so far is the only model for which particles left the system and turbulence effects and segregation becomes apparent. In fact without implicit packing the results do not even look physical, so it is probably a requirement to activate this model. Damping and isotropy models produce similar results, with a little more dispersed cloud when isotropy is active, as stated above from its reference.","category":"page"},{"location":"Software/OpenFOAM11/horizontalMixer/","page":"-","title":"-","text":"Hypotheses testing cases:","category":"page"},{"location":"Software/OpenFOAM11/horizontalMixer/","page":"-","title":"-","text":"008: modify case 004 to test if with rebound patch interaction particles are able to quit the system. Confirmed that this patch interaction does not handle outlets.","category":"page"},{"location":"Software/OpenFOAM11/horizontalMixer/","page":"-","title":"-","text":"(Image: Case 008)","category":"page"},{"location":"Software/OpenFOAM11/horizontalMixer/","page":"-","title":"-","text":"009: modify case 004 to test if with standardWallInteraction patch interaction particles are able to quit the system. Confirmed that this patch interaction does handle outlets similarly to the localInteraction. It was not possible to confirm if inlets also allow backflow since reporting is not provided by patch.","category":"page"},{"location":"Software/OpenFOAM11/horizontalMixer/","page":"-","title":"-","text":"(Image: Case 009)","category":"page"},{"location":"Software/OpenFOAM11/horizontalMixer/","page":"-","title":"-","text":"010: check the role of gravity option over implicit packing model. Here we derive a variant of 009 because it runs faster than with localInteraction. ","category":"page"},{"location":"Software/OpenFOAM11/horizontalMixer/","page":"-","title":"-","text":"(Image: Case 010)","category":"page"},{"location":"Software/OpenFOAM11/horizontalMixer/","page":"-","title":"-","text":"011: in fact the role of gravity in 010 was pretty devastating over the sedimentation rate (quite unexpected given the particle sizes that were used) so a variant of this case was manually initialized from last state and left to run for a much longer physical time (100 s) using maxCo 2.0 for faster execution. CALCULATION DIVERGED, REDO!","category":"page"},{"location":"Software/OpenFOAM11/horizontalMixer/#Physical-refinement-phase","page":"-","title":"Physical refinement phase","text":"","category":"section"},{"location":"Software/OpenFOAM11/horizontalMixer/","page":"-","title":"-","text":"Model Takings\nInjectionModel CONFIRM CONCLUSIONS WITH POLYDISTRIBUTED CLOUDS (particles per parcel)!\nPatchInteractionModel This model is key for the simulation of particles coupled to a fluid. Unless different behavior is expected in the different walls so customization of interaction is required, it is much faster to use a standardWallInteraction approach. For understanding the role of parameters e and mu over rebound one can check lines 144-168 of source code and confirm the model is the same as the one implemented in localInteraction in lines 366-391 of sources.\nPackingModel \nDampingModel \nIsotropyModel \nParticleForce This will be discussed in this section.","category":"page"},{"location":"Software/OpenFOAM11/horizontalMixer/","page":"-","title":"-","text":"Solution with different drag models:","category":"page"},{"location":"Software/OpenFOAM11/horizontalMixer/","page":"-","title":"-","text":"Model Results\nsphereDrag (Image: Case 012) 012\nWenYuDrag (used in injectionChannel) implemented from equation (2.12) of Gidaspow1994 [77]. (Image: Case 013) 013\nErgunWenYuDrag (used in Goldschmidt, cyclone, and column) implemented from equation (5.11) of Gidaspow1994 [77]. (Image: Case 014) 014","category":"page"},{"location":"Software/OpenFOAM11/horizontalMixer/","page":"-","title":"-","text":"Other drag models:","category":"page"},{"location":"Software/OpenFOAM11/horizontalMixer/","page":"-","title":"-","text":"Model Details\nPlessisMasliyahDrag Used in GoldschmidtMPPIC. Implemented from Plessis1988 [78] is adapted for flow through consolidated isotropic porous media. This is outside the scope of the current study but functionality is tested anyways from a computational point of view and to understand its behavior far from its reference application. Calculation diverged, so no results are available.\ndistortedSphereDrag Not used in any tutorial. Implemented as per Liu1993 [14] is conceived for the simulation of the effects of drop drag and breakup on fuel sprays. This is far from our scope and is not tested.\nnonSphereDrag Not used in any tutorial. Implemented as per Haider1989 [79] is a drag model for non-spherical particles. Its most important parameter is phi, the ratio of the surface area of a sphere with the same volume as the particle to the actual surface area of the particle.\nSchillerNaumannDrag Not used in any tutorial. Implemented according the classical paper by Schiller (1935) for modeling drag over spheres.","category":"page"},{"location":"Software/OpenFOAM11/horizontalMixer/","page":"-","title":"-","text":"Solution with different sizeDistribution:","category":"page"},{"location":"Software/OpenFOAM11/horizontalMixer/","page":"-","title":"-","text":"[ ] fixedValue\n[ ] normal\n[ ] RosinRammler\n[ ] tabulatedDensity","category":"page"},{"location":"Software/OpenFOAM11/horizontalMixer/","page":"-","title":"-","text":"Solution with different cloud types","category":"page"},{"location":"Software/OpenFOAM11/horizontalMixer/","page":"-","title":"-","text":"MPPICCloud\ncollidingCloud","category":"page"},{"location":"Software/OpenFOAM11/horizontalMixer/","page":"-","title":"-","text":"For the PackingModelone needs to specify the ParticleStressModel among the following:","category":"page"},{"location":"Software/OpenFOAM11/horizontalMixer/","page":"-","title":"-","text":"Model Details\nHarrisCrighton \nLun ","category":"page"},{"location":"Software/OpenFOAM11/horizontalMixer/","page":"-","title":"-","text":"For both DampingModel and IsotropyModel one needs a TimeScaleModel","category":"page"},{"location":"Software/OpenFOAM11/horizontalMixer/","page":"-","title":"-","text":"Option Details\nequilibrium \nisotropic \nnonEquilibrium ","category":"page"},{"location":"WallyToolbox/Internals/Documents/#Documents","page":"Documents","title":"Documents","text":"","category":"section"},{"location":"WallyToolbox/Internals/Documents/","page":"Documents","title":"Documents","text":"EditURL = \"https://github.com/wallytutor/WallyToolbox.jl/blob/main/docs/src/Modules/WallyToolbox/Documents.md\"\nCurrentModule = WallyToolbox\nDocTestSetup = quote\n using WallyToolbox\nend","category":"page"},{"location":"WallyToolbox/Internals/Documents/","page":"Documents","title":"Documents","text":"The following functionalities are intended mostly for the own toolbox maintenance and documentation generation. This can also be imported as a replacement for some boilerplate code in other projects. The use of the functions provided in this module is essentially illustrated in docs/make.jl.","category":"page"},{"location":"WallyToolbox/Internals/Documents/","page":"Documents","title":"Documents","text":"WallyToolbox.Documents.get_format\nWallyToolbox.Documents.deployrepo","category":"page"},{"location":"WallyToolbox/Internals/Documents/#WallyToolbox.Documents.get_format","page":"Documents","title":"WallyToolbox.Documents.get_format","text":"Get format specified to generate docs.\n\n\n\n\n\n","category":"function"},{"location":"WallyToolbox/Internals/Documents/#WallyToolbox.Documents.deployrepo","page":"Documents","title":"WallyToolbox.Documents.deployrepo","text":"Generate a repo argument in the format expected by deploydocs.\n\n\n\n\n\n","category":"function"},{"location":"WallyToolbox/Internals/Documents/","page":"Documents","title":"Documents","text":"Because most of my work is done with Obsidian and the tool does not support Julia math blocks and a few other features, the functions below were conceived to help documentation conversion without modifications to standard LaTeX syntacs in Obsidian.","category":"page"},{"location":"WallyToolbox/Internals/Documents/","page":"Documents","title":"Documents","text":"WallyToolbox.Documents.julianizemarkdown\nWallyToolbox.Documents.formatequations\nWallyToolbox.Documents.formatnotecells","category":"page"},{"location":"WallyToolbox/Internals/Documents/#WallyToolbox.Documents.julianizemarkdown","page":"Documents","title":"WallyToolbox.Documents.julianizemarkdown","text":"Convert equations from dollar to Julia ticks notation.\n\n\n\n\n\n","category":"function"},{"location":"WallyToolbox/Internals/Documents/#WallyToolbox.Documents.formatequations","page":"Documents","title":"WallyToolbox.Documents.formatequations","text":"Convert (multiline) equations to Julia markdown.\n\n\n\n\n\n","category":"function"},{"location":"WallyToolbox/Internals/Documents/#WallyToolbox.Documents.formatnotecells","page":"Documents","title":"WallyToolbox.Documents.formatnotecells","text":"Convert cells of notebooks to Documenter format.\n\n\n\n\n\n","category":"function"},{"location":"WallyToolbox/Internals/Documents/","page":"Documents","title":"Documents","text":"Finally, we wrap up a standard workflow for converting Pluto notebooks.","category":"page"},{"location":"WallyToolbox/Internals/Documents/","page":"Documents","title":"Documents","text":"WallyToolbox.Documents.convert_pluto","category":"page"},{"location":"WallyToolbox/Internals/Documents/#WallyToolbox.Documents.convert_pluto","page":"Documents","title":"WallyToolbox.Documents.convert_pluto","text":"Convert Pluto notebook into a static HTML file.\n\n\n\n\n\n","category":"function"},{"location":"References/@Nakayama2023/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Nakayama2023/","page":"-","title":"-","text":"title: \"Effective thermal conductivity of porous media\" authors: Akira Nakayama year: 2023 –-","category":"page"},{"location":"References/@Jeong1995a/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Jeong1995a/","page":"-","title":"-","text":"title: On the identification of a vortex authors: Jinhee Jeong, Fazle Hussain year: 1995 URL: https://doi.org/10.1017/S0022112095000462 Drive: –-","category":"page"},{"location":"References/@Wu2022a/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Wu2022a/","page":"-","title":"-","text":"title: A comprehensive study of non-adaptive and residual-based adaptive sampling for physics-informed neural networks authors: Chenxi Wu, Min Zhu, Qinyang Tan, Yadhu Kartha, Lu Lu year: 2022 URL: https://doi.org/10.48550/arXiv.2207.10289 Drive: https://1drv.ms/b/s!Ar4x-UlrYAiZla5WOX3yVxsVYZ1BSQ?e=RJSrB2 –-","category":"page"},{"location":"References/@Haghighat2021sciann/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Haghighat2021sciann/","page":"-","title":"-","text":"title: \"SciANN: A Keras/TensorFlow wrapper for scientific computations and physics-informed deep learning using artificial neural networks\" authors: Ehsan Haghighat, Ruben Juanes year: 2021 DOI: https://doi.org/10.48550/arXiv.2005.08803 –-","category":"page"},{"location":"References/@Fadayini2021/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Fadayini2021/","page":"-","title":"-","text":"title: Simulation and optimization of an integrated process flow sheet for cement production authors: Oluwafemi M. Fadayini, Adekunle A. Obisanya, Gloria O. Ajiboye, Clement Madu, Tajudeen O. Ipaye, Taiwo O. Rabiu, Shola J. Ajayi, Joseph T. Akintola year: 2021 –-","category":"page"},{"location":"References/@Lay2012/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Lay2012/","page":"-","title":"-","text":"title: \"Linear algebra and its applications\" authors: David C. Lay year: 2012 –-","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/#Reator-pistão","page":"Reator pistão","title":"Reator pistão","text":"","category":"section"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"#plug-flow ","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"Neste tópico abordamos modelos de reatores pistão em níveis progressivos de complexidade. Os modelos de reator estudados incluem em alguns casos aspectos voltados aos aspectos térmicos e em outros elementos de cinética química. O objetivo final é progressivamente introduzir complexidate em termos da física considerada, mas também em termos das estratégias numéricas empregadas na sua implementação","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/#Indice-de-tópicos","page":"Reator pistão","title":"Indice de tópicos","text":"","category":"section"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/#Disponíveis-atualmente","page":"Reator pistão","title":"Disponíveis atualmente","text":"","category":"section"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"Introdução: solução térmica de um reator incompressível formulado em termos da temperatura. O objetivo é de realizar a introdução ao modelo de reator pistão sem entrar em detalhes involvendo não-linearidades como a dependência da densidade em termos da temperatura ou composição. Ademais, essa forma permite uma solução analítica. Introduz o uso de ModelingToolkit e do método dos volumes finitos.\nFormulação entálpica do reator pistão: casos práticos de aplicação de reatores normalmente envolvem fluidos com propriedades que dependem da temperatura, especialmente o calor específico. Em geral a sua solução é tratada de forma mais conveniente com uma formulação em termos da entalpia. Continuamos com o mesmo caso elaborado no estudo introdutório modificando as equações para que a solução seja realizada com a entalpia como variável dependente.","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/#Em-fase-de-concepção","page":"Reator pistão","title":"Em fase de concepção","text":"","category":"section"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"Reatores em contra corrente: o precedente para um par de reatores em contra-corrente.\nTrocas em fluidos supercríticos: suporte à fluidos supercríticos (água, dióxido de carbono).","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/#Planejados","page":"Reator pistão","title":"Planejados","text":"","category":"section"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"O precedente generalizado para um sólido e um gás (compressível).\nO precedente com coeficiente HTC dependente da posição.\nO precedente com trocas térmicas com o ambiente externo.\nO precedente com inclusão de perda de carga na fase gás.\nO precedente com um modelo de trocas térmicas com meio poroso.\nO precedente com um modelo de efeitos difusivos axiais no sólido.\nO precedente com inclusão da entalpia de fusão no sólido.\nO precedente com inclusão de cinética química no gás.","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/#Introdução","page":"Reator pistão","title":"Introdução","text":"","category":"section"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"Este é o primeiro notebook de uma série abordando reatores do tipo pistão (plug-flow) no qual os efeitos advectivos são preponderantes sobre o comportamento difusivo, seja de calor, massa, ou espécies. O estudo e modelagem desse tipo de reator apresentar diversos interesses para a pesquisa fundamental e na indústria. Muitos reatores tubulares de síntese laboratorial de materiais apresentam aproximadamente um comportamento como tal e processos nas mais diversas indústrias podem ser aproximados por um ou uma rede de reatores pistão e reatores agitados interconectados.","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"Começaremos por um caso simples considerando um fluido incompressível e ao longo da série aumentaremos progressivamente a complexidade dos modelos. Os notebooks nessa série vão utilizar uma estratégia focada nos resultados, o que indica que o código será na maior parte do tempo ocultado e o estudante interessado deverá executar o notebook por si mesmo para estudar as implementações.","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"Nesta Parte 1 vamos estuda a formulação na temperatura da equação de conservação de energia.","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"using WallyToolbox\n\nusing CairoMakie\nusing DelimitedFiles\nusing DifferentialEquations: solve\nusing DocStringExtensions\nusing Interpolations\nusing ModelingToolkit\nusing Polynomials\nusing Printf\nusing Roots\nusing SparseArrays\nusing SparseArrays: spdiagm\nusing SteamTables\nnothing; #hide","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"No que se segue vamos implementar a forma mais simples de um reator pistão. Para este primeiro estudo o foco será dado apenas na solução da equação da energia. As etapas globais implementadas aqui seguem o livro de Kee et al. (2017), seção 9.2.","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"Da forma simplificada como tratado, o problema oferece uma solução analítica análoga à lei do resfriamento de Newton, o que é útil para a verificação do problema. Antes de partir a derivação do modelo, os cálculos do número de Nusselt para avaliação do coeficiente de transferência de calor são providos no que se segue com expressões de Gnielinski e Dittus-Boelter discutidas aqui. As implementatações se encontram no módulo WallyToolbox.","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"Para cobrir toda uma gama de números de Reynolds, a função htc avalia Nu com seletor segundo valor de Re para o cálculo do número de Nusselt e uma funcionalidade para reportar os resultados, o que pode ser útil na pré-análise do problema.","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"let\n L = 100.0\n D = 1.0\n u = 1.0\n ρ = 1000.0\n μ = 0.01\n cₚ = 4200.0\n θ = 298.15\n kw = (verbose = true,)\n \n pr = ConstantPrandtl(0.7)\n re = ReynoldsPipeFlow()\n nu = NusseltGnielinski()\n \n hf = HtcPipeFlow(re, nu, pr)\n htc(hf, θ, u, D, ρ, μ, cₚ; kw...)\n hf\nend","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/#Condições-compartilhadas","page":"Reator pistão","title":"Condições compartilhadas","text":"","category":"section"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"# Comprimento do reator [m]\nL = 10.0\n\n# Diâmetro do reator [m]\nD = 0.01\n\n# Mass específica do fluido [kg/m³]\nρ = 1000.0\n\n# Viscosidade do fluido [Pa.s]\nμ = 0.001\n\n# Calor específico do fluido [J/(kg.K)]\ncₚ = 4182.0\n\n# Número de Prandtl do fluido\nPr = 6.9\n\n# Velocidade do fluido [m/s]\nu = 1.0\n\n# Temperatura de entrada do fluido [K]\nTₚ = 300.0\n\n# Temperatura da parede do reator [K]\nTₛ = 400.0\n\n# Perímetro da seção circular do reator [m]\nP = π * D\n\n# Área da seção circula do reator [m²]\nA = π * (D / 2)^2\n\n# Cria objeto para avaliação do coeficiente de troca convectiva.\nhf = HtcPipeFlow(ReynoldsPipeFlow(), NusseltGnielinski(), ConstantPrandtl(Pr))\n\n# Coeficiente convectivo de troca de calor [W/(m².K)]\nĥ = htc(hf, Tₛ, u, D, ρ, μ, cₚ; verbose = true)\n\n# Coordenadas espaciais da solução [m]\nz = LinRange(0, L, 10_000)\nnothing; #hide","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/#Solução-analítica-da-EDO","page":"Reator pistão","title":"Solução analítica da EDO","text":"","category":"section"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"O modelo tratado no que se segue é proposto em detalhes aqui.","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"Sua solução analítica é implementada abaixo em analyticalthermalpfr:","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"\"Solução analítica do modelo de reator pistão.\"\nfunction analyticalthermalpfr(; P, A, Tₛ, Tₚ, ĥ, u, ρ, cₚ, z)\n return @. Tₛ - (Tₛ - Tₚ) * exp(-z * (ĥ * P) / (ρ * u * cₚ * A))\nend\nnothing; #hide","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"O bloco abaixo resolve o problema para um conjunto de condições que você pode consultar nos anexos e expandindo o seu código. Observe abaixo da célula um log do cálculo dos números adimensionais relevantes ao problema e do coeficiente de transferência de calor convectivo associado. Esses elementos são tratados por funções externas que se encontram em um arquivo de suporte a esta série e são tidos como conhecimentos a priori para as discussões.","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"with_theme() do\n Tₐ = analyticalthermalpfr(; P, A, Tₛ, Tₚ, ĥ, u, ρ, cₚ, z)\n Tend = @sprintf(\"%.2f\", Tₐ[end])\n yrng = (300, 400)\n \n fig = Figure(size = (720, 500))\n ax = Axis(fig[1, 1])\n lines!(ax, z, Tₐ, color = :red, linewidth = 5, label = \"Analítica\")\n xlims!(ax, (0, L))\n ax.title = \"Temperatura final = $(Tend) K\"\n ax.xlabel = \"Posição [m]\"\n ax.ylabel = \"Temperatura [K]\"\n ax.xticks = range(0.0, L, 6)\n ax.yticks = range(yrng..., 6)\n ylims!(ax, yrng)\n axislegend(position = :rb)\n fig\nend","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/#Integração-numérica-da-EDO","page":"Reator pistão","title":"Integração numérica da EDO","text":"","category":"section"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"Neste exemplo tivemos sorte de dispor de uma solução analítica. Esse problema pode facilmente tornar-se intratável se considerarmos uma dependência arbitrária do calor específico com a temperatura ou se a parede do reator tem uma dependência na coordenada axial. É importante dispor de meios numéricos para o tratamento deste tipo de problema.","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"No caso de uma equação diferencial ordinária (EDO) como no presente caso, a abordagem mais simples é a de se empregar um integrador numérico. Para tanto é prática comum estabelecer uma função que representa o lado direito do problema isolando a(s) derivada(s) no lado esquerdo. Em Julia dispomos do framework de ModelingToolkit que provê uma forma simbólica de representação de problemas e interfaces com diversos integradores. A estrutura DifferentialEquationPFR abaixo implementa o problema diferencial desta forma.","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"pfr = let\n @variables z\n D = Differential(z)\n\n @mtkmodel PFR begin\n @parameters begin\n P\n A\n Tₛ\n ĥ\n u\n ρ\n cₚ\n end\n\n @variables begin\n T(z)\n end\n\n @equations begin\n D(T) ~ ĥ * P * (Tₛ - T) / (ρ * u * A * cₚ)\n end\n end\n\n @mtkbuild pfr = PFR()\nend;","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"Uma funcionalidade bastante interessante de ModelingToolkit é sua capacidade de representar diretamente em com LaTeX as equações implementadas. Antes de proceder a solução verificamos na célula abaixo que a equação estabelecida no modelo está de acordo com a formulação que derivamos para o problema diferencial. Verifica-se que a ordem dos parâmetros pode não ser a mesma, mas o modelo é equivalente.","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"pfr","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"Para integração do modelo simbólico necessitamos substituir os parâmetros por valores numéricos e fornecer a condição inicial e intervalo de integração ao integrador que vai gerir o problema. A interface solveodepfr realiza essas etapas. É importante mencionar aqui que a maioria dos integradores numéricos vai amostrar pontos na coordenada de integração segundo a rigidez numérica do problema, de maneira que a solução retornada normalmente não está sobre pontos equi-espaçados. Podemos fornecer um parâmetro opcional para recuperar a solução sobre os pontos desejados, o que pode facilitar, por exemplo, comparação com dados experimentais.","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"\"Integra o modelo diferencial de reator pistão\"\nfunction solvemtkpfr(; pfr, P, A, Tₛ, Tₚ, ĥ, u, ρ, cₚ, z)\n T₀ = [pfr.T => Tₚ]\n\n p = [\n pfr.P => P,\n pfr.A => A,\n pfr.Tₛ => Tₛ,\n pfr.ĥ => ĥ,\n pfr.u => u,\n pfr.ρ => ρ,\n pfr.cₚ => cₚ,\n ]\n\n zspan = (0, z[end])\n prob = ODEProblem(pfr, T₀, zspan, p)\n\n return solve(prob; saveat = z)\nend\nnothing; #hide","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"Com isso podemos proceder à integração com ajuda de solveodepfr concebida acima e aproveitamos para traçar o resultado em conjunto com a solução analítica.","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"with_theme() do\n Tₐ = analyticalthermalpfr(; P, A, Tₛ, Tₚ, ĥ, u, ρ, cₚ, z)\n Tₒ = solvemtkpfr(; pfr, P, A, Tₛ, Tₚ, ĥ, u, ρ, cₚ, z)[:T]\n \n Tend = @sprintf(\"%.2f\", Tₐ[end])\n yrng = (300, 400)\n \n fig = Figure(size = (720, 500))\n ax = Axis(fig[1, 1])\n lines!(ax, z, Tₐ, color = :red, linewidth = 5, label = \"Analítica\")\n lines!(ax, z, Tₒ, color = :black, linewidth = 2, label = \"ModelingToolkit\")\n xlims!(ax, (0, L))\n ax.title = \"Temperatura final = $(Tend) K\"\n ax.xlabel = \"Posição [m]\"\n ax.ylabel = \"Temperatura [K]\"\n ax.xticks = range(0.0, L, 6)\n ax.yticks = range(yrng..., 6)\n ylims!(ax, yrng)\n axislegend(position = :rb)\n fig\nend","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/#Método-dos-volumes-finitos","page":"Reator pistão","title":"Método dos volumes finitos","text":"","category":"section"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"A construção e solução deste problema é provida em solvefvmpfr abaixo.","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"\"Integra o modelo diferencial de reator pistão\"\nfunction solvefvmpfr(; P, A, Tₛ, Tₚ, ĥ, u, ρ, cₚ, z)\n N = length(z) - 1\n\n # Vamos tratar somente o caso equi-espaçado aqui!\n δ = z[2] - z[1]\n\n a = (ρ * u * cₚ * A) / (ĥ * P * δ)\n\n A⁺ = (2a + 1) / (2Tₛ)\n A⁻ = (2a - 1) / (2Tₛ)\n\n b = ones(N)\n b[1] = 1 + A⁻[1] * Tₚ\n\n M = spdiagm(-1 => -A⁻ * ones(N - 1), 0 => +A⁺ * ones(N))\n U = similar(z)\n\n U[1] = Tₚ\n U[2:end] = M \\ b\n\n return U\nend\nnothing; #hide","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"Abaixo adicionamos a solução do problema sobre malhas grosseiras sobre as soluções desenvolvidas anteriormente. A ideia de se representar sobre malhas grosseiras é simplesmente ilustrar o caráter discreto da solução, que é representada como constante no interior de uma célula. Adicionalmente representamos no gráfico um resultado interpolado de uma simulação CFD 3-D de um reator tubular em condições supostamente identicas as representadas aqui, o que mostra o bom acordo de simulações 1-D no limite de validade do modelo.","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"with_theme() do\n data = readdlm(\"data/fluent-reference/postprocess.dat\", Float64)\n x, Tᵣ = data[:, 1], data[:, 2]\n \n Tₐ = analyticalthermalpfr(; P, A, Tₛ, Tₚ, ĥ, u, ρ, cₚ, z)\n Tₒ = solvemtkpfr(; P, A, Tₛ, Tₚ, ĥ, u, ρ, cₚ, z, pfr)[:T]\n Tₑ = solvefvmpfr(; P, A, Tₛ, Tₚ, ĥ, u, ρ, cₚ, z)\n \n Tend = @sprintf(\"%.2f\", Tₐ[end])\n yrng = (300, 400)\n \n fig = Figure(size = (720, 500))\n ax = Axis(fig[1, 1])\n lines!(ax, z, Tₐ, color = :red, linewidth = 5, label = \"Analítica\")\n lines!(ax, z, Tₒ, color = :black, linewidth = 2, label = \"ModelingToolkit\")\n lines!(ax, z, Tₑ, color = :blue, linewidth = 2, label = \"Finite Volumes\")\n lines!(ax, x, Tᵣ, color = :green, linewidth = 2, label = \"CFD 3D\")\n xlims!(ax, (0, L))\n ax.title = \"Temperatura final = $(Tend) K\"\n ax.xlabel = \"Posição [m]\"\n ax.ylabel = \"Temperatura [K]\"\n ax.xticks = range(0.0, L, 6)\n ax.yticks = range(yrng..., 6)\n ylims!(ax, yrng)\n axislegend(position = :rb)\n fig\nend","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"Podemos também réalizar um estudo de sensibilidade a malha:","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"with_theme() do\n Tₐ = analyticalthermalpfr(; P, A, Tₛ, Tₚ, ĥ, u, ρ, cₚ, z)\n\n Tend = @sprintf(\"%.2f\", Tₐ[end])\n yrng = (300, 400)\n \n fig = Figure(size = (720, 500))\n ax = Axis(fig[1, 1])\n lines!(ax, z, Tₐ, color = :red, linewidth = 5, label = \"Analítica\")\n\n for (c, N) in [(:blue, 20), (:green, 50)]\n z = LinRange(0.0, L, N)\n Tₑ = solvefvmpfr(; P, A, Tₛ, Tₚ, ĥ, u, ρ, cₚ, z)\n stairs!(ax, z, Tₑ, color = c, label = \"N = $(N)\", step = :center)\n end\n\n xlims!(ax, (0, L))\n ax.title = \"Temperatura final = $(Tend) K\"\n ax.xlabel = \"Posição [m]\"\n ax.ylabel = \"Temperatura [K]\"\n ax.xticks = range(0.0, L, 6)\n ax.yticks = range(yrng..., 6)\n ylims!(ax, yrng)\n axislegend(position = :rb)\n fig\nend","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"Com isso encerramos essa primeira introdução a modelagem de reatores do tipo pistão. Estamos ainda longe de um modelo generalizado para estudo de casos de produção, mas os principais blocos de construção foram apresentados. Os pontos principais a reter deste estudo são:","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"A equação de conservação de massa é o ponto chave para a expansão e simplificação das demais equações de conservação. Note que isso é uma consequência de qua a massa corresponde à aplicação do Teorema de Transporte de Reynolds sobre a unidade 1.\nSempre que a implementação permita, é mais fácil de se tratar o problema como uma EDO e pacotes como ModelingToolkit proveem o ferramental básico para a construção deste tipo de modelos facilmente.\nUma implementação em volumes finitos será desejável quando um acoplamento com outros modelos seja envisajada. Neste caso a gestão da solução com uma EDO a parâmetros variáveis pode se tornar computacionalmente proibitiva, seja em complexidade de código ou tempo de cálculo.","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/#Formulação-na-entalpia","page":"Reator pistão","title":"Formulação na entalpia","text":"","category":"section"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"#plug-flow","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"Neste notebook damos continuidade ao precedente através da extensão do modelo para a resolução da conservação de energia empregando a entalpia do fluido como variável independente. O caso tratado será o mesmo estudado anteriormente para que possamos ter uma base de comparação da solução. Realizada a primeira introdução, os notebooks da série se tornam mais concisos e focados cada vez mais em código ao invés de derivações, exceto quando implementando novas físicas.","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/#Condições-compartilhadas-2","page":"Reator pistão","title":"Condições compartilhadas","text":"","category":"section"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"Salvo pela discretização espacial mais grosseira e a função entalpia compatível com o calor específico do fluido provida, continuaremos com os parâmetros empregados no estudo precedente. Para que os resultados sejam comparáveis, definimos ","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"h(T)=c_pT+ h_ref","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"O valor de h_ref é arbitrário e não afeta a solução.","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"# Coordenadas espaciais da solução [m]\nz = LinRange(0, L, 500)\n\n# Entalpia com constante arbitrária [J/kg]\nh(T) = cₚ * T + 1000.0\nnothing; #hide","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/#Modelo-na-entalpia","page":"Reator pistão","title":"Modelo na entalpia","text":"","category":"section"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"A solução integrando esses passos foi implementada em solventhalpypfr. Para simplificar a leitura do código o problema é implementado em diversos blocos de funções para montagem da função gerindo a solução do modelo.","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"\"Calcula matriz advectiva do lado esquedo da equação.\"\nfunction fvmlhs(N)\n return 2spdiagm(-1 => -ones(N - 1), 0 => ones(N))\nend\n\n\"Calcula parte constante do vetor do lado direito da equação.\"\nfunction fvmrhs(N; bₐ, b₁)\n b = bₐ * ones(N)\n b[1] += b₁\n return b\nend\n\n\"Relaxa solução em termos da entalpia.\"\nfunction relaxenthalpy(h̄, hₘ, Tₘ, α)\n Δ = (1 - α) * (h̄ - hₘ[2:end])\n m = maximum(hₘ)\n\n hₘ[2:end] += Δ\n\n # Solução das temperaturas compatíveis com hm.\n Tₘ[2:end] = map((Tₖ, hₖ) -> find_zero(t -> h(t) - hₖ, Tₖ), Tₘ[2:end], hₘ[2:end])\n\n return Tₘ, Δ, m\nend\n\n\"Relaxa solução em termos da temperatura.\"\nfunction relaxtemperature(h̄, hₘ, Tₘ, α)\n # Solução das temperaturas compatíveis com h̄.\n Uₘ = map((Tₖ, hₖ) -> find_zero(t -> h(t) - hₖ, Tₖ), Tₘ[2:end], h̄)\n\n Δ = (1 - α) * (Uₘ - Tₘ[2:end])\n m = maximum(Tₘ)\n\n Tₘ[2:end] += Δ\n\n return Tₘ, Δ, m\nend\n\n\"Realiza uma iteração usando a relaxação especificada.\"\nfunction steprelax(h̄, hₘ, Tₘ, α, how)\n return (how == :h) ? relaxenthalpy(h̄, hₘ, Tₘ, α) : relaxtemperature(h̄, hₘ, Tₘ, α)\nend\nnothing; #hide","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"\"Integra o modelo diferencial de reator pistão\"\nfunction solvefvmpfr(; P, A, Tₛ, Tₚ, ĥ, u, ρ, h, z, kw...)\n N = length(z) - 1\n\n # Parâmetros para o solver.\n M = get(kw, :M, 100)\n α = get(kw, :α, 0.4)\n ε = get(kw, :ε, 1.0e-12)\n relax = get(kw, :relax, :h)\n verbose = get(kw, :verbose, true)\n\n # Vamos tratar somente o caso equi-espaçado aqui!\n δ = z[2] - z[1]\n\n a = (ĥ * P * δ) / (ρ * u * A)\n\n Tₘ = Tₚ * ones(N + 1)\n hₘ = h.(Tₘ)\n\n K = fvmlhs(N)\n b = fvmrhs(N; bₐ = 2a * Tₛ, b₁ = 2h(Tₚ))\n\n # Aloca e inicia em negativo o vetor de residuos. Isso\n # é interessante para o gráfico aonde podemos eliminar\n # os elementos negativos que não tem sentido físico.\n residual = -ones(M)\n\n verbose && @info \"Usando relaxação do tipo $(relax)\"\n\n loop() = begin\n for niter = 1:M\n # Calcula o vetor `b` do lado direito e resolve o sistema.\n h̄ = K \\ (b - a * (Tₘ[1:end-1] + Tₘ[2:end]))\n \n # Relaxa solução para gerir não linearidades.\n Tₘ, Δ, m = steprelax(h̄, hₘ, Tₘ, α, relax)\n \n # Verifica status da convergência.\n residual[niter] = maximum(abs.(Δ / m))\n \n if (residual[niter] <= ε)\n verbose && @info(\"Convergiu após $(niter) iterações\")\n break\n end\n end\n end\n\n \n get(kw, :timeit, false) ? (@time loop()) : loop()\n\n return Tₘ, residual\nend\nnothing; #hide","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"Usamos agora essa função para uma última simulação do problema. Verificamos abaixo que a solução levou um certo número de iterações para convergir. Para concluir vamos averiguar a qualidade da convergência ao longo das iterações na parte inferior do gráfico.","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"Introduzimos também a possibilidade de se utilizar a relaxação diretamente na entalpia, resolvendo o problema não linear apenas para encontrar diretamente a nova estimação do campo de temperaturas. A figura que segue ilustas o comportamento de convergência. Neste caso específico (e usando a métrica de convergência em questão) a relaxação em entalpia não apresenta vantagens, mas veremos em outras ocasiões que esta é a maneira mais simples de se fazer convergir uma simulação.","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"with_theme() do\n α = 0.4\n ε = 1.0e-12\n\n # Referência\n Tₐ = analyticalthermalpfr(; P, A, Tₛ, Tₚ, ĥ, u, ρ, cₚ, z)\n\n # Uma chamada para pre-compilação...\n verbose = false\n solvefvmpfr(; P, A, Tₛ, Tₚ, ĥ, u, ρ, h, z, α, ε, relax = :T, verbose)\n solvefvmpfr(; P, A, Tₛ, Tₚ, ĥ, u, ρ, h, z, α, ε, relax = :h, verbose)\n \n # Chamadas para avaliação de performance...\n timeit = true\n Tₕ, εₕ = solvefvmpfr(; P, A, Tₛ, Tₚ, ĥ, u, ρ, h, z, α, ε, relax = :h, timeit)\n Tₜ, εₜ = solvefvmpfr(; P, A, Tₛ, Tₚ, ĥ, u, ρ, h, z, α, ε, relax = :T, timeit)\n \n Tend = @sprintf(\"%.2f\", Tₐ[end])\n yrng = (300, 400)\n \n fig = Figure(size = (720, 600))\n\n ax = Axis(fig[1, 1])\n lines!(ax, z, Tₐ, color = :red, linewidth = 5, label = \"Analítica\")\n lines!(ax, z, Tₕ, color = :blue, linewidth = 2, label = \"FVM (H)\")\n lines!(ax, z, Tₜ, color = :cyan, linewidth = 2, label = \"FVM (T)\")\n xlims!(ax, (0, L))\n ax.title = \"Temperatura final = $(Tend) K\"\n ax.xlabel = \"Posição [m]\"\n ax.ylabel = \"Temperatura [K]\"\n ax.xticks = range(0.0, L, 6)\n ax.yticks = range(yrng..., 6)\n ylims!(ax, yrng)\n axislegend(position = :rb)\n\n ax = Axis(fig[2, 1], height = 120)\n lines!(ax, log10.(εₕ[εₕ.>0]), color = :blue, label = \"FVM (H)\")\n lines!(ax, log10.(εₜ[εₜ.>0]), color = :cyan, label = \"FVM (T)\")\n ax.xlabel = \"Iteração\"\n ax.ylabel = \"log10(ε)\"\n ax.xticks = vcat(1, collect(5:5:30))\n ax.yticks = -12:3:0\n xlims!(ax, 1, 30)\n axislegend(position = :rt)\n\n fig\nend","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/#Reatores-em-contra-corrente","page":"Reator pistão","title":"Reatores em contra corrente","text":"","category":"section"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"As ideias gerais para a simulação de um reator formulado na entalpia tendo sido introduzidas na Parte 2, vamos agora aplicar o mesmo algoritmo de solução para um problema menos trivial: integração de reatores em contra-corrente com trocas térmicas. Esse é o caso, por exemplo, em uma serpentina dupla em contato mecânico. Esse sistema pode ser aproximado por um par de reatores pistão em contra-corrente se tomada propriamente em conta a resistência térmica dos dutos.","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"Outro caso clássico que pode ser as vezes tratado desta forma é o modelo de forno rotativo para produção de cimento, como discutido por Hanein et al. (2017). Outro exemplo é fornecido por Bulfin (2019) para a síntese de ceria. Kerkhof (2007) apresenta uma abordagem mais geral introduzindo troca de massa entre partículas.","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"Ainda precisamos tratar de tópicos mais básicos antes de implementar modelos similares ao longo dessa série, mas espero que a literatura citada sirva como motivação para o estudo.","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"Neste notebook trataremos dois casos:","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"Um par de fluidos que diferem unicamente por seu calor específicos.\nUm fluido condensado e um gás com propriedades dependentes da temperatura.","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/#Concepção-do-programa","page":"Reator pistão","title":"Concepção do programa","text":"","category":"section"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"Não há nada de diferente em termos do modelo de cada reator em relação ao tópico anterior abordando um reator pistão em termos da entalpia. O objetivo principal do programa a conceber neste notebook é usar os conhecimentos adquiridos na etapa anterior para implementar uma solução para um par de reatores que trocam energia entre si. Para simplificar a implementação vamos considerar que as paredes externas dos reatores são adiabáticas e que estes trocam calor somente entre eles mesmos. Algumas ideias chave são necessárias para uma implementação efetiva:","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"É importante lembrar que as coordenadas dos reatores são invertidas entre elas. Se o reator r₁ está orientado no sentido do eixo z, então para um par de reatores de comprimento L as coordenadas das células homólogas em r₂ são L-z.\nFalando em células homólogas, embora seja possível implementar reatores conectados por uma parede com discretizações distintas, é muito mais fácil de se conceber um programa com reatores que usam a mesma malha espacial. Ademais, isso evita possíveis erros numéricos advindos da escolha de um método de interpolação.\nEmbora uma solução acoplada seja possível, normalmente isso torna o programa mais complexo para se extender a um número arbitrário de reatores e pode conduzir a matrizes com condição pobre. Uma ideia para resolver o problema é realizar uma iteração em cada reator com o outro mantido constante (como no problema precedente) mas desta vez considerando que a condição limite da troca térmica possui uma dependência espacial.","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"Os blocos que se seguem implementam as estruturas necessárias com elementos reutilizáveis de maneira que ambos os reatores possam ser conectados facilmente.","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"Como desejamos simular simultâneamente dois reatores, é interessante encapsular a construção dos elementos descrevendo um reator em uma estrutura. Desta forma evitamos código duplicado.","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"\"Tipo para qualquer reator pistão.\"\nabstract type AbstractPlugFlowReactor end","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"\"\"\"\nDescrição de um reator pistão formulado na entalpia.\n\n```math\n\\\\frac{dh}{dz}=a(T_{s}(z)-T^{\\\\star})\n\\\\qquad\\\\text{aonde}\\\\qquad\na=\\\\frac{\\\\hat{h}P}{\\\\rho{}u{}A_{c}}\n```\n\nO modelo é representado em volumes finitos como ``Kh=b`` tal\ncomo discutido no notebook anterior. Os parâmetros da estrutura\nlistado abaixo visam manter uma representação tão próxima quanto\npossível da expressão matemática do modelo.\n\"\"\"\nstruct ConstDensityEnthalpyPFRModel <: AbstractPlugFlowReactor\n \"Tamanho do problema linear.\"\n N::Int64\n\n\t\"Matriz do problema.\"\n\tK::SparseMatrixCSC{Float64, Int64}\n\n \"Vetor do problema.\"\n b::Vector{Float64}\n\n \"Solução do problema.\"\n x::Vector{Float64}\n\n\t\"Coeficiente do modelo.\"\n\ta::Float64\n\t\n\t\"Coordenadas espaciais das células do reator.\"\n\tz::Vector{Float64}\n\n \"Coeficiente de troca térmica convectiva [W/(m².K)].\"\n ĥ::Float64\n\n \"Fluxo mássico através do reator [kg/s].\"\n ṁ::Float64\n\n \"Entalpia em função da temperatura [J/kg].\"\n h::Function\n\t\n\t\"\"\" Construtor do modelo de reator pistão.\n\n\t`N::Int64`\n\t\tNúmero de células no sistema sem a condição inicial.\n\t`L::Float64`\n\t\tComprimento total do reator [m].\n\t`P::Float64`\n\t\tPerímetro da de troca de calor do reator [m].\n\t`A::Float64`\n\t\tÁrea da seção transversal do reator [m²].\n\t`T::Float64`\n\t\tTemperatura inicial do fluido [K].\n\t`ĥ::Float64`\n\t\tCoeficiente de troca convectiva [W/(m².K)].\n\t`u::Float64`\n\t\tVelocidade do fluido [m/s].\n\t`ρ::Float64`\n\t\tDensidade do fluido [kg/m³].\n\t`h::Function`\n\t\tEntalpia em função da temperatura [J/kg].\n\t\"\"\"\n\tfunction ConstDensityEnthalpyPFRModel(;\n\t\t\tN::Int64,\n\t\t\tL::Float64,\n\t\t\tP::Float64,\n\t\t\tA::Float64,\n\t\t\tT::Float64,\n\t\t\tĥ::Float64,\n\t\t\tu::Float64,\n\t\t\tρ::Float64,\n\t\t\th::Function\n\t\t)\n\t\t# Aloca memória para o problema linear.\n K = 2spdiagm(0 => ones(N), -1 => -ones(N-1))\n b = ones(N+0)\n x = ones(N+1)\n\n\t\t# Discretização do espaço, N+1 para condição inicial.\n\t\tz = LinRange(0, L, N+1)\n\t\tδ = z[2] - z[1]\n\n\t\t# Coeficiente do problema.\n\t\tṁ = ρ * u * A\n\t\ta = (ĥ * P * δ) / ṁ\n\t\t\n\t\t# Inicializa solução constante.\n\t\tx[1:end] .= T\n\n\t\treturn new(N, K, b, x, a, z, ĥ, ṁ, h)\n\tend\nend","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"As próximas células implementam um mapa entre as condições vistas por ambos os reatores.","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"\"Representa um par de reatores em contrafluxo.\"\nstruct CounterFlowPFRModel\n this::AbstractPlugFlowReactor\n that::AbstractPlugFlowReactor\nend\n\n\"Acesso ao perfil de temperatura do primeiro reator em um par.\"\nthistemperature(cf::CounterFlowPFRModel) = cf.this.x\n\n\"Acesso ao perfil de temperatura do segundo reator em um par.\"\nthattemperature(cf::CounterFlowPFRModel) = cf.that.x |> reverse\n\nnothing; #hide","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"No que se segue não se fará hipótese de que ambos os escoamentos se dão com o mesmo fluido ou que no caso de mesmo fluido as velocidades são comparáveis. Neste caso mais geral, o número de Nusselt de cada lado da interface difere e portanto o coeficiente de troca térmica convectiva. É portanto necessário estabelecer-se uma condição de fluxo constante na interface das malhas para assegurar a conservação global da energia no sistema... TODO (escrever, já programado)","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"\"Perfil de temperatura na parede entre dois fluidos respeitando fluxo.\"\nfunction surfacetemperature(cf::CounterFlowPFRModel)\n T1 = thistemperature(cf)\n T2 = thattemperature(cf)\n\n ĥ1 = cf.this.ĥ\n ĥ2 = cf.that.ĥ\n\n Tw1 = 0.5 * (T1[1:end-1] + T1[2:end])\n Tw2 = 0.5 * (T2[1:end-1] + T2[2:end])\n\n return (ĥ1 * Tw1 + ĥ2 * Tw2) / (ĥ1 + ĥ2)\nend\n\n\"Conservação de entalpia entre dois reatores em contra-corrente.\"\nfunction enthalpyresidual(cf::CounterFlowPFRModel)\n enthalpyrate(r) = r.ṁ * (r.h(r.x[end]) - r.h(r.x[1]))\n\n Δha = enthalpyrate(cf.this)\n Δhb = enthalpyrate(cf.that)\n\t\n return abs(Δhb + Δha) / abs(Δha)\nend\n\n\"Método de relaxação baseado na entalpia.\"\nfunction relaxenthalpy!(Tm, hm, h̄, α, f)\n # Calcula erro e atualização antes!\n Δ = (1-α) * (h̄ - hm[2:end])\n ε = maximum(abs.(Δ)) / abs(maximum(hm))\n\n # Autaliza solução antes de resolver NLP.\n hm[2:end] += Δ\n\n # Solução das temperaturas compatíveis com hm.\n Tm[2:end] = map(f, Tm[2:end], hm[2:end])\n\n return ε\nend\n\n\"Método de relaxação baseado na temperatura.\"\nfunction relaxtemperature!(Tm, hm, h̄, α, f)\n # XXX: manter hm na interface para compabilidade com relaxenthalpy!\n # Solução das temperaturas compatíveis com h̄.\n Um = map(f, Tm[2:end], h̄)\n\n # Calcula erro e atualização depois!\n Δ = (1-α) * (Um - Tm[2:end])\n ε = maximum(abs.(Δ)) / abs(maximum(Tm))\n\n # Autaliza solução com resultado do NLP.\n Tm[2:end] += Δ\n\n return ε\nend\nnothing; #hide","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"Finalmente provemos a lógica dos laços interno e externo para a solução do problema não linear.","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"\"Laço interno da solução de reatores em contra-corrente.\"\nfunction innerloop(\n # residual::ResidualsRaw\n\t\t;\n cf::CounterFlowPFRModel,\n inneriter::Int64,\n α::Float64,\n ε::Float64,\n method::Symbol\n )::Int64\n\t\n relax = (method == :h) ? relaxenthalpy! : relaxtemperature!\n\n S = surfacetemperature(cf)\n f = (Tₖ, hₖ) -> find_zero(t -> cf.this.h(t) - hₖ, Tₖ)\n\n K = cf.this.K\n b = cf.this.b\n T = cf.this.x\n a = cf.this.a\n h = cf.this.h\n\n Tm = T\n hm = h.(Tm)\n\n b[1:end] = 2a * S\n b[1] += 2h(Tm[1])\n\n\tεm = 1.0e+300\n\t\n for niter in 1:inneriter\n h̄ = K \\ (b - a * (Tm[1:end-1] + Tm[2:end]))\n εm = relax(Tm, hm, h̄, α, f)\n # feedinnerresidual(residual, εm)\n\n if (εm <= ε)\n return niter\n end\n end\n\n @warn \"Não convergiu após $(inneriter) passos $(εm)\"\n return inneriter\nend\nnothing; #hide","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"\"Laço externo da solução de reatores em contra-corrente.\"\nfunction outerloop(\n cf::CounterFlowPFRModel;\n inneriter::Int64 = 50,\n outeriter::Int64 = 500,\n Δhmax::Float64 = 1.0e-10,\n α::Float64 = 0.6,\n ε::Float64 = 1.0e-10,\n\t\tmethod::Symbol = :h\n )#::Tuple{ResidualsProcessed, ResidualsProcessed}\n ra = cf\n rb = CounterFlowPFRModel(cf.that, cf.this)\n\n # resa = ResidualsRaw(inner, outer)\n # resb = ResidualsRaw(inner, outer)\n\n @time for nouter in 1:outeriter\n # ca = innerloop(resa; cf = ra, shared...)\n # cb = innerloop(resb; cf = rb, shared...)\n ca = innerloop(; cf = ra, inneriter, α, ε, method)\n cb = innerloop(; cf = rb, inneriter, α, ε, method)\n\n # resa.innersteps[nouter] = ca\n # resb.innersteps[nouter] = cb\n\n if enthalpyresidual(cf) < Δhmax\n @info(\"Laço externo convergiu após $(nouter) iterações\")\n break\n end\n end\n\n\thres = @sprintf(\"%.1e\", enthalpyresidual(cf))\n @info(\"Conservação da entalpia = $(hres)\")\n # return ResidualsProcessed(resa), ResidualsProcessed(resb)\nend\nnothing; #hide","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"\"Ilustração padronizada para a simulação exemplo.\"\nfunction plotpfrpair(cf::CounterFlowPFRModel; ylims, loc, func = lines!)\n z1 = cf.this.z\n T1 = thistemperature(cf)\n T2 = thattemperature(cf)\n\n fig = Figure(size = (720, 500))\n ax = Axis(fig[1, 1])\n\t\n func(ax, z1, T1, label = \"r₁ →\", color = :blue)#, step = :center)\n func(ax, z1, T2, label = \"r₂ ←\", color = :red)#, step = :center)\n\n ax.xticks = range(0.0, z1[end], 6)\n ax.yticks = range(ylims..., 6)\n ax.xlabel = \"Posição [m]\"\n ax.ylabel = \"Temperatura [K]\"\n xlims!(ax, (0, z1[end]))\n ylims!(ax, ylims)\n axislegend(position = loc)\n\n return fig\nend\nnothing; #hide","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/#Estudo-de-caso-I","page":"Reator pistão","title":"Estudo de caso I","text":"","category":"section"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"O par escolhido para exemplificar o comportamento de contra-corrente dos reatores pistão tem por característica de que cada reator ocupa a metade de um cilindro de diâmetro D m de forma que o perímetro de troca é igual o diâmetro e a área transversal a metade daquela do cilindro.","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"A temperatura inicial do fluido no reator (1) que escoa da esquerda para a direita é de (T₁) K e naquele em contra-corrente (2) é de (T₂) K.","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"O fluido do reator (2) tem um calor específico que é o triplo daquele do reator (1).","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"@info \"Condições para o caso I\"\n\n# Número de células no sistema.\nN = 100\n\n# Comprimento do reator [m]\nL = 10.0\n\n# Diâmetro do reator [m]\nD = 0.01\n\n# Mass específica dos fluidos [kg/m³]\nρ = 1000.0\n\n# Viscosidade dos fluidos [Pa.s]\nμ = 0.001\n\n# Número de Prandtl dos fluidos\nPr = 6.9\n\n# Calor específico do fluido [J/(kg.K)]\ncₚ₁ = 1000.0\ncₚ₂ = 3cₚ₁\n\n# Velocidade do fluido [m/s]\nu₁ = 1.0\nu₂ = 2.0\n\n# Temperatura de entrada do fluido [K]\nT₁ = 300.0\nT₂ = 400.0\n\n# Perímetro troca térmica de cada reator [m]\n# XXX: neste casa igual o diâmetro, ver descrição.\nP = D\n\n# Área da seção circula de cada reator [m²]\nA = (1 // 2) * π * (D / 2)^2\n\n# Diâmetro equivalente a seção para cada reator.\nd = 2√(A/π)\n\n# Cria objeto para avaliação do coeficiente de troca convectiva.\nhf = HtcPipeFlow(ReynoldsPipeFlow(), NusseltGnielinski(), ConstantPrandtl(Pr))\n\n# Coeficiente convectivo de troca de calor [W/(m².K)]\nĥ₁ = htc(hf, T₁, u, D, ρ, μ, cₚ; verbose = true)\nĥ₂ = htc(hf, T₂, u, D, ρ, μ, cₚ; verbose = true)\n\n# Entalpia com constante arbitrária [J/kg]\nh₁(T) = cₚ₁ * T + 1000.0\nh₂(T) = cₚ₂ * T + 1000.0\nnothing; #hide","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"let\n\tcommon = (N = N, L = L, P = P, A = A, ρ = ρ)\n\tparam₁ = (T = T₁, ĥ = ĥ₁, u = u₁, h = h₁)\n\tparam₂ = (T = T₂, ĥ = ĥ₂, u = u₂, h = h₂)\n\t\n\tr₁ = ConstDensityEnthalpyPFRModel(; common..., param₁...)\n\tr₂ = ConstDensityEnthalpyPFRModel(; common..., param₂...)\n\tcf = CounterFlowPFRModel(r₁, r₂)\n\n\touterloop(cf)\n\n\tplotpfrpair(cf; ylims = (300, 400), loc = :rb)\nend","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/#Estudo-de-caso-II-(draft)","page":"Reator pistão","title":"Estudo de caso II (draft)","text":"","category":"section"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"# # Condições operatórias do gás.\n# p₃ = 101325.0\n# h₃ = integrate(fluid3.cₚpoly)\n# M̄₃ = 0.02897530345830224\n\n# fluid₃ = (\n# ρ = (p₃ * M̄₃) / (GAS_CONSTANT * operations3.Tₚ),\n# μ = fluid3.μpoly(operations3.Tₚ),\n# cₚ = fluid3.cₚpoly(operations3.Tₚ),\n# Pr = fluid3.Pr\n# )\n\n# # Condições modificadas do fluido condensado.\n# operations₁ = (\n# u = operations3.u * (fluid₃.ρ / fluid1.ρ),\n# Tₚ = operations1.Tₚ\n# )\n\n# shared = (\n# N = N,\n# L = reactor.L,\n# P = reactor.D,\n# A = 0.5π * (reactor.D/2)^2,\n# ρ = fluid1.ρ\n# )\n\n# ĥ₁ = computehtc(; reactor..., fluid1..., u = operations₁.u, verbose = false)\n# ĥ₃ = computehtc(; reactor..., fluid₃..., u = operations3.u, verbose = false)\n\n# r₁ = IncompressibleEnthalpyPFRModel(;\n# shared...,\n# T = operations₁.Tₚ,\n# u = operations₁.u,\n# ĥ = ĥ₁,\n# h = (T) -> 1.0fluid1.cₚ * T + 1000.0\n# )\n\n# r₃ = IncompressibleEnthalpyPFRModel(;\n# shared...,\n# T = operations3.Tₚ,\n# u = operations3.u,\n# ĥ = ĥ₃,\n# h = (T) -> h₃(T),\n# )\n\n# r₁, r₂ = createprfpair2(; N = 1000)\n# cf = CounterFlowPFRModel(r₁, r₂)\n\n# resa, resb = outerloop(cf;\n# inner = 100,\n# outer = 200,\n# relax = 0.6,\n# Δhmax = 1.0e-10,\n# rtol = 1.0e-10\n# )\n\n# fig1 = plotpfrpair(cf, ylims = (300, 400))\n# fig2 = plotreactorresiduals(resa, resb)\n\n\n# \"Gera grafico com resíduos da simulação\"\n# function plotreactorresiduals(ra, rb)\n# function getreactordata(r)\n# xg = 1:r.counter\n# xs = r.finalsteps\n# yg = log10.(r.residuals)\n# ys = log10.(r.finalresiduals)\n# return xg, xs, yg, ys\n# end\n\n# function axlimitmax(niter)\n# rounder = 10^floor(log10(niter))\n# return convert(Int64, rounder * ceil(niter/rounder))\n# end\n\n# niter = max(ra.counter, rb.counter)\n# xga, xsa, yga, ysa = getreactordata(ra)\n# xgb, xsb, ygb, ysb = getreactordata(rb)\n\n# fig = Figure(resolution = (720, 500))\n# ax = Axis(fig[1, 1], yscale = identity)\n\n# ax.xlabel = \"Iteração global\"\n# ax.ylabel = \"log10(Resíduo)\"\n# ax.title = \"Histórico de convergência\"\n\n# ax.yticks = -12:2:0\n# xlims!(ax, (0, axlimitmax(niter)))\n# ylims!(ax, (-12, 0))\n\n# lines!(ax, xga, yga, color = :blue, linewidth = 0.9, label = \"r₁\")\n# lines!(ax, xgb, ygb, color = :red, linewidth = 0.9, label = \"r₂\")\n\n# scatter!(ax, xsa, ysa, color = :black, markersize = 6)\n# scatter!(ax, xsb, ysb, color = :black, markersize = 6)\n\n# axislegend(position = :rt)\n# return fig\n# end\n\n\n# \"Dados usados nos notebooks da série.\"\n# const notedata = (\n# c03 = (\n# fluid3 = (\n# # Viscosidade do fluido [Pa.s]\n# μpoly = Polynomial([\n# 1.7e-05 #TODO copy good here!\n# ], :T),\n# # Calor específico do fluido [J/(kg.K)]\n# cₚpoly = Polynomial([\n# 959.8458126240355,\n# 0.3029051601580761,\n# 3.988896105280984e-05,\n# -6.093647929461819e-08,\n# 1.0991100692950414e-11\n# ], :T),\n# # Número de Prandtl do fluido\n# Pr = 0.70\n# ),\n# operations3 = (\n# u = 2.5, # Velocidade do fluido [m/s]\n# Tₚ = 380.0, # Temperatura de entrada do fluido [K]\n# )\n# ),\n# )\n\n# \"Calcula a potência de `x` mais próxima de `v`.\"\n# function closestpowerofx(v::Number; x::Number = 10)::Number\n# rounder = x^floor(log(x, v))\n# return convert(Int64, rounder * ceil(v/rounder))\n# end\n\n# \"Gestor de resíduos durante uma simulação.\"\n# mutable struct ResidualsRaw\n# inner::Int64\n# outer::Int64\n# counter::Int64\n# innersteps::Vector{Int64}\n# residuals::Vector{Float64}\n# function ResidualsRaw(inner::Int64, outer::Int64)\n# innersteps = -ones(Int64, outer)\n# residuals = -ones(Float64, outer * inner)\n# return new(inner, outer, 0, innersteps, residuals)\n# end\n# end\n\n# \"Resíduos de uma simulação processados.\"\n# struct ResidualsProcessed\n# counter::Int64\n# innersteps::Vector{Int64}\n# residuals::Vector{Float64}\n# finalsteps::Vector{Int64}\n# finalresiduals::Vector{Float64}\n\n# function ResidualsProcessed(r::ResidualsRaw)\n# innersteps = r.innersteps[r.innersteps .> 0.0]\n# residuals = r.residuals[r.residuals .> 0.0]\n\n# finalsteps = cumsum(innersteps)\n# finalresiduals = residuals[finalsteps]\n\n# return new(r.counter, innersteps, residuals,\n# finalsteps, finalresiduals)\n# end\n# end\n\n# \"Alimenta resíduos da simulação no laço interno.\"\n# function feedinnerresidual(r::ResidualsRaw, ε::Float64)\n# # TODO: add resizing test here!\n# r.counter += 1\n# r.residuals[r.counter] = ε\n# end","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/#Trocas-em-fluidos-supercríticos","page":"Reator pistão","title":"Trocas em fluidos supercríticos","text":"","category":"section"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/#O-estado-supercrítico","page":"Reator pistão","title":"O estado supercrítico","text":"","category":"section"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"A condição supercrítica não implica uma transição de fase de primeira ordem propriamente dita. Usando o pacote SteamTables implementa propriedades da água em acordo com a IAPWS Industrial Formulation (1997) recuperamos a seguinte curva de massa específica. De maneira análoga verificamos a transição progressiva na entalpia. Como buscamos desenvolver um modelo de reator formulado em termos da entalpia, provemos uma função de interpolação para uma pressão dada abaixo. No caso mais geral (com perda de carga) a entalpia deverá ser avaliada para cada célula no domínio do reator.","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"with_theme() do\n P = 0.1 * 270.0\n T = collect(300.0:5:1200.0)\n \n ρ = map((t)->1.0 / SpecificV(P, t), T)\n h = map((t)->SpecificH(P, t), T)\n \n T_interp = collect(400.0:25.0:1200.0)\n h_interp = linear_interpolation(T, h)\n \n\tfig = Figure(size = (720, 600))\n \n\tax1 = Axis(fig[1, 1])\n\tlines!(ax1, T, ρ; color = :black)\n\tax1.xlabel = \"Temperatura [K]\"\n\tax1.ylabel = \"Mass específica [kg/m³]\"\n\tax1.xticks = 300:100:1200\n\tax1.yticks = 000:200:1000\n\txlims!(ax1, (400, 1000))\n\tylims!(ax1, (000, 1000))\n\n ax2 = Axis(fig[2, 1])\n scatter!(ax2, T_interp, h_interp(T_interp); color = :red, alpha = 0.7)\n lines!(ax2, T, h; color = :black)\n ax2.xlabel = \"Temperatura [K]\"\n ax2.ylabel = \"Entalpia específica [kJ/kg]\"\n ax2.xticks = 400:100:1000\n ax2.yticks = 000:500:4000\n xlims!(ax2, (400, 1000))\n ylims!(ax2, (500, 4000))\n \n fig\nend","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"# \"Integra reator pistão circular no espaço das entalpias.\"\n# function solveenthalpypfr(; mesh::AbstractDomainFVM, P::T, A::T, Tₛ::T, Tₚ::T,\n# ĥ::T, u::T, ρ::T, h::Function, M::Int64 = 100,\n# α::Float64 = 0.4, ε::Float64 = 1.0e-10,\n# alg::Any = Order16(), vars...) where T\n# N = length(mesh.z) - 1\n\n# Tm = Tₚ * ones(N + 1)\n# hm = h.(Tm)\n\n# a = (ĥ * P * mesh.δ) / (ρ * u * A)\n# K = 2spdiagm(-1 => -ones(N-1), 0 => ones(N))\n\n# b = (2a * Tₛ) * ones(N)\n# b[1] += 2h(Tₚ)\n\n# residual = -ones(M)\n\n# @time for niter in 1:M\n# Δ = (1-α) * (K\\(b - a * (Tm[1:end-1] + Tm[2:end])) - hm[2:end])\n# hm[2:end] += Δ\n\n# Tm[2:end] = map(\n# (Tₖ, hₖ) -> find_zero(t -> h(t) - hₖ, Tₖ, alg, atol=0.1),\n# Tm[2:end], hm[2:end]\n# )\n\n# residual[niter] = maximum(abs.(Δ))\n\n# if (residual[niter] <= ε)\n# @info(\"Convergiu após $(niter) iterações\")\n# break\n# end\n# end\n\n# return Tm, residual\n# end\n\n# let\n# L = 3.0\n# mesh = ImmersedConditionsFVM(; L = L, N = 3000)\n\n# D = 0.0254 / 2\n# P = π * D\n# A = π * D^2 / 4\n\n# Tₛ = 873.15\n# ṁ = 60.0 / 3600.0\n\n# Pₚ = 27.0\n# Tₚ = 300.0\n# ρₚ = 1.0 / SpecificV(Pₚ, Tₚ)\n# uₚ = ṁ / (ρₚ * A)\n\n# h_interp = let\n# T = collect(300.0:5.0:2000.0)\n# h = map((t)->SpecificH(Pₚ, t), T)\n# linear_interpolation(T, h)\n# end\n\n# z = mesh.z\n# ĥ = 4000.0\n\n# # TODO search literature for supercritical!\n# # ĥ = computehtc(; reactor..., fluid..., u = operations.u)\n\n# h(t) = 1000h_interp(t)\n\n# pars = (\n# mesh = mesh,\n# P = P,\n# A = A,\n# Tₛ = Tₛ,\n# Tₚ = Tₚ,\n# ĥ = ĥ,\n# u = uₚ,\n# ρ = ρₚ,\n# h = h,\n# M = 1000,\n# α = 0.85,\n# ε = 1.0e-06,\n# alg = Order16()\n# )\n\n# T, residuals = solveenthalpypfr(; pars...)\n\n# fig1 = let\n# yrng = (300.0, 900.0)\n\n# Tend = @sprintf(\"%.2f\", T[end])\n# fig = Figure(resolution = (720, 500))\n# ax = Axis(fig[1, 1])\n# stairs!(ax, z, T,\n# color = :red, linewidth = 2,\n# label = \"Numérica\", step = :center)\n# xlims!(ax, (0, L))\n# ax.title = \"Temperatura final = $(Tend) K\"\n# ax.xlabel = \"Posição [m]\"\n# ax.ylabel = \"Temperatura [K]\"\n# ax.xticks = range(0.0, L, 5)\n# ax.yticks = range(yrng..., 7)\n# ylims!(ax, yrng)\n# axislegend(position = :rb)\n# fig\n# end\n# end","category":"page"},{"location":"References/@Guo2023g/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Guo2023g/","page":"-","title":"-","text":"title: \"Unraveling the design pattern of physics-informed neural networks: Series 07\" authors: Shuai Guo year: 2023 URL: https://towardsdatascience.com/unraveling-the-design-pattern-of-physics-informed-neural-networks-part-07-4ecb543b616a –-","category":"page"},{"location":"Notes/Monthly/#Monthly","page":"Monthly","title":"Monthly","text":"","category":"section"},{"location":"Notes/Monthly/","page":"Monthly","title":"Monthly","text":"","category":"page"},{"location":"Notes/Monthly/#July-2024","page":"Monthly","title":"July 2024","text":"","category":"section"},{"location":"Notes/Monthly/","page":"Monthly","title":"Monthly","text":"","category":"page"},{"location":"Notes/Monthly/#April-2024","page":"Monthly","title":"April 2024","text":"","category":"section"},{"location":"Notes/Monthly/","page":"Monthly","title":"Monthly","text":"Reviewed GPU limitations for Ansys Fluent. It remains NVIDIA only. Currently the models remain quite limited to simple flows and the classic turbulence model. Possibility of species transport but to reactions.\nReviewed Ansys Tutorial Guide 2023R1 chapter regarding droplets evaporation. There is nothing there I am not already using in the models I conceive. Remember to use transient tracking and check mean properties for iso-surfaces display.\nContinued (re-)learning about UDF's. Header files seem fine if placed under an include/ directory at project root (not case root!). Simulations can be made more flexible by using Scheme variables which can be parsed by UDF's.\nDownloading files from Analysis of Transport Phenomena at MITx.\nWorked on random walk diffusion models at microscopic scale. Started a draft of a tutorial for moving particles in a square grid in Julia.\nContinued working on diffusion, now writing down the draft of the course. I think an annex of thermodynamics or even dedicated chapters might be required, to be defined.","category":"page"},{"location":"Notes/Naturalisation/#Suivi-des-étapes","page":"-","title":"Suivi des étapes","text":"","category":"section"},{"location":"Notes/Naturalisation/","page":"-","title":"-","text":"État Étape Notes\nFini Saisie Juste le formulaire à remplir, le plus compliqué c'est d'avoir toutes les dates et adresses des résidences précedentes.\nEn cours Documents Il manque les traductions, certificats de travail, casier judiciaire et bordereau fiscale.\n ","category":"page"},{"location":"Notes/Naturalisation/#Documents","page":"-","title":"Documents","text":"","category":"section"},{"location":"Notes/Naturalisation/#Mes-informations","page":"-","title":"Mes informations","text":"","category":"section"},{"location":"Notes/Naturalisation/","page":"-","title":"-","text":"[x] Passeport\n[x] Acte de naissance (propre)\n[ ] Acte de naissance (propre, traduction française)\n[x] Titre de séjour (propre)\n[x] Diplôme français niveau >3 (notes)","category":"page"},{"location":"Notes/Naturalisation/#Parents-et-fratrie","page":"-","title":"Parents et fratrie","text":"","category":"section"},{"location":"Notes/Naturalisation/","page":"-","title":"-","text":"[ ] Acte de mariage (parents)\n[ ] Acte de mariage (parents, traduction française)\n[x] Acte de naissance (mère)\n[ ] Acte de naissance (mère, traduction française)\n[x] Acte de naissance (père)\n[ ] Acte de naissance (père, traduction française)\n[x] Acte de décès (père)\n[ ] Acte de décès (père, traduction française)","category":"page"},{"location":"Notes/Naturalisation/#Ma-situation-familiale","page":"-","title":"Ma situation familiale","text":"","category":"section"},{"location":"Notes/Naturalisation/","page":"-","title":"-","text":"[x] Acte de mariage\n[x] Titre de séjour du conjoint\n[ ] Certificats de travail du conjoint (3 dernières années)\n[x] Contrat de travail du conjoint\n[x] Les 3 derniers bulletins de salaire du conjoint\n[x] Bulletins de salaire du conjoint de novembre et décembre des 3 dernières années","category":"page"},{"location":"Notes/Naturalisation/#Mon-domicile","page":"-","title":"Mon domicile","text":"","category":"section"},{"location":"Notes/Naturalisation/","page":"-","title":"-","text":"[x] Contrat de location\n[x] Les 3 dernières quittances de loyer\n[x] Justificatif de domicile datant de moins de 6 mois\n[ ] Casier judiciaire étranger des pays dont vous avez la nationalité\n[ ] Casier judiciaire étranger des pays dont vous avez la nationalité (traduction française)","category":"page"},{"location":"Notes/Naturalisation/#Mes-ressources","page":"-","title":"Mes ressources","text":"","category":"section"},{"location":"Notes/Naturalisation/","page":"-","title":"-","text":"[x] Avis d’imposition des 3 dernières années\n[ ] Bordereau de situation fiscale (modèle P. 237) (3 dernières années)\n[ ] Les certificats de travail, concernant si possible les 3 dernières années\n[x] Contrat de travail et ses MAJ\n[x] Les 3 derniers bulletins de salaire \n[x] Bulletins de salaire de novembre et décembre des 3 dernières années","category":"page"},{"location":"Notes/carburizing/#Mass-transfer","page":"-","title":"Mass transfer","text":"","category":"section"},{"location":"Notes/carburizing/#Carbon-diffusion-in-plain-iron","page":"-","title":"Carbon diffusion in plain iron","text":"","category":"section"},{"location":"Notes/carburizing/","page":"-","title":"-","text":"fracpartialxpartialt=nablacdotp(D(x)nablaT)","category":"page"},{"location":"Notes/carburizing/","page":"-","title":"-","text":"fracpartialxpartialt=\nfracpartialpartialx\nleft(D(x)fracpartialxpartialzright)","category":"page"},{"location":"Notes/carburizing/","page":"-","title":"-","text":"int_s^nint_0^tau\nfracpartialxpartialtdtdz=\nint_0^tauint_s^n\nfracpartialpartialz\nleft(D(x)fracpartialxpartialzright)dzdt","category":"page"},{"location":"Notes/carburizing/","page":"-","title":"-","text":"left(x_P^tau-x_P^0right)(w_n-w_s)=\nint_0^tau\nleft(D(x)fracpartialTpartialrright)biggvert_s^ndt","category":"page"},{"location":"Notes/carburizing/","page":"-","title":"-","text":"beginalign\nleft(x_P^tau-x_P^0right)frac(w_n-w_s)tau=\nfleft\nD(x_n)fracx_N^tau-x_P^taudelta_PN-\nD(x_s)fracx_P^tau-x_S^taudelta_PS\nright8pt\n+(1-f)left\nD(x_n)fracx_N^0-x_P^0delta_PN-\nD(x_s)fracx_P^0-x_S^0delta_PS\nright\nendalign","category":"page"},{"location":"Notes/carburizing/","page":"-","title":"-","text":"beginalign\nalpha_P = frac(w_n-w_s)tau8pt\nbeta_j = fracD(x_j)delta_PJ\nendalign","category":"page"},{"location":"Notes/carburizing/","page":"-","title":"-","text":"-fbeta_sx_S+\n(alpha_P+fbeta_n+fbeta_s)x_P\n-fbeta_nx_N\n=\ngbeta_sx_S^0+\n(alpha_P-gbeta_n-gbeta_s)x_P^0+\ngbeta_nx_N^0","category":"page"},{"location":"Notes/carburizing/","page":"-","title":"-","text":"-beta_sx_S+\n(alpha_P+beta_n+beta_s)x_P\n-beta_nx_N\n=\nalpha_Px_P^0","category":"page"},{"location":"Notes/carburizing/","page":"-","title":"-","text":"beginalign\na_S = -beta_s8pt\na_N = -beta_n8pt\na_P = alpha_P+beta_n+beta_s\nendalign","category":"page"},{"location":"Notes/carburizing/","page":"-","title":"-","text":"a_Sx_S + a_Px_P + a_Nx_N = alpha_Px_P^0","category":"page"},{"location":"Notes/carburizing/","page":"-","title":"-","text":"a_1x_P + a_Nx_N = alpha_Px_P^0quadtextwherequada_1=alpha_P+beta_n","category":"page"},{"location":"Notes/carburizing/","page":"-","title":"-","text":"a_Sx_S + a_Rx_P = alpha_Px_P^0+hx_inftyquadtextwherequada_R=alpha_P+h+beta_s","category":"page"},{"location":"Notes/carburizing/","page":"-","title":"-","text":"note: About mass intake calculation\n","category":"page"},{"location":"Notes/carburizing/","page":"-","title":"-","text":"rho_Fe = fracm_FeV_cell","category":"page"},{"location":"Notes/carburizing/","page":"-","title":"-","text":"y_C = fracm_Cm_Fe + m_C","category":"page"},{"location":"Notes/carburizing/","page":"-","title":"-","text":"m_Fe+C = fracm_Fe1 - y_C","category":"page"},{"location":"Notes/carburizing/","page":"-","title":"-","text":"rho_Fe+C = rho_Fefrac11 - y_C","category":"page"},{"location":"Notes/carburizing/","page":"-","title":"-","text":"sigma = int_0^Lrho(z)y_C(z)dz","category":"page"},{"location":"Notes/carburizing/","page":"-","title":"-","text":"sigma = rho_Feint_0^Lfracy_C(z)1-y_C(z)dz","category":"page"},{"location":"Notes/carburizing/","page":"-","title":"-","text":"Deltasigma = rho_Feleft(int_0^Lfracy_C(z)1-y_C(z)dzright)biggrvert_t=0^t=t_f","category":"page"},{"location":"References/@Garaniya2012a/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Garaniya2012a/","page":"-","title":"-","text":"title: CFD modelling of heavy fuel oil spray combustion authors: V. Garaniya, L. Goldsworthy year: 2012 URL: https://flair.monash.edu/intranet/proceedings/18afmc/Documents/400%20-%20Garaniya.pdf Drive: https://1drv.ms/b/s!Ar4x-UlrYAiZlbEh7jKBqcgTdikWRQ?e=Zima6B –-","category":"page"},{"location":"References/@Guo2024a/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Guo2024a/","page":"-","title":"-","text":"title: \"Physics-informed neural networks: An application-centric guide\" authors: Shuai Guo year: 2024 URL: https://towardsdatascience.com/physics-informed-neural-networks-an-application-centric-guide-dc1013526b02 –-","category":"page"},{"location":"References/@Krishnapriyan2021a/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Krishnapriyan2021a/","page":"-","title":"-","text":"title: Characterizing possible failure modes in physics-informed neural networks authors: Aditi S. Krishnapriyan, Amir Gholami, Shandian Zhe, Robert M. Kirby, Michael W. Mahoney year: 2021 DOI: https://doi.org/10.48550/arXiv.2109.01050 Drive: https://1drv.ms/b/s!Ar4x-UlrYAiZla8bwpowG74YkMl_tA?e=DmUIjw –-","category":"page"},{"location":"Modules/DryMaterials/#DryMaterials","page":"DryMaterials","title":"DryMaterials","text":"","category":"section"},{"location":"Modules/DryMaterials/","page":"DryMaterials","title":"DryMaterials","text":"CurrentModule = DryMaterials\nDocTestSetup = quote\n using DryMaterials\nend\nEditURL = \"https://github.com/wallytutor/WallyToolbox.jl/blob/main/docs/src/Modules/DryMaterials.md\"","category":"page"},{"location":"Modules/DryMaterials/#Solid-Thermodynamics","page":"DryMaterials","title":"Solid Thermodynamics","text":"","category":"section"},{"location":"Modules/DryMaterials/","page":"DryMaterials","title":"DryMaterials","text":"danger: Danger\nThe following sub-sections document structures and functions that are undergoing active development to harmonize all interfaces. Changes are expected to happen all the time before a common ground is found.","category":"page"},{"location":"Modules/DryMaterials/#Laurent-Polynomial-Models","page":"DryMaterials","title":"Laurent Polynomial Models","text":"","category":"section"},{"location":"Modules/DryMaterials/","page":"DryMaterials","title":"DryMaterials","text":"SolidPolynomialProperties","category":"page"},{"location":"Modules/DryMaterials/#DryMaterials.SolidPolynomialProperties","page":"DryMaterials","title":"DryMaterials.SolidPolynomialProperties","text":"Arbitrary Laurent polynomial specific heat and enthalpy of materials.\n\nc: Polynomial representation of specific heat [J/(kg.K)].\nh: Polynomial representation of enthalpy [J/kg].\nhₒ: Reference state enthalpy [J/kg].\n\n\n\n\n\n","category":"type"},{"location":"Modules/DryMaterials/#Ongoing-documentation","page":"DryMaterials","title":"Ongoing documentation","text":"","category":"section"},{"location":"Modules/DryMaterials/","page":"DryMaterials","title":"DryMaterials","text":"DryMaterials.SolidMineralPhase\nDryMaterials.enthalpy\nDryMaterials.specificheat\nDryMaterials.density\nDryMaterials.molecularmass","category":"page"},{"location":"Modules/DryMaterials/#DryMaterials.SolidMineralPhase","page":"DryMaterials","title":"DryMaterials.SolidMineralPhase","text":"Represents a solid mineral phase for thermodynamic calculations.\n\nname: Name of phase.\nρ: Specific mass of phase [kg/m³].\nM: Molecular mass of phase [kg/mol].\np: Polynomial properties of phase.\n\n\n\n\n\n","category":"type"},{"location":"Modules/DryMaterials/#DryMaterials.enthalpy","page":"DryMaterials","title":"DryMaterials.enthalpy","text":"Evaluates the enthalpy of material [J/kg].\n\n\n\n\n\n","category":"function"},{"location":"Modules/DryMaterials/#DryMaterials.specificheat","page":"DryMaterials","title":"DryMaterials.specificheat","text":"Evaluates the specific heat of materials [J/(kg.K)].\n\n\n\n\n\n","category":"function"},{"location":"Modules/DryMaterials/#DryMaterials.density","page":"DryMaterials","title":"DryMaterials.density","text":"Evaluates the density of material [kg/m³].\n\n\n\n\n\n","category":"function"},{"location":"Modules/DryMaterials/#DryMaterials.molecularmass","page":"DryMaterials","title":"DryMaterials.molecularmass","text":"Retrieve molecular mass of materials [kg/mol].\n\n\n\n\n\n","category":"function"},{"location":"Modules/DryMaterials/#Hard-coded-materials","page":"DryMaterials","title":"Hard-coded materials","text":"","category":"section"},{"location":"Modules/DryMaterials/","page":"DryMaterials","title":"DryMaterials","text":"DryMaterials.H_AIR\nDryMaterials.PureAir\nDryMaterials.PureMineral\nDryMaterials.PureWater","category":"page"},{"location":"Modules/DryMaterials/#DryMaterials.H_AIR","page":"DryMaterials","title":"DryMaterials.H_AIR","text":"Coefficients for air enthalpy polynomial [J/kg].\n\n\n\n\n\n","category":"constant"},{"location":"Modules/DryMaterials/#DryMaterials.PureAir","page":"DryMaterials","title":"DryMaterials.PureAir","text":"Simple implementation of pure air for illustration purposes.\n\n\n\n\n\n","category":"type"},{"location":"Modules/DryMaterials/#DryMaterials.PureMineral","page":"DryMaterials","title":"DryMaterials.PureMineral","text":"Simple solid mineral material for illustration purposes.\n\n\n\n\n\n","category":"type"},{"location":"Modules/DryMaterials/#DryMaterials.PureWater","page":"DryMaterials","title":"DryMaterials.PureWater","text":"Simple implementation of liquid water for illustration purposes.\n\n\n\n\n\n","category":"type"},{"location":"References/@Gunn1978/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Gunn1978/","page":"-","title":"-","text":"title: Transfer of heat or mass to particles in fixed and fluidised beds authors: D. J. Gunn year: 1978 –-","category":"page"},{"location":"References/@Patankar1980/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Patankar1980/","page":"-","title":"-","text":"title: Numerical heat transfer and fluid flow authors: Suhas V. Patankar year: 1980 –-","category":"page"},{"location":"References/@Qiu2018a/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Qiu2018a/","page":"-","title":"-","text":"title: \"Inhomogeneity in pore size appreciably lowering thermal conductivity for porous thermal insulators\" authors: Lin Qiu, Hanying Zou, Dawei Tang, Dongsheng Wen, Yanhui Feng, Xinxin Zhang year: 2018 –-","category":"page"},{"location":"#WallyToolbox","page":"Home","title":"WallyToolbox","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"General tools I use everyday for everything.","category":"page"},{"location":"#About-the-toolbox","page":"Home","title":"About the toolbox","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"My name is Walter (CV) and I like writing about science and engineering topics. I have more than a decade of scientific computing experience and a broad experience with open source software, especially in the fields of fluid dynamics and gas phase kinetics; a little of it being shared here.","category":"page"},{"location":"","page":"Home","title":"Home","text":"During the years I tried to different formats to organize my study materials and working tools, but it was only recently that I realized that coupling my knowledge base with the documentation of my personal code was the best approach in terms of maintenance. Obviously I cannot migrate all the content I have ever produced here at once, so my decision was to restructure everything and have a fresh start, feeding content as required, i.e. somebody asked me a hand in a certain subject or I need to refresh certain skill at work. In this page you will also find the supporting materials of my Medium articles and some additional content.","category":"page"},{"location":"","page":"Home","title":"Home","text":"The core package of WallyToolbox ecosystem provides shared functionalities and types that are used in more specialized packages. It is an unpublished rolling release package composed of several sub-modules not making part of the main one and currently not following any versioning semantics. That means that new features are added and only the commits track differences. Its main goal is to provide a portable working environment that runs smoothly (at least) under Windows; anyone working in the numerical world knows the struggle with IT to have a proper Linux working system, especially in a portable device.","category":"page"},{"location":"","page":"Home","title":"Home","text":"This unification over a central package allows for standardization of interfaces, employed quantities, and avoid boilerplate code. This page organizes everything (or tries to) to facilitate the understanding of the end-user.","category":"page"},{"location":"","page":"Home","title":"Home","text":"info: Info\nOver the time it is expected that many functionalities from other modules will integrate WallyToolbox as they become stable. In some cases, entire modules may become sub-modules on integrated directly under WallyToolbox, so you might need to check where to import some utilities as this package is rolling release. This is temporary and will be modified when all the old code base that is giving origing to the package is migrated here, what will take me a few years. Nonetheless, the package will probably not be published to Julia registries because of the way its governance works. WallyToolbox.jl tries to be self-contained in several aspects because of the needs of perfect integration between functionalities of several of its foreseen end applications. That is currently incompatible with using some of the state-of-the-art packages from Julia ecosystem.","category":"page"},{"location":"#Using-the-modules","page":"Home","title":"Using the modules","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"The simplest way to use WallyToolbox is by launching Julia the root directory of WallyToolbox.jl as a project from command line, such as julia --project=.[1]; this way one has access to most Julia modules packaged within the toolbox. Notice that for a full availability one needs to consider the extra steps provided in the setup guide, which is the preferred way to deploy a working system with WallyToolbox.","category":"page"},{"location":"","page":"Home","title":"Home","text":"[1]: You might need to enter pkg mode and instantiate the project to get all dependencies installed. You can find more about this here.","category":"page"},{"location":"#Contact-and-citing","page":"Home","title":"Contact and citing","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"For quick questions and proposals, please prefer Zulip Chat. If you found and error or bug, please create an issue. That will make me more efficient at handling everything. If none of those work for you, you can contact me by mail. ","category":"page"},{"location":"","page":"Home","title":"Home","text":"Found it useful? See CITATION.bib for the relevant reference.","category":"page"},{"location":"Articles/Maybe-I-f-ed-my-career/#Maybe-I-f**********-my-career...","page":"Maybe I f********** my career...","title":"Maybe I f********** my career...","text":"","category":"section"},{"location":"Articles/Maybe-I-f-ed-my-career/","page":"Maybe I f********** my career...","title":"Maybe I f********** my career...","text":"…and it is not all on me, just part of it.","category":"page"},{"location":"Articles/Maybe-I-f-ed-my-career/","page":"Maybe I f********** my career...","title":"Maybe I f********** my career...","text":"In this essay I will tentatively tell in some sort of autobiography how I messed up with my career and what may be the way out of this mess. I won't explore any details or feelings, but stick to facts, my observations at each of the episodes, and my takes about the happenings.","category":"page"},{"location":"Articles/Maybe-I-f-ed-my-career/","page":"Maybe I f********** my career...","title":"Maybe I f********** my career...","text":"","category":"page"},{"location":"Articles/Maybe-I-f-ed-my-career/#Early-life","page":"Maybe I f********** my career...","title":"Early life","text":"","category":"section"},{"location":"Articles/Maybe-I-f-ed-my-career/","page":"Maybe I f********** my career...","title":"Maybe I f********** my career...","text":"It has never been questioned in my circles that I was some sort of gifted child. But certainly, I was not what you first think about when hearing about someone gifted. I could read and write in some rudimentary ways before age 4 — and that led me to opening Pandora’s box. By age 6 I had read most of the encyclopedias we had at home, my main interests being history, art, and engineering; at that time, I was already able to discuss with adults on these topics and most kids were embarrassingly boring to me. It was reading and reading and reading that time was spent.","category":"page"},{"location":"Articles/Maybe-I-f-ed-my-career/","page":"Maybe I f********** my career...","title":"Maybe I f********** my career...","text":"Numismatics came next and, in a few years, I was not just a kid collecting lost coins around the house, but the one with in depth knowledge of the characters being depicted, historical events, and an actual set of collectible coins; needless to say, that really developed my interest in metals. Ah, and before I forget, at the same time I was also really into rocks and geology, always digging around looking for gems, which at the time I was often able to identify, and when stuck I would recur to the local natural history museum geologist for help. I know I should have been running and playing around by that time, but it simply was not my thing, so I ended up not developing good motor skills by then.","category":"page"},{"location":"Articles/Maybe-I-f-ed-my-career/","page":"Maybe I f********** my career...","title":"Maybe I f********** my career...","text":"For the next ten years or so I barely had to study for school because I had self-taught me everything that was in the curriculum, so I could spend my time learning new subjects that had come to my attention, especially university level ones. Because of that only on a few occasions I was the first of my class since I never reviewed, but most of the time the second or third at most. The profile of the ones on the top was really the dedicated ones, those who were seeing the topics for the first time and delving in the subjects for the exams. My view on then was of demise cause most of the time it was clear their actual grasp of what was behind things.","category":"page"},{"location":"Articles/Maybe-I-f-ed-my-career/","page":"Maybe I f********** my career...","title":"Maybe I f********** my career...","text":"By age 11 my interest in sports grew; I had always been fond of adventure and then I started mountain biking. That was the first time I really socialized and by age 16 you couldn’t tell anymore that I had been that weird child — finally I was a normal person. Or not. Because of those highly cultural beginnings you could tell some features wouldn’t really let me fit in with my pairs. So finally, the last year before college I got back to my roots and studied everything once again, but 16h+ per day, no eating, no sleeping — sometimes cheap vodka — and managed to get accepted in first place at some major universities around my place, but that is the matter of the next paragraph.","category":"page"},{"location":"Articles/Maybe-I-f-ed-my-career/","page":"Maybe I f********** my career...","title":"Maybe I f********** my career...","text":"","category":"page"},{"location":"Articles/Maybe-I-f-ed-my-career/#At-college","page":"Maybe I f********** my career...","title":"At college","text":"","category":"section"},{"location":"Articles/Maybe-I-f-ed-my-career/","page":"Maybe I f********** my career...","title":"Maybe I f********** my career...","text":"Tired. That’s how you describe my early days at college. Hormones blowing up and tiredness. So many years reading and reading got me tired. I essentially had learned what I thought was enough to already get my diploma and start working or something like that. First semester was not great intellectually speaking but after I few months I put my head in place and started working hard. Got a job in a lab. Some of the experimental work I was carrying used to be very boring and take many hours. For safety reasons you had to stay there to make sure everything was fine. But you know me, any free time and I will start reading. By the end of the first year, I had finished studying — exercises included — most of the books I needed to read for the next two years or so, and that didn’t prevent me of partying a lot.","category":"page"},{"location":"Articles/Maybe-I-f-ed-my-career/","page":"Maybe I f********** my career...","title":"Maybe I f********** my career...","text":"Everything seems fine so far but that is not actually true. While I was the highest performing student of my class and got moderately social, this was the turning point where performance started to mess things up. I was following my undergraduate studies in Materials Engineering with focus in Mechanics — in Brazil you get Materials Engineering to be associated to Mechanical or Chemical Engineering, and your diploma is not actually in Materials Engineering in the end — but since most of Materials Science topics are about having a good memory and knowing how analyse and to put things together to get things done, I diverged into the neighboring engineering schools and sometimes in the Physics department.","category":"page"},{"location":"Articles/Maybe-I-f-ed-my-career/","page":"Maybe I f********** my career...","title":"Maybe I f********** my career...","text":"I was often taking classes at other undergraduate courses and when not available, I would take lecture notes and study them anyway. I managed to become better at plain Mechanical Engineering than I was in pure Materials Engineering and sometimes taught subjects to friends following that course. Here we notice that I completely changed subjects since I was a child: from history and art, now I was into applied mathematics and thermal engines. Things always had a limit to me, but not because of difficulty; once I have a feeling of being able to go beyond in a subject by myself, I also start to get bored. The grasp of the generality of a subject fulfils my curiosity.","category":"page"},{"location":"Articles/Maybe-I-f-ed-my-career/","page":"Maybe I f********** my career...","title":"Maybe I f********** my career...","text":"By the fifth and last year I was considering a PhD in Germany but finally I decided to stay a bit more around. In fact, I was no longer feeling like I wanted to stay in academia and got a particularly respectable job offer that I sticked with; more on that next.","category":"page"},{"location":"Articles/Maybe-I-f-ed-my-career/","page":"Maybe I f********** my career...","title":"Maybe I f********** my career...","text":"","category":"page"},{"location":"Articles/Maybe-I-f-ed-my-career/#First-job","page":"Maybe I f********** my career...","title":"First job","text":"","category":"section"},{"location":"Articles/Maybe-I-f-ed-my-career/","page":"Maybe I f********** my career...","title":"Maybe I f********** my career...","text":"By age 22 I was an engineer; later than I expected but I didn’t tell you that my parents refused to let me skip a few years at school as some of my tutors proposed at some point. This could have been much earlier but then I would be jobless or following a PhD in the Humanities. That was not the case, before even getting my diploma I already had the job offer and the transition from intern to actual engineer happened overnight as I got my diplomas. In fact, nothing changed — except that they started paying me a decent salary quite above the average at that time.","category":"page"},{"location":"Articles/Maybe-I-f-ed-my-career/","page":"Maybe I f********** my career...","title":"Maybe I f********** my career...","text":"So, I started working in a not that technical position. At first, I was writing technical specifications for materials and mechanical construction of metallic parts, but soon someone realized that my strongest feature was my negotiation skills and from that day I was often defending deviations from technical requirements with the customers and proposing technical alternatives. It was a very transversal job with interaction with all levels from the shop floor to the high management. It didn’t take long for me to start living in an airplane going to technical audits all around and to participate at the defining stages of scope of commercial supply in large projects. By this time, my hobby was learning a little bit of every language I was able to, and I did that with religious fervor.","category":"page"},{"location":"Articles/Maybe-I-f-ed-my-career/","page":"Maybe I f********** my career...","title":"Maybe I f********** my career...","text":"So far you may think all this took me at least 5 years to accomplish, but in fact it lasted only 1 year and 10 months. The main reason I excelled at this position was that whole random background I carried with strong scientific culture, good history knowledge, and on general matters. It became natural to me to start a conversation with anyone and later develop links that allowed huge gains in negotiation. My career was on track, and it seemed very promising. But I told you already that once I reached a certain level of generality, I need a change.","category":"page"},{"location":"Articles/Maybe-I-f-ed-my-career/","page":"Maybe I f********** my career...","title":"Maybe I f********** my career...","text":"At some point I found myself there and had the urge to reach out a previous internship advisor in France. When I first worked in his team, I didn’t do a fantastic job as I try to most of the time, but anyways he had good views of me and offered me a PhD. In a few months it was me again in a plane flying once again to France. What made me interested in the PhD offer he proposed me was the fact that I already knew most of the literature on the subject, so that would allow me to get back and finish some open ends from my undergraduate studies. I didn't expect to make I great thesis, just to follow the rules and get a PhD. What matters is what you learn on your free time, that's what life taught me so far. ","category":"page"},{"location":"Articles/Maybe-I-f-ed-my-career/","page":"Maybe I f********** my career...","title":"Maybe I f********** my career...","text":"","category":"page"},{"location":"Articles/Maybe-I-f-ed-my-career/#Graduate-years","page":"Maybe I f********** my career...","title":"Graduate years","text":"","category":"section"},{"location":"Articles/Maybe-I-f-ed-my-career/","page":"Maybe I f********** my career...","title":"Maybe I f********** my career...","text":"There I would finally go deeper in fluid dynamics and reacting flows, two subjects that always were among my favorite ones. Also, in the part of the thesis related to materials, I would be able be learn more about diffusion and some microscopy techniques of my interest. So, hands to work, I could already code in C++ by that time and started with that to perform my numerical analyses. Soon I was coding in several programming languages and grasped the use of many scientific software, what a delight! The intellectual and social environment was interesting and whenever I got bored with my own matters, I went see some friends in the building and see how I could help them. It was the first time in my life that I felt in a place where you could develop interesting ideas and talk to people who would understand you. But academia can also be harsh, especially when you graduate — the competition among researchers in some cases reach an extremally toxic level, so once I finished, I didn’t even try to get a post-doc and ended up in industry again, but this time in a research center.","category":"page"},{"location":"Articles/Maybe-I-f-ed-my-career/","page":"Maybe I f********** my career...","title":"Maybe I f********** my career...","text":"If there is one thing you learn during a PhD is the sense of generality; not that I needed that, so far you understand that this is my main characteristic — I was just looking for a piece of paper stating that I had accomplished that. It is not difficult for a PhD to identify another without even asking, you notice in the way people speak and the things they are interested at. In my whole life I just met three people who didn’t graduate that behaved that way and I find that amazing — and two of them are a couple, what is even more mind blowing. So, when I started my new job, I was looking to interact with people matching this level of general views. The problem is that industry hurts; some people get greedy over the years; some completely loose interest; but a few stick to their core. Nonetheless, I managed to identify these last group and for a few years I was productive.","category":"page"},{"location":"Articles/Maybe-I-f-ed-my-career/","page":"Maybe I f********** my career...","title":"Maybe I f********** my career...","text":"","category":"page"},{"location":"Articles/Maybe-I-f-ed-my-career/#Back-in-industry","page":"Maybe I f********** my career...","title":"Back in industry","text":"","category":"section"},{"location":"Articles/Maybe-I-f-ed-my-career/","page":"Maybe I f********** my career...","title":"Maybe I f********** my career...","text":"Yes, once again I gained lots of new skills. With the scientific computing background, I built over the years it was easy for me to start in machine learning. Yes, I survived the boom of machine learning in 2018 and conducted many proof-of-concept projects in the field but managed to stay linked to my core engineering skills. I also contributed to vulgarizing the use of some open-source software people were not using yet. Ever since the start of my PhD I lost contact with supply chain and quality related people, but always tried to keep using to a lesser level what I learned there and applied that to my project management. On the technical side, most of my work was in some sort related to skills — but not subjects — I developed during my PhD. This time and only this time it was not my loss of interest in a subject that messed things, but the feeling that some people were working in closed silos and only for self-marketeering themselves. I don’t know how this could be a reality in a private company — you simply get rid of people not willing to play the game, unless you are in France, obviously. The overall environment was technically challenging, and you could have nice discussions and growth with some colleagues, but not everyone was willing to collaborate.","category":"page"},{"location":"Articles/Maybe-I-f-ed-my-career/","page":"Maybe I f********** my career...","title":"Maybe I f********** my career...","text":"After trying a lot to overcome some barriers and break some silos, by a miracle I got a phone call with a job offer elsewhere — my current position. There were quite a few incoherencies in what they proposed me but that was because my field was something new to them, so I was quite sure those points could be fixed; I promptly accepted the offer without much thinking. I packed my stuff and in one month there I was, full of motivation. The team was nice and welcoming and the company much smaller, exactly what I thought I was looking for. The ground was lacking foundations, so I started developing some basic tools to build what in a few years I expected to be a project portfolio. Also, there was the possibility to in about two years have my own team of numerical guys, what was motivating.","category":"page"},{"location":"Articles/Maybe-I-f-ed-my-career/","page":"Maybe I f********** my career...","title":"Maybe I f********** my career...","text":"In practice things weren’t that smooth. First, they didn’t research what was required to get some numerical work done; you need expensive computers. Then comes the fact that you get people specialized in fields of applied mathematics — there is no such 1990s Discovery Channel simulation generalist. If you read attentively so far, you noticed that in my previous job I finally managed to stick to a subject, or at least a small family of related subjects. Now I started to get people asking me if I could run some molecular dynamics in the same simulation of macroscale transport or predict the age of their grandmother: it was driving me nuts. For a while I really thought they would fire me without even knowing why. In a few months things settled down a bit and requests became more consistent with my skills. Some people understood that fluid dynamics applied to materials processing is still a research field and many things that may seem trivial to the layman are quite challenging. Others are still annoying about the limitations of what I can offer today.","category":"page"},{"location":"Articles/Maybe-I-f-ed-my-career/","page":"Maybe I f********** my career...","title":"Maybe I f********** my career...","text":"Since I was the first numerical person in the company I had to fight battles against an incompetent IT with senseless rules; then I confirmed the company was really capital-driven only, and to my disappointment I was feeling mismanaged. During this time things went awry because I started suffering from impostor syndrome — sorry guys, I can’t make DFT calculations coupled to CFD — and entered a bottomless pit of trying to learn everything else again. To add to my disappointment and endless lies that have been told to me, instead of getting a team in the middle term, I will get a new colleague to work with me. All the work towards really understanding my field and its people were thrown to the rubbish by people who are not even close to be qualified to manage me: experience do not mean capacity, a mistake people from past generations often do. I started becoming grumpier and grumpier, face severe lack of concentration, it became impossible to sleep, and intellectual loneliness is really killing me. These people were not ready for me, not the inverse, which is clear now.","category":"page"},{"location":"Articles/Maybe-I-f-ed-my-career/","page":"Maybe I f********** my career...","title":"Maybe I f********** my career...","text":"","category":"page"},{"location":"Articles/Maybe-I-f-ed-my-career/#What's-next?","page":"Maybe I f********** my career...","title":"What's next?","text":"","category":"section"},{"location":"Articles/Maybe-I-f-ed-my-career/","page":"Maybe I f********** my career...","title":"Maybe I f********** my career...","text":"So, what may be the way out of this mess? I have no clue! ","category":"page"},{"location":"Articles/Maybe-I-f-ed-my-career/","page":"Maybe I f********** my career...","title":"Maybe I f********** my career...","text":"My only certainty right now is that I am quitting in the extremely short term; I no longer try to hide my urge of change.","category":"page"},{"location":"Articles/Maybe-I-f-ed-my-career/","page":"Maybe I f********** my career...","title":"Maybe I f********** my career...","text":"The branching of my knowledge made me useless to the standard market and I am still too young to occupy the positions I have developed the skills for because it is not socially acceptable.","category":"page"},{"location":"Articles/Maybe-I-f-ed-my-career/","page":"Maybe I f********** my career...","title":"Maybe I f********** my career...","text":"Current job descriptions require sharp skills, but during the past three years the intellectually poor environment I am at destroyed anything I had left to offer.","category":"page"},{"location":"Articles/Maybe-I-f-ed-my-career/","page":"Maybe I f********** my career...","title":"Maybe I f********** my career...","text":"I am now incapacitated to get back to jobs like my first one where I outperformed because of my social skills were ravaged during the past months.","category":"page"},{"location":"Articles/Maybe-I-f-ed-my-career/","page":"Maybe I f********** my career...","title":"Maybe I f********** my career...","text":"Academia would be a solution but since I didn’t publish enough while in nor chained PhD with a post-doc, it is highly improbable I would get in again.","category":"page"},{"location":"Articles/Maybe-I-f-ed-my-career/","page":"Maybe I f********** my career...","title":"Maybe I f********** my career...","text":"I will become a farmer, or what else?","category":"page"},{"location":"Science/06-Maths-Cheatsheet/#Mathematics","page":"Mathematics","title":"Mathematics","text":"","category":"section"},{"location":"Science/06-Maths-Cheatsheet/","page":"Mathematics","title":"Mathematics","text":"","category":"page"},{"location":"Science/06-Maths-Cheatsheet/#Linear-algebra","page":"Mathematics","title":"Linear algebra","text":"","category":"section"},{"location":"Science/06-Maths-Cheatsheet/","page":"Mathematics","title":"Mathematics","text":"For a full review of linear algebra, please consult Lay2012 [80].","category":"page"},{"location":"Science/06-Maths-Cheatsheet/","page":"Mathematics","title":"Mathematics","text":"A linear system of equations may have (1) no solution, (2) exactly one solution, or (3) infinitely many solutions. Solving and analyzing them is the task of linear algebra.","category":"page"},{"location":"Science/06-Maths-Cheatsheet/#Definitions","page":"Mathematics","title":"Definitions","text":"","category":"section"},{"location":"Science/06-Maths-Cheatsheet/","page":"Mathematics","title":"Mathematics","text":"Echelon form\nPivot position\nSpan subset of mathbbR^n\nMatrix-vector product as a linear combination of columns\n","category":"page"},{"location":"Science/06-Maths-Cheatsheet/#Theorems","page":"Mathematics","title":"Theorems","text":"","category":"section"},{"location":"Science/06-Maths-Cheatsheet/","page":"Mathematics","title":"Mathematics","text":"Uniqueness of the reduced echelon form: each matrix is row equivalent to one and only one reduced echelon matrix.\nExistence and uniqueness: a linear system is consistent if and only if the rightmost column of the augmented matrix is not a pivot column. In this case, the solution set contains either (1) a unique solution (no free variables), or (2) infinitely many solutions (at least one free variable).\nA system Amathbfx=mathbfb has the same solution set as the augmented linear system composed of the columns of A appended by mathrmb. The same is true for the equivalent vector equation, but that is self-evident from the definition of matrix-vector product.","category":"page"},{"location":"Science/06-Maths-Cheatsheet/","page":"Mathematics","title":"Mathematics","text":"","category":"page"},{"location":"Science/06-Maths-Cheatsheet/#Calculus","page":"Mathematics","title":"Calculus","text":"","category":"section"},{"location":"Science/06-Maths-Cheatsheet/","page":"Mathematics","title":"Mathematics","text":"","category":"page"},{"location":"Science/06-Maths-Cheatsheet/#Differential-equations","page":"Mathematics","title":"Differential equations","text":"","category":"section"},{"location":"References/@Launder1974/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Launder1974/","page":"-","title":"-","text":"title: The numerical computation of turbulent flows authors: B. E. Launder, D. B. Spalding year: 1974 –-","category":"page"},{"location":"WallyToolbox/thermochemistry/#Thermochemistry","page":"Thermochemistry","title":"Thermochemistry","text":"","category":"section"},{"location":"WallyToolbox/thermochemistry/","page":"Thermochemistry","title":"Thermochemistry","text":"EditURL = \"https://github.com/wallytutor/WallyToolbox.jl/blob/main/docs/src/WallyToolbox/thermochemistry.md\"\nCurrentModule = WallyToolbox\nDocTestSetup = quote\n using WallyToolbox\nend","category":"page"},{"location":"WallyToolbox/thermochemistry/#Composition-manipulation","page":"Thermochemistry","title":"Composition manipulation","text":"","category":"section"},{"location":"WallyToolbox/thermochemistry/","page":"Thermochemistry","title":"Thermochemistry","text":"The core functionality is provided through the Stoichiometry structure:","category":"page"},{"location":"WallyToolbox/thermochemistry/","page":"Thermochemistry","title":"Thermochemistry","text":"WallyToolbox.Stoichiometry","category":"page"},{"location":"WallyToolbox/thermochemistry/#WallyToolbox.Stoichiometry","page":"Thermochemistry","title":"WallyToolbox.Stoichiometry","text":"Compound stoichiometry for ease of data manipulation.\n\nThis type provide a simple interface for declaring chemical compounds from stable ELEMENTS and computing molecular masses. Its main use is intended for compound creation during parsing of thermodynamic databases. Below we illustrate the creation of compounds and the algebra of creation of derived compounds.\n\njulia> al2o3 = Stoichiometry(Al=2, O=3)\nStoichiometry(Pair{Symbol, <:Number}[:Al => 2, :O => 3])\n\njulia> molecularmass(al2o3)\n0.1019600768\n\njulia> ca1o1 = Stoichiometry(Ca=1, O=1)\nStoichiometry(Pair{Symbol, <:Number}[:Ca => 1, :O => 1])\n\njulia> c1a2 = ca1o1 + 2 * al2o3\nStoichiometry(Pair{Symbol, <:Number}[:Al => 4, :Ca => 1, :O => 7])\n\njulia> molecularmass(c1a2)\n0.25999715360000003\n\nPlease notice that ChemicalCompound creation should be done as early as possible as Stoichiometry has no state other than the number of atoms. Its recurrent use may lead to high computational cost for the evaluation of molecular masses.\n\n\n\n\n\n","category":"type"},{"location":"WallyToolbox/thermochemistry/","page":"Thermochemistry","title":"Thermochemistry","text":"Once the composition of a compound has been set with Stoichiometry, the preferred method of working is through the creation of a ChemicalCompound, as follows:","category":"page"},{"location":"WallyToolbox/thermochemistry/","page":"Thermochemistry","title":"Thermochemistry","text":"WallyToolbox.ChemicalCompound","category":"page"},{"location":"WallyToolbox/thermochemistry/#WallyToolbox.ChemicalCompound","page":"Thermochemistry","title":"WallyToolbox.ChemicalCompound","text":"A chemical compound with internal values pre-computed for recurrent use.\n\njulia> al2o3 = Stoichiometry(Al=2, O=3);\n\njulia> ca1o1 = Stoichiometry(Ca=1, O=1);\n\njulia> CA = ChemicalCompound(ca1o1 + al2o3);\n\njulia> molecularmass(CA)\n0.1580370768\n\n\n\n\n\n","category":"type"},{"location":"WallyToolbox/thermochemistry/","page":"Thermochemistry","title":"Thermochemistry","text":"The following methods and types are available for operation over compositions and elements.","category":"page"},{"location":"WallyToolbox/thermochemistry/","page":"Thermochemistry","title":"Thermochemistry","text":"WallyToolbox.element\nWallyToolbox.atomicmass\nWallyToolbox.molecularmass\nWallyToolbox.ElementData\nWallyToolbox.ElementalQuantity","category":"page"},{"location":"WallyToolbox/thermochemistry/#WallyToolbox.element","page":"Thermochemistry","title":"WallyToolbox.element","text":"Retrieve an element by name. \n\n\n\n\n\n","category":"function"},{"location":"WallyToolbox/thermochemistry/#WallyToolbox.atomicmass","page":"Thermochemistry","title":"WallyToolbox.atomicmass","text":"Atomic mass of element [kg/mol]. \n\n\n\n\n\n","category":"function"},{"location":"WallyToolbox/thermochemistry/#WallyToolbox.molecularmass","page":"Thermochemistry","title":"WallyToolbox.molecularmass","text":"Molecular mass of compound [kg/mol]. \n\n\n\n\n\n","category":"function"},{"location":"WallyToolbox/thermochemistry/#WallyToolbox.ElementData","page":"Thermochemistry","title":"WallyToolbox.ElementData","text":"Represents a chemical element.\n\n\n\n\n\n","category":"type"},{"location":"WallyToolbox/thermochemistry/#WallyToolbox.ElementalQuantity","page":"Thermochemistry","title":"WallyToolbox.ElementalQuantity","text":"Represents a pair of element symbol and associated amount.\n\n\n\n\n\n","category":"type"},{"location":"WallyToolbox/thermochemistry/#Thermodynamic-properties","page":"Thermochemistry","title":"Thermodynamic properties","text":"","category":"section"},{"location":"WallyToolbox/thermochemistry/","page":"Thermochemistry","title":"Thermochemistry","text":"Materials properties are often reported according to the formalism of MaierKelley1932 [1] or Shomate1954 [2]. To be able to handle data under these formats, the following structures are provided.","category":"page"},{"location":"WallyToolbox/thermochemistry/","page":"Thermochemistry","title":"Thermochemistry","text":"WallyToolbox.MaierKelleyThermo\nWallyToolbox.ShomateThermo","category":"page"},{"location":"WallyToolbox/thermochemistry/#WallyToolbox.MaierKelleyThermo","page":"Thermochemistry","title":"WallyToolbox.MaierKelleyThermo","text":"Thermodynamic properties represeted in Maier-Kelley formalism.\n\n\n\n\n\n","category":"type"},{"location":"WallyToolbox/thermochemistry/#WallyToolbox.ShomateThermo","page":"Thermochemistry","title":"WallyToolbox.ShomateThermo","text":"Thermodynamic properties represeted in Shomate formalism.\n\n\n\n\n\n","category":"type"},{"location":"WallyToolbox/thermochemistry/#Empirical-fuels","page":"Thermochemistry","title":"Empirical fuels","text":"","category":"section"},{"location":"WallyToolbox/thermochemistry/","page":"Thermochemistry","title":"Thermochemistry","text":"In industrial practice of CFD one is often confronted with simulating empirical fuels. This is how one generally calls a fuel provided in elemental mass fractions of elements and is the most common reporting format for heavy-fuel oil. Using EmpiricalFuel one can quickly perform conversions and find out the required air flow rate for setting up a process simulation or furnace operation.","category":"page"},{"location":"WallyToolbox/thermochemistry/","page":"Thermochemistry","title":"Thermochemistry","text":"WallyToolbox.EmpiricalFuel","category":"page"},{"location":"WallyToolbox/thermochemistry/#WallyToolbox.EmpiricalFuel","page":"Thermochemistry","title":"WallyToolbox.EmpiricalFuel","text":"Provides description of an empirical fuel based on elemental mass fractions.\n\nelements::Vector{Symbol}: Chemical elements reported in fuel.\nY::Vector{Float64}: Array of provided masses per kilogram of fuel.\nX::Vector{Float64}: Array of computed moles per kilogram of fuel.\n\nBelow we illustrate how to create a fuel with the approximate mass fractions of carbon and hydrogen in naphtalene; next we check its string representation.\n\njulia> fuel = EmpiricalFuel([0.937, 0.063, 0.0]; scaler=:C=>10.0);\n\njulia> fuel.X\n3-element Vector{Float64}:\n 10.0\n 8.011606189967983\n 0.0\n\njulia> String(fuel)\n\"C(10.0000)H(8.0116)O(0.0000)\"\n\n\n\n\n\n","category":"type"},{"location":"WallyToolbox/thermochemistry/","page":"Thermochemistry","title":"Thermochemistry","text":"A simple empirical fuel complete combustion can be represented by the following chemical equation:","category":"page"},{"location":"WallyToolbox/thermochemistry/","page":"Thermochemistry","title":"Thermochemistry","text":"1mathrmC_xmathrmH_ymathrmO_z + amathrmO_2 + bmathrmN_2 rightarrow \nxmathrmCO_2 + dfracy2mathrmH_2mathrmO + bmathrmN_2","category":"page"},{"location":"WallyToolbox/thermochemistry/","page":"Thermochemistry","title":"Thermochemistry","text":"Because for HFO representation will generally provide sulfur and nitrogen, the oxidation of these elements may be included in the balance and the previous reaction can be modified to:","category":"page"},{"location":"WallyToolbox/thermochemistry/","page":"Thermochemistry","title":"Thermochemistry","text":"1mathrmC_xmathrmH_ymathrmO_zmathrmN_nmathrmS_s \n+ amathrmO_2 \n+ bmathrmN_2\n\nrightarrow\n\nxmathrmCO_2 \n+ smathrmSO_2\n+ nmathrmNO\n+ dfracy2mathrmH_2mathrmO\n+ bmathrmN_2","category":"page"},{"location":"WallyToolbox/thermochemistry/","page":"Thermochemistry","title":"Thermochemistry","text":"Each element in carbon, hydrogen, sulfur, and nitrogen is present in a single oxide (here we assume mathrmN_2 does not participate in oxidation, what would require equilibrium calculations with an enthalpy of formation of the empirical fuel that is generally unavailable - otherwise we would use the actual molecular representation of the substance), and balancing the right-hand side of the equation is trivial; one can derive the value of a that remains compatible with oxygen content in fuel as:","category":"page"},{"location":"WallyToolbox/thermochemistry/","page":"Thermochemistry","title":"Thermochemistry","text":"a = dfrac12left(2x+2s+n+dfracy2-zright)","category":"page"},{"location":"WallyToolbox/thermochemistry/","page":"Thermochemistry","title":"Thermochemistry","text":"With this value it is trivial to find out the required mass flow rate of oxidizer. This is implemented in oxidizer_mass_flow_rate as documented below. Notice that this function will fail if one of the required elements in the above equation is missing. The presence of nitrogen oxides and sulfur is fuel is neglected in this calculations and one must assess whether they should be considered in a certain analysis prior to using this function.","category":"page"},{"location":"WallyToolbox/thermochemistry/","page":"Thermochemistry","title":"Thermochemistry","text":"WallyToolbox.oxidizer_mass_flow_rate","category":"page"},{"location":"WallyToolbox/thermochemistry/#WallyToolbox.oxidizer_mass_flow_rate","page":"Thermochemistry","title":"WallyToolbox.oxidizer_mass_flow_rate","text":"oxidizer_mass_flow_rate(f::EmpiricalFuel; y_o2 = 0.23)\n\nComputes the required amount of oxidizer to perform complete combustion of 1 kg provided empirical fuel. The value of y_o2 represents the mass fraction of oxygen in oxidizer; default value is typical for air.\n\njulia> fuel = EmpiricalFuel([0.937, 0.063, 0.0]; scaler=:C=>10);\n\njulia> oxidizer_mass_flow_rate(fuel)\n13.02691759229764\n\n\n\n\n\n","category":"function"},{"location":"WallyToolbox/thermochemistry/#Heavy-fuel-oils","page":"Thermochemistry","title":"Heavy fuel-oils","text":"","category":"section"},{"location":"WallyToolbox/thermochemistry/","page":"Thermochemistry","title":"Thermochemistry","text":"Combustion of heavy-fuel oils (HFO) is discussed in detail by Lawn1987 [3]. Some relations that might be useful for the industrial combustion specialist are under implementation here to be integrated in larger models e.g. using DryFlowsheet, or simple calculations.","category":"page"},{"location":"WallyToolbox/thermochemistry/","page":"Thermochemistry","title":"Thermochemistry","text":"WallyToolbox.hfo_empirical_formula\nWallyToolbox.hfo_specific_heat\nWallyToolbox.hfo_enthalpy_net_bs2869","category":"page"},{"location":"WallyToolbox/thermochemistry/#WallyToolbox.hfo_empirical_formula","page":"Thermochemistry","title":"WallyToolbox.hfo_empirical_formula","text":"hfo_empirical_formula(Y; scaler = nothing)\n\nWrapper for EmpiricalFuel ensuring all HFO instances are created with all typical elements, say C, H, O, N, and S, provided in this same order.\n\n\n\n\n\n","category":"function"},{"location":"WallyToolbox/thermochemistry/#WallyToolbox.hfo_specific_heat","page":"Thermochemistry","title":"WallyToolbox.hfo_specific_heat","text":"hfo_specific_heat(T::Float64, S::Float64)::Float64\n\nHeavy fuel-oil specific heat estimation in terms of relative density S as provided by Cragoe (1929). Temperature in kelvin.\n\n\n\n\n\n","category":"function"},{"location":"WallyToolbox/thermochemistry/#WallyToolbox.hfo_enthalpy_net_bs2869","page":"Thermochemistry","title":"WallyToolbox.hfo_enthalpy_net_bs2869","text":"hfo_enthalpy_net_bs2869(;\n ρ::Float64,\n x::Float64,\n y::Float64,\n s::Float64\n)::Float64\n\nHeavy fuel-oil net energy capacity accordinto to BS2869:1983. Value is computed in [MJ/kg]. Parameters are given as:\n\nρ: HFO density at 15 °C, [kg/m³].\nwater: Mass percentage of water, [%].\nash: Mass percentage of ashes, [%].\nsulphur: Mass percentage of sulphur, [%].\n\njulia> hfo_enthalpy_net_bs2869(; ρ = 1020.0, water = 0.1, ash = 0.05, sulphur = 1.0)\n40.13509836320001\n\n\n\n\n\n","category":"function"},{"location":"WallyToolbox/thermochemistry/#Discrete-phase-model","page":"Thermochemistry","title":"Discrete phase model","text":"","category":"section"},{"location":"WallyToolbox/thermochemistry/","page":"Thermochemistry","title":"Thermochemistry","text":"WallyToolbox.fit_rosinrammler\nWallyToolbox.plot_rosinrammler","category":"page"},{"location":"WallyToolbox/thermochemistry/#WallyToolbox.fit_rosinrammler","page":"Thermochemistry","title":"WallyToolbox.fit_rosinrammler","text":"fit_rosinrammler(d₀, P₀; m=3.5)\n\nFind parameter for particle size distribution with Weibull distribution, often called after Rosin-Rammler in the field of particles - based on characteristic size and associated cumulative density function (CDF) value. Parameter d₀ is the droplet size at which Weibull CDF evaluates to probability P₀. The value of m is generally recommended for a certain technology; a common value is provided by default.\n\n\n\n\n\n","category":"function"},{"location":"WallyToolbox/thermochemistry/#WallyToolbox.plot_rosinrammler","page":"Thermochemistry","title":"WallyToolbox.plot_rosinrammler","text":"Display Rosin-Rammler distribution and optionally reference data.\n\n\n\n\n\n","category":"function"},{"location":"Computing/03-Programming-Languages/#Programming","page":"Programming","title":"Programming","text":"","category":"section"},{"location":"Computing/03-Programming-Languages/","page":"Programming","title":"Programming","text":"Those new to programming can find a quite interesting environment at Exercism.","category":"page"},{"location":"Computing/03-Programming-Languages/#C","page":"Programming","title":"C++","text":"","category":"section"},{"location":"Computing/03-Programming-Languages/#Cuda","page":"Programming","title":"Cuda","text":"","category":"section"},{"location":"Computing/03-Programming-Languages/","page":"Programming","title":"Programming","text":"GPU-optimized AI, Machine Learning, & HPC Software | NVIDIA NGC","category":"page"},{"location":"Computing/03-Programming-Languages/#Fortran","page":"Programming","title":"Fortran","text":"","category":"section"},{"location":"Computing/03-Programming-Languages/#Haskell","page":"Programming","title":"Haskell","text":"","category":"section"},{"location":"Computing/03-Programming-Languages/","page":"Programming","title":"Programming","text":"GHCup\nHaskell for Numerics?\nCourse by Dmitrii Kovanikov","category":"page"},{"location":"Computing/03-Programming-Languages/#Lisp","page":"Programming","title":"Lisp","text":"","category":"section"},{"location":"Computing/03-Programming-Languages/#Octave","page":"Programming","title":"Octave","text":"","category":"section"},{"location":"Computing/03-Programming-Languages/#OpenCL","page":"Programming","title":"OpenCL","text":"","category":"section"},{"location":"Computing/03-Programming-Languages/#Pascal","page":"Programming","title":"Pascal","text":"","category":"section"},{"location":"Computing/03-Programming-Languages/","page":"Programming","title":"Programming","text":"Free Pascal Docs\nFree Pascal Wiki\nPascal Wikibook","category":"page"},{"location":"Computing/03-Programming-Languages/#Python","page":"Programming","title":"Python","text":"","category":"section"},{"location":"Computing/03-Programming-Languages/","page":"Programming","title":"Programming","text":"General stuff:","category":"page"},{"location":"Computing/03-Programming-Languages/","page":"Programming","title":"Programming","text":"8 surprising ways how to use Jupyter Notebook","category":"page"},{"location":"Computing/03-Programming-Languages/","page":"Programming","title":"Programming","text":"Some (yet crude) visual programming in Python:","category":"page"},{"location":"Computing/03-Programming-Languages/","page":"Programming","title":"Programming","text":"Barfi\nnodezator","category":"page"},{"location":"Computing/03-Programming-Languages/","page":"Programming","title":"Programming","text":"All you need is a package:","category":"page"},{"location":"Computing/03-Programming-Languages/","page":"Programming","title":"Programming","text":"casadi: Optimal control and MPC.\nmip: Mixed-integer linear programming.","category":"page"},{"location":"Computing/03-Programming-Languages/#Rust","page":"Programming","title":"Rust","text":"","category":"section"},{"location":"Computing/03-Programming-Languages/","page":"Programming","title":"Programming","text":"Rust community often organizes books on the main topics regarding the language:","category":"page"},{"location":"Computing/03-Programming-Languages/","page":"Programming","title":"Programming","text":"Rust Book\nThe Cargo Book\nThe rustup book\nRust Cookbook","category":"page"},{"location":"Computing/03-Programming-Languages/","page":"Programming","title":"Programming","text":"Some resources for learning Rust (start with rustlings):","category":"page"},{"location":"Computing/03-Programming-Languages/","page":"Programming","title":"Programming","text":"rustlings\nRust By Example\nRust Playground","category":"page"},{"location":"Computing/03-Programming-Languages/","page":"Programming","title":"Programming","text":"Useful links for working with cargo:","category":"page"},{"location":"Computing/03-Programming-Languages/","page":"Programming","title":"Programming","text":"Bundle Cargo\nThe Manifest Format","category":"page"},{"location":"Computing/03-Programming-Languages/","page":"Programming","title":"Programming","text":"Useful links for doing numerical stuff in Rust:","category":"page"},{"location":"Computing/03-Programming-Languages/","page":"Programming","title":"Programming","text":"Vec in std::vec - Rust\nplotters","category":"page"},{"location":"Computing/03-Programming-Languages/#Scilab","page":"Programming","title":"Scilab","text":"","category":"section"},{"location":"Computing/03-Programming-Languages/#Other-materials","page":"Programming","title":"Other materials","text":"","category":"section"},{"location":"Computing/03-Programming-Languages/","page":"Programming","title":"Programming","text":"Why Futhark?","category":"page"},{"location":"References/@Ranz1952/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Ranz1952/","page":"-","title":"-","text":"title: Evaporation from drops authors: W. Ranz, W. Marshall year: 1952 –-","category":"page"},{"location":"References/@Garaniya2012b/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Garaniya2012b/","page":"-","title":"-","text":"title: Heavy fuel oil combustion modelling using continuous thermodynamics authors: Vikram Garaniya, Laurie Goldsworthy year: 2012 DOI: https://doi.org/10.5988/jime.47.871 Drive: https://1drv.ms/b/s!Ar4x-UlrYAiZlbEigrD3idko7FKcyQ?e=lNld2R –-","category":"page"},{"location":"Modules/DryGranular/#DryGranular","page":"DryGranular","title":"DryGranular","text":"","category":"section"},{"location":"Modules/DryGranular/","page":"DryGranular","title":"DryGranular","text":"CurrentModule = DryGranular\nDocTestSetup = quote\n using Statistics\n using DryGranular\nend\nEditURL = \"https://github.com/wallytutor/WallyToolbox.jl/blob/main/docs/src/Modules/DryGranular.md\"","category":"page"},{"location":"Modules/DryGranular/#General-porous-media","page":"DryGranular","title":"General porous media","text":"","category":"section"},{"location":"Modules/DryGranular/","page":"DryGranular","title":"DryGranular","text":"Modeling of geometrical characteristics of porous beds is required for including both their thermal effect or role over chemistry in chemical reactors. A classical approach used in several commercial and open source tools is that of Gunn1978 [9]. In what follows we develop the ideas that lead to an analogous model which is implemented by this structure.","category":"page"},{"location":"Modules/DryGranular/","page":"DryGranular","title":"DryGranular","text":"To build the model we will assume a reactor of constant rectangular cross-section A_r=bw and volume V_R=bwh. Its cross-section perimeter is then P_R=2(b+w). Inside this reactor we randomly pack cubic particles beta of surface area A_beta=6l_beta^2 and volume V_beta=l_beta^3 at a porosity level phi. Thus the total volume of solids inside the reactor is V_S=(1-phi)V_R and the approximate number of particles N=fracV_SV_beta. Following a similar reasoning the total surface area of particles is A_S=NA_beta. Performing all the substitutions so far one finds the following expression","category":"page"},{"location":"Modules/DryGranular/","page":"DryGranular","title":"DryGranular","text":"A_S=frac6(1-phi)bwhl_beta","category":"page"},{"location":"Modules/DryGranular/","page":"DryGranular","title":"DryGranular","text":"Since the differential dA=Pdl holds for the surface of a body over its length l, one can divide the above expression by the reactor length to get the perimeter of particles in a cross-section. We can further divide by the cross-section area itself and find the perimeter density which is a more general result, and find the expression proposed by Gunn1978 [9]. This result is summarized in the next equation where the subscript of particle size was dropped for generality.","category":"page"},{"location":"Modules/DryGranular/","page":"DryGranular","title":"DryGranular","text":"P = frac6(1-phi)l","category":"page"},{"location":"Modules/DryGranular/","page":"DryGranular","title":"DryGranular","text":"An estimator of the number of channels per unit cross-section of reactor N can be related to the porosity through NpiR^2=phi. Because the above perimeter is shared between the fluid volume and solids, it holds that N2piR=P. Using these expressions one can solve for the porosity channels characteristic radius R as given below, which is also a result reported by Gunn1978 [9].","category":"page"},{"location":"Modules/DryGranular/","page":"DryGranular","title":"DryGranular","text":"R=fracphil3(1-phi)","category":"page"},{"location":"Modules/DryGranular/","page":"DryGranular","title":"DryGranular","text":"This model is probided in PackedBedPorosityDescriptor.","category":"page"},{"location":"Modules/DryGranular/","page":"DryGranular","title":"DryGranular","text":"DryGranular.PackedBedPorosityDescriptor","category":"page"},{"location":"Modules/DryGranular/#DryGranular.PackedBedPorosityDescriptor","page":"DryGranular","title":"DryGranular.PackedBedPorosityDescriptor","text":"Provides description of porosity parameters with stochastic behavior.\n\nϕ::Union{Float64, Vector{Float64}}: Porosity volume fraction in medium [-].\nl::Union{Float64, Vector{Float64}}: Characteristic particle size in medium [m].\nσϕ::Union{Nothing, Float64}: Optional standard deviation of porosity volume fraction [-].\nσl::Union{Nothing, Float64}: Optional standard deviation of characteristic particle size [m].\nP::Union{Float64, Vector{Float64}}: Perimeter in reactor cross-section [m].\nD::Union{Float64, Vector{Float64}}: Characteristic diameter of porosity channels [m].\nA::Float64: Reactor area used for scaling perimeter [m²].\n\n\n\n\n\n","category":"type"},{"location":"Modules/DryGranular/","page":"DryGranular","title":"DryGranular","text":"PackedBedPorosityDescriptor can be used to describe the geometry of exchange section of a packed bed for a single set of arguments.","category":"page"},{"location":"Modules/DryGranular/","page":"DryGranular","title":"DryGranular","text":"julia> PackedBedPorosityDescriptor(; ϕ = 0.65, l = 0.10, area = 1.0)\nPackedBedPorosityDescriptor(P = 21.000000 m, D = 0.123810 m)","category":"page"},{"location":"Modules/DryGranular/","page":"DryGranular","title":"DryGranular","text":"It can also be used to describe randomly varying reactors, what is a more realistic thing to do when using this structure to simulate real world systems.","category":"page"},{"location":"Modules/DryGranular/","page":"DryGranular","title":"DryGranular","text":"julia> PackedBedPorosityDescriptor(;\n ϕ = 0.65, l = 0.10,\n σϕ = 0.03, σl = 0.01,\n N = 2,\n ϕlims = (0.4, 0.8),\n llims = (0.0, 0.3),\n seed = 42,\n area = 1.0\n )\nPackedBedPorosityDescriptor(\n P from 21.455749 m to 24.370742 m\n D from 0.125589 m to 0.102353 m\n)","category":"page"},{"location":"Modules/DryGranular/#Rotary-kiln-models","page":"DryGranular","title":"Rotary kiln models","text":"","category":"section"},{"location":"Modules/DryGranular/","page":"DryGranular","title":"DryGranular","text":"In a rotary kiln as proposed by Kramers1952 [10]. Its goal is to be used as a process support tool or to integrate more complex models requiring integration of the bed profile. In its classical statement, the bed height profile h(z) can be evaluated from volume of flowing material conservation through the following equations. Coordinate z=0 represents the discharge position where initial condition must be applied. This is given by the dam height, if any, or particle size.","category":"page"},{"location":"Modules/DryGranular/","page":"DryGranular","title":"DryGranular","text":"beginaligned\ndfracdhdz = C₁ leftfrachRleft(2 - frachRright)right^-frac32 - C₂6pt\nC₁ = frac34dfracΦtanγπ R^3 ω6pt\nC₂ = dfractanβcosγ\nendaligned","category":"page"},{"location":"Modules/DryGranular/","page":"DryGranular","title":"DryGranular","text":"The structure SymbolicLinearKramersModel implements the Kramers' ordinary differential equation for prediction of bed height profile in a rotary kiln. This equation is implemented under the formalism of ModelingToolkit.","category":"page"},{"location":"Modules/DryGranular/","page":"DryGranular","title":"DryGranular","text":"DryGranular.SymbolicLinearKramersModel","category":"page"},{"location":"Modules/DryGranular/#DryGranular.SymbolicLinearKramersModel","page":"DryGranular","title":"DryGranular.SymbolicLinearKramersModel","text":"Creates a reusable linear Kramers model for rotary kiln simulation.\n\nR::Symbolics.Num: Symbolic kiln internal radius\nΦ::Symbolics.Num: Symbolic kiln feed rate\nω::Symbolics.Num: Symbolic kiln rotation rate\nβ::Symbolics.Num: Symbolic kiln slope\nγ::Symbolics.Num: Symbolic solids repose angle\nz::Symbolics.Num: Symbolic kiln axial coordinates\nh::Symbolics.Num: Symbolic bed height profile\nsys::ModelingToolkit.ODESystem: Problem ordinary differential equation\n\n\n\n\n\n","category":"type"},{"location":"Modules/DryGranular/","page":"DryGranular","title":"DryGranular","text":"For integration of this model we implement RotaryKilnBedSolution. It provides the solved description of a rotary kiln bed geometry computed from the solution of bed height along the kiln length. The main goal of the quantities computed here is their use with heat and mass transfer models for the simulation of rotary kiln process. A simple post-processing utilitiy plotlinearkramersmodel is also provided.","category":"page"},{"location":"Modules/DryGranular/","page":"DryGranular","title":"DryGranular","text":"DryGranular.RotaryKilnBedSolution\nDryGranular.plotlinearkramersmodel","category":"page"},{"location":"Modules/DryGranular/#DryGranular.RotaryKilnBedSolution","page":"DryGranular","title":"DryGranular.RotaryKilnBedSolution","text":"General geometric description of a bed from Kramers equation solution.\n\nz::Vector{Float64}: Solution coordinates [m]\nh::Vector{Float64}: Solution bed height [m]\nθ::Vector{Float64}: View angle from kiln center [rad]\nl::Vector{Float64}: Bed-freeboard cord length [m]\nA::Vector{Float64}: Local bed cross section area [m²]\nη::Vector{Float64}: Local loading based on height [-]\nηₘ::Float64: Mean loading of kiln [%]\nV::Float64: Bed integral volume [m³]\nτ::Float64: Residence time of particles\nβ::Float64: Kiln slope [rad]\n\nArguments\n\nInternal elements are initialized through the following constructor:\n\nRotaryKilnBedSolution(z, h, β, R, Φ)\n\nWhere parameters are given as:\n\nz: solution coordinates over length, [m].\nh: bed profile solution over length, [m].\nR: kiln internal radius, [m].\nΦ: kiln feed rate, [m³/s].\n\nAn outer constructor is also provided for managing the integration of an instance of SymbolicLinearKramersModel. This is the recommended usage that is illustrated below.\n\nImportant: inputs must be provided in international system (SI) units as a better physical practice. The only exception is the rotation rate ω provided in revolution multiples. If the discharge end is held by a dam, its height must be provided instead of the particle size, as it is used as the ODE initial condition.\n\nmodel: a symbolic kiln model.\nL: kiln length, [m].\nR: kiln internal radius, [m].\nΦ: kiln feed rate, [m³/s].\nω: kiln rotation rate, [rev/s].\nβ: kiln slope, [rad].\nγ: solids repose angle, [rad].\nd: particle size or dam height, [m].\nsolver: Solver for DifferentialEquations. Defaults to Tsit5.\nrtol: Relative integration tolerance. Defaults to 1.0e-08.\natol: Absolute integration tolerance. Defaults to 1.0e-08.\n\n\n\n\n\n","category":"type"},{"location":"Modules/DryGranular/#DryGranular.plotlinearkramersmodel","page":"DryGranular","title":"DryGranular.plotlinearkramersmodel","text":"plotlinearkramersmodel(\n model::RotaryKilnBedSolution;\n normz::Bool = false,\n normh::Bool = false\n)::Figure\n\nStandardized plotting of RotaryKilnBedSolution bed profile. It supports normalization of axes throught keywords normz for axial coordinate and normh for bed depth.\n\n\n\n\n\n","category":"function"},{"location":"Modules/DryGranular/","page":"DryGranular","title":"DryGranular","text":"Data in next example is an SI conversion of an example from Kramers1952 [10].","category":"page"},{"location":"Modules/DryGranular/","page":"DryGranular","title":"DryGranular","text":"julia> L = 13.715999999999998; # Kiln length [m]\n\njulia> D = 1.8897599999999999; # Kiln diameter [m]\n\njulia> β = 2.3859440303888126; # Kiln slope [°]\n\njulia> γ = 45.0; # Repose angle [°]\n\njulia> d = 1.0; # Particle/dam size [mm]\n\njulia> Φ = 10.363965852671996; # Feed rate [m³/h]\n\njulia> ω = 3.0300000000000002; # Rotation rate [rev/min]\n\njulia> bed = RotaryKilnBedSolution(;\n model = SymbolicLinearKramersModel(),\n L = L,\n R = D / 2.0,\n Φ = Φ / 3600.0,\n ω = ω / 60.0,\n β = deg2rad(β),\n γ = deg2rad(γ),\n d = d / 1000.0\n );\n\njulia> bed\nRotaryKilnBedSolution(τ = 13.169938 min, ηₘ = 5.913271 %)\n\njulia> bed.τ\n790.1963002204403","category":"page"},{"location":"Modules/DryGranular/","page":"DryGranular","title":"DryGranular","text":"In the following dummy example we force a very thick analytical bed solution, filling the radius of the rotary drum. ","category":"page"},{"location":"Modules/DryGranular/","page":"DryGranular","title":"DryGranular","text":"julia> R = 1.0e+00;\n\njulia> Φ = 1.0e-02;\n\njulia> z = collect(0.0:0.1:10.0);\n\njulia> h = R * ones(size(z));\n\njulia> Aₐ = π * R^2 / 2;\n\njulia> Vₐ = Aₐ * z[end];\n\njulia> bed = RotaryKilnBedSolution(z, h, 0, R, Φ)\nRotaryKilnBedSolution(τ = 26.179939 min, ηₘ = 50.000000 %)","category":"page"},{"location":"Modules/DryGranular/","page":"DryGranular","title":"DryGranular","text":"Next we confirm the internal evaluations of the model match the expected analytical values.","category":"page"},{"location":"Modules/DryGranular/","page":"DryGranular","title":"DryGranular","text":"julia> mean(bed.θ) ≈ π\ntrue\n\njulia> mean(bed.l) ≈ 2R\ntrue\n\njulia> mean(bed.A) ≈ Aₐ\ntrue\n\njulia> mean(bed.η) ≈ 0.5\ntrue\n\njulia> bed.ηₘ ≈ 50.0\ntrue\n\njulia> bed.V ≈ Vₐ\ntrue\n\njulia> bed.τ ≈ Vₐ / Φ\ntrue","category":"page"},{"location":"Modules/DryGranular/","page":"DryGranular","title":"DryGranular","text":"Validation of Kramers' model is provided here.","category":"page"},{"location":"Modules/DryGranular/","page":"DryGranular","title":"DryGranular","text":"Finally a set of basic equations provided for process analysis.","category":"page"},{"location":"Modules/DryGranular/","page":"DryGranular","title":"DryGranular","text":"DryGranular.sullivansηₘ\nDryGranular.dimlessNΦ\nDryGranular.dimlessNₖ\nDryGranular.perryresidence\nDryGranular.kramersnlapprox","category":"page"},{"location":"Modules/DryGranular/#DryGranular.sullivansηₘ","page":"DryGranular","title":"DryGranular.sullivansηₘ","text":"Sullivans approximation to kiln filling.\n\n\n\n\n\n","category":"function"},{"location":"Modules/DryGranular/#DryGranular.dimlessNΦ","page":"DryGranular","title":"DryGranular.dimlessNΦ","text":"Kramers (1952) dimensionless group NΦ.\n\n\n\n\n\n","category":"function"},{"location":"Modules/DryGranular/#DryGranular.dimlessNₖ","page":"DryGranular","title":"DryGranular.dimlessNₖ","text":"Kramers (1952) dimensionless group Nₖ.\n\n\n\n\n\n","category":"function"},{"location":"Modules/DryGranular/#DryGranular.perryresidence","page":"DryGranular","title":"DryGranular.perryresidence","text":"Compute residence time from Perry's equation.\n\n\n\n\n\n","category":"function"},{"location":"Modules/DryGranular/#DryGranular.kramersnlapprox","page":"DryGranular","title":"DryGranular.kramersnlapprox","text":"Nonlinear formulation of Kramers model approximate solution.\n\n\n\n\n\n","category":"function"},{"location":"References/@Wang2023a/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Wang2023a/","page":"-","title":"-","text":"title: \"Auto-PINN: Understanding and optimizing physics-informed neural architecture\" authors: Yicheng Wang, Xiaotian Han, Chia-Yuan Chang, Daochen Zha, Ulisses Braga-Neto, Xia Hu year: 2023 URL: https://doi.org/10.48550/arXiv.2205.13748 Drive: https://1drv.ms/b/s!Ar4x-UlrYAiZla8gKwrbEVbpOVfBQg?e=5kcaTy –-","category":"page"},{"location":"References/@Yu2022a/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Yu2022a/","page":"-","title":"-","text":"title: Gradient-enhanced physics-informed neural networks for forward and inverse PDE problems authors: Jeremy Yu, Lu Lu, Xuhui Meng, George Em Karniadakis year: 2022 URL: https://doi.org/10.48550/arXiv.2111.02801 Drive: https://1drv.ms/b/s!Ar4x-UlrYAiZla8fqTeJApcwO8Ng?e=lpsaxB –-","category":"page"},{"location":"Science/08-Conductivity-Porous-Solids/#Thermal-conductivity-of-porous-solids","page":"Porous Solids","title":"Thermal conductivity of porous solids","text":"","category":"section"},{"location":"Science/08-Conductivity-Porous-Solids/","page":"Porous Solids","title":"Porous Solids","text":"Porous solids are characterized by the presence of voidance; they may be formed, for instance, through the sintering of particles with a given size distribution or through a foaming process. The former will lead to pores presenting a mostly convex geometry due to particle-particle contacts of while the latter leads to concave pores, generally due to former gas bubbles during foaming process; these morphologies and the scale of porosity will lead to a broad range of properties in macroscopic behavior of materials. Other features related to the porosity might include the communicating character of pores or the validity of continuum mechanics in a given problem due to pore sizes. This subject has been treated by scholars of many fields because of its relevance to industrial processes, heat transfer in furnaces, biological systems, and more recently in heat storage and recovery devices, not to try to be exhaustive here; specific citations come next.","category":"page"},{"location":"Science/08-Conductivity-Porous-Solids/","page":"Porous Solids","title":"Porous Solids","text":"In what follows we will briefly review some of the afore mentioned applications and historical developments in the field before tackling the problem of modeling heat transfer in arbitrary materials. The goal of our literature review is to determine the limits of applicability and how well accepted are the available methods proposed in the past, but also to identify potential use cases of computational methods in materials design before proposing our own scenarios. The study will comprise situations allowing for analytical solution for solver validation, reproduction of previous published results, and the modeling of arbitrary solids. Unless stated otherwise, numerical studies in two and three dimensions are carried out with Elmer Malinen2013a [58] finite element method (FEM) solver. Additional simulations with pore filling with inclusions are also included in the study, providing a basis for composite materials. A database of predicted materials properties is composed for future studies.","category":"page"},{"location":"Science/08-Conductivity-Porous-Solids/#Literature-survey","page":"Porous Solids","title":"Literature survey","text":"","category":"section"},{"location":"Science/08-Conductivity-Porous-Solids/","page":"Porous Solids","title":"Porous Solids","text":"Masamune1963a [59]: studied the role of gas pressure below and up to atmospheric pressure over the effective thermal conductivity k_e of a bed of spherical particles by carrying out measurements at 42 °C; mechanisms of heat transfer can be classified as transport through (1) conduction and radiation in voids, (2) effective solid-path and gas-path lengths, and (3) solid conduction through contacts. Although the authors acknowledge the role of radiation in heat transfer, it is not included in their expression, but low Knudsen number effects were considered for thermal conductivity when necessary by considering a pressure dependence in gas thermal conductivity k_g^star.\nLuikov1968a [60]:\nKoh1971a [61]:\nKoh1973a [62]:\nFiedler2006a [63]:\nFiedler2007a [64]:\nFiedler2009a [65]:\nSmith2013a [66]:\nCheilytko2016a [67]:\nPia2016a [68]:\nQiu2018a [69]:\nChikhi2020a [70]:\nMraz2021a [71]:","category":"page"},{"location":"Science/08-Conductivity-Porous-Solids/#Experimental-design","page":"Porous Solids","title":"Experimental design","text":"","category":"section"},{"location":"Science/08-Conductivity-Porous-Solids/","page":"Porous Solids","title":"Porous Solids","text":"No. Case Status Goal\n1 Analytical solution of dense, k=k_ref \n2 Analytical solution of dense, k=k_ref-bT \n3 Simulation of dense, k=k_ref \n4 Simulation of dense, k=k_ref-bT \n5 ","category":"page"},{"location":"Science/08-Conductivity-Porous-Solids/#Summary-of-results","page":"Porous Solids","title":"Summary of results","text":"","category":"section"},{"location":"References/@Hristov2023/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Hristov2023/","page":"-","title":"-","text":"title: \"Transient heat conduction with variable thermophysical properties power-law temperature-depenent heat capacity and thermal conductivity\" authors: Jordan Hristov year: 2023 –-","category":"page"},{"location":"References/@Hristov2023/","page":"-","title":"-","text":"Take care, paper content is poor and full of typos!\nDerivation for semi-infinite media\nTemperature dependent heat capacity\nCan we really say h=rhoc_pT in all cases?\nArgument about lack of exponents in literature is poor. In fact data is fitted to polynomials mainly because simple exponentials as proposed by the author would not properly represent experimental data in most cases (and certainly not fit Calphad requirements)!","category":"page"},{"location":"References/@Hanein2017/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Hanein2017/","page":"-","title":"-","text":"title: \"One-dimensional steady-state thermal model for rotary kilns used in the manufacture of cement\" authors: Theodore Hanein, Frederik P. Glasser, Marcus N. Bannerman year: 2017 –-","category":"page"},{"location":"Computing/01-Scientific-Computing/#Scientific-Computing","page":"Scientific Computing","title":"Scientific Computing","text":"","category":"section"},{"location":"Computing/01-Scientific-Computing/","page":"Scientific Computing","title":"Scientific Computing","text":"Notes related to my learning and teaching interests in several fields related to scientific computing (mostly applied mathematics and machine learning) and related applications. This home page is the entry point and those interested in more content and interesting links can use the sidebar with an index to the materials.","category":"page"},{"location":"Computing/01-Scientific-Computing/","page":"Scientific Computing","title":"Scientific Computing","text":"It can also be used as a general guide for introducing scientific computing as it tries to introduce the minimal skill set any scientific computing engineer or scientist should have:","category":"page"},{"location":"Computing/01-Scientific-Computing/","page":"Scientific Computing","title":"Scientific Computing","text":"Version control comes first, everything else is worthless without it, currently that means Git.\nNext comes software documentation with Doxygen, Sphinx, and/or Documenter.jl.\nA low(er) level programming language among C, C++, and Fortran, preferably all of them.\nScripting languages, as of 2024, Python is mandatory, Julia highly recommended.\nBasic machine learning in one of the above scripts, everything is ML these days.\nShell automation, basis of both Bash/other UNIX shell and PowerShell are required.\nTypesetting equations reports and presentations (beamer) in LaTeX.\nDomain specific skills related to the field of study (CFD, DFT, MD, ML, ...).","category":"page"},{"location":"Computing/01-Scientific-Computing/","page":"Scientific Computing","title":"Scientific Computing","text":"Some technologies have been mainstream or important in the past, but nowadays some of them have already died or are becoming too niche to be put in such a list. That is the case of SVN for version control. As for programming languages in science, that is the case of matlabish (MATLAB, Octave, Scilab) environments, which are still used by controls and automation people, but are mostly incompatible with good software practices and should be discouraged.","category":"page"},{"location":"Computing/01-Scientific-Computing/","page":"Scientific Computing","title":"Scientific Computing","text":"It is also worth getting familiar with high-performance computing (HPC); in the Top 500 page you can get to know the most powerful computers on Earth. The specification benchmarking page allows for the check of hardware specification, what is interesting when preparing investment in a computing structure. Lastly, when working in multi-user systems it is worth knowing about job management systems such as Slurm.","category":"page"},{"location":"Computing/01-Scientific-Computing/","page":"Scientific Computing","title":"Scientific Computing","text":"As a last word, I would like to remember that it is humanly impossible to master everything at once; even after more than 10 years in the field as of today I only have a grasp in the tools I do not use everyday. Software and methods evolve, and unless you keep using a specific tool you simply cannot afford to keep up to date with it. That should not be a roadblock for a scientist in the long term. As you get used to scientific software, getting back to a good level of some tool you used in the past is quick (but not extremely fast in some cases) and learning new tools for which you already know the science behind is trivial. Even exploring new fields become easy in some cases.","category":"page"},{"location":"Notes/read/","page":"-","title":"-","text":"[[@Shirzad2023]]\n[[@Nakayama2023]]\nMojo\nScientific Computing in Rust 2024\ncrates.io\nRustPython\nJulia To Rust\njlrs","category":"page"},{"location":"Notes/read/","page":"-","title":"-","text":"[ ] Model Predictive Control (MPC) with JuliaSim and ModelingToolkit | 2022 DigiWell Julia Seminar\n[ ] Introduction to Probability\n[ ] VIM sheet\n[ ] Matrix Methods for Signal Processing, Data Analysis and Machine Learning, F24, Prof. Jeff Fessler\n[ ] Precompilation tutorial","category":"page"},{"location":"References/@Wurth2023a/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Wurth2023a/","page":"-","title":"-","text":"title: Physics-informed neural networks for data-free surrogate modelling and engineering optimization – An example from composite manufacturing authors: Tobias Würth, Constantin Krauß, Clemens Zimmerling, Luise Kärger year: 2023 URL: https://doi.org/10.5445/IR/1000159290 Drive: https://1drv.ms/b/s!Ar4x-UlrYAiZla5XEQtEiYnlp5ggtA?e=6TW8va –-","category":"page"},{"location":"References/@Wurth2023a/","page":"-","title":"-","text":"PINNs are alternative to SBO methods\nReference 6: one NN per output\nUsed same weight for all losses (domain, B.C., I.C.)\nNNs provide automatic jacobian and hessian evaluations, what can be used for great benefit of optimization algorithms\nImplemented in SciANN [[@Haghighat2021sciann]] wrapper to [[@Tensorflow2015Whitepaper]]\nSolves the diffusion equation\nKamal-Malkin model can be seem as a more general parametrization as JMKA rightarrow maybe useful in cement hydration modeling?\nInteresting to write a tutorial about!","category":"page"},{"location":"WallyToolbox/constants/#Constants","page":"Constants","title":"Constants","text":"","category":"section"},{"location":"WallyToolbox/constants/","page":"Constants","title":"Constants","text":"EditURL = \"https://github.com/wallytutor/WallyToolbox.jl/blob/main/docs/src/WallyToolbox/constants.md\"\nCurrentModule = WallyToolbox\nDocTestSetup = quote\n using WallyToolbox\nend","category":"page"},{"location":"WallyToolbox/constants/#Physical-constants","page":"Constants","title":"Physical constants","text":"","category":"section"},{"location":"WallyToolbox/constants/","page":"Constants","title":"Constants","text":"WallyToolbox.GAS_CONSTANT\nWallyToolbox.STEFAN_BOLTZMANN","category":"page"},{"location":"WallyToolbox/constants/#WallyToolbox.GAS_CONSTANT","page":"Constants","title":"WallyToolbox.GAS_CONSTANT","text":"Ideal gas constant [8.31446261815324 [J/(mol.K)].\n\n\n\n\n\n","category":"constant"},{"location":"WallyToolbox/constants/#WallyToolbox.STEFAN_BOLTZMANN","page":"Constants","title":"WallyToolbox.STEFAN_BOLTZMANN","text":"Stefan-Boltzmann constant [5.670374419e-8 W/(m².K⁴)].\n\n\n\n\n\n","category":"constant"},{"location":"WallyToolbox/constants/#Reference-states","page":"Constants","title":"Reference states","text":"","category":"section"},{"location":"WallyToolbox/constants/","page":"Constants","title":"Constants","text":"WallyToolbox.T_REF\nWallyToolbox.P_REF\nWallyToolbox.C_REF","category":"page"},{"location":"WallyToolbox/constants/#WallyToolbox.T_REF","page":"Constants","title":"WallyToolbox.T_REF","text":"Normal atmospheric temperature [273.15 K].\n\n\n\n\n\n","category":"constant"},{"location":"WallyToolbox/constants/#WallyToolbox.P_REF","page":"Constants","title":"WallyToolbox.P_REF","text":"Reference atmospheric pressure [101325.0 Pa].\n\n\n\n\n\n","category":"constant"},{"location":"WallyToolbox/constants/#WallyToolbox.C_REF","page":"Constants","title":"WallyToolbox.C_REF","text":"Normal state concentration [44.61503340547032 mol/m³]. \n\n\n\n\n\n","category":"constant"},{"location":"WallyToolbox/constants/#Unit-conversion","page":"Constants","title":"Unit conversion","text":"","category":"section"},{"location":"WallyToolbox/constants/","page":"Constants","title":"Constants","text":"WallyToolbox.ZERO_CELSIUS\nWallyToolbox.ONE_ATM\nWallyToolbox.JOULE_PER_CALORIE","category":"page"},{"location":"WallyToolbox/constants/#WallyToolbox.ZERO_CELSIUS","page":"Constants","title":"WallyToolbox.ZERO_CELSIUS","text":"Zero degrees Celsius in Kelvin [273.15 K].\n\n\n\n\n\n","category":"constant"},{"location":"WallyToolbox/constants/#WallyToolbox.ONE_ATM","page":"Constants","title":"WallyToolbox.ONE_ATM","text":"Atmospheric pressure at sea level [101325.0 Pa].\n\n\n\n\n\n","category":"constant"},{"location":"WallyToolbox/constants/#WallyToolbox.JOULE_PER_CALORIE","page":"Constants","title":"WallyToolbox.JOULE_PER_CALORIE","text":"Conversion factor from calories to joules [4.184 J/cal].\n\n\n\n\n\n","category":"constant"},{"location":"WallyToolbox/constants/#Chemistry-related","page":"Constants","title":"Chemistry-related","text":"","category":"section"},{"location":"WallyToolbox/constants/","page":"Constants","title":"Constants","text":"WallyToolbox.M_AIR\nWallyToolbox.ELEMENTS","category":"page"},{"location":"WallyToolbox/constants/#WallyToolbox.M_AIR","page":"Constants","title":"WallyToolbox.M_AIR","text":"Air mean molecular mass [0.0289647 kg/mol].\n\n\n\n\n\n","category":"constant"},{"location":"WallyToolbox/constants/#WallyToolbox.ELEMENTS","page":"Constants","title":"WallyToolbox.ELEMENTS","text":"Periodic table of stable chemical elements. \n\n\n\n\n\n","category":"constant"},{"location":"References/#References","page":"References","title":"References","text":"","category":"section"},{"location":"References/","page":"References","title":"References","text":"This page contains the literature and external references cited along the toolbox documentation or supporting materials. For a full bibtex file for citing them, please check this database file.","category":"page"},{"location":"References/","page":"References","title":"References","text":"C. G. Maier and K. K. Kelley. An equation for the representation of high-temperature heat content data. Journal of the American Chemical Society 54, 3243–3246 (1932).\n\n\n\nC. H. Shomate. A method for evaluating and correlating thermodynamic data. The Journal of Physical Chemistry 58, 368–372 (1954).\n\n\n\nC. J. Lawn. Principles of combustion engineering for boilers. Combustion treatise (Academic Press, 1987). Includes bibliography and index.\n\n\n\nR. B. Bird, W. E. Stewart and E. N. Lightfoot. Transport phenomena. 2nd Edition (John Wiley and Sons, 2001).\n\n\n\nC. Balaji. Essentials of radiation heat transfer (Wiley, Chichester, 2014).\n\n\n\nA. A. Amsden, P. J. O'Rourke and T. D. Butler. KIVA-II: A computer program for chemically reactive flows with sprays (Los Alamos National Laboratory, May 1989).\n\n\n\nT. Hanein, F. P. Glasser and M. N. Bannerman. One-dimensional steady-state thermal model for rotary kilns used in the manufacture of cement. Advances in Applied Ceramics 116, 207–215 (2017).\n\n\n\nK. S. Mujumdar and V. V. Ranade. Simulation of rotary cement kilns using a one-dimensional model. Chemical Engineering Research and Design 84, 165–177 (2006).\n\n\n\nD. J. Gunn. Transfer of heat or mass to particles in fixed and fluidised beds. International Journal of Heat and Mass Transfer 21, 467–476 (1978).\n\n\n\nH. Kramers and P. Croockewit. The passage of granular solids through inclined rotary kilns. Chemical Engineering Science 1, 259–265 (1952).\n\n\n\nW. L. Grosshandler. Radcal – a narrow-band model for radiation calculations in a combustion environment (National Institute of Standards and Technology, 1993).\n\n\n\nJ. P. Gorog, J. K. Brimacombe and T. N. Adams. Radiative heat transfer in rotary kilns. Metallurgical Transactions B 12, 55–70 (1981).\n\n\n\nW. C. Tam and W. W. Yuen. OpenSC: an open-source calculation tool for combustion mixture emissivity/absorptivity (National Institute of Standards and Technology, 2019).\n\n\n\nA. B. Liu, D. Mather and R. D. Reitz. Modeling the Effects of Drop Drag and Breakup on Fuel Sprays. In: SAE Technical Paper Series, ANNUAL (SAE International, Mar 1993).\n\n\n\nR. D. Reitz and R. Diwakar. Structure of high-pressure fuel sprays. In: SAE Technical Paper Series, ANNUAL (SAE International, Feb 1987).\n\n\n\nW. Ranz and W. Marshall. Evaporation from drops. Chemical Engineering Progress 48, 141–146 (1952).\n\n\n\nA. Aissa, M. Abdelouahab, A. Noureddine, M. Elganaoui and B. Pateyron. Ranz and Marshall correlations limits on heat flow between a sphere and its surrounding gas at high temperature. Thermal Science 19, 1521–1528 (2015).\n\n\n\nB. Zuo, A. M. Gomes and C. J. Rutland. Modelling superheated fuel sprays and vaproization. International Journal of Engine Research 1, 321–336 (2000).\n\n\n\nB. Peña and C. Pérez-García. Stability of Turing patterns in the Brusselator model. Physical Review E 64, 056213 (2001).\n\n\n\nW. Sweldens. The Lifting Scheme: A Construction of Second Generation Wavelets. SIAM Journal on Mathematical Analysis 29, 511–546 (1998).\n\n\n\nJ. Jeong and F. Hussain. On the identification of a vortex. Journal of Fluid Mechanics 285, 69–94 (1995).\n\n\n\nT. Schneider and E. Stoll. Molecular-dynamics study of a three-dimensional one-component model for distortive phase transitions. Physical Review B 17, 1302–1322 (1978).\n\n\n\nG. Joos. Theoretical physics. Third Edition (Dover Publications, New York, 1986).\n\n\n\nS. V. Patankar. Numerical heat transfer and fluid flow (Taylor & Francis, 1980); p. 197.\n\n\n\nJ. Crank and P. Nicolson. A practical method for Numerical evaluation of solutions of partial differential equations of the heat-conduction type. Advances in Computational Mathematics 6, 207–226 (1996), reprinted from Proc. Camb. Phil. Soc. 43 (1947) 50-67.\n\n\n\nJ. Hristov. Transient heat conduction with variable thermophysical properties power-law temperature-depenent heat capacity and thermal conductivity. Thermal Science 27, 411–422 (2023).\n\n\n\nK. Shirzad and C. Viney. A critical review on applications of the Avrami equation beyond materials science. Journal of The Royal Society Interface 20 (2023).\n\n\n\nE. J. Mittemeijer, L. Cheng, P. J. van der Schaaf, C. M. Brakman and B. M. Korevaar. Analysis of nonisothermal transformation kinetics; tempering of iron-carbon and iron-nitrogen martensites. Metallurgical Transactions A 19, 925–932 (1988).\n\n\n\nH. Mehrer. Diffusion in Solids : Fundamentals, Methods, Materials, Diffusion-Controlled \tProcesses. Vol. 155 of Springer Series in Solid-State Sciences (Springer Berlin Heidelberg, 2007).\n\n\n\nL. Onsager. Reciprocal relations in irreversible processes. I. Physical Review 37, 405–426 (1931).\n\n\n\nL. Onsager. Reciprocal relations in irreversible processes. II. Physical Review 38, 2265–2279 (1931).\n\n\n\nM. Raissi, P. Perdikaris and G. E. Karniadakis. Physics Informed Deep Learning (Part I): Data-driven Solutions of Nonlinear Partial Differential Equations, arXiv (2017).\n\n\n\nS. Guo. Physics-Informed Neural Networks: An Application-Centric Guide. Online (Feb 2024).\n\n\n\nS. Guo. Unraveling the Design Pattern of Physics-Informed Neural Networks: Series 01. Online (May 2023).\n\n\n\nC. Wu, M. Zhu, Q. Tan, Y. Kartha and L. Lu. A comprehensive study of non-adaptive and residual-based adaptive sampling for physics-informed neural networks. Computer Methods in Applied Mechanics and Engineering 403, 115671 (2023).\n\n\n\nS. Guo. Unraveling the Design Pattern of Physics-Informed Neural Networks: Series 02. Online (May 2023).\n\n\n\nK. Haitsiukevich and A. Ilin. Improved Training of Physics-Informed Neural Networks with Model Ensembles, arXiv (2022).\n\n\n\nS. Guo. Unraveling the Design Pattern of Physics-Informed Neural Networks: Series 03. Online (May 2023).\n\n\n\nZ. Fang, S. Wang and P. Perdikaris. Ensemble learning for Physics Informed Neural Networks: a Gradient Boosting approach, arXiv (2023).\n\n\n\nS. Guo. Unraveling the Design Pattern of Physics-Informed Neural Networks: Series 04. Online (May 2023).\n\n\n\nJ. Yu, L. Lu, X. Meng and G. E. Karniadakis. Gradient-enhanced physics-informed neural networks for forward and inverse PDE problems. Computer Methods in Applied Mechanics and Engineering 393, 114823 (2022).\n\n\n\nS. Guo. Unraveling the Design Pattern of Physics-Informed Neural Networks: Series 05. Online (May 2023).\n\n\n\nY. Wang, X. Han, C.-Y. Chang, D. Zha, U. Braga-Neto and X. Hu. Auto-PINN: Understanding and Optimizing Physics-Informed Neural Architecture, arXiv (2023), arXiv:2205.13748 [cs.LG].\n\n\n\nS. Guo. Unraveling the Design Pattern of Physics-Informed Neural Networks: Series 06. Online (Jun 2023).\n\n\n\nS. Wang, S. Sankaran and P. Perdikaris. Respecting causality is all you need for training physics-informed neural networks, arXiv (2022), arXiv:2203.07404 [cs.LG].\n\n\n\nS. Guo. Unraveling the Design Pattern of Physics-Informed Neural Networks: Series 07. Online (Jun 2023).\n\n\n\nC. J. Arthurs and A. P. King. Active training of physics-informed neural networks to aggregate and interpolate parametric solutions to the Navier-Stokes equations. Journal of Computational Physics 438, 110364 (2021).\n\n\n\nI. E. Lagaris, A. Likas and D. I. Fotiadis. Artificial neural networks for solving ordinary and partial differential equations. IEEE Transactions on Neural Networks 9, 987–1000 (1998).\n\n\n\nE. A. Antonelo, E. Camponogara, L. O. Seman, J. P. Jordanou, E. R. de Souza and J. F. Hübner. Physics-informed neural nets for control of dynamical systems. Neurocomputing 579, 127419 (2024).\n\n\n\nS. Cai, Z. Wang, S. Wang, P. Perdikaris and G. E. Karniadakis. Physics-Informed Neural Networks for Heat Transfer Problems. Journal of Heat Transfer 143 (2021).\n\n\n\nS. Cuomo, V. S. di Cola, F. Giampaolo, G. Rozza, M. Raissi and F. Piccialli. Scientific Machine Learning through Physics-Informed Neural Networks: Where we are and What's next, arXiv (2022).\n\n\n\nG. E. Karniadakis, I. G. Kevrekidis, L. Lu, P. Perdikaris, S. Wang and L. Yang. Physics-informed machine learning. Nature Reviews Physics 3, 422–440 (2021).\n\n\n\nL. Lu, X. Meng, Z. Mao and G. E. Karniadakis. DeepXDE: A Deep Learning Library for Solving Differential Equations. SIAM Review 63, 208–228 (2021).\n\n\n\nL. Lu, R. Pestourie, W. Yao, Z. Wang, F. Verdugo and S. G. Johnson. Physics-informed neural networks with hard constraints for inverse design, arXiv (2021).\n\n\n\nM. A. Nabian, R. J. Gladstone and H. Meidani. Efficient training of physics‐informed neural networks via importance sampling. Computer-Aided Civil and Infrastructure Engineering 36, 962–977 (2021).\n\n\n\nS. Sanyal and K. Roy. RAMP-Net: A Robust Adaptive MPC for Quadrotors via Physics-informed Neural Network, arXiv (2022).\n\n\n\nT. Würth, C. Krauß, C. Zimmerling and L. Kärger. Physics-informed neural networks for data-free surrogate modelling and engineering optimization – An example from composite manufacturing. Materials & Design 231, 112034 (2023).\n\n\n\nM. Malinen and P. Råback. Elmer finite element solver for multiphysics and multiscale problems. In: Multiscale modelling methods for applications in materials science, Vol. 19, edited by I. Kondov and G. Sutmann (Forschungszentrum, Zentralbibliothek, 2013); pp. 101–113. Literaturangaben.\n\n\n\nS. Masamune and J. M. Smith. Thermal conductivity of beds of spherical particles. Industrial and Engineering Chemistry Fundamentals 2, 136–143 (1963).\n\n\n\nA. Luikov, A. Shashkov, L. Vasiliev and Y. Fraiman. Thermal conductivity of porous systems. International Journal of Heat and Mass Transfer 11, 117–140 (1968).\n\n\n\nJ. C. Koh and A. Fortini. Thermal conductivity and electrical resistivity of porous metallic materials (NASA, 1971).\n\n\n\nJ. C. Koh and A. Fortini. Prediction of thermal conductivity and electrical resistivity of porous metallic materials. International Journal of Heat and Mass Transfer 16, 2013–2022 (1973).\n\n\n\nT. Fiedler, E. Pesetskaya, A. Öchsner and J. Grácio. Calculations of the thermal conductivity of porous materials. Materials Science Forum 514–516, 754–758 (2006).\n\n\n\nT. Fiedler, A. Öchsner, N. Muthubandara, I. V. Belova and G. E. Murch. Calculation of the Effective Thermal Conductivity in Composites Using Finite Element and Monte Carlo Methods. Materials Science Forum 553, 51–56 (2007).\n\n\n\nT. Fiedler, E. Solórzano, F. Garcia‐Moreno, A. Öchsner, I. V. Belova and G. E. Murch. Computed tomography based finite element analysis of the thermal properties of cellular aluminium. Materialwissenschaft und Werkstofftechnik 40, 139–143 (2009).\n\n\n\nD. S. Smith, A. Alzina, J. Bourret, B. Nait-Ali, F. Pennec, N. Tessier-Doyen, K. Otsu, H. Matsubara, P. Elser and U. T. Gonzenbach. Thermal conductivity of porous materials. Journal of Materials Research 28, 2260–2272 (2013).\n\n\n\nA. Cheilytko. Finding of the generalized equation of thermal conductivity for porous heat-insulating materials. Technology audit and production reserves 5, 4–10 (2016).\n\n\n\nG. Pia, L. Casnedi and U. Sanna. Porosity and pore size distribution influence on thermal conductivity of yttria-stabilized zirconia: Experimental findings and model predictions. Ceramics International 42, 5802–5809 (2016).\n\n\n\nL. Qiu, H. Zou, D. Tang, D. Wen, Y. Feng and X. Zhang. Inhomogeneity in pore size appreciably lowering thermal conductivity for porous thermal insulators. Applied Thermal Engineering 130, 1004–1011 (2018).\n\n\n\nM. Chikhi. Effective thermal conductivity of porous biomaterials: Numerical investigation. Journal of Building Engineering 32, 101763 (2020).\n\n\n\nK. Mraz, J. Bohacek, O. Resl, M. Chabicovsky and E. Karimi-Sibaki. Thermal conductivity of porous oxide layer: A numerical model based on CT data. Materials Today Communications 28, 102705 (2021).\n\n\n\nP. J. O'Rourke and D. M. Snider. An improved collision damping time for MP-PIC calculations of dense particle flows with applications to polydisperse sedimenting beds and colliding particle jets. Chemical Engineering Science 65, 6014–6028 (2010).\n\n\n\nV. Garaniya and L. Goldsworthy. Heavy Fuel Oil Combustion Modelling Using Continuous Thermodynamics. Marine Engineering 47, 871–877 (2012).\n\n\n\nR. J. Kee, M. E. Coltrin, P. Glarborg and H. Zhu. Chemically reacting flow theory, modeling, and simulation (Wiley & Sons, Incorporated, John, 2017); p. 792.\n\n\n\nH. S. Fogler. Elements of Chemical Reaction Engineering (Prentice Hall International Series in Physical and Chemical Engineering \tSciences, 1999).\n\n\n\nB. E. Launder and D. B. Spalding. The numerical computation of turbulent flows. Computer Methods in Applied Mechanics and Engineering 3, 269–289 (1974).\n\n\n\nD. Gidaspow. Multiphase flow and fluidization: continuum and kinetic theory descriptions with applications (Academic Press, 1994).\n\n\n\nJ. P. Du Plessis and J. H. Masliyah. Mathematical modelling of flow through consolidated isotropic porous media. Transport in Porous Media 3, 145–161 (1988).\n\n\n\nA. Haider and O. Levenspiel. Drag coefficient and terminal velocity of spherical and nonspherical particles. Powder Technology 58, 63–70 (1989).\n\n\n\nD. C. Lay. Linear algebra and its applications. Fourth Edition (Addison-Wesley, 2012).\n\n\n\n","category":"page"},{"location":"References/@Schneider1978a/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Schneider1978a/","page":"-","title":"-","text":"title: \"Molecular-dynamics study of a three-dimensional one-component model for distortive phase transitions\" authors: T. Schneider, E. Stoll year: 1978 –-","category":"page"},{"location":"Software/LAMMPS/#LAMMPS","page":"LAMMPS","title":"LAMMPS","text":"","category":"section"},{"location":"Software/LAMMPS/","page":"LAMMPS","title":"LAMMPS","text":"Large-scale Atomic/Molecular Massively Parallel Simulator or simply LAMMPS is a popular molecular dynamics software. It has probably the largest community and is highly mature, reasons why I have chosen this software to learn molecular dynamics at first. Later on I intend learning Molly.jl and maybe GROMACS or some other popular package.","category":"page"},{"location":"Software/LAMMPS/","page":"LAMMPS","title":"LAMMPS","text":"In what follows I will be mostly guided by the LAMMPS tutorials by Simon Gravelle in what concerns the contents, with some touches of automation by myself. Interesting materials are also inspired in what is provided by the MEJK Course. There are also interesting links in the LAMMPS Tutorials. The official documentation of LAMMPS can be found here.","category":"page"},{"location":"Software/LAMMPS/#Resources","page":"LAMMPS","title":"Resources","text":"","category":"section"},{"location":"Software/LAMMPS/","page":"LAMMPS","title":"LAMMPS","text":"These are complementary to LAMMPS and might be required in some cases, mainly for post-processing and rendering of simulation results as nice videos.","category":"page"},{"location":"Software/LAMMPS/","page":"LAMMPS","title":"LAMMPS","text":"colvars\nMAICoS\nMDAnalysis\nPyVista\nTopoTools\nVMD","category":"page"},{"location":"Software/LAMMPS/#Workflow-of-a-simulation","page":"LAMMPS","title":"Workflow of a simulation","text":"","category":"section"},{"location":"Software/LAMMPS/#System-initialization","page":"LAMMPS","title":"System initialization","text":"","category":"section"},{"location":"Software/LAMMPS/","page":"LAMMPS","title":"LAMMPS","text":"Comprises all basic definitions, such as domain boundaries specification, types of atoms, potentials, etc. This step is common to most simulations and it is worth writing parts of it as shared scripts in larger projects.","category":"page"},{"location":"Software/LAMMPS/","page":"LAMMPS","title":"LAMMPS","text":"The basic building blocks of a simulation include the definition of units, dimension and boundary; these are followed by a number of styles, which are responsible by defining the types of particles, how they interact between themselves, bond types, …, etc. The following snippet provides a minimal setup for a system consisting of atoms only, the simplest atom_style.","category":"page"},{"location":"Software/LAMMPS/","page":"LAMMPS","title":"LAMMPS","text":"units lj\ndimension 3\nboundary p p p\n\natom_style atomic\npair_style lj/cut 2.5","category":"page"},{"location":"Software/LAMMPS/","page":"LAMMPS","title":"LAMMPS","text":"For simple diatomic molecules, one needs to add a bond_style:","category":"page"},{"location":"Software/LAMMPS/","page":"LAMMPS","title":"LAMMPS","text":"...\natom_style      molecular\nbond_style      harmonic\n...","category":"page"},{"location":"Software/LAMMPS/","page":"LAMMPS","title":"LAMMPS","text":"And when going towards multiatomic molecules, an angle_style is also needed:","category":"page"},{"location":"Software/LAMMPS/","page":"LAMMPS","title":"LAMMPS","text":"...\natom_style      molecular\nbond_style      harmonic\nangle_style     harmonic\n...","category":"page"},{"location":"Software/LAMMPS/","page":"LAMMPS","title":"LAMMPS","text":"For the creation of simulation domain one needs to declare one or more0 region entities; it is possible then to perform logical operations to select intersections, …, etc. The simplest of the regions is a trivial block, with dimensions xyz given as a sequence of pairs of minimum and maximum as follows.","category":"page"},{"location":"Software/LAMMPS/","page":"LAMMPS","title":"LAMMPS","text":"# \nregion          simulation_box block -20 20 -20 20 -20 20\ncreate_box      3 the_box","category":"page"},{"location":"Software/LAMMPS/","page":"LAMMPS","title":"LAMMPS","text":"In the above cell we also used create_box with argument 3, meaning we intend to have 3 atom types in the simulation domain. Next we can create a cylinder of radius 10 along z-axis:","category":"page"},{"location":"Software/LAMMPS/","page":"LAMMPS","title":"LAMMPS","text":"region cylinder_in cylinder z 0 0 10 INF INF side in\nregion cylinder_out cylinder z 0 0 10 INF INF side out","category":"page"},{"location":"Software/LAMMPS/","page":"LAMMPS","title":"LAMMPS","text":"To be able to use an INF (infinite) dimension along a direction on must have created the block the_box ahead of the cylinder. Fortunately the error messages of LAMMPS are pretty expressive and one can quickly find a fix. Try commenting out the create_box in the script and check it. You can check the region command for more.","category":"page"},{"location":"Software/LAMMPS/","page":"LAMMPS","title":"LAMMPS","text":"Note: here we will use a more complex version of create_box because this tutorial simulation aims at considering molecular species. The simplest version above is valid for atoms only.","category":"page"},{"location":"Software/LAMMPS/","page":"LAMMPS","title":"LAMMPS","text":"create_box      3 simulation_box &\n    bond/types             1     &\n    angle/types            1     &\n    extra/bond/per/atom    1     &\n    extra/angle/per/atom   2     &\n    extra/special/per/atom 5","category":"page"},{"location":"Software/LAMMPS/","page":"LAMMPS","title":"LAMMPS","text":"Molecule creation syntax is provided here.","category":"page"},{"location":"Software/LAMMPS/#Energy-minimization","page":"LAMMPS","title":"Energy minimization","text":"","category":"section"},{"location":"Software/LAMMPS/","page":"LAMMPS","title":"LAMMPS","text":"When atoms are placed randomly in a domain there is a high probability of explosion of interaction forces due to overlap; a minimization step is generally required to search a sane starting point before time integration.","category":"page"},{"location":"Software/LAMMPS/#Integration-of-the-equations-of-motion","page":"LAMMPS","title":"Integration of the equations of motion","text":"","category":"section"},{"location":"Software/LAMMPS/","page":"LAMMPS","title":"LAMMPS","text":"With all interaction forces and a reasonable initial condition defined during minimization, time integration can be performed. This is generally done through the Verlet algorithm, although there are other methods available in LAMMPS. The key factor here is finding a suitable time step; as a rule-of-thumb, it is ideally about 5% of the time between collisions.","category":"page"},{"location":"Software/LAMMPS/#Trajectory-visualization","page":"LAMMPS","title":"Trajectory visualization","text":"","category":"section"},{"location":"Software/LAMMPS/","page":"LAMMPS","title":"LAMMPS","text":"Prior to integration one defines the data to be stored with the simulation. A common tool (freeware but not open source) in this field is VMD, for which a tutorial is provided here.","category":"page"},{"location":"Software/LAMMPS/#LAMMPS-usage","page":"LAMMPS","title":"LAMMPS usage","text":"","category":"section"},{"location":"Software/LAMMPS/","page":"LAMMPS","title":"LAMMPS","text":"A simulation script is simply parsed and run with lmp -in inputs.lammps.\nLAMMPS supports some regular expressions, i.e. you can set all masses to unity by calling mass * 1.0, where the * evaluates to all atom types already created.\nOmitted pairwise interaction parameters are by default computed by geometric averaging; Lorentz-Berthelot arithmetic rule is more common, though there is no rigorous argument for justifying any of them and they should be used with care in the absence of better data.","category":"page"},{"location":"Software/LAMMPS/#Key-concepts","page":"LAMMPS","title":"Key concepts","text":"","category":"section"},{"location":"Software/LAMMPS/","page":"LAMMPS","title":"LAMMPS","text":"Langevin thermostat, see Schneider1978a [22].","category":"page"},{"location":"Software/LAMMPS/#Tutorials","page":"LAMMPS","title":"Tutorials","text":"","category":"section"},{"location":"Software/LAMMPS/#Lennard-Jones-fluid","page":"LAMMPS","title":"Lennard-Jones fluid","text":"","category":"section"},{"location":"Software/LAMMPS/","page":"LAMMPS","title":"LAMMPS","text":"In this tutorial the following concepts are dealt with:","category":"page"},{"location":"Software/LAMMPS/","page":"LAMMPS","title":"LAMMPS","text":"Basic setup of a simulation with atomic types only.\nConcept of box and regions for system definition and random initialization of atoms inside region volumes, e.g. using cylinders to define where each type of atom must be.\nTracking of thermodynamics during minimization run and finding a suitable initial condition though minimization before proceeding with molecular dynamics simulation properly said.","category":"page"},{"location":"Software/LAMMPS/","page":"LAMMPS","title":"LAMMPS","text":"The Lennard-Jones potential is defined as","category":"page"},{"location":"Software/LAMMPS/","page":"LAMMPS","title":"LAMMPS","text":"E(r) = 4epsilon_ijleft\n\tleft(fracsigma_ijRright)^12\n\t-left(fracsigma_ijRright)^6\nright","category":"page"},{"location":"Software/LAMMPS/","page":"LAMMPS","title":"LAMMPS","text":"This potential can be implemented in an efficient way by introducing r=(sigma_ijR^-1)^6:","category":"page"},{"location":"Software/LAMMPS/","page":"LAMMPS","title":"LAMMPS","text":"ljpotential(r, ϵ) = 4ϵ * r * (r - 1)\n\nnothing; # hide","category":"page"},{"location":"Software/LAMMPS/","page":"LAMMPS","title":"LAMMPS","text":"The evaluation of this is can be managed by a type as provided below; notice the use of a function object operator for accessing the internals of PairInterLJ:","category":"page"},{"location":"Software/LAMMPS/","page":"LAMMPS","title":"LAMMPS","text":"struct PairInterLJ\n    ϵ::Float64\n    σ::Float64\nend\n\n(self::PairInterLJ)(R::Float64) = ljpotential((self.σ / R)^6, self.ϵ)\n\nnothing; # hide","category":"page"},{"location":"Software/LAMMPS/","page":"LAMMPS","title":"LAMMPS","text":"In the simulations we have used default parameters for interactions between different types of atoms; that implies geometric mean of both interaction potential epsilon_ij and distance parameter sigma_ij. An alternative would be a Lorentz-Berthelot arithmetic mean (for distance parameter only). To compare these we overload the structure constructor:","category":"page"},{"location":"Software/LAMMPS/","page":"LAMMPS","title":"LAMMPS","text":"function PairInterLJ(p::PairInterLJ, q::PairInterLJ; method = :arithmetic)\n method ∈ [:arithmetic, :geometric] || throw(\"Unknown method $(method)\")\n \n σ = (method == :arithmetic) ? (p.σ + q.σ) / 2.0 : sqrt(p.σ * q.σ)\n \n return PairInterLJ(sqrt(p.ϵ * q.ϵ), σ)\nend\n\nnothing; # hide","category":"page"},{"location":"Software/LAMMPS/","page":"LAMMPS","title":"LAMMPS","text":"Using the case data we can compute the following interaction potentials:","category":"page"},{"location":"Software/LAMMPS/","page":"LAMMPS","title":"LAMMPS","text":"pair11 = PairInterLJ(1.0, 1.0)\npair22 = PairInterLJ(0.5, 3.0)\n\npair12_g = PairInterLJ(pair11, pair22; method = :geometric)\npair12_a = PairInterLJ(pair11, pair22; method = :arithmetic)\n\nnothing; # hide","category":"page"},{"location":"Software/LAMMPS/","page":"LAMMPS","title":"LAMMPS","text":"pair12_g","category":"page"},{"location":"Software/LAMMPS/","page":"LAMMPS","title":"LAMMPS","text":"pair12_a","category":"page"},{"location":"Software/LAMMPS/","page":"LAMMPS","title":"LAMMPS","text":"Visualization is straightforward with Makie:","category":"page"},{"location":"Software/LAMMPS/","page":"LAMMPS","title":"LAMMPS","text":"using CairoMakie\n\nR = LinRange(0.9, 6, 500)\n\nfig = with_theme() do\t\n f = Figure()\n ax = Axis(f[1, 1]; xlabel = L\"R\", ylabel = L\"E(R)\")\n lines!(ax, R, pair11.(R); label = L\"E_{11}\", color = :red)\n lines!(ax, R, pair22.(R); label = L\"E_{22}\", color = :blue)\n lines!(ax, R, pair12_g.(R); label = L\"E_{12,g}\", color = :black)\n lines!(ax, R, pair12_a.(R); label = L\"E_{12,a}\", color = :green)\n ax.xticks = 1.0:1.0:6.0\n xlims!(ax, 0.95, 6.0)\n ylims!(ax, -1.02, 1.0)\n axislegend(ax; position = :rt)\n f\nend\n\nfig","category":"page"},{"location":"Software/LAMMPS/","page":"LAMMPS","title":"LAMMPS","text":"For proper representation of results, following the VDM tutorial one can further:","category":"page"},{"location":"Software/LAMMPS/","page":"LAMMPS","title":"LAMMPS","text":"Learn to represent atoms with proper scaling using VWD representation and after manipulation dump the state in the same directory as the trajectories file for ease of reloading; in this case it is simply a matter of File > Load Visualization State....\nGenerate animation using the included Internal Tachyon (unless you have a local Tachyon installation) library and process with FFmpeg with command ffmpeg -framerate 30 -i \"results.%05d.bmp\" -vf \"select=not(mod(n\\,3)),scale=372x360\" animation.gif. For selecting every n-th frame use this approach.","category":"page"},{"location":"References/@Cuomo2022a/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Cuomo2022a/","page":"-","title":"-","text":"title: \"Scientific machine learning through physics-informed neural networks: Where we are and what's next\" authors: Salvatore Cuomo, Vincenzo Schiano di Cola, Fabio Giampaolo, Gianluigi Rozza, Maziar Raissi, Francesco Piccialli year: 2022 DOI: https://doi.org/10.48550/arXiv.2201.05624 –-","category":"page"},{"location":"References/@Nowruzi2014/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Nowruzi2014/","page":"-","title":"-","text":"title: Numerical simulation of non-evaporating and non-reacting heavy fuel oil injection spray in medium speed engines using OpenFOAM authors: Hashem Nowruzi, Parviz Ghadimi, Mehdi Yousefifard, Mohammad A. Feiz Chekab year: 2014 URL: https://doi.org/10.14810/ijmech.2014.3206 Drive: https://1drv.ms/b/s!Ar4x-UlrYAiZlbEf-L95SgshO8_Nhg?e=jKpxyO –-","category":"page"},{"location":"References/@Grosshandler1993/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Grosshandler1993/","page":"-","title":"-","text":"title: Radcal – a narrow-band model for radiation calculations in a combustion environment authors: William L. Grosshandler year: 1993 –-","category":"page"},{"location":"References/@Hindmarsh2005/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Hindmarsh2005/","page":"-","title":"-","text":"title: \"SUNDIALS: Suite of nonlinear and Differential/Algebraic equation solvers\" authors: Alan C. Hindmarsh, Peter N. Brown, Keith E. Grant, Steven L. Lee, Radu Serban, Dan E. Shumaker, Carol S. Woodward year: 2005 –-","category":"page"},{"location":"References/@Shirzad2023/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Shirzad2023/","page":"-","title":"-","text":"title: \"A critical review on applications of the Avrami equation beyond materials science\" authors: Kiana Shirzad, Christopher Viney year: 2023 –-","category":"page"},{"location":"Computing/06-Domain-Specific-Software/#Domain-specific-software","page":"Domain specific software","title":"Domain specific software","text":"","category":"section"},{"location":"Computing/06-Domain-Specific-Software/#Transport-phenomena","page":"Domain specific software","title":"Transport phenomena","text":"","category":"section"},{"location":"Computing/06-Domain-Specific-Software/","page":"Domain specific software","title":"Domain specific software","text":"The list below provides useful links for learning transport phenomena simulation:","category":"page"},{"location":"Computing/06-Domain-Specific-Software/","page":"Domain specific software","title":"Domain specific software","text":"CFD Online (forum)\nNASA Turbulence LARC\nCFD General Notation System (CGNS)\nCFD Support (list of software)\nCFDyna","category":"page"},{"location":"Computing/06-Domain-Specific-Software/","page":"Domain specific software","title":"Domain specific software","text":"And below you find some supporting tools for setting up a CFD simulation:","category":"page"},{"location":"Computing/06-Domain-Specific-Software/","page":"Domain specific software","title":"Domain specific software","text":"Y-Plus\nSkin friction\nFluid Mechanics 101","category":"page"},{"location":"Computing/06-Domain-Specific-Software/","page":"Domain specific software","title":"Domain specific software","text":"The following is a list of water property calculators for use in detailed simulations:","category":"page"},{"location":"Computing/06-Domain-Specific-Software/","page":"Domain specific software","title":"Domain specific software","text":"IAPWS-95\niapws\nCoolProp\nfreesteam\nqingfengxia/freesteam","category":"page"},{"location":"Computing/06-Domain-Specific-Software/","page":"Domain specific software","title":"Domain specific software","text":"It is also interesting to have access to some combustion-related materials:","category":"page"},{"location":"Computing/06-Domain-Specific-Software/","page":"Domain specific software","title":"Domain specific software","text":"Methane/air combustion","category":"page"},{"location":"Computing/06-Domain-Specific-Software/#SU2","page":"Domain specific software","title":"SU2","text":"","category":"section"},{"location":"Computing/06-Domain-Specific-Software/","page":"Domain specific software","title":"Domain specific software","text":"SU2 webpage","category":"page"},{"location":"Computing/06-Domain-Specific-Software/#OpenFOAM","page":"Domain specific software","title":"OpenFOAM","text":"","category":"section"},{"location":"Computing/06-Domain-Specific-Software/","page":"Domain specific software","title":"Domain specific software","text":"OpenFOAM distributions","category":"page"},{"location":"Computing/06-Domain-Specific-Software/","page":"Domain specific software","title":"Domain specific software","text":"OpenFOAM.org (CFD Direct)\nOpenFOAM.com (ESI)","category":"page"},{"location":"Computing/06-Domain-Specific-Software/","page":"Domain specific software","title":"Domain specific software","text":"General purpose, tutorials, and documentation:","category":"page"},{"location":"Computing/06-Domain-Specific-Software/","page":"Domain specific software","title":"Domain specific software","text":"OpenFOAM Wiki\nTU Wien tutorials\n3-week series tutorials\nTutorials by author\nFEA for All tutorials of OpenFOAM\nCEMF tutorials","category":"page"},{"location":"Computing/06-Domain-Specific-Software/","page":"Domain specific software","title":"Domain specific software","text":"External solvers:","category":"page"},{"location":"Computing/06-Domain-Specific-Software/","page":"Domain specific software","title":"Domain specific software","text":"catalyticFoam\nCEMF solvers","category":"page"},{"location":"Computing/06-Domain-Specific-Software/","page":"Domain specific software","title":"Domain specific software","text":"Conjugate heat transfer:","category":"page"},{"location":"Computing/06-Domain-Specific-Software/","page":"Domain specific software","title":"Domain specific software","text":"Tutorial of chtMultiRegionFoam\nTutorial - Heat sink","category":"page"},{"location":"Computing/06-Domain-Specific-Software/","page":"Domain specific software","title":"Domain specific software","text":"Volume of fluid (VoF):","category":"page"},{"location":"Computing/06-Domain-Specific-Software/","page":"Domain specific software","title":"Domain specific software","text":"interFoam tutorial - raising bubble","category":"page"},{"location":"Computing/06-Domain-Specific-Software/","page":"Domain specific software","title":"Domain specific software","text":"Moving reference frame (MRF):","category":"page"},{"location":"Computing/06-Domain-Specific-Software/","page":"Domain specific software","title":"Domain specific software","text":"Video tutorial by Asmaa Hadane","category":"page"},{"location":"Computing/06-Domain-Specific-Software/#Reduced-order-modeling-(ROM)","page":"Domain specific software","title":"Reduced order modeling (ROM)","text":"","category":"section"},{"location":"Computing/06-Domain-Specific-Software/","page":"Domain specific software","title":"Domain specific software","text":"GeN-ROM paper\nITHACA-FV ROM for OpenFOAM\nBYU-PRISM/Seeq","category":"page"},{"location":"Computing/06-Domain-Specific-Software/#Lattice-Boltzmann-method","page":"Domain specific software","title":"Lattice-Boltzmann method","text":"","category":"section"},{"location":"Computing/06-Domain-Specific-Software/","page":"Domain specific software","title":"Domain specific software","text":"The following links provide simple implementations to learn DEM development:","category":"page"},{"location":"Computing/06-Domain-Specific-Software/","page":"Domain specific software","title":"Domain specific software","text":"LBM in Python from scratch\nRepository with implementation samples","category":"page"},{"location":"Computing/06-Domain-Specific-Software/#Smooth-Particle-Hydrodynamics","page":"Domain specific software","title":"Smooth Particle Hydrodynamics","text":"","category":"section"},{"location":"Computing/06-Domain-Specific-Software/","page":"Domain specific software","title":"Domain specific software","text":"Several projects","category":"page"},{"location":"Computing/06-Domain-Specific-Software/","page":"Domain specific software","title":"Domain specific software","text":"","category":"page"},{"location":"Computing/06-Domain-Specific-Software/#Systems-modeling","page":"Domain specific software","title":"Systems modeling","text":"","category":"section"},{"location":"Computing/06-Domain-Specific-Software/#DWSIM","page":"Domain specific software","title":"DWSIM","text":"","category":"section"},{"location":"Computing/06-Domain-Specific-Software/","page":"Domain specific software","title":"Domain specific software","text":"Generical chemical process simulation software.","category":"page"},{"location":"Computing/06-Domain-Specific-Software/","page":"Domain specific software","title":"Domain specific software","text":"DWSIM\nDWSIM: Curso (Pr. Felix Monteiro Pereira)\nDWSIM: Curso (Pr. Delano Mendes de Santana)\nDWSIM: YouTube Playlist","category":"page"},{"location":"Computing/06-Domain-Specific-Software/#Dyssol","page":"Domain specific software","title":"Dyssol","text":"","category":"section"},{"location":"Computing/06-Domain-Specific-Software/","page":"Domain specific software","title":"Domain specific software","text":"Dyssol is process unit operations simulator conceived from granular processes.","category":"page"},{"location":"Computing/06-Domain-Specific-Software/","page":"Domain specific software","title":"Domain specific software","text":"Dyssol repository\nDyssol documentation","category":"page"},{"location":"Computing/06-Domain-Specific-Software/#Modelica","page":"Domain specific software","title":"Modelica","text":"","category":"section"},{"location":"Computing/06-Domain-Specific-Software/","page":"Domain specific software","title":"Domain specific software","text":"Modelica is an acausal programming language for systems modeling:","category":"page"},{"location":"Computing/06-Domain-Specific-Software/","page":"Domain specific software","title":"Domain specific software","text":"Modelica Association\nModelica Documentation\nModelica Specification\nOpenModelica (FOSS implementation)\nModelica University\nThermoSysPro package","category":"page"},{"location":"Computing/06-Domain-Specific-Software/","page":"Domain specific software","title":"Domain specific software","text":"","category":"page"},{"location":"Computing/06-Domain-Specific-Software/#Combustion-and-kinetics","page":"Domain specific software","title":"Combustion and kinetics","text":"","category":"section"},{"location":"Computing/06-Domain-Specific-Software/#Cantera","page":"Domain specific software","title":"Cantera","text":"","category":"section"},{"location":"Computing/06-Domain-Specific-Software/","page":"Domain specific software","title":"Domain specific software","text":"Cantera is the standard package for modeling reacting systems. As it was my main toolkit in the final parts of my PhD and still is a major part of my professional life, I am quite knowledgeable on this software. It can be considered the final replacement of classical Chemkin. I am currently working in a Julia interface to its core library.","category":"page"},{"location":"Computing/06-Domain-Specific-Software/#Fire-Models","page":"Domain specific software","title":"Fire Models","text":"","category":"section"},{"location":"Computing/06-Domain-Specific-Software/","page":"Domain specific software","title":"Domain specific software","text":"GitHub - firemodels/fds: Fire Dynamics Simulator\nFDS-SMV Manuals","category":"page"},{"location":"Computing/06-Domain-Specific-Software/#OpenSmoke","page":"Domain specific software","title":"OpenSmoke++","text":"","category":"section"},{"location":"Computing/06-Domain-Specific-Software/","page":"Domain specific software","title":"Domain specific software","text":"OpenSmoke++ is a framework for detailed kinetics modeling of large reacting systems. This paper might be of interest: Dalili (2020) - modeling of a single droplet evaporation and combustion.","category":"page"},{"location":"Computing/06-Domain-Specific-Software/","page":"Domain specific software","title":"Domain specific software","text":"","category":"page"},{"location":"Computing/06-Domain-Specific-Software/#Mathematical-software","page":"Domain specific software","title":"Mathematical software","text":"","category":"section"},{"location":"Computing/06-Domain-Specific-Software/","page":"Domain specific software","title":"Domain specific software","text":"Mathics\nMaxima","category":"page"},{"location":"Computing/06-Domain-Specific-Software/","page":"Domain specific software","title":"Domain specific software","text":"","category":"page"},{"location":"Computing/06-Domain-Specific-Software/#Computational-thermodynamics","page":"Domain specific software","title":"Computational thermodynamics","text":"","category":"section"},{"location":"Computing/06-Domain-Specific-Software/","page":"Domain specific software","title":"Domain specific software","text":"sundmanbo/opencalphad\npycalphad/pycalphad\nmaterialsgenomefoundation/kawin\nORNL-CEES/thermochimica\nORNL/Equilipy\nhasundue/Calmato.jl\nnpaulson/pduq","category":"page"},{"location":"Computing/06-Domain-Specific-Software/","page":"Domain specific software","title":"Domain specific software","text":"","category":"page"},{"location":"Computing/06-Domain-Specific-Software/#Entering","page":"Domain specific software","title":"Entering","text":"","category":"section"},{"location":"Computing/06-Domain-Specific-Software/","page":"Domain specific software","title":"Domain specific software","text":"This section contains other software to check; I don't necessarily know them and as I might them useful or consider the projects abandoned they might be dropped from the list until they find their right place in this file.","category":"page"},{"location":"Computing/06-Domain-Specific-Software/","page":"Domain specific software","title":"Domain specific software","text":"ASL GitHub\nDymos\nGitHub - flame-code/FLAME: FLAME: a library for atomistic modeling environments\nstitching/stitching at main · lukasalexanderweber/stitching\n[usnistgov/atomman: Atomistic Manipulation Toolkit](https://github.com/usnistgov/atomman\nGrossfieldLab/loos: LOOS: a lightweight object-oriented structure analysis library\nglotzerlab/freud: Powerful, efficient particle trajectory analysis in scientific Python.\nGitHub - xiaoh/sediFoam: CFD-DEM Solver with emphasis on sediment transport\nGitHub - CoolProp/CoolProp: Thermophysical properties for the masses\nGitHub - fwitte/fluprodia: Fluid property diagrams\nshiftkey/desktop\nbjodah/chempy: A package useful for chemistry written in Python\n[BenLand100/chroma: Ultra-fast Photon Monte Carlo](https://github.com/BenLand100/chroma\npreCICE: coupling between different solutions\nASALI\nCSIRO","category":"page"},{"location":"References/@Malinen2013a/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Malinen2013a/","page":"-","title":"-","text":"title: \"Elmer finite element solver for multiphysics and multiscale problems\" authors: Mika Malinen, Peter Råback year: 2013 –-","category":"page"},{"location":"Notebooks/01-Composite-Conduction/#Steady-state-heat-transfer","page":"Steady-state heat transfer","title":"Steady-state heat transfer","text":"","category":"section"},{"location":"Notebooks/01-Composite-Conduction/","page":"Steady-state heat transfer","title":"Steady-state heat transfer","text":"No further words, let's start by importing the required toolset:","category":"page"},{"location":"Notebooks/01-Composite-Conduction/","page":"Steady-state heat transfer","title":"Steady-state heat transfer","text":"using CairoMakie\nusing LinearAlgebra\nusing Printf\nusing Unitful\n\n# Stefan-Boltzmann constant.\nconst σ = 5.67e-08u\"W/(m^2*K^4)\"\n\nnothing; #hide","category":"page"},{"location":"Notebooks/01-Composite-Conduction/#Linear-problem","page":"Steady-state heat transfer","title":"Linear problem","text":"","category":"section"},{"location":"Notebooks/01-Composite-Conduction/","page":"Steady-state heat transfer","title":"Steady-state heat transfer","text":"Implementation of section 2.2.1 of Nithiarasu et al. (2016) of steady state heat transfer across a composite slab of materials with different thermal conductivities. In one side the slab is irradiated with a heat flux density q_1 while the opposite face is subjected to a convective heat transfer with coefficient h and ambient temperature T_a. The model to be solved can be stated as","category":"page"},{"location":"Notebooks/01-Composite-Conduction/","page":"Steady-state heat transfer","title":"Steady-state heat transfer","text":"fracd^2Tdx^2=0\nqquad q_1 = -k_1fracdTdx\nqquad q_2 = h (T_3 -\nT_a)","category":"page"},{"location":"Notebooks/01-Composite-Conduction/","page":"Steady-state heat transfer","title":"Steady-state heat transfer","text":"Our goal in what follows is to implement equation (2.12) of the reference to be able to solve for nodal temperatures. To this end we need both the stiffness matrix and the forcing vector of the problem. The code that follows tries to mimic the mathematical implementation rather than following a general programming approach given the introductory level of this example.","category":"page"},{"location":"Notebooks/01-Composite-Conduction/","page":"Steady-state heat transfer","title":"Steady-state heat transfer","text":"Since each component of the composite slab is characterized by a conductivity across the element we provide a function conductivity for computing K=kAL^-1. This is more expressive than simply hard-coding its definition directly in the stiffness matrix.","category":"page"},{"location":"Notebooks/01-Composite-Conduction/","page":"Steady-state heat transfer","title":"Steady-state heat transfer","text":"function conductivity(k, A, L)\n return k * A / L\nend\n\nnothing; #hide","category":"page"},{"location":"Notebooks/01-Composite-Conduction/","page":"Steady-state heat transfer","title":"Steady-state heat transfer","text":"Below we implement the stiffness matrix constructor in terms of the required parameters:","category":"page"},{"location":"Notebooks/01-Composite-Conduction/","page":"Steady-state heat transfer","title":"Steady-state heat transfer","text":"function stiffness(h, k1, k2, L1, L2; A=1)\n a1 = conductivity(k1, A, L1)\n a2 = conductivity(k2, A, L2)\n b0 = 0u\"W/(m^2*K)\"\n\n return [ a1 -a1 b0\n -a1 a1+a2 -a2\n b0 -a2 a2+h*A ];\nend\n\nnothing; #hide","category":"page"},{"location":"Notebooks/01-Composite-Conduction/","page":"Steady-state heat transfer","title":"Steady-state heat transfer","text":"Similarly, the column forcing vector is given as:","category":"page"},{"location":"Notebooks/01-Composite-Conduction/","page":"Steady-state heat transfer","title":"Steady-state heat transfer","text":"function forcing(q, h, Ta; A=1)\n return [ q*A; 0u\"W/m^2\"; h*A*Ta ];\nend\n\nnothing; #hide","category":"page"},{"location":"Notebooks/01-Composite-Conduction/","page":"Steady-state heat transfer","title":"Steady-state heat transfer","text":"As model parameters one needs to specity the thermal conductivities k and associated thicknesses L of plates and the known heat transfer coefficient h on the side the slab is exposed to convective heat transfer. All these values are provided below with respective physical units.","category":"page"},{"location":"Notebooks/01-Composite-Conduction/","page":"Steady-state heat transfer","title":"Steady-state heat transfer","text":"h = 5u\"W/(m^2*K)\"\nk1 = 5.0u\"W/(m*K)\"\nk2 = 0.5u\"W/(m*K)\"\nL1 = 1.0u\"m\"\nL2 = 1.0u\"m\"\n\nnothing; #hide","category":"page"},{"location":"Notebooks/01-Composite-Conduction/","page":"Steady-state heat transfer","title":"Steady-state heat transfer","text":"To complete the boundary conditions, the heat flux q_1 and environment temperature T_a are given below.","category":"page"},{"location":"Notebooks/01-Composite-Conduction/","page":"Steady-state heat transfer","title":"Steady-state heat transfer","text":"q1 = 20.0u\"W/m^2\"\nTa = 300.0u\"K\"\n\nnothing; #hide","category":"page"},{"location":"Notebooks/01-Composite-Conduction/","page":"Steady-state heat transfer","title":"Steady-state heat transfer","text":"Now we are able to create the problem and inspect elements.","category":"page"},{"location":"Notebooks/01-Composite-Conduction/","page":"Steady-state heat transfer","title":"Steady-state heat transfer","text":"M = stiffness(h, k1, k2, L1, L2)","category":"page"},{"location":"Notebooks/01-Composite-Conduction/","page":"Steady-state heat transfer","title":"Steady-state heat transfer","text":"f = forcing(q1, h, Ta)","category":"page"},{"location":"Notebooks/01-Composite-Conduction/","page":"Steady-state heat transfer","title":"Steady-state heat transfer","text":"Solution is found by solving the linear system with the backslash operator. Because the default operator does not support Unitful units, an overload required here. Since the problem is small we will use a matrix inverse here as an alternative.","category":"page"},{"location":"Notebooks/01-Composite-Conduction/","page":"Steady-state heat transfer","title":"Steady-state heat transfer","text":"T = inv(M) * f","category":"page"},{"location":"Notebooks/01-Composite-Conduction/","page":"Steady-state heat transfer","title":"Steady-state heat transfer","text":"Below we inspect the solution at the nodal positions (filled dots). Since thermal conductivities were assumed constant in this case, dashed lines extrapolating the linear solution between the nodes are also provided.","category":"page"},{"location":"Notebooks/01-Composite-Conduction/","page":"Steady-state heat transfer","title":"Steady-state heat transfer","text":"Temperature profile across plate with convection boundary condition.","category":"page"},{"location":"Notebooks/01-Composite-Conduction/","page":"Steady-state heat transfer","title":"Steady-state heat transfer","text":"with_theme() do\n fig = Figure(size = (700, 300))\n ax = Axis(fig[1, 1])\n lines!(ax, ustrip(T); color = :red, linestyle = :dash)\n scatter!(ax, ustrip(T); color = :red)\n ax.xlabel = \"Node\"\n ax.ylabel = \"Temperature [K]\"\n ax.xticks = 1:3\n xlims!(ax, (0.95, 3.05))\n ylims!(ax, (300, 350))\n fig\nend","category":"page"},{"location":"Notebooks/01-Composite-Conduction/#Nonlinear-problem","page":"Steady-state heat transfer","title":"Nonlinear problem","text":"","category":"section"},{"location":"Notebooks/01-Composite-Conduction/","page":"Steady-state heat transfer","title":"Steady-state heat transfer","text":"Solving the linear problem of steady heat conduction was trivial, but for practical cases (even at low temperatures in many situations) radiation losses should also be taken into account in the currently convective side of the plate. Here we introduce a modification to the boundary condition q_2 accounting for this heat transfer mode. Notice that another source of nonlinearity could be introduced through non-constant thermal conductivities of the media, but we let the reader implement this as an excercise since it is a trivial exntesion to what is provided in what follows.","category":"page"},{"location":"Notebooks/01-Composite-Conduction/","page":"Steady-state heat transfer","title":"Steady-state heat transfer","text":"fracd^2Tdx^2=0\nqquad\nq_1 = -k_1fracdTdx\nqquad\nq_2 = h (T_3 - T_a) + εσ(T_3^4-T_a^4)","category":"page"},{"location":"Notebooks/01-Composite-Conduction/","page":"Steady-state heat transfer","title":"Steady-state heat transfer","text":"There are many ways of handling the nonlinearity introduced by the radiation term. A common approach is the factorization of T_3^4-T_a^4 and reformulation of the boundary condition in terms of a global heat transfer coefficient U. Because U depends on the last known temperature τ_3 the problem needs to be solved iterativelly. The choice of τ_3 notation is to distinguish it from the value T_3 found by the linear problem solution.","category":"page"},{"location":"Notebooks/01-Composite-Conduction/","page":"Steady-state heat transfer","title":"Steady-state heat transfer","text":"q_2 = U (T_3 - T_a)\nqquadtextwhereqquad\nU = h + εσ(tau_3+T_a)(tau_3^2+T_a^2)","category":"page"},{"location":"Notebooks/01-Composite-Conduction/","page":"Steady-state heat transfer","title":"Steady-state heat transfer","text":"The radiation terms introduce the need to provide the surface emissivity ε:","category":"page"},{"location":"Notebooks/01-Composite-Conduction/","page":"Steady-state heat transfer","title":"Steady-state heat transfer","text":"ε = 0.9\n\nnothing; #hide","category":"page"},{"location":"Notebooks/01-Composite-Conduction/","page":"Steady-state heat transfer","title":"Steady-state heat transfer","text":"An one-liner globalhtc is provided to evaluate U at each iteration.","category":"page"},{"location":"Notebooks/01-Composite-Conduction/","page":"Steady-state heat transfer","title":"Steady-state heat transfer","text":"globalhtc(τ, Ta, h, ε) = h + ε * σ * (τ + Ta) * (τ^2 + Ta^2)\n\n@show globalhtc(300u\"K\", Ta, h, ε)","category":"page"},{"location":"Notebooks/01-Composite-Conduction/","page":"Steady-state heat transfer","title":"Steady-state heat transfer","text":"Since the problem now needs to be solved iterativelly, it is worth creating a simple function that encapsulates the steps to be repeated at each iteration, i.e update the heat transfer coefficient, update stiffness matrix and forcing vector, solve for the new temperature estimate. Because this is a dummy problem we will not get an optimized matrix update, but simply call stiffness and forcing every iteration with the new value of U. Because there are many parameters, we create a function that returns another function with the fixed values allowing for a single update:","category":"page"},{"location":"Notebooks/01-Composite-Conduction/","page":"Steady-state heat transfer","title":"Steady-state heat transfer","text":"function createproblem(Ta, h, ε, k1, k2, L1, L2)\n function step(τ)\n U = globalhtc(τ, Ta, h, ε)\n M = stiffness(U, k1, k2, L1, L2)\n f = forcing(q1, U, Ta)\n return inv(M) * f\n end\n return step\nend\n\nnothing; #hide","category":"page"},{"location":"Notebooks/01-Composite-Conduction/","page":"Steady-state heat transfer","title":"Steady-state heat transfer","text":"The solution of the problem now is rather simple. One provides an initial guess which is used to compute a new solution estimate. Because under some circumstances the estimate could start wiggling and diverge, it is worth implementing a relaxation step interpolating the new and previous approximations as T_n=βT_n+(1-β)T_n-1. In case beta1 solution is slowly updated by giving a higher weigth to the previous estimate and the problem is said to be underrelaxed. Overelaxation is the opposite scenario but can be problematic in some cases. Some metric, here the maximum relative change in absolute value, must be used to determine solution convergence.","category":"page"},{"location":"Notebooks/01-Composite-Conduction/","page":"Steady-state heat transfer","title":"Steady-state heat transfer","text":"function solveproblem(T, step; maxiter = 20, rtol = 1.0e-15, β = 1.0)\n τ = copy(T)\n\n for i in range(1, maxiter)\n τ[:] = β * step(T[3]) + (1 - β) * T\n Δ = maximum(abs.(τ .- T) ./ T)\n T[:] = τ\n\n println(\"Residual $(i) ..... $(@sprintf(\"%.6e\", Δ))\")\n\n if Δ < rtol\n break\n end\n end\n\n return T\nend\n\nnothing; #hide","category":"page"},{"location":"Notebooks/01-Composite-Conduction/","page":"Steady-state heat transfer","title":"Steady-state heat transfer","text":"Below we make use of the created tooling to solve the model.","category":"page"},{"location":"Notebooks/01-Composite-Conduction/","page":"Steady-state heat transfer","title":"Steady-state heat transfer","text":"guess = [Ta; Ta; Ta]\n\nstep = createproblem(Ta, h, ε, k1, k2, L1, L2)\n\nT = solveproblem(guess, step)","category":"page"},{"location":"Notebooks/01-Composite-Conduction/","page":"Steady-state heat transfer","title":"Steady-state heat transfer","text":"Temperature profile across plate with radiation enabled.","category":"page"},{"location":"Notebooks/01-Composite-Conduction/","page":"Steady-state heat transfer","title":"Steady-state heat transfer","text":"with_theme() do\n fig = Figure(size = (700, 300))\n ax = Axis(fig[1, 1])\n lines!(ax, ustrip(T); color = :red, linestyle = :dash)\n scatter!(ax, ustrip(T); color = :red)\n ax.xlabel = \"Node\"\n ax.ylabel = \"Temperature [K]\"\n ax.xticks = 1:3\n xlims!(ax, (0.95, 3.05))\n ylims!(ax, (300, 350))\n fig\nend","category":"page"},{"location":"References/@Sanyal2022a/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Sanyal2022a/","page":"-","title":"-","text":"title: \"RAMP-Net: A robust adaptive MPC for quadrotors via physics-informed neural network\" authors: Sourav Sanyal, Kaushik Roy year: 2022 URL: https://doi.org/10.48550/arXiv.2209.09025 –-","category":"page"},{"location":"Notes/Drafts/#Drafts","page":"Drafts","title":"Drafts","text":"","category":"section"},{"location":"Notes/Drafts/#LAMMPS","page":"Drafts","title":"LAMMPS","text":"","category":"section"},{"location":"Notes/Drafts/","page":"Drafts","title":"Drafts","text":"Do exercises\ncreate a diffusion cell (one side initialized to a different type of atoms)","category":"page"},{"location":"Notes/Drafts/#Julia-para-cientistas","page":"Drafts","title":"Julia para cientistas","text":"","category":"section"},{"location":"Notes/Drafts/","page":"Drafts","title":"Drafts","text":"Lacos E Condicionais\nFuncoes E Despacho\nPacotes E Ecossistema\nAvaliando Performance\nAlgebra Linear\nExpressoes Regulares\nExecucao Concorrente\nTrabalhando Com Arquivos\nBibliotecas Graficas\nGraficos Para Publicacoes\nTipos De Dados E Estruturas\nMetaprogramacao E Macros\nInteroperacao Com C\nEquações diferenciais ordinárias\nEquações diferenciais parciais\nRedes neuronais clássicas\nAprendizado com suporte físico\nAnálise quantitativa de imagens\nCriando seus próprios pacotes","category":"page"},{"location":"Notes/Drafts/#Basilisk","page":"Drafts","title":"Basilisk","text":"","category":"section"},{"location":"Notes/Drafts/#Planned-studies","page":"Drafts","title":"Planned studies","text":"","category":"section"},{"location":"Notes/Drafts/","page":"Drafts","title":"Drafts","text":"Learning steps","category":"page"},{"location":"Notes/Drafts/","page":"Drafts","title":"Drafts","text":"- [x] [Base tutorial](http://basilisk.fr/Tutorial)\n- [ ] [Review of main examples](http://basilisk.fr/src/examples/README)\n- [ ] [Review of extra examples (1)](http://basilisk.fr/sandbox/Antoonvh/README)\n- [ ] [Review of extra examples (2)](http://basilisk.fr/sandbox/M1EMN/README)\n- [ ] [Review of main tests](http://basilisk.fr/src/test/README)\n- [ ] [Review of built-it solvers](http://basilisk.fr/src/README)\n- [ ] [Dimensional analysis tutorial](http://basilisk.fr/Tutorial.dimensions)\n- [ ] [Basilisk C](http://basilisk.fr/Basilisk%20C)\n- [ ] [Past papers](http://basilisk.fr/Bibliography)","category":"page"},{"location":"Notes/Drafts/","page":"Drafts","title":"Drafts","text":"Concluding projects","category":"page"},{"location":"Notes/Drafts/","page":"Drafts","title":"Drafts","text":"- [ ] Convection equation ([samples](http://basilisk.fr/sandbox/M1EMN/README))\n- [ ] Diffusion equation ([samples](http://basilisk.fr/sandbox/M1EMN/README))\n- [ ] Burgers equation\n- [ ] Cavity flow Navier-Stokes","category":"page"},{"location":"Notes/Drafts/","page":"Drafts","title":"Drafts","text":"Advanced projects","category":"page"},{"location":"Notes/Drafts/","page":"Drafts","title":"Drafts","text":"- [ ] Carbonitriding of low alloy steels\n- [ ] JMAK kinetics and heat transfer\n- [ ] Drag-out flow in plate coating\n- [ ] Graf's acetylene decomposition flow\n- [ ] Rising bubble in fluid","category":"page"},{"location":"Notes/Drafts/","page":"Drafts","title":"Drafts","text":"Things to check","category":"page"},{"location":"Notes/Drafts/","page":"Drafts","title":"Drafts","text":"- [ ] Running simulations in parallel\n- [ ] Evaporation and combustion in sandbox\n- [ ] Examples with [granular flows](http://basilisk.fr/sandbox/M1EMN/README#examples-of-granular-flows) and [silos](http://basilisk.fr/sandbox/M1EMN/Exemples/granular_sandglass.c)\n- [ ] Rising bubble with granular flow","category":"page"},{"location":"Notes/Drafts/#Teaching-plan","page":"Drafts","title":"Teaching plan","text":"","category":"section"},{"location":"Notes/Drafts/#Week-1","page":"Drafts","title":"Week 1","text":"","category":"section"},{"location":"Notes/Drafts/","page":"Drafts","title":"Drafts","text":"In-class: Fundamentals of scientific computing (history, basics of hardware, number representations, numerical solvers, parallel computing, etc.)\nTutorial: Basics of Linux command line, VIM text editor, programming in C (with mini-projects), and Basilisk C.","category":"page"},{"location":"Notes/Drafts/#Using-ElmerGUI","page":"Drafts","title":"Using ElmerGUI","text":"","category":"section"},{"location":"Notes/Drafts/#Creating-a-case","page":"Drafts","title":"Creating a case","text":"","category":"section"},{"location":"Notes/Drafts/","page":"Drafts","title":"Drafts","text":"It is counter-intuitive, but to load a mesh in GUI one goes to File > Open, which can load several formats. Here we are using only UNV meshes generated by gmsh.\nActivate heat equation for all bodies in system and rename it to Conduction.\nAdd two materials (Portland and Refractory) and configure properties are needed.","category":"page"},{"location":"Notes/Drafts/","page":"Drafts","title":"Drafts","text":"- Under `General` provide density and heat capacity\n- Under `Heat Equation` set heat conductivity","category":"page"},{"location":"Notes/Drafts/","page":"Drafts","title":"Drafts","text":"Create an initial condition and set temperature to 298.15 K for all bodies.\nCreate boundary conditions:","category":"page"},{"location":"Notes/Drafts/","page":"Drafts","title":"Drafts","text":"- `Heat Source`at boundary 8 and set a Dirichlet condition for temperature of 813.15 K\n- `Symmetry` at boundaries 6/7 and set heat flux to 0 W (no gradient).\n- `Soil` at boundaries 1/2 and set a Dirichlet condition for temperature of 298.15 K.\n- `Environment` at boundary 3 and provide an HTC of 10 W/m/K and temperature of 298.15 K.","category":"page"},{"location":"Notes/Drafts/","page":"Drafts","title":"Drafts","text":"Go to Model > Setup and check it defaults to steady state simulation.\nInspect Model > Summary... before generating SIF file.","category":"page"},{"location":"Notes/Drafts/","page":"Drafts","title":"Drafts","text":"Generate SIF with Sif > Generate.\nNow simulation is ready to Run > Start solver, inspect logs after finish.\nBefore serious postprocessing, inspect solution with Run > Start ElmerVTK","category":"page"},{"location":"Software/OpenFOAM11/#OpenFOAM-11","page":"OpenFOAM 11","title":"OpenFOAM 11","text":"","category":"section"},{"location":"Software/OpenFOAM11/#Tips-and-reminders","page":"OpenFOAM 11","title":"Tips and reminders","text":"","category":"section"},{"location":"Software/OpenFOAM11/#General-topics","page":"OpenFOAM 11","title":"General topics","text":"","category":"section"},{"location":"Software/OpenFOAM11/","page":"OpenFOAM 11","title":"OpenFOAM 11","text":"When converting to OpenFOAM v11 viscosityModel instead of transportModel in physicalProperties files. Currently setting transportModel Newtonian does not raise any errors.\nWhen working with a 2-D extruded mesh (1-cell in thickness), the mass flow rate must be scaled by the width of the domain to keep consistency with what would be expected in 3-D.","category":"page"},{"location":"Software/OpenFOAM11/#Granular-flows","page":"OpenFOAM 11","title":"Granular flows","text":"","category":"section"},{"location":"Software/OpenFOAM11/","page":"OpenFOAM 11","title":"OpenFOAM 11","text":"It is a good idea to set SOI to a value higher than zero (dimensioned to match the global time-scale of the problem) so that flow is fully developed before particles arrive.\nIf it makes sense to do so, make parameter U0 in the entries of injectionModels of cloudProperties identical to the velocity specified for the corresponding path. In most cases this applies, except when modeling a particle jet that originates from another source outside of the computational domain.","category":"page"},{"location":"Software/OpenFOAM11/#Troubleshooting","page":"OpenFOAM 11","title":"Troubleshooting","text":"","category":"section"},{"location":"Software/OpenFOAM11/","page":"OpenFOAM 11","title":"OpenFOAM 11","text":"Wedge patch '' is not planar.: in some cases a warning regarding the precision of face normal vectors might be issued in axisymmetric cases. As it has been reported by Gerhard Holzinger, when generating the mesh the value of writePrecision in controlDict might be the cause of this problem. Increasing its value should be enough for solving the problem, and if you want to save disk space with unnecessary precision, it can be decreased back for problem solution. Notice that if running in parallel, renumberMesh and decomposePar must be run before falling back to the lower write precision.","category":"page"},{"location":"Software/OpenFOAM11/#Solver-modules","page":"OpenFOAM 11","title":"Solver modules","text":"","category":"section"},{"location":"Software/OpenFOAM11/#multicomponentFluid","page":"OpenFOAM 11","title":"multicomponentFluid","text":"","category":"section"},{"location":"Software/OpenFOAM11/","page":"OpenFOAM 11","title":"OpenFOAM 11","text":"In OpenFOAM v11 solver module multicomponentFluid provides approaches for setting up the simulation of fluids with multiple species, including combustion.","category":"page"},{"location":"Software/OpenFOAM11/#Tutorial-cases","page":"OpenFOAM 11","title":"Tutorial cases","text":"","category":"section"},{"location":"Software/OpenFOAM11/","page":"OpenFOAM 11","title":"OpenFOAM 11","text":"DLRALTS\nSandiaD_LTS\naachenBomb: global combustion kinetics of droplets released in a box.\ncounterFlowFlame2D\ncounterFlowFlame2DLTS\ncounterFlowFlame2DLTSGRITDAC\ncounterFlowFlame2D_GRI\ncounterFlowFlame2DGRITDAC\nfilter\nlockExchange\nmembrane\nnc7h16: zero dimensional model of homogeneous kinetics.\nparcelInBox: evaporation of a single water particle in a closed box.\nsimplifiedSiwek: co-combustion of coal and limestone clouds in Siwek chamber.\nsmallPoolFire2D\nsmallPoolFire3D\nverticalChannel: water droplet evaporation in a vertical channel.\nverticalChannelLTS: same as verticalChannel but with local time-stepping.\nverticalChannelSteady: same as verticalChannel but at steady state.","category":"page"},{"location":"Software/OpenFOAM11/#Built-cases","page":"OpenFOAM 11","title":"Built cases","text":"","category":"section"},{"location":"Software/OpenFOAM11/","page":"OpenFOAM 11","title":"OpenFOAM 11","text":"aachenBombSteady: this case was created as a tentative to simulate a steady spray combustion starting from aachenBomb tutorial but after several failures it became a case of its own. The case we have today was built bottom-up, from a simple flow in a box to the level of combustion, including several intermediate steps used to understand how the different options and models interacted. For now its name will remain like this in reference to where it started, but in the future I might come up with a better one.","category":"page"},{"location":"Software/OpenFOAM11/#incompressibleDenseParticleFluid","page":"OpenFOAM 11","title":"incompressibleDenseParticleFluid","text":"","category":"section"},{"location":"Software/OpenFOAM11/","page":"OpenFOAM 11","title":"OpenFOAM 11","text":"In OpenFOAM v11 solver module incompressibleDenseParticleFluid provides approaches for setting up a transient flow interacting with particles. It handles incompressible isothermal flows with fluid-particle interactions, including cases with dense packing of particles, such as packed beds or initialization of fluidized beds for solution with other approaches.","category":"page"},{"location":"Software/OpenFOAM11/#Tutorial-cases-2","page":"OpenFOAM 11","title":"Tutorial cases","text":"","category":"section"},{"location":"Software/OpenFOAM11/","page":"OpenFOAM 11","title":"OpenFOAM 11","text":"Goldschmidt\nGoldschmidtMPPIC\ncolumn\ncyclone\ninjectionChannel","category":"page"},{"location":"Software/OpenFOAM11/#Boundary-fields","page":"OpenFOAM 11","title":"Boundary fields","text":"","category":"section"},{"location":"Software/OpenFOAM11/","page":"OpenFOAM 11","title":"OpenFOAM 11","text":"Boundary fields in general are almost the same as any case in pure fluid simulations but transported quantities must be named by appending the name of the continuous phase specified in constant/physicalProperties as continuousPhaseName . To make it simple let's call this phase air in what follows. Notice that pressure file name remains unchanged since it is not really transported as you don't have an equation in the form of Reynolds transport theorem for it.","category":"page"},{"location":"Software/OpenFOAM11/","page":"OpenFOAM 11","title":"OpenFOAM 11","text":"That said, we have things as k.air and U.air. The particularity here is that you must provide phi for all hydrodynamic solution variables (such as k.air, U.air) in outlets, what is implicit in single phase flow models. That means that an outlet for velocity should include something as","category":"page"},{"location":"Software/OpenFOAM11/","page":"OpenFOAM 11","title":"OpenFOAM 11","text":"outlet\n{\n\ttype pressureInletOutletVelocity;\n\tphi phi.air;\n\tinletValue uniform (0 0 0);\n\tvalue uniform (0 0 0);\n}","category":"page"},{"location":"Software/OpenFOAM11/#Creating-cloudProperties","page":"OpenFOAM 11","title":"Creating cloudProperties","text":"","category":"section"},{"location":"Software/OpenFOAM11/","page":"OpenFOAM 11","title":"OpenFOAM 11","text":"Most default values in solution dictionary should be fine for typical fluid-particle applications, but for phase interaction it is important to configure coupled as true so that drag forces are applied to the particles and conversely, particles disturb the fluid. ","category":"page"},{"location":"Software/OpenFOAM11/","page":"OpenFOAM 11","title":"OpenFOAM 11","text":"We must also turn on cellValueSourceCorrection, which will correct cell values using latest transfer information. These elements as given in the following block (you can check the full dictionary in the official OpenFOAM tutorials for other details).","category":"page"},{"location":"Software/OpenFOAM11/","page":"OpenFOAM 11","title":"OpenFOAM 11","text":"solution\n{\n\tcoupled                   true;\n\ttransient                 yes;\n\tcellValueSourceCorrection on;\n\tmaxCo                     0.7;\n\n\t...\n}","category":"page"},{"location":"Software/OpenFOAM11/","page":"OpenFOAM 11","title":"OpenFOAM 11","text":"Being a momentum cloud, MPPICCloud makes use only of patchInteractionModel localInteraction for interaction with the environment and collisions between particles are not taken into account (that is not completely true if you consider the packing effects that can be enabled as collisions). Again, it is better to go deeper in the case studies.","category":"page"},{"location":"Software/OpenFOAM11/","page":"OpenFOAM 11","title":"OpenFOAM 11","text":"The main models for setting up a particle simulation in constant/cloudProperties are the [[Physical Models#Injection models|InjectionModel]] and the ParticleForce to be used. Notice that when dealing with incompressibleDenseParticleFluid the main ParticleForce models other than gravity are inherited by DenseDragForce.","category":"page"},{"location":"Software/OpenFOAM11/#Drag-models","page":"OpenFOAM 11","title":"Drag models","text":"","category":"section"},{"location":"Software/OpenFOAM11/","page":"OpenFOAM 11","title":"OpenFOAM 11","text":"The simplest drag model supported by discrete phase models in OpenFOAM is the sphereDrag option implemented as described by Amsden1989 [6]. Its application domain is targeted to describe fuel droplet particles in air. The drag coefficient in this case is defined in terms of particle Reynolds number mathrmRe_d as","category":"page"},{"location":"Software/OpenFOAM11/","page":"OpenFOAM 11","title":"OpenFOAM 11","text":"C_D = begincases\ndfrac24mathrmRe_dleft(1 + dfracmathrmRe_d^236right) mathrmRe_dle100012pt\n\n0424textotherwise\nendcases","category":"page"},{"location":"Software/OpenFOAM11/","page":"OpenFOAM 11","title":"OpenFOAM 11","text":"where mathrmRe_d is expressed as","category":"page"},{"location":"Software/OpenFOAM11/","page":"OpenFOAM 11","title":"OpenFOAM 11","text":"mathrmRe_d = dfracrhovertu+u^prime-vdmu(hatT)quadtextwherequadhatT=dfracT+2T_d3","category":"page"},{"location":"Software/OpenFOAM11/","page":"OpenFOAM 11","title":"OpenFOAM 11","text":"With these expressions and making C_D^prime=C_DmathrmRe_d we have the drag force over a particle of diameter d expressed as","category":"page"},{"location":"Software/OpenFOAM11/","page":"OpenFOAM 11","title":"OpenFOAM 11","text":"vecF=dfrac34dfracmmu(hatT)C_D^primerho_dd^2","category":"page"},{"location":"Software/OpenFOAM11/","page":"OpenFOAM 11","title":"OpenFOAM 11","text":"[!todo] The code implementation already provides both mu(hatT) and mathrmRe_d computed to the drag model. Additional inspection on how these quantities are evaluated is required. Also note that Amsden1989 [6] provides the equations formulated in the radius, not diameter, what might generate some confusion.","category":"page"},{"location":"Software/OpenFOAM11/","page":"OpenFOAM 11","title":"OpenFOAM 11","text":"This formulation is also used as part of distortedSphereDrag implementation , which makes use of the same C_D now referred to as C_Dsphere with a modified law accounting for particle distortion in the breakup mechanism of fuel sprays, as discussed by Liu1993 [14]. The updated drag coefficient is then expressed in terms of drop distortion y from TAB (Taylor Analogy Breakup) model from Reitz1987 [15].","category":"page"},{"location":"Software/OpenFOAM11/","page":"OpenFOAM 11","title":"OpenFOAM 11","text":"C_D = C_Dsphere(1+2632y)","category":"page"},{"location":"Software/OpenFOAM11/","page":"OpenFOAM 11","title":"OpenFOAM 11","text":"[!info] The distortedSphereDrag model is not available for MPPIC clouds and it is also not used anywhere in the tutorials or source code. For not it does not work yet apparently.","category":"page"},{"location":"Software/OpenFOAM11/#Combustion-models","page":"OpenFOAM 11","title":"Combustion models","text":"","category":"section"},{"location":"Software/OpenFOAM11/","page":"OpenFOAM 11","title":"OpenFOAM 11","text":"Models inheriting from combustionModel base class. If you are reading this section you might also be interested in building the case and testing the combustion with OpenSmoke++ or Cantera.","category":"page"},{"location":"Software/OpenFOAM11/","page":"OpenFOAM 11","title":"OpenFOAM 11","text":"Type Group Description\nEDC Turbulent Eddy Dissipation Concept turbulent combustion model. Probably the most popular approach for simulation of gas combustion in industrial processes.\nlaminar Laminar \nPaSR Laminar \nFDS Single-step \ninfinitelyFastChemistry Single-step \ndiffusion Single-step \nzoneCombustion Filter Enable the reactions within the specified list of cell-zones and set to zero elsewhere.\nnoCombustion Dummy Dummy combustion model for 'no combustion'.","category":"page"},{"location":"Software/OpenFOAM11/#Cloud-models","page":"OpenFOAM 11","title":"Cloud models","text":"","category":"section"},{"location":"Software/OpenFOAM11/","page":"OpenFOAM 11","title":"OpenFOAM 11","text":"In OpenFOAM, a cloud designate the injection of a secondary phase, generally solid particles or droplets, in a primary continuous carrier phase. The dictionary cloudProperties is identified in tutorials related to the following solver modules:","category":"page"},{"location":"Software/OpenFOAM11/","page":"OpenFOAM 11","title":"OpenFOAM 11","text":"incompressibleDenseParticleFluid\nincompressibleFluid\nmulticomponentFluid\nmultiRegion","category":"page"},{"location":"Software/OpenFOAM11/","page":"OpenFOAM 11","title":"OpenFOAM 11","text":"The default version of the dictionary provided here is not yet documented as of OpenFOAM v11 and does not contain any solver specific configurations, so the users must refer to the tutorial cases for setting up their studies. A post-processing particle tracking function associated to the dictionary is provided here (untested).","category":"page"},{"location":"Software/OpenFOAM11/","page":"OpenFOAM 11","title":"OpenFOAM 11","text":"Currently OpenFOAM implements the following cloud types:","category":"page"},{"location":"Software/OpenFOAM11/","page":"OpenFOAM 11","title":"OpenFOAM 11","text":"Cloud Description\nCollidingCloud Adds collisions to clouds.\nMomentumCloud Templated base class for momentum cloud. Adds particle forces and dispersion, injection, patch interaction, stochastic collision, and surface film models to clouds.\nParcelCloud Outermost template for parcel clouds.\nThermoCloud Templated base class for thermodynamic cloud. Adds heat transfer.\nMPPICCloud Adds MPPIC modelling to clouds.\nReactingCloud Templated base class for reacting cloud. Supports single phase with variable composition and phase change modeling.\nReactingMultiphaseCloud Templated base class for multiphase reacting cloud. Supports multiphase composition, devolatilization, and surface reactions.\nSprayCloud Templated base class for spray cloud. Supports atomization and break-up models.","category":"page"},{"location":"Software/OpenFOAM11/#[CollidingCloud](https://cpp.openfoam.org/v11/classFoam_1_1CollidingCloud.html)-models","page":"OpenFOAM 11","title":"CollidingCloud models","text":"","category":"section"},{"location":"Software/OpenFOAM11/#Collision-models","page":"OpenFOAM 11","title":"Collision models","text":"","category":"section"},{"location":"Software/OpenFOAM11/","page":"OpenFOAM 11","title":"OpenFOAM 11","text":"These inherit from CollisionModel.","category":"page"},{"location":"Software/OpenFOAM11/","page":"OpenFOAM 11","title":"OpenFOAM 11","text":"Type Description\nNoCollision Dummy class for the none option.\nPairCollision Material properties can be set in detail in sub-dictionary constantProperties. Notice that this is computationally expensive","category":"page"},{"location":"Software/OpenFOAM11/#[MomentumCloud](https://cpp.openfoam.org/v11/classFoam_1_1MomentumCloud.html)-models","page":"OpenFOAM 11","title":"MomentumCloud models","text":"","category":"section"},{"location":"Software/OpenFOAM11/#Dispersion-models","page":"OpenFOAM 11","title":"Dispersion models","text":"","category":"section"},{"location":"Software/OpenFOAM11/#Injection-models","page":"OpenFOAM 11","title":"Injection models","text":"","category":"section"},{"location":"Software/OpenFOAM11/","page":"OpenFOAM 11","title":"OpenFOAM 11","text":"These inherit from InjectionModel and implement how particles are injected into a continuous medium. The following table summarizes some of the available models.","category":"page"},{"location":"Software/OpenFOAM11/","page":"OpenFOAM 11","title":"OpenFOAM 11","text":"Type Description\nconeInjection Inject particles in a number of oriented cones. Particles can be generated from a single point or over a disk. Injection can be made at constant velocity, pressure, or with a flow rate and discharge coefficient.","category":"page"},{"location":"Software/OpenFOAM11/#Patch-interaction-models","page":"OpenFOAM 11","title":"Patch interaction models","text":"","category":"section"},{"location":"Software/OpenFOAM11/#Stochastic-collision-models","page":"OpenFOAM 11","title":"Stochastic collision models","text":"","category":"section"},{"location":"Software/OpenFOAM11/#Surface-film-models","page":"OpenFOAM 11","title":"Surface film models","text":"","category":"section"},{"location":"Software/OpenFOAM11/#[ThermoCloud](https://cpp.openfoam.org/v11/classFoam_1_1ThermoCloud.html)-models","page":"OpenFOAM 11","title":"ThermoCloud models","text":"","category":"section"},{"location":"Software/OpenFOAM11/#Heat-transfer-models","page":"OpenFOAM 11","title":"Heat transfer models","text":"","category":"section"},{"location":"Software/OpenFOAM11/","page":"OpenFOAM 11","title":"OpenFOAM 11","text":"These inherit from HeatTransferModel. It is possible to provide a Stefan flow approximation to the models by using flag BirdCorrection in the models dictionaries.","category":"page"},{"location":"Software/OpenFOAM11/","page":"OpenFOAM 11","title":"OpenFOAM 11","text":"Type Description\nNoHeatTransfer Dummy class for the none option.\nRanzMarshall The Ranz-Marshall Ranz1952 [16] correlation for heat transfer. For a more recent review, see e.g. Aissa2015a [17].","category":"page"},{"location":"Software/OpenFOAM11/#[MPPICCloud](https://cpp.openfoam.org/v11/classFoam_1_1MPPICCloud.html)-models","page":"OpenFOAM 11","title":"MPPICCloud models","text":"","category":"section"},{"location":"Software/OpenFOAM11/#Packing-models","page":"OpenFOAM 11","title":"Packing models","text":"","category":"section"},{"location":"Software/OpenFOAM11/#Isotropy-models","page":"OpenFOAM 11","title":"Isotropy models","text":"","category":"section"},{"location":"Software/OpenFOAM11/#Damping-models","page":"OpenFOAM 11","title":"Damping models","text":"","category":"section"},{"location":"Software/OpenFOAM11/#[ReactingCloud](https://cpp.openfoam.org/v11/classFoam_1_1ReactingCloud.html)-models","page":"OpenFOAM 11","title":"ReactingCloud models","text":"","category":"section"},{"location":"Software/OpenFOAM11/#Phase-change-models","page":"OpenFOAM 11","title":"Phase change models","text":"","category":"section"},{"location":"Software/OpenFOAM11/","page":"OpenFOAM 11","title":"OpenFOAM 11","text":"These inherit from PhaseChangeModel. ","category":"page"},{"location":"Software/OpenFOAM11/","page":"OpenFOAM 11","title":"OpenFOAM 11","text":"Type Description\nNoPhaseChange Dummy class for the none option.\nLiquidEvaporation Liquid evaporation model using ideal gas assumption.\nLiquidEvaporationBoil Liquid evaporation model using ideal gas assumption and includes boiling model based on Zuo2000a [18].","category":"page"},{"location":"Software/OpenFOAM11/#[ReactingMultiphaseCloud](https://cpp.openfoam.org/v11/classFoam_1_1ReactingMultiphaseCloud.html)-models","page":"OpenFOAM 11","title":"ReactingMultiphaseCloud models","text":"","category":"section"},{"location":"Software/OpenFOAM11/#Devolatilization-models","page":"OpenFOAM 11","title":"Devolatilization models","text":"","category":"section"},{"location":"Software/OpenFOAM11/#Surface-reaction-models","page":"OpenFOAM 11","title":"Surface reaction models","text":"","category":"section"},{"location":"Software/OpenFOAM11/#[SprayCloud](https://cpp.openfoam.org/v11/classFoam_1_1SprayCloud.html)-models","page":"OpenFOAM 11","title":"SprayCloud models","text":"","category":"section"},{"location":"Software/OpenFOAM11/#Atomization-models","page":"OpenFOAM 11","title":"Atomization models","text":"","category":"section"},{"location":"Software/OpenFOAM11/#Breakup-models","page":"OpenFOAM 11","title":"Breakup models","text":"","category":"section"},{"location":"Software/OpenFOAM11/","page":"OpenFOAM 11","title":"OpenFOAM 11","text":"These inherit from BreakupModel for handling particle breakup.","category":"page"},{"location":"Software/OpenFOAM11/","page":"OpenFOAM 11","title":"OpenFOAM 11","text":"Type Description\nNoBreakup \nPilchErdman \nReitzDiwakar Secondary breakup model adapted to high pressure fuel sprays.\nReitzKHRT Secondary breakup model which uses the Kelvin-Helmholtz instability theory to predict the stripped droplets and the Raleigh-Taylor instability as well.\nSHF \nETAB Enhanced TAB model for non-evaporating fuel sprays.\nTAB ","category":"page"},{"location":"Software/OpenFOAM11/#Composition-models","page":"OpenFOAM 11","title":"Composition models","text":"","category":"section"},{"location":"Software/OpenFOAM11/","page":"OpenFOAM 11","title":"OpenFOAM 11","text":"These inherit from CompositionModel and consists of carrier species (via thermo package), and additional liquids and solids. They are not attached to a type of cloud and each model supports their own cloud types.","category":"page"},{"location":"Software/OpenFOAM11/","page":"OpenFOAM 11","title":"OpenFOAM 11","text":"Type Description Support\nNoComposition Dummy class for the none option. \nSingleMixtureFraction Templated parcel multi-phase, multi-component class. ReactingMultiphaseCloud\nSinglePhaseMixture Templated parcel single phase, multi-component class. SprayCloud, ReactingCloud","category":"page"},{"location":"References/@Wang2022a/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Wang2022a/","page":"-","title":"-","text":"title: Respecting causality is all you need for training physics-informed neural networks authors: Sifan Wang, Shyam Sankaran, Paris Perdikaris year: 2022 URL: https://doi.org/10.48550/arXiv.2203.07404 Drive: https://1drv.ms/b/s!Ar4x-UlrYAiZla8hHROyjqNuK7otnA?e=U8kabk –-","category":"page"},{"location":"References/@Wang2022a/","page":"-","title":"-","text":"Supporting materials at GitHub.","category":"page"},{"location":"References/@Kee2017/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Kee2017/","page":"-","title":"-","text":"title: \"Chemically reacting flow theory, modeling, and simulation\" authors: Robert J. Kee, Michael E. Coltrin, Peter Glarborg, Huayang Zhu year: 2017 –-","category":"page"},{"location":"References/@Nabian2021a/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Nabian2021a/","page":"-","title":"-","text":"title: Efficient training of physics-informed neural networks via importance sampling authors: Mohammad Amin Nabian, Rini Jasmine Gladstone, Hadi Meidani year: 2021 URL: https://doi.org/10.48550/arXiv.2104.12325 –-","category":"page"},{"location":"References/@Shomate1954/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Shomate1954/","page":"-","title":"-","text":"title: A method for evaluating and correlating thermodynamic data authors: C. Howard Shomate year: 1954 –-","category":"page"},{"location":"Software/Fluent/#Ansys-Fluent","page":"Ansys Fluent","title":"Ansys Fluent","text":"","category":"section"},{"location":"Software/Fluent/#General-purpose","page":"Ansys Fluent","title":"General purpose","text":"","category":"section"},{"location":"Software/Fluent/","page":"Ansys Fluent","title":"Ansys Fluent","text":"Macro Notes\nData_Valid_P Test if parameters required by UDF have been initialized. It is a good practice to use this macro on top of UDF's to avoid crashes.\nMessage Displays a message, to be used from host.\nError Display and throw an error message. Compiled only.","category":"page"},{"location":"Software/Fluent/#Macro-parallelization","page":"Ansys Fluent","title":"Macro parallelization","text":"","category":"section"},{"location":"Software/Fluent/","page":"Ansys Fluent","title":"Ansys Fluent","text":"Macro Notes\nPRINCIPAL_FACE_P When looping across faces in a thread using begin_f_loop (or another equivalent macro) in a parallel setting, we might access elements that actually belong to other nodes (because of how MPI works). This macro allows us to check the current face is part of the chunk belonging to current node, what allows us to avoid computing a quantity multiple times, leading to wrong results. Compiled only.\nRP_HOST Used in #if directives to tell code must be evaluated only in host.\nRP_NODE Used in #if directives to tell code must be evaluated only in nodes.\nPRF_GRSUM1 Performs aggregation of real R values through sum SUM1. This function is called in nodes and there are other cousins for different aggregations.\nnode_to_host_{type}_{n} Pass n values of type from node to host. It is called after, e.g. aggregations such as PRF_GRSUM1 are used in node. There is also an equivalent host_to_node_{type}_{n}.","category":"page"},{"location":"References/@Guo2023a/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Guo2023a/","page":"-","title":"-","text":"title: \"Unraveling the design pattern of physics-informed neural networks: Series 01\" authors: Shuai Guo year: 2023 URL: https://towardsdatascience.com/unraveling-the-design-pattern-of-physics-informed-neural-networks-series-01-8190df459527 –-","category":"page"},{"location":"References/@Guo2023a/","page":"-","title":"-","text":"In this post, the author discusses the work by [[@Wu2022a]] in what concerns the adaptive (resampling and refinement) residual point distribution to boost training and accuracy.","category":"page"},{"location":"References/@Guo2023a/","page":"-","title":"-","text":"Approaches:","category":"page"},{"location":"References/@Guo2023a/","page":"-","title":"-","text":"RAD: residual-based adaptive distribution (more expensive)\nRAR-D: residual-based adaptive refinement with distribution (robust)\nBoth are less useful under smooth solutions (activate when required)","category":"page"},{"location":"References/@Guo2023a/","page":"-","title":"-","text":"Key idea: resample with a probability proportional to residual","category":"page"},{"location":"References/@Guo2023a/","page":"-","title":"-","text":"p(x) propto fracvarepsilon^k(x)𝔼varepsilon^k(x)+C","category":"page"},{"location":"References/@Guo2023a/","page":"-","title":"-","text":"Other references of interest are:","category":"page"},{"location":"References/@Guo2023a/","page":"-","title":"-","text":"[[@Lu2019a]]: residual-based adaptive refinement (RAR-D with high k)\n[[@Nabian2021a]]: importance sampling (RAD with k=1 and c=0)","category":"page"},{"location":"References/@Fiedler2007a/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Fiedler2007a/","page":"-","title":"-","text":"title: \"Calculation of the effective thermal conductivity in composites using finite element and monte carlo methods\" authors: Thomas Fiedler, Andreas Öchsner, Nilindu Muthubandara, Irina V. Belova, Graeme E. Murch year: 2007 –-","category":"page"},{"location":"References/@Koh1973a/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Koh1973a/","page":"-","title":"-","text":"title: \"Prediction of thermal conductivity and electrical resistivity of porous metallic materials\" authors: J. C. Y. Koh, Anthony Fortini year: 1973 –-","category":"page"},{"location":"References/@Aparicio1994/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Aparicio1994/","page":"-","title":"-","text":"title: \"Ammonia synthesis kinetics: Surface chemistry, rate expressions, and kinetic analysis\" authors: Luis M. Aparicio, James A. Dumesic year: 1994 –-","category":"page"},{"location":"References/@Chikhi2020a/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Chikhi2020a/","page":"-","title":"-","text":"title: \"Effective thermal conductivity of porous biomaterials: Numerical investigation\" authors: M. Chikhi year: 2020 –-","category":"page"},{"location":"References/@Guo2023f/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Guo2023f/","page":"-","title":"-","text":"title: \"Unraveling the design pattern of physics-informed neural networks: Series 06\" authors: Shuai Guo year: 2023 URL: https://towardsdatascience.com/unraveling-the-design-pattern-of-physics-informed-neural-networks-part-06-bcb3557199e2 –-","category":"page"},{"location":"References/@Lagaris1997a/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Lagaris1997a/","page":"-","title":"-","text":"title: Artificial neural networks for solving ordinary and partial differential equations authors: I. E. Lagaris, A. Likas, D. I. Fotiadis year: 1997 –-","category":"page"},{"location":"References/@Pia2016a/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Pia2016a/","page":"-","title":"-","text":"title: \"Porosity and pore size distribution influence on thermal conductivity of yttria-stabilized zirconia: Experimental findings and model predictions\" authors: Giorgio Pia, Ludovica Casnedi, Ulrico Sanna year: 2016 –-","category":"page"},{"location":"References/@Gidaspow1994/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Gidaspow1994/","page":"-","title":"-","text":"title: \"Multiphase flow and fluidization: continuum and kinetic theory descriptions with applications\" authors: Dimitri Gidaspow year: 1994 URL: TODO –-","category":"page"},{"location":"Science/01-Theoretical-Physics/#Theoretical-Physics","page":"Theoretical Physics","title":"Theoretical Physics","text":"","category":"section"},{"location":"Science/01-Theoretical-Physics/","page":"Theoretical Physics","title":"Theoretical Physics","text":"This notes track my studies of theoretical physics rather than providing content by themselves. Currently I am following the text by Joos1958 [23] because of its self-contained aspects. The text assumes previous knowledge of Calculus, and the reader familiar with the subject may simply skim the first part; in some topics the author provide better physical context than normal Calculus textbooks, what may be interesting.","category":"page"},{"location":"Modules/DryFlowsheet/#DryFlowsheet","page":"DryFlowsheet","title":"DryFlowsheet","text":"","category":"section"},{"location":"Modules/DryFlowsheet/","page":"DryFlowsheet","title":"DryFlowsheet","text":"CurrentModule = DryFlowsheet\nEditURL = \"https://github.com/wallytutor/WallyToolbox.jl/blob/main/docs/src/Modules/DryFlowsheet.md\"","category":"page"},{"location":"Modules/DryFlowsheet/","page":"DryFlowsheet","title":"DryFlowsheet","text":"Modules = [ DryFlowsheet ]","category":"page"},{"location":"Modules/DryFlowsheet/#DryFlowsheet.CooledCrushingMill","page":"DryFlowsheet","title":"DryFlowsheet.CooledCrushingMill","text":"Represents a crushing device with cooling system.\n\nModels\n\n:TARGET_COOLANT_TEMP evaluates the heat transfer lost to coolant provided a target final stream temperature given by keyword argument temp_out. Product temperature is updated through an EnergyStream built with energy exchange computed through exchanged_heat, so that numerical value can be slightly different from target value.\n:USING_GLOBAL_HTC makes use of a global heat transfer coefficient to evaluate heat flux across the cooling stream.\n\nAttributes\n\nrawmeal: The input meal applied to crushing process.\nproduct: The output material stream at the end of product pipeline.\ncoolant: The output material stream at the end of cooling pipeline.\npower: The power applied to the crushing process [W]\nloss: The heat exchanged in between product and cooling pipelines [W].\nglobalhtc: Global heat transfer coefficient [W/K].\n\n\n\n\n\n","category":"type"},{"location":"Modules/DryFlowsheet/#DryFlowsheet.EnergyStream","page":"DryFlowsheet","title":"DryFlowsheet.EnergyStream","text":"Represents an energy stream.\n\nAttributes\n\nḣ: Energy flow provided by stream [W].\n\n\n\n\n\n","category":"type"},{"location":"Modules/DryFlowsheet/#DryFlowsheet.MaterialStream","page":"DryFlowsheet","title":"DryFlowsheet.MaterialStream","text":"Represents a material stream.\n\nAttributes\n\nṁ: Material mass flow rate [kg/s].\nT: Stream temperature [K].\nP: Stream pressure [Pa].\nY: Components mass fractions [-].\npipeline: Materials pipeline associated to Y.\n\n\n\n\n\n","category":"type"},{"location":"Modules/DryFlowsheet/#DryFlowsheet.SolidsSeparator","page":"DryFlowsheet","title":"DryFlowsheet.SolidsSeparator","text":"Represents a solids separator with efficiency η.\n\nTo-do's\n\nAdd inverse model to automatically tune efficiency η.\n\nAttributes\n\nη: Solids separation efficiency [-].\nsource: The stream to be separated into solids and others.\nsolids: The output solids stream.\nothers: The output remaining stream.\n\n\n\n\n\n","category":"type"},{"location":"Modules/DryFlowsheet/#DryFlowsheet.StreamPipeline","page":"DryFlowsheet","title":"DryFlowsheet.StreamPipeline","text":"Array of materials to include in a stream.\n\n\n\n\n\n","category":"type"},{"location":"Modules/DryFlowsheet/#DryFlowsheet.TransportPipeline","page":"DryFlowsheet","title":"DryFlowsheet.TransportPipeline","text":"Represents a pipeline with heat transfer.\n\nModels\n\n:TARGET_EXIT_TEMP evaluates the heat transfer lost to environment provided a target final stream temperature given by keyword argument temp_out. Product temperature is updated through an EnergyStream built with energy exchange computed through exchanged_heat, so that numerical value can be slightly different from target value.\n:USING_GLOBAL_HTC makes use of a global heat transfer coefficient to evaluate heat flux across the pipe.\n\nTo-do's\n\nImplement heat transfer losses through a convective heat transfer coefficient (HTC) computed from a suitable Nusselt number, for use of pipeline in simulation mode.\n\nAttributes\n\nproduct: The output material stream at the end of pipeline.\npower: The heat exchanged in pipeline [W].\n\n\n\n\n\n","category":"type"},{"location":"Modules/DryFlowsheet/#DryFlowsheet.cooled_crushing-Tuple{}","page":"DryFlowsheet","title":"DryFlowsheet.cooled_crushing","text":"Manage use of CooledCrushingMill with different models.\n\n\n\n\n\n","category":"method"},{"location":"Modules/DryFlowsheet/#DryFlowsheet.enthalpyflowrate","page":"DryFlowsheet","title":"DryFlowsheet.enthalpyflowrate","text":"Enthalpy flow rate of given stream [W].\n\n\n\n\n\n","category":"function"},{"location":"Modules/DryFlowsheet/#DryFlowsheet.exchanged_heat-Tuple{MaterialStream, Any}","page":"DryFlowsheet","title":"DryFlowsheet.exchanged_heat","text":"Heat exchanged with stream to match outlet temperature.\n\n\n\n\n\n","category":"method"},{"location":"Modules/DryFlowsheet/#DryFlowsheet.transport_pipe-NTuple{4, Any}","page":"DryFlowsheet","title":"DryFlowsheet.transport_pipe","text":"Manage use of TransportPipeline with different models.\n\n\n\n\n\n","category":"method"},{"location":"References/@MaierKelley1932/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@MaierKelley1932/","page":"-","title":"-","text":"title: \"An equation for the representation of high-temperature heat content data\" authors: Charles G. Maier, Kenneth Keith Kelley year: 1932 –-","category":"page"},{"location":"Notebooks/06-Heat-Transfer-FVM/#Heat-transfer-with-FVM","page":"Heat transfer with FVM","title":"Heat transfer with FVM","text":"","category":"section"},{"location":"Notebooks/06-Heat-Transfer-FVM/","page":"Heat transfer with FVM","title":"Heat transfer with FVM","text":"using CairoMakie\nusing DelaunayTriangulation\nusing DifferentialEquations\nusing FiniteVolumeMethod\nnothing; #hide","category":"page"},{"location":"Notebooks/06-Heat-Transfer-FVM/","page":"Heat transfer with FVM","title":"Heat transfer with FVM","text":"# Values at boundaries:\nTxl = 813.15\nTxr = 298.15\n\n# Domain physical dimensions:\nLx = (0.0, 0.15)\nLy = (0.0, 0.05)\n\n# Number of cells over each direction:\nnx = 25\nny = 5\n\n# Integration time:\nfinal_time = 2.0\nnothing; #hide","category":"page"},{"location":"Notebooks/06-Heat-Transfer-FVM/","page":"Heat transfer with FVM","title":"Heat transfer with FVM","text":"# Position dependent initial condition:\nf_ic = (x, y) -> 298.15\n\n# Diffusion coefficient:\ndiffusion_function = (x, y, t, u, p) -> begin\n (x < 0.05) ? 1.0 : 5.0\nend\nnothing; #hide","category":"page"},{"location":"Notebooks/06-Heat-Transfer-FVM/","page":"Heat transfer with FVM","title":"Heat transfer with FVM","text":"# XXX: documentation of single_boundary is wrong!\ntri = triangulate_rectangle(Lx..., Ly..., nx, ny, single_boundary = false)\n\n# Create finite volume mesh:\nmesh = FVMGeometry(tri)\n\n# Display grid\nwith_theme() do\n fig, ax, sc = triplot(tri)\n fig\nend","category":"page"},{"location":"Notebooks/06-Heat-Transfer-FVM/","page":"Heat transfer with FVM","title":"Heat transfer with FVM","text":"# Set boundary conditions: bottom, right, top, left\nBCs = let\n functions = (\n (x, y, t, u, p) -> zero(u),\n (x, y, t, u, p) -> Txr * one(u),\n (x, y, t, u, p) -> zero(u),\n (x, y, t, u, p) -> Txl * one(u),\n )\n\n conditions = (\n Neumann,\n Dirichlet,\n Neumann,\n Dirichlet,\n )\n\n BoundaryConditions(mesh, functions, conditions)\nend\n\ninitial_condition = [f_ic(x, y) for (x, y) in DelaunayTriangulation.each_point(tri)]\nnothing; #hide","category":"page"},{"location":"Notebooks/06-Heat-Transfer-FVM/","page":"Heat transfer with FVM","title":"Heat transfer with FVM","text":"prob = FVMProblem(mesh, BCs;\n diffusion_function,\n initial_condition,\n final_time)\n\nsol = solve(prob, saveat=1.0)","category":"page"},{"location":"Notebooks/06-Heat-Transfer-FVM/","page":"Heat transfer with FVM","title":"Heat transfer with FVM","text":"with_theme() do\n levels = 250:50.0:850\n limits = extrema(levels)\n colormap = :turbo\n flipaxis = true\n\n width = 450\n height = 150\n xlabel = \"x [m]\"\n ylabel = \"y [m]\"\n\n n_sol = size(sol.u)[1]\n m_sol = div(n_sol, 2)\n\n fig = Figure(fontsize = 24, figure_padding = 35)\n\n for (i, j) in zip(1:3, (1, m_sol, n_sol))\n ax = Axis(fig[i, 1]; width, height, xlabel, ylabel,\n title = \"t = $(sol.t[j])\", titlealign = :left)\n\n tricontourf!(ax, tri, sol.u[j]; levels, colormap,)\n tightlimits!(ax)\n\n hideydecorations!(ax)\n end\n \n Colorbar(fig[:, end+3]; limits, colormap, flipaxis,\n ticks=(300:100:900, string.(300:100:900)))\n\n resize_to_layout!(fig)\n fig\nend","category":"page"},{"location":"References/@Saario2005a/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Saario2005a/","page":"-","title":"-","text":"title: Heavy fuel oil combustion in a cylindrical laboratory furnace: measurements and modeling authors: A. Saario, A. Rebola, P. Coelho, M. Costa, A. Oksanen year: 2005 –-","category":"page"},{"location":"Notebooks/08-Kramers-Model-Validation/#Kramers'-model","page":"Kramers' model","title":"Kramers' model","text":"","category":"section"},{"location":"Notebooks/08-Kramers-Model-Validation/","page":"Kramers' model","title":"Kramers' model","text":"using WallyToolbox\nusing DryGranular\n\nusing CairoMakie\nusing CSV\nusing DataFrames\nusing Latexify\nusing Printf","category":"page"},{"location":"Notebooks/08-Kramers-Model-Validation/#Reference-data","page":"Kramers' model","title":"Reference data","text":"","category":"section"},{"location":"Notebooks/08-Kramers-Model-Validation/","page":"Kramers' model","title":"Kramers' model","text":"Below we provide a set of partial data from Kramers (1952) Table 3.","category":"page"},{"location":"Notebooks/08-Kramers-Model-Validation/","page":"Kramers' model","title":"Kramers' model","text":"const DATA_TABLE3 = \"\"\"\\\nρ,γ,tan(β),n,ṁ,prod_dimless,η̄ᵣ,hold_real\n1480.0,36.0,0.0094,0.059,5.15e-03,18.3,0.111,8.10\n1480.0,36.0,0.0094,0.090,2.68e-03,6.25,0.054,5.00\n1480.0,36.0,0.0094,0.195,1.32e-02,14.2,0.088,7.75\n1480.0,36.0,0.0094,0.232,7.24e-03,6.55,0.043,3.85\n1480.0,36.0,0.0100,0.040,6.38e-03,29.7,0.169,13.3\n1480.0,36.0,0.0100,0.040,5.00e-03,23.2,0.144,11.2\n1480.0,36.0,0.0100,0.069,9.20e-03,24.8,0.150,10.6\n1480.0,36.0,0.0100,0.069,6.53e-03,17.6,0.113,8.50\n1480.0,36.0,0.0100,0.106,1.50e-02,27.8,0.162,12.2\n1480.0,36.0,0.0100,0.159,1.20e-02,14.0,0.092,7.49\n1480.0,36.0,0.0100,0.238,1.55e-02,12.1,0.083,7.48\n1480.0,36.0,0.0100,0.238,1.19e-02,9.22,0.068,6.13\n\"\"\"\nnothing; #hide","category":"page"},{"location":"Notebooks/08-Kramers-Model-Validation/","page":"Kramers' model","title":"Kramers' model","text":"\"Compares approximate analytical to numerical solution.\"#hide\nfunction solvekiln(; L, D, Φ, ω, β, γ, d, show = true)#hide\n model = RotaryKilnBedSolution(;#hide\n model = SymbolicLinearKramersModel(),#hide\n L = L,#hide\n R = D / 2.0,#hide\n Φ = Φ / 3600.0,#hide\n ω = ω / 60.0,#hide\n β = deg2rad(β),#hide\n γ = deg2rad(γ),#hide\n d = d / 1000.0#hide\n )#hide\n#hide\n optim = kramersnlapprox(;#hide\n z = model.z,#hide\n R = D / 2.0,#hide\n Φ = Φ / 3600.0,#hide\n ω = ω / 60.0,#hide\n β = deg2rad(β),#hide\n γ = deg2rad(γ),#hide\n d = d / 1000.0#hide\n )#hide\n#hide\n f = nothing#hide\n ax = nothing#hide\n#hide\n if show#hide\n f = Figure()#hide\n ax = Axis(f[1, 1])#hide\n#hide\n lines!(ax, 100model.z/L, 100model.h, linewidth = 3, label = \"Numerical\")#hide\n lines!(ax, 100optim.z/L, 100optim.h, linewidth = 3, label = \"Analytical\")#hide\n#hide\n a = @sprintf(\"%.1f\", model.ηₘ)#hide\n b = @sprintf(\"%.1f\", optim.ηₘ)#hide\n title = \"Loading: $(a)% (numerical) | $(b)% (analytical)\"#hide\n#hide\n ax.title = title#hide\n ax.xlabel = \"Coordinate [%]\"#hide\n ax.ylabel = \"Bed height [cm]\"#hide\n ax.xticks = 0.0:20.0:100.0#hide\n xlims!(ax, extrema(ax.xticks.val))#hide\n end#hide\n#hide\n return model, optim, f, ax#hide\nend#hide\nnothing; # hide","category":"page"},{"location":"Notebooks/08-Kramers-Model-Validation/","page":"Kramers' model","title":"Kramers' model","text":"\"Reference case for alumina kiln testing.\"# hide\nfunction aluminakiln(ṁ, ω; show = false)# hide\n # Density of bed [kg/m³]# hide\n ρ = 800.0# hide\n L = 34.0# hide\n D = 1.5# hide\n β = atan(0.025)# hide\n# hide\n model, optim, f, ax = solvekiln(# hide\n L = L,# hide\n D = D,# hide\n Φ = (1000// 24) * ṁ / ρ,# hide\n ω = ω,# hide\n β = rad2deg(β),# hide\n γ = 33.0,# hide\n d = 0.050,# hide\n show = show# hide\n )# hide\n# hide\n τₚ = perryresidence(L, ω, D, β)# hide\n# hide\n return model, optim, f, ax, τₚ# hide\nend# hide\nnothing; # hide","category":"page"},{"location":"Notebooks/08-Kramers-Model-Validation/","page":"Kramers' model","title":"Kramers' model","text":"\"Run `aluminakiln` against some known conditions.\"# hide\nfunction scanaluminakiln()# hide\n ṁlist = [33.6, 43.2]# hide\n ωlist = [0.85, 1.20]# hide\n# hide\n df = DataFrame(# hide\n ṁ = Float64[],# hide\n ω = Float64[],# hide\n η̄ = Float64[],# hide\n τᵢ = Float64[],# hide\n τₚ = Float64[]# hide\n )# hide\n# hide\n for ṁ ∈ ṁlist, ω ∈ ωlist# hide\n model, _, _, _, τ = aluminakiln(ṁ, ω, show = false)# hide\n η̄ = round(model.ηₘ, digits = 0)# hide\n τᵢ = round(model.τ / 60.0, digits = 0)# hide\n τₚ = round(τ, digits = 0)# hide\n push!(df, [ṁ ω η̄ τᵢ τₚ])# hide\n end# hide\n# hide\n return df# hide\nend# hide\nnothing; # hide","category":"page"},{"location":"Notebooks/08-Kramers-Model-Validation/","page":"Kramers' model","title":"Kramers' model","text":"in1_to_m1(v) = 0.0254 * v# hide\nft1_to_m1(v) = in1_to_m1(12.0) * v# hide\nft3_to_m3(v) = ft1_to_m1(1.0)^3 * v# hide\n# hide\n# Kiln length [m]# hide\nL = ft1_to_m1(45.0)# hide\n# hide\n# Kiln diameter [m]# hide\nD = 2 * ft1_to_m1(3.1)# hide\n# hide\n# Volume flow rate [m³/h]# hide\nΦ = ft3_to_m3(6.1) * 60# hide\n# hide\n# Rotation rate (+0.0005) [rev/min]# hide\nω = 0.0505 * 60.0# hide\n# hide\n# Kiln slope (0.5in/ft) [°]# hide\nβ = rad2deg(atan(0.5 / 12))# hide\n# hide\n# Repose angle [°]# hide\nγ = 45.0# hide\n# hide\n# Particle size [mm]# hide\nd = 0.050# hide\n# hide\n# Conversions to match model inputs.# hide\nR = D / 2.0# hide\nΦ = Φ / 3600.0# hide\nω = ω / 60.0# hide\nβ = deg2rad(β)# hide\nγ = deg2rad(γ)# hide\nd = d / 1000.0# hide\n# hide\n# Create problem container.# hide\nkramers = RotaryKilnBedSolution(;# hide\n model = SymbolicLinearKramersModel(),# hide\n L = L,# hide\n R = R,# hide\n Φ = Φ,# hide\n ω = ω,# hide\n β = β,# hide\n γ = γ,# hide\n d = d# hide\n)# hide\n# hide\noptim = kramersnlapprox(;# hide\n z = kramers.z,# hide\n R = R,# hide\n Φ = Φ,# hide\n ω = ω,# hide\n β = β,# hide\n γ = γ,# hide\n d = d# hide\n)# hide\n# hide\nkramers_NΦ = dimlessNΦ(R, β, ω, Φ, γ)# hide\nkramers_Nₖ = dimlessNₖ(L, R, β, γ)# hide\nkramers_η̄ₛ = sullivansηₘ(R, β, ω, Φ, γ)# hide\nkramers_ref = kramers# hide\noptim_ref = optim# hide\nnothing;# hide","category":"page"},{"location":"Notebooks/08-Kramers-Model-Validation/#Sample-reference-case","page":"Kramers' model","title":"Sample reference case","text":"","category":"section"},{"location":"Notebooks/08-Kramers-Model-Validation/","page":"Kramers' model","title":"Kramers' model","text":"Here we make use of the current implementation to check if it correctly approximates the last example provided in reference paper from [[@Kramers1952]]. To minimize rounding errors causes by unit conversions, we provide the required functions to convert from imperial to international system in the solution process.","category":"page"},{"location":"Notebooks/08-Kramers-Model-Validation/","page":"Kramers' model","title":"Kramers' model","text":"The next table summarizes the results. It is seen that the dimensionless numbers are well approximated. It must be emphasized that the reference estimates η̄ᵣ by a graphical method – it was 1952 – and the current value is considered a good enough approximation. Additionally, the equation was not integrated numerically as done here, but engineering relationships were used in the approximation. That said, the proper loading to be considered in our days is η̄ᵢ.","category":"page"},{"location":"Notebooks/08-Kramers-Model-Validation/","page":"Kramers' model","title":"Kramers' model","text":"DataFrame(# hide\n Quantity = [# hide\n \"NΦ\",# hide\n \"Nₖ\",# hide\n \"η̄ᵣ\",# hide\n \"η̄ᵢ\",# hide\n ],# hide\n Reference = [# hide\n \"1.15\",# hide\n \"1.17\",# hide\n \"5.65\",# hide\n @sprintf(\"%.2f\", optim_ref.ηₘ)# hide\n ],# hide\n Computed = [# hide\n @sprintf(\"%.2f\", kramers_NΦ),# hide\n @sprintf(\"%.2f\", kramers_Nₖ),# hide\n @sprintf(\"%.2f\", kramers_η̄ₛ),# hide\n @sprintf(\"%.2f\", kramers_ref.ηₘ)# hide\n ]# hide\n)# hide","category":"page"},{"location":"Notebooks/08-Kramers-Model-Validation/","page":"Kramers' model","title":"Kramers' model","text":"Note: the last value in column Reference above is not provided in Kramers' paper but computed from the approximate analytical solution provided by the authors. As we see here, it may get >20% error under some circumstances.","category":"page"},{"location":"Notebooks/08-Kramers-Model-Validation/#Verification-of-*Table-3*","page":"Kramers' model","title":"Verification of Table 3","text":"","category":"section"},{"location":"Notebooks/08-Kramers-Model-Validation/","page":"Kramers' model","title":"Kramers' model","text":"In the next cell we provide the kiln dimensions used by Kramers (1952) to experimentally validate the model. Some data from their Tab. 3 is then loaded and all rows are simulated with current model. Fractional hold-up seems to be well correlated at least to a few percent of the reference value.","category":"page"},{"location":"Notebooks/08-Kramers-Model-Validation/","page":"Kramers' model","title":"Kramers' model","text":"let# hide\n Dₖ = 0.197# hide\n Lₖ = 1.780# hide\n dₖ = 0.0012# hide\n# hide\n table3 = DataFrame(CSV.File(IOBuffer(DATA_TABLE3)))# hide\n table3[!, \"η̄ᵢ\"] = zeros(length(table3[!, \"η̄ᵣ\"]))# hide\n table3[!, \"η̄ᵣ\"] *= 100# hide\n# hide\n model = SymbolicLinearKramersModel()# hide\n# hide\n for (i, row) in enumerate(eachrow(table3))# hide\n Φ = 3600.0 * row[\"ṁ\"] / row[\"ρ\"]# hide\n ω = row[\"n\"] * 60.0# hide\n β = rad2deg(atan(row[\"tan(β)\"]))# hide\n γ = row[\"γ\"]# hide\n# hide\n kramers = RotaryKilnBedSolution(;# hide\n model = model,# hide\n L = Lₖ,# hide\n R = Dₖ / 2.0,# hide\n Φ = Φ / 3600.0,# hide\n ω = ω / 60.0,# hide\n β = deg2rad(β),# hide\n γ = deg2rad(γ),# hide\n d = dₖ / 1000.0# hide\n )# hide\n# hide\n table3[i, \"η̄ᵢ\"] = round(kramers.ηₘ, digits = 1)# hide\n end# hide\n# hide\n exclude = [\"ρ\", \"γ\", \"prod_dimless\", \"hold_real\"]# hide\n select(table3, Not(exclude))# hide\nend# hide","category":"page"},{"location":"Notebooks/08-Kramers-Model-Validation/#Dimensionless-profiles","page":"Kramers' model","title":"Dimensionless profiles","text":"","category":"section"},{"location":"Notebooks/08-Kramers-Model-Validation/","page":"Kramers' model","title":"Kramers' model","text":"Next step in validation is to check profiles in dimensionless format, as done by Kramers in their Fig. 3. Notice that here we used the numerical integration curves instead of the analytical approximation of profiles, so reproduction and consequences of results are not exactly the same.","category":"page"},{"location":"Notebooks/08-Kramers-Model-Validation/","page":"Kramers' model","title":"Kramers' model","text":"let# hide\n ρ = 1480.0# hide\n L = 20.0# hide\n D = 0.197# hide\n Φ = 5.15e-03 / ρ * 3600# hide\n ω = 0.059 * 60# hide\n β = rad2deg(atan(0.0094))# hide\n γ = 36.0# hide\n# hide\n # Conversions to match model inputs.# hide\n R = D / 2.0# hide\n Φ = Φ / 3600.0# hide\n ω = ω / 60.0# hide\n β = deg2rad(β)# hide\n γ = deg2rad(γ)# hide\n# hide\n # Things held constant in loop.# hide\n NΦ = dimlessNΦ(R, β, ω, Φ, γ)# hide\n Nₖ = dimlessNₖ(L, R, β, γ)# hide\n model = SymbolicLinearKramersModel()# hide\n# hide\n f = Figure()# hide\n ax = Axis(f[1, 1])# hide\n# hide\n for d in [0.05, 0.10, 0.15, 0.193, 0.25]# hide\n kramers = RotaryKilnBedSolution(;# hide\n model = model,# hide\n L = L,# hide\n R = R,# hide\n Φ = Φ,# hide\n ω = ω,# hide\n β = β,# hide\n γ = γ,# hide\n d = d * R * NΦ# hide\n )# hide\n# hide\n # Dimensionless axes.# hide\n z = kramers.z# hide\n h = kramers.h / (R * NΦ)# hide\n z = @. (L - z) / L * 1 / (NΦ * Nₖ)# hide\n z = @. z[1] - z# hide\n# hide\n label = @sprintf(\"%.3f\", d)# hide\n lines!(ax, z, h; linewidth = 2, label = label)# hide\n end# hide\n# hide\n ax.title = \"Dimensionless loading curves\"# hide\n ax.xlabel = \"Coordinate\"# hide\n ax.ylabel = \"Bed height\"# hide\n ax.xticks.val = 0.0:0.1:0.5# hide\n ax.yticks.val = 0.05:0.05:0.25# hide\n xlims!(ax, extrema(ax.xticks.val))# hide\n ylims!(ax, extrema(ax.yticks.val))# hide\n axislegend(ax; position = :rb)# hide\n# hide\n f# hide\nend# hide","category":"page"},{"location":"Notebooks/08-Kramers-Model-Validation/#Comparison-with-analytical","page":"Kramers' model","title":"Comparison with analytical","text":"","category":"section"},{"location":"Notebooks/08-Kramers-Model-Validation/","page":"Kramers' model","title":"Kramers' model","text":"The final step in model validation is to compare the approximate analytical solution proposed by Kramers and the results of numerical integration. It is worth mentioning that numerical integration remains the recommended method because one does not need to verify the ranges of validity of analytical approximation for every use case.","category":"page"},{"location":"Notebooks/08-Kramers-Model-Validation/","page":"Kramers' model","title":"Kramers' model","text":"let# hide\n _, _, f, ax = solvekiln(# hide\n L = 10.0,# hide\n D = 1.0,# hide\n Φ = 1.0,# hide\n ω = 1.0,# hide\n β = 3.0,# hide\n γ = 45.0,# hide\n d = 0.001# hide\n )# hide\n# hide\n ax.yticks = 0.0:4.0:20.0# hide\n ylims!(ax, extrema(ax.yticks.val))# hide\n f# hide\nend# hide","category":"page"},{"location":"Notebooks/08-Kramers-Model-Validation/#Industrial-cases","page":"Kramers' model","title":"Industrial cases","text":"","category":"section"},{"location":"Notebooks/08-Kramers-Model-Validation/","page":"Kramers' model","title":"Kramers' model","text":"The following illustrates a practical use case of the model. Next we scan a parameter space to confirm once again the model suitability as an alternative to analytical engineering estimations as per Perry's .","category":"page"},{"location":"Notebooks/08-Kramers-Model-Validation/","page":"Kramers' model","title":"Kramers' model","text":"let# hide\n ṁ = 33.6# hide\n ω = 0.85# hide\n _, _, f, ax, _ = aluminakiln(ṁ, ω, show = true)# hide\n ax.yticks = 0.0:6.0:30.0# hide\n ylims!(ax, extrema(ax.yticks.val))# hide\n f# hide\nend# hide","category":"page"},{"location":"Notebooks/08-Kramers-Model-Validation/","page":"Kramers' model","title":"Kramers' model","text":"The following table confirms the expected values as per Perry's handbook.","category":"page"},{"location":"Notebooks/08-Kramers-Model-Validation/","page":"Kramers' model","title":"Kramers' model","text":"scanaluminakiln() # hide","category":"page"},{"location":"References/@Luikov1968a/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Luikov1968a/","page":"-","title":"-","text":"title: \"Thermal conductivity of porous systems\" authors: A.V. Luikov, A.G. Shashkov, L.L. Vasiliev, Yu.E. Fraiman year: 1968 –-","category":"page"},{"location":"References/@Lu2019a/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Lu2019a/","page":"-","title":"-","text":"title: \"DeepXDE: A deep learning library for solving differential equations\" authors: Lu Lu, Xuhui Meng, Zhiping Mao, George E. Karniadakis year: 2019 URL: https://doi.org/10.48550/arXiv.1907.04502 Drive: https://1drv.ms/b/s!Ar4x-UlrYAiZla8eg-cL7mDKg_muqQ?e=hcIqTb –-","category":"page"},{"location":"Software/Basilisk/#Basilisk","page":"Basilisk","title":"Basilisk","text":"","category":"section"},{"location":"Software/Basilisk/","page":"Basilisk","title":"Basilisk","text":"The goal of this material is to provide support to teaching introductory computational fluid mechanics with aid of Basilisk. The studies are based on commented tutorials and a documentation guide extending what is already provided with the package.","category":"page"},{"location":"Software/Basilisk/","page":"Basilisk","title":"Basilisk","text":"Before going over the tutorials, you need some C knowledge. In the future I intend to provide a synthetic version applied to Basilisk students only. For now, the referred one is pretty good.","category":"page"},{"location":"Software/Basilisk/#First-steps","page":"Basilisk","title":"First steps","text":"","category":"section"},{"location":"Software/Basilisk/","page":"Basilisk","title":"Basilisk","text":"The source code for the studies is provided here. The repository keeps a copy of Basilisk at a version that will work with all modified tutorials. It may be eventually updated, but in that case functioning of tutorials will be tested. You will need to clone it then following the steps to compile Basilisk before starting. After building Basilisk, instead of adding variables to your environment, consider sourcing them temporarily with help of source activate.sh using the provided script.","category":"page"},{"location":"Software/Basilisk/","page":"Basilisk","title":"Basilisk","text":"All tutorials are found under src. Just enter the tutorials you want to follow using the command line and run make. This not only will compile, but will also run and post-process results.","category":"page"},{"location":"Software/Basilisk/#Project-management","page":"Basilisk","title":"Project management","text":"","category":"section"},{"location":"Software/Basilisk/","page":"Basilisk","title":"Basilisk","text":"Although Basilisk is a very interesting dialect of C, its documentation is still old-fashioned and lack some structuration. Also sample programs are not written to be easily managed and extended for use in variant cases. Here we propose a structure for creating better projects with Basilisk:","category":"page"},{"location":"Software/Basilisk/","page":"Basilisk","title":"Basilisk","text":"A Basilisk project lives in its own folder: one executable means one directory.\nA simpler Makefile than Basilisk's default one is used for project building.\nThe main file is called app.c and contains a very simple structure as provided in the dummy listing bellow. All the logic of a project, i.e. the events, is implemented in separate header files that are included after Basilisk includes.","category":"page"},{"location":"Software/Basilisk/","page":"Basilisk","title":"Basilisk","text":"// Definitions\n#define LEVEL 7\n#define ...\n\n// Basilisk includes.\n#include \"grid/multigrid.h\"\n#include \"run.h\"\n#include ... \n\n// Project includes.\n#include \"project-base.h\"\n#include \"project-init.h\"\n#include \"project-post.h\"\n#include \"project-exec.h\"\n\nint main() {\n\tinit_grid(1 << LEVEL);\n\t...\n\trun();\n}","category":"page"},{"location":"Software/Basilisk/#Parallel-computing","page":"Basilisk","title":"Parallel computing","text":"","category":"section"},{"location":"Software/Basilisk/","page":"Basilisk","title":"Basilisk","text":"Currently I have not tried Basilisk in parallel (actually I did so a few years back but don't really remember the steps). Since there is no dedicated tutorial for going parallel, here are the notes I am taking for writing something in that sense:","category":"page"},{"location":"Software/Basilisk/","page":"Basilisk","title":"Basilisk","text":"Tutorial isotropic.c has notes on how to run parallel in some of its parent universities supercomputers. Probably some steps there might be recycled here.","category":"page"},{"location":"Software/Basilisk/","page":"Basilisk","title":"Basilisk","text":"","category":"page"},{"location":"Software/Basilisk/#Introductory-tutorials","page":"Basilisk","title":"Introductory tutorials","text":"","category":"section"},{"location":"Software/Basilisk/#Basilisk-basics","page":"Basilisk","title":"Basilisk basics","text":"","category":"section"},{"location":"Software/Basilisk/","page":"Basilisk","title":"Basilisk","text":"Reference Tutorial\nCode 01-Tutorial-Basics\nNotes Basilisk is a conceptual solver for investigating problems in a Cartesian domain.

Different steps of the simulations are set by event's, which use a specific syntax do indicate whether they depend on a time or iteration condition. These steps might include setup of initial conditions, storage of intermediate results or solution, grid refinement, etc.

For iterating over arrays Basilisk provides a foreach()loop extending the C-language.

A standard Makefile is provided by Basilisk for managing common workflows.

Check the tips.","category":"page"},{"location":"Software/Basilisk/#Game-of-life","page":"Basilisk","title":"Game of life","text":"","category":"section"},{"location":"Software/Basilisk/","page":"Basilisk","title":"Basilisk","text":"Reference Conway’s game of life\nCode 02-Game-of-life\nNotes A simple implementation of Conway's game of life to get used with syntax.","category":"page"},{"location":"Software/Basilisk/#Brusselator","page":"Basilisk","title":"Brusselator","text":"","category":"section"},{"location":"Software/Basilisk/","page":"Basilisk","title":"Basilisk","text":"Reference Coupled reaction-diffusion equations\nCode 03-Brusselator\nNotes Solves the 2D Brusselator, a theoretical autocatalytic reaction diffusion system. The set of parameters used in the study for the stable Turin points where the ones proposed by Pena2001a [19]. Interesting material for preparing courses extending this to other oscillating systems can be found here.","category":"page"},{"location":"Software/Basilisk/#Ginzburg-Landau","page":"Basilisk","title":"Ginzburg-Landau","text":"","category":"section"},{"location":"Software/Basilisk/","page":"Basilisk","title":"Basilisk","text":"Reference The complex Ginzburg-Landau equation\nCode 04-Ginzburg-Landau\nNotes Solves the complex Ginzburg-Landau equation describing the nonlinear evolution of disturbances near the transition from a stable to unstable state of a system. Additional materials are provided here. It would be a good project to include the term alpha in the equation and the Laplacian term that goes with it.","category":"page"},{"location":"Software/Basilisk/#Distance-field","page":"Basilisk","title":"Distance field","text":"","category":"section"},{"location":"Software/Basilisk/","page":"Basilisk","title":"Basilisk","text":"Reference Distance field computation from a 3D model\nCode 05-Distance-Field\nNotes This can be seen as a particular case of pre-/post-processing. It can prove useful when initializing domains with scanned surfaces in STL or other compatible format. Additional steps must be taken for compilation with rendering (modifications to Makefile). Iteration over dimensions can be done with foreach_dimension().","category":"page"},{"location":"Software/Basilisk/#Wavelet-transform","page":"Basilisk","title":"Wavelet transform","text":"","category":"section"},{"location":"Software/Basilisk/","page":"Basilisk","title":"Basilisk","text":"Reference Wavelet transforms and filtering\nCode 06-Wavelet-Transform\nNotes Provides a tutorial on wavelet transform and associated filters. It is presented as the basis to understand mesh adaptation in Basilisk. Recommended reading of Sweldens1998a [20].","category":"page"},{"location":"Software/Basilisk/#Navier-Stokes-equation","page":"Basilisk","title":"Navier-Stokes equation","text":"","category":"section"},{"location":"Software/Basilisk/#Decaying-turbulence","page":"Basilisk","title":"Decaying turbulence","text":"","category":"section"},{"location":"Software/Basilisk/","page":"Basilisk","title":"Basilisk","text":"Reference Decaying two-dimensional turbulence\nCode 07-Decaying-Turbulence\nNotes For solving Euler equation with vorticity-stream formulation one uses header file navier-stokes/stream.h. The examples makes a first usage of dimensional quantities for vorticity initialization.","category":"page"},{"location":"Software/Basilisk/#Vortex-street","page":"Basilisk","title":"Vortex street","text":"","category":"section"},{"location":"Software/Basilisk/","page":"Basilisk","title":"Basilisk","text":"Reference Bénard–von Kármán Vortex Street for flow around a cylinder\nCode 08-Vortex-Street\nNotes Solves the flow around a solid object using the navier-stokes/centered.h solver and introduced the use of passive scalars (tracer). Notice we modify L0, which among many other magic variables is defined in common.h. Illustrates the use of solid and intersection to accomplish complex domains.","category":"page"},{"location":"Software/Basilisk/#Vortex-shedding","page":"Basilisk","title":"Vortex shedding","text":"","category":"section"},{"location":"Software/Basilisk/","page":"Basilisk","title":"Basilisk","text":"Reference Vortex shedding behind a sphere\nCode 09-Vortex-Shedding\nNotes Solution of Navier-Stokes equations in an adaptive domain embedding an sphere. Vortex detection is made with functionalities from lambda2.h implemented following Jeong1995a [21].","category":"page"},{"location":"Software/Basilisk/#Porous-medium","page":"Basilisk","title":"Porous medium","text":"","category":"section"},{"location":"Software/Basilisk/","page":"Basilisk","title":"Basilisk","text":"Reference Stokes flow through a complex 3D porous medium\nCode 10-Porous-Medium\nNotes ","category":"page"},{"location":"Software/Basilisk/#Periodic-box","page":"Basilisk","title":"Periodic box","text":"","category":"section"},{"location":"Software/Basilisk/","page":"Basilisk","title":"Basilisk","text":"Reference Forced isotropic turbulence in a triply-periodic box\nCode 11-Periodic-Box\nNotes ","category":"page"},{"location":"Software/Basilisk/#Two-phase-flows","page":"Basilisk","title":"Two-phase flows","text":"","category":"section"},{"location":"Software/Basilisk/#Pulsed-atomization","page":"Basilisk","title":"Pulsed atomization","text":"","category":"section"},{"location":"Software/Basilisk/","page":"Basilisk","title":"Basilisk","text":"Reference Atomisation of a pulsed liquid jet\nCode 12-Pulsed-Atomisation\nNotes ","category":"page"},{"location":"Software/Basilisk/#Bubble-rising","page":"Basilisk","title":"Bubble rising","text":"","category":"section"},{"location":"Software/Basilisk/","page":"Basilisk","title":"Basilisk","text":"Reference Bubble rising in a large tank\nCode 13-Bubble-Rising\nNotes ","category":"page"},{"location":"Software/Basilisk/#Rotating-cylinder","page":"Basilisk","title":"Rotating cylinder","text":"","category":"section"},{"location":"Software/Basilisk/","page":"Basilisk","title":"Basilisk","text":"Reference Flow in a rotating bottom-driven cylindrical container\nCode 14-Rotating-Cylinder\nNotes ","category":"page"},{"location":"Software/Basilisk/#Moving-Tangaroa","page":"Basilisk","title":"Moving Tangaroa","text":"","category":"section"},{"location":"Software/Basilisk/","page":"Basilisk","title":"Basilisk","text":"Reference Two-phase flow around RV Tangaroa\nCode 15-Moving-Tangaroa\nNotes ","category":"page"},{"location":"Software/Basilisk/#Geophysical-applications","page":"Basilisk","title":"Geophysical applications","text":"","category":"section"},{"location":"Software/Basilisk/#Indian-Tsunami","page":"Basilisk","title":"Indian Tsunami","text":"","category":"section"},{"location":"Software/Basilisk/","page":"Basilisk","title":"Basilisk","text":"Reference The 2004 Indian Ocean tsunami\nCode 16-Indian-Tsunami\nNotes ","category":"page"},{"location":"Software/Basilisk/#Tohoku-Tsunami","page":"Basilisk","title":"Tohoku Tsunami","text":"","category":"section"},{"location":"Software/Basilisk/","page":"Basilisk","title":"Basilisk","text":"Reference The 2011 Tohoku tsunami\nCode 17-Tohoku-Tsunami\nNotes ","category":"page"},{"location":"Software/Basilisk/#Train-of-Solitons","page":"Basilisk","title":"Train of Solitons","text":"","category":"section"},{"location":"Software/Basilisk/","page":"Basilisk","title":"Basilisk","text":"Reference Breakup of a rectangular perturbation into a train of solitons\nCode 18-Train-of-Solitons\nNotes ","category":"page"},{"location":"Software/Basilisk/#Lee-Waves","page":"Basilisk","title":"Lee Waves","text":"","category":"section"},{"location":"Software/Basilisk/","page":"Basilisk","title":"Basilisk","text":"Reference Tidally-induced internal lee waves\nCode 19-Lee-Waves\nNotes ","category":"page"},{"location":"Software/Basilisk/#Ellipsoidal-Shoal","page":"Basilisk","title":"Ellipsoidal Shoal","text":"","category":"section"},{"location":"Software/Basilisk/","page":"Basilisk","title":"Basilisk","text":"Reference Periodic wave propagation over an ellipsoidal shoal\nCode 20-Ellipsoidal-Shoal\nNotes ","category":"page"},{"location":"Software/Basilisk/#Ellipsoidal-Shoal-Multilayer","page":"Basilisk","title":"Ellipsoidal Shoal Multilayer","text":"","category":"section"},{"location":"Software/Basilisk/","page":"Basilisk","title":"Basilisk","text":"Reference Periodic wave propagation over an ellipsoidal shoal (multilayer)\nCode 21-Ellipsoidal-Shoal-Multilayer\nNotes Check for source code in current version.","category":"page"},{"location":"Software/Basilisk/#Stokes-Wave","page":"Basilisk","title":"Stokes Wave","text":"","category":"section"},{"location":"Software/Basilisk/","page":"Basilisk","title":"Basilisk","text":"Reference 3D breaking Stokes wave (multilayer solver)\nCode 22-Stokes-Wave\nNotes ","category":"page"},{"location":"Software/Basilisk/#Transcritical-Flow","page":"Basilisk","title":"Transcritical Flow","text":"","category":"section"},{"location":"Software/Basilisk/","page":"Basilisk","title":"Basilisk","text":"Reference Transcritical flow over a bump\nCode 23-Transcritical-Flow\nNotes ","category":"page"},{"location":"Software/Basilisk/#Shock-Instability","page":"Basilisk","title":"Shock Instability","text":"","category":"section"},{"location":"Software/Basilisk/","page":"Basilisk","title":"Basilisk","text":"Reference A Shallow Water Analogue for the Standing Accretion Shock Instability\nCode 24-Shock-Instability\nNotes ","category":"page"},{"location":"Software/Basilisk/#Python-interface","page":"Basilisk","title":"Python interface","text":"","category":"section"},{"location":"Software/Basilisk/#Basic-usage","page":"Basilisk","title":"Basic usage","text":"","category":"section"},{"location":"Software/Basilisk/","page":"Basilisk","title":"Basilisk","text":"Reference Python interface\nCode 25-Python-Interface\nNotes ","category":"page"},{"location":"Software/Basilisk/#Poisson-equation","page":"Basilisk","title":"Poisson equation","text":"","category":"section"},{"location":"Software/Basilisk/","page":"Basilisk","title":"Basilisk","text":"Reference Poisson problem with Python\nCode 26-Python-Poisson\nNotes ","category":"page"},{"location":"Software/Basilisk/","page":"Basilisk","title":"Basilisk","text":"","category":"page"},{"location":"Software/Basilisk/#Built-in-solvers","page":"Basilisk","title":"Built-in solvers","text":"","category":"section"},{"location":"Software/Basilisk/","page":"Basilisk","title":"Basilisk","text":"Basic component solvers:","category":"page"},{"location":"Software/Basilisk/","page":"Basilisk","title":"Basilisk","text":"advection.h\ndiffusion.h\npoisson.h","category":"page"},{"location":"Software/Basilisk/","page":"Basilisk","title":"Basilisk","text":"It is upon these that the Navier-Stokes equation can be assembled in:","category":"page"},{"location":"Software/Basilisk/","page":"Basilisk","title":"Basilisk","text":"Header Description\nnavier-stokes/stream.h Solves a 2D incompressible, constant density, constant viscosity Navier-Stokes equation formulated in the vorticity omega. This is and advection-diffusion equation solved with a flux-based advection scheme in advection.h. Given its form, the stream function psi is solver through the poisson.h solver.\nnavier-stokes/centered.h \nnavier-stokes/perfs.h Not a solver by itself, it supports other headers under the Navier-Stokes family to follow performance during solution.","category":"page"},{"location":"Software/Basilisk/","page":"Basilisk","title":"Basilisk","text":"Other equations:","category":"page"},{"location":"Software/Basilisk/","page":"Basilisk","title":"Basilisk","text":"saint-venant.h","category":"page"},{"location":"Software/Basilisk/#Headers-files","page":"Basilisk","title":"Headers files","text":"","category":"section"},{"location":"Software/Basilisk/","page":"Basilisk","title":"Basilisk","text":"File Usage\ncommon.h \ndistance.h \nembed.h Allow the creation of general shape boundary conditions inside the domain.\nfractions.h \nlambda2.h Detection of vortex using the criteria by Jeong1995a [21]\nrun.h A generic time loop which executes until termination (to be avoided!).\ntracer.h Provides an event to integrate the advection of tracer elements.\nutils.h \nview.h ","category":"page"},{"location":"Software/Basilisk/","page":"Basilisk","title":"Basilisk","text":"File Usage\ngrid/cartesian.h \ngrid/multigrid.h \ngrid/octree.h \ngrid/bitree.h ","category":"page"},{"location":"Software/Basilisk/#Data-types","page":"Basilisk","title":"Data types","text":"","category":"section"},{"location":"Software/Basilisk/","page":"Basilisk","title":"Basilisk","text":"scalar\nvector\nface\nmsgstats convergence statistics of (multigrid?) solver.","category":"page"},{"location":"Software/Basilisk/#Functions","page":"Basilisk","title":"Functions","text":"","category":"section"},{"location":"Software/Basilisk/","page":"Basilisk","title":"Basilisk","text":"Function Definition Uses\norigin common.h Set the origin of cartesian system.\ninit_grid grid/ (overloaded) Level of refinement (size) of initial grid.\nsize \nperiodic Set periodic boundary conditions.\nstatsf utils.h Retrieve statistics of a scalar field.\noutput_ppm output.h Generate a image and video output.\nadapt_wavelet grid/tree-common.h Adaptive grid refinement routine.\nrun run.h (overloaded) Generic time loop for events execution.\nnoise Generate random noise in -1 1.\nswap Swap values of two scalar arrays.\ninput_stl distance.h Read an STL file as an array of triplets.\nbounding_box distance.h Determines the bounding box of inputs (segments or triangles).\ndistance distance.h Distance to coordinate.\nview draw.h Setup of viewing (camera) parameters.\nisosurface draw.h Displays an isosurface of a field.\ndraw_vof draw.h Display VOF reconstructed interfaces.\nclear draw.h Removes previous objects.\nsave view.h Dumps image(s) to file.\nrefine_biquadradic grid/multigrid-common.h \nwavelet grid/multigrid-common.h \ninverse_wavelet grid/multigrid-common.h \nboundary_level \nunrefine \nvorticity utils.h Computes the vorticity from a velocity field.","category":"page"},{"location":"References/@Mehrer2007/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Mehrer2007/","page":"-","title":"-","text":"title: \"Diffusion in solids : Fundamentals, methods, materials, diffusion-controlled processes\" authors: Helmut Mehrer year: 2007 –-","category":"page"},{"location":"WallyToolbox/transport/#Transport","page":"Transport","title":"Transport","text":"","category":"section"},{"location":"WallyToolbox/transport/","page":"Transport","title":"Transport","text":"\"https://github.com/wallytutor/WallyToolbox.jl/blob/main/docs/src/WallyToolbox/transport.md\"\nCurrentModule = WallyToolbox\nDocTestSetup = quote\n using WallyToolbox\nend","category":"page"},{"location":"WallyToolbox/transport/#Dimensionless-groups","page":"Transport","title":"Dimensionless groups","text":"","category":"section"},{"location":"WallyToolbox/transport/","page":"Transport","title":"Transport","text":"When dealing with fluid flow and reactor models, it is always useful to be able to quickly compute approximate dimensionless numbers for the studied case. In what follows we provide a brief description of some of these quantities and some context for their use whenever possible. Definitions might vary according to the author or field of application and here we follow mostly Bird2001 [4].","category":"page"},{"location":"WallyToolbox/transport/","page":"Transport","title":"Transport","text":"Although quite unusual, it seems it is time to start this list with the Knudsen number, which evaluates the particles mean free path over system characteristic dimension. Division between rarefied gas (Boltzmann) and continuum mechanics (Navier-Stokes). ","category":"page"},{"location":"WallyToolbox/transport/","page":"Transport","title":"Transport","text":"Although an implementation is not yet provided here, users are encouraged to estimate its value based on some mean free path estimation for their system before following with the analysis of a transport problem. Generally speaking, if continuum mechanics hypothesis is not valid, i.e Knudsen number is too high, most of what follows cannot be applied, thus justifying why this group comes first.","category":"page"},{"location":"WallyToolbox/transport/#Common-dimensionless-groups","page":"Transport","title":"Common dimensionless groups","text":"","category":"section"},{"location":"WallyToolbox/transport/#Reynolds","page":"Transport","title":"Reynolds","text":"","category":"section"},{"location":"WallyToolbox/transport/","page":"Transport","title":"Transport","text":"Reynolds dimensionless group is named for Osborne Reynolds (1842-1912), professor of engineering at the University of Manchester. He studied the laminar-turbulent transition, turbulent heat transfer, and theory of lubrication Bird2001 [4]. In general we denote Reynolds number by mathrmRe and it is used to delineate flow regimes. For circular tubes it is defined as:","category":"page"},{"location":"WallyToolbox/transport/","page":"Transport","title":"Transport","text":"mathrmRe = fracrho langle v_z rangle Dmu","category":"page"},{"location":"WallyToolbox/transport/","page":"Transport","title":"Transport","text":"where langlev_zrangle is the average flow velocity in axial direction and D is the tube diameter. For values up 2100 the flow is assumed laminar if steady state is established and density is constant. For more, see Bird2001 [4], Chapter 2.","category":"page"},{"location":"WallyToolbox/transport/","page":"Transport","title":"Transport","text":"WallyToolbox.reynolds","category":"page"},{"location":"WallyToolbox/transport/#WallyToolbox.reynolds","page":"Transport","title":"WallyToolbox.reynolds","text":"Evaluate Reynolds number relationship.\n\n\n\n\n\n","category":"function"},{"location":"WallyToolbox/transport/#Nusselt","page":"Transport","title":"Nusselt","text":"","category":"section"},{"location":"WallyToolbox/transport/","page":"Transport","title":"Transport","text":"The Nusselt number provides the ratio of convective to conductive heat transfer at a boundary in a fluid, defined as","category":"page"},{"location":"WallyToolbox/transport/","page":"Transport","title":"Transport","text":"mathrmNu=frachLk","category":"page"},{"location":"WallyToolbox/transport/","page":"Transport","title":"Transport","text":"Often in buoyancy-driven flow analysis it is correlated as mathrmNu=amathrmRa^b. A Nusselt number of value one represents heat transfer by pure conduction. Increasing this number implies a laminar conductive-dominant flow and then a convective dominant turbulent flow.","category":"page"},{"location":"WallyToolbox/transport/","page":"Transport","title":"Transport","text":"WallyToolbox.nusselt","category":"page"},{"location":"WallyToolbox/transport/#WallyToolbox.nusselt","page":"Transport","title":"WallyToolbox.nusselt","text":"Evaluate Nusselt number relationship.\n\n\n\n\n\n","category":"function"},{"location":"WallyToolbox/transport/#Prandtl","page":"Transport","title":"Prandtl","text":"","category":"section"},{"location":"WallyToolbox/transport/","page":"Transport","title":"Transport","text":"Prandtl represents the ratio of momentum diffusivity to thermal diffusivity mathrmPr=fracnualpha. High mathrmPr indicates that momentum transfer is more effective than heat transfer (oils), while low values (liquid metals) indicate thermal boundary layer is more important than viscous one.","category":"page"},{"location":"WallyToolbox/transport/","page":"Transport","title":"Transport","text":"Ludwig Prandtl (1875-1953) (pronounced \"Prahn-t'), who taught in Hannover and Gottingen and later served as the Director of the Kaiser Wilhelm Institute for Fluid Dynamics, was one of the people who shaped the future of his field at the beginning of the twentieth century; he made contributions to turbulent flow and heat transfer, but his development of the boundary-layer equations was his crowning achievement Bird2001 [4]. The dimensionless quantity appear under two forms of interest for the analysis of reactors: its thermal and its chemical versions. In thermal version, this number compares the kinematic viscosity nu to the thermal diffusivity alpha, which is replaced by species diffusivity in its chemical version, which is more often referred to as Schmidt number. Ernst Heinrich Wilhelm Schmidt (1892-1975), who taught at the universities in Gdansk, Braunschweig, and Munich (where he was the successor to Nusselt) Bird2001 [4]_. The ratio fracnualpha indicates the relative ease of momentum and energy or species transport in flow systems. This dimensionless ratio in thermal form is given by","category":"page"},{"location":"WallyToolbox/transport/","page":"Transport","title":"Transport","text":"mathrmPr = fracnualpha = fracC_p muk","category":"page"},{"location":"WallyToolbox/transport/","page":"Transport","title":"Transport","text":"If transport properties for a gas are not available, thermal Prandtl number can be estimated at low pressure and non-polar molecules mixtures with help of Eucken formula as","category":"page"},{"location":"WallyToolbox/transport/","page":"Transport","title":"Transport","text":"mathrmPr = fracC_pC_p + frac54R","category":"page"},{"location":"WallyToolbox/transport/","page":"Transport","title":"Transport","text":"WallyToolbox.prandtl","category":"page"},{"location":"WallyToolbox/transport/#WallyToolbox.prandtl","page":"Transport","title":"WallyToolbox.prandtl","text":"Evaluate Prandtl number relationship.\n\n\n\n\n\n","category":"function"},{"location":"WallyToolbox/transport/#Péclet","page":"Transport","title":"Péclet","text":"","category":"section"},{"location":"WallyToolbox/transport/","page":"Transport","title":"Transport","text":"Péclet Jean-Claude-Eugene Peclet (pronounced \"Pay-clay\" with the second syllable accented) (1793-1857) authored several books including one on heat conduction Bird2001 [4]. This number is nothing more than the multiplication of Reynolds and Prandtl or Schmidt numbers. By simplifying factors one easily determines that it represents the ratio of convective by diffusive transport (thermal or species). High mathrmPe limit represents the #plug-flow behavior. ","category":"page"},{"location":"WallyToolbox/transport/","page":"Transport","title":"Transport","text":"mathrmPe_th = mathrmRe mathrmPrqquad\nmathrmPe_ch = mathrmRe mathrmSc","category":"page"},{"location":"WallyToolbox/transport/#Convection-related-groups","page":"Transport","title":"Convection-related groups","text":"","category":"section"},{"location":"WallyToolbox/transport/#Grashof","page":"Transport","title":"Grashof","text":"","category":"section"},{"location":"WallyToolbox/transport/","page":"Transport","title":"Transport","text":"Grashof number named after Franz Grashof (1826-1893) (pronounced \"Grahss-hoff). He was professor of applied mechanics in Karlsruhe and one of the founders of the Verein Deutscher Ingenieure in 1856 Bird2001 [4]. The Grashof number is the characteristic group occurring in analyses of free convection. It approximates the ratio of the buoyancy to viscous force acting on a fluid, defined as","category":"page"},{"location":"WallyToolbox/transport/","page":"Transport","title":"Transport","text":"mathrmGr=fracgbeta(T_s-T_infty)L^3nu^2","category":"page"},{"location":"WallyToolbox/transport/","page":"Transport","title":"Transport","text":"and is analogous to Reynolds number in natural convection. Increasing the value of this number above a given threshold promotes buoyancy driven flow.","category":"page"},{"location":"WallyToolbox/transport/","page":"Transport","title":"Transport","text":"WallyToolbox.grashof","category":"page"},{"location":"WallyToolbox/transport/#WallyToolbox.grashof","page":"Transport","title":"WallyToolbox.grashof","text":"Evaluate Grashof number relationship.\n\n\n\n\n\n","category":"function"},{"location":"WallyToolbox/transport/#Rayleigh","page":"Transport","title":"Rayleigh","text":"","category":"section"},{"location":"WallyToolbox/transport/","page":"Transport","title":"Transport","text":"Rayleigh number is the product of Grashof mathrmGr and Prandtl mathrmPr numbers. Related to the transition from laminar to turbulent in buoyancy-driven flows. Laminar to turbulent is assumed to take place at 10^9 Balaji2014 [5].","category":"page"},{"location":"WallyToolbox/transport/#Mass-transfer-groups","page":"Transport","title":"Mass transfer groups","text":"","category":"section"},{"location":"WallyToolbox/transport/#Schmidt","page":"Transport","title":"Schmidt","text":"","category":"section"},{"location":"WallyToolbox/transport/","page":"Transport","title":"Transport","text":"Schmidt number is the mass diffusion equivalent of Prandtl's. Its range can be much broader than its thermal relative, Prandtl number. This is given by the effects of cross-section and molar weight determining mass diffusivity of gas species. For more, see Bird2001 [4], Chapter 9.","category":"page"},{"location":"WallyToolbox/transport/","page":"Transport","title":"Transport","text":"mathrmSc = fracnuD","category":"page"},{"location":"WallyToolbox/transport/#Sherwood","page":"Transport","title":"Sherwood","text":"","category":"section"},{"location":"WallyToolbox/transport/","page":"Transport","title":"Transport","text":"Sherwood number, also called the mass transfer Nusselt number is a dimensionless number used in mass-transfer operation. It represents the ratio of the total mass transfer rate (convection + diffusion) to the rate of diffusive mass transport, and is named in honor of Thomas Kilgore Sherwood.","category":"page"},{"location":"WallyToolbox/transport/#Multiphase-specific","page":"Transport","title":"Multiphase-specific","text":"","category":"section"},{"location":"WallyToolbox/transport/#Weber","page":"Transport","title":"Weber","text":"","category":"section"},{"location":"WallyToolbox/transport/","page":"Transport","title":"Transport","text":"Weber group is often found in applications of multiphase flows where strongly curved surfaces are present. It represents the ratio of drag forces to cohesion forces, and can be thought of as a measure of the relative importance of the fluid's inertia compared to its surface tension. As reminded by Amsden1989 [6], for mathrmWe1, drop oscillations, distortions, and breakup must be considered, requiring other sub-models other than simple drag to describe the flow.","category":"page"},{"location":"WallyToolbox/transport/#Groups-by-application","page":"Transport","title":"Groups by application","text":"","category":"section"},{"location":"WallyToolbox/transport/","page":"Transport","title":"Transport","text":"WallyToolbox.ConstantPrandtl","category":"page"},{"location":"WallyToolbox/transport/#WallyToolbox.ConstantPrandtl","page":"Transport","title":"WallyToolbox.ConstantPrandtl","text":"Prandtl number set to a constant value.\n\n\n\n\n\n","category":"type"},{"location":"WallyToolbox/transport/","page":"Transport","title":"Transport","text":"WallyToolbox.ReynoldsPipeFlow\nWallyToolbox.NusseltGnielinski\nWallyToolbox.NusseltDittusBoelter","category":"page"},{"location":"WallyToolbox/transport/#WallyToolbox.ReynoldsPipeFlow","page":"Transport","title":"WallyToolbox.ReynoldsPipeFlow","text":"Reynolds number applied to internal pipe flow.\n\n\n\n\n\n","category":"type"},{"location":"WallyToolbox/transport/#WallyToolbox.NusseltGnielinski","page":"Transport","title":"WallyToolbox.NusseltGnielinski","text":"Gnielinski's relationship for Nusselt number.\n\n\n\n\n\n","category":"type"},{"location":"WallyToolbox/transport/#WallyToolbox.NusseltDittusBoelter","page":"Transport","title":"WallyToolbox.NusseltDittusBoelter","text":"Dittus-Boelter's relationship for Nusselt number.\n\n\n\n\n\n","category":"type"},{"location":"WallyToolbox/transport/#Heat-transfer-coefficients","page":"Transport","title":"Heat transfer coefficients","text":"","category":"section"},{"location":"WallyToolbox/transport/","page":"Transport","title":"Transport","text":"WallyToolbox.HtcPipeFlow\nWallyToolbox.htc","category":"page"},{"location":"WallyToolbox/transport/#WallyToolbox.HtcPipeFlow","page":"Transport","title":"WallyToolbox.HtcPipeFlow","text":"Heat transfer coefficient for internal pipe flow.\n\n\n\n\n\n","category":"type"},{"location":"WallyToolbox/transport/#WallyToolbox.htc","page":"Transport","title":"WallyToolbox.htc","text":"Implements the interface for heat transfer coefficient evaluation.\n\nNotice that although temperature is provided in this interface, it is used only for Pr calculation. Other properties might have arbitrarily complex dependencies and types, so it was chosen by design to keep their evaluation to the user before calling this.\n\nAlso, to ensure internal consistency because of Nusselt number dependency on Prandtl number, thermal conductivity is evaluated from specific heat and viscosity. It is up to the user to make sure the provided Prandtl number is compatible.\n\n\n\n\n\n","category":"function"},{"location":"WallyToolbox/transport/#Property-models","page":"Transport","title":"Property models","text":"","category":"section"},{"location":"WallyToolbox/transport/","page":"Transport","title":"Transport","text":"Medium properties often are non-constant and require description through different sorts of models for representing their dependence on solution quantities, such as temperature, pressure, composition, etc. This section is devoted to document such models.","category":"page"},{"location":"WallyToolbox/transport/#Polynomial-properties","page":"Transport","title":"Polynomial properties","text":"","category":"section"},{"location":"WallyToolbox/transport/","page":"Transport","title":"Transport","text":"The most commonly used representation of thermal conductivity of materials is through polynomial fits of temperature. Although this approach does not provide any physical-based representation, it is easy to use and fast to evaluate in most computational science problems. A common interface for polynomial properties is given by the following structure.","category":"page"},{"location":"WallyToolbox/transport/","page":"Transport","title":"Transport","text":"WallyToolbox.TempPolynomialHeatConductivity\nWallyToolbox.constheatconductivity","category":"page"},{"location":"WallyToolbox/transport/#WallyToolbox.TempPolynomialHeatConductivity","page":"Transport","title":"WallyToolbox.TempPolynomialHeatConductivity","text":"Wrapper for a polynomial temperature-dependent heat conductivity.\n\np::Polynomials.Polynomial: Heat conductivity polynomial.\n\nThe general use case of this is to create objects compatible with the function object approach employed for properties evaluation across the module.\n\njulia> k = TempPolynomialHeatConductivity([1.5, -0.001])\nTempPolynomialHeatConductivity(Polynomial(1.5 - 0.001*T))\n\njulia> k(1000.0)\n0.5\n\nAlthough not the most efficienty way, a simple wrapper for providing constant heat conductivity remaining compatible with other funcionalities is provided:\n\njulia> k = constheatconductivity(5.0)\nTempPolynomialHeatConductivity(Polynomial(5.0))\n\n\n\n\n\n","category":"type"},{"location":"WallyToolbox/transport/#WallyToolbox.constheatconductivity","page":"Transport","title":"WallyToolbox.constheatconductivity","text":"Constant heat conductivity wrapper compatible with temperature dependency.\n\n\n\n\n\n","category":"function"},{"location":"WallyToolbox/transport/","page":"Transport","title":"Transport","text":"An analogous interface is also provided for viscosity temperature dependence.","category":"page"},{"location":"WallyToolbox/transport/","page":"Transport","title":"Transport","text":"WallyToolbox.TempPolynomialFluidViscosity\nWallyToolbox.constfluidviscosity","category":"page"},{"location":"WallyToolbox/transport/#WallyToolbox.TempPolynomialFluidViscosity","page":"Transport","title":"WallyToolbox.TempPolynomialFluidViscosity","text":"Wrapper for a polynomial temperature-dependent fluid viscosity.\n\np::Polynomials.Polynomial: Fluid viscosity polynomial.\n\nUsage is analogous to TempPolynomialHeatConductivity.\n\n\n\n\n\n","category":"type"},{"location":"WallyToolbox/transport/#WallyToolbox.constfluidviscosity","page":"Transport","title":"WallyToolbox.constfluidviscosity","text":"Constant heat conductivity wrapper compatible with temperature dependency.\n\n\n\n\n\n","category":"function"},{"location":"WallyToolbox/transport/#Other-temperature-dependences","page":"Transport","title":"Other temperature dependences","text":"","category":"section"},{"location":"WallyToolbox/transport/","page":"Transport","title":"Transport","text":"In numerical simulation one often faces the task to represent melting of solution solids that soften over a temperature range. An easy way to set this up with a volume-of-fluid (VOF) approach is to have some sort of exponential temperature-dependent viscosity. This structure encapsulates the evaluation of a viscosity function based on Fermi distribution - a sort of sigmoid function - to this end. This can be expressed as (definitions in the structure documentation):","category":"page"},{"location":"WallyToolbox/transport/","page":"Transport","title":"Transport","text":"mu(T) = mu_infty +\ndfracmu_0-mu_infty1+expleft(dfracT-ThetaDeltaright)\n\nquadtextwherequad\n\nbegincases\nTheta = dfracT_e+T_s212pt\nDelta = dfracT_e-T_skappa\nendcases","category":"page"},{"location":"WallyToolbox/transport/","page":"Transport","title":"Transport","text":"WallyToolbox.TempFermiLikeMeltingViscosity\nWallyToolbox.fermilike_viscosity","category":"page"},{"location":"WallyToolbox/transport/#WallyToolbox.TempFermiLikeMeltingViscosity","page":"Transport","title":"WallyToolbox.TempFermiLikeMeltingViscosity","text":"Temperature-dependent viscosity with a Fermi-like distribution dependency.\n\nΘ::Float64: Center temperature of melting range [K].\nΔ::Float64: Spread factor over melting range [K].\nδ::Float64: Viscosity change during melting [Pa.s].\nμ∞::Float64: High temperature viscosity [Pa.s].\nμ₀::Float64: Low temperature viscosity [Pa.s].\nκ::Float64: Spread coefficient used to compute Δ.\nTs::Float64: Melting start temperature [K].\nTe::Float64: Melting end temperature [K].\n\nThe following example shows the evaluation of such a function below, in the middle, and above melting range.\n\njulia> μ = TempFermiLikeMeltingViscosity(1300.0, 1700.0, 1000.0, 0.1, 10);\n\njulia> μ(300.0)\n999.9999999999065\n\njulia> μ(1500.0)\n500.05\n\njulia> μ(2000.0)\n0.10372626662025815\n\n\n\n\n\n","category":"type"},{"location":"WallyToolbox/transport/#WallyToolbox.fermilike_viscosity","page":"Transport","title":"WallyToolbox.fermilike_viscosity","text":"fermilike_viscosity(T, μ∞, δ, Θ, Δ)\n\nEvaluation of Fermi-distribution-alike viscosity function.\n\n\n\n\n\n","category":"function"},{"location":"WallyToolbox/transport/#Granular-media","page":"Transport","title":"Granular media","text":"","category":"section"},{"location":"WallyToolbox/transport/","page":"Transport","title":"Transport","text":"According to Hanein2017 [7] the representation of effective thermal conductivity of a solids bed in a rotary kiln can be approximated through a Maxell model based on effective medium theory. To keep track of eventually temperature-dependent properties and make use of this model, the following interfaces are provided.","category":"page"},{"location":"WallyToolbox/transport/","page":"Transport","title":"Transport","text":"WallyToolbox.GranularMediumHeatConductivity\nWallyToolbox.maxwell_eff_conductivity","category":"page"},{"location":"WallyToolbox/transport/#WallyToolbox.GranularMediumHeatConductivity","page":"Transport","title":"WallyToolbox.GranularMediumHeatConductivity","text":"Provides the heat conductivity of a solids granular medium embeded in gas.\n\nks::WallyToolbox.AbstractHeatCondTemperatureDep: Heat conductivity model for solid phase.\nkg::WallyToolbox.AbstractHeatCondTemperatureDep: Heat conductivity model for gas phase.\nϕ::Float64: Solids packing fraction.\n\nThis composite type relies on a gas and a solid; below we illustrate how to evaluate a granular medium effective heat conductivity using this structure.\n\njulia> ks = constheatconductivity(5.0);\n\njulia> kg = constheatconductivity(0.092);\n\njulia> kb = GranularMediumHeatConductivity(ks, kg, 0.36);\n\njulia> kb(300.0)\n0.23471049304677621\n\n\n\n\n\n","category":"type"},{"location":"WallyToolbox/transport/#WallyToolbox.maxwell_eff_conductivity","page":"Transport","title":"WallyToolbox.maxwell_eff_conductivity","text":"maxwell_eff_conductivity(kg, ks, ϕ)\n\nMaxwell effective medium theory of thermal conductivity computed in terms of gas thermal conductivity kg, solids thermal conductivity ks, and solids packing fraction ϕ.\n\n\n\n\n\n","category":"function"},{"location":"WallyToolbox/transport/#Air-properties","page":"Transport","title":"Air properties","text":"","category":"section"},{"location":"WallyToolbox/transport/","page":"Transport","title":"Transport","text":"For the simulation of rotary kilns, Mujumdar2006i [8] proposes some data for air properties implemented by the following interfaces. It must be noted that the thermal conductivity proposed by the authors quickly diverges above 1500 K and users must be aware of its implications.","category":"page"},{"location":"WallyToolbox/transport/","page":"Transport","title":"Transport","text":"WallyToolbox.AirHeatConductivityMujumdar2006\nWallyToolbox.AirViscosityMujumdar2006","category":"page"},{"location":"WallyToolbox/transport/#WallyToolbox.AirHeatConductivityMujumdar2006","page":"Transport","title":"WallyToolbox.AirHeatConductivityMujumdar2006","text":"Air heat conductivity for rotary kiln simulation - Mujumdar (2006).\n\njulia> k = AirHeatConductivityMujumdar2006();\n\njulia> k(300)\n0.027600315300000004\n\n\n\n\n\n","category":"type"},{"location":"WallyToolbox/transport/#WallyToolbox.AirViscosityMujumdar2006","page":"Transport","title":"WallyToolbox.AirViscosityMujumdar2006","text":"Air viscosity for rotary kiln simulation - Mujumdar (2006).\n\njulia> μ = AirViscosityMujumdar2006();\n\njulia> μ(300)\n1.837988950255163e-5\n\n\n\n\n\n","category":"type"},{"location":"Notes/Conductivity-in-Porous-Media/","page":"Excalidraw Data","title":"Excalidraw Data","text":"","category":"page"},{"location":"Notes/Conductivity-in-Porous-Media/","page":"Excalidraw Data","title":"Excalidraw Data","text":"excalidraw-plugin: raw tags: [excalidraw]","category":"page"},{"location":"Notes/Conductivity-in-Porous-Media/","page":"Excalidraw Data","title":"Excalidraw Data","text":"","category":"page"},{"location":"Notes/Conductivity-in-Porous-Media/","page":"Excalidraw Data","title":"Excalidraw Data","text":"==⚠ Switch to EXCALIDRAW VIEW in the MORE OPTIONS menu of this document. ⚠==","category":"page"},{"location":"Notes/Conductivity-in-Porous-Media/#Excalidraw-Data","page":"Excalidraw Data","title":"Excalidraw Data","text":"","category":"section"},{"location":"Notes/Conductivity-in-Porous-Media/#Text-Elements","page":"Excalidraw Data","title":"Text Elements","text":"","category":"section"},{"location":"Notes/Conductivity-in-Porous-Media/","page":"Excalidraw Data","title":"Excalidraw Data","text":"%%","category":"page"},{"location":"Notes/Conductivity-in-Porous-Media/#Drawing","page":"Excalidraw Data","title":"Drawing","text":"","category":"section"},{"location":"Notes/Conductivity-in-Porous-Media/","page":"Excalidraw Data","title":"Excalidraw Data","text":"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","category":"page"},{"location":"Notes/Conductivity-in-Porous-Media/","page":"Excalidraw Data","title":"Excalidraw Data","text":"%%","category":"page"},{"location":"References/@ORourke2010/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@ORourke2010/","page":"-","title":"-","text":"title: An improved collision damping time for MP-PIC calculations of dense particle flows with applications to polydisperse sedimenting beds and colliding particle jets authors: Peter J. O’Rourke, Dale M. Snider year: 2010 URL: https://doi.org/10.1016/j.ces.2010.08.032 –-","category":"page"},{"location":"References/@Cai2021a/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Cai2021a/","page":"-","title":"-","text":"title: Physics-informed neural networks for heat transfer problems authors: Shengze Cai, Zhicheng Wang, Sifan Wang, Paris Perdikaris, George Em Karniadakis year: 2021 URL: https://doi.org/10.1115/1.4050542 –-","category":"page"},{"location":"References/@Lu2021a/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Lu2021a/","page":"-","title":"-","text":"title: Physics-informed neural networks with hard constraints for inverse design authors: Lu Lu, Raphael Pestourie, Wenjie Yao, Zhicheng Wang, Francesc Verdugo, Steven G. Johnson year: 2021 URL: https://doi.org/10.48550/arXiv.2102.04626 –-","category":"page"},{"location":"Articles/How-corporate-IT-is-killing-innovation/#How-corporate-IT-is-killing-innovation","page":"How corporate IT is killing innovation","title":"How corporate IT is killing innovation","text":"","category":"section"},{"location":"Articles/How-corporate-IT-is-killing-innovation/","page":"How corporate IT is killing innovation","title":"How corporate IT is killing innovation","text":"For the past decade I have constantly worked with innovation. That's all I know to do with my life. A day without creating is mostly not worth it. Whether it was in academic or corporate settings, I generally got along with teammates and most stakeholders. But no matter where I go I am followed by a constant ghost , the enemy, the corporate IT. I known I don't fit in, I don't belong in the system, I don't fall into the listen-pray-obey-loop-herd, but that is not the reason why I should be guilty of how bad my interactions with corporate IT (not specifically with IT people, I have met very nice people there) have been for more than one decade.","category":"page"},{"location":"Articles/How-corporate-IT-is-killing-innovation/","page":"How corporate IT is killing innovation","title":"How corporate IT is killing innovation","text":"So far, my words might seem harsh and full of anger to the uneager reader. As I scientist I am prompt to expect hateful reactions from the conservatives and religiously aligned corporate people. But as a scientist I shall recur to the reason and argumentation to expose, solely based on observations, my conclusions on the matter. Time to end the vague wording, let's get to the anecdotes.","category":"page"},{"location":"Articles/How-corporate-IT-is-killing-innovation/#Installing-a-compiler,-but-you-no-admin","page":"How corporate IT is killing innovation","title":"Installing a compiler, but you no admin","text":"","category":"section"},{"location":"Articles/How-corporate-IT-is-killing-innovation/","page":"How corporate IT is killing innovation","title":"How corporate IT is killing innovation","text":"Early in my PhD days I was told I should model some chemically reacting flows to better understand some processes I was studying. As usual, you start that by a literature review cause you are told so or because you are not dumb enough to think you can reinvent the wheel.","category":"page"},{"location":"Articles/How-corporate-IT-is-killing-innovation/","page":"How corporate IT is killing innovation","title":"How corporate IT is killing innovation","text":"After some reading I realized there was nothing to add to that field under my research scope and it was time to use the numbers that were already available in the literature. Yay, time to code! Well, not so fun... In fact, that nothing-moment is when PhD students realize how humble they have to be in face of existing knowledge. It is also often the point where the cracks appear in the system, the small spots where they can make a small contribution.","category":"page"},{"location":"Articles/How-corporate-IT-is-killing-innovation/","page":"How corporate IT is killing innovation","title":"How corporate IT is killing innovation","text":"My lab was a standard Windows-only environment, although later on I discovered that there were more exceptions than rules in the system. I was actually in the wrong side of the building, most students in the other wing had everything I dreamt of. Since the libraries I was aiming to use at the time were not portable from Nix, I had to start my crusade to show IT I was not the standard user and that I was worth Baloo048 (Baloo048 was the name of my workstation once I got authorized a CentOS 5 system)!","category":"page"},{"location":"Articles/How-corporate-IT-is-killing-innovation/#Security-above-obscurity-(and-overall)","page":"How corporate IT is killing innovation","title":"Security above obscurity (and overall)","text":"","category":"section"},{"location":"Articles/How-corporate-IT-is-killing-innovation/","page":"How corporate IT is killing innovation","title":"How corporate IT is killing innovation","text":"Here I am not making a reference to security through obscurity and I will actually cite several unrelated events that I have seen so far.","category":"page"},{"location":"Articles/How-corporate-IT-is-killing-innovation/","page":"How corporate IT is killing innovation","title":"How corporate IT is killing innovation","text":"IT has always been considered guilty of major failures in security systems. Nonetheless, trespassers often get inside by errors committed by standard network users. Keep that repeating for more than 40 years and you've got what we have today: an overprotective IT mother. – You don't know how to use a computer! You are an irresponsible m-word! – And the list goes on... so a monster was born. All because of repeated wrong root-cause analysis.","category":"page"},{"location":"Articles/How-corporate-IT-is-killing-innovation/","page":"How corporate IT is killing innovation","title":"How corporate IT is killing innovation","text":"With the rise of social networks, machine learning, and everything that dominated the web since 2010, IT gained power in major corporations and in some situations their choices come above technical or commercial ones. Naturally, the overly repressed IT people raised their concerns about every living and digital thing and started locking all paths to standard users.","category":"page"},{"location":"Articles/How-corporate-IT-is-killing-innovation/","page":"How corporate IT is killing innovation","title":"How corporate IT is killing innovation","text":"What companies forgot is how that building walls also block your views to the outside world. Innovation has always been a matter of who copies the best part of what others are doing. Mankind never created a single thing, we copied from nature, and then, putting bricks together, we copied from one another with varying levels of complexity. That to say, every single patent is somehow dishonest. But we keep protecting them, they are the status quo basis of competition. That's the case probably because we are less intelligent than we think we are.","category":"page"},{"location":"Articles/How-corporate-IT-is-killing-innovation/","page":"How corporate IT is killing innovation","title":"How corporate IT is killing innovation","text":"The moment IT obfuscates the view of technical people, the copy-edit-paste cycle is broken: innovation is, at least, strongly hurt. And there is no lack of examples of how this actually happens.","category":"page"},{"location":"Articles/How-corporate-IT-is-killing-innovation/","page":"How corporate IT is killing innovation","title":"How corporate IT is killing innovation","text":"I will stick to what concerns my technical field of expertise.","category":"page"},{"location":"Articles/How-corporate-IT-is-killing-innovation/","page":"How corporate IT is killing innovation","title":"How corporate IT is killing innovation","text":"In numerical simulation it is fundamental to sandbox everything, especially systems. Creativity comes with destruction, it's always oblivion. Numerical people like hard access to perform their best (and sometimes even to perform at all). Working with containers or, even worse, the cloud, are nightmarish. In our world a sandbox is nothing more than a good old workstation without company network access. We make magic there. Every single time an engineer has to beat themselves to have the right to work their best, they get damaged. Some withstand for years, some simply get aligned, what is even worse than quiet quitting. Give us sandboxes to play!","category":"page"},{"location":"Articles/How-corporate-IT-is-killing-innovation/","page":"How corporate IT is killing innovation","title":"How corporate IT is killing innovation","text":"In an average corporation (not talking about sizes here!), there are just a few people working on cutting edge technologies. Sometimes they go beyond the academic state-of-the-art (what is often the situation in semi-conductor industry, for instance). Because they are a minority, they get statistically forgotten by IT as standard users. Needless to say, these are also the people who know what they are doing with a computer. Based on what I said before, you get that we enter an infinite recursion here: you user no know how to use computer, but me user statistical minority, and so on...","category":"page"},{"location":"Articles/How-corporate-IT-is-killing-innovation/#The-open-source-battles-till-the-end-of-the-world","page":"How corporate IT is killing innovation","title":"The open-source battles till the end of the world","text":"","category":"section"},{"location":"Articles/How-corporate-IT-is-killing-innovation/#We-have-found-this-great-startup-selling-dreams","page":"How corporate IT is killing innovation","title":"We have found this great startup selling dreams","text":"","category":"section"},{"location":"Articles/How-corporate-IT-is-killing-innovation/#Non-technical-project-managers-everywhere","page":"How corporate IT is killing innovation","title":"Non-technical project managers everywhere","text":"","category":"section"},{"location":"Articles/How-corporate-IT-is-killing-innovation/","page":"How corporate IT is killing innovation","title":"How corporate IT is killing innovation","text":"Too-much governance and too little governance leading to no governance at all.","category":"page"},{"location":"Notebooks/07-Air-Properties/#Fitting-air-properties","page":"Fitting air properties","title":"Fitting air properties","text":"","category":"section"},{"location":"Notebooks/07-Air-Properties/","page":"Fitting air properties","title":"Fitting air properties","text":"In this note we show how to use Cantera to retrieve mixture properties for use in external simulations. This approach should be used only when composition dependency may be neglected or real-time evaluation becomes to expensive.","category":"page"},{"location":"Notebooks/07-Air-Properties/","page":"Fitting air properties","title":"Fitting air properties","text":"using WallyToolbox\n\nusing CairoMakie\nusing CondaPkg\nusing Polynomials\nusing PythonCall\n\nCondaPkg.add(\"cantera\")\n# CondaPkg.add(\"numpy\")\n\nct = pyimport(\"cantera\")\nnp = pyimport(\"numpy\")\nnothing; #hide","category":"page"},{"location":"Notebooks/07-Air-Properties/","page":"Fitting air properties","title":"Fitting air properties","text":"Since Cantera is not yet available from Julia (I am working on that!), we wrap the interfacing with Python code in function fit_gas_properties provided below.","category":"page"},{"location":"Notebooks/07-Air-Properties/","page":"Fitting air properties","title":"Fitting air properties","text":"For display of results, we also provide a standardized plotting function plot_gas_properties.","category":"page"},{"location":"Notebooks/07-Air-Properties/","page":"Fitting air properties","title":"Fitting air properties","text":"function fit_gas_properties(sol; orders = Dict())\n T = pyconvert(Vector{Float64}, sol.T)\n\n mu = pyconvert(Vector{Float64}, sol.viscosity)\n kg = pyconvert(Vector{Float64}, sol.thermal_conductivity)\n cp = pyconvert(Vector{Float64}, sol.cp_mass)\n\n poly_mu = Polynomials.fit(T, mu, get(orders, :mu, 4))\n poly_kg = Polynomials.fit(T, kg, get(orders, :kg, 4))\n poly_cp = Polynomials.fit(T, cp, get(orders, :cp, 4))\n\n return (mu, kg, cp, poly_mu, poly_kg, poly_cp)\nend\n\nfunction plot_gas_properties(\n T, mu, kg, cp, poly_mu, poly_kg, poly_cp;\n every = 10\n )\n Ts = T[begin:every:end]\n\n f = Figure(size = (700, 800))\n\n ax1 = Axis(f[1, 1]; xgridstyle=:dash, ygridstyle=:dash)\n ax2 = Axis(f[2, 1]; xgridstyle=:dash, ygridstyle=:dash)\n ax3 = Axis(f[3, 1]; xgridstyle=:dash, ygridstyle=:dash)\n\n lines!(ax1, T, mu; color = :red)\n lines!(ax2, T, kg; color = :red)\n lines!(ax3, T, cp; color = :red)\n\n scatter!(ax1, Ts, poly_mu.(Ts); color = :black)\n scatter!(ax2, Ts, poly_kg.(Ts); color = :black)\n scatter!(ax3, Ts, poly_cp.(Ts); color = :black)\n\n ax1.ylabel = \"Viscosity [Pa.s]\"\n ax2.ylabel = \"Conductivity [W/(m.K)]\"\n ax3.ylabel = \"Specific heat [J/(kg.K)]\"\n ax3.xlabel = \"Temperature [K]\"\n\n return f, (ax1, ax2, ax3)\nend\n\nnothing; #hide","category":"page"},{"location":"Notebooks/07-Air-Properties/","page":"Fitting air properties","title":"Fitting air properties","text":"For illustration purposes we make use of a typical composition of air over a broad range of temperatures.","category":"page"},{"location":"Notebooks/07-Air-Properties/","page":"Fitting air properties","title":"Fitting air properties","text":"Finally we visualize the results; verification is performed against values proposed in the literature by Mujumdar2006i [8].","category":"page"},{"location":"Notebooks/07-Air-Properties/","page":"Fitting air properties","title":"Fitting air properties","text":"let\n orders = Dict(:mu => 4, :kg => 4, :cp => 4)\n\n T = LinRange(200, 3000, 200)\n\n X = Dict(\"O2\" => 0.21, \"H2O\" => 0.006, \"Ar\" => 0.012, \"CO2\" => 0.04)\n X[\"N2\"] = 1.0 - sum(values(X))\n\n gas = ct.Solution(\"gri30.yaml\")\n sol = ct.SolutionArray(gas, shape=length(T))\n sol.TPX = pylist(T), ct.one_atm, pydict(X)\n\n rets = fit_gas_properties(sol; orders)\n\n μmuj = AirViscosityMujumdar2006()\n kmuj = AirHeatConductivityMujumdar2006()\n\n f, ax = plot_gas_properties(T, rets...)\n\n lines!(ax[1], T, μmuj.(T); color = :blue)\n lines!(ax[2], T, kmuj.(T); color = :blue)\n\n ax[1].yticks = 1.0e-05:3.0e-05:1.0e-04\n ax[2].yticks = 0.0:0.05:0.2\n ax[3].yticks = 900:100:1400\n\n xlims!(ax[1], 300, 3000)\n xlims!(ax[2], 300, 3000)\n xlims!(ax[3], 300, 3000)\n\n ylims!(ax[1], 1.0e-05, 10.0e-05)\n ylims!(ax[2], 0.0, 0.2)\n ylims!(ax[3], 900.0, 1400)\n\n f\nend","category":"page"},{"location":"Notebooks/07-Air-Properties/","page":"Fitting air properties","title":"Fitting air properties","text":"Another typical application of this approach would be to evaluate the properties of combustion flue gases for a post-combustion simulation, as follows:","category":"page"},{"location":"Notebooks/07-Air-Properties/","page":"Fitting air properties","title":"Fitting air properties","text":"let\n fuel = \"C2H2: 1.0\"\n oxid = \"O2: 1.0\"\n nums = 100\n\n gas = ct.Solution(\"gri30.yaml\")\n gas.set_equivalence_ratio(1.0, fuel=fuel, oxidizer=oxid, basis=\"mole\")\n gas.equilibrate(\"HP\")\n\n sol = ct.SolutionArray(gas, shape=(nums,))\n sol.TP = np.linspace(200, 3800, nums), ct.one_atm\n\n rets = fit_gas_properties(sol)\n\n for p in rets[end-2:end]\n println(repr(p))\n end\n\n T = pyconvert(Vector{Float64}, sol.T)\n\n f, ax = plot_gas_properties(T, rets...)\n f\nend","category":"page"},{"location":"WallyToolbox/setup-guide/#Setup-guide","page":"Setup guide","title":"Setup guide","text":"","category":"section"},{"location":"WallyToolbox/setup-guide/","page":"Setup guide","title":"Setup guide","text":"EditURL = \"https://github.com/wallytutor/WallyToolbox.jl/blob/main/docs/src/WallyToolbox/setup-guide.md\"","category":"page"},{"location":"WallyToolbox/setup-guide/","page":"Setup guide","title":"Setup guide","text":"You probably ended up here because you are looking for a full working setup of a reasonable computing environment under Windows and that is exactly the goal of this guide: to provide an easy way to setup a portable toolbox for working with scientific computing and development under Windows. It is intended to leave minimal track on host system[1], but I am not enforcing this in its development, so take care if you are not allowed to execute some software in a given computer. Except for the fact that you will probably want Microsoft MPI to be able to perform parallel computations, everything else can be deployed without administration rights.","category":"page"},{"location":"WallyToolbox/setup-guide/","page":"Setup guide","title":"Setup guide","text":"warn: Warn\nNotice that this guide is under development and instructions may still be incomplete; do not hesitate to reach me for more detailed instructions.","category":"page"},{"location":"WallyToolbox/setup-guide/","page":"Setup guide","title":"Setup guide","text":"[1]: Probably a few files and directories on your user home directory or under AppData.","category":"page"},{"location":"WallyToolbox/setup-guide/#Workflow-description","page":"Setup guide","title":"Workflow description","text":"","category":"section"},{"location":"WallyToolbox/setup-guide/","page":"Setup guide","title":"Setup guide","text":"First of all, you have to clone WallyToolbox.jl somewhere in the target computer. You can consider using GitHub Desktop at this stage, assuming you do not have Git yet. Everything else we perform here will be done under its tools/ directory. Before anything, read all the elements provided below, simply trying to follow them in order will certainly lead to errors or confusion.","category":"page"},{"location":"WallyToolbox/setup-guide/","page":"Setup guide","title":"Setup guide","text":"For each of the applications you will install, make sure to perform the following generic steps:","category":"page"},{"location":"WallyToolbox/setup-guide/","page":"Setup guide","title":"Setup guide","text":"Download the portable (often a compressed file) version of the application; the links to the currently supported applications are provided in the next section. It is recommended to create a sandbox/ directory under tools/ to save these files, it is ignored by version control.\nIf it is a compressed file, inspect it to check whether the software is contained in a compressed directory or if files are straight at the container root; in the later case create a directory with the software name and version under tools/bin/ and copy the file inside before extraction; otherwise extract it to that same directory. Several packages are stored directly at zip roots and that may be messy to clean. Once finished, you can delete the copy of the compressed file to free space.\nUnder tools/bin/ you find source.bat which is responsible by making sure all the executables may be found in your newly created environment. This file is a batch script and modifying it is the trickiest step of this guide. To open it you cannot click the file, but right-click and edit, as Windows see these as executables. First you need to find the section marked by the comment @REM NEW SYMBOLS and identify the variable associated to the software you are trying to install. Modify its value to the name of the directory you just created, that is everything you need to for most software.","category":"page"},{"location":"WallyToolbox/setup-guide/","page":"Setup guide","title":"Setup guide","text":"Once you have finished installing everything, comment out all set PATH related to software you are not installing; this way you avoid telling the system to search for executables under non-existing directories. Other commands such as call to non-existing scripts might break your system. Also remove any REG ADD that is not being used.","category":"page"},{"location":"WallyToolbox/setup-guide/","page":"Setup guide","title":"Setup guide","text":"Now you can launch the editor with access to the deployed software by clicking tools/code.vbs. It is recommended you create a symbolic link to this file in your desktop for each of use later, as navigating to this directory every time may be excruciating.","category":"page"},{"location":"WallyToolbox/setup-guide/#Minimal-working-environment","page":"Setup guide","title":"Minimal working environment","text":"","category":"section"},{"location":"WallyToolbox/setup-guide/","page":"Setup guide","title":"Setup guide","text":"These are required to get your system working for the first time. After installing VS Code, enable its portable mode and install required extensions (Python and Julia support, ...). Also notice that there is a tools/vscode/ directory for keeping user configurations in a version controlled way.","category":"page"},{"location":"WallyToolbox/setup-guide/","page":"Setup guide","title":"Setup guide","text":"VS Code\nGit\nJulia\nPython","category":"page"},{"location":"WallyToolbox/setup-guide/","page":"Setup guide","title":"Setup guide","text":"From a VS Code terminal launched using code.vbs script you can run wjulia as an alias to launch the toolbox; notice that launching this way is the only meaningful way to work with the toolbox as described here since that script will set all the required environment variables.","category":"page"},{"location":"WallyToolbox/setup-guide/","page":"Setup guide","title":"Setup guide","text":"To be able to use module WallyToolbox.Notebook or launch its exported interface for literate programming in the utilities, an user-defined value of environment variable JUPYTER_DATA_DIR must be provided to avoid conflict with system files. It must be noticed that this utility module is intentionally undocumented.","category":"page"},{"location":"WallyToolbox/setup-guide/","page":"Setup guide","title":"Setup guide","text":"Python modules are currently second-grade citizens to WallyToolbox; they consist mostly of domain-specific code that I did not yet migrate to Julia. Nonetheless, some code will remain in Python because fields such as computer vision and overall machine learning have a much broader community and thus quality tools. Wrapping these in Julia through PythonCall is not considered as an alternative for now. ","category":"page"},{"location":"WallyToolbox/setup-guide/","page":"Setup guide","title":"Setup guide","text":"# Install `virtualenv`:\npip install virtualenv\n\n# Create a virtual environment:\nvirtualenv venv\n\n# Alternativelly use built-in `venv`:\n# python -m venv venv\n\n# Activate the environment:\n./venv/Scripts/activate\n\n# Install dependencies, if any:\npip install -r requirements.txt","category":"page"},{"location":"WallyToolbox/setup-guide/#LaTeX-and-related","page":"Setup guide","title":"LaTeX and related","text":"","category":"section"},{"location":"WallyToolbox/setup-guide/","page":"Setup guide","title":"Setup guide","text":"Although LaTeX is not mandatory, it is highly encouraged; otherwise, what is the point of doing any scientific computing and not publishing its results? Also for a fully operational Jupyter notebook environment you need both pandoc and inkscape. ","category":"page"},{"location":"WallyToolbox/setup-guide/","page":"Setup guide","title":"Setup guide","text":"MikTeX\ntexstudio\nJabRef\npandoc\ninkscape","category":"page"},{"location":"WallyToolbox/setup-guide/","page":"Setup guide","title":"Setup guide","text":"Globally install pip install Pygments for enabling syntax highlight in LaTeX using minted; that is the most flexible highlighting method for adding code snippets to your documents.","category":"page"},{"location":"WallyToolbox/setup-guide/","page":"Setup guide","title":"Setup guide","text":"To append to TEXMF variable one can use the MiKTeX Console graphical interface and under Settings > Directories navigate and select the local path. Alternativelly on can add to bin//texmfs/install/miktex/config/miktexstartup.ini a line as","category":"page"},{"location":"WallyToolbox/setup-guide/","page":"Setup guide","title":"Setup guide","text":"CommonRoots=C:/Path/To/Local/TeX/Tree","category":"page"},{"location":"WallyToolbox/setup-guide/","page":"Setup guide","title":"Setup guide","text":"pointing to a directory implementing the user's TeX Directory Structure.","category":"page"},{"location":"WallyToolbox/setup-guide/#Domain-specific","page":"Setup guide","title":"Domain-specific","text":"","category":"section"},{"location":"WallyToolbox/setup-guide/#Science-and-Engineering","page":"Setup guide","title":"Science and Engineering","text":"","category":"section"},{"location":"WallyToolbox/setup-guide/","page":"Setup guide","title":"Setup guide","text":"Since these are mostly domain-specific, it is up to you to select from the list.","category":"page"},{"location":"WallyToolbox/setup-guide/","page":"Setup guide","title":"Setup guide","text":"DualSPHysics\nCantera\nCasADi\nDWSIM\nElmerFEM\nFreeFem++\nLAMMPS\nOpenModelica\nSU2","category":"page"},{"location":"WallyToolbox/setup-guide/","page":"Setup guide","title":"Setup guide","text":"For DualSPHysics one might also want to install this FreeCAD addon and this Blender addon.","category":"page"},{"location":"WallyToolbox/setup-guide/","page":"Setup guide","title":"Setup guide","text":"Read comments in tools/bin/source.bat for additional instructions, e.g. how to setup a Frankenstein LAMMPS installation. It requires a good familiarity with the inner workings of software and libraries; in the future I will reach LAMMPS maintainers to make this simpler and part of the official releases.","category":"page"},{"location":"WallyToolbox/setup-guide/#Geometry-and-preprocessing","page":"Setup guide","title":"Geometry and preprocessing","text":"","category":"section"},{"location":"WallyToolbox/setup-guide/","page":"Setup guide","title":"Setup guide","text":"Again some domain-specific software, select what you need.","category":"page"},{"location":"WallyToolbox/setup-guide/","page":"Setup guide","title":"Setup guide","text":"Blender\nFreeCAD\ngmsh\ngnuplot\nParaView\nSalome","category":"page"},{"location":"WallyToolbox/setup-guide/#Additional-languages","page":"Setup guide","title":"Additional languages","text":"","category":"section"},{"location":"WallyToolbox/setup-guide/","page":"Setup guide","title":"Setup guide","text":"It is highly discouraged to use Octave for any large project, but it might be interesting to use it for teaching linear algebra and the basics of numerical mathematics, so it is also supported.","category":"page"},{"location":"WallyToolbox/setup-guide/","page":"Setup guide","title":"Setup guide","text":"Octave","category":"page"},{"location":"WallyToolbox/setup-guide/#Possible-roadmap","page":"Setup guide","title":"Possible roadmap","text":"","category":"section"},{"location":"WallyToolbox/setup-guide/","page":"Setup guide","title":"Setup guide","text":"7-zip\nDyssol\nFiji\nFileZilla\nIpopt\nlazarus\nMSYS2\nMUSEN\nNotepad\nnteract\nnvim\nOpenCALPHAD\nOrange3\npuTTy\nScilab\nstrawberry-perl\nTabby\nZeroBraneStudio","category":"page"},{"location":"WallyToolbox/setup-guide/#Documentation-build","page":"Setup guide","title":"Documentation build","text":"","category":"section"},{"location":"WallyToolbox/setup-guide/","page":"Setup guide","title":"Setup guide","text":"Documentation is generated by a GitHub Actions workflow at every commit to the main branch. Because of the multiple modules in a repository structure, this documentation follows intrinsically a rolling release logic. Because the package and modules are not registered, they also do not appear in the docs/Project.toml. So it is up to the maintainers to ensure that section [deps] of docs/Project.toml points to ALL dependencies of ALL sub-packages.","category":"page"},{"location":"WallyToolbox/setup-guide/","page":"Setup guide","title":"Setup guide","text":"For generating the documentation locally, run julia --project=docs/ and in REPL run the following command:","category":"page"},{"location":"WallyToolbox/setup-guide/","page":"Setup guide","title":"Setup guide","text":"julia> include(\"docs/make.jl\")\n Resolving package versions...\n ...","category":"page"},{"location":"Modules/Cantera/#Cantera","page":"Cantera","title":"Cantera","text":"","category":"section"},{"location":"Modules/Cantera/","page":"Cantera","title":"Cantera","text":"This page documents the wrapper written around the C-API of Cantera. The status of development is documented here. Its goal is not to mimic the original API or provide an interface equivalent to the Python package, but something in line with the functioning of the parent toolbox.","category":"page"},{"location":"Modules/Cantera/#Status-of-Cantera-wrapper","page":"Cantera","title":"Status of Cantera wrapper","text":"","category":"section"},{"location":"Modules/Cantera/","page":"Cantera","title":"Cantera","text":"This is an experimental interface to Cantera library based on its C-API version 3.0. This interface is at its early days and has developped for Julia >= 1.9.0 under Windows 10/11. When it is stable enough it will be published as a package and tested under other platforms.","category":"page"},{"location":"Modules/Cantera/#Useful-links","page":"Cantera","title":"Useful links","text":"","category":"section"},{"location":"Modules/Cantera/","page":"Cantera","title":"Cantera","text":"Source files\nHeader files","category":"page"},{"location":"Modules/Cantera/#API-of-ct.h","page":"Cantera","title":"API of ct.h","text":"","category":"section"},{"location":"Modules/Cantera/","page":"Cantera","title":"Cantera","text":"Documentation here.","category":"page"},{"location":"Modules/Cantera/","page":"Cantera","title":"Cantera","text":"Status Header Function Module\nTested ct.h ct_appdelete inlined\nStruct ct.h soln_newSolution wrapped\n ct.h soln_newInterface waitlist\nTested ct.h soln_del inlined\nTested ct.h soln_name inlined\nStruct ct.h soln_thermo inlined\nStruct ct.h soln_kinetics inlined\nStruct ct.h soln_transport inlined\nTested ct.h soln_setTransportModel wrapped\nTested ct.h soln_nAdjacent inlined\n ct.h soln_adjacent waitlist\nTested ct.h thermo_newFromFile wrapped\nTested ct.h thermo_del inlined\nStruct ct.h thermo_nElements inlined\nStruct ct.h thermo_nSpecies inlined\nTested ct.h thermo_temperature inlined\nStruct ct.h thermo_setTemperature inlined\nTested ct.h thermo_density inlined\nTested ct.h thermo_setDensity inlined\nTested ct.h thermo_molarDensity inlined\nTested ct.h thermo_setMolarDensity inlined\nTested ct.h thermo_meanMolecularWeight inlined\nTested ct.h thermo_moleFraction inlined\nTested ct.h thermo_massFraction inlined\nStruct ct.h thermo_getMoleFractions inlined\nTested ct.h thermo_getMassFractions inlined\nStruct ct.h thermo_setMoleFractions inlined\nTested ct.h thermo_setMassFractions inlined\n ct.h thermo_setMoleFractionsByName \n ct.h thermo_setMassFractionsByName \n ct.h thermo_getAtomicWeights \n ct.h thermo_getMolecularWeights \n ct.h thermo_getCharges \n ct.h thermo_getElementName \n ct.h thermo_getSpeciesName \n ct.h thermo_getName \n ct.h thermo_setName \n ct.h thermo_elementIndex \n ct.h thermo_speciesIndex \n ct.h thermo_report \nTested ct.h thermo_print \n ct.h thermo_nAtoms \n ct.h thermo_addElement \n ct.h thermo_getEosType \nTo test ct.h thermo_refPressure inlined\nTo test ct.h thermo_minTemp inlined\nTo test ct.h thermo_maxTemp inlined\nTo test ct.h thermoenthalpymole inlined\nTo test ct.h thermointEnergymole inlined\nTo test ct.h thermoentropymole inlined\nTo test ct.h thermogibbsmole inlined\nTo test ct.h thermocpmole inlined\nTo test ct.h thermocvmole inlined\nTo test ct.h thermo_pressure inlined\nStruct ct.h thermo_setPressure inlined\nTo test ct.h thermoenthalpymass inlined\nTo test ct.h thermointEnergymass inlined\nTo test ct.h thermoentropymass inlined\nTo test ct.h thermogibbsmass inlined\nTo test ct.h thermocpmass inlined\nTo test ct.h thermocvmass inlined\nTo test ct.h thermo_electricPotential inlined\nTo test ct.h thermo_thermalExpansionCoeff inlined\nTo test ct.h thermo_isothermalCompressibility inlined\n ct.h thermo_chemPotentials \n ct.h thermogetEnthalpiesRT \n ct.h thermogetEntropiesR \n ct.h thermogetCpR \n ct.h thermo_setElectricPotential \n ct.h thermosetTP \n ct.h thermosetTD \n ct.h thermosetRP \n ct.h thermosetDP \n ct.h thermosetHP \n ct.h thermosetUV \n ct.h thermosetSV \n ct.h thermosetSP \n ct.h thermosetST \n ct.h thermosetTV \n ct.h thermosetPV \n ct.h thermosetUP \n ct.h thermosetVH \n ct.h thermosetTH \n ct.h thermosetSH \nTested ct.h thermo_equilibrate \nTo test ct.h thermo_critTemperature inlined\nTo test ct.h thermo_critPressure inlined\nTo test ct.h thermo_critDensity inlined\nTo test ct.h thermo_vaporFraction inlined\n ct.h thermo_satTemperature \n ct.h thermo_satPressure \n ct.h thermosetStatePsat \n ct.h thermosetStateTsat \n ct.h kin_newFromFile \nTo test ct.h kin_del inlined\nTo test ct.h kin_nSpecies inlined\nTo test ct.h kin_nReactions inlined\nTo test ct.h kin_nPhases inlined\n ct.h kin_phaseIndex \nTo test ct.h kin_reactionPhaseIndex inlined\n ct.h kin_reactantStoichCoeff \n ct.h kin_productStoichCoeff \n ct.h kin_getReactionType \n ct.h kin_getFwdRatesOfProgress \n ct.h kin_getRevRatesOfProgress \n ct.h kin_getNetRatesOfProgress \n ct.h kin_getEquilibriumConstants \n ct.h kin_getFwdRateConstants \n ct.h kin_getRevRateConstants \n ct.h kin_getDelta \n ct.h kin_getCreationRates \n ct.h kin_getDestructionRates \n ct.h kin_getNetProductionRates \n ct.h kin_getSourceTerms \nTo test ct.h kin_multiplier inlined\n ct.h kin_getReactionString \n ct.h kin_setMultiplier \nTo test ct.h kin_isReversible inlined\n ct.h kin_getType \nTo test ct.h kin_start inlined\n ct.h kin_speciesIndex \nTo test ct.h kin_advanceCoverages inlined\nTo test ct.h kin_phase inlined\nTo test ct.h trans_newDefault inlined\n ct.h trans_new \nTo test ct.h trans_del inlined\nTo test ct.h trans_transportModel inlined\nTo test ct.h trans_viscosity inlined\nTo test ct.h trans_electricalConductivity inlined\n ct.h trans_thermalConductivity \n ct.h trans_getThermalDiffCoeffs \n ct.h trans_getMixDiffCoeffs \n ct.h trans_getBinDiffCoeffs \n ct.h trans_getMultiDiffCoeffs \n ct.h trans_setParameters \n ct.h trans_getMolarFluxes \n ct.h trans_getMassFluxes \n ct.h ct_getCanteraError \n ct.h ct_setLogWriter \n ct.h ct_setLogCallback \n ct.h ct_addCanteraDirectory \n ct.h ct_getDataDirectories \n ct.h ct_getCanteraVersion \n ct.h ct_getGitCommit \nTested ct.h ctsuppressthermo_warnings inlined\nTested ct.h ctuselegacyrateconstants inlined\nTested ct.h ct_clearStorage inlined\nTested ct.h ct_resetStorage inlined","category":"page"},{"location":"Modules/Cantera/#API-of-ctfunc.h","page":"Cantera","title":"API of ctfunc.h","text":"","category":"section"},{"location":"Modules/Cantera/","page":"Cantera","title":"Cantera","text":"Documentation here.","category":"page"},{"location":"Modules/Cantera/","page":"Cantera","title":"Cantera","text":"Status Header Function Module\n ctfunc.h func_new \n ctfunc.h funcnewbasic \n ctfunc.h funcnewadvanced \n ctfunc.h funcnewcompound \n ctfunc.h funcnewmodified \nTo test ctfunc.h func_del inlined\n ctfunc.h func_type \nTo test ctfunc.h func_value inlined\nTo test ctfunc.h func_derivative inlined\nTo test ctfunc.h func_duplicate inlined\n ctfunc.h func_write \nTo test ctfunc.h ct_clearFunc inlined","category":"page"},{"location":"Modules/Cantera/#API-of-ctmultiphase.h","page":"Cantera","title":"API of ctmultiphase.h","text":"","category":"section"},{"location":"Modules/Cantera/","page":"Cantera","title":"Cantera","text":"Documentation here.","category":"page"},{"location":"Modules/Cantera/","page":"Cantera","title":"Cantera","text":"Status Header Function Module\nTo test ctmultiphase.h mix_new inlined\nTo test ctmultiphase.h mix_del inlined\nTo test ctmultiphase.h ct_clearMix inlined\n ctmultiphase.h mix_addPhase \nTo test ctmultiphase.h mix_init inlined\nTo test ctmultiphase.h mix_updatePhases inlined\nTo test ctmultiphase.h mix_nElements inlined\n ctmultiphase.h mix_elementIndex \n ctmultiphase.h mix_speciesIndex \nTo test ctmultiphase.h mix_nSpecies inlined\nTo test ctmultiphase.h mix_setTemperature inlined\nTo test ctmultiphase.h mix_temperature inlined\nTo test ctmultiphase.h mix_minTemp inlined\nTo test ctmultiphase.h mix_maxTemp inlined\nTo test ctmultiphase.h mix_charge inlined\nTo test ctmultiphase.h mix_phaseCharge inlined\nTo test ctmultiphase.h mix_setPressure inlined\nTo test ctmultiphase.h mix_pressure inlined\nTo test ctmultiphase.h mix_nAtoms inlined\nTo test ctmultiphase.h mix_nPhases inlined\nTo test ctmultiphase.h mix_phaseMoles inlined\n ctmultiphase.h mix_setPhaseMoles \n ctmultiphase.h mix_setMoles \n ctmultiphase.h mix_setMolesByName \nTo test ctmultiphase.h mix_speciesMoles inlined\nTo test ctmultiphase.h mix_elementMoles inlined\n ctmultiphase.h mix_equilibrate \n ctmultiphase.h mix_getChemPotentials \nTo test ctmultiphase.h mix_enthalpy inlined\nTo test ctmultiphase.h mix_entropy inlined\nTo test ctmultiphase.h mix_gibbs inlined\nTo test ctmultiphase.h mix_cp inlined\nTo test ctmultiphase.h mix_volume inlined\nTo test ctmultiphase.h mix_speciesPhaseIndex inlined\nTo test ctmultiphase.h mix_moleFraction inlined","category":"page"},{"location":"Modules/Cantera/#API-of-ctonedim.h","page":"Cantera","title":"API of ctonedim.h","text":"","category":"section"},{"location":"Modules/Cantera/","page":"Cantera","title":"Cantera","text":"Documentation here.","category":"page"},{"location":"Modules/Cantera/","page":"Cantera","title":"Cantera","text":"Status Header Function Module\nTo test ctonedim.h ct_clearOneDim inlined\n ctonedim.h domain_new \nTo test ctonedim.h domain_del inlined\nTo test ctonedim.h domain_type inlined\n ctonedim.h domain_type3 \nTo test ctonedim.h domain_index inlined\nTo test ctonedim.h domain_nComponents inlined\nTo test ctonedim.h domain_nPoints inlined\n ctonedim.h domain_componentName \n ctonedim.h domain_componentIndex \n ctonedim.h domain_setBounds \nTo test ctonedim.h domain_lowerBound inlined\nTo test ctonedim.h domain_upperBound inlined\n ctonedim.h domain_setSteadyTolerances \n ctonedim.h domain_setTransientTolerances \nTo test ctonedim.h domain_rtol inlined\nTo test ctonedim.h domain_atol inlined\n ctonedim.h domain_setupGrid \n ctonedim.h domain_setID \nTo test ctonedim.h domain_grid inlined\nTo test ctonedim.h bdry_setMdot inlined\nTo test ctonedim.h bdry_setTemperature inlined\nTo test ctonedim.h bdry_setSpreadRate inlined\n ctonedim.h bdry_setMoleFractions \nTo test ctonedim.h bdry_temperature inlined\nTo test ctonedim.h bdry_spreadRate inlined\nTo test ctonedim.h bdry_massFraction inlined\nTo test ctonedim.h bdry_mdot inlined\nTo test ctonedim.h reactingsurf_setkineticsmgr inlined\nTo test ctonedim.h reactingsurf_enableCoverageEqs inlined\nTo test ctonedim.h inlet_new inlined\nTo test ctonedim.h outlet_new inlined\nTo test ctonedim.h outletres_new inlined\nTo test ctonedim.h symm_new inlined\nTo test ctonedim.h surf_new inlined\nTo test ctonedim.h reactingsurf_new inlined\nTo test ctonedim.h inlet_setSpreadRate inlined\n ctonedim.h stflow_new \nTo test ctonedim.h stflow_setTransport inlined\nTo test ctonedim.h stflow_enableSoret inlined\nTo test ctonedim.h stflow_setPressure inlined\nTo test ctonedim.h stflow_pressure inlined\n ctonedim.h stflow_setFixedTempProfile \nTo test ctonedim.h stflow_solveEnergyEqn inlined\n ctonedim.h sim1D_new \nTo test ctonedim.h sim1D_del inlined\n ctonedim.h sim1D_setValue \n ctonedim.h sim1D_setProfile \n ctonedim.h sim1D_setFlatProfile \n ctonedim.h sim1D_show \n ctonedim.h sim1D_showSolution \n ctonedim.h sim1D_setTimeStep \nTo test ctonedim.h sim1D_getInitialSoln inlined\n ctonedim.h sim1D_solve \nTo test ctonedim.h sim1D_refine inlined\n ctonedim.h sim1D_setRefineCriteria \n ctonedim.h sim1D_setGridMin \n ctonedim.h sim1D_save \n ctonedim.h sim1D_restore \nTo test ctonedim.h sim1D_writeStats inlined\n ctonedim.h sim1D_domainIndex \n ctonedim.h sim1D_value \n ctonedim.h sim1D_workValue \nTo test ctonedim.h sim1D_eval inlined\nTo test ctonedim.h sim1D_setMaxJacAge inlined\nTo test ctonedim.h sim1D_setFixedTemperature inlined","category":"page"},{"location":"Modules/Cantera/#API-of-ctreactor.h","page":"Cantera","title":"API of ctreactor.h","text":"","category":"section"},{"location":"Modules/Cantera/","page":"Cantera","title":"Cantera","text":"Documentation here.","category":"page"},{"location":"Modules/Cantera/","page":"Cantera","title":"Cantera","text":"Status Header Function Module\n ctreactor.h reactor_new \nTo test ctreactor.h reactor_del inlined\nTo test ctreactor.h reactor_setInitialVolume inlined\nTo test ctreactor.h reactor_setChemistry inlined\nTo test ctreactor.h reactor_setEnergy inlined\nTo test ctreactor.h reactor_setThermoMgr inlined\nTo test ctreactor.h reactor_setKineticsMgr inlined\nTo test ctreactor.h reactor_insert inlined\nTo test ctreactor.h reactor_mass inlined\nTo test ctreactor.h reactor_volume inlined\nTo test ctreactor.h reactor_density inlined\nTo test ctreactor.h reactor_temperature inlined\nTo test ctreactor.h reactorenthalpymass inlined\nTo test ctreactor.h reactorintEnergymass inlined\nTo test ctreactor.h reactor_pressure inlined\nTo test ctreactor.h reactor_massFraction inlined\nTo test ctreactor.h reactor_nSensParams inlined\nTo test ctreactor.h reactor_addSensitivityReaction inlined\nTo test ctreactor.h flowReactor_setMassFlowRate inlined\nTo test ctreactor.h reactornet_new inlined\nTo test ctreactor.h reactornet_del inlined\nTo test ctreactor.h reactornet_setInitialTime inlined\nTo test ctreactor.h reactornet_setMaxTimeStep inlined\nTo test ctreactor.h reactornet_setTolerances inlined\nTo test ctreactor.h reactornet_setSensitivityTolerances inlined\nTo test ctreactor.h reactornet_addreactor inlined\nTo test ctreactor.h reactornet_advance inlined\nTo test ctreactor.h reactornet_step inlined\nTo test ctreactor.h reactornet_time inlined\nTo test ctreactor.h reactornet_rtol inlined\nTo test ctreactor.h reactornet_atol inlined\n ctreactor.h reactornet_sensitivity \n ctreactor.h flowdev_new \nTo test ctreactor.h flowdev_del inlined\nTo test ctreactor.h flowdev_install inlined\nTo test ctreactor.h flowdev_setMaster inlined\nTo test ctreactor.h flowdev_setPrimary inlined\nTo test ctreactor.h flowdev_massFlowRate inlined\nTo test ctreactor.h flowdev_setMassFlowCoeff inlined\nTo test ctreactor.h flowdev_setValveCoeff inlined\nTo test ctreactor.h flowdev_setPressureCoeff inlined\nTo test ctreactor.h flowdev_setPressureFunction inlined\nTo test ctreactor.h flowdev_setTimeFunction inlined\n ctreactor.h wall_new \nTo test ctreactor.h wall_del inlined\nTo test ctreactor.h wall_install inlined\nTo test ctreactor.h wall_vdot inlined\nTo test ctreactor.h wall_expansionRate inlined\nTo test ctreactor.h wall_Q inlined\nTo test ctreactor.h wall_heatRate inlined\nTo test ctreactor.h wall_area inlined\nTo test ctreactor.h wall_setArea inlined\nTo test ctreactor.h wall_setThermalResistance inlined\nTo test ctreactor.h wall_setHeatTransferCoeff inlined\nTo test ctreactor.h wall_setHeatFlux inlined\nTo test ctreactor.h wall_setExpansionRateCoeff inlined\nTo test ctreactor.h wall_setVelocity inlined\nTo test ctreactor.h wall_setEmissivity inlined\nTo test ctreactor.h wall_ready inlined\nTo test ctreactor.h reactorsurface_new inlined\nTo test ctreactor.h reactorsurface_del inlined\nTo test ctreactor.h reactorsurface_install inlined\nTo test ctreactor.h reactorsurface_setkinetics inlined\nTo test ctreactor.h reactorsurface_area inlined\nTo test ctreactor.h reactorsurface_setArea inlined\nTo test ctreactor.h reactorsurface_addSensitivityReaction inlined\nTo test ctreactor.h ct_clearReactors inlined","category":"page"},{"location":"Modules/Cantera/#API-of-ctrpath.h","page":"Cantera","title":"API of ctrpath.h","text":"","category":"section"},{"location":"Modules/Cantera/","page":"Cantera","title":"Cantera","text":"Documentation here.","category":"page"},{"location":"Modules/Cantera/","page":"Cantera","title":"Cantera","text":"Status Header Function Module\nTo test ctrpath.h rdiag_new inlined\nTo test ctrpath.h rdiag_del inlined\nTo test ctrpath.h rdiag_detailed inlined\nTo test ctrpath.h rdiag_brief inlined\nTo test ctrpath.h rdiag_setThreshold inlined\n ctrpath.h rdiag_setBoldColor \n ctrpath.h rdiag_setNormalColor \n ctrpath.h rdiag_setDashedColor \n ctrpath.h rdiag_setDotOptions \nTo test ctrpath.h rdiag_setBoldThreshold inlined\nTo test ctrpath.h rdiag_setNormalThreshold inlined\nTo test ctrpath.h rdiag_setLabelThreshold inlined\nTo test ctrpath.h rdiag_setScale inlined\nTo test ctrpath.h rdiag_setFlowType inlined\nTo test ctrpath.h rdiag_setArrowWidth inlined\n ctrpath.h rdiag_setTitle \n ctrpath.h rdiag_write \nTo test ctrpath.h rdiag_add inlined\n ctrpath.h rdiag_findMajor \n ctrpath.h rdiag_setFont \nTo test ctrpath.h rdiag_displayOnly inlined\nTo test ctrpath.h rbuild_new inlined\nTo test ctrpath.h rbuild_del inlined\n ctrpath.h rbuild_init \n ctrpath.h rbuild_build \nTo test ctrpath.h ct_clearReactionPath inlined","category":"page"},{"location":"Modules/Cantera/#API-of-ctsurf.h","page":"Cantera","title":"API of ctsurf.h","text":"","category":"section"},{"location":"Modules/Cantera/","page":"Cantera","title":"Cantera","text":"Documentation here.","category":"page"},{"location":"Modules/Cantera/","page":"Cantera","title":"Cantera","text":"Status Header Function Module\n ctsurf.h surf_setCoverages \n ctsurf.h surf_getCoverages \n ctsurf.h surf_setConcentrations \n ctsurf.h surf_getConcentrations \nTo test ctsurf.h surf_setSiteDensity inlined\nTo test ctsurf.h surf_siteDensity inlined\n ctsurf.h surf_setCoveragesByName ","category":"page"},{"location":"Modules/Cantera/#Cantera-samples","page":"Cantera","title":"Cantera samples","text":"","category":"section"},{"location":"Modules/Cantera/","page":"Cantera","title":"Cantera","text":"# cantera = \"C:\\\\Program Files\\\\Cantera\\\\bin\\\\cantera_shared.dll\"\n#\n# ENV[\"CANTERA_SHARED\"] = cantera\n# @assert haskey(ENV, \"CANTERA_SHARED\")\n#\n# FIXME: how to run this in GitHub???\n#\n# @assert ct.appdelete()\n# @assert ct.resetstorage()\n# @assert ct.clearstorage()\n# @assert ct.suppress_thermo_warnings(true)\n# @assert ct.use_legacy_rate_constants(false)\n#\n# sol = ct.Solution(\"gri30.yaml\", \"gri30\", \"mixture-averaged\")\n# gas = ct.Solution(\"gri30.yaml\", \"gri30\", \"mixture-averaged\")\n#\n# Xᵣ = zeros(sol.nspecies)\n# Xᵣ[1] = 1.0\n#\n# Tᵣ = 3500.0\n# Pᵣ = 50000.0\n#\n# ct.set_TPX!(sol, Tᵣ, Pᵣ, Xᵣ; norm = true)\n#\n# @assert ct.gettemperature(sol) ≈ Tᵣ\n# @assert ct.getpressure(sol) ≈ Pᵣ\n# @assert all(ct.getmolefractions(sol) ≈ Xᵣ)\n#\n# ct.equilibrate!(sol, \"HP\", print_results = true)","category":"page"},{"location":"Notebooks/A2-Ciencia-Colaborativa-e-Julia/#Ciência-colaborativa-e-Julia","page":"Ciência colaborativa e Julia","title":"Ciência colaborativa e Julia","text":"","category":"section"},{"location":"Notebooks/A2-Ciencia-Colaborativa-e-Julia/","page":"Ciência colaborativa e Julia","title":"Ciência colaborativa e Julia","text":"Uma dificuldade recorrente encontrada em projetos científicos contendo uma componente numérica é o despreparo dos colaboradores para a gestão de dados e documentos. Essa dificuldade não é somente técnica, mas frequentemente a origem de discórdias nos projetos.","category":"page"},{"location":"Notebooks/A2-Ciencia-Colaborativa-e-Julia/","page":"Ciência colaborativa e Julia","title":"Ciência colaborativa e Julia","text":"O estudo de Julia ou qualquer outra ferramenta para suporte computacional em ciência não tem sentido sem o caráter aplicativo no contexto de um projeto, seja ele acadêmico ou industrial. Neste anexo vamos abordar algumas ferramentas complementares ao uso de Julia úteis para o cientista e apontar os caminhos para encontrá-las e aprender mais sobre elas sem entrar nos detalhes de seus usos. A lista provida não é exaustiva mas contém um esqueleto mínimo que toda pesquisa séria deveria adotar para prover materiais com controle de qualidade e versionagem adequada.","category":"page"},{"location":"Notebooks/A2-Ciencia-Colaborativa-e-Julia/","page":"Ciência colaborativa e Julia","title":"Ciência colaborativa e Julia","text":"Para estudar aspectos computacionais em ciência você precisa de alguns componentes de suporte à linguagem de programação usada, em nosso caso Julia. No que se segue vamos apresentar:","category":"page"},{"location":"Notebooks/A2-Ciencia-Colaborativa-e-Julia/","page":"Ciência colaborativa e Julia","title":"Ciência colaborativa e Julia","text":"O editor de texto recomendado VS Code e a extensão requerida.\nA linguagem LaTeX usada para a entrada de equações nos notebooks e artigos.\nAs ferramentas necessárias para editar LaTeX fora do contexto de Julia.\nE finalmente o sistema de versionagem Git.\nOutras ferramentas de suporte.","category":"page"},{"location":"Notebooks/A2-Ciencia-Colaborativa-e-Julia/#VS-Code","page":"Ciência colaborativa e Julia","title":"VS Code","text":"","category":"section"},{"location":"Notebooks/A2-Ciencia-Colaborativa-e-Julia/","page":"Ciência colaborativa e Julia","title":"Ciência colaborativa e Julia","text":"Nos últimos anos VSCode se tornou o editor mais popular da comunidade open source e com toda razão. A qualidade da ferramenta provida pela Microsoft chegou a um nível que é difícil justificar o uso de um editor de código comercial. Aliado a isso, com a extensão Julia VSCode um suporte avançado a edição de código e documentação da linguagem é disponível. Além disso, a ferramenta provê integração com o sistema de controle de versões Git que vamos discutir no que se segue.","category":"page"},{"location":"Notebooks/A2-Ciencia-Colaborativa-e-Julia/#\\LaTeX","page":"Ciência colaborativa e Julia","title":"LaTeX","text":"","category":"section"},{"location":"Notebooks/A2-Ciencia-Colaborativa-e-Julia/","page":"Ciência colaborativa e Julia","title":"Ciência colaborativa e Julia","text":"Para a entrada de equações nos notebooks, Julia markdown provê suporte à renderização de LaTeX. É fundamental ter algum domínio desta linguagem para a elaborção de documentos científicos. As distribuições mais populares são MiKTeX para Windows e TeX Live para os demais sistemas operacionais. Ademais, artigos escritos usando a linguagem são aceitos pelas publicações mais relevantes em várias áreas do conhecimento. Outra razão para o uso de LaTeX é a estocagem de documentos em formato de texto bruto, o que permite um controle de versões com Git.","category":"page"},{"location":"Notebooks/A2-Ciencia-Colaborativa-e-Julia/#TeXStudio","page":"Ciência colaborativa e Julia","title":"TeXStudio","text":"","category":"section"},{"location":"Notebooks/A2-Ciencia-Colaborativa-e-Julia/","page":"Ciência colaborativa e Julia","title":"Ciência colaborativa e Julia","text":"Em complemento à distribuição de LaTeX é necessário um editor de texto adaptado. Embora existam extensões excelentes para realizar a compilação dos documentos [1] para VS Code, elas não são muito fáceis de se compreender para um iniciante. Por isso recomendamos TeXStudio para editar e compilar documentos escritos em LaTeX.","category":"page"},{"location":"Notebooks/A2-Ciencia-Colaborativa-e-Julia/","page":"Ciência colaborativa e Julia","title":"Ciência colaborativa e Julia","text":"[1]: Por compilação entende-se em nossos dias transformar o documento em PDF.","category":"page"},{"location":"Notebooks/A2-Ciencia-Colaborativa-e-Julia/#JabRef","page":"Ciência colaborativa e Julia","title":"JabRef","text":"","category":"section"},{"location":"Notebooks/A2-Ciencia-Colaborativa-e-Julia/","page":"Ciência colaborativa e Julia","title":"Ciência colaborativa e Julia","text":"Embora as referências bibliográficas possam ser inseridas diretamente em documentos LaTeX, o ideal é utilizar uma base de dados comum que possa ser reutilizada ao longo da carreira de pesquisa. JabRef é um gestor de bibliografia para o formato BibTeX suportado por LaTeX que estoca dados diretamente em formato textual. A interface gráfica é fácil de interagir e dado o formato de documento, as bases .bib são compatíveis com Git. ","category":"page"},{"location":"Notebooks/A2-Ciencia-Colaborativa-e-Julia/#Git","page":"Ciência colaborativa e Julia","title":"Git","text":"","category":"section"},{"location":"Notebooks/A2-Ciencia-Colaborativa-e-Julia/","page":"Ciência colaborativa e Julia","title":"Ciência colaborativa e Julia","text":"Falamos bastante em Git até o momento sem entrar em mais detalhes de que é uma ferramenta de controle de versões. Git elimina a prática insana de se salvar manualmente várias cópias de um mesmo documento para gerir versões. O sistema basea-se na comparação de conteúdos e propõe de se salvar unicamente os documentos modificados em um projeto. Embora seu uso básico seja bastante simples e plausível de se aprender em uma tarde de estudo, a ferramenta é bastante complexa e complexa, permitindo de voltar em pontos históricos de um projeto, publicar releases, etc. Para uma pesquisa sã e durável, o uso de documentos em formatos aceitando texto bruto em conjunto com Git é ideal.","category":"page"},{"location":"Notebooks/A2-Ciencia-Colaborativa-e-Julia/#Python","page":"Ciência colaborativa e Julia","title":"Python","text":"","category":"section"},{"location":"Notebooks/A2-Ciencia-Colaborativa-e-Julia/","page":"Ciência colaborativa e Julia","title":"Ciência colaborativa e Julia","text":"Embora esse seja um curso de Julia, é importante que o cientista também tenha conhecimento de Python. Python é uma linguagem generalista que também é bastante rica em termos de pacotes para aplicações científicas. Em termos de aprendizado é relativamente mais simples que Julia, com o porém que código nativo em Python é extremamente lento, requerindo sempre o uso de bibliotecas que na verdade são implementadas em C, Fortran, Rust, etc. Para a concepção de aplicações web especialmente a linguagem encontra-se num estado de maturidade bastante superior à Julia e não deve ser negligenciada. Ademais, encontra-se entre as linguagens mais utilizadas no mundo, enquanto Julia é uma linguagem de nicho.","category":"page"},{"location":"Notebooks/A2-Ciencia-Colaborativa-e-Julia/#GNUPlot","page":"Ciência colaborativa e Julia","title":"GNUPlot","text":"","category":"section"},{"location":"Notebooks/A2-Ciencia-Colaborativa-e-Julia/","page":"Ciência colaborativa e Julia","title":"Ciência colaborativa e Julia","text":"Embora tratemos da temática de gráficos para publicações no curso, uma alternativa sempre é interessante. GNUPlot é uma ferramenta open source contando com sua própria linguagem para geração de gráficos. É uma ferramenta interessante principalmente quando se deseja padronizar todas as figuras em um projeto através de arquivos de configuração.","category":"page"},{"location":"References/@Raissi2017/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Raissi2017/","page":"-","title":"-","text":"title: \"Physics informed deep learning (part I): Data-driven solutions of nonlinear partial differential equations\" authors: Maziar Raissi, Paris Perdikaris, George Em Karniadakis year: 2017 DOI: https://doi.org/10.48550/arXiv.1711.10561 Drive: https://1drv.ms/b/s!Ar4x-UlrYAiZla5YwhmbwapFcSs-8A?e=XiDCyF –-","category":"page"},{"location":"Notebooks/10-Note-Sublatice-Model/#CALPHAD:-site-fractions-in-3-sublattice-phase","page":"CALPHAD: site-fractions in 3 sublattice phase","title":"CALPHAD: site-fractions in 3 sublattice phase","text":"","category":"section"},{"location":"Notebooks/10-Note-Sublatice-Model/","page":"CALPHAD: site-fractions in 3 sublattice phase","title":"CALPHAD: site-fractions in 3 sublattice phase","text":"In this notebook we show that a 3 sublattice phase with 2 components in a binary system introduces a new variable to the optimization, i.e. minimization of Gibbs energy, of the system.","category":"page"},{"location":"Notebooks/10-Note-Sublatice-Model/","page":"CALPHAD: site-fractions in 3 sublattice phase","title":"CALPHAD: site-fractions in 3 sublattice phase","text":"Assume a phase such as gamma-AlMg with a model (Mg)_5(MgAl)_12(AlMg)_12. For simplicity in what follows we denote it as (A)_5(AB)_12(BA)_12.","category":"page"},{"location":"Notebooks/10-Note-Sublatice-Model/","page":"CALPHAD: site-fractions in 3 sublattice phase","title":"CALPHAD: site-fractions in 3 sublattice phase","text":"The calculations are done under the framework of Symbolics.jl.","category":"page"},{"location":"Notebooks/10-Note-Sublatice-Model/","page":"CALPHAD: site-fractions in 3 sublattice phase","title":"CALPHAD: site-fractions in 3 sublattice phase","text":"using Symbolics: @variables\nusing Symbolics: substitute, simplify\nusing Symbolics: solve_for","category":"page"},{"location":"Notebooks/10-Note-Sublatice-Model/","page":"CALPHAD: site-fractions in 3 sublattice phase","title":"CALPHAD: site-fractions in 3 sublattice phase","text":"In terms of composition, such a binary system is defined by a single molar fraction of, say, component A, x_A, the amount of x_B determined by balance:","category":"page"},{"location":"Notebooks/10-Note-Sublatice-Model/","page":"CALPHAD: site-fractions in 3 sublattice phase","title":"CALPHAD: site-fractions in 3 sublattice phase","text":"@variables x_A\n\nx_B = 1 - x_A\n\nx_A, x_B","category":"page"},{"location":"Notebooks/10-Note-Sublatice-Model/","page":"CALPHAD: site-fractions in 3 sublattice phase","title":"CALPHAD: site-fractions in 3 sublattice phase","text":"Since in the first sublattice only element A is present, it has unit site fraction. Just to keep formal we introduce symbols for the site fractions in this first sublattice.","category":"page"},{"location":"Notebooks/10-Note-Sublatice-Model/","page":"CALPHAD: site-fractions in 3 sublattice phase","title":"CALPHAD: site-fractions in 3 sublattice phase","text":"y_A1 = 1\ny_B1 = 1 - y_A1\n\ny_A1, y_B1","category":"page"},{"location":"Notebooks/10-Note-Sublatice-Model/","page":"CALPHAD: site-fractions in 3 sublattice phase","title":"CALPHAD: site-fractions in 3 sublattice phase","text":"The remaining unknowns are the site fractions in sublattice 2 and 3. Again, the sum of fractions is unit and a single value per sublattice completely defines the system:","category":"page"},{"location":"Notebooks/10-Note-Sublatice-Model/","page":"CALPHAD: site-fractions in 3 sublattice phase","title":"CALPHAD: site-fractions in 3 sublattice phase","text":"@variables y_A2 y_A3\n\ny_B2 = 1 - y_A2\ny_B3 = 1 - y_A3\n\ny_A2, y_B2, y_A3, y_B3","category":"page"},{"location":"Notebooks/10-Note-Sublatice-Model/","page":"CALPHAD: site-fractions in 3 sublattice phase","title":"CALPHAD: site-fractions in 3 sublattice phase","text":"The site fraction being defined as the occupancy of a given sublattice k with N_s sites by the element in question, say y_A^(k) = N_a N_s, then the number of moles N_a = y_A^(k) N_s. The mole fraction x_A is then sum N_AN_t, with N_t=sum N_s, the number of sites in the phase. For the phase in question N_t=29 and the mole fraction balances for both elements can be written as:","category":"page"},{"location":"Notebooks/10-Note-Sublatice-Model/","page":"CALPHAD: site-fractions in 3 sublattice phase","title":"CALPHAD: site-fractions in 3 sublattice phase","text":"expr1 = 29 * x_A - (5 * y_A1 + 12 * y_A2 + 12 * y_A3)\nexpr2 = 29 * x_B - (5 * y_B1 + 12 * y_B2 + 12 * y_B3)\nnothing; #hide","category":"page"},{"location":"Notebooks/10-Note-Sublatice-Model/","page":"CALPHAD: site-fractions in 3 sublattice phase","title":"CALPHAD: site-fractions in 3 sublattice phase","text":"expr1","category":"page"},{"location":"Notebooks/10-Note-Sublatice-Model/","page":"CALPHAD: site-fractions in 3 sublattice phase","title":"CALPHAD: site-fractions in 3 sublattice phase","text":"expr2","category":"page"},{"location":"Notebooks/10-Note-Sublatice-Model/","page":"CALPHAD: site-fractions in 3 sublattice phase","title":"CALPHAD: site-fractions in 3 sublattice phase","text":"From the constraints previously introduced, these expressions obviously add up to zero. We have nonetheless the constraint of y_A^(3) in terms of y_A^(2)","category":"page"},{"location":"Notebooks/10-Note-Sublatice-Model/","page":"CALPHAD: site-fractions in 3 sublattice phase","title":"CALPHAD: site-fractions in 3 sublattice phase","text":"y_A3_expr = solve_for(expr2, y_A3)","category":"page"},{"location":"Notebooks/10-Note-Sublatice-Model/","page":"CALPHAD: site-fractions in 3 sublattice phase","title":"CALPHAD: site-fractions in 3 sublattice phase","text":"Which can be replaced in first expression and show the indeterminacy of the system:","category":"page"},{"location":"Notebooks/10-Note-Sublatice-Model/","page":"CALPHAD: site-fractions in 3 sublattice phase","title":"CALPHAD: site-fractions in 3 sublattice phase","text":"mapping = Dict([y_A3 => y_A3_expr])\n\nsimplify(substitute(expr1, mapping); expand=true)","category":"page"}] +[{"location":"Science/Drafts/","page":"-","title":"-","text":"Courses to follow:","category":"page"},{"location":"Science/Drafts/","page":"-","title":"-","text":"\\item\\href{https://ocw.mit.edu/courses/mathematics/18-075-advanced-calculus-for-engineers-fall-2004/}{Advanced Calculus}","category":"page"},{"location":"Science/Drafts/","page":"-","title":"-","text":"\\item\\href{https://ocw.mit.edu/courses/mechanical-engineering/2-06-fluid-dynamics-spring-2013/}{Fluid Dynamics}:","category":"page"},{"location":"Science/Drafts/","page":"-","title":"-","text":"\\item\\href{https://ocw.mit.edu/courses/mechanical-engineering/2-25-advanced-fluid-mechanics-fall-2013/}{Advanced Fluid Mecanics}","category":"page"},{"location":"Science/Drafts/","page":"-","title":"-","text":"\\item\\href{https://ocw.mit.edu/courses/mechanical-engineering/2-27-turbulent-flow-and-transport-spring-2002/}{Turbulent Flow and Transport}","category":"page"},{"location":"Science/Drafts/","page":"-","title":"-","text":"\\item\\href{https://ocw.mit.edu/courses/mechanical-engineering/2-051-introduction-to-heat-transfer-fall-2015/}{Introduction to Heat Transfer}","category":"page"},{"location":"Science/Drafts/","page":"-","title":"-","text":"\\item\\href{https://ocw.mit.edu/courses/mechanical-engineering/2-51-intermediate-heat-and-mass-transfer-fall-2008/}{Intermediate Heat Transfer}","category":"page"},{"location":"Science/Drafts/","page":"-","title":"-","text":"\\item\\href{https://ocw.mit.edu/courses/mechanical-engineering/2-58j-radiative-transfer-spring-2006/}{Radiative Transfer}","category":"page"},{"location":"Science/Drafts/","page":"-","title":"-","text":"\\item\\href{https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-336j-introduction-to-numerical-simulation-sma-5211-fall-2003/}{Introduction to Simulation}","category":"page"},{"location":"Science/Drafts/","page":"-","title":"-","text":"\\item\\href{https://ocw.mit.edu/courses/aeronautics-and-astronautics/16-920j-numerical-methods-for-partial-differential-equations-sma-5212-spring-2003/}{Numerical Methods for PDE}","category":"page"},{"location":"Science/Drafts/","page":"-","title":"-","text":"\\item\\href{https://ocw.mit.edu/courses/mechanical-engineering/2-29-numerical-fluid-mechanics-spring-2015/}{Numerical Fluid Mechanics}","category":"page"},{"location":"Science/Drafts/","page":"-","title":"-","text":"\\item\\href{https://ppc.cs.aalto.fi/}{Programming Parallel Computers} (and its extension to \\href{https://github.com/parallel-rust-cpp}{Rust})","category":"page"},{"location":"Science/Drafts/","page":"-","title":"-","text":"\\item\\href{https://www.youtube.com/playlist?list=PLfF–3o8i4r82vJ0kjCVYgqKgyVM5QwN0}{Fluid Mechanics (classical)}","category":"page"},{"location":"Science/Drafts/","page":"-","title":"-","text":"\\item\\href{https://www.youtube.com/playlist?list=PL6S8U84PCLB27bdd15l1xnTSQKf3AOOoj}{Turbulent mixing conference (ICTP)}","category":"page"},{"location":"Science/Drafts/","page":"-","title":"-","text":"\\item\\href{https://www.youtube.com/playlist?list=PL80xBr8Wq0b5qXRPwyTxmGDOhO4obKOiC}{Turbulent flows}","category":"page"},{"location":"Science/Drafts/","page":"-","title":"-","text":"\\item\\href{https://www.youtube.com/playlist?list=PLp0hSY2uBeP8rhCbecD1Icahfbr6GSZ19}{Mathematical methods (ICTP)}","category":"page"},{"location":"Science/Drafts/","page":"-","title":"-","text":"\\item\\href{https://www.youtube.com/playlist?list=PLp0hSY2uBeP_7jL7uqlsxDmvimK2q6eF5}{Fluid dynamics (ICTP)}","category":"page"},{"location":"Science/Drafts/","page":"-","title":"-","text":"\\item\\href{https://www.youtube.com/channel/UCYlD7XynaJIBuYvmXlRBtnQ}{Pr. Dr. Carlos Thompson channel}","category":"page"},{"location":"Science/Drafts/","page":"-","title":"-","text":"[ ] Proof of mean value theorem (null integral implies null integrand)\n[ ] Derivation of Gauss (divergence) theorem","category":"page"},{"location":"Science/Drafts/#Thermodynamics-quick-review","page":"-","title":"Thermodynamics quick review","text":"","category":"section"},{"location":"Science/Drafts/","page":"-","title":"-","text":"When order increases entropy decreases.\nAn endothermic process is a process that absorbs heat from its surroundings; on the other hand, an exothermic process releases heat to its surroundings.","category":"page"},{"location":"Science/Drafts/#Granular-flows","page":"-","title":"Granular flows","text":"","category":"section"},{"location":"Science/Drafts/","page":"-","title":"-","text":"Parcel is a computational particle unit that may be composed of several particles which are all identical sharing a state, which include velocity, size, temperature, etc. See ORourke2010 [72] for details.\nCloud is the term OpenFOAM uses to describe particle flows. Here we will use both MPPICCloud andcollidingCloud, other types being available for reacting or multiphase solvers, such as thermoCloud.","category":"page"},{"location":"Science/Drafts/#Technological","page":"-","title":"Technological","text":"","category":"section"},{"location":"Science/Drafts/","page":"-","title":"-","text":"Siwek chamber is a reactor often used to determine the dispersion of solid fuels for combustion. Validation of simulations can be done through this and this paper. Other than the OpenFOAM case there is also this setup available on Fetch CFD.","category":"page"},{"location":"Science/Drafts/#Mathematical","page":"-","title":"Mathematical","text":"","category":"section"},{"location":"Science/Drafts/","page":"-","title":"-","text":"Hopf bifurcation  is a critical point where, as a parameter changes, a system's stability switches and a periodic solution arises. (see this).","category":"page"},{"location":"Science/Drafts/#Combustion","page":"-","title":"Combustion","text":"","category":"section"},{"location":"Science/Drafts/","page":"-","title":"-","text":"HyChem is an approach for modeling combustion of real liquid fuels by decomposing the problem into a lumped parameter model of evaporation/devolatilization and a detailed or simplified chemical kinetics approach applied to the gas phase. It is available for high-end fuels such as jet fuel and gasoline.","category":"page"},{"location":"Science/Drafts/#Condensate-fuel-combustion","page":"-","title":"Condensate fuel combustion","text":"","category":"section"},{"location":"Science/Drafts/","page":"-","title":"-","text":"This matter enters a intrinsically multiphysics domain and problem formulation needs to take into account at what level the model is required to act. For liquids, that might include spray droplets formation, evaporation, devolatilization, mass transfer to gas phase, and finally, oxidation kinetics of gas products. In the case of solids, due to high uncertainty and variability in material properties, and complex mass transfer phenomena, one must expect qualitative or semi-quantitative agreement of models and measurements. Furthermore, lumped-parameter modeling is a requirement in the field, making it difficult to be generalized to a physical level as of today.","category":"page"},{"location":"Science/Drafts/","page":"-","title":"-","text":"[[@Saario2005a]] used Ansys Fluent to simulate HFO (heavy-fuel oil) combustion using the standard mixture fraction approach coupled to a Lagrangian particle tracking for evaporating droplets and k-epsilon turbulence modeling. This is a highly standard industrial application of global combustion simulation from an energy standpoint but lacks the generality of considering a detailed chemistry of gas phase (for instance, for coupling with solid calcination reactions, if that is the case).","category":"page"},{"location":"Science/Drafts/","page":"-","title":"-","text":"[[@Garaniya2012a]] used StarCD to simulate HFO in the context of ship engines. From the same authors Garaniya2012b [73], we also have the the thermodynamic formulation of the problem.","category":"page"},{"location":"Science/Drafts/","page":"-","title":"-","text":"[[@Nowruzi2014]] successfully simulated a spray jet of HFO with OpenFOAM without accounting for chemistry and combustion. In the absence of a proper PSD (particle size-distribution) this step is required to initialize a simulation, but can hardly be integrated in a reacting flow simulation, which would become overly complex. ","category":"page"},{"location":"Science/Drafts/","page":"-","title":"-","text":"[[@Sanchez2023a]] studied the combustion of biomass with help of OpenFOAM with some semi-quantitative results within 13% from the measurements, what is already considered a very good agreement in the field.","category":"page"},{"location":"Science/Drafts/","page":"-","title":"-","text":"[ ] Continue the research here.","category":"page"},{"location":"Science/Drafts/#Combustion-of-heavy-oil-fuel","page":"-","title":"Combustion of heavy oil fuel","text":"","category":"section"},{"location":"Science/Drafts/","page":"-","title":"-","text":"[[@Lawn1987]]","category":"page"},{"location":"Notebooks/05-Random-Walk/#A-simple-random-walker","page":"A simple random walker","title":"A simple random walker","text":"","category":"section"},{"location":"Notebooks/05-Random-Walk/","page":"A simple random walker","title":"A simple random walker","text":"using CairoMakie\nusing Random\nusing SpecialFunctions\nnothing; #hide","category":"page"},{"location":"Notebooks/05-Random-Walk/","page":"A simple random walker","title":"A simple random walker","text":"# Create a random number generator with a given seed.\nconst RNG = MersenneTwister(42)\nnothing; #hide","category":"page"},{"location":"Notebooks/05-Random-Walk/","page":"A simple random walker","title":"A simple random walker","text":"function random_walker(p, n, N, K, xn, yn, A)\n for tn ∈ 1:N\n # Sample the distance to try to move.\n Δx, Δy = rand(RNG, -K:K, 2)\n\n # Compute new hypothetical position.\n xm = mod(xn + Δx, n)\n ym = mod(yn + Δy, n)\n\n # Compute distance from current point.\n z = hypot(xn - xm, yn - ym)\n\n # Take shot on current movement.\n bullet = rand(RNG)\n threshold = p(z, K)\n\n # Always move or should I use RNG?\n # if true #bullet < threshold\n if bullet < threshold\n # FIXME: last r/c is being skipped!\n # Make sure wrapping around is respected.\n xm = (1 <= xm <= n) ? xm : n+xm\n ym = (1 <= ym <= n) ? ym : n+ym\n # xm = (xm>0) ? xm : n+xm-1\n # ym = (ym>0) ? ym : n+ym-1\n\n # Update position.\n xn, yn = xm, ym\n A[xn, yn] += 1\n end\n end\nend","category":"page"},{"location":"Notebooks/05-Random-Walk/","page":"A simple random walker","title":"A simple random walker","text":"function simulation(N, M, n, p, K)\n # Allocate matrix for tracking presence history.\n A = zeros(Int64, (n, n))\n \n # Get initial position of *particle*.\n xn, yn = rand(RNG, 1:n, 2)\n # xn, yn = div(n, 2), div(n, 2)\n \n # Store initial position for display later.\n x0, y0 = xn, yn\n \n # Start sampling loop.\n for rm ∈ 1:M\n # NO: Feed particle to its initial position.\n # The initial particle is *outside* the domain!\n # A[xn+1, yn+1] += 1\n \n # Start random-walk loop.\n random_walker(p, n, N, K, xn, yn, A)\n \n # Reinitialize particle position.\n xn, yn = x0, y0\n end\n\n return A\nend","category":"page"},{"location":"Notebooks/05-Random-Walk/","page":"A simple random walker","title":"A simple random walker","text":"function workflow(p, K, n, N, M)\n A = simulation(N, M, n, p, K)\n \n with_theme() do\n n = first(size(A))\n nn = div(n, 2) + 1\n \n a1 = reshape(sum(A; dims=1), n)[nn:end-1]\n a2 = reshape(sum(A; dims=2), n)[nn:end-1]\n \n a1 /= sum(a1)\n a2 /= sum(a2)\n \n a1 /= maximum(a1)\n a2 /= maximum(a2)\n \n # This is obviously wrong!\n # x = 1:nn\n # t = N\n # D = K / 6 # HOW SHOULD I? (Meher, 2007)\n # C = 1.0\n # Constant surface concentration solution:\n # an = @. C * erfc(x/(2sqrt(D*t)))\n \n f = Figure(size = (1000, 500))\n \n ax1 = Axis(f[1, 1]; aspect = 1)\n heatmap!(ax1, A[1:end-1, 1:end-1]; colormap = :thermal)\n \n ax2 = Axis(f[1, 2]; aspect = 1)\n lines!(ax2, a1; color=:black)\n lines!(ax2, a2; color=:red)\n # lines!(ax2, an; color=:blue) \n xlims!(ax2, 0, nn)\n ylims!(ax2, 0, 1.5)\n \n f\n end\nend","category":"page"},{"location":"Notebooks/05-Random-Walk/","page":"A simple random walker","title":"A simple random walker","text":"let\n # Probility of moving a distance y, step size K.\n p(z, K) = exp(-z / K)\n \n # Characteristic maximum step.\n K = 2\n \n # Size of square domain (matrix) for random walks.\n n = 50\n \n # If N > n, then *neighbors* interact!\n # Number of random walk steps to perform.\n N = 5n\n \n # Number of repeats for sampling\n M = 1000\n\n workflow(p, K, n, N, M)\nend","category":"page"},{"location":"Notebooks/05-Random-Walk/","page":"A simple random walker","title":"A simple random walker","text":"n = 50\n\nistrue = true\n\nfor _n in 1:10\n for _ in 1:20\n x = rand(RNG, -(n-1):n)\n v = (1 <= n+x <= n) ? n+x : x\n \n if (v == 0) || (v > n)\n println(x, \" \", v)\n end\n \n if !(1 <= v <= n)\n println(\"WTH: $(v)\")\n end\n \n istrue = istrue && (1 <= v <= n)\n end\nend\n\nistrue","category":"page"},{"location":"Notebooks/05-Random-Walk/","page":"A simple random walker","title":"A simple random walker","text":"","category":"page"},{"location":"Notebooks/05-Random-Walk/","page":"A simple random walker","title":"A simple random walker","text":"","category":"page"},{"location":"References/@Guo2023d/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Guo2023d/","page":"-","title":"-","text":"title: \"Unraveling the design pattern of physics-informed neural networks: Series 04\" authors: Shuai Guo year: 2023 URL: https://towardsdatascience.com/unraveling-the-design-pattern-of-physics-informed-neural-networks-part-04-c778f4829dde –- Discussed [[@Yu2022a]].","category":"page"},{"location":"Modules/RadCalNet/#RadCalNet","page":"RadCalNet","title":"RadCalNet","text":"","category":"section"},{"location":"Modules/RadCalNet/","page":"RadCalNet","title":"RadCalNet","text":"CurrentModule = RadCalNet\nEditURL = \"https://github.com/wallytutor/WallyToolbox.jl/blob/main/docs/src/Modules/RadCalNet.md\"","category":"page"},{"location":"Modules/RadCalNet/","page":"RadCalNet","title":"RadCalNet","text":"Radiation properties machine learning model trained on RadCal.","category":"page"},{"location":"Modules/RadCalNet/","page":"RadCalNet","title":"RadCalNet","text":"In this project we use the re-implementation of RadCal Grosshandler1993 [11] to generate data and train a machine learning model for the prediction of radiative properties, i.e. emissivity and transmissivity, of common combustion flue gases.","category":"page"},{"location":"Modules/RadCalNet/","page":"RadCalNet","title":"RadCalNet","text":"This is done because for real-time calls of RADCAL might be computationally prohibitive, for instance in CFD applications. Thus, a neural network is trained with Flux based on the simulated data and this module provides an interface to call the network from external programs (Ansys Fluent, OpenFOAM, ...).","category":"page"},{"location":"Modules/RadCalNet/","page":"RadCalNet","title":"RadCalNet","text":"For details of validity ranges and sample space, please check function RadCalNet.datasampler!, where random sampling is provided. Indexing of species array is documented at RadCalNet.runradcalinput.","category":"page"},{"location":"Modules/RadCalNet/","page":"RadCalNet","title":"RadCalNet","text":"Below we display the quality of fitting of model. One must notice that fitting of emissivity still needs a few adjustments, while transmissivity is well predicted over the whole range.","category":"page"},{"location":"Modules/RadCalNet/","page":"RadCalNet","title":"RadCalNet","text":"(Image: Model testing)","category":"page"},{"location":"Modules/RadCalNet/#Usage","page":"RadCalNet","title":"Usage","text":"","category":"section"},{"location":"Modules/RadCalNet/","page":"RadCalNet","title":"RadCalNet","text":"The following snippet illustrates everything the model was designed to do.","category":"page"},{"location":"Modules/RadCalNet/","page":"RadCalNet","title":"RadCalNet","text":"julia> using RadCalNet;\n\njulia> x = Float32[1200.0; 1000.0; 2.0; 1.0; 0.1; 0.2; 0.1];\n\njulia> y = RadCalNet.model(x)\n2-element Vector{Float32}:\n 0.3231391\n 0.6287435","category":"page"},{"location":"Modules/RadCalNet/","page":"RadCalNet","title":"RadCalNet","text":"The array of inputs x is defined below, and y provides gas emissitivy and transmissivity, respectively. Notice that x must be a column vector with entries of type Float32.","category":"page"},{"location":"Modules/RadCalNet/","page":"RadCalNet","title":"RadCalNet","text":"Index Quantity Units Minimum Maximum\n1 Wall temperature K 300 2500\n2 Gas temperature K 300 2500\n3 Depth m 0.1 3.0\n4 Pressure atm 0.5 1.5\n5 CO2 mole fraction - 0.0 0.25\n6 H2O mole fraction - 0.0 0.30\n7 CO mole fraction - 0.0 0.20","category":"page"},{"location":"Modules/RadCalNet/","page":"RadCalNet","title":"RadCalNet","text":"For practical applications, one generally is interested in calling the model with a large inputs set. Belowe we illustrate how to do this with a block of data and verify the predictions are within the model tolerance on average.","category":"page"},{"location":"Modules/RadCalNet/","page":"RadCalNet","title":"RadCalNet","text":"using WallyToolbox\nusing RadCalNet\nusing Flux: mae\n\n# Loss after last training.\nLOSS = 0.0022\n\n# Random sample data randomly extracted (20 rows).\nTESTDATA = Float32[\n 1670.0 960.0 1.9 0.5 0.15 0.18 0.03 0.161774 0.820025\n 1230.0 320.0 1.9 1.0 0.04 0.08 0.18 0.20205 0.79694\n 1760.0 770.0 2.1 1.5 0.22 0.24 0.12 0.309017 0.669564\n 1770.0 960.0 1.9 0.5 0.15 0.0 0.13 0.0721235 0.919333\n 350.0 1590.0 1.9 1.0 0.06 0.29 0.12 0.357215 0.169437\n 2330.0 1820.0 1.1 1.5 0.13 0.08 0.13 0.100282 0.840802\n 1220.0 2070.0 0.2 0.5 0.11 0.17 0.09 0.0361672 0.902581\n 760.0 1380.0 1.9 1.5 0.1 0.01 0.10 0.188531 0.69798\n 1870.0 1880.0 0.2 1.5 0.14 0.28 0.17 0.0819803 0.858508\n 1910.0 2220.0 1.3 1.5 0.2 0.3 0.09 0.202592 0.63856\n 2290.0 360.0 1.8 0.5 0.0 0.23 0.07 0.0755366 0.914045\n 1330.0 640.0 1.7 1.5 0.21 0.04 0.06 0.227428 0.764363\n 1090.0 1260.0 1.9 1.5 0.17 0.18 0.18 0.381407 0.501751\n 1250.0 1590.0 0.4 1.5 0.13 0.27 0.18 0.191725 0.688272\n 990.0 2320.0 0.5 1.0 0.23 0.27 0.03 0.118285 0.633932\n 1920.0 720.0 0.3 1.0 0.05 0.03 0.18 0.0496579 0.945693\n 1250.0 310.0 0.6 1.0 0.04 0.18 0.15 0.171857 0.827273\n 1990.0 1020.0 1.3 1.0 0.09 0.11 0.15 0.140596 0.837042\n 1180.0 1830.0 0.3 0.5 0.09 0.29 0.02 0.0682171 0.851304\n 2120.0 1230.0 2.9 1.5 0.03 0.06 0.17 0.168034 0.791942\n]\n\n# Predictors and targets transposed.\nX = transpose(TESTDATA[:, 1:7])\nY = transpose(TESTDATA[:, 8:9])\n\nmae(RadCalNet.model(X), Y) <= LOSS\n\n# output\n\ntrue","category":"page"},{"location":"Modules/RadCalNet/","page":"RadCalNet","title":"RadCalNet","text":"The following test can also be seen as a tutorial for data generation, where we make the verification of data generation with provided seed. See RadCalNet.createcustomdatabase for more details. An alternative RadCalNet.datasampler! can be provided for specific problems.","category":"page"},{"location":"Modules/RadCalNet/","page":"RadCalNet","title":"RadCalNet","text":"import Random\nusing WallyToolbox\nusing RadCalNet\n\nfunction sampledatabase()\n #XXX: documentation is run from root directory!\n testname = joinpath(joinpath(@__DIR__, \"src/Modules/data/RadCalNet/sample.dat\"))\n\n # Provide a seed at start-up for *maybe* reproducible builds.\n Random.seed!(42)\n\n if !isfile(testname)\n RadCalNet.createcustomdatabase(;\n sampler! = RadCalNet.datasampler!,\n repeats = 3,\n samplesize = 3,\n cleanup = true,\n saveas = testname,\n override = true\n )\n end\n\n return RadCalNet.loaddatabase(testname)\nend\n\nA = sampledatabase()[:, end-5:end]\n\n# output\n\n9×6 Matrix{Float32}:\n 0.61 0.0006522 0.00680899 0.127997 1.4369f5 0.784483\n 0.63 0.00147905 0.0163017 0.256072 52761.9 0.493376\n 0.8 0.00181013 0.0525569 0.209679 1712.82 0.743175\n 0.69 0.000962085 0.0317917 0.0917254 3.80101f5 0.88582\n 0.69 0.00246231 0.0538234 0.418247 1442.63 0.479691\n 0.68 0.00210072 0.00470752 0.0997078 71325.7 0.79875\n 0.67 0.000770321 0.0101432 0.0812446 3.0696f5 0.815462\n 0.7 0.00154008 0.0215186 0.253691 24945.7 0.478712\n 0.53 0.00133843 0.0180676 0.234852 21784.6 0.7443","category":"page"},{"location":"Modules/RadCalNet/#To-do's","page":"RadCalNet","title":"To-do's","text":"","category":"section"},{"location":"Modules/RadCalNet/","page":"RadCalNet","title":"RadCalNet","text":"Broaden sample space over the whole RadCal composition spectrum.\nDefine data loading on GPU/CPU though a flag when recovering model.\nCreate database for testing outside of sampling points.\nImprove model reload and organize a notebook for training.","category":"page"},{"location":"Modules/RadCalNet/#Literature-discussion","page":"RadCalNet","title":"Literature discussion","text":"","category":"section"},{"location":"Modules/RadCalNet/","page":"RadCalNet","title":"RadCalNet","text":"using DelimitedFiles\nusing HDF5\nusing Plots\nusing Printf\n\nusing WallyToolbox\nimport RadCalNet\n\nfunction gorogcomposition()\n X = zeros(14)\n X[1] = 0.2\n X[2] = 0.2\n X[end] = 1.0 - sum(X[1:2])\n return X\nend\n\nfunction gorogsemissivitydata()\n pr = collect(0.0:0.015:3.2)\n Tg = [830.0, 1110.0, 1390.0]\n\n X = gorogcomposition()\n prod = Iterators.product(pr, Tg)\n samplesize = length(pr) * length(Tg)\n table = zeros(samplesize, 26)\n\n for (k, (p, T)) in enumerate(prod)\n table[k, 1:end] = RadCalNet.runradcalinput(;\n X = X,\n T = T,\n L = p / sum(X[1:2]),\n TWALL = 300.0,\n FV = 1.0e-15\n )\n end\n\n return table\nend\n\nfunction gorogsabsorptivitydata()\n pr = collect(0.0:0.01:1.6)\n Tw = [277.0, 555.0, 833.0]\n\n X = gorogcomposition()\n prod = Iterators.product(pr, Tw)\n samplesize = length(pr) * length(Tw)\n table = zeros(samplesize, 26)\n\n for (k, (p, T)) in enumerate(prod)\n table[k, 1:end] = RadCalNet.runradcalinput(;\n X = X,\n T = 1110.0,\n L = p / sum(X[1:2]),\n TWALL = T,\n FV = 1.0e-15\n )\n end\n\n return table\nend\n\nfunction plotgorogsemissitivity(εdata, εgorog)\n p = plot(dpi = 100, legend = :topleft)\n scatter!(p, εdata[1][:, 1], εdata[1][:, 2],\n markerstrokewidth = 0.0, label = \"Gorog\")\n\n for T in unique(εgorog[:, 4])\n sel = εgorog[εgorog[:, 4] .== T, :]\n pr = sum(sel[:, 8:9], dims = 2) .* sel[:, 5]\n εg = sel[:, 24]\n plot!(p, pr, εg, label = @sprintf(\"%4.0f K\", T))\n end\n\n xlims!(p, 0.0, 3.2)\n ylims!(p, 0.0, 0.7)\n xticks!(p, 0.0:0.4:3.2)\n yticks!(p, 0.0:0.1:0.7)\n\n xlabel!(p, \"Optical thickness [m-atm]\")\n ylabel!(p, \"Emissivity\")\n\n p\nend\n\nfunction plotgorogsabsorptivitydata(αdata, αgorog)\n p = plot(dpi = 100, legend = :topleft)\n scatter!(p, αdata[1][:, 1], αdata[1][:, 2],\n markerstrokewidth = 0.0, label = \"Gorog\")\n\n for T in unique(αgorog[:, 3])\n sel = αgorog[αgorog[:, 3] .== T, :]\n pr = sum(sel[:, 8:9], dims = 2) .* sel[:, 5]\n αg = 1.0 .- sel[:, end]\n plot!(p, pr, αg, label = @sprintf(\"%4.0f K\", T))\n end\n\n xlims!(p, 0.0, 1.6)\n ylims!(p, 0.0, 1.0)\n xticks!(p, 0.0:0.2:1.6)\n yticks!(p, 0.0:0.2:1.0)\n\n xlabel!(p, \"Optical thickness [m-atm]\")\n ylabel!(p, \"Absorptivity\")\n\n p\nend\n\ndatadir = @__DIR__\n\nεfig = joinpath(datadir, \"media/RadCalNet/emissivity.png\")\nαfig = joinpath(datadir, \"media/RadCalNet/absorptivity.png\")\n\nεfile = joinpath(datadir, \"data/RadCalNet/emissivity.csv\")\nαfile = joinpath(datadir, \"data/RadCalNet/absorptivity.csv\")\n\nif !isfile(εfig)\n εdata = readdlm(εfile, ',', Float64, header = true)\n εgorog = gorogsemissivitydata()\n p = plotgorogsemissitivity(εdata, εgorog)\n png(p, εfig)\nend\n\nif !isfile(αfig)\n αdata = readdlm(αfile, ',', Float64, header = true)\n αgorog = gorogsabsorptivitydata()\n p = plotgorogsabsorptivitydata(αdata, αgorog)\n png(p, αfig)\nend","category":"page"},{"location":"Modules/RadCalNet/#Verification-agains-Gorog's-paper","page":"RadCalNet","title":"Verification agains Gorog's paper","text":"","category":"section"},{"location":"Modules/RadCalNet/","page":"RadCalNet","title":"RadCalNet","text":"Below we compare computed values with those by Gorog1981a [12]. Reference paper is found here.","category":"page"},{"location":"Modules/RadCalNet/","page":"RadCalNet","title":"RadCalNet","text":"(Image: Emissivity)","category":"page"},{"location":"Modules/RadCalNet/","page":"RadCalNet","title":"RadCalNet","text":"(Image: Absorptivity)","category":"page"},{"location":"Modules/RadCalNet/","page":"RadCalNet","title":"RadCalNet","text":"At least qualitative agreement is found and orders of magnitude are right. On the other hand, using directly the model parameters from Tam2019 [13] do not produce the expected results (not displayed, work in progress in this draft). It is not clear how the data is pre- and post-processed for use with their network.","category":"page"},{"location":"Modules/RadCalNet/#All-interfaces","page":"RadCalNet","title":"All interfaces","text":"","category":"section"},{"location":"Modules/RadCalNet/","page":"RadCalNet","title":"RadCalNet","text":"Modules = [ RadCalNet ]","category":"page"},{"location":"Modules/RadCalNet/#RadCalNet.ModelData","page":"RadCalNet","title":"RadCalNet.ModelData","text":"ModelData(fpath::String; f_train::Float64 = 0.7)\n\nLoad HDF5 database stored under fpath and performs standardized workflow of data preparation for model training. The data is split under training and testing datasets with a fraction of training data of f_train.\n\nscaler::StatsBase.ZScoreTransform{Float32, Vector{Float32}}: Scaler used for data transformation.\nX_train::Matrix{Float32}: Matrix of training input data.\nY_train::Matrix{Float32}: Matrix of training output data.\nX_tests::Matrix{Float32}: Matrix of testing input data.\nY_tests::Matrix{Float32}: Matrix of testing output data.\nn_inputs::Int64: Number of model inputs.\nn_outputs::Int64: Number of model outputs.\n\n\n\n\n\n","category":"type"},{"location":"Modules/RadCalNet/#RadCalNet.ModelTrainer","page":"RadCalNet","title":"RadCalNet.ModelTrainer","text":"ModelTrainer(\n data::ModelData,\n model::Chain;\n batch::Int64=64,\n epochs::Int64=100,\n η::Float64=0.001,\n β::Tuple{Float64,Float64}=(0.9, 0.999),\n ϵ::Float64=1.0e-08\n)\n\nHolds standardized model training parameters and data.\n\nbatch::Int64: Batch size in training loop.\nepochs::Int64: Number of epochs to train each time.\ndata::RadCalNet.ModelData: Database structure used for training/testing.\nmodel::Flux.Chain: Multi-layer perceptron used for modeling.\noptim::NamedTuple: Internal Adam optimizer.\nlosses::Vector{Float32}: History of losses.\n\n\n\n\n\n","category":"type"},{"location":"Modules/RadCalNet/#RadCalNet.createcustomdatabase-Tuple{}","page":"RadCalNet","title":"RadCalNet.createcustomdatabase","text":"createcustomdatabase(;\n sampler!::Function,\n repeats::Int64 = 100,\n samplesize::Int64 = 50_000,\n cleanup::Bool = false,\n saveas::String = \"database.h5\",\n OMMIN::Float64 = 50.0,\n OMMAX::Float64 = 10000.0,\n override::Bool = false\n)\n\nCreates a custom database by generating a number repeats of samples of samplesize rows. Inputs for runradcalinput are to be generated by a sampler! user-defined function which modifies in place an array of compositions, and returns T, L, P, FV, TWALL for setting up a simulation. Files are temporarilly stored under data/ with a sequential numbered naming during database creation and aggregated in a HDF5 file named after saveas. The choice to aggregate files after an initial dump is because generation can be interrupted and manually recovered in an easier way and avoiding any risk of data losses - database creation can take a very long time. If cleanup is true, all intermediate files are removed.\n\n\n\n\n\n","category":"method"},{"location":"Modules/RadCalNet/#RadCalNet.datasampler!-Tuple{Vector{Float64}}","page":"RadCalNet","title":"RadCalNet.datasampler!","text":"datasampler!(X::Vector{Float64})::Tuple\n\nCustom sample space to generate entries with createcustomdatabase. This function contains the parameter space used for model training.\n\n\n\n\n\n","category":"method"},{"location":"Modules/RadCalNet/#RadCalNet.defaultmodel-Tuple{}","page":"RadCalNet","title":"RadCalNet.defaultmodel","text":"defaultmodel()\n\nBuild model structure with which RadCalNet is trained.\n\n\n\n\n\n","category":"method"},{"location":"Modules/RadCalNet/#RadCalNet.dumpscaler-Tuple{StatsBase.ZScoreTransform{Float32, Vector{Float32}}, String}","page":"RadCalNet","title":"RadCalNet.dumpscaler","text":"dumpscaler(scaler::ZScoreTransform{Float32,V32}, saveas::String)\n\nWrite z-score scaler mean and scale to provided saveas YAML file.\n\n\n\n\n\n","category":"method"},{"location":"Modules/RadCalNet/#RadCalNet.getradcalnet-Tuple{}","page":"RadCalNet","title":"RadCalNet.getradcalnet","text":"getradcalnet(;\n scale = true,\n fscaler = nothing,\n fmstate = nothing\n)\n\nLoad trained model and scaler to compose RadCalNet. If testing new models, it might be useful to use fscaler and fmstate to point to specific versions of scaler and model state files.\n\n\n\n\n\n","category":"method"},{"location":"Modules/RadCalNet/#RadCalNet.loaddatabase-Tuple{String}","page":"RadCalNet","title":"RadCalNet.loaddatabase","text":"loaddatabase(fname::String)\n\nRetrieve database from HDF5 file and access table as a matrix.\n\n\n\n\n\n","category":"method"},{"location":"Modules/RadCalNet/#RadCalNet.loadscaler-Tuple{String}","page":"RadCalNet","title":"RadCalNet.loadscaler","text":"loadscaler(fname::String)::Function\n\nLoad z-scaler in functional format from YAML fname file.\n\n\n\n\n\n","category":"method"},{"location":"Modules/RadCalNet/#RadCalNet.makemodel-Tuple{Vector{Tuple{Int64, Any}}}","page":"RadCalNet","title":"RadCalNet.makemodel","text":"makemodel(layers::Vector{Tuple{Int64, Any}}; bn = false)::Chain\n\nCreate a multi-layer perceptron for learning radiative properties with the provided layers. If bn is true, then batch normalization after each layer. The final layer has by default a sigmoid function to ensure physical outputs in range [0, 1].\n\n\n\n\n\n","category":"method"},{"location":"Modules/RadCalNet/#RadCalNet.model","page":"RadCalNet","title":"RadCalNet.model","text":"model(x::Vector{Float32})::Vector{Float32}\n\nMain model interface for emissivity and transmissivity.\n\n\n\n\n\n","category":"function"},{"location":"Modules/RadCalNet/#RadCalNet.plottests-Tuple{RadCalNet.ModelTrainer}","page":"RadCalNet","title":"RadCalNet.plottests","text":"plottests(trainer::ModelTrainer; num::Int64)\n\nEvaluate model over num data points and compare the data to the expected values as computed from RadCal. Makes use of test data only - never seem by the model during training.\n\n\n\n\n\n","category":"method"},{"location":"Modules/RadCalNet/#RadCalNet.runradcalinput-Tuple{}","page":"RadCalNet","title":"RadCalNet.runradcalinput","text":"runradcalinput(;\n X::Dict{String, Float64} = Dict{String, Float64}(),\n T::Float64 = 300.0,\n L::Float64 = 1.0,\n P::Float64 = 1.0,\n FV::Float64 = 0.0,\n OMMIN::Float64 = 50.0,\n OMMAX::Float64 = 10000.0,\n TWALL::Float64 = 500.0,\n radcalexe::String = \"radcal_win_64.exe\"\n)::Vector{Float64}\n\nCreate RADCAL.IN from template file and dump to disk.\n\nNOTE: the user is responsible to provide a vector X of mole fractions of species that sums up to one. If this is not respected RADCAL fails. The Following list provides the indexes of available species in vector X.\n\nIndex Species Index Species Index Species\n1 CO2 6 C2H6 11 CH3OH\n2 H2O 7 C3H6 12 MMA\n3 CO 8 C3H8 13 O2\n4 CH4 9 C7H8 14 N2\n5 C2H4 10 C7H16 \n\n\n\n\n\n","category":"method"},{"location":"Modules/RadCalNet/#RadCalNet.samplecols-Tuple{Int64, Int64}","page":"RadCalNet","title":"RadCalNet.samplecols","text":"Get sample of indexes for data retrieval. \n\n\n\n\n\n","category":"method"},{"location":"Modules/RadCalNet/#RadCalNet.tests-Tuple{RadCalNet.ModelData, Int64}","page":"RadCalNet","title":"RadCalNet.tests","text":"Get testing data for data loader construction. \n\n\n\n\n\n","category":"method"},{"location":"Modules/RadCalNet/#RadCalNet.train-Tuple{RadCalNet.ModelData, Int64}","page":"RadCalNet","title":"RadCalNet.train","text":"Get training data for data loader construction. \n\n\n\n\n\n","category":"method"},{"location":"Modules/RadCalNet/#RadCalNet.trainonce!-Tuple{RadCalNet.ModelTrainer}","page":"RadCalNet","title":"RadCalNet.trainonce!","text":"trainonce!(trainer::ModelTrainer; num = 1_000)\n\nTrain model and keep track of loss for the number of epochs in trainer using its internal data and parameters. Use num data points.\n\n\n\n\n\n","category":"method"},{"location":"Science/04-Continuum-Mechanics/#Continuum-Mechanics","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"","category":"section"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"","category":"page"},{"location":"Science/04-Continuum-Mechanics/#Analysis-of-transport-phenomena","page":"Continuum Mechanics","title":"Analysis of transport phenomena","text":"","category":"section"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"Theses notes intend to provide in a very concise way overview of the mathematical fundamentals of transport phenomena. In this sense, they are devoted to generalities rather than specific closure models. You can even see them as a cheat-sheet or simple lecture notes. ","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"In that sense, they try to be straightforward and mostly self-contained in the fundamental topics, with increased reference to external sources in applied subjects. They were first redacted based on the MITx series Analysis of Transport Phenomena by Pr. Dr. Martin Bazant and further extended based on several sources cited along the way. ","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"The main goal is to provide a general approach of transport phenomena applied to Materials Science and Process Engineering, but readers of other fields might also be interested in parts of the contents.","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"Note: this is still a work in progress and quickly evolving. Please let me know if you found any typos or conceptual mistakes. I am still to ask some friends to review them.","category":"page"},{"location":"Science/04-Continuum-Mechanics/#Transport-phenomena-foundations","page":"Continuum Mechanics","title":"Transport phenomena foundations","text":"","category":"section"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"Most physical phenomena are actually discrete processes (particles); many phenomena such as heat transfer are actual discrete vibrations in materials. Such systems are described by large systems of coupled ordinary differential equations (ODE's) which quickly become intractable and require numerical solution. Continuum approximations, i.e. an averaging process over a representative volume element (RVE), are used to generate a single partial differential equation (PDE) from many such ODE's. This transformation leads to the concept of conservation equations.","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"Say we have a quantity b such as it represents a number concentration of a given physical quantity. Associated to this quantity we have a flux density vecF through the boundaries of the system and a rate production in volume B_v as summarized in the following table.","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"beginalign*\nb = dfractextvolume qquadtextconcentration \nvecF = dfractextareacdotptexttime qquadtextflux density \nB_v = dfractextvolumecdotptexttime qquadtextproduction rate\nendalign*","category":"page"},{"location":"Science/04-Continuum-Mechanics/#General-conservation-equation","page":"Continuum Mechanics","title":"General conservation equation","text":"","category":"section"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"Using the above definitions and the conventions presented in the next figure, the most general statement of conservation of this quantity b writes then:","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"fracddtleft(int_VbdVright) = -int_OmegavecncdotpvecFdA+int_VB_vdV","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"Using the previous notation for units it is important to notice that each term of the above equation is given in units of quantity per volume per time.","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"(Image: )","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"#divergence-theorem","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"This multivariate vector equation describe transport in three-dimensional space. To be able to process further this expression one needs to incorporate the divergence theorem ideas to be able to formulate it in terms of volume only.","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"Say we have the vector field vecF, represented above by a number of lines; this could be any flow of some conserved quantity in the system being analyzed, as we shall see later. A control volume (CV) with a volume of V and a surface area of A is illustrated with a boundary Omega denoted by the outward pointing unit normal hatn at each point on the surface. The divergence theorem states:","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"int_VnablacdotpvecFdV=int_OmegavecncdotpvecFdA","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"In this expression,   nablacdotpvecF at each interior point inside V – a scalar quantity – gives the rate at which the conserved quantity spreads out from that point, while hatncdotpvecF at each boundary point on A – also a scalar quantity – gives the rate at which the conserved quantity leaks out at that point. Thus we may summarize the divergence theorem by saying that there are two equally valid ways to compute the total rate at which the conserved quantity leaves the control volume: either by integrating nablacdotpvecF at each interior point over V, or by integrating hatncdotpvecF at each boundary point over A. Using this ideas the previous conservation law can be converted into:","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"fracddtleft(int_VbdVright) = -int_VnablacdotpvecFdV+int_VB_vdV","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"Assuming an Eulerian reference frame (fixed) to the volume V we can move the time derivative of the above expression inside the left-hand side integral. Rearranging we have","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"int_Vleft(fracpartialbpartialt + nablacdotpvecF - B_vright)dV = 0","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"For a differential volume dV the integrand must be identically zero, from which the PDE arise:","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"fracpartialbpartialt + nablacdotpvecF - B_v = 0","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"Physically speaking this expression simply puts that the rate of accumulation equals the inflow (notice that this assumes a balance according to normal vector convection established above) plus the rate of production inside the control volume. This expression serves as the basis to the governing equations of different transport phenomena when constitutive relationships are included for describing a certain physics.","category":"page"},{"location":"Science/04-Continuum-Mechanics/#Conservation-at-system-boundaries","page":"Continuum Mechanics","title":"Conservation at system boundaries","text":"","category":"section"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"So far we have a PDE describing the conservation inside the RVE of the system being described. To be able to solve such a system we also need to provide a description of its interactions with its surroundings through the specification of boundary conditions.","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"Assume a volume of thickness l enclosing a boundary S splitting domains V_1 and V_2, where discontinuities in properties and all quantities describing the system may be present. We can write the continuity equation for this thick boundary as","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"fracddtleft(int_VbdVright) = -int_OmegavecncdotpvecFdA+int_VB_vdV+int_OmegaB_sdA","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"where the last term has been added to describe the net surface production rate of b. Collapsing the volume over the boundary S by taking the limit where lto0, it should be evident that all volume integrals in the above vanish. The integral form of boundary condition then simplifies to","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"int_OmegavecncdotpvecFdA=int_OmegaB_sdA","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"Defining as positive the normal of S pointing outwards V_1 the integrant on right-hand side can be written as vecnleft(vecF_2-vecF_1right). Applying mean value theorem as if all terms where in the same side of the equation (that vanishes overall) leads to the differential form of boundary condition","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"vecnleft(vecF_2-vecF_1right)=B_s","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"This expression has a very straightforward interpretation. If there is no creation rate B_s at the interface, flux is continuous across interface; otherwise some arbitrary form of discontinuity should arise, whose form would depend on the volume governing equations at each side of S. Below we have an illustration of a non-zero value of B_s at the interface, with a net increase in the flow in region 2.","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"![[imagesTY010105.svg]]","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"[!todo] The following is something I need to abstract better, although I fully understand the mathematical origins. The argument that it is formulated in the interface reference frame but viewed from the observer frame bothers me.","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"In the case of moving interfaces, the previous formulation needs to account for the relative motion of the boundary and the associated fictitious fluxes that follow it. In the interface reference frame, a relative flux b_ivecv_s needs to be accounted for, resulting in the modified boundary condition","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"vecnleft(vecF_2-b_2vecv_sright)-vecnleft(vecF_1-b_1vecv_sright)=B_s","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"From this condition it arrises that the magnitude of the normal component of the interface velocity is constrained to the following expression. No matter what physics is governing the movement, this compatibility constraint must be verified.","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"v_s = fracvecnleft(vecF_2-vecF_1right)-B_sb_2-b_1","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"[!todo] In the growing and shrinking bubble example, Pr. Bazant comes up with a variant of this expression where the fluxes are given by rhov, but I cannot realize how can the velocity v_1neqv_2neqv_s in this case.","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"For instance, consider the case that vecF_2-vecF_1=0 and B_s0, then the interface is consuming b; because the quantity cannot be supplied through fluxes, then the interface S moves towards the side richer in b.","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"[!todo] Complete this paragraph with water solidification example.","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"","category":"page"},{"location":"Science/04-Continuum-Mechanics/#Mass-and-energy-transfer","page":"Continuum Mechanics","title":"Mass and energy transfer","text":"","category":"section"},{"location":"Science/04-Continuum-Mechanics/#Derivation-of-conservation-equations","page":"Continuum Mechanics","title":"Derivation of conservation equations","text":"","category":"section"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"In the nineteenth century, Fick demonstrated empirically that the flux density of a species submitted to gradient field responded linearly to its concentration c gradient. Notice here c takes the place of the more general b in the conservation form derivation. In the more general case we should use subindexes for species concentrations and diffusivities, but that will be neglected here.","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"vecFpropto-nablac","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"This is actually the simplest form of diffusion modeling and, in general, is valid only in very specific cases, i.e. when a single species is being transported in a system without the effect of other components. Introducing a proportionality coefficient D, the diffusivity, we have:","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"vecF=-Dnablac","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"Using this expression in our conservation equation leads to:","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"fracpartialcpartialt - nablacdotpleft(Dnablacright) - R_v = 0","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"Under the very specific case where there is no volumetric production rate R_v, i.e. no chemical reactions, and constant diffusivity D, i.e. no composition or space dependence, this simplifies to the well-studied form of the so called Fick's second law:","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"fracpartialcpartialt = Dnabla^2c","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"This expression happens to be isomorph with heat diffusion equation for a constant specific heat medium because Fourier's law is analogous to Fick's first law, leading to the same final mathematical form. Using the thermodynamic definition dh=rhoc_pdT we have","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"fracpartialTpartialt = frackrhoc_pnabla^2T","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"It must be noticed that in the general case, the quantity being transported in heat equation is the enthalpy density h and the potential field is linearized in terms of temperature T through Fourier's equation. Without the constant specific heat simplification and with variable thermal conductivity k it is stated as:","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"fracpartialhpartialt = nablacdotpleft(knablaTright)","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"Other than for very simple enthalpy-specific heat relationships (such as the constant approximation discussed above), this PDE must be solved numerically with a coupled system of nonlinear equations for computing the field of temperatures in terms of enthalpies. In the above we neglect the volumetric heat production rate, which would be present, e.g. in a reacting system or a material undergoing nuclear fission.","category":"page"},{"location":"Science/04-Continuum-Mechanics/#Formulation-of-boundary-conditions","page":"Continuum Mechanics","title":"Formulation of boundary conditions","text":"","category":"section"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"When dealing with mass and heat transfer in the absence of more exotic physics such as electromagnetic effects, a pair of possible descriptions for the boundary fluxes arise; the first must be provided as a closure model for the surface species production rates R_s for mass transfer, and heat generation rate q_s for heat transfer; the other possibility is to assume the medium outside of the modeled domain is a reservoir with constant b_infty, the the proper b depending on the phenomena being described. The latter is generally modeled through a constitutive law under the form vecF=hleft(b-b_inftyright), where h is introduced as a transfer coefficient.","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"-vecncdotpDnablac=\nbegincases\nR_s6pt\nh_m(c-c_infty)\nendcases\nqquadtextandqquad\n-vecncdotpknablaT=\nbegincases\nq_s6pt\nh_e(T-T_infty)\nendcases","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"The actual meaning of h, be for mass transfer h_m or energy h_e depends of the physics being approximated in the external reservoir. There are specific, generally (semi-)empirical methods for evaluating reasonable values for the analysis of their values; this will be the subject of a future topic because the current context is still focused in general principles.","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"As a side note, it is worth mentioning here that in analytical methods the b_infty is treated as constant because otherwise analysis could grow exponentially in complexity. For the numerical solution of models it can be often treated as an explicit time function. For instance, imagine a material treatment where pulses of a reacting species are controlled and their concentration in the reactor is known in time; if modeling the solid state uncoupled from the reactor - what is generally the case due to computational time limitations - then the value of b_infty can be provided explicitly, keeping in mind that h can also be a function of this value or surface concentration, depending on the closure model used for the specific simulation.","category":"page"},{"location":"Science/04-Continuum-Mechanics/#Microscopic-models-of-diffusion","page":"Continuum Mechanics","title":"Microscopic models of diffusion","text":"","category":"section"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"The models discussed so far are in fact the macroscopic response to discrete phenomena happening at the atomic and molecular scales. Particles moving randomly due to thermal energy in a fluid or solid follow a path described by a probability density function in steps that in most cases happen at a typical rate due to these thermal fluctuations.","category":"page"},{"location":"Science/04-Continuum-Mechanics/#Diluted-mixtures","page":"Continuum Mechanics","title":"Diluted mixtures","text":"","category":"section"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"In the most simple of cases, a non-interacting particle in a dilute mixture performs a random walk; when many such particles are present in one part of the domain, as we will show later, the resulting gradient of concentration that will be established over a sufficiently large amount of time leads to Fick's law. The terminology was created by Pearson (1905) for which Rayleigh (1905) had already found a solution many years beforehand; is also appears in the solution of Brownian motion by Einstein (1905) (translated here) and turbulent diffusion by Taylor (1922).","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"In the derivation of diffusion equation, following the already mentioned non-interacting particles hypothesis, one also needs steps to be independent, identically distributed (IDD) and limited by a finite variance sigma^2, i.e. p(xpmKsigma)to0 quickly for some finite K.","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"P_N+1(x) = intP_N(x-y)p(y)dy = (P_N ast p)(x)","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"The probability P_N+1(x) that a particle is found at x at step N+1 is equal to the sum of the probabilities p(y) of particles at a distance y from x execute a movement of such amplitude to reach x times the probability of a particle being at the position P_N(x-y).","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"P_N = (P_0 ast p ast p ast dots p)(x) = (P_0 ast p^astN)(x)","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"beginalign*\nP_N+1(x)\n= intleft(P_N(x) - yP_N^prime(x) + dfrac12y^2P_N^primeprime(x)right)p(y)dy\n\n=P_N(x)intp(y)dy - P_N^prime(x)intyp(y)dy + dfrac12P_N^primeprime(x)inty^2p(y)dy\n\n=P_N(x) - langleyrangleP_N^prime(x) + dfrac12langley^2rangleP_N^primeprime(x)\nendalign*","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"The fourth and last requirement now is that process take place with a finite mean step langletaurangle:","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"dfracP_N+1(x) - P_N(x)langletaurangle + dfraclangleyranglelangletaurangleP_N^prime(x) = dfraclangley^2rangle2langletaurangleP_N^primeprime(x)","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"Introducing c(x-vtt)simP_N(x-vt) with t=Nlangletaurangle","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"[!todo] Finish the additional Taylor expansion from the above expression to get formally to the final result provided below.","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"dfracpartialcpartialt + vdfracpartialcpartialx = Ddfracpartial^2cpartialx^2\n\nquadtextwherequadv=dfraclangleyranglelangletaurangle\n\nquadtextandquadD=dfraclangley^2rangle-langleyrangle^22langletaurangle","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"[!info] More about this in chapter 4 of Mehrer2007 [29].","category":"page"},{"location":"Science/04-Continuum-Mechanics/#Concentrated-mixtures","page":"Continuum Mechanics","title":"Concentrated mixtures","text":"","category":"section"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"On the other limit one finds the concentrated mixtures for which particle-particle interactions intervene on the probability distribution of motion and results obtained through non-equilibrium thermodynamics lead to a more complex law. Particle interactions may be simple collisions or involve more complex physics, such as electrodynamic forces; a direct solution through statistical approaches in this case quickly becomes intractable mathematically.","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"In what follows we will derive the diffusion equation from the aforementioned thermodynamic principles. The chemical potential is defined as the sensitivity of Gibbs free energy G with respect to the number of moles N of a substance. Expressed in terms of activity a we have:","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"mu = dfracpartialGpartialN=mu^theta+k_BTln(a)","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"The activity of non-ideal solutions is itself a function of a relative concentration tildec through a proportionality coefficient gamma, the so-called activity coefficient, which by its turn can also be a function of composition. The reference concentration c_sat to the definition of tildec is the concentration at which a phase change happens; that said, the activity may be seen as a measure of the tendency towards phase change. This is all expressed as","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"a=gammatildecqquadtextwhereqquadtildec=dfraccc_sat","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"Now let's Einstein relationship between mobility M and the diffusivity D. Mobility is defined as the capacity a given force is able to produce a net drift velocity in the system; it is related to D as","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"M = dfractextdrift velocitytextforce =dfracDk_BT","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"From linear irreversible thermodynamics (LIT) we can express the flux as","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"vecF=-Mcnablamu=vecv_driftcqquadtextwhereqquadvecv_drift = -Mnablamu","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"[!info] The development of (LIT) is found in Onsager1931 [30] and the following Onsager1931a [31]. Notice that the above paragraph needs more grounding, it has been thrown in the text as a truth without first-principles demonstration and that is against our goals here!","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"Because log(tildec)=log(c)-log(c_sat) and c_sat is a constant, then developing nablamu leads to","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"nablamu = k_BTleft(dfrac1c+dfrac1gammadfracpartialgammapartialcright)nablac","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"Applying this result to the previous expression and reworking the terms leads to","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"vecF=-Dleft(1 + dfraccgammadfracpartialgammapartialcright)nablac=-Dleft(1 + dfracpartiallngammapartiallncright)nablac","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"Here we can identify the chemical diffusivity by comparison with Fick's law as","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"D_chem = -Dleft(1 + dfracpartiallngammapartiallncright)","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"In the above expression, the second term in the sum is called the thermodynamic factor. In the limit of dilute system for which gamma=1 we fall back to D_chem=D, showing that the concentrated mixture approach is a proper generalization of the previous model for diluted systems.","category":"page"},{"location":"Science/04-Continuum-Mechanics/#Application-to-diffusion-in-a-lattice","page":"Continuum Mechanics","title":"Application to diffusion in a lattice","text":"","category":"section"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"","category":"page"},{"location":"Science/04-Continuum-Mechanics/#Fluid-mechanics","page":"Continuum Mechanics","title":"Fluid mechanics","text":"","category":"section"},{"location":"Science/04-Continuum-Mechanics/#Derivation-of-continuity-equation","page":"Continuum Mechanics","title":"Derivation of continuity equation","text":"","category":"section"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"Moving towards a fluid mechanics application, one often needs to express the continuity equation for the overall mass of the system and the flowing species.","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"In this case, term b of previous formulation is replaced by the mass density rho_m of the fluid. Flux is expressed as vecF_m=vecv_mrho_m, where vecv_m is the mass averaged velocity. It is useful to introduce this quantity vecv_m because in many multi-species formulations it might become difficult to find a single velocity representing the fluid motion.","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"In the absence of creation rates B_v the continuity equation writes","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"fracpartialrho_mpartialt+nablacdotpleft(rho_mvecv_mright)=0","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"For incompressible flows (constant rho_m) the time derivative is by definition null and the divergent term can be expanded in terms of its components gradients as","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"nablacdotpleft(rho_mvecv_mright)=rho_mnablavecv_m+vecv_mnablarho_m=0","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"#incompressible-flow","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"Since rho_m is constant, this simplifies to the so-called incompressible fluid continuity equation","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"nablavecv_m=0","category":"page"},{"location":"Science/04-Continuum-Mechanics/#Application-to-advection-diffusion-reaction","page":"Continuum Mechanics","title":"Application to advection-diffusion-reaction","text":"","category":"section"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"Now assume a flow where chemical species c_i are advected by the velocity vecv_i and diffuse following the negative of their gradient. The flux in this case is given as F_i = c_ivecv_i-D_inablac_i. Applying this to the equation of conservation of c_i leads to","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"fracpartialc_ipartialt+nablacdotpleft(c_ivecv_i-D_inablac_iright)=R_v","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"Splitting the terms under the divergence operator in right-hand side and reorganizing:","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"fracpartialc_ipartialt+nablacdotpleft(c_ivecv_iright)=nablacdotpleft(D_inablac_iright)+R_v","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"It is often beneficial to further expand the divergence of convection term so that the equation can be reshaped as follows:","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"fracDc_iDt=\nfracpartialc_ipartialt+\nvecv_inablac_i=\nnablacdotpleft(D_inablac_iright)-\nc_inablacdotpvecv_i\n+R_v","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"In this expression the big-D notation represents a material or convective derivative. It provides us the behavior of transported quantity in the fluid reference frame, what can be useful for some local analysis. Even more useful than that, under this form we can promptly simplify the remaining terms in the left-hand side for cases of constant diffusivity, incompressible flow, and absence of chemical reactions (in the order of appearance of terms). For numerical solution of transport equations for incompressible flows, using the null divergent of velocity can save us a lot of trouble.","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"","category":"page"},{"location":"Science/04-Continuum-Mechanics/#Notes-by-video-lecture","page":"Continuum Mechanics","title":"Notes by video lecture","text":"","category":"section"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"The playlist with all lectures is found here.","category":"page"},{"location":"Science/04-Continuum-Mechanics/#019","page":"Continuum Mechanics","title":"019","text":"","category":"section"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"The scale estimates of penetration depth, boundary flux, and total concentration match the analytical values for steady-state first order linear reaction-diffusion equation submitted to a Dirichlet condition on one side of a semi-infinite medium:","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"Ddfracpartial^2Cpartialx^2-kC=0impliesbegincases\ndelta sim sqrtdfracDk12pt\n\nF sim C_0sqrtDk12pt\n\nC_infty sim C_0sqrtdfracDk\nendcases","category":"page"},{"location":"Science/04-Continuum-Mechanics/#020","page":"Continuum Mechanics","title":"020","text":"","category":"section"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"#dimless-damkohler","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"Damköhler number arises from reaction diffusion-equation discussed in lecture 019; we can make the equation dimensionless by making tildex=xL^-1, Theta=CC_0, and dividing everything by k, then we can define:","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"dfracpartial^2Thetapartialtildex^2-mathrmDaTheta=0\n\nquadtextwherequad\n\nmathrmDa=frackDL^2=left(fracLdeltaright)^2","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"Limiting cases are:","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"mathrmDall1\n: fast diffusion limit, length scale delta is much larger than L, so diffusion crosses the domain; interaction of diffusion fronts is possible. On may be interested in e.g computing the deviation from surface concentration C_0 at the body core, DeltaCC_0simsqrtmathrmDa.\nmathrmDagg1\n: fast reaction-limited transport; a thin layer of reaction products limits the affected depth and diffusion layer is thin beyond that. The relative amount of material that diffuses with respect to the other limiting case is C(C_0L^d-1)sim1sqrtmathrmDa.","category":"page"},{"location":"Science/04-Continuum-Mechanics/#021","page":"Continuum Mechanics","title":"021","text":"","category":"section"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"In fact it is in this lecture that the stripping of dimensions of the equation as presented above in 020 is formalized; do not even try to solve a problem before making it dimensionless. The general procedure for making differential operators dimensionless is summarized as follows:","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"tildex_i = dfracx_iL_i implies\n\nbegincases\ndfracddtildex_i=L_idfracddx_i12pt\ndfracd^ndtildex_i^n=L_i^ndfracd^ndx_i^n12pt\nendcases","category":"page"},{"location":"Science/04-Continuum-Mechanics/#022","page":"Continuum Mechanics","title":"022","text":"","category":"section"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"#bessel-function","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"Always start any modeling with the simplest geometry that captures the basic features of the system being modeled; e.g. when expanding a solution of reaction-diffusion into exponential terms, it is worth noticing that they can be replaced by hyperbolic functions, and since sinh breaks the symmetry, that term may be eliminated already during constant identification from boundary conditions.","category":"page"},{"location":"Science/04-Continuum-Mechanics/#023","page":"Continuum Mechanics","title":"023","text":"","category":"section"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"#dimless-peclet #plug-flow ","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"Similarly to lecture 019, here we develop convection-diffusion equation instead; in this case the flux of a transported concentration C is given by the following expression: ","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"vecF=vecuC-DnablaC","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"Applying the general conservation law to steady state and incompressible (nablavecu=0) gives:","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"vecucdotpnablaC-Dnabla^2C=0","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"Using the same approach to make the equation dimensionless as in lecture 019 we have:","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"beginalign*\ndfracDL^2tildenabla^2Theta-dfracuLtildenablaTheta=012pt\ndfrac1tau_dtildenabla^2Theta-dfrac1tau_ctildenablaTheta=0\nendalign*","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"where tau_c is the characteristic convection time and tau_d the characteristic diffusion time; to reach the final dimensionless equation we can multiply the whole equation by tau_d, what introduces the ratio of diffusion to advection times, commonly called the Péclet number. The results may be summarized as","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"tildenabla^2Theta-mathrmPetildenablaTheta=0\nimplies\nbegincases\ndelta sim dfracDu12pt\nmathrmPe = dfracuLD\nendcases","category":"page"},{"location":"Science/04-Continuum-Mechanics/","page":"Continuum Mechanics","title":"Continuum Mechanics","text":"In the limiting case of mathrmPegg1 diffusion is much slower than convection and the flow can be approximated as purely advective; this characterizes the plug-flow regime.","category":"page"},{"location":"Science/04-Continuum-Mechanics/#024","page":"Continuum Mechanics","title":"024","text":"","category":"section"},{"location":"Science/04-Continuum-Mechanics/#025","page":"Continuum Mechanics","title":"025","text":"","category":"section"},{"location":"References/@Reitz1987/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Reitz1987/","page":"-","title":"-","text":"title: Structure of high-pressure fuel sprays authors: Rolf D. Reitz, R. Diwakar year: 1987 URL: https://doi.org/10.4271/870598 –-","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/#Julia-para-Cientistas","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"","category":"section"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Julia from zero to hero com uma abordagem para computação científica.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Antes de entrar realmente nos tópicos de estudo listados abaixo, vamos falar um pouco sobre alguns elementos básicos para se seguir a série em relação a linguagem de programação Julia. Os conteúdos aqui apresentados são uma extensão daqueles providos pela JuliaAcademy em seu curso introdutório. O objetivo desta extensão é apresentar alguns elementos suplementares para a prática de computação científica. A temática de gráficos em Julia, será abordada em um tutorial distinto do curso no qual nos baseamos dada a necessidade de ir um pouco além na qualidade gráfica para publicações em journals.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Julia é uma linguagem sintaticamente similar à Python mas o estilo de programação tipicamente adotado tende a ser procedural com uso de estruturas e métodos para processar dados contidos nestas. Esta nova linguagem publicada pela primeira vez em 2012 vem ganhando grante momentum e uma comunidade bastante interessante na sua diversidade científica. Após alguns anos hesitando em me engajar no seu uso para aplicações em pesquisa em desenvolvimento, em 2023 fui convencido que é chegada hora de transferir parte dos estudos em Julia e então adaptar todos os conteúdos que produzo nesta linguagem.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Recomenda-se o estudo do presente tutorial de forma interativa em uma longa sessão de aproximadamente 4 horas de estudo. Após este primeiro contato, os tutorials mais complexos que se seguem se tornarão acessíveis mesmo para aqueles que estão tendo seu primeiro contato com computação. Este tutorial pode ao longo do estudo ser consultado para clarificar elementos da linguagem. Uma vez que se encontre confortável com o conteúdo aqui apresentado, recomenda-se estudar o manual da linguagem, o qual apresenta detalhes omitidos nesta introdução almejada para um primeiro contato.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Julia possui um largo ecossistema de pacotes implementado uma vasta gama de funcionalidades. Para conhecer mais não deixe de visitar Julia Packages.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Antes de começar, recomendo a leitura deste artigo.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/#Seguindo-os-materiais","page":"Julia para Cientistas","title":"Seguindo os materiais","text":"","category":"section"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Os conteúdos são majoritariamente sequenciais: exceto para os tópicos mais avançados (para aqueles que já programam em Julia), é necessário seguir os notebooks na ordem provida.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Um canal YouTube do curso está em fase de concepção para abordar os detalhes entre-linhas, involvendo aspectos que não necessariamente estão escritos.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Etapas à seguir para começar os estudos:","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Ler sobre ciência colaborativa abaixo para se familiarizar com alguns elementos que vamos abordar no que se segue.\nInstalar Julia na versão estável para seu sistema operacional.\nInstalar Pluto para visualizar e editar os notebooks do curso.\nClonar este repositório com todos os materiais usando a seguinte ordem de prioridade:\nUsando Git à través da linha de comando, forma recomendada com git clone https://github.com/wallytutor/medium-articles.git\nCom a interface gráfica de GitHub Desktop\nUsando o botão de Download","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Caso a última opção de download tenha sido a sua escolha, observe que o arquivo .zip não contem os elementos de repositório git para controle de versão, implicando que as suas modificações e notas tomadas deverão ser geridas localmente, o que não é recomendável. Para estudantes ainda não familiarizados com git, a opção de utilizar GitHub Desktop é a mais apropriada.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/#Para-aonde-ir-depois?","page":"Julia para Cientistas","title":"Para aonde ir depois?","text":"","category":"section"},{"location":"Notebooks/A1-Julia-para-Cientistas/#Para-aprender-mais","page":"Julia para Cientistas","title":"Para aprender mais","text":"","category":"section"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Julia Academy: nesta página encontram-se cursos abertos em várias temáticas comumente abordadas com a linguagem Julia. Você encontrará cursos parcialmente equivalentes aos materiais tratados aqui, mas também vários conteúdos que não são abordados nesta introdução, especialmente em tópicos ligados a Ciência de Dados.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Introduction to Computational Thinking: esse é provavelmente o melhor curso generalista para aplicações científicas da linguagem. O curso é ministrado inclusive pelo Pr. Dr. Alan Edelman um dos criadores de Julia. Os tópicos abordados vão de tratamento de imagens, séries temporais, a resolução de equações diferenciais parciais.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"SciML Book: este livro é o resultado dos materiais de suporte do curso Parallel Computing and Scientific Machine Learning (SciML): Methods and Applications no MIT. Os tópicos são suportados por vídeo aulas e entram em mais profundidade nos assuntos avançados que tratamos aqui.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Exercism Julia Track: a plataforma Exercism propõe no percurso de Julia vários exercícios de algoritmos de nível fácil à intermediário-avançado. Minha recomendação é que essa prática venha a complementar os materiais propostos acima como forma de sedimentar o aprendizado da linguagem.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Julia Data Science: este livro complementa tópicos mais operacionais de análise de dados, especialemente técnicas básicas de Ciência de Dados, que omitimos neste curso. Um bom material complementar aos estudos.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/#Comunidade-Julia","page":"Julia para Cientistas","title":"Comunidade Julia","text":"","category":"section"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Julia Community Zulipchat: precisando de ajuda ou buscando um projeto para contribuir? Este chat aberto da comunidade Julia é o ponto de encontro para discutir acerca dos diferenter projetos e avanços na linguagem.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Julia Packages: o repositório mestre do índice de pacotes escritos na linguagem Julia ou provendo interfaces à outras ferramentas. A página contém um sistema de busca e um índice por temas.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"JuliaHub: esta plataforma comercial provê tudo que é necessário para se passar da prototipagem à escala industrial de soluções concebidas em Julia. Atualmente é a norma em termos de escalabilidade para a linguagem.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/#Organizações-recomendadas","page":"Julia para Cientistas","title":"Organizações recomendadas","text":"","category":"section"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"SciML: pacotes para Machine Learning científico.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"JuMP: uma linguagem de optimização matemática em Julia.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"JuliaData: pacotes para Data Science em geral.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"JuliaMolSim: simulação de dinâmica molecular em Julia.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/#Parte-1-Primeiros-passos","page":"Julia para Cientistas","title":"Parte 1 - Primeiros passos","text":"","category":"section"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Tradicionalmente, o primeiro contato com uma linguagem de programação se faz através da implementação se seu programa Hello, World! que nada mas faz que imprimir esta sentença em um terminal. Em Julia usamos a função println() contendo o texto a ser apresentado entre aspas duplas (veremos mais sobre texto na próxima seção) para implementar este programa, como se segue:","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"println(\"Olá, Mundo!\")","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/#Tipos-básicos","page":"Julia para Cientistas","title":"Tipos básicos","text":"","category":"section"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"O interesse principal de programação é o fato de podermos atribuir valores à nomes e em seguida realizar a manipulação necessária. Uma vez implementado o algoritmo, podemos simplesmente modificar os valores e reutilizá-lo.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Esse processo chama-se atribuição de variáveis e é realizado utilizando o símbolo de igualdade = com o nome da variável à esquerda e seu valor a direita.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"warn: Cuidado\nVeremos mais tarde que a comparação de igualdade se faz com um duplo sinal == e que devemos tomar cuidado com isso quando estamos tendo um primeiro contato com programação. A igualdade simples = é, na maioria das linguagens modernas, um símbolo de atribuição de valor.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Vamos criar uma variávei favorite_number_1 e atribuir seu valor:","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"favorite_number_1 = 13","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Agora poderíamos realizar operações com favorite_number_1. Faremos isso mais tarde com outras variáveis porque antes é importante de introduzirmos o conceito de tipos. Toda variável é de um dado tipo de dado, o que implica o tamanho (fixo ou variável) de sua representação na memória do computador. Com a função typeof() inspecionamos o tipo de uma variável.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Vemos que o tipo de 13 – um número inteiro – é representado em Julia por Int64.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"typeof(favorite_number_1)","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Existem diversos tipos numéricos suportados por Julia, mas aqui vamos ver somente os tipos básicos utilizados mais comumente em computação numérica. Atribuindo um valor aproximado de π a favorite_number_2 obtemos um objeto de tipo Float64, utilizado para representar números reais em dupla precisão.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"note: Aritmética de ponto flutuante de dupla precisão\nA maioria dos números reais não podem ser representados com precisão arbitrária em um computador. Um número real em dupla precisão é representado com 64 bits na memória. Representações de precisão arbitrária são hoje em dia disponíveis mas tem um custo de operação proibitivo para a maioria das aplicações. A matemática necessária para a compreensão da representação na memória é discutida no livro texto.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"favorite_number_2 = 3.141592\ntypeof(favorite_number_2)","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Uma particularidade de Julia dado o seu caráter científico é o suporte à números irracionais. Podemos assim representar π de maneira otimizada como discutiremos num momento oportuno.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"note: Caracteres especiais\nJulia suporta progração usando quaisquer caractéres UNICODE. Isso inclui letras gregas, subscritos, símbolos matemáticos... Em notebooks Pluto ou em editores conectados à um Julia Language Server podemos entrar esses símbolos digitando seu equivalente em LaTeX e pressionando a tecla . Uma lista detalhada de caracteres suportados é apresentada aqui.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"favorite_number_3 = π\ntypeof(favorite_number_3)","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Por exemplo, também temos o número de Euler representado como irracional. Como este número é representado pela letra e, para evitar conflitos com outras variáveis ele precisa ser acessado pelo caminho completo do módulo definindo as constantes matemáticas.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"favorite_number_4 = MathConstants.e\ntypeof(favorite_number_4)","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Outro exemplo de constante irracional é a proporção áurea.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Base.MathConstants.golden","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"A lista completa pode ser acessada com names(module) como se segue:","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"names(MathConstants)","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"O nome de variáveis também pode ser um emoji – evite isso em programas, evidentemente.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"🥰 = \"Julia\"\ntypeof(🥰)","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Usando essa possibilidade podemos brincar com o conceito como abaixo:","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"🐶 = 1\n😀 = 0\n😞 = -1\n# Vamos ver se a expressão a seguir é avaliada como verdadeira.\n# Todo texto após um `#` é considerado um comentário por Julia.\n# Abaixo vemos um novo operador de comparação de igualdade `==`.\n🐶 + 😞 == 😀","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/#Comentários","page":"Julia para Cientistas","title":"Comentários","text":"","category":"section"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Vimos no bloco acima o primeiro bloco de comentários identificado por linhas iniciando com #. Como comentários não são expressões, vemos abaixo que múltiplas linhas são aceitas em uma única célula contando que haja apenas uma expressão no contexto. Comentários são desejáveis para que entendamos mais tarde qual era o objetivo de uma dada operação. Confie em mim, anos mais tarde um código que parecia evidente no momento da sua escritura, quando você tem o conceito a ser expresso fresco na cabeça, pode parecer um texto em basco.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"# Em Julia, toda linha começando por um `#` é considerada um\n# comentário. Comentários após declarações também são possíveis:\n\ncomment = 1; # Um comentário após uma declaração.\n\n#=\nComentários de multiplas linhas também podem ser escritos usando\no par `#=` seguido de texto e então `=#` no lugar de iniciar\ndiversas linhas com `#`, o que torna sua edição mais fácil.\n=#\n\nnothing; #hide","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/#Aritmética-básica","page":"Julia para Cientistas","title":"Aritmética básica","text":"","category":"section"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Podemos usar Julia em modo interativo como uma calculadora.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Vemos abaixo a adição + e subtração -,...","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"1 + 3, 1 - 3","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"... multiplicação * e divisão /, ...","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"2 * 5, 2 / 3","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"... e uma comparação entre a divisão racional e normal.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"2 // 3 * 3, 2 / 3 * 3","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Julia possui suporte incluso a números racionais, o que pode ser útil para evitar propagação de erros em vários contextos aonde frações de números inteiros podem eventualmente ser simplificadas. Verificamos o tipo da variável com typeof().","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"typeof(2 // 3)","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"O quociente de uma divisão inteira pode ser calculado com a função div(). Para aproximar essa expressão da notação matemática é também possível utilizar 2 ÷ 3.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"div(2, 3)","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"O resto de uma divisão pode ser encontrado com mod(). Novamente essa função possui uma sintaxe alternativa – como em diversas outras linguagem nesse caso – utilizando o símbolo de percentual como em 11 % 3.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"mod(11, 3)","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Para concluir as operações básicas, incluímos ainda a expoenciação ^.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"2^5","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Outra particularidade de Julia é o suporte à multiplicação implícita – use essa funcionalidade com cuidado, erros estranhos podem ocorrer em programas complexos.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"a_number = 234.0;\n2a_number","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"O valor de π também pode ser representado por pi. Observe que a multiplicação de um inteiro 2 por pi (de tipo Irrational{:π}) produz como resultado um número Float64.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"typeof(2pi)","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/#Conversão-explícita","page":"Julia para Cientistas","title":"Conversão explícita","text":"","category":"section"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Se um número real pode ser representado por um tipo inteiro, podemos utilizar a função convert() para a transformação desejada. Caso a representação integral não seja possível, talvez você possa obter o resultado almejado usando uma das funções round(), floor(), ou ceil(), as quais você pode verificar na documentação da linguagem.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"a_number = 234.0;\nconvert(Int64, a_number) == 234","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Funções em Julia também podem ser aplicadas a múltiplos argumentos de maneira sequencial em se adicionando um ponto entre o nome da função e o parêntesis de abertura dos argumentos. Por exemplo, para trabalhar com cores RGB é usual empregar-se o tipo UInt8 que é limitado à 255, reduzindo a sua representação em memória.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"A conversão abaixo se aplica a sequência de números color individualmente.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"color = (255.0, 20.0, 21.0)\nconvert.(UInt8, color)","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Finalmente, formas textuais podem ser interpretadas como números usando parse().","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"parse(Int64, \"1\")","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/#Parte-2-Manipulação-textual","page":"Julia para Cientistas","title":"Parte 2 - Manipulação textual","text":"","category":"section"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Uma habilidade frequentemente negligenciada pelo grande público de computação científica nos seus primeiros passos é a capacidade de manipulação textual. Não podemos esquecer que programas necessitam interfaces pelas quais alimentamos as condições do problema a ser solucionado e resultados são esperados ao fim da computação. Para problemas que tomam um tempo computacional importante, é extremamente útil ter mensagens de estado de progresso. Nessa seção introduzimos os primeiros elementos necessários para a manipulação textual em Julia.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Uma variável do tipo String declara-se com aspas duplas, como vimos inicialmente no programa Hello, World!. Deve-se tomar cuidado em Julia pois caracteres individuais (tipo Char) tem um significado distinto de uma coleção de caracteres String.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Por exemplo, avaliando o tipo de 'a' obtemos:","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"typeof('a')","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/#Declaração-de-Strings","page":"Julia para Cientistas","title":"Declaração de Strings","text":"","category":"section"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Estudaremos caracteres mais tarde. Por enquanto nos interessamos por expressões como:","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"text1 = \"Olá, eu sou uma String\"\n\ntypeof(text1)","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Eventualmente necessitamos utilizar aspas duplas no interior do texto. Neste caso, a primeira solução provida por Julia é utilizar três aspas duplas para a abertura e fechamento do texto. Observamos abaixo que o texto é transformado para adicionar uma barra invertida antes das aspas que estão no corpo do texto.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"text2 = \"\"\"Eu sou uma String que pode incluir \"aspas duplas\".\"\"\"","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Neste caso, Julia aplicou automaticamente um caractere de escape no símbolo a ser interpretado de maneira especial. Existem diversos casos aonde a aplicação manual pode ser útil, por exemplo quando entrando texto em UNICODE por códigos. No exemplo abaixo utilizamos a técnica manual com o texto precedente.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"text3 = \"Eu sou uma String que pode incluir \\\"aspas duplas\\\".\"","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Para averiguar o funcionamento correto, testamos de imprimir text3 no terminal.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"println(text3)","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"O exemplo a seguir ilustra o uso do caracter de escape para representar UNICODE.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"pounds = \"\\U000A3\"","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/#Interpolação-de-Strings","page":"Julia para Cientistas","title":"Interpolação de Strings","text":"","category":"section"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Para gerar mensagens automáticas frequentemente dispomos de um texto que deve ter partes substituidas. Ilustramos abaixo o uso de um símbolo de dólar $ seguido de parêntesis com a variável de substituição para realizar o que chamamos de interpolação textual.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"note: Múltiplas variáveis em uma linha\nObserve aqui a introdução da declaração de múltiplas variáveis em uma linha.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"name, age = \"Walter\", 34\nprintln(\"Olá, $(name), você tem $(age) anos!\")","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"warn: Prática não recomendada\nPara nomes simples de variáveis e sem formatação explícita, o código a seguir também é valido, mas é pode ser considerado uma má prática de programação.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"println(\"Olá, $name, você tem $age anos!\")","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Em alguns casos, como na contagem de operações em um laço, podemos também realizar operações e avaliação de funções diretamente na String sendo interpolada.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"println(\"Também é possível realizar operações, e.g 2³ = $(2^3).\")","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/#Formatação-de-números","page":"Julia para Cientistas","title":"Formatação de números","text":"","category":"section"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"using Printf\n\nprintln(@sprintf(\"%g\", 12.0))\n\nprintln(@sprintf(\"%.6f\", 12.0))\n\nprintln(@sprintf(\"%.6e\", 12.0))\n\nprintln(@sprintf(\"%15.8e %15.8E\", 12.0, 13))\n\nprintln(@sprintf(\"%6d\", 12.0))\n\nprintln(@sprintf(\"%06d\", 12))","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/#Concatenação-de-Strings","page":"Julia para Cientistas","title":"Concatenação de Strings","text":"","category":"section"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Na maioria das linguagens de programação a concatenação textual se faz com o símbolo de adição +. Data suas origens já voltadas para a computação numérica, Julia adota para esta finalidade o asterísco * utilizado para multiplicação, o que se deve à sua utilização em álgebra abstrata para indicar operações não-comutativas, como clarificado no manual.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"bark = \"Au!\"\n\nbark * bark * bark","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"O circunflexo ^ utilizado para a exponenciação também pode ser utilizado para uma repetição múltipla de uma data String.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"bark^10","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Finalmente o construtor string() permite de contactenar não somente Strings, mas simultanêamente Strings e objetos que suportam conversão textual.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"string(\"Unido um número \", 10, \" ou \", 12.0, \" a outro \", \"texto!\")","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/#Funções-básicas","page":"Julia para Cientistas","title":"Funções básicas","text":"","category":"section"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Diversos outros métodos são disponíveis para Strings. Dado o suporte UNICODE de Julia, devemos enfatizar com o uso de length() e sizeof() que o comprimento textual de uma String pode não corresponder ao seu tamanho em bytes, o que pode levar ao usuário desavisado a erros numa tentativa de acesso à caracteres por índices.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"length(\"∀\"), sizeof(\"∀\")","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Uma função que é bastante útil é startswith() que permite verificar se uma String inicia por um outro bloco de caracteres visado. Testes mais complexos podem ser feitos com expressões regulares, como veremos mais tarde.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"startswith(\"align\", \"al\")","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/#Parte-3-Estruturas-de-dados-I","page":"Julia para Cientistas","title":"Parte 3 - Estruturas de dados I","text":"","category":"section"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Nesta seção vamos estudar alguns tipos de estruturas de dados. Essas formas compostas são construídas sobre elementos que já vimos mas podem também ir além destes. Abordaremos apenas as características básicas de cada uma das estruturas apresentadas e os casos de aplicação se tornarão evidentes. Os diversos métodos comuns à essas coleções é descrito nesta página.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/#*Tuples*","page":"Julia para Cientistas","title":"Tuples","text":"","category":"section"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Uma tuple é constituída de uma sequência de elementos, que podem ser de tipos diferentes, declarada entre parêntesis. A característica de base de uma tuple é sua imutabilidade: uma vez declarada, seus elementos não podem ser alterados.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"note: Já vimos isso antes\nVoltando a seção aonde realizamos a conversão explícita de tipos acima, você pode verificar que na realidade já utilizamos uma tuple de números indicando as intensidades RGB de uma cor.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Declaremos uma sequência fixa de linguagens de programação dadas por seus nomes como Strings:","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"languages = (\"Julia\", \"Python\", \"Octave\")","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Inspecionando o tipo desta variável aprendemos mais uma característica importante inerente a definição de Tuple feita acima quanto ao seu caráter imutável: o tipo de uma Tuple inclui individualmente o tipo de cada um de seus elementos. Dito de outra maneira, uma sequência composta de um número definido de objetos de dados tipos caracteriza por ela mesmo um novo tipo de dados.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"typeof(languages)","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Os elementos de uma Tuple podem ser acessados por seus índices.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"warn: Indices em Julia\nÉ o momento de mencionar que em Julia a indexação inicia com 1.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"@show languages[1]","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Vamos tentar modificar o segundo elemento da Tuple.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"note: Sintaxe de controle de erros\nAinda é cedo para entrar nos detalhes, mas aproveite o bloco abaixo para ter um primeiro contato com a gestão de erros em Julia.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"try\n languages[2] = \"C++\"\ncatch err\n println(\"Erro: $(err)\")\nend","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Existem certas subtilidades que você precisa saber sobre a imutabilidade. Observe o exemplo abaixo, aonde declaramos duas variáveis que são utilizadas para construir uma Tuple e então modificamos uma das variáveis: a Tuple continua com os valores originais do momento da sua construção.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"let\n a = 1\n b = 2\n\n test_tuple = (a, b)\n\n a = 5\n test_tuple\nend","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"warn: Isso nem sempre é verdade!\nSe o elemento compondo a Tuple for de um tipo mutável, como é o caso de Array's, como veremos no que se segue, os elementos desta variável podem ser modificados e impactam a Tuple diretamente. Isso se dá porque neste caso a Tuple conserva a referência ao objeto em questão, e não uma cópia dos valores, como é o caso para tipos de base.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"let\n a = 1\n b = [1, 2]\n\n test_tuple = (a, b)\n\n b[1] = 999\n test_tuple\nend","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/#*Named-tuples*","page":"Julia para Cientistas","title":"Named tuples","text":"","category":"section"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Esta extensão à Tuples adiciona a possibilidade de acesso aos componentes por um nome no lugar de um simples índice – que continua funcional como veremos abaixo. Esse tipo de estrutura é bastante útil quando necessitamos criar abstrações de coisas bastante simples para as quais a criação de um novo tipo não se justifica. Discutiremos mais tarde quando vamos estudar a criação de novos tipos.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"named_languages = (julia = \"Julia\", python = \"Python\")","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Observe o fato de que agora os nomes utilizados no índex fazem parte do tipo.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"typeof(named_languages)","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Abaixo verificamos que além do acesso por nomes, NamedTuples também respeitam a ordem de declaração dos elementos: :julia é o primeiro índice. A sintaxe de acesso aos elementos neste caso é com a notação típica utilizando um ponto, comum a diversas linguages de programação.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"named_languages[1] == named_languages.julia","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/#Dicionários","page":"Julia para Cientistas","title":"Dicionários","text":"","category":"section"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Objetos do tipo Dict possuem a similaridade com NamedTuples em que seus elementos podem ser acessados por nome. No entanto a sintaxe é diferente e os valores desta estrutura são mutáveis.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"organs = Dict(\"brain\" => \"🧠\", \"heart\" => \"❤\")","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"O acesso a elementos se faz com colchetes contendo o índex como se segue:","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"organs[\"brain\"]","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"E como dissemos, os elementos são mutáveis: vamos atribuir um burrito ao cérebro.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"organs[\"brain\"] = \"🌯\"","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Não só os elementos, mas o dicionário como um todo, pode ser alterado. Para adicionar novos elementos simplesmente acessamos a palavra-chave e atribuímos um valor:","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"organs[\"eyes\"] = \"👀\"","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Internamente para evitar nova alocação de memória a cada tentativa de se adicionar um novo elemento, um dicionário realiza a alocação de slots que são renovados cada vez que sua capacidade é ultrapassada. Observe que a lista retornada abaixo é composta majoritariamente de 0x00, que é o endereço de memória nulo, enquanto 3 elementos indicam um valor não-nulo, correspondendo aos elementos já adicionados ao dicionário. Disto vemos que adicionalmente um dicionário não preserva necessariamente uma sequência ordenada. Esses detalhes ultrapassam o presente escopo mas vão abrindo as portas para assuntos mais complexos.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"organs.slots\norgans","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Para remover elementos utilizamos a função pop!. Por convenção em Julia, funções que terminam por um ponto de exclamação modificam os argumentos que são passados. No caso de pop! o dicionário é modificado e o valor de retorno é aquele do elemento removido.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"pop!(organs, \"brain\")","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"A tentativa de remover um elemento inexistente obviamente conduz à um erro:","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"try\n pop!(organs, \"leg\")\ncatch err\n println(\"Erro: $(err)\")\nend\norgans","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Para evitar essa possibilidade podemos usar a função haskey().","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"haskey(organs, \"liver\")","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Uma última coisa a notar é que praticamente qualquer tipo básico pode ser empregado como a chave de um dicionário em Julia. Veja o exemplo à seguir:","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"music = Dict(:violin => \"🎻\", 1 => 2)","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Como as chaves são de tipos diferentes (um Symbol e um Int64), assim como os valores (uma String e um Int64), a função typeof() nos retorna tipos Any.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"typeof(music)","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Ainda nos restam alguns detalhes e tipos de dados, mas o tutorial começa a ficar longo... e não queremos te perder por aqui!","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/#Parte-4-Estruturas-de-dados-II","page":"Julia para Cientistas","title":"Parte 4 - Estruturas de dados II","text":"","category":"section"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Neste notebook estudamos a sequência de estruturas de dados básicas iniciada no precedente. O foco aqui são tipos úteis em cálculo numérico e álgebra linear, embora suas aplicação vaiam muito além.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/#*Arrays*","page":"Julia para Cientistas","title":"Arrays","text":"","category":"section"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"A estrutura Array se diferencia de Tuple pelo fato de ser mutável e de Dict pela noção de ordem. Dadas essas características não é surpreendente que seja esse o tipo de base sobre o qual Julia constrói vetores e matrizes, embora um Array seja mais genérico que esses conceitos matemáticos. Podemos, por exemplo, construir um Array contendo sub-Array's de tamanho variável, o que não constituiria uma matriz. Ou então misturar tipos de dados nos elementos de um Array, como mostramos ser possível com Tuple.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Em termos de sintaxe, usamos nesse caso colchetes [] para limitar a sequência.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Considere por exemplo a seguinte lista de países...","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"countries = [\"France\", \"Brazil\", \"Germany\"]","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"...ou então de números,...","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"numbers = [1, 2, 3.1]","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"..., ou simplesmente informações pessoais.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"personal_info = [\"Walter\", 34, \"Lyon\"]","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"O acesso a elementos se faz através de índices, como em Tuple.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"personal_info[2]","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Como essa estrutura é mutável ela suporta – entre muitos outros – o método push!() para se adicionar um elemento após o último.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"push!(personal_info, \"Engineer\")","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"De maneira similar ao que vimos para Dict, uma implementação de pop!() é disponível para o tipo Array, realizando a operação inversa de push!().","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"pop!(personal_info)","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"O exemplo de uma não-matriz citado na introdução é apresentado a seguir.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"not_a_matrix = [[1, 2, 3], [4, 5], [6, 7, 8, 9]]","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Usando typeof() descobrimos que se trata de um Vector de Vector e que na verdade Julia usa Vector com um alias para um Array{T, 1}, aonde T denota o tipo de dado.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"typeof(not_a_matrix)","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"A função rand() pode ser usada para criar uma matriz de números aleatórios – e outras estruturas de ordem superior – como se segue. Observe o tipo Matrix{Float64} indicado.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"a_matrix = rand(3, 3)","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Repetindo a verificação de tipo como fizemos para of vetor de vetores anteriormente, descobrimos que uma Matrix em Julia não é interpretada da mesma maneira, mas como um Array com duas dimensões. Isso é a forma que a linguagem emprega para assegurar as dimensões constantes segundo cada direção da matriz.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"typeof(a_matrix)","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Vamos agora atribuir nossa a_matrix à uma outra variável e então modificar a matrix original.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"maybe_another_matrix = a_matrix\na_matrix[1, 1] = 999\na_matrix","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Tal como para a Tuple com objetos mutáveis, atribuir um novo nome à uma matriz não cria uma nova matriz, apenas referencia o seu endereço de memória: observamos abaixo que a tentativa de cópia maybe_another_matriz também é modificada em razão da operação sobre a_matrix.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"maybe_another_matrix","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Quando uma cópia da matriz é necessária devemos utilizar copy(). Nas próximas células criamos uma matriz e então uma cópia, a qual é modificada, e verificamos não haver impacto na matriz original, validando a cópia em um novo endereço de memória.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"another_matrix = rand(2, 2)\nagain_a_matrix = copy(another_matrix)\nagain_a_matrix[1, 2] = 0\nagain_a_matrix\nanother_matrix","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/#*Ranges*","page":"Julia para Cientistas","title":"Ranges","text":"","category":"section"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Julia implementa uma variedade de tipos de ranges, iteradores para enumerações ou números espaçados segundo uma regra definida. Os tipos existentes encontram-se documentados em collections. O leitor pode interessar-se também pela função mais genérica range da biblioteca padrão.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Vamos começar com a declaração de um UnitRange de números 1 à 10 que pode ser construido com a sintaxe simplificada abaixo.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"range_of_numbers = 1:10","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Confirmamos que trata-se de um UnitRange especializado para o tipo inteiro da arquitetura do computador, 64-bits, tal como o tipo dos elementos usados na construção.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"typeof(range_of_numbers)","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Essa sintaxe mostrada acima é simplesmente um syntatic sugar para a chamada do construtor padrão deste tipo, como averiguamos na próxima célula.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"UnitRange(1, 10)","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Uma particularidade da sequência criada é que ela não é expandida na memória, mas tão somente a regra de construção para iteração é definida. Verificamos na próxima célula que esta sequência não possui os elementos que esperaríamos.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"range_of_numbers","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Isso é fundamental para se permitir laços de tamanhos enormes, frequentes em computação científica; pode-se, por exemplo, criar uma sequência inteira entre 1 e o máximo valor possível para o tipo Int64:","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"1:typemax(Int64)","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Para se expandir a sequência devemos coletar seus valores com collect:","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"arr = collect(range_of_numbers)","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"O resultado dessa operação é um Vector especializado no tipo usado para a sequência.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"typeof(arr)","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"A inserção de um elemento adicional na sintaxe do tipo start:step:end permite a criação de sequências com um passo determinado. Abaixo usamos um passo de tipo Float64 que por razões de precedência numérica vai gerar uma sequência de tipo equivalente, como verificamos no que se segue.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"float_range = 0:0.6:10\ntypeof(float_range)","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Acima utilizamos um passo de 0.6 para ilustrar uma particularidade do tipo StepRangeLen que não inclui o último elemento da sequência caso esse não seja um múltiplo inteiro do passo utilizado, de maneira a assegurar que todos os elementos sejam igualmente espaçados.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"collect(float_range)","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Finalmente, Julia provê LinRange, que será bastante útil para aqueles interessados em métodos numéricos de tipo diferenças finitas ou volumes finitos. Criamos um LinRange fornecendo os limites do intervalo e o número de elementos igualmente espaçados a retornar.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"LinRange(1.0, 10.0, 10)","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/#Atribuição-de-tipos","page":"Julia para Cientistas","title":"Atribuição de tipos","text":"","category":"section"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Até o momento criamos objetos em Julia sem anotar os tipos de dados requeridos. O compilador de Julia realiza inferência de tipos de maneira bastante avançada para determinar como especializar funções para as entradas dadas. Prover explicitamente tipos, principalmente em interfaces de funções, como veremos no futuro, é altamente recomendável e evita dores de cabeça quanto a validação de um programa quando este ganha em complexidade. Ademais, para computação numérica e aprendizado de máquina, a especificação de tipos tem implicação direta sobre a precisão e performance dos cálculos. É comum, por exemplo, treinar-se redes neurais com dados truncados à Float32, tipo que apresenta performance optimizada nas GPU's específicas deste ramo, enquanto um cálculo DEM (Discrete Element Method) de colisão de partículas necessida dados Float64 (e uma carta gráfica de alto nível adaptada) para prover resultados realistas.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Em Julia especificamos tipos com a sintaxe a::TipoDeA. Isso é valido para variáveis quaisquer, elementos de estruturas de dados, interfaces de funções, etc. Por exemplo, declaremos a seguinte variável:","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"a::Float32 = 1\ntypeof(a)","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Anotamos o tipo Float32 para a variável a. No entanto o argumento à direita do sinal de atribuição é um inteiro 1. Se deixássemos a descoberta de tipos ao compilador, neste caso obteríamos:","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"a = 1\ntypeof(a)","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Esse resultado pode ser indesejável e incompatível com a interface de alguma função aonde desejamos empregar o valor de a.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Vejamos agora alguns exemplos do impacto no tempo de execução de se prover valores ao lado direito da igualdade adaptados aos tipos esperados na especificação de dados. Vamos usar os ranges que aprendemos logo acima e collect para criar um Vector{Int64}.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"note: Uso de macros\nA macro @benchmark vai executar o código algumas vezes e retornar estatísticas de execução. Não se preocupe com ela por agora, vamos voltar na temática de benchmarking muito em breve.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"# using BenchmarkTools, Statistics\n# @benchmark a::Vector{Int64} = collect(1:10)","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Vemos que o tempo de execução é da ordem de 30 ns. Abaixo repetimos essa avaliação para algumas ordens de grandeza de tamanho de arrays. Vemos que o tempo de execução para a criação dos objetos escala com o logaritmo na base 10 do número de elementos.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"#scalability = [\n# mean((@benchmark a::Vector{Int64} = collect(1:10^1)).times)\n# mean((@benchmark a::Vector{Int64} = collect(1:10^2)).times)\n# mean((@benchmark a::Vector{Int64} = collect(1:10^3)).times)\n# mean((@benchmark a::Vector{Int64} = collect(1:10^4)).times)\n#]\n#log10.(scalability)","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Tentemos agora criar um vetor de Float64 usando o mesmo método.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"#@benchmark a::Vector{Float64} = collect(1:10)","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"O tempo de execução mais que dobrou e a memória estimada foi multiplicada por dois! Isso ocorre porque ao lado direito da expressão fornecemos números inteiros e o compilador é obrigado a incluir uma etapa de conversão de tipos, o que adiciona operações e alocações de memória.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Se na criação do range utilizarmos o tipo esperado de dados voltamos a linha de base da alocação do vetor de inteiros, da ordem de 30 ns e 144 bytes.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"#@benchmark b::Vector{Float64} = collect(1.0:10.0)","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Repetimos o benchmark para comparar a criação de vetores de dupla-precisão inicializados por inteiros e números de dupla precisão. Incluímos no novo benchmark um vetor com um único elemento para entendermos um pouco mais do processo.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"# with_conversion = let\n# scalability = [\n# mean((@benchmark a::Vector{Float64} = collect(1:10^0)).times)\n# mean((@benchmark a::Vector{Float64} = collect(1:10^1)).times)\n# mean((@benchmark a::Vector{Float64} = collect(1:10^2)).times)\n# mean((@benchmark a::Vector{Float64} = collect(1:10^3)).times)\n# ]\n# scalability\n# end","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"# without_conversion = let\n# scalability = [\n# mean((@benchmark a::Vector{Float64} = collect(1.0:10.0^0)).times)\n# mean((@benchmark a::Vector{Float64} = collect(1.0:10.0^1)).times)\n# mean((@benchmark a::Vector{Float64} = collect(1.0:10.0^2)).times)\n# mean((@benchmark a::Vector{Float64} = collect(1.0:10.0^3)).times)\n# ]\n# scalability\n# end","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"O vetor with_conversion contém os tempos de execução para a criação de vetores de 1, 10, 100, 1000 e 10000 elementos com conversão de valores de inteiros para dupla-precisão. Observe que os dois primeiros elementos levaram um tempo (aqui em nano-segundos) quase idênticos: existe uma constante de tempo da criação do vetor propriamente dito, a criação dos 10 primeiros elementos é quase negligível nesse caso.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Abaixo calculamos a diferença de tempo entre os dois processos e nos deparamos com mais uma surpresa: para 100 elementos, o tempo de alocação COM conversão é MENOR que o tempo SEM conversão. Ainda é muito cedo e fora de contexto para entrarmos no código LLVM gerado por Julia para entendermos a razão dessa anomalia. O importante a reter aqui é que para vetores de tamanhos importantes (> 1000 elementos) um tempo adicional de execução é adicionado por elemento e isso deve ser levado em conta quando escrevendo código científico.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"# time_diff = (without_conversion - with_conversion)\n# time_diff_per_element = time_diff ./ [10^k for k = 0:3]","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Espero que a decisão de incluir essas divagações um pouco cedo no aprendizado não sejam deletérias para a motivação do estudante, mas que criem curiosidade quanto aos tópicos mais avançados que veremos mais tarde.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Ainda falta muito para se concluir a introdução à atribuição de tipos, mas esse primeiro contato era necessário para que as próximos tópicos avancem de maneira mais fluida.","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/#Parte-5-Laços-e-condicionais","page":"Julia para Cientistas","title":"Parte 5 - Laços e condicionais","text":"","category":"section"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/#Parte-6-Funções-e-despacho","page":"Julia para Cientistas","title":"Parte 6 - Funções e despacho","text":"","category":"section"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/#Parte-7-Pacotes-e-ecossistema","page":"Julia para Cientistas","title":"Parte 7 - Pacotes e ecossistema","text":"","category":"section"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/#Parte-8-Avaliando-performance","page":"Julia para Cientistas","title":"Parte 8 - Avaliando performance","text":"","category":"section"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/#Parte-9-Álgebra-linear","page":"Julia para Cientistas","title":"Parte 9 - Álgebra linear","text":"","category":"section"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/#Parte-10-Expressões-regulares","page":"Julia para Cientistas","title":"Parte 10 - Expressões regulares","text":"","category":"section"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/#Parte-11-Execução-concorrente","page":"Julia para Cientistas","title":"Parte 11 - Execução concorrente","text":"","category":"section"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/#Parte-12-Trabalhando-com-arquivos","page":"Julia para Cientistas","title":"Parte 12 - Trabalhando com arquivos","text":"","category":"section"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/#Parte-13-Bibliotecas-gráficas","page":"Julia para Cientistas","title":"Parte 13 - Bibliotecas gráficas","text":"","category":"section"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/#Parte-14-Gráficos-para-publicações","page":"Julia para Cientistas","title":"Parte 14 - Gráficos para publicações","text":"","category":"section"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/#Parte-15-Tipos-e-estruturas","page":"Julia para Cientistas","title":"Parte 15 - Tipos e estruturas","text":"","category":"section"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/#Parte-16-Metaprogramação","page":"Julia para Cientistas","title":"Parte 16 - Metaprogramação","text":"","category":"section"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/#Parte-17-Interoperação-com-C","page":"Julia para Cientistas","title":"Parte 17 - Interoperação com C","text":"","category":"section"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"","category":"page"},{"location":"Notebooks/A1-Julia-para-Cientistas/#Criando-conteúdos","page":"Julia para Cientistas","title":"Criando conteúdos","text":"","category":"section"},{"location":"Notebooks/A1-Julia-para-Cientistas/","page":"Julia para Cientistas","title":"Julia para Cientistas","text":"Weave\nFranklin\nPluto\nQuarto","category":"page"},{"location":"References/@Arthurs2021a/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Arthurs2021a/","page":"-","title":"-","text":"title: Active training of physics-informed neural networks to aggregate and interpolate parametric solutions to the Navier-Stokes equations authors: Christopher J. Arthurs, Andrew P. King year: 2021 URL: https://doi.org/10.1016/j.jcp.2021.110364 Drive: https://1drv.ms/b/s!Ar4x-UlrYAiZla8i8cvFX_ZGzT6Z9A?e=MJdHtJ –-","category":"page"},{"location":"References/@Amsden1989/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Amsden1989/","page":"-","title":"-","text":"title: \"KIVA-II: A computer program for chemically reactive flows with sprays\" authors: A. A. Amsden, P. J. O'Rourke, T. D. Butler year: 1989 URL: https://doi.org/10.2172/6228444 –- Also check Liu1993 [14] (in OpenFOAM generalization to distortedSphereDrag).","category":"page"},{"location":"References/@Fiedler2009a/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Fiedler2009a/","page":"-","title":"-","text":"title: \"Computed tomography based finite element analysis of the thermal properties of cellular aluminium\" authors: T. Fiedler, E. Solórzano, F. Garcia‐Moreno, A. Öchsner, I. V. Belova, G. E. Murch year: 2009 –-","category":"page"},{"location":"Notes/OpenFOAM-Cases/","page":"Excalidraw Data","title":"Excalidraw Data","text":"","category":"page"},{"location":"Notes/OpenFOAM-Cases/","page":"Excalidraw Data","title":"Excalidraw Data","text":"excalidraw-plugin: parsed tags: [excalidraw]","category":"page"},{"location":"Notes/OpenFOAM-Cases/","page":"Excalidraw Data","title":"Excalidraw Data","text":"","category":"page"},{"location":"Notes/OpenFOAM-Cases/","page":"Excalidraw Data","title":"Excalidraw Data","text":"==⚠ Switch to EXCALIDRAW VIEW in the MORE OPTIONS menu of this document. ⚠==","category":"page"},{"location":"Notes/OpenFOAM-Cases/#Excalidraw-Data","page":"Excalidraw Data","title":"Excalidraw Data","text":"","category":"section"},{"location":"Notes/OpenFOAM-Cases/#Text-Elements","page":"Excalidraw Data","title":"Text Elements","text":"","category":"section"},{"location":"Notes/OpenFOAM-Cases/","page":"Excalidraw Data","title":"Excalidraw Data","text":"multicomponentFluid ^qRsrcDcj","category":"page"},{"location":"Notes/OpenFOAM-Cases/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Combustion ^1jpkNYY8","category":"page"},{"location":"Notes/OpenFOAM-Cases/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Evaporation ^XEtNIadD","category":"page"},{"location":"Notes/OpenFOAM-Cases/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Liquids ^kKIsmNw6","category":"page"},{"location":"Notes/OpenFOAM-Cases/","page":"Excalidraw Data","title":"Excalidraw Data","text":"aachenBomb ^7VdZntsW","category":"page"},{"location":"Notes/OpenFOAM-Cases/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Kinetics ^W2TJAmjK","category":"page"},{"location":"Notes/OpenFOAM-Cases/","page":"Excalidraw Data","title":"Excalidraw Data","text":"nc7h16 ^huP8tzYR","category":"page"},{"location":"Notes/OpenFOAM-Cases/","page":"Excalidraw Data","title":"Excalidraw Data","text":"parcelInBox ^3cqsiZ1f","category":"page"},{"location":"Notes/OpenFOAM-Cases/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Solids ^CoCpr3fT","category":"page"},{"location":"Notes/OpenFOAM-Cases/","page":"Excalidraw Data","title":"Excalidraw Data","text":"simplifiedSiwek ^Fsq6al0O","category":"page"},{"location":"Notes/OpenFOAM-Cases/","page":"Excalidraw Data","title":"Excalidraw Data","text":"verticalChannel ^FVJsO16x","category":"page"},{"location":"Notes/OpenFOAM-Cases/","page":"Excalidraw Data","title":"Excalidraw Data","text":"verticalChannelLTS ^QNoyohaC","category":"page"},{"location":"Notes/OpenFOAM-Cases/","page":"Excalidraw Data","title":"Excalidraw Data","text":"verticalChannelSteady ^iAVhia6P","category":"page"},{"location":"Notes/OpenFOAM-Cases/","page":"Excalidraw Data","title":"Excalidraw Data","text":"%%","category":"page"},{"location":"Notes/OpenFOAM-Cases/#Drawing","page":"Excalidraw Data","title":"Drawing","text":"","category":"section"},{"location":"Notes/OpenFOAM-Cases/","page":"Excalidraw Data","title":"Excalidraw Data","text":"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","category":"page"},{"location":"Notes/OpenFOAM-Cases/","page":"Excalidraw Data","title":"Excalidraw Data","text":"%%","category":"page"},{"location":"Science/02-Computational-Physics/#Computational-Physics","page":"Computational Physics","title":"Computational Physics","text":"","category":"section"},{"location":"Science/02-Computational-Physics/#Molecular-Dynamics-(MD)","page":"Computational Physics","title":"Molecular Dynamics (MD)","text":"","category":"section"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"The Materials Project has many interesting for those working on MD and especially DFT. Theoretical basis can be found in the work by Hinchliffe which maybe will require some refreshing on the The Feynman Lectures on Physics to be followed.","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"Since molecular dynamics is a field essentially related to simulation (there is no MD without simulation!), it is worth listing the major open source projects related to the field, LAMMPS, ESPReSo, and Gromacs. Other interesting projects include HOOMD and the popular NAMD; I have refrained from the last given its greedy licensing scheme. My studies are currently focused in LAMMPS because its fields of application and system portability.","category":"page"},{"location":"Science/02-Computational-Physics/#Density-Functional-Theory-(DFT)","page":"Computational Physics","title":"Density Functional Theory (DFT)","text":"","category":"section"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"Abinit webpage\nBigDFT\nCP2K\nDalton/LSDalton\nDIRAC webpage\nFLEUR webpage\nQuantum Espresso webpage\nSiesta\nYambo","category":"page"},{"location":"Science/02-Computational-Physics/#Finite-Element-Method","page":"Computational Physics","title":"Finite Element Method","text":"","category":"section"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"Personal path towards mastering finite element method (FEM).","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"The goal of this repository is to track my learning path of finite element method. As a secondary goal, all tools included in the study must be open source with a permissive license. Finally, I will study again some subjects related to the physics of applied problems that will be solved through FEM.","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"
It is not my first time trying this and I learned a few things in the past failures. Below I expose my reasoning about the choices I make today for structuring this repository and its future.
","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"During my college years I almost neglected solid mechanics and statics. It happens that most quality materials for learning FEM are applied to structural analysis (because that is the most import numerical method in that field). Because my applied work is mostly related to fluids and heat transfer, doing some bibliographic research I found the books by Lewis et al. and its newer edition by Nithiarasu et al. adapted to my expertise level.\nFrom a mathematical standpoint the most accessible material I have studied so far is the draft book by H. P. Langtangen and K.-A. Mardal. Unfortunatelly the main author deceased just after the release of the final draft and the material remained unfinished. That is not really a blocking point because the content is pretty much finished from a non-specialist standpoint. Furthermore, its exercises where converted into notebooks by Mojtaba Barzegari and the material is quite accessible.\nDuring the years I have tested several FEM packages and libraries. The most promissing FEM package in the open source world is certainly FEniCSx, but it comes with the disadvantage of requiring Linux/WSL and having an unclear documentation. In terms of power I couldn't find anything comparable to MOOSE - if you see the list of developer labs it becomes pretty clear why - but it is something to experienced FEM users since it requires low level implementation of the problems in C++. Elmer could be a candidate package for learning the practice, but for going into the mathematics of FEM it is not the right tool. Next comes Kratos but its documentation is messy and things moved around too much over the years. Finally we have FreeFEM++. It is a pretty old software what means that it outlived most of the other applications and now is very stable. What is interesting about FreeFEM++ is its portability across operating systems and good documentation. In what follows I will stick with FreeFEM++ and later with FEniCSx.\nLearning a numerical method for continuum mechanics is essentially useless without the capacity to apply it to real world geometries. Unfortunatelly the field of open source CAD is very poor so we have just a few options. Although Gmsh is pretty powerfull with respect to its meshing capabilities, conceiving the geometry with the software can quickly scale to trigonometry hell level. I have been using the software for many years for 2D cases but systematically fall back to proprietary software when things become complex. In this study I intend to reach a sorcerer Gmsh mastery level. It can be complemented by STL files generation with Blender or CAD in FreeCAD.\nAdvanced post-processing is also a must, so we will also follow some tutorials to improve ParaView skills.","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"
","category":"page"},{"location":"Science/02-Computational-Physics/#Software-version","page":"Computational Physics","title":"Software version","text":"","category":"section"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"While doing such an ambitious study, it is important to stick with software versions.","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"In what follows we will be using exclusivelly the following software:","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"Gmsh 4.11.1\nFreeFEM++ 4.13\nParaView 5.10.1\nFreeCAD 0.21.1\nBlender 4.0.2","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"Processing utilities in Julia and/or Python will have their own versioning so they are not reported here.","category":"page"},{"location":"Science/02-Computational-Physics/#Study-planning","page":"Computational Physics","title":"Study planning","text":"","category":"section"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"Because it can become frustrating to progress in the study and not be able to apply the knowledge to real cases, we will start by growing competencies in geometry and meshing before entering the mathematical and software aspects. Planning is idealized in a weekly basis.","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"Because of its simpler format, Nithiarasu's book is followed at a faster pace than Langtangen's. At some point the subjects being studied at Langtangen's book will become a review and deepening of previously studied subjects.","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"For materials that were not cited above, here follow the links:","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"Engineering Statics | Lectures\nIntro to Continuum Mechanics | Seminars\nSolid Mechanics | Theory\nIntro to the Finite Element Method | Lectures","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"The book series by O.C. Zienkiewicz and collaborators will be included later since its in depth and general approach trespasses my current capacity on how to organize their study. After learning the basics over the next months I hope to be able to skecth a learning strategy to go over those books and feed this time-line.","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"Complementary studies to take at any time during the series:","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"The first 4 videos of this playlist.\nThe first 5 videos of this playlist.\nThis video and the sequence (no playlist created).\nThis video with a full Gmsh introduction.","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"Review and in-depth studies for solidification of knowledge:","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"Continuum physics\nIntroduction to finite element methods\nWolfgang Bangerth's video lectures","category":"page"},{"location":"Science/02-Computational-Physics/#Week-1","page":"Computational Physics","title":"Week 1","text":"","category":"section"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"[ ] Follow 21 tutorials provided with Gmsh\n[x] Follow this short course on FreeCAD.\n[x] Follow this tutorial on FreeFEM without practicing.\n[x] Nithiarasu (2016), chapters 1 and 2\n[x] Langtangen (2016), chapters 1 and 2 (1/3)\n[ ] Barzegari's notebook associated to Langtangens chapter 1\n[ ] Engineering Statics | Lectures videos 1 to 10\n[ ] Intro to the Finite Element Method | Lectures 1","category":"page"},{"location":"Science/02-Computational-Physics/#Week-2","page":"Computational Physics","title":"Week 2","text":"","category":"section"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"[ ] Nithiarasu (2016), chapter 3 (1/2)\n[ ] Langtangen (2016), chapter 2 (2/3) \n[ ] FreeFEM++ guided tutorials 2.1 to 2.9\n[ ] Engineering Statics | Lectures videos 11 to 14\n[ ] Solid Mechanics | Theory (all at once)\n[ ] Intro to Continuum Mechanics | Seminars 1\n[ ] Intro to the Finite Element Method | Lectures 2","category":"page"},{"location":"Science/02-Computational-Physics/#Week-3","page":"Computational Physics","title":"Week 3","text":"","category":"section"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"[ ] Nithiarasu (2016), chapter 3 (2/2)\n[ ] Langtangen (2016), chapter 2 (3/3) \n[ ] Barzegari's notebook associated to Langtangens chapter 2\n[ ] FreeFEM++ guided tutorials 2.10 to 2.13\n[ ] Engineering Statics | Lectures videos 15 to 18\n[ ] Intro to Continuum Mechanics | Seminars 2\n[ ] Intro to the Finite Element Method | Lectures 3","category":"page"},{"location":"Science/02-Computational-Physics/#Week-4","page":"Computational Physics","title":"Week 4","text":"","category":"section"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"[ ] Nithiarasu (2016), chapter 4\n[ ] Langtangen (2016), chapter 3 (1/5) \n[ ] FreeFEM++ guided tutorials 2.14 to 2.19\n[ ] Engineering Statics | Lectures videos 19 to 22\n[ ] Intro to Continuum Mechanics | Seminars 3\n[ ] Intro to the Finite Element Method | Lectures 4\n[ ] Follow these ParaView tutorials.","category":"page"},{"location":"Science/02-Computational-Physics/#Week-5","page":"Computational Physics","title":"Week 5","text":"","category":"section"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"[ ] Nithiarasu (2016), chapter 5\n[ ] Langtangen (2016), chapter 3 (2/5) \n[ ] Engineering Statics | Lectures videos 23 to 24\n[ ] Intro to Continuum Mechanics | Seminars 4\n[ ] Intro to the Finite Element Method | Lectures 5\n[ ] Follow these ParaView tutorials.","category":"page"},{"location":"Science/02-Computational-Physics/#Week-6","page":"Computational Physics","title":"Week 6","text":"","category":"section"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"[ ] Nithiarasu (2016), chapter 6\n[ ] Langtangen (2016), chapter 3 (3/5) \n[ ] Intro to Continuum Mechanics | Seminars 5\n[ ] Intro to the Finite Element Method | Lectures 6\n[ ] Follow this ParaView seminar.","category":"page"},{"location":"Science/02-Computational-Physics/#Week-7","page":"Computational Physics","title":"Week 7","text":"","category":"section"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"[ ] Nithiarasu (2016), chapter 7 (1/3)\n[ ] Langtangen (2016), chapter 3 (4/5) \n[ ] Intro to Continuum Mechanics | Seminars 6\n[ ] Intro to the Finite Element Method | Lectures 7\n[ ] Follow this ParaView seminar.","category":"page"},{"location":"Science/02-Computational-Physics/#Week-8","page":"Computational Physics","title":"Week 8","text":"","category":"section"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"[ ] Nithiarasu (2016), chapter 7 (2/3)\n[ ] Langtangen (2016), chapter 3 (5/5) \n[ ] Barzegari's notebook associated to Langtangens chapter 3\n[ ] Intro to Continuum Mechanics | Seminars 7\n[ ] Intro to the Finite Element Method | Lectures 8\n[ ] Follow this ParaView seminar.","category":"page"},{"location":"Science/02-Computational-Physics/#Week-9","page":"Computational Physics","title":"Week 9","text":"","category":"section"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"[ ] Nithiarasu (2016), chapter 7 (3/3)\n[ ] Langtangen (2016), chapter 4 (1/2) \n[ ] Intro to Continuum Mechanics | Seminars 8\n[ ] Intro to the Finite Element Method | Lectures 9\n[ ] Follow this ParaView seminar.","category":"page"},{"location":"Science/02-Computational-Physics/#Week-10","page":"Computational Physics","title":"Week 10","text":"","category":"section"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"[ ] Nithiarasu (2016), chapter 8\n[ ] Langtangen (2016), chapter 4 (2/2) \n[ ] Barzegari's notebook associated to Langtangens chapter 4\n[ ] Intro to Continuum Mechanics | Seminars 9\n[ ] Intro to the Finite Element Method | Lectures 10\n[ ] Follow this ParaView seminar.","category":"page"},{"location":"Science/02-Computational-Physics/#Week-11","page":"Computational Physics","title":"Week 11","text":"","category":"section"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"[ ] Follow 7 extended tutorials provided with Gmsh (Python)\n[ ] Nithiarasu (2016), chapter 9\n[ ] Langtangen (2016), chapter 5 (1/3) \n[ ] Intro to Continuum Mechanics | Seminars 10\n[ ] Follow this ParaView seminar.","category":"page"},{"location":"Science/02-Computational-Physics/#Week-12","page":"Computational Physics","title":"Week 12","text":"","category":"section"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"[ ] Nithiarasu (2016), chapter 10\n[ ] Langtangen (2016), chapter 5 (2/3) ","category":"page"},{"location":"Science/02-Computational-Physics/#Week-13","page":"Computational Physics","title":"Week 13","text":"","category":"section"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"[ ] Nithiarasu (2016), chapter 11\n[ ] Langtangen (2016), chapter 5 (3/3) \n[ ] Barzegari's notebook associated to Langtangens chapter 5","category":"page"},{"location":"Science/02-Computational-Physics/#Week-14","page":"Computational Physics","title":"Week 14","text":"","category":"section"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"[ ] Nithiarasu (2016), chapter 12\n[ ] Langtangen (2016), chapter 6 (1/2) ","category":"page"},{"location":"Science/02-Computational-Physics/#Week-15","page":"Computational Physics","title":"Week 15","text":"","category":"section"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"[ ] Nithiarasu (2016), chapter 13\n[ ] Langtangen (2016), chapter 6 (2/2) \n[ ] Barzegari's notebook associated to Langtangens chapter 6","category":"page"},{"location":"Science/02-Computational-Physics/#Week-16","page":"Computational Physics","title":"Week 16","text":"","category":"section"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"[ ] Nithiarasu (2016), chapter 14 and 15\n[ ] Langtangen (2016), chapter 7 \n[ ] Barzegari's notebook associated to Langtangens chapter 7","category":"page"},{"location":"Science/02-Computational-Physics/#Week-17","page":"Computational Physics","title":"Week 17","text":"","category":"section"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"[ ] Langtangen (2016), chapter 8\n[ ] Barzegari's notebook associated to Langtangens chapter 8","category":"page"},{"location":"Science/02-Computational-Physics/#Week-18","page":"Computational Physics","title":"Week 18","text":"","category":"section"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"[ ] Langtangen (2016), chapter 9 (1/4)","category":"page"},{"location":"Science/02-Computational-Physics/#Week-19","page":"Computational Physics","title":"Week 19","text":"","category":"section"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"[ ] Langtangen (2016), chapter 9 (2/4)","category":"page"},{"location":"Science/02-Computational-Physics/#Week-20","page":"Computational Physics","title":"Week 20","text":"","category":"section"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"[ ] Langtangen (2016), chapter 9 (3/4)","category":"page"},{"location":"Science/02-Computational-Physics/#Week-21","page":"Computational Physics","title":"Week 21","text":"","category":"section"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"[ ] Langtangen (2016), chapter 9 (4/4)\n[ ] Barzegari's notebook associated to Langtangens chapter 9","category":"page"},{"location":"Science/02-Computational-Physics/#Week-22","page":"Computational Physics","title":"Week 22","text":"","category":"section"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"[ ] Langtangen (2016), chapter 10","category":"page"},{"location":"Science/02-Computational-Physics/#Week-23","page":"Computational Physics","title":"Week 23","text":"","category":"section"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"[ ] Langtangen (2016), chapter 11","category":"page"},{"location":"Science/02-Computational-Physics/#Finite-Volume-Method","page":"Computational Physics","title":"Finite Volume Method","text":"","category":"section"},{"location":"Science/02-Computational-Physics/#Formulations-of-heat-conduction","page":"Computational Physics","title":"Formulations of heat conduction","text":"","category":"section"},{"location":"Science/02-Computational-Physics/#Temperature-formulation","page":"Computational Physics","title":"Temperature formulation","text":"","category":"section"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"Before attempting to derive heat conduction equation in terms of enthalpy, it is worth warming up with its handling in temperature formulation. In this case, the equation is solved directly in terms of temperature as dependent variable which is also used in the governing potential (Fourier's law). This simple case is applicable to many engineering problems. First we formulate the problem with constant thermophysical properties before proceeding to variable density and specific heat.","category":"page"},{"location":"Science/02-Computational-Physics/#Constant-thermophysical-properties","page":"Computational Physics","title":"Constant thermophysical properties","text":"","category":"section"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"Heat equation formulated with temperature as dependent variable applied to constant density rho and specific heat c_p can be stated as:","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"rhoc_pfracpartialTpartialt=nablacdotp(knablaT)","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"Applying the divergence operator to the right hand side to a single coordinate and expanding the gradient term for different coordinate systems (cartesian, cylindrical, and spherical) leads to the following expressions. Notice that coordinate was expressed as r even in cartesian coordinates for homogeneity of notation in what follows.","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"rhoc_pdfracpartialTpartialt=begincases\ndfracpartialpartialr\nleft(kdfracpartialTpartialrright) textcartesian12pt\n\ndfrac1rdfracpartialpartialr\nleft(rkdfracpartialTpartialrright) textcylindrical12pt\n\ndfrac1r^2dfracpartialpartialr\nleft(r^2kdfracpartialTpartialrright) textspherical\nendcases","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"Stated this way the problem can be reformulated with a simpler notation as","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"rhoc_pdfracpartialTpartialt=\ndfrac1betadfracpartialpartialr\nleft(betakdfracpartialTpartialrright)\nqquadtextwhereqquadbeta=\nbegincases\n1 textcartesian12pt\n\nr textcylindrical12pt\n\nr^2 textspherical\nendcases","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"To proceed with the finite volume discretization we perform the integration of both sides of the equation over the relevant variables. The order of integration is chosen according to the nature of the derivative term, as discussed by Patankar1980 [24]. Care must be taken in the definition of the space integration - which is non-trivial in cylindrical and spherical coordinates systems - and must be carried over the differential volume dV.","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"int_Vint_0^tau\nrhoc_pdfracpartialTpartialtdtdV=\nint_0^tauint_V\nfrac1betadfracpartialpartialr\nleft(betakdfracpartialTpartialrright)dVdt","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"dV=\nbegincases\ndrdydz textcartesian12pt\n\nrdrdthetadz textcylindrical12pt\n\nr^2sinphidrdthetadphi textspherical\nendcases","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"The components of volume integration not explicitly appearing in the 1-D differential formulation can be moved out of the integrand. For cartesian coordinates the terms leads to the area of the perpendicular plane; for cylindrical coordinates this corresponds to the azimuth and axial components and integration produces a factor 2piz; lastly, for spherical coordinates we have the polar and azimuth components moved out and a factor 4pi. Since these terms appear in both sides of the equation, they end by cancelling out.","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"Phi=\nbegincases\nA=displaystyleint_0^Zint_0^Ydydz\n textcartesian12pt\n\n2piz=displaystyleint_0^zint_0^2pidthetadz\n textcylindrical12pt\n\n4pi=displaystyleint_0^piint_0^2pisinphidthetadphi\n textspherical\nendcases","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"Applying the remaining component of differential volume to the equations lead to the following expressions. Notice that the meaning of beta is now clear: it is simply the factor multiplying dr in the different coordinate systems. It will make the multiplied factor simplify in the right-hand side and appear back in the left-hand side. You should try performing this step by yourself to get a full insight of what is happening here. So far the equations remain formulated identically.","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"int_s^nint_0^tau\nbetarhoc_pdfracpartialTpartialtdtdr=\ndisplaystyleint_0^tauint_s^n\ndfracpartialpartialr\nleft(betakdfracpartialTpartialrright)drdt","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"In the above expression, instead of integrating over the full domain, we applied limits over the north and south interfaces of a single finite volume cell (logically using a cell-centered formulation). Because beta is not time-dependent, we can effect the integration of the inner term and move out constant terms from the integrals, leading to:","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"rhoc_pleft(T_P^tau-T_P^0right)int_s^nbetadr=\nint_0^tau\nleft(betakfracpartialTpartialrright)biggvert_s^ndt","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"For simplicity, in what follows we use an unbounded first-order approximation scheme for space derivatives, i.e. they are approximated as:","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"fracpartialTpartialrapproxfracT_i+1-T_idelta_ii+1\nqquadtextwhereqquad\ndelta_ii+1=r_i+1-r_i","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"Applying a general Crank-Nicolson Crank1996 [25] scheme we integrate numerically the right-hand side. The weighting factor f introduces the implicit degree: for f=1 we have a fully implicit solution, which f=0 represents a standard Euler integration. It should be self evident that sumf^(I)=1. Notice that the parenthetical superscript notation (I) does not imply exponentiation, but the instant at which the corresponding values are to be evaluated.","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"fracrhoc_ptauleft(T_P^tau-T_P^0right)int_s^nbetadr=\nsum_I=0tau\n\nf^(I)left\n beta_nk_n^(I)fracT_N^(I)-T_P^(I)delta_PN-\n beta_sk_s^(I)fracT_P^(I)-T_S^(I)delta_PS\nright","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"Integration of the remaining space integral is trivial given the definition of beta; to remain generic no matter what coordinate system we introduce the constant gamma. Notice that for cartesian coordinates this corresponds simply to the cell length and for other coordinate systems other relationships associated to cell volume can be interpreted.","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"int_s^nbetadr=fracr_n^gammagamma-fracr_s^gammagamma\nqquadtextwhereqquadgamma=\nbegincases\n1 textcartesian12pt\n\n2 textcylindrical12pt\n\n3 textspherical\nendcases","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"Putting it all together leads to the final expression:","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"fracrhoc_ptauleft(T_P^tau-T_P^0right)\nleft(fracr_n^gammagamma-fracr_s^gammagammaright)=\nsum_I=0tau\nf^Ileft\n beta_nk_n^IfracT_N^I-T_P^Idelta_PN-\n beta_sk_s^IfracT_P^I-T_S^Idelta_PS\nright","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"Some coefficients appearing in the above equations are now grouped. Notice that for thermal conductivity k which is a function of temperature, the corresponding instant (I) temperature must be used for its evaluation. For kappa_j the lower case j represents the evaluation at the interface with control volume J, a very specific notation used here.","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"beginaligned\n alpha_P = fracrhoc_pgammatauleft(r_n^gamma-r_s^gammaright)8pt\n kappa_j = fracbeta_jk_jdelta_PJ\nendaligned","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"Using these definitions the equation can be reworked as:","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"alpha_Pleft(T_P^tau-T_P^0right)=\nsum_I=0tau\nf^(I)left\n kappa_n^(I)left(T_N^(I)-T_P^(I)right)-\n kappa_s^(I)left(T_P^(I)-T_S^(I)right)\nright","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"To get the matrix form of the problem we start by expanding all products. For conciseness we make f=f^(0) and g=f^(tau); also everything that is evaluated at t=tau has the superscript dropped; using these ideas the expression is rewritten as:","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"-fkappa_sT_S+\n(alpha_P+fkappa_n+fkappa_s)T_P\n-fkappa_nT_N\n=\ngkappa_s^(0)T_S^(0)+\n(alpha_P-gkappa_n^(0)-gkappa_s^(0))T_P^(0)+\ngkappa_n^(0)T_N^(0)","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"For the fully implicit time-stepping scheme f=1 the expression reduces to","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"-kappa_sT_S+\n(alpha_P+kappa_n+kappa_s)T_P\n-kappa_nT_N\n=\na_P^(0)T_P^(0)","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"where the following coefficients are identified","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"beginaligned\n a_S = -kappa_s8pt\n a_N = -kappa_n8pt\n a_P = alpha_P+kappa_n+kappa_s8pt\n a_P^(0) = alpha_P\nendaligned","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"and the standard finite volume formalism discretization is reached","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"a_ST_S + a_PT_P + a_NT_N = a_P^(0)T_P^(0)","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"The interested reader may wish to derive the boundary conditions to this case. We will refrain from that here because it will be done for the rather more general case in the following sections.","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"","category":"page"},{"location":"Science/02-Computational-Physics/#Variable-thermophysical-properties","page":"Computational Physics","title":"Variable thermophysical properties","text":"","category":"section"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"To enter the variable thermophysical properties formulation it is worth saying a few words ahead of time about the next subject, the enthalpy formulation. That is because for variable density rho(T) and specific heat capacity c_p(T) under constant pressure the left-hand side of heat equation can be better expressed in terms of enthalpy H(T)=rho(T)h(T)=rho(T)c_p(T)T. Such a formulation is a requirement when dealing with phase change, such as solidification and melting - where we find discontinuities in enthalpy function; it is also needed in situations where material properties change above a certain degree for which constant properties could no longer be assumed over the foreseeable temperature range.","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"info: Info\nIn practical applications, especially in high-dimensional problems coupled to fluid dynamics, it is worth performing a sensitivity analysis with different sampling points over rho(T)c_p(T) to determine whether solving the problem with temperature-dependent properties is really required. For most cases this can lead to impressive speed-ups in simulations.","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"Although of high practical relevance, it is almost incredible that most standard engineering textbooks ignore this sort of development. A recent paper by Hristov2023 [26] tries to handle this sort of formalism analytically with properties expanded as simple temperature functions. Expanding the left-hand side of heat equation formulated in H(T) leads to","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"fracpartialHpartialt=\nrhoc_pfracpartialTpartialt+\nc_pTfracpartialrhopartialt+\nrhoTfracpartialc_ppartialt","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"If (continuous) relationships for rho(T) and c_p(T) are available, it can be expanded to","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"fracpartialHpartialt=\nleft(\n\trhoc_p+\n\tc_pTfracpartialrhopartialT+\n\trhoTfracpartialc_ppartialT\nright)\nfracpartialTpartialt","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"so that heat equation writes with the proper divergence operator as","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"left(\n\trhoc_p+\n\tc_pTfracpartialrhopartialT+\n\trhoTfracpartialc_ppartialT\nright)\nfracpartialTpartialt=\nnablacdotp(knablaT)","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"It is worth mentioning here, although we will not develop further for now, that in materials science and other fields, when involving a phase transformation kinetics described by an Avrami-like formalism such as discussed by Shirzad2023 [27], we could end with a system of coupled partial differential equations. For instance, if density only is changed through an arbitrary kinetics f(trhoTdotT), the next (unrealistic) model would arise. In fact, as discussed by Mittemeijer1988 [28], we should solve for a new non-equilibrium thermodynamic state beta for the kinetics and analytically evaluate a JMAK expression for density, but that is beyond our scope here (for now!).","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"beginalign\nleft(\n\trhoc_p+\n\trhoTfracpartialc_ppartialT\nright)fracpartialTpartialt\n=nablacdotp(knablaT)-c_pTfracpartialrhopartialt12pt\nfracpartialrhopartialt=f(trhoTdotT)\nendalign","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"The base development of the integral form of the heat equation in different coordinate systems being already treated in the previous sections, we use that result here to get","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"int_s^nint_0^tau\nbeta\nleft(\n\trhoc_p+\n\tc_pTfracpartialrhopartialT+\n\trhoTfracpartialc_ppartialT\nright)\ndfracpartialTpartialtdtdr=\ndisplaystyleint_0^tauint_s^n\ndfracpartialpartialr\nleft(betakdfracpartialTpartialrright)drdt","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"Solving left-hand side of this integral is non-trivial and we will skip it for now; consider then the non-expanded version of the enthalpy problem:","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"int_s^nint_0^tau\nbeta\ndfracpartial(rhoc_pT)partialtdtdr=\ndisplaystyleint_0^tauint_s^n\ndfracpartialpartialr\nleft(betakdfracpartialTpartialrright)drdt","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"Next we integrate both sides of the equation at once and apply a fully implicit interpolation to the right-hand side; for the analogous details provided for constant thermophysical properties, please check the previous section. This leads to the following discrete equation:","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"fracr_n^gamma-r_s^gammagammatau\nleft(rhoc_pT_P)-(rhoc_pT_P)^0right\n=\nbeta_nk_nfracT_N-T_Pdelta_PN-\nbeta_sk_sfracT_P-T_Sdelta_PS","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"where we can identify the following coefficients (not exactly the same as before!):","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"beginaligned\nalpha_P = fracr_n^gamma-r_s^gammagammatau8pt\nkappa_j = fracbeta_jk_jdelta_PJ\nendaligned","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"-kappa_nT_N\n+(alpha_P(rhoc_p)^(star)+kappa_n+kappa_s)T_P\n-kappa_sT_S\n=\nalpha_P(rhoc_p)^(0)T_P^(0)","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"where the following coefficients are identified","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"beginaligned\n a_S = -kappa_s8pt\n a_N = -kappa_n8pt\n a_P = alpha_P(rhoc_p)^(star)+kappa_n+kappa_s8pt\n a_P^(0) = alpha_P(rhoc_p)^(0)\nendaligned","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"There are two main differences in the above coefficients with respect to the constant properties case: both a_P and a_P^(0) need to be updated. Since the previous case already considered variable thermal conductivity, it was intrinsically non-linear and solution should already be iterative. In that sense, using a (star) superscript in (rhoc_p)^(star) is not needed because the kappa already need to be updated on a iteration basis until time-step convergence; nonetheless, it was kept to emphasize the different in the present formulation. The final problem statement remains the same, say","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"a_ST_S + a_PT_P + a_NT_N = a_P^(0)T_P^(0)","category":"page"},{"location":"Science/02-Computational-Physics/#Boundary-conditions","page":"Computational Physics","title":"Boundary conditions","text":"","category":"section"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"TODO","category":"page"},{"location":"Science/02-Computational-Physics/#Special-cases-coordinates","page":"Computational Physics","title":"Special cases coordinates","text":"","category":"section"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"For cylindrical and spherical systems, a condition for symmetry is that no flux traverses the center of the cylinder at r=0. That implies that south derivatives in discrete form of the equation must vanish to enforce dotq(0t)=0, so the first row of the problem is modified to","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"a_1T_P + a_NT_N = alpha_PT_P^0quadtextwherequada_1=alpha_P+beta_n","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"a_1T_P + a_NT_N = alpha_PT_P^0quadtextwherequada_1=alpha_P+beta_n","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"Over the external radius r=R a Robin boundary condition is imposed. In this case the heat flux dotq=U(T_infty-T_P) takes the place of north term in FVM discretization and the equation writes","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"a_ST_S + a_RT_P = alpha_PT_P^0+UT_inftyquadtextwherequada_R=alpha_P+U+beta_s","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"It must be noted here that U=betah, where the actual heat transfer coefficient is h. This should be self-evident from a dimensional analysis.","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"danger: Danger\nFrom here on everything is in draft mode.","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"","category":"page"},{"location":"Science/02-Computational-Physics/#Enthalpy-formulation","page":"Computational Physics","title":"Enthalpy formulation","text":"","category":"section"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"Enthalpy formulation is less trivial from the perspective that both sides of the equation do not use the same variable; balance is performed over enthalpy while driving force remains the temperature gradient (as per Fourier's law). In this case an extra step is added to the solution, solve a (generally) nonlinear equation for T=f(h). Quite often this is formulated as a root finding problem stated as h-hath(T)=0, where h represents the integrate enthalpy in a control volume and hath the provided function relating temperature to enthalpy. The equation is this case is stated as:","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"fracpartial(rhoh)partialt=nablacdotp(knablaT)","category":"page"},{"location":"Science/02-Computational-Physics/#Spherical-coordinates-1-D","page":"Computational Physics","title":"Spherical coordinates 1-D","text":"","category":"section"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"For computing the heating dynamics in a sphere, using the definition of divergence in spherical coordinates and using the gradient expansion over the radius we have","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"rhofracpartialhpartialt=\nfrac1r^2fracpartialpartialr\nleft(r^2kfracpartialTpartialrright)","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"This is now integrated over the differential volume dV as described in previous sections and for conciseness we skip that discussion. The integration over radial coordinate introduces the r^2dr factor from the differential volume and we get the final form of the equation to integrate.","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"int_s^nint_0^tau\nrhofracpartialhpartialtr^2dtdr=\nint_0^tauint_s^n\nfracpartialpartialr\nleft(r^2kfracpartialTpartialrright)drdt","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"After effecting the inner integrations and moving out constant terms from the integrals and expanding the evaluation of the definite integral between control volume boundaries s and n and performing a Crank-Nicolson integration of the right-hand side one gets","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"beginalign\nfracrhotau\nleft(h_P^tau-h_P^0right)\nleft(fracr_n^33-fracr_s^33right)\n=fleft\nr_n^2k_nfracT_N^tau-T_P^taudelta_PN-\nr_s^2k_sfracT_P^tau-T_S^taudelta_PS\nright8pt\n+(1-f)left\nr_n^2k_nfracT_N^0-T_P^0delta_PN-\nr_s^2k_sfracT_P^0-T_S^0delta_PS\nright\nendalign","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"Some coefficients appearing in the above equations are now grouped. Notice that for thermal conductivity k which is a function of temperature, the corresponding time-step temperature must be used for its evaluation. For beta_j the lower case j represents the evaluation at the interface with control volume J, what is a very specific notation.","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"beginalign\nalpha_P = fracrho3tauleft(r_n^3-r_s^3right)8pt\nbeta_j = fracr_j^2k_jdelta_PJ\nendalign","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"For conciseness we make g=(1-f) and simplify the expression with the new coefficients as","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"beginalign\nalpha_Ph_P^tau-alpha_Ph_P^0\n\n=fbeta_nT_N^tau-f(beta_n+beta_s)T_P^tau-fbeta_sT_S^tau\n8pt\n+gbeta_nT_N^0-g(beta_n+beta_s)T_P^0-gbeta_sT_S^0\nendalign","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"For the fully implicit time-stepping scheme f=1 and making gamma_j^k=alpha_P^-1beta_j^k one gets","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"h_P^tau-h_P^0-gamma_n^kT_N^tauk+(gamma_n^k+gamma_s^k)T_P^tauk-gamma_s^kT_S^tauk=0","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"A condition for symmetry is that no flux traverses the center of the sphere at r=0. That implies that south derivatives in discretizes form of the equation must vanish to enforce dotq(0t)=0, so the first row of the problem is modified to","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"h_P^tau-h_P^0-gamma_n^kT_N^tauk+gamma_n^kT_P^tauk=0","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"Over the external radius r=R a Robin boundary condition is imposed. In this case the heat flux dotq=U(T_infty-T_P) takes the place of north term in FVM discretization and the equation writes","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"h_P^tau-h_P^0-alpha_P^-1UT_infty+(alpha_P^-1U+gamma_s^k)T_P^tauk-gamma_s^kT_S^tauk=0","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"It must be noted here that U=R^2h, where the actual heat transfer coefficient is h. This should be self-evident from a dimensional analysis.","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"This is no longer a linear problem and thus cannot be solved directly. We need now an strategy for solving this coupled system of nonlinear equations. The iterative solution of the problem is indicated in the above equations through the introduction of superscript k indicating the iteration number. One can rework the system as","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"beginalign\n-gamma_12^kT_2^tauk+gamma_12^kT_1^tauk+h_1^tau=h_1^0\ndots \n-gamma_n^kT_N^tauk+(gamma_n^k+gamma_s^k)T_P^tauk-gamma_s^kT_S^tauk+h_P^tau=h_P^0\ndots \n(alpha_K^-1U+gamma_K-1K^k)T_K^tauk-gamma_K-1K^kT_K-1^tauk+h_K^tau=h_K^0+alpha_K^-1UT_infty\nendalign","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"It is clear now that for implementation purposes one can store the required coefficients in a tridiagonal matrix A^k. Making Gamma_i=(gamma_i-1i+gamma_ii+1) and tildeU=alpha_K^-1U we can identify the terms in","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"beginpmatrix\nH_1^k \nH_2^k \nH_3^k \nvdots \nH_K-1^k \nH_K^k \nendpmatrix\n=\nbeginpmatrix\n gamma_12^k -gamma_12^k 0 dots 0 0 \n-gamma_12^k Gamma_2^k -gamma_23^k dots 0 0 \n 0 -gamma_23^k Gamma_3^k -gamma_34^kddots 0 0 \nvdots ddots ddots ddots ddots vdots \n 0 0 0 -gamma_K-2K-1^k Gamma_K-1^k -gamma_K-1K^k \n 0 0 0 0 -gamma_K-1K^k tildeU+gamma_K-1K^k \nendpmatrix\nbeginpmatrix\nT_1^tauk \nT_2^tauk \nT_3^tauk \nvdots \nT_K-1^tauk \nT_N^tauk \nendpmatrix","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"Since the temperature vector T^tauk is updated every iteration, the coefficients of A^k must also be updated. With the intermediate vector H^tauk the nonlinear problem is rewritten as","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"beginpmatrix\nH_1^k \nH_2^k \nH_3^k \nvdots \nH_K-1^k \nH_K^k \nendpmatrix\n+\nbeginpmatrix\nh_1^tau \nh_2^tau \nh_3^tau \nvdots \nh_K-1^tau \nh_K^tau \nendpmatrix\n=\nbeginpmatrix\nh_1^0 \nh_2^0 \nh_3^0 \nvdots \nh_K-1^0 \nh_K^0 + tildeUT_infty \nendpmatrix","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"The choice not to write the problem in this format reflects the fact that the term H^tauk on the left-hand side is updated on a iteration basis, while the vector b^0 is computed once per time step. This last vector was called b^0 instead of h^0 because it also includes the boundary condition in its last element. This is useful for the conception of the inner and outer loop functions used for solution update.","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"The traditional approach to solve this sort of problems is to provide a initial guess T^tau0=T^0.","category":"page"},{"location":"Science/02-Computational-Physics/","page":"Computational Physics","title":"Computational Physics","text":"beginalign\nh^tau0 = b^0-A^0T^tau0\nh(T^tau1)-h^tau0 = 0\nDeltaT = T^tau1-T^tau0\nT^tau1 = T^tau0+(1-alpha)DeltaT\nvarepsilon^1 = vertDeltaTvert\ntextrepeat\nh^tau1 = b^0-A^1T^tau1\nh(T^tau2)-h^tau1 = 0\nDeltaT = T^tau2-T^tau1\nT^tau2 = T^tau1+(1-alpha)DeltaT\nvarepsilon^2 = vertDeltaTvert\ndots\nh^tauk = b^0-A^kT^tauk\nh(T^tauk+1)-h^tauk = 0\nDeltaT = T^tauk+1-T^tauk\nT^tauk+1 = T^tauk+(1-alpha)DeltaT\nvarepsilon^k+1 = vertDeltaTvert\nendalign","category":"page"},{"location":"References/@Cheilytko2016a/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Cheilytko2016a/","page":"-","title":"-","text":"title: \"Finding of the generalized equation of thermal conductivity for porous heat-insulating materials\" authors: Andrii Cheilytko year: 2016 –-","category":"page"},{"location":"Science/05-Machine-Learning/#Machine-Learning","page":"Machine Learning","title":"Machine Learning","text":"","category":"section"},{"location":"Science/05-Machine-Learning/#Data-Driven-Science-and-Engineering","page":"Machine Learning","title":"Data Driven Science and Engineering","text":"","category":"section"},{"location":"Science/05-Machine-Learning/","page":"Machine Learning","title":"Machine Learning","text":"Notes based on Data-Driven Science and Engineering by Steven L. Brunton and J. Nathan Kurz. Their proposed teaching materials for the book can be found here. Supplementary notes that might be useful for understanding the concepts are provided in course AMATH301. The set of open source materials proposed by Kurz's team is found here.","category":"page"},{"location":"Science/05-Machine-Learning/#Singular-Value-Decomposition","page":"Machine Learning","title":"Singular Value Decomposition","text":"","category":"section"},{"location":"Science/05-Machine-Learning/#Fourier-and-Wavelet-Transforms","page":"Machine Learning","title":"Fourier and Wavelet Transforms","text":"","category":"section"},{"location":"Science/05-Machine-Learning/#Sparsity-and-Compressed-Sensing","page":"Machine Learning","title":"Sparsity and Compressed Sensing","text":"","category":"section"},{"location":"Science/05-Machine-Learning/#Regression-and-Model-Selection","page":"Machine Learning","title":"Regression and Model Selection","text":"","category":"section"},{"location":"Science/05-Machine-Learning/#Clustering-and-Classification","page":"Machine Learning","title":"Clustering and Classification","text":"","category":"section"},{"location":"Science/05-Machine-Learning/#Neural-Networks-and-Deep-Learning","page":"Machine Learning","title":"Neural Networks and Deep Learning","text":"","category":"section"},{"location":"Science/05-Machine-Learning/#Data-Driven-Dynamical-Systems","page":"Machine Learning","title":"Data-Driven Dynamical Systems","text":"","category":"section"},{"location":"Science/05-Machine-Learning/#Linear-Control-Theory","page":"Machine Learning","title":"Linear Control Theory","text":"","category":"section"},{"location":"Science/05-Machine-Learning/#Balanced-Models-for-Control","page":"Machine Learning","title":"Balanced Models for Control","text":"","category":"section"},{"location":"Science/05-Machine-Learning/#Data-Driven-Control","page":"Machine Learning","title":"Data-Driven Control","text":"","category":"section"},{"location":"Science/05-Machine-Learning/#Reduced-Order-Models-(ROMs)","page":"Machine Learning","title":"Reduced Order Models (ROMs)","text":"","category":"section"},{"location":"Science/05-Machine-Learning/#POD-for-Partial-Differential-equations-(11.1)","page":"Machine Learning","title":"POD for Partial Differential equations (11.1)","text":"","category":"section"},{"location":"Science/05-Machine-Learning/","page":"Machine Learning","title":"Machine Learning","text":"(Image: )","category":"page"},{"location":"Science/05-Machine-Learning/","page":"Machine Learning","title":"Machine Learning","text":"Proxy models are much faster (lower dimensional)\nClassical discretization (FD) lead to high dimensional schemes\nModel expansion can produce much lower dimension problems","category":"page"},{"location":"Science/05-Machine-Learning/","page":"Machine Learning","title":"Machine Learning","text":"u(xt) = sum_k=1^na_k(t)psi_k(x)","category":"page"},{"location":"Science/05-Machine-Learning/","page":"Machine Learning","title":"Machine Learning","text":"Idea: plug the modal expansion in the PDE and expand it\nWith modal basis the approximations are non-local (global)\nOption 1: Fourier mode expansion - FFT","category":"page"},{"location":"Science/05-Machine-Learning/","page":"Machine Learning","title":"Machine Learning","text":"psi_k(x)=frac1Lexpleft(ifrac2pikxLright)","category":"page"},{"location":"Science/05-Machine-Learning/","page":"Machine Learning","title":"Machine Learning","text":"Goal: try to approximate with r basis instead of large n\nExample: try to approximate a Gaussian with FME\nLocalized structures require more expansion modes\nConstruction similar to spectral methods","category":"page"},{"location":"Science/05-Machine-Learning/#Optimal-Basis-Elements-(11.2)","page":"Machine Learning","title":"Optimal Basis Elements (11.2)","text":"","category":"section"},{"location":"Science/05-Machine-Learning/","page":"Machine Learning","title":"Machine Learning","text":"(Image: )","category":"page"},{"location":"Science/05-Machine-Learning/","page":"Machine Learning","title":"Machine Learning","text":"Key idea: simulate the dynamics of the system and save snapshots of time-step solutions to then identify a modal expansion.\nThe tildeU POD basis psi_k found by truncating the SVD matrix U at rank r is the optimal in the L^2 sense for the given data.\nUse energy accumulated in modes as discussed in Chapter 1 Singular Value Decomposition to define the optimal (or good enough) value of r.\nThe produced ROM is not assured to be safe outside the subspace to which it was identified, though that is fine for several physics.","category":"page"},{"location":"Science/05-Machine-Learning/#POD-and-Soliton-Dynamics-(11.3)","page":"Machine Learning","title":"POD and Soliton Dynamics (11.3)","text":"","category":"section"},{"location":"Science/05-Machine-Learning/","page":"Machine Learning","title":"Machine Learning","text":"(Image: )","category":"page"},{"location":"Science/05-Machine-Learning/#Continuous-Formulation-of-POD","page":"Machine Learning","title":"Continuous Formulation of POD","text":"","category":"section"},{"location":"Science/05-Machine-Learning/","page":"Machine Learning","title":"Machine Learning","text":"(Image: )","category":"page"},{"location":"Science/05-Machine-Learning/#POD-with-Symmetries","page":"Machine Learning","title":"POD with Symmetries","text":"","category":"section"},{"location":"Science/05-Machine-Learning/","page":"Machine Learning","title":"Machine Learning","text":"(Image: )","category":"page"},{"location":"Science/05-Machine-Learning/#Interpolation-for-Parametric-ROMs","page":"Machine Learning","title":"Interpolation for Parametric ROMs","text":"","category":"section"},{"location":"Science/05-Machine-Learning/#Additional-materials","page":"Machine Learning","title":"Additional materials","text":"","category":"section"},{"location":"Science/05-Machine-Learning/","page":"Machine Learning","title":"Machine Learning","text":"(Image: Professor Nick Trefethen, University of Oxford, Linear Algebra Optimization)","category":"page"},{"location":"Science/05-Machine-Learning/","page":"Machine Learning","title":"Machine Learning","text":"","category":"page"},{"location":"Science/05-Machine-Learning/#Physics-Informed-Neural-Networks","page":"Machine Learning","title":"Physics-Informed Neural Networks","text":"","category":"section"},{"location":"Science/05-Machine-Learning/","page":"Machine Learning","title":"Machine Learning","text":"Physics-Informed Neural Networks (PINNs) were first introduced by Raissi2017 [32] in the context of providing data-driven solutions of nonlinear PDE's. In what follows we review the basic concepts and approaches developed in this field during the past few years. Both mathematical and application aspects will be treated in the review.","category":"page"},{"location":"Science/05-Machine-Learning/#Common-applications","page":"Machine Learning","title":"Common applications","text":"","category":"section"},{"location":"Science/05-Machine-Learning/","page":"Machine Learning","title":"Machine Learning","text":"As per Guo2024a [33] the following common applications arise from PINNs:","category":"page"},{"location":"Science/05-Machine-Learning/","page":"Machine Learning","title":"Machine Learning","text":"Predictive modeling and simulations","category":"page"},{"location":"Science/05-Machine-Learning/","page":"Machine Learning","title":"Machine Learning","text":"Solution of dynamical systems (even high-dimensional)\nAcceleration of multi-physics simulations","category":"page"},{"location":"Science/05-Machine-Learning/","page":"Machine Learning","title":"Machine Learning","text":"Optimization and systems control","category":"page"},{"location":"Science/05-Machine-Learning/","page":"Machine Learning","title":"Machine Learning","text":"Surrogate models for design optimization\nInverse design (finding conditions)\nModel predictive control\nOptimal sensor placement","category":"page"},{"location":"Science/05-Machine-Learning/","page":"Machine Learning","title":"Machine Learning","text":"Data-driven insights","category":"page"},{"location":"Science/05-Machine-Learning/","page":"Machine Learning","title":"Machine Learning","text":"Data-driven enhancement","category":"page"},{"location":"Science/05-Machine-Learning/","page":"Machine Learning","title":"Machine Learning","text":"Monitoring, diagnostic, and health assessment","category":"page"},{"location":"Science/05-Machine-Learning/#Key-Ideas","page":"Machine Learning","title":"Key Ideas","text":"","category":"section"},{"location":"Science/05-Machine-Learning/","page":"Machine Learning","title":"Machine Learning","text":"Inject the prediction values in the governing equations to compose the loss function, enforcing the NN to obey the underlying physics.\nThere are 2 components in the loss function, the physical loss evaluated from the deviation from training data (as is commonplace in NN training) and the PDE loss, which is further divided into boundary and initial condition losses.\nCollocation points is how we call the temporal and spacial coordinates where evaluation of physical properties are computed, corresponding to nodes or cell centers in classical numerical schemes.","category":"page"},{"location":"Science/05-Machine-Learning/#Research-opportunities","page":"Machine Learning","title":"Research opportunities","text":"","category":"section"},{"location":"Science/05-Machine-Learning/","page":"Machine Learning","title":"Machine Learning","text":"Following Guo2023a [34] citing the work by Wu2022a [35], resampling and refinement methods could be improved by better PDF's and the use of active or reinforcement learning to improve sampling.","category":"page"},{"location":"Science/05-Machine-Learning/#References","page":"Machine Learning","title":"References","text":"","category":"section"},{"location":"Science/05-Machine-Learning/","page":"Machine Learning","title":"Machine Learning","text":"Unraveling the design pattern of physics-informed neural networks:","category":"page"},{"location":"Science/05-Machine-Learning/","page":"Machine Learning","title":"Machine Learning","text":"Post Subject Main reference(s)\nGuo2023a [34] Resampling of residual points Wu2022a [35]\nGuo2023b [36] Ensemble learning and dynamic solution interval expansion Haitsiukevich2022a [37]\nGuo2023c [38] Improving performance through gradient boosting Fang2023a [39]\nGuo2023d [40] Incorporate the gradient of residual terms as an additional loss term for stiff problems Yu2022a [41]\nGuo2023e [42] Wang2023a [43]\nGuo2023f [44] Wang2022a [45]\nGuo2023g [46] Arthurs2021a [47]","category":"page"},{"location":"Science/05-Machine-Learning/","page":"Machine Learning","title":"Machine Learning","text":"Reference Subject\nLagaris1997a [48] Seminal work on PINNs.\nAntonelo2021a [49] \nCai2021a [50] \nCuomo2022a [51] \nHaitsiukevich2022a [37] \nKarniadakis2021a [52] \nLu2019a [53] \nLu2021a [54] \nNabian2021a [55] \nSanyal2022a [56] \nWurth2023a [57] Use of PINNs to solve diffusion equation (heat transfer) during the curing of composites. The paper is more focused in the application than in the implementation. Benchmark against FDM/FEM.","category":"page"},{"location":"Science/05-Machine-Learning/","page":"Machine Learning","title":"Machine Learning","text":"Other current readings:","category":"page"},{"location":"Science/05-Machine-Learning/","page":"Machine Learning","title":"Machine Learning","text":"[ ] Discovering Differential Equations with Physics-Informed Neural Networks and Symbolic Regression\n[ ] Solving Inverse Problems With Physics-Informed DeepONet: A Practical Guide With Code Implementation\n[ ] Introduction to Physics-informed Neural Networks\n[ ] Solving ODE system with PINN\n[ ] Mathematics for Machine Learning and Simulation\n[ ] Physics-Informed Neural Networks (PINNs) - An Introduction - Ben Moseley | The Science Circle\n[ ] Teaching Neural Network to Solve Navier-Stokes Equations\n[ ] Physics-Informed Neural Networks in Julia\n[ ] Scientific AI: Domain Models With Integrated Machine Learning | Chris Rackauckas | JuliaCon 2019","category":"page"},{"location":"Notes/Life/","page":"-","title":"-","text":"","category":"page"},{"location":"Notes/Life/","page":"-","title":"-","text":"kanban-plugin: basic","category":"page"},{"location":"Notes/Life/","page":"-","title":"-","text":"","category":"page"},{"location":"Notes/Life/#Organização-pessoal","page":"-","title":"Organização pessoal","text":"","category":"section"},{"location":"Notes/Life/","page":"-","title":"-","text":"[ ] Nouvelle acte de mariage\n[ ] Add LibreOffice and Obsidian to scientific-environment\n[ ] Garantia Shokz\n[ ] Concluir/enviar dossier de naturalização\n[ ] RDV Ophtalmologue\n[ ] Terminar update to clubot com envio de emails\n[ ] Atualizar CV Lattes\n[ ] Aplicar validação do doutorado\n[ ] Migrar planejamento de DryTooling.jl aqui\n[ ] Check purchase of new tower\n[ ] Pédalier Shimano Deore FC 30 dents\n[ ] Chambre à air X2\n[ ] Organizar e mover links de esportes à página\n[ ] Terminar de organizar links técnicos nas páginas de bookmarks.\n[ ] Deploy paperless\n[ ] Deploy Wiki.js","category":"page"},{"location":"Notes/Life/#OpenFOAM","page":"-","title":"OpenFOAM","text":"","category":"section"},{"location":"Notes/Life/","page":"-","title":"-","text":"[ ] Start creating a CHT case step-by-step from aachenBombSteady (compatible with radiation and wall heat losses)\n[ ] (paper C2H2) migrate to OpenFOAM11 and publish\n[ ] (aachenBomb) Provide post-processing\n[ ] (aachenBombSteady) Finish case construction\n[ ] Test this function for post-processing.\n[ ] Add case for testing PSD\n[ ] (sedimentationBox): export STL model from SpaceClaim and mesh in snappyHexMesh\n[ ] (sedimentationBox): Impose flow rate at outlet with pressure inlet if possible\n[ ] (sedimentationBox) Post-process cases\n[ ] (horizontalMixer) Compute fractional mass in system with respected to injected (extract from log files).\n[ ] (horizontalMixer) Work towards enabling particleTracks in cloudFunctions.\n[ ] (horizontalMixer) Ensure individual time-steps converged during solution (residuals get first value only).\n[ ] (horizontalMixer) Plots of data in patchFlowRate(patch=outlet, cloud:massFlux) files.\n[ ] (horizontalMixer) Process lagrangian/cloud/patchPostProcessing1/* (Julia script ongoing).\n[ ] (horizontalMixer) Explore solution configuration.\n[ ] (horizontalMixer) Organize scripts as a single module and runners.\n[ ] (horizontalMixer) Download all related papers!\n[ ] (horizontalMixer) learn from Clérac's fvSolution for better controls","category":"page"},{"location":"Notes/Life/#Cursos-online","page":"-","title":"Cursos online","text":"","category":"section"},{"location":"Notes/Life/","page":"-","title":"-","text":"[ ] Computational thinking\n[ ] Course SciML\n[ ] Mecânica Newtoniana\n[ ] Mêcânica de pontos materiais\n[ ] Mêcânica de corpos massivos\n[ ] Mecânica Lagrangiana\n[ ] Cursos MITx (ver dashboard)\n[ ] Cursos EDx (ver dashboard)\n[ ] Videos OpenFOAM 9\n[ ] Tutorials Doggo dot Jl\n[ ] Concluir Introduction to Simulation (EDX)\n[ ] Concluir Ansys Track\n[ ] Concluir Cornell SimCafe\n[ ] Introduction to numerical analysis\n[ ] Michigan State FEM + deal.ii\n[ ] Computational methods on aerospace engineering\n[ ] Boltzmann Law EDX\n[ ] Verificar pacotes FEM\n[ ] Code Saturne\n[ ] Yade-OpenFOAM coupling\n[ ] Kratos\n[ ] Tutoriais Simon Gravelle\n[ ] Tutoriais Mark Tschopp\n[ ] Tutoriais Nuwan Dewapriya\n[ ] Estudar ESPResSo\n[ ] Estudar Quantum Espresso","category":"page"},{"location":"Notes/Life/#Portfolio","page":"-","title":"Portfolio","text":"","category":"section"},{"location":"Notes/Life/","page":"-","title":"-","text":"[ ] Comparison of drag models using a sedimentation box in OpenFOAM\n[ ] Cyclone separator with MPPIC cloud in OpenFOAM\n[ ] Setup of thermophysical properties with temperature dependence\n[ ] Droplet combustion with arbitrary user-defined composition\n[ ] Multicomponent airlock system\n[ ] Arbitrary user-defined gas phase kinetics with Graf (2007)\n[ ] Carbonitriding model with example of complex part\n[ ] Spray dryer\n[ ] Coded reactor wall coupling\n[ ] Simplified acetylene kinetics model\n[ ] Estudar MFiX","category":"page"},{"location":"Notes/Life/","page":"-","title":"-","text":"%% kanban:settings","category":"page"},{"location":"Notes/Life/","page":"-","title":"-","text":"{\"kanban-plugin\":\"basic\"}","category":"page"},{"location":"Notes/Life/","page":"-","title":"-","text":"%%","category":"page"},{"location":"References/@Mittemeijer1988/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Mittemeijer1988/","page":"-","title":"-","text":"title: \"Analysis of nonisothermal transformation kinetics; tempering of iron-carbon and iron-nitrogen martensites\" authors: E. J. Mittemeijer, Liu Cheng, P. J. van der Schaaf, C. M. Brakman, B. M. Korevaar year: 1988 –-","category":"page"},{"location":"References/@Guo2023c/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Guo2023c/","page":"-","title":"-","text":"title: \"Unraveling the design pattern of physics-informed neural networks: Series 03\" authors: Shuai Guo year: 2023 URL: https://towardsdatascience.com/unraveling-the-design-pattern-of-physics-informed-neural-networks-part-03-fe365ef480d9 –- Discussed [[@Krishnapriyan2021a]]","category":"page"},{"location":"Science/10-Continuum-Mechanics/#Reatores-pistão","page":"Reatores pistão","title":"Reatores pistão","text":"","category":"section"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"#plug-flow","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"Escoamentos nos quais a componente axial do transporte por advecção é dominante sobre o transporte difusivo aproximam-se do comportamento dito pistão. Neste caso o número de Péclet (ver transport para mais detalhes) tende ao infinito.","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"A temática de reatores pistão apresenta grande interesse para o cientista e engenheiro dados os fatos de que (1) frequentemente instalações experimentais no laboratório podem ser caracterizadas como estando neste regime limite e (2) com a composição de reatores pistão e agitados é possível compor modelos de reatores mais complexos de utilidade industrial. A introdução desenvolvida aqui parte da apresentação feita por Kee2017 [74] para então desenvolver uma abordagem algorítmica para solução de reatores quaisquer. A abordagem de engenharia de reatores empregando modelos compostos não será apresentada, o leitor interessado podendo encontrá-la em Fogler1999 [75].","category":"page"},{"location":"Science/10-Continuum-Mechanics/#Um-primeiro-modelo","page":"Reatores pistão","title":"Um primeiro modelo","text":"","category":"section"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"Para a introdução do tópico vamos aborda o estabelecimento do modelo e as equações de conservação necessárias. No presente caso, isso será feiro na ausência de reações químicas e trocas de matéria com o ambiente - o reator é um tubo fechado - precisamos estabelecer a conservação de massa e energia apenas. Como dito, o reator em questão conserva a massa transportada, o que é matematicamente expresso pela ausência de variação axial do fluxo de matéria, ou seja","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"fracd(rhou)dz=0","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"Mesmo que trivial, esse resultado é frequentemente útil na simplificação das outras equações de conservação para um reator pistão, como veremos (com frequência) mais tarde.","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"Embora não trocando matéria com o ambiente a través das paredes, vamos considerar aqui trocas térmicas. Afinal não parece muito útil um modelo de reator sem trocas de nenhum tipo nem reações. Da primeira lei da Termodinâmica temos que a taxa de variação da energia interna E é igual a soma das taxas de trocas de energia Q e do trabalho realizado W.","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"fracdEdt= fracdQdt+ fracdWdt","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"Podemos reescrever essa equação para uma seção transversal do reator de área A_c em termos das grandezas específicas e densidade rho com as integrais","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"#divergence-theorem","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"int_OmegarhoemathbfVcdotpmathbfndA_c=\ndotQ-\nint_OmegapmathbfVcdotpmathbfndA_c","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"Com a definição de entalpia h podemos simplificar essa equação e obter","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"int_OmegarhohmathbfVcdotpmathbfndA_c=\ndotQqquadtextaondeqquadh = e+fracprho","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"Usando o teorema de Gauss transformamos essa integral sobre a superfície num integral de divergência sobre o volume diferencial dV, o que é útil na manipulação de equações de conservação","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"int_OmegarhohmathbfVcdotpmathbfndA_c=\nint_Vnablacdotp(rhohmathbfV)dV","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"Nos resta ainda determinar dotQ. O tipo de interação com ambiente, numa escala macroscópica, não pode ser representado por leis físicas fundamentais. Para essa representação necessitamos de uma lei constitutiva que modela o fenômeno em questão. Para fluxos térmicos convectivos à partir de uma parede com temperatura fixa T_s a forma análoga a uma condição limite de Robin expressa o dotQ como","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"dotQ=hathA_s(T_s-T)=hath(Pdz)(T_s-T)","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"O coeficiente de troca térmica convectiva hath é frequentemente determinado à partir do tipo de escoamento usando fórmulas empíricas sobre o número de Nusselt. A abordagem desse tópico vai além do nosso escopo e assume-se que seu valor seja conhecido. Nessa expressão já transformamos a área superficial do reator A_s=Pdz o que nos permite agrupar os resultados em","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"int_Vnablacdotp(rhohmathbfV)dV=\nhath(Pdz)(T_w-T)","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"Em uma dimensão z o divergente é simplemente a derivada nessa coordenada. Usando a relação diverencial deltaV=A_cdz podemos simplificar a equação para a forma diferencial como se segue","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"fracd(rhouh)dz=\nfrachathPdzdeltaV(T_w-T)\nimplies\nfracd(rhouh)dz=\nfrachathPA_c(T_w-T)","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"A expressão acima já consitui um modelo para o reator pistão, mas sua forma não é facilmente tratável analiticamente. Empregando a propriedade multiplicativa da diferenciaÇão podemos expandir o lado esquedo da equação como","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"rhoufracdhdz+hfracd(rhou)dz=\nfrachathPA_c(T_w-T)","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"O segundo termo acima é nulo em razão da conservação da matéria, como discutimos anteriormente. Da definição diferencial de entalpia dh=c_pdT chegamos a formulação do modelo na temperatura como dado no título dessa seção.","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"rhouc_pA_cfracdTdz=\nhathP(T_w-T)","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"Vamos agora empregar esse modelo para o cálculo da distribuição axial de temperatura ao longo do reator. No que se segue assume-se um reator tubular de seção circular de raio R e todos os parâmetros do modelo são constantes.","category":"page"},{"location":"Science/10-Continuum-Mechanics/#Integração-analítica","page":"Reatores pistão","title":"Integração analítica","text":"","category":"section"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"Esse problema permite uma solução analítica simples que desenvolvemos de maneira um pouco abrupta no que se segue. Separando os termos em T (variável dependente) e z (variável independente) e integrando sobre os limites adequados obtemos","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"int_T_0^TfracdTT_w-T=\nfrachathPrhouc_pA_cint_0^zdz=\nmathcalC_0z","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"Na expressão acima mathcalC_0 não é uma constante de integração mas apenas regrupa os parâmetros do modelo. O termo em T pode ser integrado por uma substituição trivial","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"u=T_w-T implies -intfracduu=log(u)biggrvert_u_0^u+mathcalC_1","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"Realizando a integração definida e resolvendo para T chegamos a","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"T=T_w-(T_w-T_0)expleft(-mathcalC_0z+mathcalC_1right)","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"É trivial verificar com T(z=0)=T_0 que mathcalC_1=0 o que conduz à solução analítica:","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"T=T_w-(T_w-T_0)expleft(-frachathPrhouc_pA_czright)","category":"page"},{"location":"Science/10-Continuum-Mechanics/#Método-dos-volumes-finitos","page":"Reatores pistão","title":"Método dos volumes finitos","text":"","category":"section"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"#finite-volume-method","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"Quando integrando apenas um reator, o método de integração numérica da equação é geralmente a escolha mais simples. No entanto, em situações nas quais desejamos integrar trocas entre diferentes reatores aquela abordagem pode se tornar proibitiva. Uma dificuldade que aparece é a necessidade de solução iterativa até convergência dados os fluxos pelas paredes do reator, o que demandaria um código extremamente complexo para se gerir em integração direta. Outro caso são trocadores de calor que podem ser representados por conjuntos de reatores em contra-corrente, um exemplo que vamos tratar mais tarde nesta série. Nestes casos podemos ganhar em simplicidade e tempo de cálculo empregando métodos que linearizam o problema para então resolvê-lo por uma simples álgebra linear.","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"Na temática de fenômenos de transporte, o método provavelmente mais frequentemente utilizado é o dos volumes finitos (em inglês abreviado FVM). Note que em uma dimensão com coeficientes constantes pode-se mostrar que o método é equivalente à diferenças finitas (FDM), o que é nosso caso neste problema. No entanto vamos insistir na tipologia empregada com FVM para manter a consistência textual nos casos em que o problema não pode ser reduzido à um simples FDM.","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"No que se segue vamos usar uma malha igualmente espaçada de maneira que nossas coordenadas de solução estão em zin0delta2deltadotsNdelta e as interfaces das células encontram-se nos pontos intermediários. Isso dito, a primeira e última célula do sistema são meias células, o que chamaremos de condição limite imersa, contrariamente à uma condição ao limite com uma célula fantasma na qual o primeiro ponto da solução estaria em z=delta2. Trataremos esse caso em outra ocasião.","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"O problema de transporte por advecção em um reator pistão é essencialmente upwind, o que indica que a solução em uma célula E a leste de uma célula P depende exclusivamente da solução em P. Veremos o impacto disto na forma matricial trivial que obteremos na sequência. Para a sua construção, começamos pela integração do problema entre P e E, da qual se segue a separação de variáveis","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"int_T_P^T_Erhouc_pA_cdT=\nint_0^deltahathP(T_s-T^star)dz","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"Observe que introduzimos a variável T^star no lado direito da equação e não sob a integral em dT. Essa escolha se fez porque ainda não precisamos definir qual a temperatura mais representativa deve-se usar para o cálculo do fluxo térmico. Logo vamos interpretá-la como uma constante que pode ser movida para fora da integral","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"rhouc_pA_cint_T_P^T_EdT=\nhathP(T_s-T^star)int_0^deltadz","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"Realizando-se a integração definida obtemos a forma paramétrica","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"rhouc_pA_c(T_E-T_P)=\nhathPdelta(T_s-T^star)","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"Para o tratamento com FVM agrupamos parâmetros para a construção matricial, o que conduz à","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"aT_E-aT_P=\nT_s-T^star","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"No método dos volumes finitos consideramos que a solução é constante através de uma célula. Essa hipótese é a base para construção de um modelo para o parâmetro T^star na presente EDO. Isso não deve ser confundido com os esquemas de interpolação que encontramos em equações diferenciais parciais.","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"A ideia é simples: tomemos um par de células P e E com suas respectivas temperaturas T_P e T_E. O limite dessas duas células encontra-se no ponto médio entre seus centros, que estão distantes de um comprimento delta. Como a solução é constante em cada célula, entre P e a parede o fluxo de calor total entre seu centro e a fronteira e com a célula E é","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"dotQ_P-e = hathP(T_s-T_P)delta_P-e=\nfrachathPdelta2(T_s - T_P)","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"De maneira análoga, o fluxo entre a fronteira e e o centro de E temos","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"dotQ_e-E = hathP(T_s-T_E)delta_e-E=\nfrachathPdelta2(T_s-T_E)","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"Nas expressões acima usamos a notação em letras minúsculas para indicar fronteiras entre células. A célula de referência* é normalmente designada P, e logo chamamos a fronteira pela letra correspondendo a célula vizinha em questão, aqui E. O fluxo convectivo total entre P e E é portanto","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"dotQ_P-E=dotQ_P-e+dotQ_e-E=\nhathPleftT_s-frac(T_E+T_P)2right","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"de onde adotamos o modelo","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"T^star=fracT_E+T_P2","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"A troca convectiva com a parede não seria corretamente representada se escolhessemos T_P como referência para o cálculo do fluxo (o que seria o caso em FDM). Obviamente aproximações de ordem superior são possíveis empregando-se mais de duas células mas isso ultrapassa o nível de complexidade que almejamos entrar no momento.","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"Aplicando-se esta expressão na forma numérica precedente, após manipulação chega-se à","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"(2a + 1)T_E=\n(2a - 1)T_P + 2T_w","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"Com algumas manipulações adicionais obtemos a forma que será usada na sequência","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"-A^-T_P + A^+T_E=1\nquadtextaondequad\nA^pm = frac2a pm 12T_w","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"A expressão acima é válida entre todos os pares de células PrightarrowE no sistema, exceto pela primeira. Como se trata de uma EDO, a primeira célula do sistema contém a condição inicial T_0 e não é precedida por nenhuma outra célula e evidentemente não precisamos resolver uma equação adicional para esta. Considerando o par de vizinhos PrightarrowEequiv0rightarrow1, substituindo o valor da condição inicial obtemos a modificação da equação para a condição inicial imersa","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"A^+T_1=1 + A^-T_0","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"Como não se trata de um problema de condições de contorno, nada é necessário para a última célula do sistema. Podemos agora escrever a forma matricial do problema que se dá por","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"beginbmatrix\n A^+ 0 0 dots 0 0 \n-A^- A^+ 0 dots 0 0 \n 0 -A^- A^+ ddots 0 0 \nvdots ddots ddots ddots ddots vdots \n 0 0 0 -A^- A^+ 0 \n 0 0 0 0 -A^- A^+ \nendbmatrix\nbeginbmatrix\nT_1 \nT_2 \nT_3 \nvdots \nT_N-1 \nT_N \nendbmatrix\n=\nbeginbmatrix\n1 + A^-T_0 \n1 \n1 \nvdots \n1 \n1 \nendbmatrix","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"A dependência de E somente em P faz com que tenhamos uma matriz diagonal inferior, aonde os -A^- são os coeficientes de T_P na formulação algébrica anterior. A condição inicial modifica o primeiro elemento do vetor constante à direita da igualdade.","category":"page"},{"location":"Science/10-Continuum-Mechanics/#Formulação-na-entalpia","page":"Reatores pistão","title":"Formulação na entalpia","text":"","category":"section"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"Em diversos casos a forma expressa na temperatura não é conveniente. Esse geralmente é o caso quando se inclui transformações de fase no sistema. Nessas situações a solução não suporta integração direta e devemos recorrer a um método iterativo baseado na entalpia. Isso se dá pela adição de uma etapa suplementar da solução de equações não lineares para se encontrar a temperatura à qual a entalpia corresponde para se poder avaliar as trocas térmicas.","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"Para se efetuar a integração partimos do modelo derivado anteriormente numa etapa antes da simplificação final para solução na temperatura e agrupamos os parâmetros livres em a","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"fracdhdz=frachathPrhouA_c(T_s-T^star)=a(T_s-T^star)","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"É interessante observar que toda a discussão precedente acerca de porque não integrar sobre T^star perde seu sentido aqui: a temperatura é claramente um parâmetro.","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"int_h_P^h_Ndh=a^primeint_0^delta(T_s-T^star)dz","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"Seguindo um procedimento de integração similar ao aplicado na formulação usando a temperatura chegamos a equação do gradiente fazendo a=a^primedelta","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"h_E-h_P=aT_s-aT^star","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"Seguindo a mesma lógica discutida na formulação na temperatura, introduzimos a relação de interpolação T^star=(12)(T_E+T_P) e aplicando-se esta expressão na forma numérica final, após manipulação chega-se à","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"-2h_P+2h_E=2aT_s-aT_E-aT_P","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"Essa expressão permite a solução da entalpia e a atualização do campo de temperaturas se faz através da solução de uma equação não linear do tipo h(T_P)-h_P=0 por célula.","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"Substituindo a temperatura inicial T_0 e sua entalpia associada h_0 na forma algébrica do problema encontramos a primeira linha da matriz que explicita as modificações para se implementar a condição inicial do problema","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"2h_1=2aT_s-aT_1-aT_0-2h_0","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"Completamos assim as derivações para se escrever a forma matricial","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"beginbmatrix\n 2 0 0 dots 0 0 \n-2 2 0 dots 0 0 \n 0 -2 2 ddots 0 0 \nvdots ddots ddots ddots ddots vdots \n 0 0 0 -2 2 0 \n 0 0 0 0 -2 2 \nendbmatrix\nbeginbmatrix\nh_1 \nh_2 \nh_3 \nvdots \nh_N-1 \nh_N \nendbmatrix\n=\nbeginbmatrix\nf_01 + 2h(T_0) \nf_12 \nf_23 \nvdots \nf_N-2N-1 \nf_N-1N \nendbmatrix","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"No vetor do lado direito introduzimos uma função de f dada por","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"f_ij = 2aT_s - a(T_i+T_j)","category":"page"},{"location":"Science/10-Continuum-Mechanics/#Solução-em-volumes-finitos","page":"Reatores pistão","title":"Solução em volumes finitos","text":"","category":"section"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"#finite-volume-method ","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"Como as temperaturas usadas no lado direito da equação não são conhecidas inicialmente, o problema tem um caráter iterativo intrínseco. Inicializamos o lado direito da equação para em seguida resolver o problema na entalpia, que deve ser invertida (equações não lineares) para se atualizar as temperaturas. Isso se repete até que a solução entre duas iterações consecutivas atinja um critério de convergência.","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"Como a estimativa inicial do campo de temperaturas pode ser extremamente ruim, usamos um método com relaxações consecutivas da solução no caminho da convergência. A ideia de base é evitar atualizações bruscas que podem gerar temperaturas negativas ou simplesmente divergir para o infinito. A cada passo, partindo das temperaturas T^(m), aonde m é o índice da iteração, resolvemos o sistema não-linear para encontrar T^(m+1)^prime. Pelas razões citadas, não é razoável utilizar essa solução diretamente, portanto realizamos a ponderação, dita relaxação, que se segue","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"T^(m+1)=(1-alpha)T^(m+1)^prime+αT^(m)","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"O fator alpha representa neste caso a fração de contribuição da solução anterior a nova estimativa. Essa é somente a ponta do iceberg em termos de relaxação e ao longo da série veremos em mais detalhes o conceito. Como critério de parada do cálculo, o que chamamos convergência, queremos que a máxima atualização DeltaT relativa do campo de temperaturas seja menor que um critério varepsilon, ou seja","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"maxfracvertT^(m+1)-T^(m)vertvertmaxT^(m)vert=\nmaxbiggrvertfracDeltaTmaxT^(m)biggrvertvarepsilon","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"Para evitar cálculos separados da nova temperatura e então da variação, podemos usar as definições acima para chegar à","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"DeltaT = (1-alpha)(T^(m+1)^prime-T^(m))","category":"page"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"e então atualizar a solução com T^(m+1)=T^(m)+DeltaT.","category":"page"},{"location":"Science/10-Continuum-Mechanics/#To-do","page":"Reatores pistão","title":"To-do","text":"","category":"section"},{"location":"Science/10-Continuum-Mechanics/","page":"Reatores pistão","title":"Reatores pistão","text":"Abordagem do modelo apresentado em Bird2001 [4] 10.5.\nNusselt variável segundo Bird2001 [4] Tab. 14.2.","category":"page"},{"location":"Notebooks/09-Thermodynamic-Props/#Thermodynamic-properties","page":"Thermodynamic properties","title":"Thermodynamic properties","text":"","category":"section"},{"location":"Notebooks/09-Thermodynamic-Props/","page":"Thermodynamic properties","title":"Thermodynamic properties","text":"using Revise\nusing WallyToolbox\nusing CairoMakie\n\ndisable_thermo_warnings()","category":"page"},{"location":"Notebooks/09-Thermodynamic-Props/","page":"Thermodynamic properties","title":"Thermodynamic properties","text":"data = ThermoDatabase(; selected_compounds = \"*\")\ncompounds(data)","category":"page"},{"location":"Notebooks/09-Thermodynamic-Props/#Comparison-of-silica-properties","page":"Thermodynamic properties","title":"Comparison of silica properties","text":"","category":"section"},{"location":"Notebooks/09-Thermodynamic-Props/","page":"Thermodynamic properties","title":"Thermodynamic properties","text":"with_theme() do\n f = Figure()\n ax = Axis(f[1, 1])\n \n selected_compounds = [\"SIO2_ALPHA\"]\n data = ThermoDatabase(; selected_compounds)\n display(compounds(data))\n\n T = LinRange(300.0, 847.0, 100)\n cp1l(t) = specific_heat(data.compounds[1], t)\n cp2l(t) = specific_heat(data.compounds[2], t)\n lines!(ax, T, cp1l.(T); color = :black)\n lines!(ax, T, cp2l.(T); color = :red)\n\n\n selected_compounds = [\"SIO2_BETA\"]\n data = ThermoDatabase(; selected_compounds)\n display(compounds(data))\n \n T = LinRange(847.0, 1996.0, 100)\n cp1h(t) = specific_heat(data.compounds[1], t)\n cp2h(t) = specific_heat(data.compounds[2], t)\n lines!(ax, T, cp1h.(T); color = :black, label = \"Chase (1998)\")\n lines!(ax, T, cp2h.(T); color = :red, label = \"Schieltz (1964)\")\n axislegend(ax; position = :lt)\n\n xlims!(ax, 300, 2000)\n ylims!(ax, 700, 1400)\n f\nend","category":"page"},{"location":"Notebooks/09-Thermodynamic-Props/#Comparison-of-alumina-properties","page":"Thermodynamic properties","title":"Comparison of alumina properties","text":"","category":"section"},{"location":"Notebooks/09-Thermodynamic-Props/","page":"Thermodynamic properties","title":"Thermodynamic properties","text":"with_theme() do\n f = Figure()\n ax = Axis(f[1, 1])\n \n selected_compounds = [\"AL2O3_GAMMA\"]\n data = ThermoDatabase(; selected_compounds)\n display(compounds(data))\n \n T = LinRange(300.0, 2000.0, 100)\n cp1(t) = specific_heat(data.compounds[1], t)\n cp2(t) = specific_heat(data.compounds[2], t)\n lines!(ax, T, cp1.(T); color = :black, label = \"Chase (1998)\")\n lines!(ax, T, cp2.(T); color = :red, label = \"Schieltz (1964)\")\n axislegend(ax; position = :lt)\n f\nend","category":"page"},{"location":"Notebooks/09-Thermodynamic-Props/#Testing-silica-values","page":"Thermodynamic properties","title":"Testing silica values","text":"","category":"section"},{"location":"Notebooks/09-Thermodynamic-Props/","page":"Thermodynamic properties","title":"Thermodynamic properties","text":"let\n selected_compounds = [\"SIO2_ALPHA\"]\n data = ThermoDatabase(; selected_compounds)\n # display(compounds(data))\n \n T = [298.0, 300.0, 400.0]\n c = [44.57, 44.77, 53.43]\n \n sio2 = data.compounds[1]\n cp1(t) = specific_heat(sio2, t) * molecularmass(sio2)\n test1 = log10(sum(abs2, cp1.(T) - c)) < -4\n\n selected_compounds = [\"SIO2_BETA\"]\n data = ThermoDatabase(; selected_compounds)\n # display(compounds(data))\n \n T = [847.0, 900.0, 1900.0]\n c = [67.42, 67.95, 77.99]\n \n sio2 = data.compounds[1]\n cp2(t) = specific_heat(sio2, t) * molecularmass(sio2)\n test2 = log10(sum(abs2, cp2.(T) - c)) < -4\n\n test1 && test2\nend","category":"page"},{"location":"Computing/05-Postprocessing/#Postprocessing","page":"Postprocessing","title":"Postprocessing","text":"","category":"section"},{"location":"Computing/05-Postprocessing/#ParaView","page":"Postprocessing","title":"ParaView","text":"","category":"section"},{"location":"Computing/05-Postprocessing/","page":"Postprocessing","title":"Postprocessing","text":"Video tutorial by Cyprien Rusu\nVideo tutorial at TuxRiders","category":"page"},{"location":"References/@Antonelo2021a/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Antonelo2021a/","page":"-","title":"-","text":"title: Physics-informed neural nets for control of dynamical systems authors: Eric Aislan Antonelo, Eduardo Camponogara, Laio Oriel Seman, Eduardo Rehbein de Souza, Jean P. Jordanou, Jomi F. Hubner year: 2021 URL: https://doi.org/10.48550/arXiv.2104.02556 –-","category":"page"},{"location":"References/@Gorog1981a/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Gorog1981a/","page":"-","title":"-","text":"title: Radiative heat transfer in rotary kilns authors: J. P. Gorog, J. K. Brimacombe, T. N. Adams year: 1981 –-","category":"page"},{"location":"References/@Pena2001a/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Pena2001a/","page":"-","title":"-","text":"title: Stability of Turing patterns in the Brusselator model authors: B. Peña, C. Pérez-García year: 2001 URL: https://doi.org/10.1103/PhysRevE.64.056213 Drive: –-","category":"page"},{"location":"References/@Tam2019/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Tam2019/","page":"-","title":"-","text":"title: OpenSC: an open-source calculation tool for combustion mixture emissivity/absorptivity authors: Wai Cheong Tam, Walter W. Yuen year: 2019 –-","category":"page"},{"location":"References/@Onsager1931/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Onsager1931/","page":"-","title":"-","text":"title: Reciprocal relations in irreversible processes. I. authors: Lars Onsager year: 1931 –-","category":"page"},{"location":"Software/Elmer/#Elmer-Multiphysics","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"","category":"section"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"Elmer is a multiphysics finite element method (FEM) solver mainly developed by CSC and maintained at GitHub. Several resources can be found in is official webpage and in the community portal and in the forum. There is also an YouTube channel with several tutorials and illustration of the package capabilities.","category":"page"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"The goal of this page is not to supersede the documentation, but to make it (partially) available as a webpage where search and navigation become more intuitive. Notice that this will be fed according to my personal projects and learning, so any contribution to accelerate the process is welcome. Here you find a user-guide-style page with more details are provided below in the selected notes of Elmer documentation.","category":"page"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"","category":"page"},{"location":"Software/Elmer/#Read-me-first","page":"Elmer Multiphysics","title":"Read me first","text":"","category":"section"},{"location":"Software/Elmer/#Quick-answers","page":"Elmer Multiphysics","title":"Quick answers","text":"","category":"section"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"Is Elmer the adequate tool for my projects? In this document you find a short introduction to what Elmer can do and the main executables. \nHow do I start learning Elmer? Simply put, Elmer does not require basic users to master all the fundamentals of FEM, so following the getting started guide seems a good starting point. There you learn how to install, configure, and run the software.\nWhere do I get the binaries of Elmer? If willing to run in Windows, the previous link provides the compiled binaries; there are also instructions for installing directly in Ubuntu as well as all the documentation and other test and sample cases.\nI feel alone, where do I find other users? The forum seems to be moderately active, so you can go there to chat with other users and developers if you are not in a hurry.","category":"page"},{"location":"Software/Elmer/#Limitations-and-issues","page":"Elmer Multiphysics","title":"Limitations and issues","text":"","category":"section"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"Currently the GUI is not able to import SIF files generated manually because it stores its state in a XML file; to be able to re-run cases from the GUI users need to create the equivalent case (eventually using the free text fields) in the GUI itself before regenerating a SIF file. Notice that this will overwrite the SIF file, so keep in mind to backup the file in another directory; that is especially required for highly customized cases.\nWhen exporting meshes from gmsh, consider using the extension .msh and not .msh2 as is often seen as a reminder of format 2 mesh; Elmer GUI is unable to render the mesh in this case. Notice that this has apparently no effect if running from command line.","category":"page"},{"location":"Software/Elmer/#Ongoing-work","page":"Elmer Multiphysics","title":"Ongoing work","text":"","category":"section"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"Development of a VS Code syntax highlight extension with help of data provided in SOLVER.KEYWORDS.","category":"page"},{"location":"Software/Elmer/#Retrieving-materials","page":"Elmer Multiphysics","title":"Retrieving materials","text":"","category":"section"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"Because there are plenty of interesting materials in Elmer public directory, it is worth downloading it all and selecting what to keep later. In a Linux terminal one could run the following command. If you also want to retrieve the animations, binaries, and virtual machines, consider removing and/or modifying the -X options.","category":"page"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"#!/usr/bin/env bash\n\nURL=\"https://www.nic.funet.fi/pub/sci/physics/elmer/\"\n\nwget -r -l 20 --no-parent \\\n -X /pub/sci/physics/elmer/anim/ \\\n -X /pub/sci/physics/elmer/bin/ \\\n -R \"index.html*\" \\\n ${URL}","category":"page"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"","category":"page"},{"location":"Software/Elmer/#Elmer-Fundamentals","page":"Elmer Multiphysics","title":"Elmer Fundamentals","text":"","category":"section"},{"location":"Software/Elmer/#Preprocessing-steps","page":"Elmer Multiphysics","title":"Preprocessing steps","text":"","category":"section"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"Other than the native ElmerGrid, several other software can be used for conceiving a geometry and mesh generation workflow. Users are encouraged to use external tools such as gmsh or Salome to generate computational meshes, built-in support in Elmer bein limited to very simple geometries only. For complex geometries FreeCAD is a standout alternative. For more consider reading Geometry and Preprocessing.\nNot all gmsh standard mesh formats are supported, but only version 2 (as for OpenFOAM); that said, users are encouraged to export mesh in UNV format to avoid compatibility issues, and also because both proposed tools support it. You can control the element orders in command line using option -order ; gmsh operates this way so that the same script can generate any supported element type.\nFor importing meshes one uses ElmerGrid , where the format arguments are documented in the manual sections 1.3 and 1.4. The UNV input is given by number 8 while standard ElmerSolver output by number 2, so that the conversion command would start with ElmerGrid 8 2 . Always verify the number of nodes remain untouched after conversion - or if it changed when using option -merge , merging nodes that are closer than the user-defined .\nRemember to use Coherence; with OpenCASCADE factory in gmsh scripts to automatically strip internal faces; that might not be enough for complex cases, see below. Note: I tried doing so and unless Physical Surfaces naming the external boundaries are provided every interface is dumped and imported by Elmer; maybe I misunderstood the use of command!\nBecause faces are not named in Elmer, i.e. no matter what Physical Surface names you provide in gmsh, even for the advanced user working from command line it might be interesting to use the interactive zone grouping capabilities of ElmerGUI. That might even become a requirement as geometric complexity grows.","category":"page"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"Software Notes\nFreeCAD Geometry only for now, probably the best in the list; good parametric modeling support.\nSalome Can export UNV (8) meshes readable by Elmer. An extension to call Elmer directly from Salome is under development.\ngmsh Can export MSH2 (14) and UNV (8) formats readable by Elmer.\nnetgen Is able to write native Elmer linear meshes; can be used as a plug-in.\ntetgen Can be used as a plug-in.","category":"page"},{"location":"Software/Elmer/#Using-Elmer","page":"Elmer Multiphysics","title":"Using Elmer","text":"","category":"section"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"Newcomers might be interested in ElmerGUI; although very intuitive, the interface is quite limited and for complex programs running from command line is the preferred mode.\nMost users will finally end setting up an workflow employing both to ElmerSolver (to run the simulations) and ElmerGrid (to prepare the grid and setup parallelization).\nThere is also ViewFactors which might be useful in special cases involving radiation and other executables but they are not mentioned here because they fall in the legacy code family.\nUsers must be aware that Elmer has no default unit system; one must take care that units are coherent across the different models and materials.\nSupport to mathematical operations in SIF through MATC, which has its own syntax and documentation. It can be used, e.g. for computing temperature dependent properties, what can be helpful for simple expressions (instead of writing Fortran 90 code for extensions).","category":"page"},{"location":"Software/Elmer/#Parallel-computing","page":"Elmer Multiphysics","title":"Parallel computing","text":"","category":"section"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"Before running in parallel a working case running in serial is required; using ElmerGUI this can be enabled in Run > Parallel settings.... Notice that after running postprocessing of .pvtu needs to be done in ParaView directly.\nTo partition the mesh from command line one needs to run ElmerGrid 2 2 -partdual -metiskway , which will convert from Elmer mesh format (2) into itself (thus the 2 2 in the command) and dump the resulting mesh in partitions., with being the number of physical cores to run the simulation.\nParallel cases can be run with mpiexec -n ElmerSolver_mpi. Notice that under Linux the MPI runner is called mpirun instead of mpiexec.","category":"page"},{"location":"Software/Elmer/#Tips-and-ideas","page":"Elmer Multiphysics","title":"Tips and ideas","text":"","category":"section"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"Use Coordinate Mapping to rotate meshes with oriented particles\nScaling of a single direction can be done with Coordinate Scaling\nTime step can be changed with a list of elements in Timestep Intervals, e.g.","category":"page"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"! Run 10 time-steps of 0.1 s, then 100 with 1.0 s.\nTimestep Intervals(2) = 10 100\nTimestep Sizes(2) = 0.1 1.0","category":"page"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"Take care with Linear System Abort Not Converged = True for physical consistency; generally continuing a simulation after a failed step is worthless unless one is pseudo-stepping towards a difficult (highly nonlinear) steady-state.","category":"page"},{"location":"Software/Elmer/#Material-properties","page":"Elmer Multiphysics","title":"Material properties","text":"","category":"section"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"Material properties can be specified as:","category":"page"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"Constant: just the default numeric input in SIF files\nTabulated linearly or using a cubic spline, e.g.","category":"page"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"! Linear interpolation\nViscosity = Variable Temperature\n Real\n\t298.15 1.0\n\t! ... more data here\n\t373.15 2.0\nEnd\n\n! Cubic spline interpolation\nViscosity = Variable Temperature\n Real cubic\n\t298.15 1.0\n\t315.15 1.1\n\t345.15 1.5\n\t! ... more data here\n\t373.15 2.0\nEnd","category":"page"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"Arrays: for representing anisotropic bodies, e.g.","category":"page"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"Heat Conductivity(3,3) = 1 0 0\\\n 0 1 0\\\n 0 0 2","category":"page"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"Using MATC as explained below in this page. Notice that sourcing files in MATC is the recommended way to get reusable code; coding MATC in SIF files requires to escape all lines and quickly becomes messy.\nUser-defined functions (UDF) can also be provided in Fortran; notice that even when MATC can be used, this may lead to a speed-up of calculations with the inconvenient of needing more code. So for cases that are intended to be reused, it is important to consider writing proper extensions in Fortran. The following example illustrates a temperature dependent thermal conductivity function which is evaluated by Elmer at all nodes. In most cases a simple USE DefUtils is enough to get the required Elmer API to write the extension.","category":"page"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"FUNCTION conductivity(model, n, time) RESULT(k)\n !**************************************************************\n ! Load Elmer library.\n !**************************************************************\n \n USE DefUtils\n IMPLICIT None\n\n !**************************************************************\n ! Function interface.\n !**************************************************************\n \n TYPE(Model_t) :: model\n INTEGER :: n\n REAL(KIND=dp) :: time, k\n\n !**************************************************************\n ! Function internals.\n !**************************************************************\n \n TYPE(Variable_t), POINTER :: varptr\n REAL(KIND=dp) :: T\n INTEGER :: idx\n\n !**************************************************************\n ! Actual implementation\n !**************************************************************\n\n ! Retrieve pointer to the temperature variable.\n varptr => VariableGet(model%Variables, 'Temperature')\n\n ! Access index of current node.\n idx = varptr%Perm(n)\n\n ! Retrieve nodal temperature.\n T = varptr%Values(idx)\n\n ! Compute heat conductivity from NodalTemperature, k=k(T)\n k = 2.0 - T * (2.5e-03 - 1.0e-06 * T)\nEND FUNCTION conductivity","category":"page"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"In order to compile the above assume it is written to properties.f90 file; then one can call elmerf90 properties.f90 –o properties to generate the required shared library that is loaded in runtime by Elmer. Below we illustrate the use of Procedure to attach this library to a given material; first one provides the name of the shared library then the name of the function. A single library can in fact contain several functionalities.","category":"page"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"Material 1\n Name = \"Solid\"\n Heat Conductivity = Variable Time\n Procedure \"properties\" \"conductivity\"\n Heat Capacity = 1000\n Density = 2500\nEnd","category":"page"},{"location":"Software/Elmer/#Postprocessing","page":"Elmer Multiphysics","title":"Postprocessing","text":"","category":"section"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"For postprocessing the recommended way is by using external tools as ParaView and PyVista, both handling well the VTK format of outputs. Nonetheless there are a some in-solver processing utilities that are worth knowing, especially in what concerns extracting and filtering data from certain regions, creating new fields, and computing fluxes.","category":"page"},{"location":"Software/Elmer/#Creating-a-new-scalar","page":"Elmer Multiphysics","title":"Creating a new scalar","text":"","category":"section"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"The keyword set of materials is actually not fixed; one can, for instance, create composition field in different units with MATC, as illustrated below (case here):","category":"page"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"MoleFraction = Variable Concentration\n Real MATC \"carbonmolefraction(tx)\"","category":"page"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"Then in solver SaveMaterials, this new name MoleFraction can be used as a variable:","category":"page"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"Solver 1\n Equation = SaveMaterials\n Parameter 1 = Concentration Diffusivity\n Parameter 2 = MoleFraction\n Procedure = \"SaveData\" \"SaveMaterials\"\n Exec Solver = After Timestep\nEnd","category":"page"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"Another situation that can be frequently found is unit conversion for temperature. It was chosen to implement it in this case because it is multi-material; that is a reminder that in such cases the new variable needs to be created for all materials (as this is a tweak, since the temperature is not a material property, but a global field). If forgotten in one material, an error will show up in ParaView telling you that the field is not available in some regions.","category":"page"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"","category":"page"},{"location":"Software/Elmer/#Solver-Input-Files-(SIF)","page":"Elmer Multiphysics","title":"Solver Input Files (SIF)","text":"","category":"section"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"Once you get serious with Elmer it is a natural evolution to prefer to work with SIF files instead of the GUI most of the time. This is also true in a majority of scientific computing software. The documentation of SIF is spread over the whole documentation of Elmer and this page tries to consolidate the most of it. For the beginner, this video is a good starting point, this page being more of a reference manual.","category":"page"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"Because syntax highlighting is important for productivity, I am working in a minimalistic extension for VS Code. Its partial development can be found here. After cloning the repository, simply copy the sif/ directory under %USERPROFILE%/.vscode/extensions on in the equivalent directory documented here.","category":"page"},{"location":"Software/Elmer/#MATC","page":"Elmer Multiphysics","title":"MATC","text":"","category":"section"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"Elmer provides a few extension methods. For complex models you might be prompted to use directly Fortran 90. For simpler things, such as providing temperature dependent thermophysical properties, it has its own parser for use in SIF, the metalanguage MATC. Expressions provided in MATC can be evaluated when file is read or during simulation execution.","category":"page"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"Because it is quite concise, I summarized the whole of MATC syntax and functions in this page. For the official documentation please refer to this document.","category":"page"},{"location":"Software/Elmer/#Declaring-variables","page":"Elmer Multiphysics","title":"Declaring variables","text":"","category":"section"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"Variables in MATC can be matrices and strings; nonetheless, both are stored as double precision arrays so creating large arrays of strings can represent a waste of memory. For some weird reason I could not yet figure out, MATC language can be quite counterintuitive.","category":"page"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"Let's start by creating a variable, say x below; attribution, such a in Python, creates the variable. It was stated that everything is a matrix or string; since x is not a string, it is actually a 1times1 matrix and in this case we can omit the indexing when allocating its memory.","category":"page"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"x = 1","category":"page"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"So far nothing weird; when declaring a string as k below we are actually creating a 1times5 row matrix, what is not unusual in many programming languages (except for being double precision here). Furthermore, we use the typical double-quotes notation for strings.","category":"page"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"k = \"hello\"","category":"page"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"Matrix indexing is zero-based, as in C or Python. Matrix slicing is done as in many scripting languages, such as Python, Julia, Octave, ..., and we can reverse the order of the first six elements of an array y as follows: ","category":"page"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"y(0, 0:5) = y(0, 5:0)","category":"page"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"Notice above the fact that matrix slicing is last-inclusive, as in Julia, meaning that all elements from index zero to five inclusive are included in the slice. Weirdness starts when you do something like","category":"page"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"z(0:9) = 142857","category":"page"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"which according to the documentation will produce an array 1 4 2 8 5 7 1 4 2 8; I could not verify this behavior yet. Additionally, the following produces another unexpected result:","category":"page"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"z(9, 9) = 1","category":"page"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"If matrix z does not exist, this results in a 10times10 matrix with all zeros except the explicitly declared element. The size of variables are dynamic, so in the above if z already existed but wa smaller, it would be padded with zeros instead.","category":"page"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"Finally, logical indexing is also allowed:","category":"page"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"x(x < 0.05) = 0.05","category":"page"},{"location":"Software/Elmer/#Control-structures","page":"Elmer Multiphysics","title":"Control structures","text":"","category":"section"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"MATC provides conditionals and loops as control structures. Below we have the if-else statement, which can be declared inline of using a C-style declaration using braces.","category":"page"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"if ( expr ) expr; else expr;\n\nif ( expr )\n{\n expr;\n ...\n expr;\n} else {\n expr;\n ...\n expr;\n}","category":"page"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"Loops can be declared using both for or while. There is no mechanism of generating values within a for loop and one must provide a vector of indexes for repetition. In the official documentation there is no reference to a continue or break statement and I could not verify their existence yet.","category":"page"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"for( i=vector ) expr;\n\nfor( i=vector )\n{\n expr;\n ...\n expr;\n}\n\nwhile( expr ) expr;\n\nwhile( expr )\n{\n expr;\n ...\n expr;\n}","category":"page"},{"location":"Software/Elmer/#Operators","page":"Elmer Multiphysics","title":"Operators","text":"","category":"section"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"Assume the following definitions:","category":"page"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"a, b and c ordinary matrices \nl, t and r logical matrices \ns, n and m scalars ","category":"page"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":" \nb = a' is transpose of matrix a.\nb = @a evaluate content of a string variable a as a MATC statement.\nt = ~l elementwise logical not of if x is not zero.\nb = a ^ s if a is a square matrix and s is integral, a matrix power is computed, otherwise an elementwise power.\nc = a * b if a and b are compatible for matrix product, that is computed, otherwise if they are of the same size or at least one of them is scalar, an elementwise product is computed.\nc = a # b elementwise multiplication of a and b.\nc = a / b is fraction of a and b computed elementwise.\nc = a + b is sum of matrices a and b computed elementwise.\nc = a - b is difference of matrices a and b computed elementwise.\nl = a == b equality of matrices a and b elementwise.\nl = a <> b inequality of matrices a and b elementwise.\nl = a < b true if a is less than b computed elementwise.\nl = a > b true if a is greater than b computed elementwise.\nl = a <= b true if a is less than or equal to b computed elementwise.\nl = a >= b true if a is greater than or equal to b computed elementwise.\na = n : m return a vector of values starting from n and ending to m by increment of (plus-minus) one.\nr = l & t elementwise logical and of a and b.\nl = a | b elementwise logical or of a and b.\nc = a ? b reduction: set values of a where b is zero to zero.\nb = n m % a resize a to matrix of size n by m.\nb = a assigning a to b.","category":"page"},{"location":"Software/Elmer/#Function-definitions","page":"Elmer Multiphysics","title":"Function definitions","text":"","category":"section"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"The syntax of the function definition is similar to that of Julia and is given below. The function body is enclosed by braces. Instead of using a return statement, the resulting value is attributed to a variable named after the function with a leading underscore. Notice the ! denoting comments in the description of the function.","category":"page"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"function name(arg1, arg2, ...)\n!\n! Optional function description (seen with help(\"name\"))\n!\nimport var1, var2\nexport var3, var4\n{\n expr;\n ...\n expr;\n\n _name = value\n}","category":"page"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"Functions have their own list of variables. Global variables are not seen in this function unless imported by import or given as arguments. Local variables can be made global by the export statement. ","category":"page"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"Functions, if returning matrices, behave in many ways as variables do. So if you have defined function mult as follows ","category":"page"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"function mult(a, b)\n{\n _mult = a * b;\n}","category":"page"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"You can get element (3,5) of the a times b matrix with mult(x,y)[3,5] or the diagonal values of the same matrix by diag(mult(x, y)).","category":"page"},{"location":"Software/Elmer/#Built-in-functions","page":"Elmer Multiphysics","title":"Built-in functions","text":"","category":"section"},{"location":"Software/Elmer/#C-style-math","page":"Elmer Multiphysics","title":"C-style math","text":"","category":"section"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"The following listing provides a series of mathematical functions which follow a their meaning in C. The only exceptions are ln denoting the natural logarithm and log used here for base 10 logarithms.","category":"page"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"r = sin(x)\n\nr = cos(x)\n\nr = tan(x)\n\nr = asin(x)\n\nr = acos(x)\n\nr = atan(x)\n\nr = sinh(x)\n\nr = cosh(x)\n\nr = tanh(x)\n\nr = exp(x)\n\nr = ln(x)\n\nr = log(x)\n\nr = sqrt(x)\n\nr = ceil(x)\n\nr = floor(x)\n\nr = abs(x)\n\nr = pow(x,y) ","category":"page"},{"location":"Software/Elmer/#General-utilities","page":"Elmer Multiphysics","title":"General utilities","text":"","category":"section"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":" \nfuncdel(name) Delete given function definition from parser.\nfunclist(name) Give header of the function given by name.\nenv(name) Get value of environment variable of the operating system.\nexists(name) Return true (non-zero) if variable by given name exists otherwise return false (=0).\nsource(name) Execute commands from file given name.\nformat(precision) Set number of digits used in printing values in MATC.\nr = eval(str) Evaluate content of string str. Another form of this command is @str.\nwho Give list of currently defined variables.\nhelp or help(\"symbol\") First form of the command gives list of available commands. Second form gives help on specific routine.","category":"page"},{"location":"Software/Elmer/#String-and-I/O-functions","page":"Elmer Multiphysics","title":"String and I/O functions","text":"","category":"section"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":" \nstr = sprintf(fmt[,vec]) Return a string formatted using fmt and values from vec. A call to corresponding C-language function is made.\nvec = sscanf(str,fmt) Return values from str using format fmt. A call to corresponding C-language function is made.\nstr = fread(fp,n) Read n bytes from file given by fp. File pointer fp should have been obtained from a call to fopen or freopen, or be the standard input file stdin. Data is returned as function value.\nvec = fscanf(fp,fmt) Read file fp as given in format. Format fmt is equal to C-language format. File pointer fp should have been obtained from a call to fopen or freopen, or be the standard input.\nstr = fgets(fp) Read next line from fp. File pointer fp should have been obtained from a call to fopen or freopen or be the standard input.\nn = fwrite(fp,buf,n) Write n bytes from buf to file fp. File pointer fp should have been obtained from a call to fopen or freopen or be the standard output (stdout) or standard error (stderr). Return value is number of bytes actually written. Note that one matrix element reserves 8 bytes of space.\nn = fprintf(fp,fmt[, vec]) Write formatted string to file fp. File pointer fp should have been obtained from a call to fopen or freopen or be the standard output (stdout) or standard error (stderr). The format fmt is equal to C-language format.\nfputs(fp,str) Write string str to file fp. File pointer fp should have been obtained from a call to fopen or freopen or be the standard input (stdin).\nfp = fopen(name,mode) Reopen file given previous file pointer, name and access mode. The most usual modes are \"r\" for reading and \"w\" for writing. Return value fp is used in functions reading and writing the file.\nfp = freopen(fp,name,mode) Reopen file given previous file pointer, name and access mode. The most usual modes are \"r\" for reading and \"w\" for writing. Return value fp is used in functions reading and writing the file.\nfclose(fp) Close file previously opened with fopen or freopen.\nsave(name, a[,ascii_flag]) Close file previously opened with fopen or freopen.\nr = load(name) Load matrix from a file given name and in format used by save command.","category":"page"},{"location":"Software/Elmer/#Numerical-utilities","page":"Elmer Multiphysics","title":"Numerical utilities","text":"","category":"section"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":" \nr = min(matrix) Return value is a vector containing smallest element in columns of given matrix. r = min(min(matrix)) gives smallest element of the matrix.\nr = max(matrix) Return value is a vector containing largest element in columns of given matrix. r = max(max(matrix)) gives largest element of the matrix.\nr = sum(matrix) Return vector is column sums of given matrix. r = sum(sum(matrix)) gives the total sum of elements of the matrix.\nr = zeros(n,m) Return n by m matrix with elements initialized to zero.\nr = ones(n,m) Return n by m matrix with elements initialized to one.\nr = rand(n,m) Return n by m matrix with elements initialized with random numbers from zero to one.\nr = diag(a) Given matrix return diagonal entries as a vector. Given vector return matrix with diagonal elements from vector. r = diag(diag(a)) gives matrix with diagonal elements from matrix a, otherwise elements are zero.\nr = vector(start,end,inc) Return vector of values going from start to end by inc.\nr = size(matrix) Return size of given matrix.\nr = resize(matrix,n,m) Make a matrix to look as a n by m matrix. This is the same as r = n m % matrix.\nr = where(a) Return a row vector giving linear index to a where a is not zero.\nr = matcvt(matrix, type) Makes a type conversion from MATC matrix double precision array to given type, which can be one of the following: \"int\", \"char\" or \"float\".\nr = cvtmat(special, type) Makes a type conversion from given type to MATC matrix. Type can be one of the following: \"int\", \"char\" or \"float\".","category":"page"},{"location":"Software/Elmer/#Linear-algebra","page":"Elmer Multiphysics","title":"Linear algebra","text":"","category":"section"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":" \nr = trace(matrix) Return value is the sum of matrix diagonal elements.\nr = det(matrix) Return value is determinant of given square matrix.\nr = inv(matrix) Invert given square matrix. Computed also by operator ^-1\nr = tril(x) Return the lower triangle of the matrix x.\nr = triu(x) Return the upper triangle of the matrix x.\nr = eig(matrix) Return eigenvalues of given square matrix. The expression r(n,0) is real part of the n:th eigenvalue, r(n,1) is the imaginary part respectively.\nr = jacob(a,b,eps) Solve symmetric positive definite eigenvalue problem by Jacob iteration. Return values are the eigenvalues. Also a variable eigv is created containing eigenvectors.\nr = lud(matrix) Return value is LUD decomposition of given matrix.\nr = hesse(matrix) Return the upper hessenberg form of given matrix.\nr = eye(n) Return n by n identity matrix.","category":"page"},{"location":"Software/Elmer/#Usage","page":"Elmer Multiphysics","title":"Usage","text":"","category":"section"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"Although the language is pretty fast for most simple uses, it is much slower than Fortran extensions, so use with case when scalability is needed. Another point is overuse of MATC; do not use it with simple numerical expressions, e.g. OneThird = Real $1.0/3.0 is much faster than its MATC counterpart OneThird = Real MATC \"1.0/3.0\".","category":"page"},{"location":"Software/Elmer/#Direct-expression-coding","page":"Elmer Multiphysics","title":"Direct expression coding","text":"","category":"section"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"One thing that in my opinion lacks in the documentation are examples of use in conjunction with SIF. For instance, for setting the thermal conductivity of a material as temperature-dependent one could use the following snippet and modify the string to match the desired expression. An example of its usage is provided in this case.","category":"page"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"  Heat Conductivity = Variable Temperature\n    Real MATC \"1.0 - tx * (2.5E-03 - 1.2E-06 * tx)\"","category":"page"},{"location":"Software/Elmer/#Sourcing-functions-from-user-modules","page":"Elmer Multiphysics","title":"Sourcing functions from user modules","text":"","category":"section"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"Models can become too complex to code in a single line. Hopefully MATC provides functions which can be declared in external modules. I avoid coding MATC directly in SIF because their syntax is different and that can quickly lead to unmaintainable code. An example of such external sourcing is provided in this case. You need to remember to call source(\"module\") in Simulation section of SIF so that the functions can be used elsewhere. The call of a function become something as","category":"page"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"  Concentration Diffusivity = Variable Concentration\n    Real MATC \"diffusivity(tx)\"","category":"page"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"if independent variable is concentration or for time","category":"page"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"  Mass Transfer Coefficient = Variable Time\n    Real MATC \"masstransfercoef(tx)\"","category":"page"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"You can even use multiple variables, e.g.","category":"page"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"  Mass Transfer Coefficient = Variable Time, Temperature\n    Real MATC \"masstransfercoef(tx(0), tx(1))\"","category":"page"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"PS: I managed to use a single source in SIF, although the documentation does not state that many sources are forbidden; for some reason multiple sources work when sourcing from a file.","category":"page"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"For more complex cases such as this one it is worth writing actual MATC function modules; since there is no syntax highlighter available for MATC in VS Code, the .ini extension seems to provide better readability to the code. The problem was split in two parts: the models which take care of sourcing the conditions, so that basic users could only edit the latter and run their variant calculations with no coding skills. Notice that the symbols that are used in SIF are exported from this line instead of being set as global variables.","category":"page"},{"location":"Software/Elmer/#User-defined-functions","page":"Elmer Multiphysics","title":"User-defined functions","text":"","category":"section"},{"location":"Software/Elmer/","page":"Elmer Multiphysics","title":"Elmer Multiphysics","text":"TODO","category":"page"},{"location":"References/@Fang2023a/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Fang2023a/","page":"-","title":"-","text":"title: \"Ensemble learning for physics informed neural networks: a gradient boosting approach\" authors: Zhiwei Fang, Sifan Wang, Paris Perdikaris year: 2023 DOI: https://doi.org/10.48550/arXiv.2302.13143 –-","category":"page"},{"location":"References/@Fang2023a/","page":"-","title":"-","text":"Discussed in [[@Guo2023c]].","category":"page"},{"location":"WallyToolbox/utilities/#Utilities","page":"Utilities","title":"Utilities","text":"","category":"section"},{"location":"WallyToolbox/utilities/","page":"Utilities","title":"Utilities","text":"EditURL = \"https://github.com/wallytutor/WallyToolbox.jl/blob/main/docs/src/WallyToolbox/utilities.md\"\nCurrentModule = WallyToolbox\nDocTestSetup = quote\n using WallyToolbox\nend","category":"page"},{"location":"WallyToolbox/utilities/#Haskell-like-array-slicing","page":"Utilities","title":"Haskell-like array slicing","text":"","category":"section"},{"location":"WallyToolbox/utilities/","page":"Utilities","title":"Utilities","text":"Those who know Haskell probably started learning it by manipulating lists with head and tail. Those functionalities are not available in Julia by default and array slicing - with an ugly syntax - is required. Since this is done often in the fields of application of WallyToolbox, both head and tail together with a body functions are available in its core. They are simple wrapers over the @view macro and work with both iterable types and arrays. The following snippet illustrates their usage.","category":"page"},{"location":"WallyToolbox/utilities/","page":"Utilities","title":"Utilities","text":"julia> v = collect(1:4);\n\njulia> head(v) == [1; 2; 3]\ntrue\n\njulia> tail(v) == [2; 3; 4]\ntrue\n\njulia> body(v) == [2; 3]\ntrue","category":"page"},{"location":"WallyToolbox/utilities/","page":"Utilities","title":"Utilities","text":"More examples are provided in the documentation of each of the functions.","category":"page"},{"location":"WallyToolbox/utilities/","page":"Utilities","title":"Utilities","text":"WallyToolbox.head\nWallyToolbox.tail\nWallyToolbox.body","category":"page"},{"location":"WallyToolbox/utilities/#WallyToolbox.head","page":"Utilities","title":"WallyToolbox.head","text":"head(z)\n\nAccess view of array head. See also tail and body.\n\njulia> head(1:4)\n1:3\n\njulia> head([1, 2, 3, 4])\n3-element view(::Vector{Int64}, 1:3) with eltype Int64:\n 1\n 2\n 3\n\n\n\n\n\n","category":"function"},{"location":"WallyToolbox/utilities/#WallyToolbox.tail","page":"Utilities","title":"WallyToolbox.tail","text":"tail(z)\n\nAccess view of array tail. See also head and body.\n\njulia> tail([1, 2, 3, 4])\n3-element view(::Vector{Int64}, 2:4) with eltype Int64:\n 2\n 3\n 4\njulia> tail(1:4)\n2:4\n\n\n\n\n\n","category":"function"},{"location":"WallyToolbox/utilities/#WallyToolbox.body","page":"Utilities","title":"WallyToolbox.body","text":"body(z)\n\nAccess view of array body. See also head and tail.\n\njulia> body([1, 2, 3, 4])\n2-element view(::Vector{Int64}, 2:3) with eltype Int64:\n 2\n 3\njulia> body(1:4)\n2:3\n\n\n\n\n\n","category":"function"},{"location":"WallyToolbox/utilities/#General-utilities","page":"Utilities","title":"General utilities","text":"","category":"section"},{"location":"WallyToolbox/utilities/","page":"Utilities","title":"Utilities","text":"WallyToolbox.defaultvalue\nWallyToolbox.redirect_to_files\nWallyToolbox.test_exhaustive","category":"page"},{"location":"WallyToolbox/utilities/#WallyToolbox.defaultvalue","page":"Utilities","title":"WallyToolbox.defaultvalue","text":"Syntax sugar for handling a possibly nothing value.\n\n\n\n\n\n","category":"function"},{"location":"WallyToolbox/utilities/#WallyToolbox.redirect_to_files","page":"Utilities","title":"WallyToolbox.redirect_to_files","text":"Helper function to redirect outputs to the right files.\n\n\n\n\n\n","category":"function"},{"location":"WallyToolbox/utilities/#WallyToolbox.test_exhaustive","page":"Utilities","title":"WallyToolbox.test_exhaustive","text":"Run all assertions before throwing an error.\n\n\n\n\n\n","category":"function"},{"location":"WallyToolbox/utilities/#Literate-programming","page":"Utilities","title":"Literate programming","text":"","category":"section"},{"location":"WallyToolbox/utilities/","page":"Utilities","title":"Utilities","text":"Because WallyToolbox is intended to be run from a portable Julia environment without footprint in the local system, some particularities arise in setting a Jupyter toolset. The following tools tools provide launchers for starting local Jupyter Notebook and Jupyterlab sessions. ","category":"page"},{"location":"WallyToolbox/utilities/","page":"Utilities","title":"Utilities","text":"note: Note\nNotice it is up to the user to define the path JUPYTER_DATA_DIR as an environment variable; default Jupyter configuration is not accepted because it might break the local system.","category":"page"},{"location":"WallyToolbox/utilities/","page":"Utilities","title":"Utilities","text":"WallyToolbox.launch_notebook\nWallyToolbox.launch_jupyterlab","category":"page"},{"location":"WallyToolbox/utilities/#WallyToolbox.Notebook.launch_notebook","page":"Utilities","title":"WallyToolbox.Notebook.launch_notebook","text":"Launch Jupyter notebook session with WallyToolbox kernel.\n\n\n\n\n\n","category":"function"},{"location":"WallyToolbox/utilities/#WallyToolbox.Notebook.launch_jupyterlab","page":"Utilities","title":"WallyToolbox.Notebook.launch_jupyterlab","text":"Launch Jupyterlab session with WallyToolbox kernel.\n\n\n\n\n\n","category":"function"},{"location":"References/@Karniadakis2021a/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Karniadakis2021a/","page":"-","title":"-","text":"title: Physics-informed machine learning authors: George Em Karniadakis, Ioannis G. Kevrekidis, Lu Lu, Paris Perdikaris, Sifan Wang, Liu Yang year: 2021 –-","category":"page"},{"location":"References/@Guo2023b/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Guo2023b/","page":"-","title":"-","text":"title: \"Unraveling the design pattern of physics-informed neural networks: Series 02\" authors: Shuai Guo year: 2023 URL: TODO –-","category":"page"},{"location":"References/@Lehrer1930/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Lehrer1930/","page":"-","title":"-","text":"title: Über das eisen-wasserstoff- ammoniak-gleichgewicht authors: E. Lehrer year: 1930 –-","category":"page"},{"location":"Notebooks/02-Part-Radiation-Heating/#Transient-heat-transfer","page":"Transient heat transfer","title":"Transient heat transfer","text":"","category":"section"},{"location":"Notebooks/02-Part-Radiation-Heating/","page":"Transient heat transfer","title":"Transient heat transfer","text":"No further words, let's start by importing the required toolset:","category":"page"},{"location":"Notebooks/02-Part-Radiation-Heating/","page":"Transient heat transfer","title":"Transient heat transfer","text":"using CairoMakie\nusing LinearAlgebra\nusing Printf\nusing Unitful\n\n# Stefan-Boltzmann constant.\nconst σ = 5.67e-08u\"W/(m^2*K^4)\"\n\nnothing; #hide","category":"page"},{"location":"Notebooks/02-Part-Radiation-Heating/#First-problem","page":"Transient heat transfer","title":"First problem","text":"","category":"section"},{"location":"Notebooks/02-Part-Radiation-Heating/","page":"Transient heat transfer","title":"Transient heat transfer","text":"Implementation of section 2.3 of Nithiarasu et al. (2016) of a transient heat transfer problem. This is the logical extension of what has been explored in a previous study. The overall problem is stated in terms of the inertia matrix mathbfC, the stiffness mathbfK and the forcing function mathbff. The following first order differential equation of temperature mathcalT is to be solved:","category":"page"},{"location":"Notebooks/02-Part-Radiation-Heating/","page":"Transient heat transfer","title":"Transient heat transfer","text":"mathbfCdotmathcalT+mathbfKmathcalT=mathbff","category":"page"},{"location":"Notebooks/02-Part-Radiation-Heating/","page":"Transient heat transfer","title":"Transient heat transfer","text":"Notice here that the temperature mathcalT here is a vector corresponding to the three problem components, the steel part, the furnace gas, and the outer refractory walls.","category":"page"},{"location":"Notebooks/02-Part-Radiation-Heating/","page":"Transient heat transfer","title":"Transient heat transfer","text":"Because the model is stated in lumped form, i.e. simplified to a zero-dimensional space, we add a phase of calculation of the heat capacities of materials in compatible units to remain within the formulation proposed in the reference. In this lumped format, the elements of matrix mathbfC are given in units of energy per unit temperature because they already incorporate the effect bodies masses through C_ii=m_ic_Pi where i indicates de component index.","category":"page"},{"location":"Notebooks/02-Part-Radiation-Heating/","page":"Transient heat transfer","title":"Transient heat transfer","text":"To get a dynamics that is interpretable in the real world we will start by computing reasonable orders of magnitude of the C_ii by providing the masses of the bodies and typical values of specific heats for the involved materials. Considering a steel sphere of 10 cm placed floating in a 40 cm air environment limited by a spherical refractory with outer shell of 60 cm we can estimate these masses, in the same order, as:","category":"page"},{"location":"Notebooks/02-Part-Radiation-Heating/","page":"Transient heat transfer","title":"Transient heat transfer","text":"m = 1u\"kg\" * [4.2, 0.033, 240.0]\n\nnothing; # hide","category":"page"},{"location":"Notebooks/02-Part-Radiation-Heating/","page":"Transient heat transfer","title":"Transient heat transfer","text":"Next we provide the specific heats of the materials already multiplied by the above masses:","category":"page"},{"location":"Notebooks/02-Part-Radiation-Heating/","page":"Transient heat transfer","title":"Transient heat transfer","text":"cp(T) = m[1] * 6.00e+03u\"J/(kg*K)\"\ncg(T) = m[2] * 1.00e+03u\"J/(kg*K)\"\ncw(T) = m[3] * 9.00e+02u\"J/(kg*K)\"\n\nnothing; # hide","category":"page"},{"location":"Notebooks/02-Part-Radiation-Heating/","page":"Transient heat transfer","title":"Transient heat transfer","text":"Since our goal is to make the problem fully treated in matrix form, we stack the specific heats together. Since matrix mathrmC is diagonal and composed by these specific heats, its inverse is simply the reciprocal of its diagonal elements, what is trivial to prove. This allows the problem to be reworked as","category":"page"},{"location":"Notebooks/02-Part-Radiation-Heating/","page":"Transient heat transfer","title":"Transient heat transfer","text":"dotmathcalT+mathbfC^-1mathbfKmathcalT=mathbfC^-1mathbff","category":"page"},{"location":"Notebooks/02-Part-Radiation-Heating/","page":"Transient heat transfer","title":"Transient heat transfer","text":"Setting the derivative term to be alone could be interesting for testing different time-stepping strategies, for instance. Matrix mathrmC^-1 is provided by inertiainv below:","category":"page"},{"location":"Notebooks/02-Part-Radiation-Heating/","page":"Transient heat transfer","title":"Transient heat transfer","text":"specificheat(T) = [cp(T[1]); cg(T[2]); cw(T[3])]\n\ninertiainv(T) = diagm(1 ./ specificheat(T))\n\nnothing; # hide","category":"page"},{"location":"Notebooks/02-Part-Radiation-Heating/","page":"Transient heat transfer","title":"Transient heat transfer","text":"We inspect the inverse inertia matrix:","category":"page"},{"location":"Notebooks/02-Part-Radiation-Heating/","page":"Transient heat transfer","title":"Transient heat transfer","text":"inertiainv([300.0, 300.0, 300.0])","category":"page"},{"location":"Notebooks/02-Part-Radiation-Heating/","page":"Transient heat transfer","title":"Transient heat transfer","text":"Stiffness matrix mathrmK in this problem provides the convective heat transfer terms. It is given by","category":"page"},{"location":"Notebooks/02-Part-Radiation-Heating/","page":"Transient heat transfer","title":"Transient heat transfer","text":"mathbfK = beginbmatrix\nh_pA_p -h_pA_p 0 \n-h_pA_p h_pA_p + h_gA_g -h_gA_g \n0 -h_gA_g h_gA_g + h_wA_w\nendbmatrix","category":"page"},{"location":"Notebooks/02-Part-Radiation-Heating/","page":"Transient heat transfer","title":"Transient heat transfer","text":"Since this matrix does not contain any element that depends on temperature it needs to be computed only once and we will not seek an optimized way to evaluate it. The code below is generic for any layered structure as the one being modelled here. Notice that the pairwise interactions lead to a tridiagonal structure.","category":"page"},{"location":"Notebooks/02-Part-Radiation-Heating/","page":"Transient heat transfer","title":"Transient heat transfer","text":"function stiffness(h, A)\n p = @. h * A\n q = -1 * p[1:end-1]\n p[2:end] -= q\n return diagm(0=>p, -1=>q, 1=>q)\nend\n\nnothing; # hide","category":"page"},{"location":"Notebooks/02-Part-Radiation-Heating/","page":"Transient heat transfer","title":"Transient heat transfer","text":"For testing its implementation and later simulating the system we provide already the set of convective heat transfer coefficients on h and heat transfer areas in A. The order of magnitude of areas was kept compatible with the geometrical description provided before.","category":"page"},{"location":"Notebooks/02-Part-Radiation-Heating/","page":"Transient heat transfer","title":"Transient heat transfer","text":"h = [100.0, 100.0, 10.0] * 1u\"W/(m^2*K)\"\nA = [0.032, 0.500, 1.15] * 1u\"m^2\"\n\nstiffness(h, A)","category":"page"},{"location":"Notebooks/02-Part-Radiation-Heating/","page":"Transient heat transfer","title":"Transient heat transfer","text":"To conclude problem specification, a function forcing for evaluation of mathbff is provided below. Vector mathbff is mainly where the description of radiative heat transfer is represented and is given as:","category":"page"},{"location":"Notebooks/02-Part-Radiation-Heating/","page":"Transient heat transfer","title":"Transient heat transfer","text":"mathbff = beginbmatrix\n-epsilon_psigmaA_p(mathcalT_p^4-mathcalT_w^4) \n0 \nh_wA_wT_a + epsilon_psigmaA_p(mathcalT_p^4-mathcalT_w^4) \n- epsilon_wsigmaA_w(mathcalT_w^4-T_a^4)\nendbmatrix","category":"page"},{"location":"Notebooks/02-Part-Radiation-Heating/","page":"Transient heat transfer","title":"Transient heat transfer","text":"function forcing(T, h, A, Ta, ϵp, ϵw)\n f1 = -ϵp*σ*A[1]*(T[1]^4-T[3]^4)\n f3 = h[3]*A[3]*Ta - f1 - ϵw*σ*A[3]*(T[3]^4 - Ta^4)\n return [ f1; 0u\"W\"; f3 ]\nend\n\nnothing; #hide","category":"page"},{"location":"Notebooks/02-Part-Radiation-Heating/","page":"Transient heat transfer","title":"Transient heat transfer","text":"The remaining parameters to close the problem are the emissivity of the materials and external temperature, all provided below.","category":"page"},{"location":"Notebooks/02-Part-Radiation-Heating/","page":"Transient heat transfer","title":"Transient heat transfer","text":"ϵp = 0.8\nϵw = 0.3\nTa = 313.15u\"K\"\n\nforcing([Ta, Ta, Ta], h, A, Ta, ϵp, ϵw)","category":"page"},{"location":"Notebooks/02-Part-Radiation-Heating/","page":"Transient heat transfer","title":"Transient heat transfer","text":"With that last element of the base equation in hands we can derive the time-stepping approach to be used. The derivative term is expanded as a forward finite difference as","category":"page"},{"location":"Notebooks/02-Part-Radiation-Heating/","page":"Transient heat transfer","title":"Transient heat transfer","text":"fracmathcalT_n+1-mathcalT_ntau + mathbfL^primemathcalT\n=mathbfR^primemathbff","category":"page"},{"location":"Notebooks/02-Part-Radiation-Heating/","page":"Transient heat transfer","title":"Transient heat transfer","text":"If you go back to the inspection of the inverse inertia matrix above, you will observe that the term corresponding to the gas is about 3 orders of magnitude above the others. That means that the dynamics of that component of the system is much slower than the others and the problem is somewhat stiff. To introduce a first layer of robustness in the integration we can try an implicit scheme by evaluating all terms in the above equation at instant n+1:","category":"page"},{"location":"Notebooks/02-Part-Radiation-Heating/","page":"Transient heat transfer","title":"Transient heat transfer","text":"mathcalT_n+1-mathcalT_n + taumathbfL^prime_n+1mathcalT_n+1\n=taumathbfR^prime_n+1mathbff_n+1","category":"page"},{"location":"Notebooks/02-Part-Radiation-Heating/","page":"Transient heat transfer","title":"Transient heat transfer","text":"This equation can be rearranged by splitting linear terms in mathcalT_n+1 on the left-hand side as:","category":"page"},{"location":"Notebooks/02-Part-Radiation-Heating/","page":"Transient heat transfer","title":"Transient heat transfer","text":"left(mathbfI+taumathbfL^prime_n+1right)mathcalT_n+1=\ntaumathbfR^prime_n+1mathbff_n+1+mathcalT_n","category":"page"},{"location":"Notebooks/02-Part-Radiation-Heating/","page":"Transient heat transfer","title":"Transient heat transfer","text":"this can be further simplified with the notation:","category":"page"},{"location":"Notebooks/02-Part-Radiation-Heating/","page":"Transient heat transfer","title":"Transient heat transfer","text":"mathbfL_n+1mathcalT_n+1=mathbfR_n+1+mathcalT_n","category":"page"},{"location":"Notebooks/02-Part-Radiation-Heating/","page":"Transient heat transfer","title":"Transient heat transfer","text":"It is useful to simplify thing until last step because it tells us what functionalities we need in a computer implementation. The problem of finding mathcalT_n+1 can be seem as a nonlinear iteration mathcalT_n+1=L^-1_n+1(R_n+1+mathcalT_n) followed by update of both mathbfL_n+1 and mathbfR_n+1 with the new estimate of temperatures. Thus, we need functions to update both these matrices during the solution. Since these rely on several parameters we can encapsulate then in a higher order function with all fixed parameters and return a function that performs the update for the new temperature estimate, as implemented below.","category":"page"},{"location":"Notebooks/02-Part-Radiation-Heating/","page":"Transient heat transfer","title":"Transient heat transfer","text":"function buildlhsmatrix(τ, h, A)\n K = stiffness(h, A)\n I = diagm([1, 1, 1] * 1u\"1\")\n return (Tₖ) -> I + τ * inertiainv(Tₖ) * K\nend\n\nnothing; # hide","category":"page"},{"location":"Notebooks/02-Part-Radiation-Heating/","page":"Transient heat transfer","title":"Transient heat transfer","text":"function buildrhsvector(τ, h, A, Ta, ϵp, ϵw)\n F(T) = τ * forcing(T, h, A, Ta, ϵp, ϵw)\n return (Tₖ) -> inertiainv(Tₖ) * F(Tₖ)\nend\n\nnothing; # hide","category":"page"},{"location":"Notebooks/02-Part-Radiation-Heating/","page":"Transient heat transfer","title":"Transient heat transfer","text":"As per the previous discussion, the following snipped emulates one time-step iteration:","category":"page"},{"location":"Notebooks/02-Part-Radiation-Heating/","page":"Transient heat transfer","title":"Transient heat transfer","text":"T = [1273.0u\"K\", Ta, Ta]\nτ = 1.0u\"s\"\n\nK = buildlhsmatrix(τ, h, A)\nB = buildrhsvector(τ, h, A, Ta, ϵp, ϵw)\n\n# Because of factorization this does not works with Unitful.\n# Units are stripped and system becomes inconsistent.\n# Tnew = K(T) \\ (B(T) .+ T)\n\nTnew = inv(K(T)) * (B(T) .+ T)","category":"page"},{"location":"Notebooks/02-Part-Radiation-Heating/","page":"Transient heat transfer","title":"Transient heat transfer","text":"Function steptime below performs up to a maximum number of iterations as illustrated above and checks for convergence of the time-step.","category":"page"},{"location":"Notebooks/02-Part-Radiation-Heating/","page":"Transient heat transfer","title":"Transient heat transfer","text":"function steptime(T₀, K, B; maxiter = 50, rtol = 1.0e-12, β = 1.0)\n Tᵢ = copy(T₀)\n Tⱼ = copy(T₀)\n Δ = 9.0e+100\n\n for j in range(1, maxiter)\n Tⱼ[:] = inv(K(Tⱼ)) * (B(Tⱼ) .+ T₀)\n Tⱼ[:] = relaxation(Tᵢ, Tⱼ, β)\n Δ = residual(Tᵢ, Tⱼ)\n Tᵢ[:] = Tⱼ[:]\n\n if Δ < rtol\n return Tᵢ, j, Δ\n end\n end\n\n @warn(\"No convergence during step @ $(@sprintf(\"%.6e\", Δ))\")\n return Tᵢ, maxiter, Δ\nend\n\nnothing; # hide","category":"page"},{"location":"Notebooks/02-Part-Radiation-Heating/","page":"Transient heat transfer","title":"Transient heat transfer","text":"A relaxation step for eventually helping convergence was introduced above as:","category":"page"},{"location":"Notebooks/02-Part-Radiation-Heating/","page":"Transient heat transfer","title":"Transient heat transfer","text":"relaxation(Tᵢ, Tⱼ, β) = @. β * Tⱼ + (1-β) * Tᵢ\n\nnothing; # hide","category":"page"},{"location":"Notebooks/02-Part-Radiation-Heating/","page":"Transient heat transfer","title":"Transient heat transfer","text":"A common choice of residual in this sort of problem is the maximum relative absolute change:","category":"page"},{"location":"Notebooks/02-Part-Radiation-Heating/","page":"Transient heat transfer","title":"Transient heat transfer","text":"residual(Tᵢ, Tⱼ) = maximum(abs.(Tⱼ .- Tᵢ) ./ Tᵢ)\n\nnothing; # hide","category":"page"},{"location":"Notebooks/02-Part-Radiation-Heating/","page":"Transient heat transfer","title":"Transient heat transfer","text":"Time integration is now just a matter of repeating time-stepping and storing solution:","category":"page"},{"location":"Notebooks/02-Part-Radiation-Heating/","page":"Transient heat transfer","title":"Transient heat transfer","text":"function integrate(t, T, K, B; maxiter, rtol, β)\n U = copy(T)\n nvars = length(T)\n solution = zeros(length(t), nvars + 2)\n solution[1, 1:nvars] = ustrip(U)\n\n for (i, tᵢ) in enumerate(t[1:end])\n (U[:], niters, Δ) = steptime(U, K, B; maxiter, rtol, β)\n solution[i, 1:nvars] = ustrip(U)\n solution[i, nvars+1] = niters\n solution[i, nvars+2] = Δ\n end\n\n return solution\nend\n\nnothing; # hide","category":"page"},{"location":"Notebooks/02-Part-Radiation-Heating/","page":"Transient heat transfer","title":"Transient heat transfer","text":"This completes the tooling for simulation of the process. Below we simulate 24 hours of the dynamics starting with a hot metallic sphere and the furnace equilibrated with the external environment. ","category":"page"},{"location":"Notebooks/02-Part-Radiation-Heating/","page":"Transient heat transfer","title":"Transient heat transfer","text":"tend = 24*3600\n\nT = [1273.0u\"K\", Ta, Ta]\nt = range(0, tend, convert(Int64, tend / 8))\nτ = step(t) * 1u\"s\"\n\nK = buildlhsmatrix(τ, h, A)\nB = buildrhsvector(τ, h, A, Ta, ϵp, ϵw)\n\nmaxiter = 80\nrtol = 1.0e-12\nβ = 0.99\n\n@time solution = integrate(t, T, K, B; maxiter, rtol, β);","category":"page"},{"location":"Notebooks/02-Part-Radiation-Heating/","page":"Transient heat transfer","title":"Transient heat transfer","text":"Below we can inspect the solution and the residuals at the end of each time-step. For the solution to make sense it is important that every single step must converge during time advancement. Note the leap in gas temperature during the first time steps resulting from the problem stiffness. As a matter of fact, a smaller time-step should have been used for properly resolving its dynamics in the early stages or even better, an adaptative time-stepping approach should have been adopted.","category":"page"},{"location":"Notebooks/02-Part-Radiation-Heating/","page":"Transient heat transfer","title":"Transient heat transfer","text":"with_theme() do\n tk = t / 3600\n\n fig = Figure(size = (700, 700))\n \n ax1 = Axis(fig[1, 1])\n lines!(ax1, tk, solution[:, 1]; color = :black, label = \"Metal\")\n hlines!(ax1, ustrip(Ta); color = :blue, label = \"Environment\")\n axislegend(ax1; position = :rt)\n\t\n ax2 = Axis(fig[2, 1])\n lines!(ax2, tk, solution[:, 2]; color = :green, label = \"Gas\")\n lines!(ax2, tk, solution[:, 3]; color = :red, label = \"Wall\")\n hlines!(ax2, ustrip(Ta); color = :blue, label = \"Environment\")\n axislegend(ax2; position = :rt)\n \n ax3 = Axis(fig[3, 1])\n lines!(ax3, tk, solution[:, 5]; color = :black)\n\n ax3.xlabel = \"Time [h]\"\n ax1.ylabel = \"Temperature [K]\"\n ax2.ylabel = \"Temperature [K]\"\n ax3.ylabel = \"Residual\"\n \n ax1.xticks = 0:2:tk[end]\n ax2.xticks = 0:2:tk[end]\n ax3.xticks = 0:2:tk[end]\n \n ax1.yticks = 300:200:1300\n ax2.yticks = 300:20:400\n \n xlims!(ax1, extrema(ax1.xticks.val))\n xlims!(ax2, extrema(ax2.xticks.val))\n xlims!(ax3, extrema(ax3.xticks.val))\n \n ylims!(ax1, extrema(ax1.yticks.val))\n ylims!(ax2, extrema(ax2.yticks.val))\n\n fig\nend","category":"page"},{"location":"Notebooks/02-Part-Radiation-Heating/#Using-ModelingToolkit","page":"Transient heat transfer","title":"Using ModelingToolkit","text":"","category":"section"},{"location":"Notebooks/02-Part-Radiation-Heating/","page":"Transient heat transfer","title":"Transient heat transfer","text":"In the future...","category":"page"},{"location":"References/@Liu1993/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Liu1993/","page":"-","title":"-","text":"title: Modeling the effects of drop drag and breakup on fuel sprays authors: Alex B. Liu, Daniel Mather, Rolf D. Reitz year: 1993 URL: \" https://doi.org/10.4271/930072.\" –- Also check Reitz1987 [15].","category":"page"},{"location":"References/@Plessis1988/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Plessis1988/","page":"-","title":"-","text":"title: Mathematical modelling of flow through consolidated isotropic porous media authors: J. Prieur Du Plessis, Jacob H. Masliyah year: 1988 URL: TODO –-","category":"page"},{"location":"References/@Smith2013a/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Smith2013a/","page":"-","title":"-","text":"title: \"Thermal conductivity of porous materials\" authors: David S. Smith, Arnaud Alzina, Julie Bourret, Benoît Nait-Ali, Fabienne Pennec, Nicolas Tessier-Doyen, Kodai Otsu, Hideaki Matsubara, Pierre Elser, Urs T. Gonzenbach year: 2013 –-","category":"page"},{"location":"Modules/OpenFOAM/#OpenFOAM","page":"OpenFOAM","title":"OpenFOAM","text":"","category":"section"},{"location":"Modules/OpenFOAM/","page":"OpenFOAM","title":"OpenFOAM","text":"CurrentModule = OpenFOAM\nDocTestSetup = quote\n using OpenFOAM\nend\nEditURL = \"https://github.com/wallytutor/WallyToolbox.jl/blob/main/docs/src/Modules/OpenFOAM.md\"","category":"page"},{"location":"Modules/OpenFOAM/","page":"OpenFOAM","title":"OpenFOAM","text":"Modules = [ OpenFOAM ]","category":"page"},{"location":"Modules/OpenFOAM/#OpenFOAM.OPENFOAMBANNER","page":"OpenFOAM","title":"OpenFOAM.OPENFOAMBANNER","text":"Banner for all OpenFOAM files with right version.\n\n\n\n\n\n","category":"constant"},{"location":"Modules/OpenFOAM/#OpenFOAM.AbstractFlowRateProfile","page":"OpenFOAM","title":"OpenFOAM.AbstractFlowRateProfile","text":"Abstract type for flow rate profile distributions.\n\n\n\n\n\n","category":"type"},{"location":"Modules/OpenFOAM/#OpenFOAM.AbstractInjectionModel","page":"OpenFOAM","title":"OpenFOAM.AbstractInjectionModel","text":"Abstract type for injection models.\n\n\n\n\n\n","category":"type"},{"location":"Modules/OpenFOAM/#OpenFOAM.AbstractSizeDistribution","page":"OpenFOAM","title":"OpenFOAM.AbstractSizeDistribution","text":"Abstract type for particle size distributions.\n\n\n\n\n\n","category":"type"},{"location":"Modules/OpenFOAM/#OpenFOAM.ConstantFlowRateProfile","page":"OpenFOAM","title":"OpenFOAM.ConstantFlowRateProfile","text":"Constant flow rate profile.\n\n\n\n\n\n","category":"type"},{"location":"Modules/OpenFOAM/#OpenFOAM.InjectionModel","page":"OpenFOAM","title":"OpenFOAM.InjectionModel","text":"Represents a generic particle injection model.\n\nConstraints imposed by OpenFOAM:\n\nnParticle makes massFlowRate and massTotal to be ignored.\nmassTotal cannot be used in steady state simulations.\nif flowRateProfile is not found a constant massFlowRate profile is computed from the ratio of massTotal and duration.\n\nTo-do:\n\nCheck if parcelBasisType from is applicable to derived types.\n\nmassFlowRate::Number: Particles mass flow rate if nParticle is not provided.\nmassTotal::Number: Total mass to be injected if nParticle is not provided.\nSOI::Number: Start of injection in seconds (base).\nduration::Number: Duration of injection in seconds (base).\nnParticle::Number: Number of particles per parcel.\nuniformParcelSize::UniformParcelSize: Quantity that is constant in parcels (base).\nflowRateProfile::OpenFOAM.AbstractFlowRateProfile: Type of flow rate profile to apply.\n\n\n\n\n\n","category":"type"},{"location":"Modules/OpenFOAM/#OpenFOAM.PatchInjection","page":"OpenFOAM","title":"OpenFOAM.PatchInjection","text":"Represents a patch injection model.\n\nname::String: Name to use in injection models list.\npatchName::String: Patch where injection is applied.\ninjectionModel::InjectionModel: Object pointing to general injection model.\nU0::Velocity: Particles injection velocity vector.\nparcelsPerSecond::Number: Number of parcels injected per second.\nsizeDistribution::OpenFOAM.AbstractSizeDistribution: Particle size distribution.\n\n\n\n\n\n","category":"type"},{"location":"Modules/OpenFOAM/#OpenFOAM.TableFlowRateProfile","page":"OpenFOAM","title":"OpenFOAM.TableFlowRateProfile","text":"Table flow rate profile.\n\n\n\n\n\n","category":"type"},{"location":"Modules/OpenFOAM/#OpenFOAM.TabulatedDensity","page":"OpenFOAM","title":"OpenFOAM.TabulatedDensity","text":"Tabulated density size distribution.\n\n\n\n\n\n","category":"type"},{"location":"Modules/OpenFOAM/#OpenFOAM.UniformParcelSize","page":"OpenFOAM","title":"OpenFOAM.UniformParcelSize","text":"Types of uniform parcel sizes.\n\n\n\n\n\n","category":"type"},{"location":"Modules/OpenFOAM/#OpenFOAM.Velocity","page":"OpenFOAM","title":"OpenFOAM.Velocity","text":"Simple wraper velocity vector.\n\n\n\n\n\n","category":"type"},{"location":"Modules/OpenFOAM/#OpenFOAM.asint-Tuple{Any}","page":"OpenFOAM","title":"OpenFOAM.asint","text":"Round and convert number to an integer.\n\n\n\n\n\n","category":"method"},{"location":"Modules/OpenFOAM/#OpenFOAM.parcels_per_second-Tuple{}","page":"OpenFOAM","title":"OpenFOAM.parcels_per_second","text":"parcelstoinject2d(;\n mdot::Float64,\n rhop::Float64,\n diam::Float64,\n nParticle::Int64 = 1\n)\n\nComputes the flow rate of parcels for a given mean particle size and number of particles per parcels. This is inteded as a helper to create a patchInjection element in the injectionModels of cloudProperties file.\n\n\n\n\n\n","category":"method"},{"location":"Modules/OpenFOAM/#OpenFOAM.spheremass-Tuple{Any, Any}","page":"OpenFOAM","title":"OpenFOAM.spheremass","text":"The mass of a sphere of density rho and diameter diam.\n\n\n\n\n\n","category":"method"},{"location":"Modules/OpenFOAM/#OpenFOAM.spherevolume-Tuple{Any}","page":"OpenFOAM","title":"OpenFOAM.spherevolume","text":"The volume of a sphere of diameter diam.\n\n\n\n\n\n","category":"method"},{"location":"Modules/OpenFOAM/#OpenFOAM.tabulate-Tuple{Any, Any}","page":"OpenFOAM","title":"OpenFOAM.tabulate","text":"Compose table entries in typical OpenFOAM format.\n\n\n\n\n\n","category":"method"},{"location":"Modules/OpenFOAM/#Discrete-phase-models","page":"OpenFOAM","title":"Discrete phase models","text":"","category":"section"},{"location":"Modules/OpenFOAM/","page":"OpenFOAM","title":"OpenFOAM","text":"We can verify the computation of number of parcels per second of sample case injectionChannel. Notice that the value of mdot has been reversed engineered so that it matches the expected value.","category":"page"},{"location":"Modules/OpenFOAM/","page":"OpenFOAM","title":"OpenFOAM","text":"julia> parcels_per_second(; ṁ = 0.2, ρ = 1000.0, d = 650.0e-06, nParticle = 1)\n1390885","category":"page"},{"location":"References/@Haitsiukevich2022a/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Haitsiukevich2022a/","page":"-","title":"-","text":"title: Improved training of physics-informed neural networks with model ensembles authors: Katsiaryna Haitsiukevich, Alexander Ilin year: 2022 URL: https://doi.org/10.48550/arXiv.2204.05108 –-","category":"page"},{"location":"WallyToolbox/unstable/#Unstable","page":"Unstable","title":"Unstable","text":"","category":"section"},{"location":"WallyToolbox/unstable/","page":"Unstable","title":"Unstable","text":"EditURL = \"https://github.com/wallytutor/WallyToolbox.jl/blob/main/docs/src/WallyToolbox/unstable.md\"\nCurrentModule = WallyToolbox\nDocTestSetup = quote\n using WallyToolbox\nend","category":"page"},{"location":"WallyToolbox/unstable/#DryUtilities","page":"Unstable","title":"DryUtilities","text":"","category":"section"},{"location":"WallyToolbox/unstable/","page":"Unstable","title":"Unstable","text":"danger: Danger\nThis module is deprecated and is progressivelly migrating to the root.","category":"page"},{"location":"WallyToolbox/unstable/","page":"Unstable","title":"Unstable","text":"CurrentModule = DryUtilities\nDocTestSetup = quote\n using DryUtilities\n using DryUtilities: heaviside, interval, makestepwise1d\n using DryUtilities: closestpowerofx, axesunitscaler\n using DryUtilities: maxrelativechange, maxabsolutechange\nend","category":"page"},{"location":"WallyToolbox/unstable/#Handling-of-discontinuous-functions","page":"Unstable","title":"Handling of discontinuous functions","text":"","category":"section"},{"location":"WallyToolbox/unstable/","page":"Unstable","title":"Unstable","text":"Discontinuous functions are all over in real world applications. Whether they handle discrete signals sent to controllers or represent a material property change in the solution domain of a heat transfer simulation, they are often represented by a single or a composition of Heaviside step functions. Again, because its implementation is pretty simple and optimization routines require a differentiable form of this function, DryUtilities implements heaviside and interval as proposed in this StackOverflow answer.","category":"page"},{"location":"WallyToolbox/unstable/","page":"Unstable","title":"Unstable","text":"julia> heaviside(-1) == 0\ntrue\n\njulia> heaviside(-1.0) == 0.0\ntrue\n\njulia> heaviside(0.0) == 0.5\ntrue\n\njulia> heaviside(1.0) == 1.0\ntrue\n\njulia> interval(10; a = 0, b = 10) == 0.5\ntrue","category":"page"},{"location":"WallyToolbox/unstable/","page":"Unstable","title":"Unstable","text":"We see below that heaviside also works on ranges","category":"page"},{"location":"WallyToolbox/unstable/","page":"Unstable","title":"Unstable","text":"julia> heaviside(-2:2)\n5-element Vector{Float64}:\n 0.0\n 0.0\n 0.5\n 1.0\n 1.0","category":"page"},{"location":"WallyToolbox/unstable/","page":"Unstable","title":"Unstable","text":"DryUtilities.heaviside","category":"page"},{"location":"WallyToolbox/unstable/#DryUtilities.heaviside","page":"Unstable","title":"DryUtilities.heaviside","text":"heaviside(t)\n\nProvides a Heaviside function compatible with automatic differentiation. This is a requirement for conceiving, e.g., model predictive controls with discontinuous functions under ModelingToolkit.\n\n\n\n\n\n","category":"function"},{"location":"WallyToolbox/unstable/","page":"Unstable","title":"Unstable","text":"By implementation inheritance that is also the case for interval:","category":"page"},{"location":"WallyToolbox/unstable/","page":"Unstable","title":"Unstable","text":"julia> interval(0:6; a = 2, b = 5)\n7-element Vector{Float64}:\n 0.0\n 0.0\n 0.5\n 1.0\n 1.0\n 0.5\n 0.0","category":"page"},{"location":"WallyToolbox/unstable/","page":"Unstable","title":"Unstable","text":"DryUtilities.interval","category":"page"},{"location":"WallyToolbox/unstable/#DryUtilities.interval","page":"Unstable","title":"DryUtilities.interval","text":"interval(x; a=-Inf, b=Inf)\n\nReturns 1 if x (a b), 1/2 for x = a x = b, or 0.\n\n\n\n\n\n","category":"function"},{"location":"WallyToolbox/unstable/","page":"Unstable","title":"Unstable","text":"As it is the case for representation of specific heats using NASA7/NASA9 or Shomate polynomials, functions defined by parts with an specific change point are also required in physical modeling. To this end, a stepwise function can be established with makestepwise1d. If keyword differentialble = true, then the function makes use of the above interval and remains compatible with ModelingToolkit, for instance.","category":"page"},{"location":"WallyToolbox/unstable/","page":"Unstable","title":"Unstable","text":"julia> f = makestepwise1d(x->x, x->x^2, 1.0; differentiable = true);\n\njulia> f(0:0.2:2.0)\n11-element Vector{Float64}:\n 0.0\n 0.2\n 0.4\n 0.6\n 0.8\n 1.0\n 1.44\n 1.9599999999999997\n 2.5600000000000005\n 3.24\n 4.0\n\njulia> using ModelingToolkit\n\njulia> @variables x\n1-element Vector{Num}:\n x\n\njulia> f(x); # Output is too long, try by yourself.","category":"page"},{"location":"WallyToolbox/unstable/","page":"Unstable","title":"Unstable","text":"DryUtilities.makestepwise1d","category":"page"},{"location":"WallyToolbox/unstable/#DryUtilities.makestepwise1d","page":"Unstable","title":"DryUtilities.makestepwise1d","text":"makestepwise1d(lo, hi, xc)\n\nCreates an univariate function that is composed of two parts, the first evaluated before a critical domain point xc, and the second above that value. This is often required, for instance, for the evaluation of NASA polynomials for thermodynamic properties. If differentiable, then the returned function is compatible with symbolic argument as required when using package ModelingToolkit, etc.\n\n\n\n\n\n","category":"function"},{"location":"WallyToolbox/unstable/#Rounding-numbers-and-automatic-axes","page":"Unstable","title":"Rounding numbers and automatic axes","text":"","category":"section"},{"location":"WallyToolbox/unstable/","page":"Unstable","title":"Unstable","text":"danger: Danger\nThis section documents functions that are used in a very unstable context.","category":"page"},{"location":"WallyToolbox/unstable/","page":"Unstable","title":"Unstable","text":"Simple rounding is not enough. Getting values that are rounded close to a power of a given number and rounded to floor or ceil is often the case. This is standardized in DryTooling through closestpowerofx:","category":"page"},{"location":"WallyToolbox/unstable/","page":"Unstable","title":"Unstable","text":"julia> closestpowerofx(10)\n10\n\njulia> closestpowerofx(11)\n20\n\njulia> closestpowerofx(11, roundf = floor)\n10\n\njulia> closestpowerofx(11, x = 5, roundf = floor)\n10\n\njulia> closestpowerofx(12.0; x = 10)\n20\n\njulia> closestpowerofx(12.0; x = 10, roundf = floor)\n10\n\njulia> closestpowerofx(12.0; x = 10, roundf = round)\n10","category":"page"},{"location":"WallyToolbox/unstable/","page":"Unstable","title":"Unstable","text":"DryUtilities.closestpowerofx","category":"page"},{"location":"WallyToolbox/unstable/#DryUtilities.closestpowerofx","page":"Unstable","title":"DryUtilities.closestpowerofx","text":"closestpowerofx(\n v::Number;\n x::Number = 10,\n roundf::Function = ceil\n)::Int64\n\nCompute the integer power of x closest to v using roundf as rouding method. This might be useful for automatic setting more reasonable limits to plot axis or similar applications. Changing the rouding method through roundf is also possible.\n\n\n\n\n\n","category":"function"},{"location":"WallyToolbox/unstable/","page":"Unstable","title":"Unstable","text":"Below we illustrate the usage of axesunitscaler.","category":"page"},{"location":"WallyToolbox/unstable/","page":"Unstable","title":"Unstable","text":"NOTE: this function is not yet stable. In the future it will instead return labels using symbols like k, M, G, etc., for the units through a flag provided by the user.","category":"page"},{"location":"WallyToolbox/unstable/","page":"Unstable","title":"Unstable","text":"julia> axesunitscaler(1)\n(\"\", 1)\n\njulia> axesunitscaler(1000)\n(\"[×1000]\", 1000)\n\njulia> axesunitscaler(1000000)\n(\"[×1000000]\", 1000000)","category":"page"},{"location":"WallyToolbox/unstable/","page":"Unstable","title":"Unstable","text":"DryUtilities.axesunitscaler","category":"page"},{"location":"WallyToolbox/unstable/#DryUtilities.axesunitscaler","page":"Unstable","title":"DryUtilities.axesunitscaler","text":"axesunitscaler(x::Number)::Tuple{String, Int64}\n\nFind scaling factor for multiples of 1000 units. Together with closestpowerofx this can be used to produce better automatic plot axes limits. The returned values provide the string for modifying the axis label and the associated scaling factor.\n\n\n\n\n\n","category":"function"},{"location":"WallyToolbox/unstable/#Computation-of-changes-and-residuals","page":"Unstable","title":"Computation of changes and residuals","text":"","category":"section"},{"location":"WallyToolbox/unstable/","page":"Unstable","title":"Unstable","text":"danger: Danger\nThis section documents functions that are used in a very unstable context.","category":"page"},{"location":"WallyToolbox/unstable/","page":"Unstable","title":"Unstable","text":"DryUtilities.maxabsolutechange\nDryUtilities.maxrelativechange","category":"page"},{"location":"WallyToolbox/unstable/#DryUtilities.maxabsolutechange","page":"Unstable","title":"DryUtilities.maxabsolutechange","text":"Maximum absolute change in a solution array.\n\n\n\n\n\n","category":"function"},{"location":"WallyToolbox/unstable/#DryUtilities.maxrelativechange","page":"Unstable","title":"DryUtilities.maxrelativechange","text":"Maximum relative change in a solution array.\n\n\n\n\n\n","category":"function"},{"location":"WallyToolbox/unstable/#Unit-conversion","page":"Unstable","title":"Unit conversion","text":"","category":"section"},{"location":"WallyToolbox/unstable/","page":"Unstable","title":"Unstable","text":"DryUtilities.nm3_h_to_kg_h\nDryUtilities.kg_h_to_nm3_h","category":"page"},{"location":"WallyToolbox/unstable/#DryUtilities.nm3_h_to_kg_h","page":"Unstable","title":"DryUtilities.nm3_h_to_kg_h","text":"Convert [Nm³/h] to [kg/h].\n\n\n\n\n\n","category":"function"},{"location":"WallyToolbox/unstable/#DryUtilities.kg_h_to_nm3_h","page":"Unstable","title":"DryUtilities.kg_h_to_nm3_h","text":"Convert [kg/h] to [Nm³/h].\n\n\n\n\n\n","category":"function"},{"location":"References/@Guo2023e/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Guo2023e/","page":"-","title":"-","text":"title: \"Unraveling the design pattern of physics-informed neural networks: Series 05\" authors: Shuai Guo year: 2023 URL: https://towardsdatascience.com/unraveling-the-design-pattern-of-physics-informed-neural-networks-part-05-67a35a984b23 –-","category":"page"},{"location":"References/@Fogler1999/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Fogler1999/","page":"-","title":"-","text":"title: \"Elements of chemical reaction engineering\" authors: H. Scott Fogler year: 1999 –-","category":"page"},{"location":"References/@Balaji2014/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Balaji2014/","page":"-","title":"-","text":"title: Essentials of radiation heat transfer authors: C. Balaji year: 2014 Drive: https://1drv.ms/b/s!Ar4x-UlrYAiZoCdJkJqcjDRZVs9J?e=mbefIU –-","category":"page"},{"location":"References/@Kramers1952/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Kramers1952/","page":"-","title":"-","text":"title: The passage of granular solids through inclined rotary kilns authors: H. Kramers, P. Croockewit year: 1952 –-","category":"page"},{"location":"References/@Lawn1987/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Lawn1987/","page":"-","title":"-","text":"title: Principles of combustion engineering for boilers authors: C. J. Lawn year: 1987 –-","category":"page"},{"location":"References/@Lawn1987/#Chapter-2-The-combustion-of-HFO","page":"-","title":"Chapter 2 - The combustion of HFO","text":"","category":"section"},{"location":"References/@Lawn1987/","page":"-","title":"-","text":"Main constituents: paraffins, naphthenes (C_5-C_9), and aromatics. Specially useful due to its high specific energy content and high density (easy to transport), easily atomized, and almost completely combustible.","category":"page"},{"location":"References/@Lawn1987/","page":"-","title":"-","text":"Correlation index CI against relative density S and reciprocal of average boiling point is a good indicator of oil major components:","category":"page"},{"location":"References/@Lawn1987/","page":"-","title":"-","text":"CI = 4739S - 4568 + frac48640T_B\nquadbegincases\nCI 50 textPredominantly aromatic components6pt\n15 CI 50 textMainly naphthenes or a mixture of all types6pt\n15 CI textPredominantly paraffinic components\nendcases","category":"page"},{"location":"References/@Lawn1987/","page":"-","title":"-","text":"Typical elemental composition (given in mass percentages):","category":"page"},{"location":"References/@Lawn1987/","page":"-","title":"-","text":"Element wt%\nCarbon 83-87\nHydrogen 10-14\nSuphur 0.05-6\nNitrogen 0.1-2\nOxygen 0.05-1.5","category":"page"},{"location":"References/@Lawn1987/","page":"-","title":"-","text":"Viscosity is highly dependent on temperature and used to control the characteristics of atomization in burners; for class G (main industrial application) of BS 2869 the typical kinematic viscosity at 80 °C is limited to 85 cSt; its maximum water content is 1% and ash production 0f 0.25% (see Table II for details and other classes). Viscosity is known to deviate from Newtonian at near pour point and the boiling point of its more volatile components.","category":"page"},{"location":"References/@Lawn1987/","page":"-","title":"-","text":"When decreasing the hydrogen to carbon ratio the specific energy is also decreased, and this follows an increase of specific density of fuels. According to BS 2869, the net calorific value can be estimated from the density of the oil rho_lkgcdotpl^ -1 at 15 °C:","category":"page"},{"location":"References/@Lawn1987/","page":"-","title":"-","text":"DeltaH_net=left(46423-8792rho_l^2+3170rho_lright)left(1-x-y-sright)+9420s-2449x","category":"page"},{"location":"References/@Lawn1987/","page":"-","title":"-","text":"where x is the mass fraction of water, y the mass fraction of ash, and s the mass fraction of Sulphur; the resulting value is provided in MJcdotpkg^-1. Deviations are reported to be less than 1% when compared to bomb calorimetry data. Regarding specific heat a quite old (Cragoe, 1929) relationship based on relative density S is given in Jcdotpkg^-1 as:","category":"page"},{"location":"References/@Lawn1987/","page":"-","title":"-","text":"c_p = frac1683 + 339TS","category":"page"},{"location":"References/@Lawn1987/","page":"-","title":"-","text":"Typical value of surface tension are generally around 24-38times10^-3Ncdotpm^-1 at 20 °C and present a typical slope of -007times10^-3Ncdotpm^-1K^-1 from room temperature up to 120 °C. Notice that this may be highly affected by actual fuel composition, so estimations must be used with care.","category":"page"},{"location":"References/@Lawn1987/","page":"-","title":"-","text":"Combustion characteristics in general: maximum droplet heating rate around 10^5Kcdotps^-1 and flame temperatures of 2120K, with a fuel residence time 2s. Droplets are generally injected from fractions of micron to 500mum. The mechanism of combustion generally happens as follows:","category":"page"},{"location":"References/@Lawn1987/","page":"-","title":"-","text":"Volatiles phase: occurs between 250-350 °C and is characterized by the formation of a volatiles shell around the droplets, giving an aspect of granularity. It evolves till the unset of boiling, which occurs quite sharply somewhere in range 300-400 °C. Boiling leads to distortion and swealing, favoring breakup; several ejections might occur at this stage. The competing mechanisms during this phase are distillation and pyrolysis; the fuel composition and heating rate will determine the prevailing one.\n","category":"page"},{"location":"References/@Lawn1987/","page":"-","title":"-","text":"See figures 8-9 of reference for more details regarding droplet history.","category":"page"},{"location":"References/@Haider1989/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Haider1989/","page":"-","title":"-","text":"title: Drag coefficient and terminal velocity of spherical and nonspherical particles authors: A. Haider, O. Levenspiel year: 1989 URL: TODO –-","category":"page"},{"location":"References/@Crank1996/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Crank1996/","page":"-","title":"-","text":"title: \"A practical method for Numerical evaluation of solutions of partial differential equations of the heat-conduction type\" authors: J. Crank, P. Nicolson year: 1996 –-","category":"page"},{"location":"References/@Masamune1963a/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Masamune1963a/","page":"-","title":"-","text":"title: \"Thermal conductivity of beds of spherical particles\" authors: Shinobu Masamune, J. M. Smith year: 1963 –-","category":"page"},{"location":"References/@Onsager1931a/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Onsager1931a/","page":"-","title":"-","text":"title: Reciprocal relations in irreversible processes. II. authors: Lars Onsager year: 1931 –-","category":"page"},{"location":"References/@Sanchez2023a/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Sanchez2023a/","page":"-","title":"-","text":"title: \"Biomass combustion modeling using OpenFOAM: Development of a simple computational model and study of the combustion performance of lippia origanoides bagasse\" authors: Gabriel Fernando García Sánchez, Jorge Luis Chacón Velasco, David Alfredo Fuentes Díaz, Yesid Javier Rueda-Ordóñez, David Patiño, Juan Jesús Rico, Jairo René Martínez Morales year: 2023 URL: https://doi.org/10.3390/en16062932 Drive: https://1drv.ms/b/s!Ar4x-UlrYAiZlbEgWeJ66H4-cfxBiQ?e=YQGseW –-","category":"page"},{"location":"Notes/Server/","page":"Excalidraw Data","title":"Excalidraw Data","text":"","category":"page"},{"location":"Notes/Server/","page":"Excalidraw Data","title":"Excalidraw Data","text":"excalidraw-plugin: parsed tags: [excalidraw]","category":"page"},{"location":"Notes/Server/","page":"Excalidraw Data","title":"Excalidraw Data","text":"","category":"page"},{"location":"Notes/Server/","page":"Excalidraw Data","title":"Excalidraw Data","text":"==⚠ Switch to EXCALIDRAW VIEW in the MORE OPTIONS menu of this document. ⚠==","category":"page"},{"location":"Notes/Server/#Excalidraw-Data","page":"Excalidraw Data","title":"Excalidraw Data","text":"","category":"section"},{"location":"Notes/Server/#Text-Elements","page":"Excalidraw Data","title":"Text Elements","text":"","category":"section"},{"location":"Notes/Server/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Mini PC Windows (300€) ^Uueo5gHK","category":"page"},{"location":"Notes/Server/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Hard Drive 4T ^FhQ5lsif","category":"page"},{"location":"Notes/Server/","page":"Excalidraw Data","title":"Excalidraw Data","text":"RPI 3B + 218G ^HoeV5did","category":"page"},{"location":"Notes/Server/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Modem ^HadSLSNc","category":"page"},{"location":"Notes/Server/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Hard Drive 4T ^QXBMf68R","category":"page"},{"location":"Notes/Server/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Lenovo P51 ^syyrpie8","category":"page"},{"location":"Notes/Server/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Microsoft Go2 ^WKcG8Hqi","category":"page"},{"location":"Notes/Server/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Simulation Tower (10k€) ^lxDKJklC","category":"page"},{"location":"Notes/Server/","page":"Excalidraw Data","title":"Excalidraw Data","text":"As cheap as can be but enough to navigate the internet, its ONLY goal is to synchronize OneDrive ^a52WjlNf","category":"page"},{"location":"Notes/Server/","page":"Excalidraw Data","title":"Excalidraw Data","text":"This will become a headless server for playing from anywhere and management. It will also provide FTP and videos. ^cojFGwIh","category":"page"},{"location":"Notes/Server/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Screen 1 ^GKAeCKhC","category":"page"},{"location":"Notes/Server/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Screen 2 ^cIV46vNj","category":"page"},{"location":"Notes/Server/","page":"Excalidraw Data","title":"Excalidraw Data","text":"5 ^P1kjNtqN","category":"page"},{"location":"Notes/Server/","page":"Excalidraw Data","title":"Excalidraw Data","text":"4 ^8WxijHIz","category":"page"},{"location":"Notes/Server/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Paperless ^Me8wBIVM","category":"page"},{"location":"Notes/Server/","page":"Excalidraw Data","title":"Excalidraw Data","text":"VS Code ^StikJtl5","category":"page"},{"location":"Notes/Server/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Python ^ZPRvEXu5","category":"page"},{"location":"Notes/Server/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Julia ^diMhDImF","category":"page"},{"location":"Notes/Server/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Jupyter ^tfXU42e5","category":"page"},{"location":"Notes/Server/","page":"Excalidraw Data","title":"Excalidraw Data","text":"%%","category":"page"},{"location":"Notes/Server/#Drawing","page":"Excalidraw Data","title":"Drawing","text":"","category":"section"},{"location":"Notes/Server/","page":"Excalidraw Data","title":"Excalidraw Data","text":"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=","category":"page"},{"location":"Notes/Server/","page":"Excalidraw Data","title":"Excalidraw Data","text":"%%","category":"page"},{"location":"References/@Sweldens1998a/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Sweldens1998a/","page":"-","title":"-","text":"title: \"The lifting scheme: A construction of second generation wavelets\" authors: Wim Sweldens year: 1998 URL: https://doi.org/10.1137/S0036141095289051 Drive: –-","category":"page"},{"location":"Computing/02-General-Computing-Skills/#General-computing-skills","page":"General computing skills","title":"General computing skills","text":"","category":"section"},{"location":"Computing/02-General-Computing-Skills/","page":"General computing skills","title":"General computing skills","text":"","category":"page"},{"location":"Computing/02-General-Computing-Skills/#Git-version-control","page":"General computing skills","title":"Git version control","text":"","category":"section"},{"location":"Computing/02-General-Computing-Skills/#Version-control-in-Windows","page":"General computing skills","title":"Version control in Windows","text":"","category":"section"},{"location":"Computing/02-General-Computing-Skills/","page":"General computing skills","title":"General computing skills","text":"TortoiseGIT: for Windows users, this applications add the possibility of managing version control and other features directly from the file explorer.","category":"page"},{"location":"Computing/02-General-Computing-Skills/#Adding-submodules","page":"General computing skills","title":"Adding submodules","text":"","category":"section"},{"location":"Computing/02-General-Computing-Skills/","page":"General computing skills","title":"General computing skills","text":"Generally speaking adding a submodule to a repository should be a simple matter of:","category":"page"},{"location":"Computing/02-General-Computing-Skills/","page":"General computing skills","title":"General computing skills","text":"git submodule add https:////","category":"page"},{"location":"Computing/02-General-Computing-Skills/","page":"General computing skills","title":"General computing skills","text":"Nonetheless this might fail, especially for large sized repositories; I faced this issue which I tried to fix by increasing buffer size as reported in the link. This solved the issue but led me to another problem which could be solved by degrading HTTP protocol.","category":"page"},{"location":"Computing/02-General-Computing-Skills/","page":"General computing skills","title":"General computing skills","text":"","category":"page"},{"location":"Computing/02-General-Computing-Skills/#Working-on-Windows","page":"General computing skills","title":"Working on Windows","text":"","category":"section"},{"location":"Computing/02-General-Computing-Skills/#Creating-a-portable-launcher","page":"General computing skills","title":"Creating a portable launcher","text":"","category":"section"},{"location":"Computing/02-General-Computing-Skills/","page":"General computing skills","title":"General computing skills","text":"A simple way to create a portable launcher requiring to source extra variables is by writing a simple batch script exporting or calling another script with the definitions:","category":"page"},{"location":"Computing/02-General-Computing-Skills/","page":"General computing skills","title":"General computing skills","text":"@echo off\n\n@REM Add variables to be sourced here such as\n@REM set PATH=\"/path/to/some/dir\";%PATH%\n@REM ... or call another shared script doing so.\n@REM call %~dp0\\env\n\nMyCode.exe","category":"page"},{"location":"Computing/02-General-Computing-Skills/","page":"General computing skills","title":"General computing skills","text":"Because a batch script will keep a console window open, create a VB file with the following","category":"page"},{"location":"Computing/02-General-Computing-Skills/","page":"General computing skills","title":"General computing skills","text":"Set oShell = CreateObject (\"Wscript.Shell\") \nDim strArgs\nstrArgs = \"cmd /c MyCode.bat\"\noShell.Run strArgs, 0, false","category":"page"},{"location":"Computing/02-General-Computing-Skills/","page":"General computing skills","title":"General computing skills","text":"In the example we assume the program is called MyCode.exe and the batch script has been named in an analogous way MyCode.bat. Some real world examples are provided here.","category":"page"},{"location":"Computing/02-General-Computing-Skills/#Mount-a-network-drive-in-WSL","page":"General computing skills","title":"Mount a network drive in WSL","text":"","category":"section"},{"location":"Computing/02-General-Computing-Skills/","page":"General computing skills","title":"General computing skills","text":"Here we assume we will mount drive Z: at /mnt/z:","category":"page"},{"location":"Computing/02-General-Computing-Skills/","page":"General computing skills","title":"General computing skills","text":"# Create the mount point (if required):\nsudo mkdir /mnt/z\n\n# Mount the network drive in WSL:\nsudo mount -t drvfs Z: /mnt/z","category":"page"},{"location":"Computing/02-General-Computing-Skills/","page":"General computing skills","title":"General computing skills","text":"","category":"page"},{"location":"Computing/02-General-Computing-Skills/#Regular-expressions","page":"General computing skills","title":"Regular expressions","text":"","category":"section"},{"location":"Computing/02-General-Computing-Skills/","page":"General computing skills","title":"General computing skills","text":"Regular expressions (or simply regex) processing is a must-have skill for anyone doing scientific computing. Most programs produce results or logs in plain text and do not support specific data extraction from those. There regex becomes your best friend. Unfortunately during the years many flavors of regex appeared, each claiming to offer advantages or to be more formal than its predecessors. Due to this, learning regex is often language-specific (most of the time you create and process regex from your favorite language) and sometimes even package-specific. Needless to say, regex may be more difficult to master than assembly programming.","category":"page"},{"location":"Computing/02-General-Computing-Skills/","page":"General computing skills","title":"General computing skills","text":"Useful web applications can be found in regex101 and regexr.\nMatch all characters between two strings with lookbehind and look ahead patterns. Notice that this will require the enclosing strings to be fixed (at least under PCRE). For processing WallyTutor.jl documentation I have used a more generic approach but less general than what is proposed here.\nMatch any character across multiple lines with (.|\\n)*.\nCurrently joining regexes in Julia might be tricky (because of escaping characters); a solution is proposed here and seems to work just fine with minimal extra coding.","category":"page"},{"location":"Computing/02-General-Computing-Skills/","page":"General computing skills","title":"General computing skills","text":"","category":"page"},{"location":"Computing/02-General-Computing-Skills/#\\LaTeX","page":"General computing skills","title":"LaTeX","text":"","category":"section"},{"location":"Computing/02-General-Computing-Skills/#Math-typesetting-with-\\LaTeX","page":"General computing skills","title":"Math typesetting with LaTeX","text":"","category":"section"},{"location":"Computing/02-General-Computing-Skills/","page":"General computing skills","title":"General computing skills","text":"For integrals to display the same size as fractions expanded with \\dfrac, place a \\displaystyle in front of the \\int command.","category":"page"},{"location":"Computing/02-General-Computing-Skills/#Code-typesetting-with-\\LaTeX","page":"General computing skills","title":"Code typesetting with LaTeX","text":"","category":"section"},{"location":"Computing/02-General-Computing-Skills/","page":"General computing skills","title":"General computing skills","text":"For some reason minted blocks \\begin{minted}...\\end{minted} have problems to render in Beamer (something related to multilevel macros). I managed to insert code blocks with \\inputminted as reported here.\nBeamer have some issues with footnotes, especially when use column environments; a quick fix for this is through \\footnotemark and \\footnotetext[]{} as described here. Notice that \\footnotemark automatically generates the counter for use as in \\footnotetext.\nFor setting a background watermark in Beamer one can use package background and display it using a Beamer template as described here.","category":"page"},{"location":"Computing/02-General-Computing-Skills/#MiKTeX","page":"General computing skills","title":"MiKTeX","text":"","category":"section"},{"location":"Computing/02-General-Computing-Skills/","page":"General computing skills","title":"General computing skills","text":"mathkerncmssi source file could not be found\nInstalling user packages and classes","category":"page"},{"location":"Computing/02-General-Computing-Skills/#LaTeX-Workshop","page":"General computing skills","title":"LaTeX Workshop","text":"","category":"section"},{"location":"Computing/02-General-Computing-Skills/","page":"General computing skills","title":"General computing skills","text":"Configuring builds in VS Code with LaTeX Workshop for building with pdflatex. Finally I ended creating my own workflows in this file.","category":"page"},{"location":"Computing/04-Geometry-and-Preprocessing/#Geometry-and-Preprocessing","page":"Geometry and Preprocessing","title":"Geometry and Preprocessing","text":"","category":"section"},{"location":"Computing/04-Geometry-and-Preprocessing/#Computer-assisted-design","page":"Geometry and Preprocessing","title":"Computer assisted design","text":"","category":"section"},{"location":"Computing/04-Geometry-and-Preprocessing/#[FreeCAD](https://www.freecad.org/)","page":"Geometry and Preprocessing","title":"FreeCAD","text":"","category":"section"},{"location":"Computing/04-Geometry-and-Preprocessing/","page":"Geometry and Preprocessing","title":"Geometry and Preprocessing","text":"","category":"page"},{"location":"Computing/04-Geometry-and-Preprocessing/#[Salome](https://www.salome-platform.org/)","page":"Geometry and Preprocessing","title":"Salome","text":"","category":"section"},{"location":"Computing/04-Geometry-and-Preprocessing/","page":"Geometry and Preprocessing","title":"Geometry and Preprocessing","text":"Documentation","category":"page"},{"location":"Computing/04-Geometry-and-Preprocessing/#Rotating-reactor","page":"Geometry and Preprocessing","title":"Rotating reactor","text":"","category":"section"},{"location":"Computing/04-Geometry-and-Preprocessing/","page":"Geometry and Preprocessing","title":"Geometry and Preprocessing","text":"In this tutorial we illustrate how to produce a STL surface for use with DEM simulation or meshing with other tools (such as snappyHexMesh).","category":"page"},{"location":"Computing/04-Geometry-and-Preprocessing/","page":"Geometry and Preprocessing","title":"Geometry and Preprocessing","text":"The first step in Salome Shaper to create a geometry is to add a part using the button indicated below:","category":"page"},{"location":"Computing/04-Geometry-and-Preprocessing/","page":"Geometry and Preprocessing","title":"Geometry and Preprocessing","text":"(Image: 00-create-part.png)","category":"page"},{"location":"Computing/04-Geometry-and-Preprocessing/","page":"Geometry and Preprocessing","title":"Geometry and Preprocessing","text":"To add a sketch, select the created part on the object tree and click on button Sketch:","category":"page"},{"location":"Computing/04-Geometry-and-Preprocessing/","page":"Geometry and Preprocessing","title":"Geometry and Preprocessing","text":"(Image: 01-add-sketch-to-part.png)","category":"page"},{"location":"Computing/04-Geometry-and-Preprocessing/","page":"Geometry and Preprocessing","title":"Geometry and Preprocessing","text":"Then select the sketching plane and set plane view to start drawing:","category":"page"},{"location":"Computing/04-Geometry-and-Preprocessing/","page":"Geometry and Preprocessing","title":"Geometry and Preprocessing","text":"(Image: 02-select-set-plane-view.png)","category":"page"},{"location":"Computing/04-Geometry-and-Preprocessing/","page":"Geometry and Preprocessing","title":"Geometry and Preprocessing","text":"Reactor body will be a cylinder with lifters. Here we start by drawing a circle for later extruding it. It is important to snap the center of the cylinder to the origin of coordinate systems and Salome will handle the constraint automatically.","category":"page"},{"location":"Computing/04-Geometry-and-Preprocessing/","page":"Geometry and Preprocessing","title":"Geometry and Preprocessing","text":"(Image: 03-start-sketching-part.png)","category":"page"},{"location":"Computing/04-Geometry-and-Preprocessing/","page":"Geometry and Preprocessing","title":"Geometry and Preprocessing","text":"Using the radius tool you can now constraint the size of shape. Notice that this could also employ symbolic values declarer in the dedicated manager.","category":"page"},{"location":"Computing/04-Geometry-and-Preprocessing/","page":"Geometry and Preprocessing","title":"Geometry and Preprocessing","text":"(Image: 04-add-geometrical-constraints.png)","category":"page"},{"location":"Computing/04-Geometry-and-Preprocessing/","page":"Geometry and Preprocessing","title":"Geometry and Preprocessing","text":"Using the line tool we can draw the lifters profile. Again we can make use of Salome auto-constraning functionality by placing the cursor over the circle before starting the sketch, so that it becomes light blue. By doing this, once we try to set dimensions of the newly drawn lines, their tips will follow along the circle path.","category":"page"},{"location":"Computing/04-Geometry-and-Preprocessing/","page":"Geometry and Preprocessing","title":"Geometry and Preprocessing","text":"(Image: 05-draw-with-constraints.png)","category":"page"},{"location":"Computing/04-Geometry-and-Preprocessing/","page":"Geometry and Preprocessing","title":"Geometry and Preprocessing","text":"It is also important to notice that if you draw perfectly vertical or horizontal lines, Salome Shaper will again apply auto-constraints, as depicted below:","category":"page"},{"location":"Computing/04-Geometry-and-Preprocessing/","page":"Geometry and Preprocessing","title":"Geometry and Preprocessing","text":"(Image: 06-draw-with-constraints.png)","category":"page"},{"location":"Computing/04-Geometry-and-Preprocessing/","page":"Geometry and Preprocessing","title":"Geometry and Preprocessing","text":"With the horizontal distance tool you can set distances between objects:","category":"page"},{"location":"Computing/04-Geometry-and-Preprocessing/","page":"Geometry and Preprocessing","title":"Geometry and Preprocessing","text":"(Image: 07-constrain-other-parts.png)","category":"page"},{"location":"Computing/04-Geometry-and-Preprocessing/","page":"Geometry and Preprocessing","title":"Geometry and Preprocessing","text":"Similarly, you can also set lengths with the adequate tool:","category":"page"},{"location":"Computing/04-Geometry-and-Preprocessing/","page":"Geometry and Preprocessing","title":"Geometry and Preprocessing","text":"(Image: 08-add-constraints-till-end.png)","category":"page"},{"location":"Computing/04-Geometry-and-Preprocessing/","page":"Geometry and Preprocessing","title":"Geometry and Preprocessing","text":"Using the trimming tool you can remove segments that are intercepted by points:","category":"page"},{"location":"Computing/04-Geometry-and-Preprocessing/","page":"Geometry and Preprocessing","title":"Geometry and Preprocessing","text":"(Image: 09-trim-undesired-lines.png)","category":"page"},{"location":"Computing/04-Geometry-and-Preprocessing/","page":"Geometry and Preprocessing","title":"Geometry and Preprocessing","text":"Once sketch is ready, you can validate to pursue 3D modeling:","category":"page"},{"location":"Computing/04-Geometry-and-Preprocessing/","page":"Geometry and Preprocessing","title":"Geometry and Preprocessing","text":"(Image: 10-finish-sketch-clicking-on-V.png)","category":"page"},{"location":"Computing/04-Geometry-and-Preprocessing/","page":"Geometry and Preprocessing","title":"Geometry and Preprocessing","text":"Among the several possible extrusion methods, you can select to extrude only the profile. Do not forget to select the objects, direction and depth to extrude. Using auxiliary lines it is virtually possible to extrude in any direction other than perpendicular to sketch plane.","category":"page"},{"location":"Computing/04-Geometry-and-Preprocessing/","page":"Geometry and Preprocessing","title":"Geometry and Preprocessing","text":"(Image: 11-extrude-the-profile-only.png)","category":"page"},{"location":"Computing/04-Geometry-and-Preprocessing/","page":"Geometry and Preprocessing","title":"Geometry and Preprocessing","text":"Here we are ready to go to menu File > Export > To CAD format... and select STL option and the path to the target file. Notice that if the design was composed of several parts, in this step you would need to export them individually by selecting one part at a time.","category":"page"},{"location":"Computing/04-Geometry-and-Preprocessing/","page":"Geometry and Preprocessing","title":"Geometry and Preprocessing","text":"(Image: 12-export-to-stl-file.png)","category":"page"},{"location":"Computing/04-Geometry-and-Preprocessing/","page":"Geometry and Preprocessing","title":"Geometry and Preprocessing","text":"Now you have a reactor profile for use in a simulation setup.","category":"page"},{"location":"Computing/04-Geometry-and-Preprocessing/#Grid-generation","page":"Geometry and Preprocessing","title":"Grid generation","text":"","category":"section"},{"location":"Computing/04-Geometry-and-Preprocessing/#[gmsh](https://gmsh.info/)","page":"Geometry and Preprocessing","title":"gmsh","text":"","category":"section"},{"location":"Computing/04-Geometry-and-Preprocessing/#[netgen](https://ngsolve.org/)","page":"Geometry and Preprocessing","title":"netgen","text":"","category":"section"},{"location":"Computing/04-Geometry-and-Preprocessing/#[tetgen](https://wias-berlin.de/software/tetgen/1.5/index.html)","page":"Geometry and Preprocessing","title":"tetgen","text":"","category":"section"},{"location":"References/@Koh1971a/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Koh1971a/","page":"-","title":"-","text":"title: \"Thermal conductivity and electrical resistivity of porous metallic materials\" authors: J. C. Y. Koh, Anthony Fortini year: 1971 –-","category":"page"},{"location":"References/@Mujumdar2006i/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Mujumdar2006i/","page":"-","title":"-","text":"title: \"Simulation of rotary cement kilns using a one-dimensional model\" authors: Kaustubh S. Mujumdar, Vivek V. Ranade year: 2006 –-","category":"page"},{"location":"References/@Tensorflow2015Whitepaper/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Tensorflow2015Whitepaper/","page":"-","title":"-","text":"title: \"TensorFlow: Large-scale machine learning on heterogeneous systems\" authors: Martín Abadi, Ashish Agarwal, Paul Barham, Eugene Brevdo, Zhifeng Chen, Craig Citro, Greg S. Corrado, Andy Davis, Jeffrey Dean, Matthieu Devin, Sanjay Ghemawat, Ian Goodfellow, Andrew Harp, Geoffrey Irving, Michael Isard, Yangqing Jia, Rafal Jozefowicz, Lukasz Kaiser, Manjunath Kudlur, Josh Levenberg, Dandelion Mané, Rajat Monga, Sherry Moore, Derek Murray, Chris Olah, Mike Schuster, Jonathon Shlens, Benoit Steiner, Ilya Sutskever, Kunal Talwar, Paul Tucker, Vincent Vanhoucke, Vijay Vasudevan, Fernanda Viégas, Oriol Vinyals, Pete Warden, Martin Wattenberg, Martin Wicke, Yuan Yu, Xiaoqiang Zheng year: 2015 DOI: https://doi.org/10.5281/zenodo.4724125 –-","category":"page"},{"location":"References/@Fiedler2006a/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Fiedler2006a/","page":"-","title":"-","text":"title: \"Calculations of the thermal conductivity of porous materials\" authors: Thomas Fiedler, Ekaterina Pesetskaya, Andreas Öchsner, José Grácio year: 2006 –-","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"excalidraw-plugin: parsed tags: [excalidraw]","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"==⚠ Switch to EXCALIDRAW VIEW in the MORE OPTIONS menu of this document. ⚠==","category":"page"},{"location":"Notes/Brain/#Excalidraw-Data","page":"Excalidraw Data","title":"Excalidraw Data","text":"","category":"section"},{"location":"Notes/Brain/#Text-Elements","page":"Excalidraw Data","title":"Text Elements","text":"","category":"section"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Brain ^bA0uK4HU","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"PINNs ^Pn47WBnc","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Solve kiln model ^92u72gv3","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"ROMs ^r9eGuIr4","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Harmonic Oscillator (from Brunton) ^n90Bs0Ht","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Interop ^XLzsMIc3","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Add Fortran, Julia, and Python interfaces to RK4 in C ^6K7UnJNp","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Productivity ^bsV0my5p","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Article comparing Weave, Frankling, Pluto and Jupyter for scientific computing. Maybe nteract ^RfeTVfZo","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Computer vision ^559Ywru9","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Introductory porosity quantification in Julia ^rhMvGIOj","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Region properties of segmented pores ^Aqasmef7","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"ML ^HKk6xNwl","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"ANNs ^qKP1VQdM","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Article about training RADCAL in Julia and package creation ^nC0nVVtR","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Science and Computing 101 ^JWFx8npJ","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Undergrad courses ^F7M8Zx94","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Publishing with LaTeX 101 ^HKwKy0Eb","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Shell and Linux 101 ^Z6h5wrlV","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Tabular data in Python 101 ^xaKa9dGT","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Automating visualization ^ObWvvjKj","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"GraphViz and Gnuplot for dummies ^ftoPgCWk","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Matplotlib in 2h ^pPiz5TQQ","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Carburizing model from PhD ^XhzzmGRp","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Transport ^tCXg2mu8","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Julia for Scientists ^ez3zXh1d","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Basic module ^HA9n1RFk","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Advanced module ^MWT5lLdz","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Calphad ^C4woGMbZ","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Article about detecting corners and rectangles ^xRElE6D0","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"OpenFOAM ^iMcRf8e2","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"DWSIM ^Nhq5Bdy8","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Energy balanced CaCO3 calcination reaction ^NPleQcWs","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Progressive PFRs ^egcFwZrB","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Julia CFD ^U4ZPcmuq","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Fundamentals of numerical methods ^0NhTSDQ9","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Advection equation ^6KfA6RYV","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Diffusion equation ^9SEZI47q","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Diffusion-reaction ^P1m4LpEH","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Burgers equation ^pv23Y9ct","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Laplace and Poisson equations ^YHSNiC85","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Navier-Stokes equations ^67lUEZ2l","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Finite Volume Method ^0gX1MsRw","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Article re-implementing Tomasini (2014) in Julia ^nrS1JnEA","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Call OpenCALPHAD from Julia ^nLy6i1pF","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"CAS system ^9SNwCKSp","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"CaO-SiO2 ^9mh8UBUe","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Al2O3-SiO2 ^125sLdxw","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Al2O3-CaO ^NskFV0Yj","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"FEM ^t6SMVOto","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"DryTooling Tech ^1wnL2zxG","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"DryTooling.jl ^5NbIV4lV","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Training ^7BAW44HS","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Python for Engineers ^K5Ye0cxI","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Physics-based MPC with CasADi ^tJsZLXvE","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Data analysis with SciPy stack ^yOM0oEMa","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Dashboards with streamlit ^I9xk1J9l","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"CFD post-processing with PyVista ^Bl3RsRQt","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Julia for Engineers ^58Qs0CFa","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Dynamical systems with ModelingToolkit.jl ^Mo2M8E43","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Optimization with JuMP.jl ^ZHncvBfB","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Dashboards with Genie.jl ^wB6NrZ9N","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Consulting ^jEUettuQ","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Process Simulation ^UlQvskQU","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"OpenFOAM ^VJwADgjf","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Computing ^pP3j0ZqE","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Opportunities assessment ^LZXWiCoV","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Recruiting and head-hunting ^CrQewjXL","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Infrastructure dimensioning ^9Y8DotKm","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Carbonitriding model in FVM vs FEM ^VzSV6Pa2","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Fe-N system ^etJ5Bq3v","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Article of nitriding model with MPC automation ^O9hQBC0D","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Nitriding with phase equilibria ^r8N78zxH","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Al2O3-ZrO2 ^nK3zGlNj","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Finish PhD thesis paper with OpenFOAM simulations ^EmDJPcmS","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Carbonitriding Model ^vC5XTp0L","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Solvers ^eEQP5dWH","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Article about generalized Kramers equation solution ^J3CULMnw","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Implement all models of Slycke's papers ^m9Tl7oEF","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Fe-C system ^lNYlgd0n","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"JMAK Model for heat transfer ^HdsdfDcD","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Process ^KK5XHEiZ","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Article about chemical engineering MPC ^dFjEjkdP","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Calling C/C++ from Fortran ^PMctBhDy","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Nonlinear problems basics - article ^ioGzTE15","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Root-finding in Python - article ^tXnq49fL","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Generalization to include time-dependence ^Up57RpHf","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Find optimal carbonitriding cycle for given constrains ^6rcojs0X","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"GPU (CUDA) ^3k44G9rm","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Create Julia package with Rust ^y69kUT7J","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Crate jlrs ^S4SxKEOw","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Sample code ^7cQS9f9z","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"Basilisk ^33ZXQ1X2","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"%%","category":"page"},{"location":"Notes/Brain/#Drawing","page":"Excalidraw Data","title":"Drawing","text":"","category":"section"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"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","category":"page"},{"location":"Notes/Brain/","page":"Excalidraw Data","title":"Excalidraw Data","text":"%%","category":"page"},{"location":"References/@Aissa2015a/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Aissa2015a/","page":"-","title":"-","text":"title: Ranz and Marshall correlations limits on heat flow between a sphere and its surrounding gas at high temperature authors: Abderrahmane Aissa, Mohamed Abdelouahab, Abdelkader Noureddine, Mohammed Elganaoui, Bernard Pateyron year: 2015 –-","category":"page"},{"location":"References/@Mraz2021a/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Mraz2021a/","page":"-","title":"-","text":"title: \"Thermal conductivity of porous oxide layer: A numerical model based on CT data\" authors: Krystof Mraz, Jan Bohacek, Ondrej Resl, Martin Chabicovsky, Ebrahim Karimi-Sibaki year: 2021 –-","category":"page"},{"location":"References/@Joos1958/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Joos1958/","page":"-","title":"-","text":"title: \"Theoretical physics\" authors: Georg Joos year: 1986 –-","category":"page"},{"location":"References/@Zuo2000a/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Zuo2000a/","page":"-","title":"-","text":"title: Modelling superheated fuel sprays and vaproization authors: B. Zuo, A. M. Gomes, C. J. Rutland year: 2000 URL: https://doi.org/10.1243/1468087001545218 –-","category":"page"},{"location":"toc/#Table-of-contents","page":"Table of contents","title":"Table of contents","text":"","category":"section"},{"location":"toc/","page":"Table of contents","title":"Table of contents","text":"Depth = 4","category":"page"},{"location":"References/@Bird2001/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Bird2001/","page":"-","title":"-","text":"title: \"Transport phenomena\" authors: R. B. Bird, W. E. Stewart, E. N. Lightfoot year: 2001 –-","category":"page"},{"location":"Software/OpenFOAM11/aachenBombSteady/#Breakdown-into-sub-models","page":"-","title":"Breakdown into sub-models","text":"","category":"section"},{"location":"Software/OpenFOAM11/aachenBombSteady/","page":"-","title":"-","text":"[x] Incompressible flow only for mesh and conditions check with incompressibleFluid:","category":"page"},{"location":"Software/OpenFOAM11/aachenBombSteady/","page":"-","title":"-","text":"- After a first run with a system length of 1 m it was decided to increase the domain to 2 m in order to ensure a better development of flow profile (at least 10 times the cross section size) and double the number of cells in transversal directions.\n- It was confirmed that the inlet mean velocity profile respects the expected value from the imposed mass flow rate evaluated during parameters setup, but outlet is controversial. This is probably because the case should be run as turbulent or grid is too coarse.\n- Mass conservation was monitored and confirmed through field `phi`.\n- It must be emphasized that boundary layer resolution is not accurate since no grading is applied and mesh is very coarse, but since the goal is flare development far from the walls this is acceptable at this stage and will be dealt with at a later stage.\n- All residuals are going down adequately, allowing us to move to the next step. \n- Calculation took approximately 10 seconds with 1 core.","category":"page"},{"location":"Software/OpenFOAM11/aachenBombSteady/","page":"-","title":"-","text":"[x] Previous case is copied and support to RAS k-varepsilon Launder1974 [76] is implemented:","category":"page"},{"location":"Software/OpenFOAM11/aachenBombSteady/","page":"-","title":"-","text":"- With inclusion of turbulence the actual outlet velocity matches the expected value (that was unphysical in the previous simulation), validating the approach.\n- Entry length is verified through velocity and turbulent viscosity, confirming the need to extend the domain for a proper development.\n- The number of iterations was increased to 200 to ensure that everything has properly converged, reaching an extremely low residuals level for all variables.\n- Other previous observations are still valid, allowing us to move to the next step.\n- Calculation took approximately 11 seconds with 1 core to perform 100 iterations. After 100 iterations the step convergence becomes slow because of the already low residuals, leading to a calculation time of 38 seconds.","category":"page"},{"location":"Software/OpenFOAM11/aachenBombSteady/","page":"-","title":"-","text":"[x] Adding compressible flow with multicomponentFluid to the above:","category":"page"},{"location":"Software/OpenFOAM11/aachenBombSteady/","page":"-","title":"-","text":"- The temperature field is added prior to handling any combustion aspects in this step to avoid having interaction between these elements in convergence checks. \n- Nonetheless, gravity was already added here after a first run without it for a basic check. A vertical pressure profile is observed in the cross-section, showing the expected buoyancy effects.\n- Other Impacted files include physical properties, which now incorporate more detailed thermodynamics, `alphat` and, at least, the main chemical component file with boundary and initial conditions. \n- The mean value of `phi` in the outlet can now be compared to the imposed mass flow rate, validating the boundary condition setup.\n- Calculation took approximately 13 seconds with 1 core to perform 100 iterations. Again an important slow down is observed leading to 125 seconds to perform 300 iterations.","category":"page"},{"location":"Software/OpenFOAM11/aachenBombSteady/","page":"-","title":"-","text":"[x] The next logical step is to include evaporation of fuel in the gas, without enabling reactions:","category":"page"},{"location":"Software/OpenFOAM11/aachenBombSteady/","page":"-","title":"-","text":"- The simples way of doing so is adding the required chemical and associated initial file without adding any combustion or reaction parameters. It was chosen to use the actual species name instead of simply *fuel* to keep created files compatible with next steps. Simulation was checked before adding the cloud, which exponentially complexifies the setup.\n- A `patchPostProcessing` cloud function was tested at first to check if conditions were leading to complete fuel evaporation. It is kept commented-out for future debug if required. To make results easier to interpret, a fixed size PSD was adopted at this stage.\n- As expected, convergence is bad and the only strategy that seems to work is mesh refinement. Otherwise pressure coupling becomes difficult and trying to change numerical parameters (solver correctors, linear solver, divergence and Laplacian schemes, relaxation level) do not improve anything. Tried to use `SOI` at a later iteration to let flow converge before injection, but apparently the steady solver ignores this. Even with `localEuler` pseudo-time stepping (requires to add residuals for `rho` in `fvSolution`) it does not seem to take `SOI` into account. Also tried deactivating clouds and converging before reactivating it (what would be equivalent to the later `SOI` approach) and that does not work either, confirming it is a physical coupling problem.\n- Because of mesh refinement, now parallelization becomes a requirement unless we work with mesh grading, what is out of the present scope (to be done only in production scenario). Nonetheless, parallelization does not seem to be of great advantage.","category":"page"},{"location":"Software/OpenFOAM11/aachenBombSteady/","page":"-","title":"-","text":"[ ] Activation of global chemistry and combustion modeling:","category":"page"},{"location":"Software/OpenFOAM11/aachenBombSteady/","page":"-","title":"-","text":"- From now on the level of physics start becoming too complex and pre-computation of fields should be done whenever compatible. That means that prior to chemistry activation it seems a good idea to let evaporation of droplets converge (testing 1000 iterations).\n- To keep things general, instead of setting up the case with a fixed database of species thermodynamics, it is better to convert Chemkin files.\n-","category":"page"},{"location":"Software/OpenFOAM11/aachenBombSteady/","page":"-","title":"-","text":"[ ] Add radiation modeling\n[ ] Add arbitrary empirical fuel modeling","category":"page"},{"location":"Software/OpenFOAM11/aachenBombSteady/","page":"-","title":"-","text":"After modification the cases were run again getting the following performances, from which it becomes clear that for the present grid size the parallelization saturates quickly.","category":"page"},{"location":"Software/OpenFOAM11/aachenBombSteady/","page":"-","title":"-","text":"Step 1 processor 32 processors\n0 77 14\n1 35\n2 80\n3 \n4 ","category":"page"},{"location":"Software/OpenFOAM11/aachenBombSteady/#Future-improvements","page":"-","title":"Future improvements","text":"","category":"section"},{"location":"Software/OpenFOAM11/aachenBombSteady/","page":"-","title":"-","text":"[ ] Add the following to the parameters file for full turbulence model controls:","category":"page"},{"location":"Software/OpenFOAM11/aachenBombSteady/","page":"-","title":"-","text":"Cmu 0.09;\nC1 1.44;\nC2 1.92;\nC3 0;\nsigmak 1;\nsigmaEps 1.3;","category":"page"},{"location":"Software/OpenFOAM11/aachenBombSteady/","page":"-","title":"-","text":"[ ] Add convergence criteria PIMPLE: No convergence criteria found.\n[ ] Consider a possible adaptive mesh refinement at case setup (not runtime!).","category":"page"},{"location":"Software/OpenFOAM11/aachenBombSteady/#Reminders","page":"-","title":"Reminders","text":"","category":"section"},{"location":"Software/OpenFOAM11/aachenBombSteady/","page":"-","title":"-","text":"Because of potentialFlow initialization, a dictionary corresponding to this must be present in fvSolution as well as a solver for Phi (copy defaults for pressure). Because this solver does not have information about temperature or composition of fluid, a field rhoInlet is required in inlets.","category":"page"},{"location":"Software/OpenFOAM11/aachenBombSteady/#Initial-tentative-setup","page":"-","title":"Initial tentative setup","text":"","category":"section"},{"location":"Software/OpenFOAM11/aachenBombSteady/","page":"-","title":"-","text":"This case aims producing a steady state liquid fuel combustion model using aachenBomb case as a starting point, but does not directly tries to reproduce the results of that case. It was modified so that there is an inlet and an outlet for flame development.\nTo perform the setup we retrieve several modifications from verticalChannelSteady and verticalChannelLTS. The first because it is the only case under multicomponentFluid solver currently using a steadyState time-stepping scheme and the latter due to the use of localEuler, which is often used to produce pseudo-steady solutions when a direct steady state calculations becomes unstable (as it is the case in most combustion calculations).\nModify controlDict to integer steps (that is, each step is an iteration) for both time-step and write controls, and enable purgeWrite to keep case cleaner. Notice that this is also valid if using a localEuler time-stepping scheme. Change time-stepping method accordingly in fvSchemes.\nTo increase robustness of solution, it is recommended to compute a potential flow with potentialFoam as in reference case verticalChannelLTS. This requires a solver control field Phi in fvSolution and a reference rhoInlet value to be provided in inlet flow velocity. Other parameters, but specially maxCo are also copied from reference case.\nSome dictionaries in cloudProperties require steady-state specific commands, such as adding calcFrequency to solution, resetOnStartup to solution.sourceTerms, and injection models must use massFlowRate, what is physically understandable.\nCombustion is quite sensitive and Seulex alone does not seem able to handle it with an EDC approach. First flow was developed further during 100 steps before activating chemistry. For now using a single step infinitelyFastChemistry to try to stabilize the behavior before trying back to use the EDC model.","category":"page"},{"location":"Software/OpenFOAM11/horizontalMixer/","page":"-","title":"-","text":"The following numerical experiments concern the horizontalMixer sample case.","category":"page"},{"location":"Software/OpenFOAM11/horizontalMixer/#Conceptual-phase","page":"-","title":"Conceptual phase","text":"","category":"section"},{"location":"Software/OpenFOAM11/horizontalMixer/","page":"-","title":"-","text":"Minimal working examples:","category":"page"},{"location":"Software/OpenFOAM11/horizontalMixer/","page":"-","title":"-","text":"000: no models active other than patchInteraction rebound.","category":"page"},{"location":"Software/OpenFOAM11/horizontalMixer/","page":"-","title":"-","text":"(Image: Case 000)","category":"page"},{"location":"Software/OpenFOAM11/horizontalMixer/","page":"-","title":"-","text":"001: no models active other than patchInteraction standardWallInteraction.","category":"page"},{"location":"Software/OpenFOAM11/horizontalMixer/","page":"-","title":"-","text":"(Image: Case 001)","category":"page"},{"location":"Software/OpenFOAM11/horizontalMixer/","page":"-","title":"-","text":"002: no models active other than patchInteraction localInteraction.","category":"page"},{"location":"Software/OpenFOAM11/horizontalMixer/","page":"-","title":"-","text":"(Image: Case 002)","category":"page"},{"location":"Software/OpenFOAM11/horizontalMixer/","page":"-","title":"-","text":"If there are outlets in the system, rebound model is not suitable. Because of this, all the next cases, unless stated otherwise, will use localInteraction given the better control it provides over individual patches with respect to standardWallInteraction (although it is much slower than the latter).","category":"page"},{"location":"Software/OpenFOAM11/horizontalMixer/","page":"-","title":"-","text":"007: compare solution for same (approximate) mass flow with using multiple particles per parcel - with respect to the single particle per parcel performed in the reference case 002. The overall cloud shape remains the same but some spatial resolution is lost. For conception studies it seems valid to use a higher number of particles per parcel.","category":"page"},{"location":"Software/OpenFOAM11/horizontalMixer/","page":"-","title":"-","text":"(Image: Case 007)","category":"page"},{"location":"Software/OpenFOAM11/horizontalMixer/","page":"-","title":"-","text":"Using the basic patchInteraction localInteraction add these variants (notice that the option none for all these models is already covered by the reference case 002. After comparing cases 002 and 007 the following variants were modified to match 007 as a reference case given the much lower computational time (more particles per parcel).","category":"page"},{"location":"Software/OpenFOAM11/horizontalMixer/","page":"-","title":"-","text":"003: packingModel explicit.","category":"page"},{"location":"Software/OpenFOAM11/horizontalMixer/","page":"-","title":"-","text":"(Image: Case 003)","category":"page"},{"location":"Software/OpenFOAM11/horizontalMixer/","page":"-","title":"-","text":"004: packingModel implicit.","category":"page"},{"location":"Software/OpenFOAM11/horizontalMixer/","page":"-","title":"-","text":"(Image: Case 004)","category":"page"},{"location":"Software/OpenFOAM11/horizontalMixer/","page":"-","title":"-","text":"005: dampingModel relaxation. Particle velocities are relaxed towards the local mean over a time-scale. Notice that reference paper intended to improve MP-PIC for polydisperse sedimenting particle clouds.","category":"page"},{"location":"Software/OpenFOAM11/horizontalMixer/","page":"-","title":"-","text":"(Image: Case 005)","category":"page"},{"location":"Software/OpenFOAM11/horizontalMixer/","page":"-","title":"-","text":"006 isotropyModel stochastic. According to the reference paper collisions cause numerical particles to scatter in MP-PIC calculations, just as physical particles do in particle/fluid flows, just as the generated animation implies.","category":"page"},{"location":"Software/OpenFOAM11/horizontalMixer/","page":"-","title":"-","text":"(Image: Case 006)","category":"page"},{"location":"Software/OpenFOAM11/horizontalMixer/","page":"-","title":"-","text":"Implicit packing so far is the only model for which particles left the system and turbulence effects and segregation becomes apparent. In fact without implicit packing the results do not even look physical, so it is probably a requirement to activate this model. Damping and isotropy models produce similar results, with a little more dispersed cloud when isotropy is active, as stated above from its reference.","category":"page"},{"location":"Software/OpenFOAM11/horizontalMixer/","page":"-","title":"-","text":"Hypotheses testing cases:","category":"page"},{"location":"Software/OpenFOAM11/horizontalMixer/","page":"-","title":"-","text":"008: modify case 004 to test if with rebound patch interaction particles are able to quit the system. Confirmed that this patch interaction does not handle outlets.","category":"page"},{"location":"Software/OpenFOAM11/horizontalMixer/","page":"-","title":"-","text":"(Image: Case 008)","category":"page"},{"location":"Software/OpenFOAM11/horizontalMixer/","page":"-","title":"-","text":"009: modify case 004 to test if with standardWallInteraction patch interaction particles are able to quit the system. Confirmed that this patch interaction does handle outlets similarly to the localInteraction. It was not possible to confirm if inlets also allow backflow since reporting is not provided by patch.","category":"page"},{"location":"Software/OpenFOAM11/horizontalMixer/","page":"-","title":"-","text":"(Image: Case 009)","category":"page"},{"location":"Software/OpenFOAM11/horizontalMixer/","page":"-","title":"-","text":"010: check the role of gravity option over implicit packing model. Here we derive a variant of 009 because it runs faster than with localInteraction. ","category":"page"},{"location":"Software/OpenFOAM11/horizontalMixer/","page":"-","title":"-","text":"(Image: Case 010)","category":"page"},{"location":"Software/OpenFOAM11/horizontalMixer/","page":"-","title":"-","text":"011: in fact the role of gravity in 010 was pretty devastating over the sedimentation rate (quite unexpected given the particle sizes that were used) so a variant of this case was manually initialized from last state and left to run for a much longer physical time (100 s) using maxCo 2.0 for faster execution. CALCULATION DIVERGED, REDO!","category":"page"},{"location":"Software/OpenFOAM11/horizontalMixer/#Physical-refinement-phase","page":"-","title":"Physical refinement phase","text":"","category":"section"},{"location":"Software/OpenFOAM11/horizontalMixer/","page":"-","title":"-","text":"Model Takings\nInjectionModel CONFIRM CONCLUSIONS WITH POLYDISTRIBUTED CLOUDS (particles per parcel)!\nPatchInteractionModel This model is key for the simulation of particles coupled to a fluid. Unless different behavior is expected in the different walls so customization of interaction is required, it is much faster to use a standardWallInteraction approach. For understanding the role of parameters e and mu over rebound one can check lines 144-168 of source code and confirm the model is the same as the one implemented in localInteraction in lines 366-391 of sources.\nPackingModel \nDampingModel \nIsotropyModel \nParticleForce This will be discussed in this section.","category":"page"},{"location":"Software/OpenFOAM11/horizontalMixer/","page":"-","title":"-","text":"Solution with different drag models:","category":"page"},{"location":"Software/OpenFOAM11/horizontalMixer/","page":"-","title":"-","text":"Model Results\nsphereDrag (Image: Case 012) 012\nWenYuDrag (used in injectionChannel) implemented from equation (2.12) of Gidaspow1994 [77]. (Image: Case 013) 013\nErgunWenYuDrag (used in Goldschmidt, cyclone, and column) implemented from equation (5.11) of Gidaspow1994 [77]. (Image: Case 014) 014","category":"page"},{"location":"Software/OpenFOAM11/horizontalMixer/","page":"-","title":"-","text":"Other drag models:","category":"page"},{"location":"Software/OpenFOAM11/horizontalMixer/","page":"-","title":"-","text":"Model Details\nPlessisMasliyahDrag Used in GoldschmidtMPPIC. Implemented from Plessis1988 [78] is adapted for flow through consolidated isotropic porous media. This is outside the scope of the current study but functionality is tested anyways from a computational point of view and to understand its behavior far from its reference application. Calculation diverged, so no results are available.\ndistortedSphereDrag Not used in any tutorial. Implemented as per Liu1993 [14] is conceived for the simulation of the effects of drop drag and breakup on fuel sprays. This is far from our scope and is not tested.\nnonSphereDrag Not used in any tutorial. Implemented as per Haider1989 [79] is a drag model for non-spherical particles. Its most important parameter is phi, the ratio of the surface area of a sphere with the same volume as the particle to the actual surface area of the particle.\nSchillerNaumannDrag Not used in any tutorial. Implemented according the classical paper by Schiller (1935) for modeling drag over spheres.","category":"page"},{"location":"Software/OpenFOAM11/horizontalMixer/","page":"-","title":"-","text":"Solution with different sizeDistribution:","category":"page"},{"location":"Software/OpenFOAM11/horizontalMixer/","page":"-","title":"-","text":"[ ] fixedValue\n[ ] normal\n[ ] RosinRammler\n[ ] tabulatedDensity","category":"page"},{"location":"Software/OpenFOAM11/horizontalMixer/","page":"-","title":"-","text":"Solution with different cloud types","category":"page"},{"location":"Software/OpenFOAM11/horizontalMixer/","page":"-","title":"-","text":"MPPICCloud\ncollidingCloud","category":"page"},{"location":"Software/OpenFOAM11/horizontalMixer/","page":"-","title":"-","text":"For the PackingModelone needs to specify the ParticleStressModel among the following:","category":"page"},{"location":"Software/OpenFOAM11/horizontalMixer/","page":"-","title":"-","text":"Model Details\nHarrisCrighton \nLun ","category":"page"},{"location":"Software/OpenFOAM11/horizontalMixer/","page":"-","title":"-","text":"For both DampingModel and IsotropyModel one needs a TimeScaleModel","category":"page"},{"location":"Software/OpenFOAM11/horizontalMixer/","page":"-","title":"-","text":"Option Details\nequilibrium \nisotropic \nnonEquilibrium ","category":"page"},{"location":"WallyToolbox/Internals/Documents/#Documents","page":"Documents","title":"Documents","text":"","category":"section"},{"location":"WallyToolbox/Internals/Documents/","page":"Documents","title":"Documents","text":"EditURL = \"https://github.com/wallytutor/WallyToolbox.jl/blob/main/docs/src/Modules/WallyToolbox/Documents.md\"\nCurrentModule = WallyToolbox\nDocTestSetup = quote\n using WallyToolbox\nend","category":"page"},{"location":"WallyToolbox/Internals/Documents/","page":"Documents","title":"Documents","text":"The following functionalities are intended mostly for the own toolbox maintenance and documentation generation. This can also be imported as a replacement for some boilerplate code in other projects. The use of the functions provided in this module is essentially illustrated in docs/make.jl.","category":"page"},{"location":"WallyToolbox/Internals/Documents/","page":"Documents","title":"Documents","text":"WallyToolbox.Documents.get_format\nWallyToolbox.Documents.deployrepo","category":"page"},{"location":"WallyToolbox/Internals/Documents/#WallyToolbox.Documents.get_format","page":"Documents","title":"WallyToolbox.Documents.get_format","text":"Get format specified to generate docs.\n\n\n\n\n\n","category":"function"},{"location":"WallyToolbox/Internals/Documents/#WallyToolbox.Documents.deployrepo","page":"Documents","title":"WallyToolbox.Documents.deployrepo","text":"Generate a repo argument in the format expected by deploydocs.\n\n\n\n\n\n","category":"function"},{"location":"WallyToolbox/Internals/Documents/","page":"Documents","title":"Documents","text":"Because most of my work is done with Obsidian and the tool does not support Julia math blocks and a few other features, the functions below were conceived to help documentation conversion without modifications to standard LaTeX syntacs in Obsidian.","category":"page"},{"location":"WallyToolbox/Internals/Documents/","page":"Documents","title":"Documents","text":"WallyToolbox.Documents.julianizemarkdown\nWallyToolbox.Documents.formatequations\nWallyToolbox.Documents.formatnotecells","category":"page"},{"location":"WallyToolbox/Internals/Documents/#WallyToolbox.Documents.julianizemarkdown","page":"Documents","title":"WallyToolbox.Documents.julianizemarkdown","text":"Convert equations from dollar to Julia ticks notation.\n\n\n\n\n\n","category":"function"},{"location":"WallyToolbox/Internals/Documents/#WallyToolbox.Documents.formatequations","page":"Documents","title":"WallyToolbox.Documents.formatequations","text":"Convert (multiline) equations to Julia markdown.\n\n\n\n\n\n","category":"function"},{"location":"WallyToolbox/Internals/Documents/#WallyToolbox.Documents.formatnotecells","page":"Documents","title":"WallyToolbox.Documents.formatnotecells","text":"Convert cells of notebooks to Documenter format.\n\n\n\n\n\n","category":"function"},{"location":"WallyToolbox/Internals/Documents/","page":"Documents","title":"Documents","text":"Finally, we wrap up a standard workflow for converting Pluto notebooks.","category":"page"},{"location":"WallyToolbox/Internals/Documents/","page":"Documents","title":"Documents","text":"WallyToolbox.Documents.convert_pluto","category":"page"},{"location":"WallyToolbox/Internals/Documents/#WallyToolbox.Documents.convert_pluto","page":"Documents","title":"WallyToolbox.Documents.convert_pluto","text":"Convert Pluto notebook into a static HTML file.\n\n\n\n\n\n","category":"function"},{"location":"References/@Nakayama2023/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Nakayama2023/","page":"-","title":"-","text":"title: \"Effective thermal conductivity of porous media\" authors: Akira Nakayama year: 2023 –-","category":"page"},{"location":"References/@Jeong1995a/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Jeong1995a/","page":"-","title":"-","text":"title: On the identification of a vortex authors: Jinhee Jeong, Fazle Hussain year: 1995 URL: https://doi.org/10.1017/S0022112095000462 Drive: –-","category":"page"},{"location":"References/@Wu2022a/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Wu2022a/","page":"-","title":"-","text":"title: A comprehensive study of non-adaptive and residual-based adaptive sampling for physics-informed neural networks authors: Chenxi Wu, Min Zhu, Qinyang Tan, Yadhu Kartha, Lu Lu year: 2022 URL: https://doi.org/10.48550/arXiv.2207.10289 Drive: https://1drv.ms/b/s!Ar4x-UlrYAiZla5WOX3yVxsVYZ1BSQ?e=RJSrB2 –-","category":"page"},{"location":"References/@Haghighat2021sciann/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Haghighat2021sciann/","page":"-","title":"-","text":"title: \"SciANN: A Keras/TensorFlow wrapper for scientific computations and physics-informed deep learning using artificial neural networks\" authors: Ehsan Haghighat, Ruben Juanes year: 2021 DOI: https://doi.org/10.48550/arXiv.2005.08803 –-","category":"page"},{"location":"References/@Fadayini2021/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Fadayini2021/","page":"-","title":"-","text":"title: Simulation and optimization of an integrated process flow sheet for cement production authors: Oluwafemi M. Fadayini, Adekunle A. Obisanya, Gloria O. Ajiboye, Clement Madu, Tajudeen O. Ipaye, Taiwo O. Rabiu, Shola J. Ajayi, Joseph T. Akintola year: 2021 –-","category":"page"},{"location":"References/@Lay2012/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Lay2012/","page":"-","title":"-","text":"title: \"Linear algebra and its applications\" authors: David C. Lay year: 2012 –-","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/#Reator-pistão","page":"Reator pistão","title":"Reator pistão","text":"","category":"section"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"#plug-flow ","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"Neste tópico abordamos modelos de reatores pistão em níveis progressivos de complexidade. Os modelos de reator estudados incluem em alguns casos aspectos voltados aos aspectos térmicos e em outros elementos de cinética química. O objetivo final é progressivamente introduzir complexidate em termos da física considerada, mas também em termos das estratégias numéricas empregadas na sua implementação","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/#Indice-de-tópicos","page":"Reator pistão","title":"Indice de tópicos","text":"","category":"section"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/#Disponíveis-atualmente","page":"Reator pistão","title":"Disponíveis atualmente","text":"","category":"section"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"Introdução: solução térmica de um reator incompressível formulado em termos da temperatura. O objetivo é de realizar a introdução ao modelo de reator pistão sem entrar em detalhes involvendo não-linearidades como a dependência da densidade em termos da temperatura ou composição. Ademais, essa forma permite uma solução analítica. Introduz o uso de ModelingToolkit e do método dos volumes finitos.\nFormulação entálpica do reator pistão: casos práticos de aplicação de reatores normalmente envolvem fluidos com propriedades que dependem da temperatura, especialmente o calor específico. Em geral a sua solução é tratada de forma mais conveniente com uma formulação em termos da entalpia. Continuamos com o mesmo caso elaborado no estudo introdutório modificando as equações para que a solução seja realizada com a entalpia como variável dependente.","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/#Em-fase-de-concepção","page":"Reator pistão","title":"Em fase de concepção","text":"","category":"section"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"Reatores em contra corrente: o precedente para um par de reatores em contra-corrente.\nTrocas em fluidos supercríticos: suporte à fluidos supercríticos (água, dióxido de carbono).","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/#Planejados","page":"Reator pistão","title":"Planejados","text":"","category":"section"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"O precedente generalizado para um sólido e um gás (compressível).\nO precedente com coeficiente HTC dependente da posição.\nO precedente com trocas térmicas com o ambiente externo.\nO precedente com inclusão de perda de carga na fase gás.\nO precedente com um modelo de trocas térmicas com meio poroso.\nO precedente com um modelo de efeitos difusivos axiais no sólido.\nO precedente com inclusão da entalpia de fusão no sólido.\nO precedente com inclusão de cinética química no gás.","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/#Introdução","page":"Reator pistão","title":"Introdução","text":"","category":"section"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"Este é o primeiro notebook de uma série abordando reatores do tipo pistão (plug-flow) no qual os efeitos advectivos são preponderantes sobre o comportamento difusivo, seja de calor, massa, ou espécies. O estudo e modelagem desse tipo de reator apresentar diversos interesses para a pesquisa fundamental e na indústria. Muitos reatores tubulares de síntese laboratorial de materiais apresentam aproximadamente um comportamento como tal e processos nas mais diversas indústrias podem ser aproximados por um ou uma rede de reatores pistão e reatores agitados interconectados.","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"Começaremos por um caso simples considerando um fluido incompressível e ao longo da série aumentaremos progressivamente a complexidade dos modelos. Os notebooks nessa série vão utilizar uma estratégia focada nos resultados, o que indica que o código será na maior parte do tempo ocultado e o estudante interessado deverá executar o notebook por si mesmo para estudar as implementações.","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"Nesta Parte 1 vamos estuda a formulação na temperatura da equação de conservação de energia.","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"using WallyToolbox\n\nusing CairoMakie\nusing DelimitedFiles\nusing DifferentialEquations: solve\nusing DocStringExtensions\nusing Interpolations\nusing ModelingToolkit\nusing Polynomials\nusing Printf\nusing Roots\nusing SparseArrays\nusing SparseArrays: spdiagm\nusing SteamTables\nnothing; #hide","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"No que se segue vamos implementar a forma mais simples de um reator pistão. Para este primeiro estudo o foco será dado apenas na solução da equação da energia. As etapas globais implementadas aqui seguem o livro de Kee et al. (2017), seção 9.2.","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"Da forma simplificada como tratado, o problema oferece uma solução analítica análoga à lei do resfriamento de Newton, o que é útil para a verificação do problema. Antes de partir a derivação do modelo, os cálculos do número de Nusselt para avaliação do coeficiente de transferência de calor são providos no que se segue com expressões de Gnielinski e Dittus-Boelter discutidas aqui. As implementatações se encontram no módulo WallyToolbox.","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"Para cobrir toda uma gama de números de Reynolds, a função htc avalia Nu com seletor segundo valor de Re para o cálculo do número de Nusselt e uma funcionalidade para reportar os resultados, o que pode ser útil na pré-análise do problema.","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"let\n L = 100.0\n D = 1.0\n u = 1.0\n ρ = 1000.0\n μ = 0.01\n cₚ = 4200.0\n θ = 298.15\n kw = (verbose = true,)\n \n pr = ConstantPrandtl(0.7)\n re = ReynoldsPipeFlow()\n nu = NusseltGnielinski()\n \n hf = HtcPipeFlow(re, nu, pr)\n htc(hf, θ, u, D, ρ, μ, cₚ; kw...)\n hf\nend","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/#Condições-compartilhadas","page":"Reator pistão","title":"Condições compartilhadas","text":"","category":"section"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"# Comprimento do reator [m]\nL = 10.0\n\n# Diâmetro do reator [m]\nD = 0.01\n\n# Mass específica do fluido [kg/m³]\nρ = 1000.0\n\n# Viscosidade do fluido [Pa.s]\nμ = 0.001\n\n# Calor específico do fluido [J/(kg.K)]\ncₚ = 4182.0\n\n# Número de Prandtl do fluido\nPr = 6.9\n\n# Velocidade do fluido [m/s]\nu = 1.0\n\n# Temperatura de entrada do fluido [K]\nTₚ = 300.0\n\n# Temperatura da parede do reator [K]\nTₛ = 400.0\n\n# Perímetro da seção circular do reator [m]\nP = π * D\n\n# Área da seção circula do reator [m²]\nA = π * (D / 2)^2\n\n# Cria objeto para avaliação do coeficiente de troca convectiva.\nhf = HtcPipeFlow(ReynoldsPipeFlow(), NusseltGnielinski(), ConstantPrandtl(Pr))\n\n# Coeficiente convectivo de troca de calor [W/(m².K)]\nĥ = htc(hf, Tₛ, u, D, ρ, μ, cₚ; verbose = true)\n\n# Coordenadas espaciais da solução [m]\nz = LinRange(0, L, 10_000)\nnothing; #hide","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/#Solução-analítica-da-EDO","page":"Reator pistão","title":"Solução analítica da EDO","text":"","category":"section"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"O modelo tratado no que se segue é proposto em detalhes aqui.","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"Sua solução analítica é implementada abaixo em analyticalthermalpfr:","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"\"Solução analítica do modelo de reator pistão.\"\nfunction analyticalthermalpfr(; P, A, Tₛ, Tₚ, ĥ, u, ρ, cₚ, z)\n return @. Tₛ - (Tₛ - Tₚ) * exp(-z * (ĥ * P) / (ρ * u * cₚ * A))\nend\nnothing; #hide","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"O bloco abaixo resolve o problema para um conjunto de condições que você pode consultar nos anexos e expandindo o seu código. Observe abaixo da célula um log do cálculo dos números adimensionais relevantes ao problema e do coeficiente de transferência de calor convectivo associado. Esses elementos são tratados por funções externas que se encontram em um arquivo de suporte a esta série e são tidos como conhecimentos a priori para as discussões.","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"with_theme() do\n Tₐ = analyticalthermalpfr(; P, A, Tₛ, Tₚ, ĥ, u, ρ, cₚ, z)\n Tend = @sprintf(\"%.2f\", Tₐ[end])\n yrng = (300, 400)\n \n fig = Figure(size = (720, 500))\n ax = Axis(fig[1, 1])\n lines!(ax, z, Tₐ, color = :red, linewidth = 5, label = \"Analítica\")\n xlims!(ax, (0, L))\n ax.title = \"Temperatura final = $(Tend) K\"\n ax.xlabel = \"Posição [m]\"\n ax.ylabel = \"Temperatura [K]\"\n ax.xticks = range(0.0, L, 6)\n ax.yticks = range(yrng..., 6)\n ylims!(ax, yrng)\n axislegend(position = :rb)\n fig\nend","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/#Integração-numérica-da-EDO","page":"Reator pistão","title":"Integração numérica da EDO","text":"","category":"section"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"Neste exemplo tivemos sorte de dispor de uma solução analítica. Esse problema pode facilmente tornar-se intratável se considerarmos uma dependência arbitrária do calor específico com a temperatura ou se a parede do reator tem uma dependência na coordenada axial. É importante dispor de meios numéricos para o tratamento deste tipo de problema.","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"No caso de uma equação diferencial ordinária (EDO) como no presente caso, a abordagem mais simples é a de se empregar um integrador numérico. Para tanto é prática comum estabelecer uma função que representa o lado direito do problema isolando a(s) derivada(s) no lado esquerdo. Em Julia dispomos do framework de ModelingToolkit que provê uma forma simbólica de representação de problemas e interfaces com diversos integradores. A estrutura DifferentialEquationPFR abaixo implementa o problema diferencial desta forma.","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"pfr = let\n @variables z\n D = Differential(z)\n\n @mtkmodel PFR begin\n @parameters begin\n P\n A\n Tₛ\n ĥ\n u\n ρ\n cₚ\n end\n\n @variables begin\n T(z)\n end\n\n @equations begin\n D(T) ~ ĥ * P * (Tₛ - T) / (ρ * u * A * cₚ)\n end\n end\n\n @mtkbuild pfr = PFR()\nend;","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"Uma funcionalidade bastante interessante de ModelingToolkit é sua capacidade de representar diretamente em com LaTeX as equações implementadas. Antes de proceder a solução verificamos na célula abaixo que a equação estabelecida no modelo está de acordo com a formulação que derivamos para o problema diferencial. Verifica-se que a ordem dos parâmetros pode não ser a mesma, mas o modelo é equivalente.","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"pfr","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"Para integração do modelo simbólico necessitamos substituir os parâmetros por valores numéricos e fornecer a condição inicial e intervalo de integração ao integrador que vai gerir o problema. A interface solveodepfr realiza essas etapas. É importante mencionar aqui que a maioria dos integradores numéricos vai amostrar pontos na coordenada de integração segundo a rigidez numérica do problema, de maneira que a solução retornada normalmente não está sobre pontos equi-espaçados. Podemos fornecer um parâmetro opcional para recuperar a solução sobre os pontos desejados, o que pode facilitar, por exemplo, comparação com dados experimentais.","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"\"Integra o modelo diferencial de reator pistão\"\nfunction solvemtkpfr(; pfr, P, A, Tₛ, Tₚ, ĥ, u, ρ, cₚ, z)\n T₀ = [pfr.T => Tₚ]\n\n p = [\n pfr.P => P,\n pfr.A => A,\n pfr.Tₛ => Tₛ,\n pfr.ĥ => ĥ,\n pfr.u => u,\n pfr.ρ => ρ,\n pfr.cₚ => cₚ,\n ]\n\n zspan = (0, z[end])\n prob = ODEProblem(pfr, T₀, zspan, p)\n\n return solve(prob; saveat = z)\nend\nnothing; #hide","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"Com isso podemos proceder à integração com ajuda de solveodepfr concebida acima e aproveitamos para traçar o resultado em conjunto com a solução analítica.","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"with_theme() do\n Tₐ = analyticalthermalpfr(; P, A, Tₛ, Tₚ, ĥ, u, ρ, cₚ, z)\n Tₒ = solvemtkpfr(; pfr, P, A, Tₛ, Tₚ, ĥ, u, ρ, cₚ, z)[:T]\n \n Tend = @sprintf(\"%.2f\", Tₐ[end])\n yrng = (300, 400)\n \n fig = Figure(size = (720, 500))\n ax = Axis(fig[1, 1])\n lines!(ax, z, Tₐ, color = :red, linewidth = 5, label = \"Analítica\")\n lines!(ax, z, Tₒ, color = :black, linewidth = 2, label = \"ModelingToolkit\")\n xlims!(ax, (0, L))\n ax.title = \"Temperatura final = $(Tend) K\"\n ax.xlabel = \"Posição [m]\"\n ax.ylabel = \"Temperatura [K]\"\n ax.xticks = range(0.0, L, 6)\n ax.yticks = range(yrng..., 6)\n ylims!(ax, yrng)\n axislegend(position = :rb)\n fig\nend","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/#Método-dos-volumes-finitos","page":"Reator pistão","title":"Método dos volumes finitos","text":"","category":"section"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"A construção e solução deste problema é provida em solvefvmpfr abaixo.","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"\"Integra o modelo diferencial de reator pistão\"\nfunction solvefvmpfr(; P, A, Tₛ, Tₚ, ĥ, u, ρ, cₚ, z)\n N = length(z) - 1\n\n # Vamos tratar somente o caso equi-espaçado aqui!\n δ = z[2] - z[1]\n\n a = (ρ * u * cₚ * A) / (ĥ * P * δ)\n\n A⁺ = (2a + 1) / (2Tₛ)\n A⁻ = (2a - 1) / (2Tₛ)\n\n b = ones(N)\n b[1] = 1 + A⁻[1] * Tₚ\n\n M = spdiagm(-1 => -A⁻ * ones(N - 1), 0 => +A⁺ * ones(N))\n U = similar(z)\n\n U[1] = Tₚ\n U[2:end] = M \\ b\n\n return U\nend\nnothing; #hide","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"Abaixo adicionamos a solução do problema sobre malhas grosseiras sobre as soluções desenvolvidas anteriormente. A ideia de se representar sobre malhas grosseiras é simplesmente ilustrar o caráter discreto da solução, que é representada como constante no interior de uma célula. Adicionalmente representamos no gráfico um resultado interpolado de uma simulação CFD 3-D de um reator tubular em condições supostamente identicas as representadas aqui, o que mostra o bom acordo de simulações 1-D no limite de validade do modelo.","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"with_theme() do\n data = readdlm(\"data/fluent-reference/postprocess.dat\", Float64)\n x, Tᵣ = data[:, 1], data[:, 2]\n \n Tₐ = analyticalthermalpfr(; P, A, Tₛ, Tₚ, ĥ, u, ρ, cₚ, z)\n Tₒ = solvemtkpfr(; P, A, Tₛ, Tₚ, ĥ, u, ρ, cₚ, z, pfr)[:T]\n Tₑ = solvefvmpfr(; P, A, Tₛ, Tₚ, ĥ, u, ρ, cₚ, z)\n \n Tend = @sprintf(\"%.2f\", Tₐ[end])\n yrng = (300, 400)\n \n fig = Figure(size = (720, 500))\n ax = Axis(fig[1, 1])\n lines!(ax, z, Tₐ, color = :red, linewidth = 5, label = \"Analítica\")\n lines!(ax, z, Tₒ, color = :black, linewidth = 2, label = \"ModelingToolkit\")\n lines!(ax, z, Tₑ, color = :blue, linewidth = 2, label = \"Finite Volumes\")\n lines!(ax, x, Tᵣ, color = :green, linewidth = 2, label = \"CFD 3D\")\n xlims!(ax, (0, L))\n ax.title = \"Temperatura final = $(Tend) K\"\n ax.xlabel = \"Posição [m]\"\n ax.ylabel = \"Temperatura [K]\"\n ax.xticks = range(0.0, L, 6)\n ax.yticks = range(yrng..., 6)\n ylims!(ax, yrng)\n axislegend(position = :rb)\n fig\nend","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"Podemos também réalizar um estudo de sensibilidade a malha:","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"with_theme() do\n Tₐ = analyticalthermalpfr(; P, A, Tₛ, Tₚ, ĥ, u, ρ, cₚ, z)\n\n Tend = @sprintf(\"%.2f\", Tₐ[end])\n yrng = (300, 400)\n \n fig = Figure(size = (720, 500))\n ax = Axis(fig[1, 1])\n lines!(ax, z, Tₐ, color = :red, linewidth = 5, label = \"Analítica\")\n\n for (c, N) in [(:blue, 20), (:green, 50)]\n z = LinRange(0.0, L, N)\n Tₑ = solvefvmpfr(; P, A, Tₛ, Tₚ, ĥ, u, ρ, cₚ, z)\n stairs!(ax, z, Tₑ, color = c, label = \"N = $(N)\", step = :center)\n end\n\n xlims!(ax, (0, L))\n ax.title = \"Temperatura final = $(Tend) K\"\n ax.xlabel = \"Posição [m]\"\n ax.ylabel = \"Temperatura [K]\"\n ax.xticks = range(0.0, L, 6)\n ax.yticks = range(yrng..., 6)\n ylims!(ax, yrng)\n axislegend(position = :rb)\n fig\nend","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"Com isso encerramos essa primeira introdução a modelagem de reatores do tipo pistão. Estamos ainda longe de um modelo generalizado para estudo de casos de produção, mas os principais blocos de construção foram apresentados. Os pontos principais a reter deste estudo são:","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"A equação de conservação de massa é o ponto chave para a expansão e simplificação das demais equações de conservação. Note que isso é uma consequência de qua a massa corresponde à aplicação do Teorema de Transporte de Reynolds sobre a unidade 1.\nSempre que a implementação permita, é mais fácil de se tratar o problema como uma EDO e pacotes como ModelingToolkit proveem o ferramental básico para a construção deste tipo de modelos facilmente.\nUma implementação em volumes finitos será desejável quando um acoplamento com outros modelos seja envisajada. Neste caso a gestão da solução com uma EDO a parâmetros variáveis pode se tornar computacionalmente proibitiva, seja em complexidade de código ou tempo de cálculo.","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/#Formulação-na-entalpia","page":"Reator pistão","title":"Formulação na entalpia","text":"","category":"section"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"#plug-flow","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"Neste notebook damos continuidade ao precedente através da extensão do modelo para a resolução da conservação de energia empregando a entalpia do fluido como variável independente. O caso tratado será o mesmo estudado anteriormente para que possamos ter uma base de comparação da solução. Realizada a primeira introdução, os notebooks da série se tornam mais concisos e focados cada vez mais em código ao invés de derivações, exceto quando implementando novas físicas.","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/#Condições-compartilhadas-2","page":"Reator pistão","title":"Condições compartilhadas","text":"","category":"section"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"Salvo pela discretização espacial mais grosseira e a função entalpia compatível com o calor específico do fluido provida, continuaremos com os parâmetros empregados no estudo precedente. Para que os resultados sejam comparáveis, definimos ","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"h(T)=c_pT+ h_ref","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"O valor de h_ref é arbitrário e não afeta a solução.","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"# Coordenadas espaciais da solução [m]\nz = LinRange(0, L, 500)\n\n# Entalpia com constante arbitrária [J/kg]\nh(T) = cₚ * T + 1000.0\nnothing; #hide","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/#Modelo-na-entalpia","page":"Reator pistão","title":"Modelo na entalpia","text":"","category":"section"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"A solução integrando esses passos foi implementada em solventhalpypfr. Para simplificar a leitura do código o problema é implementado em diversos blocos de funções para montagem da função gerindo a solução do modelo.","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"\"Calcula matriz advectiva do lado esquedo da equação.\"\nfunction fvmlhs(N)\n return 2spdiagm(-1 => -ones(N - 1), 0 => ones(N))\nend\n\n\"Calcula parte constante do vetor do lado direito da equação.\"\nfunction fvmrhs(N; bₐ, b₁)\n b = bₐ * ones(N)\n b[1] += b₁\n return b\nend\n\n\"Relaxa solução em termos da entalpia.\"\nfunction relaxenthalpy(h̄, hₘ, Tₘ, α)\n Δ = (1 - α) * (h̄ - hₘ[2:end])\n m = maximum(hₘ)\n\n hₘ[2:end] += Δ\n\n # Solução das temperaturas compatíveis com hm.\n Tₘ[2:end] = map((Tₖ, hₖ) -> find_zero(t -> h(t) - hₖ, Tₖ), Tₘ[2:end], hₘ[2:end])\n\n return Tₘ, Δ, m\nend\n\n\"Relaxa solução em termos da temperatura.\"\nfunction relaxtemperature(h̄, hₘ, Tₘ, α)\n # Solução das temperaturas compatíveis com h̄.\n Uₘ = map((Tₖ, hₖ) -> find_zero(t -> h(t) - hₖ, Tₖ), Tₘ[2:end], h̄)\n\n Δ = (1 - α) * (Uₘ - Tₘ[2:end])\n m = maximum(Tₘ)\n\n Tₘ[2:end] += Δ\n\n return Tₘ, Δ, m\nend\n\n\"Realiza uma iteração usando a relaxação especificada.\"\nfunction steprelax(h̄, hₘ, Tₘ, α, how)\n return (how == :h) ? relaxenthalpy(h̄, hₘ, Tₘ, α) : relaxtemperature(h̄, hₘ, Tₘ, α)\nend\nnothing; #hide","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"\"Integra o modelo diferencial de reator pistão\"\nfunction solvefvmpfr(; P, A, Tₛ, Tₚ, ĥ, u, ρ, h, z, kw...)\n N = length(z) - 1\n\n # Parâmetros para o solver.\n M = get(kw, :M, 100)\n α = get(kw, :α, 0.4)\n ε = get(kw, :ε, 1.0e-12)\n relax = get(kw, :relax, :h)\n verbose = get(kw, :verbose, true)\n\n # Vamos tratar somente o caso equi-espaçado aqui!\n δ = z[2] - z[1]\n\n a = (ĥ * P * δ) / (ρ * u * A)\n\n Tₘ = Tₚ * ones(N + 1)\n hₘ = h.(Tₘ)\n\n K = fvmlhs(N)\n b = fvmrhs(N; bₐ = 2a * Tₛ, b₁ = 2h(Tₚ))\n\n # Aloca e inicia em negativo o vetor de residuos. Isso\n # é interessante para o gráfico aonde podemos eliminar\n # os elementos negativos que não tem sentido físico.\n residual = -ones(M)\n\n verbose && @info \"Usando relaxação do tipo $(relax)\"\n\n loop() = begin\n for niter = 1:M\n # Calcula o vetor `b` do lado direito e resolve o sistema.\n h̄ = K \\ (b - a * (Tₘ[1:end-1] + Tₘ[2:end]))\n \n # Relaxa solução para gerir não linearidades.\n Tₘ, Δ, m = steprelax(h̄, hₘ, Tₘ, α, relax)\n \n # Verifica status da convergência.\n residual[niter] = maximum(abs.(Δ / m))\n \n if (residual[niter] <= ε)\n verbose && @info(\"Convergiu após $(niter) iterações\")\n break\n end\n end\n end\n\n \n get(kw, :timeit, false) ? (@time loop()) : loop()\n\n return Tₘ, residual\nend\nnothing; #hide","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"Usamos agora essa função para uma última simulação do problema. Verificamos abaixo que a solução levou um certo número de iterações para convergir. Para concluir vamos averiguar a qualidade da convergência ao longo das iterações na parte inferior do gráfico.","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"Introduzimos também a possibilidade de se utilizar a relaxação diretamente na entalpia, resolvendo o problema não linear apenas para encontrar diretamente a nova estimação do campo de temperaturas. A figura que segue ilustas o comportamento de convergência. Neste caso específico (e usando a métrica de convergência em questão) a relaxação em entalpia não apresenta vantagens, mas veremos em outras ocasiões que esta é a maneira mais simples de se fazer convergir uma simulação.","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"with_theme() do\n α = 0.4\n ε = 1.0e-12\n\n # Referência\n Tₐ = analyticalthermalpfr(; P, A, Tₛ, Tₚ, ĥ, u, ρ, cₚ, z)\n\n # Uma chamada para pre-compilação...\n verbose = false\n solvefvmpfr(; P, A, Tₛ, Tₚ, ĥ, u, ρ, h, z, α, ε, relax = :T, verbose)\n solvefvmpfr(; P, A, Tₛ, Tₚ, ĥ, u, ρ, h, z, α, ε, relax = :h, verbose)\n \n # Chamadas para avaliação de performance...\n timeit = true\n Tₕ, εₕ = solvefvmpfr(; P, A, Tₛ, Tₚ, ĥ, u, ρ, h, z, α, ε, relax = :h, timeit)\n Tₜ, εₜ = solvefvmpfr(; P, A, Tₛ, Tₚ, ĥ, u, ρ, h, z, α, ε, relax = :T, timeit)\n \n Tend = @sprintf(\"%.2f\", Tₐ[end])\n yrng = (300, 400)\n \n fig = Figure(size = (720, 600))\n\n ax = Axis(fig[1, 1])\n lines!(ax, z, Tₐ, color = :red, linewidth = 5, label = \"Analítica\")\n lines!(ax, z, Tₕ, color = :blue, linewidth = 2, label = \"FVM (H)\")\n lines!(ax, z, Tₜ, color = :cyan, linewidth = 2, label = \"FVM (T)\")\n xlims!(ax, (0, L))\n ax.title = \"Temperatura final = $(Tend) K\"\n ax.xlabel = \"Posição [m]\"\n ax.ylabel = \"Temperatura [K]\"\n ax.xticks = range(0.0, L, 6)\n ax.yticks = range(yrng..., 6)\n ylims!(ax, yrng)\n axislegend(position = :rb)\n\n ax = Axis(fig[2, 1], height = 120)\n lines!(ax, log10.(εₕ[εₕ.>0]), color = :blue, label = \"FVM (H)\")\n lines!(ax, log10.(εₜ[εₜ.>0]), color = :cyan, label = \"FVM (T)\")\n ax.xlabel = \"Iteração\"\n ax.ylabel = \"log10(ε)\"\n ax.xticks = vcat(1, collect(5:5:30))\n ax.yticks = -12:3:0\n xlims!(ax, 1, 30)\n axislegend(position = :rt)\n\n fig\nend","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/#Reatores-em-contra-corrente","page":"Reator pistão","title":"Reatores em contra corrente","text":"","category":"section"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"As ideias gerais para a simulação de um reator formulado na entalpia tendo sido introduzidas na Parte 2, vamos agora aplicar o mesmo algoritmo de solução para um problema menos trivial: integração de reatores em contra-corrente com trocas térmicas. Esse é o caso, por exemplo, em uma serpentina dupla em contato mecânico. Esse sistema pode ser aproximado por um par de reatores pistão em contra-corrente se tomada propriamente em conta a resistência térmica dos dutos.","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"Outro caso clássico que pode ser as vezes tratado desta forma é o modelo de forno rotativo para produção de cimento, como discutido por Hanein et al. (2017). Outro exemplo é fornecido por Bulfin (2019) para a síntese de ceria. Kerkhof (2007) apresenta uma abordagem mais geral introduzindo troca de massa entre partículas.","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"Ainda precisamos tratar de tópicos mais básicos antes de implementar modelos similares ao longo dessa série, mas espero que a literatura citada sirva como motivação para o estudo.","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"Neste notebook trataremos dois casos:","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"Um par de fluidos que diferem unicamente por seu calor específicos.\nUm fluido condensado e um gás com propriedades dependentes da temperatura.","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/#Concepção-do-programa","page":"Reator pistão","title":"Concepção do programa","text":"","category":"section"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"Não há nada de diferente em termos do modelo de cada reator em relação ao tópico anterior abordando um reator pistão em termos da entalpia. O objetivo principal do programa a conceber neste notebook é usar os conhecimentos adquiridos na etapa anterior para implementar uma solução para um par de reatores que trocam energia entre si. Para simplificar a implementação vamos considerar que as paredes externas dos reatores são adiabáticas e que estes trocam calor somente entre eles mesmos. Algumas ideias chave são necessárias para uma implementação efetiva:","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"É importante lembrar que as coordenadas dos reatores são invertidas entre elas. Se o reator r₁ está orientado no sentido do eixo z, então para um par de reatores de comprimento L as coordenadas das células homólogas em r₂ são L-z.\nFalando em células homólogas, embora seja possível implementar reatores conectados por uma parede com discretizações distintas, é muito mais fácil de se conceber um programa com reatores que usam a mesma malha espacial. Ademais, isso evita possíveis erros numéricos advindos da escolha de um método de interpolação.\nEmbora uma solução acoplada seja possível, normalmente isso torna o programa mais complexo para se extender a um número arbitrário de reatores e pode conduzir a matrizes com condição pobre. Uma ideia para resolver o problema é realizar uma iteração em cada reator com o outro mantido constante (como no problema precedente) mas desta vez considerando que a condição limite da troca térmica possui uma dependência espacial.","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"Os blocos que se seguem implementam as estruturas necessárias com elementos reutilizáveis de maneira que ambos os reatores possam ser conectados facilmente.","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"Como desejamos simular simultâneamente dois reatores, é interessante encapsular a construção dos elementos descrevendo um reator em uma estrutura. Desta forma evitamos código duplicado.","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"\"Tipo para qualquer reator pistão.\"\nabstract type AbstractPlugFlowReactor end","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"\"\"\"\nDescrição de um reator pistão formulado na entalpia.\n\n```math\n\\\\frac{dh}{dz}=a(T_{s}(z)-T^{\\\\star})\n\\\\qquad\\\\text{aonde}\\\\qquad\na=\\\\frac{\\\\hat{h}P}{\\\\rho{}u{}A_{c}}\n```\n\nO modelo é representado em volumes finitos como ``Kh=b`` tal\ncomo discutido no notebook anterior. Os parâmetros da estrutura\nlistado abaixo visam manter uma representação tão próxima quanto\npossível da expressão matemática do modelo.\n\"\"\"\nstruct ConstDensityEnthalpyPFRModel <: AbstractPlugFlowReactor\n \"Tamanho do problema linear.\"\n N::Int64\n\n\t\"Matriz do problema.\"\n\tK::SparseMatrixCSC{Float64, Int64}\n\n \"Vetor do problema.\"\n b::Vector{Float64}\n\n \"Solução do problema.\"\n x::Vector{Float64}\n\n\t\"Coeficiente do modelo.\"\n\ta::Float64\n\t\n\t\"Coordenadas espaciais das células do reator.\"\n\tz::Vector{Float64}\n\n \"Coeficiente de troca térmica convectiva [W/(m².K)].\"\n ĥ::Float64\n\n \"Fluxo mássico através do reator [kg/s].\"\n ṁ::Float64\n\n \"Entalpia em função da temperatura [J/kg].\"\n h::Function\n\t\n\t\"\"\" Construtor do modelo de reator pistão.\n\n\t`N::Int64`\n\t\tNúmero de células no sistema sem a condição inicial.\n\t`L::Float64`\n\t\tComprimento total do reator [m].\n\t`P::Float64`\n\t\tPerímetro da de troca de calor do reator [m].\n\t`A::Float64`\n\t\tÁrea da seção transversal do reator [m²].\n\t`T::Float64`\n\t\tTemperatura inicial do fluido [K].\n\t`ĥ::Float64`\n\t\tCoeficiente de troca convectiva [W/(m².K)].\n\t`u::Float64`\n\t\tVelocidade do fluido [m/s].\n\t`ρ::Float64`\n\t\tDensidade do fluido [kg/m³].\n\t`h::Function`\n\t\tEntalpia em função da temperatura [J/kg].\n\t\"\"\"\n\tfunction ConstDensityEnthalpyPFRModel(;\n\t\t\tN::Int64,\n\t\t\tL::Float64,\n\t\t\tP::Float64,\n\t\t\tA::Float64,\n\t\t\tT::Float64,\n\t\t\tĥ::Float64,\n\t\t\tu::Float64,\n\t\t\tρ::Float64,\n\t\t\th::Function\n\t\t)\n\t\t# Aloca memória para o problema linear.\n K = 2spdiagm(0 => ones(N), -1 => -ones(N-1))\n b = ones(N+0)\n x = ones(N+1)\n\n\t\t# Discretização do espaço, N+1 para condição inicial.\n\t\tz = LinRange(0, L, N+1)\n\t\tδ = z[2] - z[1]\n\n\t\t# Coeficiente do problema.\n\t\tṁ = ρ * u * A\n\t\ta = (ĥ * P * δ) / ṁ\n\t\t\n\t\t# Inicializa solução constante.\n\t\tx[1:end] .= T\n\n\t\treturn new(N, K, b, x, a, z, ĥ, ṁ, h)\n\tend\nend","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"As próximas células implementam um mapa entre as condições vistas por ambos os reatores.","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"\"Representa um par de reatores em contrafluxo.\"\nstruct CounterFlowPFRModel\n this::AbstractPlugFlowReactor\n that::AbstractPlugFlowReactor\nend\n\n\"Acesso ao perfil de temperatura do primeiro reator em um par.\"\nthistemperature(cf::CounterFlowPFRModel) = cf.this.x\n\n\"Acesso ao perfil de temperatura do segundo reator em um par.\"\nthattemperature(cf::CounterFlowPFRModel) = cf.that.x |> reverse\n\nnothing; #hide","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"No que se segue não se fará hipótese de que ambos os escoamentos se dão com o mesmo fluido ou que no caso de mesmo fluido as velocidades são comparáveis. Neste caso mais geral, o número de Nusselt de cada lado da interface difere e portanto o coeficiente de troca térmica convectiva. É portanto necessário estabelecer-se uma condição de fluxo constante na interface das malhas para assegurar a conservação global da energia no sistema... TODO (escrever, já programado)","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"\"Perfil de temperatura na parede entre dois fluidos respeitando fluxo.\"\nfunction surfacetemperature(cf::CounterFlowPFRModel)\n T1 = thistemperature(cf)\n T2 = thattemperature(cf)\n\n ĥ1 = cf.this.ĥ\n ĥ2 = cf.that.ĥ\n\n Tw1 = 0.5 * (T1[1:end-1] + T1[2:end])\n Tw2 = 0.5 * (T2[1:end-1] + T2[2:end])\n\n return (ĥ1 * Tw1 + ĥ2 * Tw2) / (ĥ1 + ĥ2)\nend\n\n\"Conservação de entalpia entre dois reatores em contra-corrente.\"\nfunction enthalpyresidual(cf::CounterFlowPFRModel)\n enthalpyrate(r) = r.ṁ * (r.h(r.x[end]) - r.h(r.x[1]))\n\n Δha = enthalpyrate(cf.this)\n Δhb = enthalpyrate(cf.that)\n\t\n return abs(Δhb + Δha) / abs(Δha)\nend\n\n\"Método de relaxação baseado na entalpia.\"\nfunction relaxenthalpy!(Tm, hm, h̄, α, f)\n # Calcula erro e atualização antes!\n Δ = (1-α) * (h̄ - hm[2:end])\n ε = maximum(abs.(Δ)) / abs(maximum(hm))\n\n # Autaliza solução antes de resolver NLP.\n hm[2:end] += Δ\n\n # Solução das temperaturas compatíveis com hm.\n Tm[2:end] = map(f, Tm[2:end], hm[2:end])\n\n return ε\nend\n\n\"Método de relaxação baseado na temperatura.\"\nfunction relaxtemperature!(Tm, hm, h̄, α, f)\n # XXX: manter hm na interface para compabilidade com relaxenthalpy!\n # Solução das temperaturas compatíveis com h̄.\n Um = map(f, Tm[2:end], h̄)\n\n # Calcula erro e atualização depois!\n Δ = (1-α) * (Um - Tm[2:end])\n ε = maximum(abs.(Δ)) / abs(maximum(Tm))\n\n # Autaliza solução com resultado do NLP.\n Tm[2:end] += Δ\n\n return ε\nend\nnothing; #hide","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"Finalmente provemos a lógica dos laços interno e externo para a solução do problema não linear.","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"\"Laço interno da solução de reatores em contra-corrente.\"\nfunction innerloop(\n # residual::ResidualsRaw\n\t\t;\n cf::CounterFlowPFRModel,\n inneriter::Int64,\n α::Float64,\n ε::Float64,\n method::Symbol\n )::Int64\n\t\n relax = (method == :h) ? relaxenthalpy! : relaxtemperature!\n\n S = surfacetemperature(cf)\n f = (Tₖ, hₖ) -> find_zero(t -> cf.this.h(t) - hₖ, Tₖ)\n\n K = cf.this.K\n b = cf.this.b\n T = cf.this.x\n a = cf.this.a\n h = cf.this.h\n\n Tm = T\n hm = h.(Tm)\n\n b[1:end] = 2a * S\n b[1] += 2h(Tm[1])\n\n\tεm = 1.0e+300\n\t\n for niter in 1:inneriter\n h̄ = K \\ (b - a * (Tm[1:end-1] + Tm[2:end]))\n εm = relax(Tm, hm, h̄, α, f)\n # feedinnerresidual(residual, εm)\n\n if (εm <= ε)\n return niter\n end\n end\n\n @warn \"Não convergiu após $(inneriter) passos $(εm)\"\n return inneriter\nend\nnothing; #hide","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"\"Laço externo da solução de reatores em contra-corrente.\"\nfunction outerloop(\n cf::CounterFlowPFRModel;\n inneriter::Int64 = 50,\n outeriter::Int64 = 500,\n Δhmax::Float64 = 1.0e-10,\n α::Float64 = 0.6,\n ε::Float64 = 1.0e-10,\n\t\tmethod::Symbol = :h\n )#::Tuple{ResidualsProcessed, ResidualsProcessed}\n ra = cf\n rb = CounterFlowPFRModel(cf.that, cf.this)\n\n # resa = ResidualsRaw(inner, outer)\n # resb = ResidualsRaw(inner, outer)\n\n @time for nouter in 1:outeriter\n # ca = innerloop(resa; cf = ra, shared...)\n # cb = innerloop(resb; cf = rb, shared...)\n ca = innerloop(; cf = ra, inneriter, α, ε, method)\n cb = innerloop(; cf = rb, inneriter, α, ε, method)\n\n # resa.innersteps[nouter] = ca\n # resb.innersteps[nouter] = cb\n\n if enthalpyresidual(cf) < Δhmax\n @info(\"Laço externo convergiu após $(nouter) iterações\")\n break\n end\n end\n\n\thres = @sprintf(\"%.1e\", enthalpyresidual(cf))\n @info(\"Conservação da entalpia = $(hres)\")\n # return ResidualsProcessed(resa), ResidualsProcessed(resb)\nend\nnothing; #hide","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"\"Ilustração padronizada para a simulação exemplo.\"\nfunction plotpfrpair(cf::CounterFlowPFRModel; ylims, loc, func = lines!)\n z1 = cf.this.z\n T1 = thistemperature(cf)\n T2 = thattemperature(cf)\n\n fig = Figure(size = (720, 500))\n ax = Axis(fig[1, 1])\n\t\n func(ax, z1, T1, label = \"r₁ →\", color = :blue)#, step = :center)\n func(ax, z1, T2, label = \"r₂ ←\", color = :red)#, step = :center)\n\n ax.xticks = range(0.0, z1[end], 6)\n ax.yticks = range(ylims..., 6)\n ax.xlabel = \"Posição [m]\"\n ax.ylabel = \"Temperatura [K]\"\n xlims!(ax, (0, z1[end]))\n ylims!(ax, ylims)\n axislegend(position = loc)\n\n return fig\nend\nnothing; #hide","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/#Estudo-de-caso-I","page":"Reator pistão","title":"Estudo de caso I","text":"","category":"section"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"O par escolhido para exemplificar o comportamento de contra-corrente dos reatores pistão tem por característica de que cada reator ocupa a metade de um cilindro de diâmetro D m de forma que o perímetro de troca é igual o diâmetro e a área transversal a metade daquela do cilindro.","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"A temperatura inicial do fluido no reator (1) que escoa da esquerda para a direita é de (T₁) K e naquele em contra-corrente (2) é de (T₂) K.","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"O fluido do reator (2) tem um calor específico que é o triplo daquele do reator (1).","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"@info \"Condições para o caso I\"\n\n# Número de células no sistema.\nN = 100\n\n# Comprimento do reator [m]\nL = 10.0\n\n# Diâmetro do reator [m]\nD = 0.01\n\n# Mass específica dos fluidos [kg/m³]\nρ = 1000.0\n\n# Viscosidade dos fluidos [Pa.s]\nμ = 0.001\n\n# Número de Prandtl dos fluidos\nPr = 6.9\n\n# Calor específico do fluido [J/(kg.K)]\ncₚ₁ = 1000.0\ncₚ₂ = 3cₚ₁\n\n# Velocidade do fluido [m/s]\nu₁ = 1.0\nu₂ = 2.0\n\n# Temperatura de entrada do fluido [K]\nT₁ = 300.0\nT₂ = 400.0\n\n# Perímetro troca térmica de cada reator [m]\n# XXX: neste casa igual o diâmetro, ver descrição.\nP = D\n\n# Área da seção circula de cada reator [m²]\nA = (1 // 2) * π * (D / 2)^2\n\n# Diâmetro equivalente a seção para cada reator.\nd = 2√(A/π)\n\n# Cria objeto para avaliação do coeficiente de troca convectiva.\nhf = HtcPipeFlow(ReynoldsPipeFlow(), NusseltGnielinski(), ConstantPrandtl(Pr))\n\n# Coeficiente convectivo de troca de calor [W/(m².K)]\nĥ₁ = htc(hf, T₁, u, D, ρ, μ, cₚ; verbose = true)\nĥ₂ = htc(hf, T₂, u, D, ρ, μ, cₚ; verbose = true)\n\n# Entalpia com constante arbitrária [J/kg]\nh₁(T) = cₚ₁ * T + 1000.0\nh₂(T) = cₚ₂ * T + 1000.0\nnothing; #hide","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"let\n\tcommon = (N = N, L = L, P = P, A = A, ρ = ρ)\n\tparam₁ = (T = T₁, ĥ = ĥ₁, u = u₁, h = h₁)\n\tparam₂ = (T = T₂, ĥ = ĥ₂, u = u₂, h = h₂)\n\t\n\tr₁ = ConstDensityEnthalpyPFRModel(; common..., param₁...)\n\tr₂ = ConstDensityEnthalpyPFRModel(; common..., param₂...)\n\tcf = CounterFlowPFRModel(r₁, r₂)\n\n\touterloop(cf)\n\n\tplotpfrpair(cf; ylims = (300, 400), loc = :rb)\nend","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/#Estudo-de-caso-II-(draft)","page":"Reator pistão","title":"Estudo de caso II (draft)","text":"","category":"section"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"# # Condições operatórias do gás.\n# p₃ = 101325.0\n# h₃ = integrate(fluid3.cₚpoly)\n# M̄₃ = 0.02897530345830224\n\n# fluid₃ = (\n# ρ = (p₃ * M̄₃) / (GAS_CONSTANT * operations3.Tₚ),\n# μ = fluid3.μpoly(operations3.Tₚ),\n# cₚ = fluid3.cₚpoly(operations3.Tₚ),\n# Pr = fluid3.Pr\n# )\n\n# # Condições modificadas do fluido condensado.\n# operations₁ = (\n# u = operations3.u * (fluid₃.ρ / fluid1.ρ),\n# Tₚ = operations1.Tₚ\n# )\n\n# shared = (\n# N = N,\n# L = reactor.L,\n# P = reactor.D,\n# A = 0.5π * (reactor.D/2)^2,\n# ρ = fluid1.ρ\n# )\n\n# ĥ₁ = computehtc(; reactor..., fluid1..., u = operations₁.u, verbose = false)\n# ĥ₃ = computehtc(; reactor..., fluid₃..., u = operations3.u, verbose = false)\n\n# r₁ = IncompressibleEnthalpyPFRModel(;\n# shared...,\n# T = operations₁.Tₚ,\n# u = operations₁.u,\n# ĥ = ĥ₁,\n# h = (T) -> 1.0fluid1.cₚ * T + 1000.0\n# )\n\n# r₃ = IncompressibleEnthalpyPFRModel(;\n# shared...,\n# T = operations3.Tₚ,\n# u = operations3.u,\n# ĥ = ĥ₃,\n# h = (T) -> h₃(T),\n# )\n\n# r₁, r₂ = createprfpair2(; N = 1000)\n# cf = CounterFlowPFRModel(r₁, r₂)\n\n# resa, resb = outerloop(cf;\n# inner = 100,\n# outer = 200,\n# relax = 0.6,\n# Δhmax = 1.0e-10,\n# rtol = 1.0e-10\n# )\n\n# fig1 = plotpfrpair(cf, ylims = (300, 400))\n# fig2 = plotreactorresiduals(resa, resb)\n\n\n# \"Gera grafico com resíduos da simulação\"\n# function plotreactorresiduals(ra, rb)\n# function getreactordata(r)\n# xg = 1:r.counter\n# xs = r.finalsteps\n# yg = log10.(r.residuals)\n# ys = log10.(r.finalresiduals)\n# return xg, xs, yg, ys\n# end\n\n# function axlimitmax(niter)\n# rounder = 10^floor(log10(niter))\n# return convert(Int64, rounder * ceil(niter/rounder))\n# end\n\n# niter = max(ra.counter, rb.counter)\n# xga, xsa, yga, ysa = getreactordata(ra)\n# xgb, xsb, ygb, ysb = getreactordata(rb)\n\n# fig = Figure(resolution = (720, 500))\n# ax = Axis(fig[1, 1], yscale = identity)\n\n# ax.xlabel = \"Iteração global\"\n# ax.ylabel = \"log10(Resíduo)\"\n# ax.title = \"Histórico de convergência\"\n\n# ax.yticks = -12:2:0\n# xlims!(ax, (0, axlimitmax(niter)))\n# ylims!(ax, (-12, 0))\n\n# lines!(ax, xga, yga, color = :blue, linewidth = 0.9, label = \"r₁\")\n# lines!(ax, xgb, ygb, color = :red, linewidth = 0.9, label = \"r₂\")\n\n# scatter!(ax, xsa, ysa, color = :black, markersize = 6)\n# scatter!(ax, xsb, ysb, color = :black, markersize = 6)\n\n# axislegend(position = :rt)\n# return fig\n# end\n\n\n# \"Dados usados nos notebooks da série.\"\n# const notedata = (\n# c03 = (\n# fluid3 = (\n# # Viscosidade do fluido [Pa.s]\n# μpoly = Polynomial([\n# 1.7e-05 #TODO copy good here!\n# ], :T),\n# # Calor específico do fluido [J/(kg.K)]\n# cₚpoly = Polynomial([\n# 959.8458126240355,\n# 0.3029051601580761,\n# 3.988896105280984e-05,\n# -6.093647929461819e-08,\n# 1.0991100692950414e-11\n# ], :T),\n# # Número de Prandtl do fluido\n# Pr = 0.70\n# ),\n# operations3 = (\n# u = 2.5, # Velocidade do fluido [m/s]\n# Tₚ = 380.0, # Temperatura de entrada do fluido [K]\n# )\n# ),\n# )\n\n# \"Calcula a potência de `x` mais próxima de `v`.\"\n# function closestpowerofx(v::Number; x::Number = 10)::Number\n# rounder = x^floor(log(x, v))\n# return convert(Int64, rounder * ceil(v/rounder))\n# end\n\n# \"Gestor de resíduos durante uma simulação.\"\n# mutable struct ResidualsRaw\n# inner::Int64\n# outer::Int64\n# counter::Int64\n# innersteps::Vector{Int64}\n# residuals::Vector{Float64}\n# function ResidualsRaw(inner::Int64, outer::Int64)\n# innersteps = -ones(Int64, outer)\n# residuals = -ones(Float64, outer * inner)\n# return new(inner, outer, 0, innersteps, residuals)\n# end\n# end\n\n# \"Resíduos de uma simulação processados.\"\n# struct ResidualsProcessed\n# counter::Int64\n# innersteps::Vector{Int64}\n# residuals::Vector{Float64}\n# finalsteps::Vector{Int64}\n# finalresiduals::Vector{Float64}\n\n# function ResidualsProcessed(r::ResidualsRaw)\n# innersteps = r.innersteps[r.innersteps .> 0.0]\n# residuals = r.residuals[r.residuals .> 0.0]\n\n# finalsteps = cumsum(innersteps)\n# finalresiduals = residuals[finalsteps]\n\n# return new(r.counter, innersteps, residuals,\n# finalsteps, finalresiduals)\n# end\n# end\n\n# \"Alimenta resíduos da simulação no laço interno.\"\n# function feedinnerresidual(r::ResidualsRaw, ε::Float64)\n# # TODO: add resizing test here!\n# r.counter += 1\n# r.residuals[r.counter] = ε\n# end","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/#Trocas-em-fluidos-supercríticos","page":"Reator pistão","title":"Trocas em fluidos supercríticos","text":"","category":"section"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/#O-estado-supercrítico","page":"Reator pistão","title":"O estado supercrítico","text":"","category":"section"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"A condição supercrítica não implica uma transição de fase de primeira ordem propriamente dita. Usando o pacote SteamTables implementa propriedades da água em acordo com a IAPWS Industrial Formulation (1997) recuperamos a seguinte curva de massa específica. De maneira análoga verificamos a transição progressiva na entalpia. Como buscamos desenvolver um modelo de reator formulado em termos da entalpia, provemos uma função de interpolação para uma pressão dada abaixo. No caso mais geral (com perda de carga) a entalpia deverá ser avaliada para cada célula no domínio do reator.","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"with_theme() do\n P = 0.1 * 270.0\n T = collect(300.0:5:1200.0)\n \n ρ = map((t)->1.0 / SpecificV(P, t), T)\n h = map((t)->SpecificH(P, t), T)\n \n T_interp = collect(400.0:25.0:1200.0)\n h_interp = linear_interpolation(T, h)\n \n\tfig = Figure(size = (720, 600))\n \n\tax1 = Axis(fig[1, 1])\n\tlines!(ax1, T, ρ; color = :black)\n\tax1.xlabel = \"Temperatura [K]\"\n\tax1.ylabel = \"Mass específica [kg/m³]\"\n\tax1.xticks = 300:100:1200\n\tax1.yticks = 000:200:1000\n\txlims!(ax1, (400, 1000))\n\tylims!(ax1, (000, 1000))\n\n ax2 = Axis(fig[2, 1])\n scatter!(ax2, T_interp, h_interp(T_interp); color = :red, alpha = 0.7)\n lines!(ax2, T, h; color = :black)\n ax2.xlabel = \"Temperatura [K]\"\n ax2.ylabel = \"Entalpia específica [kJ/kg]\"\n ax2.xticks = 400:100:1000\n ax2.yticks = 000:500:4000\n xlims!(ax2, (400, 1000))\n ylims!(ax2, (500, 4000))\n \n fig\nend","category":"page"},{"location":"Notebooks/03-Plug-Flow-Reactor-1/","page":"Reator pistão","title":"Reator pistão","text":"# \"Integra reator pistão circular no espaço das entalpias.\"\n# function solveenthalpypfr(; mesh::AbstractDomainFVM, P::T, A::T, Tₛ::T, Tₚ::T,\n# ĥ::T, u::T, ρ::T, h::Function, M::Int64 = 100,\n# α::Float64 = 0.4, ε::Float64 = 1.0e-10,\n# alg::Any = Order16(), vars...) where T\n# N = length(mesh.z) - 1\n\n# Tm = Tₚ * ones(N + 1)\n# hm = h.(Tm)\n\n# a = (ĥ * P * mesh.δ) / (ρ * u * A)\n# K = 2spdiagm(-1 => -ones(N-1), 0 => ones(N))\n\n# b = (2a * Tₛ) * ones(N)\n# b[1] += 2h(Tₚ)\n\n# residual = -ones(M)\n\n# @time for niter in 1:M\n# Δ = (1-α) * (K\\(b - a * (Tm[1:end-1] + Tm[2:end])) - hm[2:end])\n# hm[2:end] += Δ\n\n# Tm[2:end] = map(\n# (Tₖ, hₖ) -> find_zero(t -> h(t) - hₖ, Tₖ, alg, atol=0.1),\n# Tm[2:end], hm[2:end]\n# )\n\n# residual[niter] = maximum(abs.(Δ))\n\n# if (residual[niter] <= ε)\n# @info(\"Convergiu após $(niter) iterações\")\n# break\n# end\n# end\n\n# return Tm, residual\n# end\n\n# let\n# L = 3.0\n# mesh = ImmersedConditionsFVM(; L = L, N = 3000)\n\n# D = 0.0254 / 2\n# P = π * D\n# A = π * D^2 / 4\n\n# Tₛ = 873.15\n# ṁ = 60.0 / 3600.0\n\n# Pₚ = 27.0\n# Tₚ = 300.0\n# ρₚ = 1.0 / SpecificV(Pₚ, Tₚ)\n# uₚ = ṁ / (ρₚ * A)\n\n# h_interp = let\n# T = collect(300.0:5.0:2000.0)\n# h = map((t)->SpecificH(Pₚ, t), T)\n# linear_interpolation(T, h)\n# end\n\n# z = mesh.z\n# ĥ = 4000.0\n\n# # TODO search literature for supercritical!\n# # ĥ = computehtc(; reactor..., fluid..., u = operations.u)\n\n# h(t) = 1000h_interp(t)\n\n# pars = (\n# mesh = mesh,\n# P = P,\n# A = A,\n# Tₛ = Tₛ,\n# Tₚ = Tₚ,\n# ĥ = ĥ,\n# u = uₚ,\n# ρ = ρₚ,\n# h = h,\n# M = 1000,\n# α = 0.85,\n# ε = 1.0e-06,\n# alg = Order16()\n# )\n\n# T, residuals = solveenthalpypfr(; pars...)\n\n# fig1 = let\n# yrng = (300.0, 900.0)\n\n# Tend = @sprintf(\"%.2f\", T[end])\n# fig = Figure(resolution = (720, 500))\n# ax = Axis(fig[1, 1])\n# stairs!(ax, z, T,\n# color = :red, linewidth = 2,\n# label = \"Numérica\", step = :center)\n# xlims!(ax, (0, L))\n# ax.title = \"Temperatura final = $(Tend) K\"\n# ax.xlabel = \"Posição [m]\"\n# ax.ylabel = \"Temperatura [K]\"\n# ax.xticks = range(0.0, L, 5)\n# ax.yticks = range(yrng..., 7)\n# ylims!(ax, yrng)\n# axislegend(position = :rb)\n# fig\n# end\n# end","category":"page"},{"location":"References/@Guo2023g/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Guo2023g/","page":"-","title":"-","text":"title: \"Unraveling the design pattern of physics-informed neural networks: Series 07\" authors: Shuai Guo year: 2023 URL: https://towardsdatascience.com/unraveling-the-design-pattern-of-physics-informed-neural-networks-part-07-4ecb543b616a –-","category":"page"},{"location":"Notes/Monthly/#Monthly","page":"Monthly","title":"Monthly","text":"","category":"section"},{"location":"Notes/Monthly/","page":"Monthly","title":"Monthly","text":"","category":"page"},{"location":"Notes/Monthly/#July-2024","page":"Monthly","title":"July 2024","text":"","category":"section"},{"location":"Notes/Monthly/","page":"Monthly","title":"Monthly","text":"","category":"page"},{"location":"Notes/Monthly/#April-2024","page":"Monthly","title":"April 2024","text":"","category":"section"},{"location":"Notes/Monthly/","page":"Monthly","title":"Monthly","text":"Reviewed GPU limitations for Ansys Fluent. It remains NVIDIA only. Currently the models remain quite limited to simple flows and the classic turbulence model. Possibility of species transport but to reactions.\nReviewed Ansys Tutorial Guide 2023R1 chapter regarding droplets evaporation. There is nothing there I am not already using in the models I conceive. Remember to use transient tracking and check mean properties for iso-surfaces display.\nContinued (re-)learning about UDF's. Header files seem fine if placed under an include/ directory at project root (not case root!). Simulations can be made more flexible by using Scheme variables which can be parsed by UDF's.\nDownloading files from Analysis of Transport Phenomena at MITx.\nWorked on random walk diffusion models at microscopic scale. Started a draft of a tutorial for moving particles in a square grid in Julia.\nContinued working on diffusion, now writing down the draft of the course. I think an annex of thermodynamics or even dedicated chapters might be required, to be defined.","category":"page"},{"location":"Notes/Naturalisation/#Suivi-des-étapes","page":"-","title":"Suivi des étapes","text":"","category":"section"},{"location":"Notes/Naturalisation/","page":"-","title":"-","text":"État Étape Notes\nFini Saisie Juste le formulaire à remplir, le plus compliqué c'est d'avoir toutes les dates et adresses des résidences précedentes.\nEn cours Documents Il manque les traductions, certificats de travail, casier judiciaire et bordereau fiscale.\n ","category":"page"},{"location":"Notes/Naturalisation/#Documents","page":"-","title":"Documents","text":"","category":"section"},{"location":"Notes/Naturalisation/#Mes-informations","page":"-","title":"Mes informations","text":"","category":"section"},{"location":"Notes/Naturalisation/","page":"-","title":"-","text":"[x] Passeport\n[x] Acte de naissance (propre)\n[ ] Acte de naissance (propre, traduction française)\n[x] Titre de séjour (propre)\n[x] Diplôme français niveau >3 (notes)","category":"page"},{"location":"Notes/Naturalisation/#Parents-et-fratrie","page":"-","title":"Parents et fratrie","text":"","category":"section"},{"location":"Notes/Naturalisation/","page":"-","title":"-","text":"[ ] Acte de mariage (parents)\n[ ] Acte de mariage (parents, traduction française)\n[x] Acte de naissance (mère)\n[ ] Acte de naissance (mère, traduction française)\n[x] Acte de naissance (père)\n[ ] Acte de naissance (père, traduction française)\n[x] Acte de décès (père)\n[ ] Acte de décès (père, traduction française)","category":"page"},{"location":"Notes/Naturalisation/#Ma-situation-familiale","page":"-","title":"Ma situation familiale","text":"","category":"section"},{"location":"Notes/Naturalisation/","page":"-","title":"-","text":"[x] Acte de mariage\n[x] Titre de séjour du conjoint\n[ ] Certificats de travail du conjoint (3 dernières années)\n[x] Contrat de travail du conjoint\n[x] Les 3 derniers bulletins de salaire du conjoint\n[x] Bulletins de salaire du conjoint de novembre et décembre des 3 dernières années","category":"page"},{"location":"Notes/Naturalisation/#Mon-domicile","page":"-","title":"Mon domicile","text":"","category":"section"},{"location":"Notes/Naturalisation/","page":"-","title":"-","text":"[x] Contrat de location\n[x] Les 3 dernières quittances de loyer\n[x] Justificatif de domicile datant de moins de 6 mois\n[ ] Casier judiciaire étranger des pays dont vous avez la nationalité\n[ ] Casier judiciaire étranger des pays dont vous avez la nationalité (traduction française)","category":"page"},{"location":"Notes/Naturalisation/#Mes-ressources","page":"-","title":"Mes ressources","text":"","category":"section"},{"location":"Notes/Naturalisation/","page":"-","title":"-","text":"[x] Avis d’imposition des 3 dernières années\n[ ] Bordereau de situation fiscale (modèle P. 237) (3 dernières années)\n[ ] Les certificats de travail, concernant si possible les 3 dernières années\n[x] Contrat de travail et ses MAJ\n[x] Les 3 derniers bulletins de salaire \n[x] Bulletins de salaire de novembre et décembre des 3 dernières années","category":"page"},{"location":"Notes/carburizing/#Mass-transfer","page":"-","title":"Mass transfer","text":"","category":"section"},{"location":"Notes/carburizing/#Carbon-diffusion-in-plain-iron","page":"-","title":"Carbon diffusion in plain iron","text":"","category":"section"},{"location":"Notes/carburizing/","page":"-","title":"-","text":"fracpartialxpartialt=nablacdotp(D(x)nablaT)","category":"page"},{"location":"Notes/carburizing/","page":"-","title":"-","text":"fracpartialxpartialt=\nfracpartialpartialx\nleft(D(x)fracpartialxpartialzright)","category":"page"},{"location":"Notes/carburizing/","page":"-","title":"-","text":"int_s^nint_0^tau\nfracpartialxpartialtdtdz=\nint_0^tauint_s^n\nfracpartialpartialz\nleft(D(x)fracpartialxpartialzright)dzdt","category":"page"},{"location":"Notes/carburizing/","page":"-","title":"-","text":"left(x_P^tau-x_P^0right)(w_n-w_s)=\nint_0^tau\nleft(D(x)fracpartialTpartialrright)biggvert_s^ndt","category":"page"},{"location":"Notes/carburizing/","page":"-","title":"-","text":"beginalign\nleft(x_P^tau-x_P^0right)frac(w_n-w_s)tau=\nfleft\nD(x_n)fracx_N^tau-x_P^taudelta_PN-\nD(x_s)fracx_P^tau-x_S^taudelta_PS\nright8pt\n+(1-f)left\nD(x_n)fracx_N^0-x_P^0delta_PN-\nD(x_s)fracx_P^0-x_S^0delta_PS\nright\nendalign","category":"page"},{"location":"Notes/carburizing/","page":"-","title":"-","text":"beginalign\nalpha_P = frac(w_n-w_s)tau8pt\nbeta_j = fracD(x_j)delta_PJ\nendalign","category":"page"},{"location":"Notes/carburizing/","page":"-","title":"-","text":"-fbeta_sx_S+\n(alpha_P+fbeta_n+fbeta_s)x_P\n-fbeta_nx_N\n=\ngbeta_sx_S^0+\n(alpha_P-gbeta_n-gbeta_s)x_P^0+\ngbeta_nx_N^0","category":"page"},{"location":"Notes/carburizing/","page":"-","title":"-","text":"-beta_sx_S+\n(alpha_P+beta_n+beta_s)x_P\n-beta_nx_N\n=\nalpha_Px_P^0","category":"page"},{"location":"Notes/carburizing/","page":"-","title":"-","text":"beginalign\na_S = -beta_s8pt\na_N = -beta_n8pt\na_P = alpha_P+beta_n+beta_s\nendalign","category":"page"},{"location":"Notes/carburizing/","page":"-","title":"-","text":"a_Sx_S + a_Px_P + a_Nx_N = alpha_Px_P^0","category":"page"},{"location":"Notes/carburizing/","page":"-","title":"-","text":"a_1x_P + a_Nx_N = alpha_Px_P^0quadtextwherequada_1=alpha_P+beta_n","category":"page"},{"location":"Notes/carburizing/","page":"-","title":"-","text":"a_Sx_S + a_Rx_P = alpha_Px_P^0+hx_inftyquadtextwherequada_R=alpha_P+h+beta_s","category":"page"},{"location":"Notes/carburizing/","page":"-","title":"-","text":"note: About mass intake calculation\n","category":"page"},{"location":"Notes/carburizing/","page":"-","title":"-","text":"rho_Fe = fracm_FeV_cell","category":"page"},{"location":"Notes/carburizing/","page":"-","title":"-","text":"y_C = fracm_Cm_Fe + m_C","category":"page"},{"location":"Notes/carburizing/","page":"-","title":"-","text":"m_Fe+C = fracm_Fe1 - y_C","category":"page"},{"location":"Notes/carburizing/","page":"-","title":"-","text":"rho_Fe+C = rho_Fefrac11 - y_C","category":"page"},{"location":"Notes/carburizing/","page":"-","title":"-","text":"sigma = int_0^Lrho(z)y_C(z)dz","category":"page"},{"location":"Notes/carburizing/","page":"-","title":"-","text":"sigma = rho_Feint_0^Lfracy_C(z)1-y_C(z)dz","category":"page"},{"location":"Notes/carburizing/","page":"-","title":"-","text":"Deltasigma = rho_Feleft(int_0^Lfracy_C(z)1-y_C(z)dzright)biggrvert_t=0^t=t_f","category":"page"},{"location":"References/@Garaniya2012a/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Garaniya2012a/","page":"-","title":"-","text":"title: CFD modelling of heavy fuel oil spray combustion authors: V. Garaniya, L. Goldsworthy year: 2012 URL: https://flair.monash.edu/intranet/proceedings/18afmc/Documents/400%20-%20Garaniya.pdf Drive: https://1drv.ms/b/s!Ar4x-UlrYAiZlbEh7jKBqcgTdikWRQ?e=Zima6B –-","category":"page"},{"location":"References/@Guo2024a/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Guo2024a/","page":"-","title":"-","text":"title: \"Physics-informed neural networks: An application-centric guide\" authors: Shuai Guo year: 2024 URL: https://towardsdatascience.com/physics-informed-neural-networks-an-application-centric-guide-dc1013526b02 –-","category":"page"},{"location":"References/@Krishnapriyan2021a/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Krishnapriyan2021a/","page":"-","title":"-","text":"title: Characterizing possible failure modes in physics-informed neural networks authors: Aditi S. Krishnapriyan, Amir Gholami, Shandian Zhe, Robert M. Kirby, Michael W. Mahoney year: 2021 DOI: https://doi.org/10.48550/arXiv.2109.01050 Drive: https://1drv.ms/b/s!Ar4x-UlrYAiZla8bwpowG74YkMl_tA?e=DmUIjw –-","category":"page"},{"location":"Modules/DryMaterials/#DryMaterials","page":"DryMaterials","title":"DryMaterials","text":"","category":"section"},{"location":"Modules/DryMaterials/","page":"DryMaterials","title":"DryMaterials","text":"CurrentModule = DryMaterials\nDocTestSetup = quote\n using DryMaterials\nend\nEditURL = \"https://github.com/wallytutor/WallyToolbox.jl/blob/main/docs/src/Modules/DryMaterials.md\"","category":"page"},{"location":"Modules/DryMaterials/#Solid-Thermodynamics","page":"DryMaterials","title":"Solid Thermodynamics","text":"","category":"section"},{"location":"Modules/DryMaterials/","page":"DryMaterials","title":"DryMaterials","text":"danger: Danger\nThe following sub-sections document structures and functions that are undergoing active development to harmonize all interfaces. Changes are expected to happen all the time before a common ground is found.","category":"page"},{"location":"Modules/DryMaterials/#Laurent-Polynomial-Models","page":"DryMaterials","title":"Laurent Polynomial Models","text":"","category":"section"},{"location":"Modules/DryMaterials/","page":"DryMaterials","title":"DryMaterials","text":"SolidPolynomialProperties","category":"page"},{"location":"Modules/DryMaterials/#DryMaterials.SolidPolynomialProperties","page":"DryMaterials","title":"DryMaterials.SolidPolynomialProperties","text":"Arbitrary Laurent polynomial specific heat and enthalpy of materials.\n\nc: Polynomial representation of specific heat [J/(kg.K)].\nh: Polynomial representation of enthalpy [J/kg].\nhₒ: Reference state enthalpy [J/kg].\n\n\n\n\n\n","category":"type"},{"location":"Modules/DryMaterials/#Ongoing-documentation","page":"DryMaterials","title":"Ongoing documentation","text":"","category":"section"},{"location":"Modules/DryMaterials/","page":"DryMaterials","title":"DryMaterials","text":"DryMaterials.SolidMineralPhase\nDryMaterials.enthalpy\nDryMaterials.specificheat\nDryMaterials.density\nDryMaterials.molecularmass","category":"page"},{"location":"Modules/DryMaterials/#DryMaterials.SolidMineralPhase","page":"DryMaterials","title":"DryMaterials.SolidMineralPhase","text":"Represents a solid mineral phase for thermodynamic calculations.\n\nname: Name of phase.\nρ: Specific mass of phase [kg/m³].\nM: Molecular mass of phase [kg/mol].\np: Polynomial properties of phase.\n\n\n\n\n\n","category":"type"},{"location":"Modules/DryMaterials/#DryMaterials.enthalpy","page":"DryMaterials","title":"DryMaterials.enthalpy","text":"Evaluates the enthalpy of material [J/kg].\n\n\n\n\n\n","category":"function"},{"location":"Modules/DryMaterials/#DryMaterials.specificheat","page":"DryMaterials","title":"DryMaterials.specificheat","text":"Evaluates the specific heat of materials [J/(kg.K)].\n\n\n\n\n\n","category":"function"},{"location":"Modules/DryMaterials/#DryMaterials.density","page":"DryMaterials","title":"DryMaterials.density","text":"Evaluates the density of material [kg/m³].\n\n\n\n\n\n","category":"function"},{"location":"Modules/DryMaterials/#DryMaterials.molecularmass","page":"DryMaterials","title":"DryMaterials.molecularmass","text":"Retrieve molecular mass of materials [kg/mol].\n\n\n\n\n\n","category":"function"},{"location":"Modules/DryMaterials/#Hard-coded-materials","page":"DryMaterials","title":"Hard-coded materials","text":"","category":"section"},{"location":"Modules/DryMaterials/","page":"DryMaterials","title":"DryMaterials","text":"DryMaterials.H_AIR\nDryMaterials.PureAir\nDryMaterials.PureMineral\nDryMaterials.PureWater","category":"page"},{"location":"Modules/DryMaterials/#DryMaterials.H_AIR","page":"DryMaterials","title":"DryMaterials.H_AIR","text":"Coefficients for air enthalpy polynomial [J/kg].\n\n\n\n\n\n","category":"constant"},{"location":"Modules/DryMaterials/#DryMaterials.PureAir","page":"DryMaterials","title":"DryMaterials.PureAir","text":"Simple implementation of pure air for illustration purposes.\n\n\n\n\n\n","category":"type"},{"location":"Modules/DryMaterials/#DryMaterials.PureMineral","page":"DryMaterials","title":"DryMaterials.PureMineral","text":"Simple solid mineral material for illustration purposes.\n\n\n\n\n\n","category":"type"},{"location":"Modules/DryMaterials/#DryMaterials.PureWater","page":"DryMaterials","title":"DryMaterials.PureWater","text":"Simple implementation of liquid water for illustration purposes.\n\n\n\n\n\n","category":"type"},{"location":"References/@Gunn1978/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Gunn1978/","page":"-","title":"-","text":"title: Transfer of heat or mass to particles in fixed and fluidised beds authors: D. J. Gunn year: 1978 –-","category":"page"},{"location":"References/@Patankar1980/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Patankar1980/","page":"-","title":"-","text":"title: Numerical heat transfer and fluid flow authors: Suhas V. Patankar year: 1980 –-","category":"page"},{"location":"References/@Qiu2018a/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Qiu2018a/","page":"-","title":"-","text":"title: \"Inhomogeneity in pore size appreciably lowering thermal conductivity for porous thermal insulators\" authors: Lin Qiu, Hanying Zou, Dawei Tang, Dongsheng Wen, Yanhui Feng, Xinxin Zhang year: 2018 –-","category":"page"},{"location":"#WallyToolbox","page":"Home","title":"WallyToolbox","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"General tools I use everyday for everything.","category":"page"},{"location":"#About-the-toolbox","page":"Home","title":"About the toolbox","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"My name is Walter (CV) and I like writing about science and engineering topics. I have more than a decade of scientific computing experience and a broad experience with open source software, especially in the fields of fluid dynamics and gas phase kinetics; a little of it being shared here.","category":"page"},{"location":"","page":"Home","title":"Home","text":"During the years I tried to different formats to organize my study materials and working tools, but it was only recently that I realized that coupling my knowledge base with the documentation of my personal code was the best approach in terms of maintenance. Obviously I cannot migrate all the content I have ever produced here at once, so my decision was to restructure everything and have a fresh start, feeding content as required, i.e. somebody asked me a hand in a certain subject or I need to refresh certain skill at work. In this page you will also find the supporting materials of my Medium articles and some additional content.","category":"page"},{"location":"","page":"Home","title":"Home","text":"The core package of WallyToolbox ecosystem provides shared functionalities and types that are used in more specialized packages. It is an unpublished rolling release package composed of several sub-modules not making part of the main one and currently not following any versioning semantics. That means that new features are added and only the commits track differences. Its main goal is to provide a portable working environment that runs smoothly (at least) under Windows; anyone working in the numerical world knows the struggle with IT to have a proper Linux working system, especially in a portable device.","category":"page"},{"location":"","page":"Home","title":"Home","text":"This unification over a central package allows for standardization of interfaces, employed quantities, and avoid boilerplate code. This page organizes everything (or tries to) to facilitate the understanding of the end-user.","category":"page"},{"location":"","page":"Home","title":"Home","text":"info: Info\nOver the time it is expected that many functionalities from other modules will integrate WallyToolbox as they become stable. In some cases, entire modules may become sub-modules on integrated directly under WallyToolbox, so you might need to check where to import some utilities as this package is rolling release. This is temporary and will be modified when all the old code base that is giving origing to the package is migrated here, what will take me a few years. Nonetheless, the package will probably not be published to Julia registries because of the way its governance works. WallyToolbox.jl tries to be self-contained in several aspects because of the needs of perfect integration between functionalities of several of its foreseen end applications. That is currently incompatible with using some of the state-of-the-art packages from Julia ecosystem.","category":"page"},{"location":"#Using-the-modules","page":"Home","title":"Using the modules","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"The simplest way to use WallyToolbox is by launching Julia the root directory of WallyToolbox.jl as a project from command line, such as julia --project=.[1]; this way one has access to most Julia modules packaged within the toolbox. Notice that for a full availability one needs to consider the extra steps provided in the setup guide, which is the preferred way to deploy a working system with WallyToolbox.","category":"page"},{"location":"","page":"Home","title":"Home","text":"[1]: You might need to enter pkg mode and instantiate the project to get all dependencies installed. You can find more about this here.","category":"page"},{"location":"#Contact-and-citing","page":"Home","title":"Contact and citing","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"For quick questions and proposals, please prefer Zulip Chat. If you found and error or bug, please create an issue. That will make me more efficient at handling everything. If none of those work for you, you can contact me by mail. ","category":"page"},{"location":"","page":"Home","title":"Home","text":"Found it useful? See CITATION.bib for the relevant reference.","category":"page"},{"location":"Articles/Maybe-I-f-ed-my-career/#Maybe-I-f**********-my-career...","page":"Maybe I f********** my career...","title":"Maybe I f********** my career...","text":"","category":"section"},{"location":"Articles/Maybe-I-f-ed-my-career/","page":"Maybe I f********** my career...","title":"Maybe I f********** my career...","text":"…and it is not all on me, just part of it.","category":"page"},{"location":"Articles/Maybe-I-f-ed-my-career/","page":"Maybe I f********** my career...","title":"Maybe I f********** my career...","text":"In this essay I will tentatively tell in some sort of autobiography how I messed up with my career and what may be the way out of this mess. I won't explore any details or feelings, but stick to facts, my observations at each of the episodes, and my takes about the happenings.","category":"page"},{"location":"Articles/Maybe-I-f-ed-my-career/","page":"Maybe I f********** my career...","title":"Maybe I f********** my career...","text":"","category":"page"},{"location":"Articles/Maybe-I-f-ed-my-career/#Early-life","page":"Maybe I f********** my career...","title":"Early life","text":"","category":"section"},{"location":"Articles/Maybe-I-f-ed-my-career/","page":"Maybe I f********** my career...","title":"Maybe I f********** my career...","text":"It has never been questioned in my circles that I was some sort of gifted child. But certainly, I was not what you first think about when hearing about someone gifted. I could read and write in some rudimentary ways before age 4 — and that led me to opening Pandora’s box. By age 6 I had read most of the encyclopedias we had at home, my main interests being history, art, and engineering; at that time, I was already able to discuss with adults on these topics and most kids were embarrassingly boring to me. It was reading and reading and reading that time was spent.","category":"page"},{"location":"Articles/Maybe-I-f-ed-my-career/","page":"Maybe I f********** my career...","title":"Maybe I f********** my career...","text":"Numismatics came next and, in a few years, I was not just a kid collecting lost coins around the house, but the one with in depth knowledge of the characters being depicted, historical events, and an actual set of collectible coins; needless to say, that really developed my interest in metals. Ah, and before I forget, at the same time I was also really into rocks and geology, always digging around looking for gems, which at the time I was often able to identify, and when stuck I would recur to the local natural history museum geologist for help. I know I should have been running and playing around by that time, but it simply was not my thing, so I ended up not developing good motor skills by then.","category":"page"},{"location":"Articles/Maybe-I-f-ed-my-career/","page":"Maybe I f********** my career...","title":"Maybe I f********** my career...","text":"For the next ten years or so I barely had to study for school because I had self-taught me everything that was in the curriculum, so I could spend my time learning new subjects that had come to my attention, especially university level ones. Because of that only on a few occasions I was the first of my class since I never reviewed, but most of the time the second or third at most. The profile of the ones on the top was really the dedicated ones, those who were seeing the topics for the first time and delving in the subjects for the exams. My view on then was of demise cause most of the time it was clear their actual grasp of what was behind things.","category":"page"},{"location":"Articles/Maybe-I-f-ed-my-career/","page":"Maybe I f********** my career...","title":"Maybe I f********** my career...","text":"By age 11 my interest in sports grew; I had always been fond of adventure and then I started mountain biking. That was the first time I really socialized and by age 16 you couldn’t tell anymore that I had been that weird child — finally I was a normal person. Or not. Because of those highly cultural beginnings you could tell some features wouldn’t really let me fit in with my pairs. So finally, the last year before college I got back to my roots and studied everything once again, but 16h+ per day, no eating, no sleeping — sometimes cheap vodka — and managed to get accepted in first place at some major universities around my place, but that is the matter of the next paragraph.","category":"page"},{"location":"Articles/Maybe-I-f-ed-my-career/","page":"Maybe I f********** my career...","title":"Maybe I f********** my career...","text":"","category":"page"},{"location":"Articles/Maybe-I-f-ed-my-career/#At-college","page":"Maybe I f********** my career...","title":"At college","text":"","category":"section"},{"location":"Articles/Maybe-I-f-ed-my-career/","page":"Maybe I f********** my career...","title":"Maybe I f********** my career...","text":"Tired. That’s how you describe my early days at college. Hormones blowing up and tiredness. So many years reading and reading got me tired. I essentially had learned what I thought was enough to already get my diploma and start working or something like that. First semester was not great intellectually speaking but after I few months I put my head in place and started working hard. Got a job in a lab. Some of the experimental work I was carrying used to be very boring and take many hours. For safety reasons you had to stay there to make sure everything was fine. But you know me, any free time and I will start reading. By the end of the first year, I had finished studying — exercises included — most of the books I needed to read for the next two years or so, and that didn’t prevent me of partying a lot.","category":"page"},{"location":"Articles/Maybe-I-f-ed-my-career/","page":"Maybe I f********** my career...","title":"Maybe I f********** my career...","text":"Everything seems fine so far but that is not actually true. While I was the highest performing student of my class and got moderately social, this was the turning point where performance started to mess things up. I was following my undergraduate studies in Materials Engineering with focus in Mechanics — in Brazil you get Materials Engineering to be associated to Mechanical or Chemical Engineering, and your diploma is not actually in Materials Engineering in the end — but since most of Materials Science topics are about having a good memory and knowing how analyse and to put things together to get things done, I diverged into the neighboring engineering schools and sometimes in the Physics department.","category":"page"},{"location":"Articles/Maybe-I-f-ed-my-career/","page":"Maybe I f********** my career...","title":"Maybe I f********** my career...","text":"I was often taking classes at other undergraduate courses and when not available, I would take lecture notes and study them anyway. I managed to become better at plain Mechanical Engineering than I was in pure Materials Engineering and sometimes taught subjects to friends following that course. Here we notice that I completely changed subjects since I was a child: from history and art, now I was into applied mathematics and thermal engines. Things always had a limit to me, but not because of difficulty; once I have a feeling of being able to go beyond in a subject by myself, I also start to get bored. The grasp of the generality of a subject fulfils my curiosity.","category":"page"},{"location":"Articles/Maybe-I-f-ed-my-career/","page":"Maybe I f********** my career...","title":"Maybe I f********** my career...","text":"By the fifth and last year I was considering a PhD in Germany but finally I decided to stay a bit more around. In fact, I was no longer feeling like I wanted to stay in academia and got a particularly respectable job offer that I sticked with; more on that next.","category":"page"},{"location":"Articles/Maybe-I-f-ed-my-career/","page":"Maybe I f********** my career...","title":"Maybe I f********** my career...","text":"","category":"page"},{"location":"Articles/Maybe-I-f-ed-my-career/#First-job","page":"Maybe I f********** my career...","title":"First job","text":"","category":"section"},{"location":"Articles/Maybe-I-f-ed-my-career/","page":"Maybe I f********** my career...","title":"Maybe I f********** my career...","text":"By age 22 I was an engineer; later than I expected but I didn’t tell you that my parents refused to let me skip a few years at school as some of my tutors proposed at some point. This could have been much earlier but then I would be jobless or following a PhD in the Humanities. That was not the case, before even getting my diploma I already had the job offer and the transition from intern to actual engineer happened overnight as I got my diplomas. In fact, nothing changed — except that they started paying me a decent salary quite above the average at that time.","category":"page"},{"location":"Articles/Maybe-I-f-ed-my-career/","page":"Maybe I f********** my career...","title":"Maybe I f********** my career...","text":"So, I started working in a not that technical position. At first, I was writing technical specifications for materials and mechanical construction of metallic parts, but soon someone realized that my strongest feature was my negotiation skills and from that day I was often defending deviations from technical requirements with the customers and proposing technical alternatives. It was a very transversal job with interaction with all levels from the shop floor to the high management. It didn’t take long for me to start living in an airplane going to technical audits all around and to participate at the defining stages of scope of commercial supply in large projects. By this time, my hobby was learning a little bit of every language I was able to, and I did that with religious fervor.","category":"page"},{"location":"Articles/Maybe-I-f-ed-my-career/","page":"Maybe I f********** my career...","title":"Maybe I f********** my career...","text":"So far you may think all this took me at least 5 years to accomplish, but in fact it lasted only 1 year and 10 months. The main reason I excelled at this position was that whole random background I carried with strong scientific culture, good history knowledge, and on general matters. It became natural to me to start a conversation with anyone and later develop links that allowed huge gains in negotiation. My career was on track, and it seemed very promising. But I told you already that once I reached a certain level of generality, I need a change.","category":"page"},{"location":"Articles/Maybe-I-f-ed-my-career/","page":"Maybe I f********** my career...","title":"Maybe I f********** my career...","text":"At some point I found myself there and had the urge to reach out a previous internship advisor in France. When I first worked in his team, I didn’t do a fantastic job as I try to most of the time, but anyways he had good views of me and offered me a PhD. In a few months it was me again in a plane flying once again to France. What made me interested in the PhD offer he proposed me was the fact that I already knew most of the literature on the subject, so that would allow me to get back and finish some open ends from my undergraduate studies. I didn't expect to make I great thesis, just to follow the rules and get a PhD. What matters is what you learn on your free time, that's what life taught me so far. ","category":"page"},{"location":"Articles/Maybe-I-f-ed-my-career/","page":"Maybe I f********** my career...","title":"Maybe I f********** my career...","text":"","category":"page"},{"location":"Articles/Maybe-I-f-ed-my-career/#Graduate-years","page":"Maybe I f********** my career...","title":"Graduate years","text":"","category":"section"},{"location":"Articles/Maybe-I-f-ed-my-career/","page":"Maybe I f********** my career...","title":"Maybe I f********** my career...","text":"There I would finally go deeper in fluid dynamics and reacting flows, two subjects that always were among my favorite ones. Also, in the part of the thesis related to materials, I would be able be learn more about diffusion and some microscopy techniques of my interest. So, hands to work, I could already code in C++ by that time and started with that to perform my numerical analyses. Soon I was coding in several programming languages and grasped the use of many scientific software, what a delight! The intellectual and social environment was interesting and whenever I got bored with my own matters, I went see some friends in the building and see how I could help them. It was the first time in my life that I felt in a place where you could develop interesting ideas and talk to people who would understand you. But academia can also be harsh, especially when you graduate — the competition among researchers in some cases reach an extremally toxic level, so once I finished, I didn’t even try to get a post-doc and ended up in industry again, but this time in a research center.","category":"page"},{"location":"Articles/Maybe-I-f-ed-my-career/","page":"Maybe I f********** my career...","title":"Maybe I f********** my career...","text":"If there is one thing you learn during a PhD is the sense of generality; not that I needed that, so far you understand that this is my main characteristic — I was just looking for a piece of paper stating that I had accomplished that. It is not difficult for a PhD to identify another without even asking, you notice in the way people speak and the things they are interested at. In my whole life I just met three people who didn’t graduate that behaved that way and I find that amazing — and two of them are a couple, what is even more mind blowing. So, when I started my new job, I was looking to interact with people matching this level of general views. The problem is that industry hurts; some people get greedy over the years; some completely loose interest; but a few stick to their core. Nonetheless, I managed to identify these last group and for a few years I was productive.","category":"page"},{"location":"Articles/Maybe-I-f-ed-my-career/","page":"Maybe I f********** my career...","title":"Maybe I f********** my career...","text":"","category":"page"},{"location":"Articles/Maybe-I-f-ed-my-career/#Back-in-industry","page":"Maybe I f********** my career...","title":"Back in industry","text":"","category":"section"},{"location":"Articles/Maybe-I-f-ed-my-career/","page":"Maybe I f********** my career...","title":"Maybe I f********** my career...","text":"Yes, once again I gained lots of new skills. With the scientific computing background, I built over the years it was easy for me to start in machine learning. Yes, I survived the boom of machine learning in 2018 and conducted many proof-of-concept projects in the field but managed to stay linked to my core engineering skills. I also contributed to vulgarizing the use of some open-source software people were not using yet. Ever since the start of my PhD I lost contact with supply chain and quality related people, but always tried to keep using to a lesser level what I learned there and applied that to my project management. On the technical side, most of my work was in some sort related to skills — but not subjects — I developed during my PhD. This time and only this time it was not my loss of interest in a subject that messed things, but the feeling that some people were working in closed silos and only for self-marketeering themselves. I don’t know how this could be a reality in a private company — you simply get rid of people not willing to play the game, unless you are in France, obviously. The overall environment was technically challenging, and you could have nice discussions and growth with some colleagues, but not everyone was willing to collaborate.","category":"page"},{"location":"Articles/Maybe-I-f-ed-my-career/","page":"Maybe I f********** my career...","title":"Maybe I f********** my career...","text":"After trying a lot to overcome some barriers and break some silos, by a miracle I got a phone call with a job offer elsewhere — my current position. There were quite a few incoherencies in what they proposed me but that was because my field was something new to them, so I was quite sure those points could be fixed; I promptly accepted the offer without much thinking. I packed my stuff and in one month there I was, full of motivation. The team was nice and welcoming and the company much smaller, exactly what I thought I was looking for. The ground was lacking foundations, so I started developing some basic tools to build what in a few years I expected to be a project portfolio. Also, there was the possibility to in about two years have my own team of numerical guys, what was motivating.","category":"page"},{"location":"Articles/Maybe-I-f-ed-my-career/","page":"Maybe I f********** my career...","title":"Maybe I f********** my career...","text":"In practice things weren’t that smooth. First, they didn’t research what was required to get some numerical work done; you need expensive computers. Then comes the fact that you get people specialized in fields of applied mathematics — there is no such 1990s Discovery Channel simulation generalist. If you read attentively so far, you noticed that in my previous job I finally managed to stick to a subject, or at least a small family of related subjects. Now I started to get people asking me if I could run some molecular dynamics in the same simulation of macroscale transport or predict the age of their grandmother: it was driving me nuts. For a while I really thought they would fire me without even knowing why. In a few months things settled down a bit and requests became more consistent with my skills. Some people understood that fluid dynamics applied to materials processing is still a research field and many things that may seem trivial to the layman are quite challenging. Others are still annoying about the limitations of what I can offer today.","category":"page"},{"location":"Articles/Maybe-I-f-ed-my-career/","page":"Maybe I f********** my career...","title":"Maybe I f********** my career...","text":"Since I was the first numerical person in the company I had to fight battles against an incompetent IT with senseless rules; then I confirmed the company was really capital-driven only, and to my disappointment I was feeling mismanaged. During this time things went awry because I started suffering from impostor syndrome — sorry guys, I can’t make DFT calculations coupled to CFD — and entered a bottomless pit of trying to learn everything else again. To add to my disappointment and endless lies that have been told to me, instead of getting a team in the middle term, I will get a new colleague to work with me. All the work towards really understanding my field and its people were thrown to the rubbish by people who are not even close to be qualified to manage me: experience do not mean capacity, a mistake people from past generations often do. I started becoming grumpier and grumpier, face severe lack of concentration, it became impossible to sleep, and intellectual loneliness is really killing me. These people were not ready for me, not the inverse, which is clear now.","category":"page"},{"location":"Articles/Maybe-I-f-ed-my-career/","page":"Maybe I f********** my career...","title":"Maybe I f********** my career...","text":"","category":"page"},{"location":"Articles/Maybe-I-f-ed-my-career/#What's-next?","page":"Maybe I f********** my career...","title":"What's next?","text":"","category":"section"},{"location":"Articles/Maybe-I-f-ed-my-career/","page":"Maybe I f********** my career...","title":"Maybe I f********** my career...","text":"So, what may be the way out of this mess? I have no clue! ","category":"page"},{"location":"Articles/Maybe-I-f-ed-my-career/","page":"Maybe I f********** my career...","title":"Maybe I f********** my career...","text":"My only certainty right now is that I am quitting in the extremely short term; I no longer try to hide my urge of change.","category":"page"},{"location":"Articles/Maybe-I-f-ed-my-career/","page":"Maybe I f********** my career...","title":"Maybe I f********** my career...","text":"The branching of my knowledge made me useless to the standard market and I am still too young to occupy the positions I have developed the skills for because it is not socially acceptable.","category":"page"},{"location":"Articles/Maybe-I-f-ed-my-career/","page":"Maybe I f********** my career...","title":"Maybe I f********** my career...","text":"Current job descriptions require sharp skills, but during the past three years the intellectually poor environment I am at destroyed anything I had left to offer.","category":"page"},{"location":"Articles/Maybe-I-f-ed-my-career/","page":"Maybe I f********** my career...","title":"Maybe I f********** my career...","text":"I am now incapacitated to get back to jobs like my first one where I outperformed because of my social skills were ravaged during the past months.","category":"page"},{"location":"Articles/Maybe-I-f-ed-my-career/","page":"Maybe I f********** my career...","title":"Maybe I f********** my career...","text":"Academia would be a solution but since I didn’t publish enough while in nor chained PhD with a post-doc, it is highly improbable I would get in again.","category":"page"},{"location":"Articles/Maybe-I-f-ed-my-career/","page":"Maybe I f********** my career...","title":"Maybe I f********** my career...","text":"I will become a farmer, or what else?","category":"page"},{"location":"Science/06-Maths-Cheatsheet/#Mathematics","page":"Mathematics","title":"Mathematics","text":"","category":"section"},{"location":"Science/06-Maths-Cheatsheet/","page":"Mathematics","title":"Mathematics","text":"","category":"page"},{"location":"Science/06-Maths-Cheatsheet/#Linear-algebra","page":"Mathematics","title":"Linear algebra","text":"","category":"section"},{"location":"Science/06-Maths-Cheatsheet/","page":"Mathematics","title":"Mathematics","text":"For a full review of linear algebra, please consult Lay2012 [80].","category":"page"},{"location":"Science/06-Maths-Cheatsheet/","page":"Mathematics","title":"Mathematics","text":"A linear system of equations may have (1) no solution, (2) exactly one solution, or (3) infinitely many solutions. Solving and analyzing them is the task of linear algebra.","category":"page"},{"location":"Science/06-Maths-Cheatsheet/#Definitions","page":"Mathematics","title":"Definitions","text":"","category":"section"},{"location":"Science/06-Maths-Cheatsheet/","page":"Mathematics","title":"Mathematics","text":"Echelon form\nPivot position\nSpan subset of mathbbR^n\nMatrix-vector product as a linear combination of columns\n","category":"page"},{"location":"Science/06-Maths-Cheatsheet/#Theorems","page":"Mathematics","title":"Theorems","text":"","category":"section"},{"location":"Science/06-Maths-Cheatsheet/","page":"Mathematics","title":"Mathematics","text":"Uniqueness of the reduced echelon form: each matrix is row equivalent to one and only one reduced echelon matrix.\nExistence and uniqueness: a linear system is consistent if and only if the rightmost column of the augmented matrix is not a pivot column. In this case, the solution set contains either (1) a unique solution (no free variables), or (2) infinitely many solutions (at least one free variable).\nA system Amathbfx=mathbfb has the same solution set as the augmented linear system composed of the columns of A appended by mathrmb. The same is true for the equivalent vector equation, but that is self-evident from the definition of matrix-vector product.","category":"page"},{"location":"Science/06-Maths-Cheatsheet/","page":"Mathematics","title":"Mathematics","text":"","category":"page"},{"location":"Science/06-Maths-Cheatsheet/#Calculus","page":"Mathematics","title":"Calculus","text":"","category":"section"},{"location":"Science/06-Maths-Cheatsheet/","page":"Mathematics","title":"Mathematics","text":"","category":"page"},{"location":"Science/06-Maths-Cheatsheet/#Differential-equations","page":"Mathematics","title":"Differential equations","text":"","category":"section"},{"location":"References/@Launder1974/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Launder1974/","page":"-","title":"-","text":"title: The numerical computation of turbulent flows authors: B. E. Launder, D. B. Spalding year: 1974 –-","category":"page"},{"location":"WallyToolbox/thermochemistry/#Thermochemistry","page":"Thermochemistry","title":"Thermochemistry","text":"","category":"section"},{"location":"WallyToolbox/thermochemistry/","page":"Thermochemistry","title":"Thermochemistry","text":"EditURL = \"https://github.com/wallytutor/WallyToolbox.jl/blob/main/docs/src/WallyToolbox/thermochemistry.md\"\nCurrentModule = WallyToolbox\nDocTestSetup = quote\n using WallyToolbox\nend","category":"page"},{"location":"WallyToolbox/thermochemistry/#Composition-manipulation","page":"Thermochemistry","title":"Composition manipulation","text":"","category":"section"},{"location":"WallyToolbox/thermochemistry/","page":"Thermochemistry","title":"Thermochemistry","text":"The core functionality is provided through the Stoichiometry structure:","category":"page"},{"location":"WallyToolbox/thermochemistry/","page":"Thermochemistry","title":"Thermochemistry","text":"WallyToolbox.Stoichiometry","category":"page"},{"location":"WallyToolbox/thermochemistry/#WallyToolbox.Stoichiometry","page":"Thermochemistry","title":"WallyToolbox.Stoichiometry","text":"Compound stoichiometry for ease of data manipulation.\n\nThis type provide a simple interface for declaring chemical compounds from stable ELEMENTS and computing molecular masses. Its main use is intended for compound creation during parsing of thermodynamic databases. Below we illustrate the creation of compounds and the algebra of creation of derived compounds.\n\njulia> al2o3 = Stoichiometry(Al=2, O=3)\nStoichiometry(Pair{Symbol, <:Number}[:Al => 2, :O => 3])\n\njulia> molecularmass(al2o3)\n0.1019600768\n\njulia> ca1o1 = Stoichiometry(Ca=1, O=1)\nStoichiometry(Pair{Symbol, <:Number}[:Ca => 1, :O => 1])\n\njulia> c1a2 = ca1o1 + 2 * al2o3\nStoichiometry(Pair{Symbol, <:Number}[:Al => 4, :Ca => 1, :O => 7])\n\njulia> molecularmass(c1a2)\n0.25999715360000003\n\nPlease notice that ChemicalCompound creation should be done as early as possible as Stoichiometry has no state other than the number of atoms. Its recurrent use may lead to high computational cost for the evaluation of molecular masses.\n\n\n\n\n\n","category":"type"},{"location":"WallyToolbox/thermochemistry/","page":"Thermochemistry","title":"Thermochemistry","text":"Once the composition of a compound has been set with Stoichiometry, the preferred method of working is through the creation of a ChemicalCompound, as follows:","category":"page"},{"location":"WallyToolbox/thermochemistry/","page":"Thermochemistry","title":"Thermochemistry","text":"WallyToolbox.ChemicalCompound","category":"page"},{"location":"WallyToolbox/thermochemistry/#WallyToolbox.ChemicalCompound","page":"Thermochemistry","title":"WallyToolbox.ChemicalCompound","text":"A chemical compound with internal values pre-computed for recurrent use.\n\njulia> al2o3 = Stoichiometry(Al=2, O=3);\n\njulia> ca1o1 = Stoichiometry(Ca=1, O=1);\n\njulia> CA = ChemicalCompound(ca1o1 + al2o3);\n\njulia> molecularmass(CA)\n0.1580370768\n\n\n\n\n\n","category":"type"},{"location":"WallyToolbox/thermochemistry/","page":"Thermochemistry","title":"Thermochemistry","text":"The following methods and types are available for operation over compositions and elements.","category":"page"},{"location":"WallyToolbox/thermochemistry/","page":"Thermochemistry","title":"Thermochemistry","text":"WallyToolbox.element\nWallyToolbox.atomicmass\nWallyToolbox.molecularmass\nWallyToolbox.ElementData\nWallyToolbox.ElementalQuantity","category":"page"},{"location":"WallyToolbox/thermochemistry/#WallyToolbox.element","page":"Thermochemistry","title":"WallyToolbox.element","text":"Retrieve an element by name. \n\n\n\n\n\n","category":"function"},{"location":"WallyToolbox/thermochemistry/#WallyToolbox.atomicmass","page":"Thermochemistry","title":"WallyToolbox.atomicmass","text":"Atomic mass of element [kg/mol]. \n\n\n\n\n\n","category":"function"},{"location":"WallyToolbox/thermochemistry/#WallyToolbox.molecularmass","page":"Thermochemistry","title":"WallyToolbox.molecularmass","text":"Molecular mass of compound [kg/mol]. \n\n\n\n\n\n","category":"function"},{"location":"WallyToolbox/thermochemistry/#WallyToolbox.ElementData","page":"Thermochemistry","title":"WallyToolbox.ElementData","text":"Represents a chemical element.\n\n\n\n\n\n","category":"type"},{"location":"WallyToolbox/thermochemistry/#WallyToolbox.ElementalQuantity","page":"Thermochemistry","title":"WallyToolbox.ElementalQuantity","text":"Represents a pair of element symbol and associated amount.\n\n\n\n\n\n","category":"type"},{"location":"WallyToolbox/thermochemistry/#Thermodynamic-properties","page":"Thermochemistry","title":"Thermodynamic properties","text":"","category":"section"},{"location":"WallyToolbox/thermochemistry/","page":"Thermochemistry","title":"Thermochemistry","text":"Materials properties are often reported according to the formalism of MaierKelley1932 [1] or Shomate1954 [2]. To be able to handle data under these formats, the following structures are provided.","category":"page"},{"location":"WallyToolbox/thermochemistry/","page":"Thermochemistry","title":"Thermochemistry","text":"WallyToolbox.MaierKelleyThermo\nWallyToolbox.ShomateThermo","category":"page"},{"location":"WallyToolbox/thermochemistry/#WallyToolbox.MaierKelleyThermo","page":"Thermochemistry","title":"WallyToolbox.MaierKelleyThermo","text":"Thermodynamic properties represeted in Maier-Kelley formalism.\n\n\n\n\n\n","category":"type"},{"location":"WallyToolbox/thermochemistry/#WallyToolbox.ShomateThermo","page":"Thermochemistry","title":"WallyToolbox.ShomateThermo","text":"Thermodynamic properties represeted in Shomate formalism.\n\n\n\n\n\n","category":"type"},{"location":"WallyToolbox/thermochemistry/#Empirical-fuels","page":"Thermochemistry","title":"Empirical fuels","text":"","category":"section"},{"location":"WallyToolbox/thermochemistry/","page":"Thermochemistry","title":"Thermochemistry","text":"In industrial practice of CFD one is often confronted with simulating empirical fuels. This is how one generally calls a fuel provided in elemental mass fractions of elements and is the most common reporting format for heavy-fuel oil. Using EmpiricalFuel one can quickly perform conversions and find out the required air flow rate for setting up a process simulation or furnace operation.","category":"page"},{"location":"WallyToolbox/thermochemistry/","page":"Thermochemistry","title":"Thermochemistry","text":"WallyToolbox.EmpiricalFuel","category":"page"},{"location":"WallyToolbox/thermochemistry/#WallyToolbox.EmpiricalFuel","page":"Thermochemistry","title":"WallyToolbox.EmpiricalFuel","text":"Provides description of an empirical fuel based on elemental mass fractions.\n\nFields\n\nelements::Vector{Symbol}: Chemical elements reported in fuel.\nY::Vector{Float64}: Array of provided masses per kilogram of fuel.\nX::Vector{Float64}: Array of computed moles per kilogram of fuel.\n\nExamples\n\nBelow we illustrate how to create a fuel with the approximate mass fractions of carbon and hydrogen in naphtalene; next we check its string representation.\n\njulia> fuel = EmpiricalFuel([0.937, 0.063, 0.0]; scaler=:C=>10.0);\n\njulia> fuel.X\n3-element Vector{Float64}:\n 10.0\n 8.011606189967983\n 0.0\n\njulia> String(fuel)\n\"C(10.0000)H(8.0116)O(0.0000)\"\n\n\n\n\n\n","category":"type"},{"location":"WallyToolbox/thermochemistry/","page":"Thermochemistry","title":"Thermochemistry","text":"A simple empirical fuel complete combustion can be represented by the following chemical equation:","category":"page"},{"location":"WallyToolbox/thermochemistry/","page":"Thermochemistry","title":"Thermochemistry","text":"1mathrmC_xmathrmH_ymathrmO_z + amathrmO_2 + bmathrmN_2 rightarrow \nxmathrmCO_2 + dfracy2mathrmH_2mathrmO + bmathrmN_2","category":"page"},{"location":"WallyToolbox/thermochemistry/","page":"Thermochemistry","title":"Thermochemistry","text":"Because for HFO representation will generally provide sulfur and nitrogen, the oxidation of these elements may be included in the balance and the previous reaction can be modified to:","category":"page"},{"location":"WallyToolbox/thermochemistry/","page":"Thermochemistry","title":"Thermochemistry","text":"1mathrmC_xmathrmH_ymathrmO_zmathrmN_nmathrmS_s \n+ amathrmO_2 \n+ bmathrmN_2\n\nrightarrow\n\nxmathrmCO_2 \n+ smathrmSO_2\n+ nmathrmNO\n+ dfracy2mathrmH_2mathrmO\n+ bmathrmN_2","category":"page"},{"location":"WallyToolbox/thermochemistry/","page":"Thermochemistry","title":"Thermochemistry","text":"Each element in carbon, hydrogen, sulfur, and nitrogen is present in a single oxide (here we assume mathrmN_2 does not participate in oxidation, what would require equilibrium calculations with an enthalpy of formation of the empirical fuel that is generally unavailable - otherwise we would use the actual molecular representation of the substance), and balancing the right-hand side of the equation is trivial; one can derive the value of a that remains compatible with oxygen content in fuel as:","category":"page"},{"location":"WallyToolbox/thermochemistry/","page":"Thermochemistry","title":"Thermochemistry","text":"a = dfrac12left(2x+2s+n+dfracy2-zright)","category":"page"},{"location":"WallyToolbox/thermochemistry/","page":"Thermochemistry","title":"Thermochemistry","text":"With this value it is trivial to find out the required mass flow rate of oxidizer. This is implemented in oxidizer_mass_flow_rate as documented below. Notice that this function will fail if one of the required elements in the above equation is missing. The presence of nitrogen oxides and sulfur is fuel is neglected in this calculations and one must assess whether they should be considered in a certain analysis prior to using this function.","category":"page"},{"location":"WallyToolbox/thermochemistry/","page":"Thermochemistry","title":"Thermochemistry","text":"WallyToolbox.oxidizer_mass_flow_rate","category":"page"},{"location":"WallyToolbox/thermochemistry/#WallyToolbox.oxidizer_mass_flow_rate","page":"Thermochemistry","title":"WallyToolbox.oxidizer_mass_flow_rate","text":"oxidizer_mass_flow_rate(f::EmpiricalFuel; y_o2 = 0.23)\n\nComputes the required amount of oxidizer to perform complete combustion of 1 kg provided empirical fuel. The value of y_o2 represents the mass fraction of oxygen in oxidizer; default value is typical for air.\n\njulia> fuel = EmpiricalFuel([0.937, 0.063, 0.0]; scaler=:C=>10);\n\njulia> oxidizer_mass_flow_rate(fuel)\n13.02691759229764\n\n\n\n\n\n","category":"function"},{"location":"WallyToolbox/thermochemistry/#Heavy-fuel-oils","page":"Thermochemistry","title":"Heavy fuel-oils","text":"","category":"section"},{"location":"WallyToolbox/thermochemistry/","page":"Thermochemistry","title":"Thermochemistry","text":"Combustion of heavy-fuel oils (HFO) is discussed in detail by Lawn1987 [3]. Some relations that might be useful for the industrial combustion specialist are under implementation here to be integrated in larger models e.g. using DryFlowsheet, or simple calculations.","category":"page"},{"location":"WallyToolbox/thermochemistry/","page":"Thermochemistry","title":"Thermochemistry","text":"WallyToolbox.hfo_empirical_formula\nWallyToolbox.hfo_specific_heat\nWallyToolbox.hfo_enthalpy_net_bs2869","category":"page"},{"location":"WallyToolbox/thermochemistry/#WallyToolbox.hfo_empirical_formula","page":"Thermochemistry","title":"WallyToolbox.hfo_empirical_formula","text":"hfo_empirical_formula(Y; scaler = nothing)\n\nWrapper for EmpiricalFuel ensuring all HFO instances are created with all typical elements, say C, H, O, N, and S, provided in this same order.\n\n\n\n\n\n","category":"function"},{"location":"WallyToolbox/thermochemistry/#WallyToolbox.hfo_specific_heat","page":"Thermochemistry","title":"WallyToolbox.hfo_specific_heat","text":"hfo_specific_heat(T::Float64, S::Float64)::Float64\n\nHeavy fuel-oil specific heat estimation in terms of relative density S as provided by Cragoe (1929). Temperature in kelvin.\n\n\n\n\n\n","category":"function"},{"location":"WallyToolbox/thermochemistry/#WallyToolbox.hfo_enthalpy_net_bs2869","page":"Thermochemistry","title":"WallyToolbox.hfo_enthalpy_net_bs2869","text":"hfo_enthalpy_net_bs2869(;\n ρ::Float64,\n x::Float64,\n y::Float64,\n s::Float64\n)::Float64\n\nHeavy fuel-oil net energy capacity accordinto to BS2869:1983. Value is computed in [MJ/kg]. Parameters are given as:\n\nρ: HFO density at 15 °C, [kg/m³].\nwater: Mass percentage of water, [%].\nash: Mass percentage of ashes, [%].\nsulphur: Mass percentage of sulphur, [%].\n\njulia> hfo_enthalpy_net_bs2869(; ρ = 1020.0, water = 0.1, ash = 0.05, sulphur = 1.0)\n40.13509836320001\n\n\n\n\n\n","category":"function"},{"location":"WallyToolbox/thermochemistry/#Discrete-phase-model","page":"Thermochemistry","title":"Discrete phase model","text":"","category":"section"},{"location":"WallyToolbox/thermochemistry/","page":"Thermochemistry","title":"Thermochemistry","text":"WallyToolbox.fit_rosinrammler\nWallyToolbox.plot_rosinrammler","category":"page"},{"location":"WallyToolbox/thermochemistry/#WallyToolbox.fit_rosinrammler","page":"Thermochemistry","title":"WallyToolbox.fit_rosinrammler","text":"fit_rosinrammler(d₀, P₀; m=3.5)\n\nFind parameter for particle size distribution with Weibull distribution, often called after Rosin-Rammler in the field of particles - based on characteristic size and associated cumulative density function (CDF) value. Parameter d₀ is the droplet size at which Weibull CDF evaluates to probability P₀. The value of m is generally recommended for a certain technology; a common value is provided by default.\n\n\n\n\n\n","category":"function"},{"location":"WallyToolbox/thermochemistry/#WallyToolbox.plot_rosinrammler","page":"Thermochemistry","title":"WallyToolbox.plot_rosinrammler","text":"Display Rosin-Rammler distribution and optionally reference data.\n\n\n\n\n\n","category":"function"},{"location":"Computing/03-Programming-Languages/#Programming","page":"Programming","title":"Programming","text":"","category":"section"},{"location":"Computing/03-Programming-Languages/","page":"Programming","title":"Programming","text":"Those new to programming can find a quite interesting environment at Exercism.","category":"page"},{"location":"Computing/03-Programming-Languages/#C","page":"Programming","title":"C++","text":"","category":"section"},{"location":"Computing/03-Programming-Languages/#Cuda","page":"Programming","title":"Cuda","text":"","category":"section"},{"location":"Computing/03-Programming-Languages/","page":"Programming","title":"Programming","text":"GPU-optimized AI, Machine Learning, & HPC Software | NVIDIA NGC","category":"page"},{"location":"Computing/03-Programming-Languages/#Fortran","page":"Programming","title":"Fortran","text":"","category":"section"},{"location":"Computing/03-Programming-Languages/#Haskell","page":"Programming","title":"Haskell","text":"","category":"section"},{"location":"Computing/03-Programming-Languages/","page":"Programming","title":"Programming","text":"GHCup\nHaskell for Numerics?\nCourse by Dmitrii Kovanikov","category":"page"},{"location":"Computing/03-Programming-Languages/#Lisp","page":"Programming","title":"Lisp","text":"","category":"section"},{"location":"Computing/03-Programming-Languages/#Octave","page":"Programming","title":"Octave","text":"","category":"section"},{"location":"Computing/03-Programming-Languages/#OpenCL","page":"Programming","title":"OpenCL","text":"","category":"section"},{"location":"Computing/03-Programming-Languages/#Pascal","page":"Programming","title":"Pascal","text":"","category":"section"},{"location":"Computing/03-Programming-Languages/","page":"Programming","title":"Programming","text":"Free Pascal Docs\nFree Pascal Wiki\nPascal Wikibook","category":"page"},{"location":"Computing/03-Programming-Languages/#Python","page":"Programming","title":"Python","text":"","category":"section"},{"location":"Computing/03-Programming-Languages/","page":"Programming","title":"Programming","text":"General stuff:","category":"page"},{"location":"Computing/03-Programming-Languages/","page":"Programming","title":"Programming","text":"8 surprising ways how to use Jupyter Notebook","category":"page"},{"location":"Computing/03-Programming-Languages/","page":"Programming","title":"Programming","text":"Some (yet crude) visual programming in Python:","category":"page"},{"location":"Computing/03-Programming-Languages/","page":"Programming","title":"Programming","text":"Barfi\nnodezator","category":"page"},{"location":"Computing/03-Programming-Languages/","page":"Programming","title":"Programming","text":"All you need is a package:","category":"page"},{"location":"Computing/03-Programming-Languages/","page":"Programming","title":"Programming","text":"casadi: Optimal control and MPC.\nmip: Mixed-integer linear programming.","category":"page"},{"location":"Computing/03-Programming-Languages/#Rust","page":"Programming","title":"Rust","text":"","category":"section"},{"location":"Computing/03-Programming-Languages/","page":"Programming","title":"Programming","text":"Rust community often organizes books on the main topics regarding the language:","category":"page"},{"location":"Computing/03-Programming-Languages/","page":"Programming","title":"Programming","text":"Rust Book\nThe Cargo Book\nThe rustup book\nRust Cookbook","category":"page"},{"location":"Computing/03-Programming-Languages/","page":"Programming","title":"Programming","text":"Some resources for learning Rust (start with rustlings):","category":"page"},{"location":"Computing/03-Programming-Languages/","page":"Programming","title":"Programming","text":"rustlings\nRust By Example\nRust Playground","category":"page"},{"location":"Computing/03-Programming-Languages/","page":"Programming","title":"Programming","text":"Useful links for working with cargo:","category":"page"},{"location":"Computing/03-Programming-Languages/","page":"Programming","title":"Programming","text":"Bundle Cargo\nThe Manifest Format","category":"page"},{"location":"Computing/03-Programming-Languages/","page":"Programming","title":"Programming","text":"Useful links for doing numerical stuff in Rust:","category":"page"},{"location":"Computing/03-Programming-Languages/","page":"Programming","title":"Programming","text":"Vec in std::vec - Rust\nplotters","category":"page"},{"location":"Computing/03-Programming-Languages/#Scilab","page":"Programming","title":"Scilab","text":"","category":"section"},{"location":"Computing/03-Programming-Languages/#Other-materials","page":"Programming","title":"Other materials","text":"","category":"section"},{"location":"Computing/03-Programming-Languages/","page":"Programming","title":"Programming","text":"Why Futhark?","category":"page"},{"location":"References/@Ranz1952/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Ranz1952/","page":"-","title":"-","text":"title: Evaporation from drops authors: W. Ranz, W. Marshall year: 1952 –-","category":"page"},{"location":"References/@Garaniya2012b/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Garaniya2012b/","page":"-","title":"-","text":"title: Heavy fuel oil combustion modelling using continuous thermodynamics authors: Vikram Garaniya, Laurie Goldsworthy year: 2012 DOI: https://doi.org/10.5988/jime.47.871 Drive: https://1drv.ms/b/s!Ar4x-UlrYAiZlbEigrD3idko7FKcyQ?e=lNld2R –-","category":"page"},{"location":"References/@Wang2023a/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Wang2023a/","page":"-","title":"-","text":"title: \"Auto-PINN: Understanding and optimizing physics-informed neural architecture\" authors: Yicheng Wang, Xiaotian Han, Chia-Yuan Chang, Daochen Zha, Ulisses Braga-Neto, Xia Hu year: 2023 URL: https://doi.org/10.48550/arXiv.2205.13748 Drive: https://1drv.ms/b/s!Ar4x-UlrYAiZla8gKwrbEVbpOVfBQg?e=5kcaTy –-","category":"page"},{"location":"References/@Yu2022a/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Yu2022a/","page":"-","title":"-","text":"title: Gradient-enhanced physics-informed neural networks for forward and inverse PDE problems authors: Jeremy Yu, Lu Lu, Xuhui Meng, George Em Karniadakis year: 2022 URL: https://doi.org/10.48550/arXiv.2111.02801 Drive: https://1drv.ms/b/s!Ar4x-UlrYAiZla8fqTeJApcwO8Ng?e=lpsaxB –-","category":"page"},{"location":"Science/08-Conductivity-Porous-Solids/#Thermal-conductivity-of-porous-solids","page":"Porous Solids","title":"Thermal conductivity of porous solids","text":"","category":"section"},{"location":"Science/08-Conductivity-Porous-Solids/","page":"Porous Solids","title":"Porous Solids","text":"Porous solids are characterized by the presence of voidance; they may be formed, for instance, through the sintering of particles with a given size distribution or through a foaming process. The former will lead to pores presenting a mostly convex geometry due to particle-particle contacts of while the latter leads to concave pores, generally due to former gas bubbles during foaming process; these morphologies and the scale of porosity will lead to a broad range of properties in macroscopic behavior of materials. Other features related to the porosity might include the communicating character of pores or the validity of continuum mechanics in a given problem due to pore sizes. This subject has been treated by scholars of many fields because of its relevance to industrial processes, heat transfer in furnaces, biological systems, and more recently in heat storage and recovery devices, not to try to be exhaustive here; specific citations come next.","category":"page"},{"location":"Science/08-Conductivity-Porous-Solids/","page":"Porous Solids","title":"Porous Solids","text":"In what follows we will briefly review some of the afore mentioned applications and historical developments in the field before tackling the problem of modeling heat transfer in arbitrary materials. The goal of our literature review is to determine the limits of applicability and how well accepted are the available methods proposed in the past, but also to identify potential use cases of computational methods in materials design before proposing our own scenarios. The study will comprise situations allowing for analytical solution for solver validation, reproduction of previous published results, and the modeling of arbitrary solids. Unless stated otherwise, numerical studies in two and three dimensions are carried out with Elmer Malinen2013a [58] finite element method (FEM) solver. Additional simulations with pore filling with inclusions are also included in the study, providing a basis for composite materials. A database of predicted materials properties is composed for future studies.","category":"page"},{"location":"Science/08-Conductivity-Porous-Solids/#Literature-survey","page":"Porous Solids","title":"Literature survey","text":"","category":"section"},{"location":"Science/08-Conductivity-Porous-Solids/","page":"Porous Solids","title":"Porous Solids","text":"Masamune1963a [59]: studied the role of gas pressure below and up to atmospheric pressure over the effective thermal conductivity k_e of a bed of spherical particles by carrying out measurements at 42 °C; mechanisms of heat transfer can be classified as transport through (1) conduction and radiation in voids, (2) effective solid-path and gas-path lengths, and (3) solid conduction through contacts. Although the authors acknowledge the role of radiation in heat transfer, it is not included in their expression, but low Knudsen number effects were considered for thermal conductivity when necessary by considering a pressure dependence in gas thermal conductivity k_g^star.\nLuikov1968a [60]:\nKoh1971a [61]:\nKoh1973a [62]:\nFiedler2006a [63]:\nFiedler2007a [64]:\nFiedler2009a [65]:\nSmith2013a [66]:\nCheilytko2016a [67]:\nPia2016a [68]:\nQiu2018a [69]:\nChikhi2020a [70]:\nMraz2021a [71]:","category":"page"},{"location":"Science/08-Conductivity-Porous-Solids/#Experimental-design","page":"Porous Solids","title":"Experimental design","text":"","category":"section"},{"location":"Science/08-Conductivity-Porous-Solids/","page":"Porous Solids","title":"Porous Solids","text":"No. Case Status Goal\n1 Analytical solution of dense, k=k_ref \n2 Analytical solution of dense, k=k_ref-bT \n3 Simulation of dense, k=k_ref \n4 Simulation of dense, k=k_ref-bT \n5 ","category":"page"},{"location":"Science/08-Conductivity-Porous-Solids/#Summary-of-results","page":"Porous Solids","title":"Summary of results","text":"","category":"section"},{"location":"References/@Hristov2023/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Hristov2023/","page":"-","title":"-","text":"title: \"Transient heat conduction with variable thermophysical properties power-law temperature-depenent heat capacity and thermal conductivity\" authors: Jordan Hristov year: 2023 –-","category":"page"},{"location":"References/@Hristov2023/","page":"-","title":"-","text":"Take care, paper content is poor and full of typos!\nDerivation for semi-infinite media\nTemperature dependent heat capacity\nCan we really say h=rhoc_pT in all cases?\nArgument about lack of exponents in literature is poor. In fact data is fitted to polynomials mainly because simple exponentials as proposed by the author would not properly represent experimental data in most cases (and certainly not fit Calphad requirements)!","category":"page"},{"location":"References/@Hanein2017/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Hanein2017/","page":"-","title":"-","text":"title: \"One-dimensional steady-state thermal model for rotary kilns used in the manufacture of cement\" authors: Theodore Hanein, Frederik P. Glasser, Marcus N. Bannerman year: 2017 –-","category":"page"},{"location":"Computing/01-Scientific-Computing/#Scientific-Computing","page":"Scientific Computing","title":"Scientific Computing","text":"","category":"section"},{"location":"Computing/01-Scientific-Computing/","page":"Scientific Computing","title":"Scientific Computing","text":"Notes related to my learning and teaching interests in several fields related to scientific computing (mostly applied mathematics and machine learning) and related applications. This home page is the entry point and those interested in more content and interesting links can use the sidebar with an index to the materials.","category":"page"},{"location":"Computing/01-Scientific-Computing/","page":"Scientific Computing","title":"Scientific Computing","text":"It can also be used as a general guide for introducing scientific computing as it tries to introduce the minimal skill set any scientific computing engineer or scientist should have:","category":"page"},{"location":"Computing/01-Scientific-Computing/","page":"Scientific Computing","title":"Scientific Computing","text":"Version control comes first, everything else is worthless without it, currently that means Git.\nNext comes software documentation with Doxygen, Sphinx, and/or Documenter.jl.\nA low(er) level programming language among C, C++, and Fortran, preferably all of them.\nScripting languages, as of 2024, Python is mandatory, Julia highly recommended.\nBasic machine learning in one of the above scripts, everything is ML these days.\nShell automation, basis of both Bash/other UNIX shell and PowerShell are required.\nTypesetting equations reports and presentations (beamer) in LaTeX.\nDomain specific skills related to the field of study (CFD, DFT, MD, ML, ...).","category":"page"},{"location":"Computing/01-Scientific-Computing/","page":"Scientific Computing","title":"Scientific Computing","text":"Some technologies have been mainstream or important in the past, but nowadays some of them have already died or are becoming too niche to be put in such a list. That is the case of SVN for version control. As for programming languages in science, that is the case of matlabish (MATLAB, Octave, Scilab) environments, which are still used by controls and automation people, but are mostly incompatible with good software practices and should be discouraged.","category":"page"},{"location":"Computing/01-Scientific-Computing/","page":"Scientific Computing","title":"Scientific Computing","text":"It is also worth getting familiar with high-performance computing (HPC); in the Top 500 page you can get to know the most powerful computers on Earth. The specification benchmarking page allows for the check of hardware specification, what is interesting when preparing investment in a computing structure. Lastly, when working in multi-user systems it is worth knowing about job management systems such as Slurm.","category":"page"},{"location":"Computing/01-Scientific-Computing/","page":"Scientific Computing","title":"Scientific Computing","text":"As a last word, I would like to remember that it is humanly impossible to master everything at once; even after more than 10 years in the field as of today I only have a grasp in the tools I do not use everyday. Software and methods evolve, and unless you keep using a specific tool you simply cannot afford to keep up to date with it. That should not be a roadblock for a scientist in the long term. As you get used to scientific software, getting back to a good level of some tool you used in the past is quick (but not extremely fast in some cases) and learning new tools for which you already know the science behind is trivial. Even exploring new fields become easy in some cases.","category":"page"},{"location":"Notes/read/","page":"-","title":"-","text":"[[@Shirzad2023]]\n[[@Nakayama2023]]\nMojo\nScientific Computing in Rust 2024\ncrates.io\nRustPython\nJulia To Rust\njlrs","category":"page"},{"location":"Notes/read/","page":"-","title":"-","text":"[ ] Model Predictive Control (MPC) with JuliaSim and ModelingToolkit | 2022 DigiWell Julia Seminar\n[ ] Introduction to Probability\n[ ] VIM sheet\n[ ] Matrix Methods for Signal Processing, Data Analysis and Machine Learning, F24, Prof. Jeff Fessler\n[ ] Precompilation tutorial","category":"page"},{"location":"References/@Wurth2023a/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Wurth2023a/","page":"-","title":"-","text":"title: Physics-informed neural networks for data-free surrogate modelling and engineering optimization – An example from composite manufacturing authors: Tobias Würth, Constantin Krauß, Clemens Zimmerling, Luise Kärger year: 2023 URL: https://doi.org/10.5445/IR/1000159290 Drive: https://1drv.ms/b/s!Ar4x-UlrYAiZla5XEQtEiYnlp5ggtA?e=6TW8va –-","category":"page"},{"location":"References/@Wurth2023a/","page":"-","title":"-","text":"PINNs are alternative to SBO methods\nReference 6: one NN per output\nUsed same weight for all losses (domain, B.C., I.C.)\nNNs provide automatic jacobian and hessian evaluations, what can be used for great benefit of optimization algorithms\nImplemented in SciANN [[@Haghighat2021sciann]] wrapper to [[@Tensorflow2015Whitepaper]]\nSolves the diffusion equation\nKamal-Malkin model can be seem as a more general parametrization as JMKA rightarrow maybe useful in cement hydration modeling?\nInteresting to write a tutorial about!","category":"page"},{"location":"WallyToolbox/constants/#Constants","page":"Constants","title":"Constants","text":"","category":"section"},{"location":"WallyToolbox/constants/","page":"Constants","title":"Constants","text":"EditURL = \"https://github.com/wallytutor/WallyToolbox.jl/blob/main/docs/src/WallyToolbox/constants.md\"\nCurrentModule = WallyToolbox\nDocTestSetup = quote\n using WallyToolbox\nend","category":"page"},{"location":"WallyToolbox/constants/#Physical-constants","page":"Constants","title":"Physical constants","text":"","category":"section"},{"location":"WallyToolbox/constants/","page":"Constants","title":"Constants","text":"WallyToolbox.GAS_CONSTANT\nWallyToolbox.STEFAN_BOLTZMANN","category":"page"},{"location":"WallyToolbox/constants/#WallyToolbox.GAS_CONSTANT","page":"Constants","title":"WallyToolbox.GAS_CONSTANT","text":"Ideal gas constant [8.31446261815324 [J/(mol.K)].\n\n\n\n\n\n","category":"constant"},{"location":"WallyToolbox/constants/#WallyToolbox.STEFAN_BOLTZMANN","page":"Constants","title":"WallyToolbox.STEFAN_BOLTZMANN","text":"Stefan-Boltzmann constant [5.670374419e-8 W/(m².K⁴)].\n\n\n\n\n\n","category":"constant"},{"location":"WallyToolbox/constants/#Reference-states","page":"Constants","title":"Reference states","text":"","category":"section"},{"location":"WallyToolbox/constants/","page":"Constants","title":"Constants","text":"WallyToolbox.T_REF\nWallyToolbox.P_REF\nWallyToolbox.C_REF","category":"page"},{"location":"WallyToolbox/constants/#WallyToolbox.T_REF","page":"Constants","title":"WallyToolbox.T_REF","text":"Normal atmospheric temperature [273.15 K].\n\n\n\n\n\n","category":"constant"},{"location":"WallyToolbox/constants/#WallyToolbox.P_REF","page":"Constants","title":"WallyToolbox.P_REF","text":"Reference atmospheric pressure [101325.0 Pa].\n\n\n\n\n\n","category":"constant"},{"location":"WallyToolbox/constants/#WallyToolbox.C_REF","page":"Constants","title":"WallyToolbox.C_REF","text":"Normal state concentration [44.61503340547032 mol/m³]. \n\n\n\n\n\n","category":"constant"},{"location":"WallyToolbox/constants/#Unit-conversion","page":"Constants","title":"Unit conversion","text":"","category":"section"},{"location":"WallyToolbox/constants/","page":"Constants","title":"Constants","text":"WallyToolbox.ZERO_CELSIUS\nWallyToolbox.ONE_ATM\nWallyToolbox.JOULE_PER_CALORIE","category":"page"},{"location":"WallyToolbox/constants/#WallyToolbox.ZERO_CELSIUS","page":"Constants","title":"WallyToolbox.ZERO_CELSIUS","text":"Zero degrees Celsius in Kelvin [273.15 K].\n\n\n\n\n\n","category":"constant"},{"location":"WallyToolbox/constants/#WallyToolbox.ONE_ATM","page":"Constants","title":"WallyToolbox.ONE_ATM","text":"Atmospheric pressure at sea level [101325.0 Pa].\n\n\n\n\n\n","category":"constant"},{"location":"WallyToolbox/constants/#WallyToolbox.JOULE_PER_CALORIE","page":"Constants","title":"WallyToolbox.JOULE_PER_CALORIE","text":"Conversion factor from calories to joules [4.184 J/cal].\n\n\n\n\n\n","category":"constant"},{"location":"WallyToolbox/constants/#Chemistry-related","page":"Constants","title":"Chemistry-related","text":"","category":"section"},{"location":"WallyToolbox/constants/","page":"Constants","title":"Constants","text":"WallyToolbox.M_AIR\nWallyToolbox.ELEMENTS","category":"page"},{"location":"WallyToolbox/constants/#WallyToolbox.M_AIR","page":"Constants","title":"WallyToolbox.M_AIR","text":"Air mean molecular mass [0.0289647 kg/mol].\n\n\n\n\n\n","category":"constant"},{"location":"WallyToolbox/constants/#WallyToolbox.ELEMENTS","page":"Constants","title":"WallyToolbox.ELEMENTS","text":"Periodic table of stable chemical elements. \n\n\n\n\n\n","category":"constant"},{"location":"References/#References","page":"References","title":"References","text":"","category":"section"},{"location":"References/","page":"References","title":"References","text":"This page contains the literature and external references cited along the toolbox documentation or supporting materials. For a full bibtex file for citing them, please check this database file.","category":"page"},{"location":"References/","page":"References","title":"References","text":"C. G. Maier and K. K. Kelley. An equation for the representation of high-temperature heat content data. Journal of the American Chemical Society 54, 3243–3246 (1932).\n\n\n\nC. H. Shomate. A method for evaluating and correlating thermodynamic data. The Journal of Physical Chemistry 58, 368–372 (1954).\n\n\n\nC. J. Lawn. Principles of combustion engineering for boilers. Combustion treatise (Academic Press, 1987). Includes bibliography and index.\n\n\n\nR. B. Bird, W. E. Stewart and E. N. Lightfoot. Transport phenomena. 2nd Edition (John Wiley and Sons, 2001).\n\n\n\nC. Balaji. Essentials of radiation heat transfer (Wiley, Chichester, 2014).\n\n\n\nA. A. Amsden, P. J. O'Rourke and T. D. Butler. KIVA-II: A computer program for chemically reactive flows with sprays (Los Alamos National Laboratory, May 1989).\n\n\n\nT. Hanein, F. P. Glasser and M. N. Bannerman. One-dimensional steady-state thermal model for rotary kilns used in the manufacture of cement. Advances in Applied Ceramics 116, 207–215 (2017).\n\n\n\nK. S. Mujumdar and V. V. Ranade. Simulation of rotary cement kilns using a one-dimensional model. Chemical Engineering Research and Design 84, 165–177 (2006).\n\n\n\nD. J. Gunn. Transfer of heat or mass to particles in fixed and fluidised beds. International Journal of Heat and Mass Transfer 21, 467–476 (1978).\n\n\n\nH. Kramers and P. Croockewit. The passage of granular solids through inclined rotary kilns. Chemical Engineering Science 1, 259–265 (1952).\n\n\n\nW. L. Grosshandler. Radcal – a narrow-band model for radiation calculations in a combustion environment (National Institute of Standards and Technology, 1993).\n\n\n\nJ. P. Gorog, J. K. Brimacombe and T. N. Adams. Radiative heat transfer in rotary kilns. Metallurgical Transactions B 12, 55–70 (1981).\n\n\n\nW. C. Tam and W. W. Yuen. OpenSC: an open-source calculation tool for combustion mixture emissivity/absorptivity (National Institute of Standards and Technology, 2019).\n\n\n\nA. B. Liu, D. Mather and R. D. Reitz. Modeling the Effects of Drop Drag and Breakup on Fuel Sprays. In: SAE Technical Paper Series, ANNUAL (SAE International, Mar 1993).\n\n\n\nR. D. Reitz and R. Diwakar. Structure of high-pressure fuel sprays. In: SAE Technical Paper Series, ANNUAL (SAE International, Feb 1987).\n\n\n\nW. Ranz and W. Marshall. Evaporation from drops. Chemical Engineering Progress 48, 141–146 (1952).\n\n\n\nA. Aissa, M. Abdelouahab, A. Noureddine, M. Elganaoui and B. Pateyron. Ranz and Marshall correlations limits on heat flow between a sphere and its surrounding gas at high temperature. Thermal Science 19, 1521–1528 (2015).\n\n\n\nB. Zuo, A. M. Gomes and C. J. Rutland. Modelling superheated fuel sprays and vaproization. International Journal of Engine Research 1, 321–336 (2000).\n\n\n\nB. Peña and C. Pérez-García. Stability of Turing patterns in the Brusselator model. Physical Review E 64, 056213 (2001).\n\n\n\nW. Sweldens. The Lifting Scheme: A Construction of Second Generation Wavelets. SIAM Journal on Mathematical Analysis 29, 511–546 (1998).\n\n\n\nJ. Jeong and F. Hussain. On the identification of a vortex. Journal of Fluid Mechanics 285, 69–94 (1995).\n\n\n\nT. Schneider and E. Stoll. Molecular-dynamics study of a three-dimensional one-component model for distortive phase transitions. Physical Review B 17, 1302–1322 (1978).\n\n\n\nG. Joos. Theoretical physics. Third Edition (Dover Publications, New York, 1986).\n\n\n\nS. V. Patankar. Numerical heat transfer and fluid flow (Taylor & Francis, 1980); p. 197.\n\n\n\nJ. Crank and P. Nicolson. A practical method for Numerical evaluation of solutions of partial differential equations of the heat-conduction type. Advances in Computational Mathematics 6, 207–226 (1996), reprinted from Proc. Camb. Phil. Soc. 43 (1947) 50-67.\n\n\n\nJ. Hristov. Transient heat conduction with variable thermophysical properties power-law temperature-depenent heat capacity and thermal conductivity. Thermal Science 27, 411–422 (2023).\n\n\n\nK. Shirzad and C. Viney. A critical review on applications of the Avrami equation beyond materials science. Journal of The Royal Society Interface 20 (2023).\n\n\n\nE. J. Mittemeijer, L. Cheng, P. J. van der Schaaf, C. M. Brakman and B. M. Korevaar. Analysis of nonisothermal transformation kinetics; tempering of iron-carbon and iron-nitrogen martensites. Metallurgical Transactions A 19, 925–932 (1988).\n\n\n\nH. Mehrer. Diffusion in Solids : Fundamentals, Methods, Materials, Diffusion-Controlled \tProcesses. Vol. 155 of Springer Series in Solid-State Sciences (Springer Berlin Heidelberg, 2007).\n\n\n\nL. Onsager. Reciprocal relations in irreversible processes. I. Physical Review 37, 405–426 (1931).\n\n\n\nL. Onsager. Reciprocal relations in irreversible processes. II. Physical Review 38, 2265–2279 (1931).\n\n\n\nM. Raissi, P. Perdikaris and G. E. Karniadakis. Physics Informed Deep Learning (Part I): Data-driven Solutions of Nonlinear Partial Differential Equations, arXiv (2017).\n\n\n\nS. Guo. Physics-Informed Neural Networks: An Application-Centric Guide. Online (Feb 2024).\n\n\n\nS. Guo. Unraveling the Design Pattern of Physics-Informed Neural Networks: Series 01. Online (May 2023).\n\n\n\nC. Wu, M. Zhu, Q. Tan, Y. Kartha and L. Lu. A comprehensive study of non-adaptive and residual-based adaptive sampling for physics-informed neural networks. Computer Methods in Applied Mechanics and Engineering 403, 115671 (2023).\n\n\n\nS. Guo. Unraveling the Design Pattern of Physics-Informed Neural Networks: Series 02. Online (May 2023).\n\n\n\nK. Haitsiukevich and A. Ilin. Improved Training of Physics-Informed Neural Networks with Model Ensembles, arXiv (2022).\n\n\n\nS. Guo. Unraveling the Design Pattern of Physics-Informed Neural Networks: Series 03. Online (May 2023).\n\n\n\nZ. Fang, S. Wang and P. Perdikaris. Ensemble learning for Physics Informed Neural Networks: a Gradient Boosting approach, arXiv (2023).\n\n\n\nS. Guo. Unraveling the Design Pattern of Physics-Informed Neural Networks: Series 04. Online (May 2023).\n\n\n\nJ. Yu, L. Lu, X. Meng and G. E. Karniadakis. Gradient-enhanced physics-informed neural networks for forward and inverse PDE problems. Computer Methods in Applied Mechanics and Engineering 393, 114823 (2022).\n\n\n\nS. Guo. Unraveling the Design Pattern of Physics-Informed Neural Networks: Series 05. Online (May 2023).\n\n\n\nY. Wang, X. Han, C.-Y. Chang, D. Zha, U. Braga-Neto and X. Hu. Auto-PINN: Understanding and Optimizing Physics-Informed Neural Architecture, arXiv (2023), arXiv:2205.13748 [cs.LG].\n\n\n\nS. Guo. Unraveling the Design Pattern of Physics-Informed Neural Networks: Series 06. Online (Jun 2023).\n\n\n\nS. Wang, S. Sankaran and P. Perdikaris. Respecting causality is all you need for training physics-informed neural networks, arXiv (2022), arXiv:2203.07404 [cs.LG].\n\n\n\nS. Guo. Unraveling the Design Pattern of Physics-Informed Neural Networks: Series 07. Online (Jun 2023).\n\n\n\nC. J. Arthurs and A. P. King. Active training of physics-informed neural networks to aggregate and interpolate parametric solutions to the Navier-Stokes equations. Journal of Computational Physics 438, 110364 (2021).\n\n\n\nI. E. Lagaris, A. Likas and D. I. Fotiadis. Artificial neural networks for solving ordinary and partial differential equations. IEEE Transactions on Neural Networks 9, 987–1000 (1998).\n\n\n\nE. A. Antonelo, E. Camponogara, L. O. Seman, J. P. Jordanou, E. R. de Souza and J. F. Hübner. Physics-informed neural nets for control of dynamical systems. Neurocomputing 579, 127419 (2024).\n\n\n\nS. Cai, Z. Wang, S. Wang, P. Perdikaris and G. E. Karniadakis. Physics-Informed Neural Networks for Heat Transfer Problems. Journal of Heat Transfer 143 (2021).\n\n\n\nS. Cuomo, V. S. di Cola, F. Giampaolo, G. Rozza, M. Raissi and F. Piccialli. Scientific Machine Learning through Physics-Informed Neural Networks: Where we are and What's next, arXiv (2022).\n\n\n\nG. E. Karniadakis, I. G. Kevrekidis, L. Lu, P. Perdikaris, S. Wang and L. Yang. Physics-informed machine learning. Nature Reviews Physics 3, 422–440 (2021).\n\n\n\nL. Lu, X. Meng, Z. Mao and G. E. Karniadakis. DeepXDE: A Deep Learning Library for Solving Differential Equations. SIAM Review 63, 208–228 (2021).\n\n\n\nL. Lu, R. Pestourie, W. Yao, Z. Wang, F. Verdugo and S. G. Johnson. Physics-informed neural networks with hard constraints for inverse design, arXiv (2021).\n\n\n\nM. A. Nabian, R. J. Gladstone and H. Meidani. Efficient training of physics‐informed neural networks via importance sampling. Computer-Aided Civil and Infrastructure Engineering 36, 962–977 (2021).\n\n\n\nS. Sanyal and K. Roy. RAMP-Net: A Robust Adaptive MPC for Quadrotors via Physics-informed Neural Network, arXiv (2022).\n\n\n\nT. Würth, C. Krauß, C. Zimmerling and L. Kärger. Physics-informed neural networks for data-free surrogate modelling and engineering optimization – An example from composite manufacturing. Materials & Design 231, 112034 (2023).\n\n\n\nM. Malinen and P. Råback. Elmer finite element solver for multiphysics and multiscale problems. In: Multiscale modelling methods for applications in materials science, Vol. 19, edited by I. Kondov and G. Sutmann (Forschungszentrum, Zentralbibliothek, 2013); pp. 101–113. Literaturangaben.\n\n\n\nS. Masamune and J. M. Smith. Thermal conductivity of beds of spherical particles. Industrial and Engineering Chemistry Fundamentals 2, 136–143 (1963).\n\n\n\nA. Luikov, A. Shashkov, L. Vasiliev and Y. Fraiman. Thermal conductivity of porous systems. International Journal of Heat and Mass Transfer 11, 117–140 (1968).\n\n\n\nJ. C. Koh and A. Fortini. Thermal conductivity and electrical resistivity of porous metallic materials (NASA, 1971).\n\n\n\nJ. C. Koh and A. Fortini. Prediction of thermal conductivity and electrical resistivity of porous metallic materials. International Journal of Heat and Mass Transfer 16, 2013–2022 (1973).\n\n\n\nT. Fiedler, E. Pesetskaya, A. Öchsner and J. Grácio. Calculations of the thermal conductivity of porous materials. Materials Science Forum 514–516, 754–758 (2006).\n\n\n\nT. Fiedler, A. Öchsner, N. Muthubandara, I. V. Belova and G. E. Murch. Calculation of the Effective Thermal Conductivity in Composites Using Finite Element and Monte Carlo Methods. Materials Science Forum 553, 51–56 (2007).\n\n\n\nT. Fiedler, E. Solórzano, F. Garcia‐Moreno, A. Öchsner, I. V. Belova and G. E. Murch. Computed tomography based finite element analysis of the thermal properties of cellular aluminium. Materialwissenschaft und Werkstofftechnik 40, 139–143 (2009).\n\n\n\nD. S. Smith, A. Alzina, J. Bourret, B. Nait-Ali, F. Pennec, N. Tessier-Doyen, K. Otsu, H. Matsubara, P. Elser and U. T. Gonzenbach. Thermal conductivity of porous materials. Journal of Materials Research 28, 2260–2272 (2013).\n\n\n\nA. Cheilytko. Finding of the generalized equation of thermal conductivity for porous heat-insulating materials. Technology audit and production reserves 5, 4–10 (2016).\n\n\n\nG. Pia, L. Casnedi and U. Sanna. Porosity and pore size distribution influence on thermal conductivity of yttria-stabilized zirconia: Experimental findings and model predictions. Ceramics International 42, 5802–5809 (2016).\n\n\n\nL. Qiu, H. Zou, D. Tang, D. Wen, Y. Feng and X. Zhang. Inhomogeneity in pore size appreciably lowering thermal conductivity for porous thermal insulators. Applied Thermal Engineering 130, 1004–1011 (2018).\n\n\n\nM. Chikhi. Effective thermal conductivity of porous biomaterials: Numerical investigation. Journal of Building Engineering 32, 101763 (2020).\n\n\n\nK. Mraz, J. Bohacek, O. Resl, M. Chabicovsky and E. Karimi-Sibaki. Thermal conductivity of porous oxide layer: A numerical model based on CT data. Materials Today Communications 28, 102705 (2021).\n\n\n\nP. J. O'Rourke and D. M. Snider. An improved collision damping time for MP-PIC calculations of dense particle flows with applications to polydisperse sedimenting beds and colliding particle jets. Chemical Engineering Science 65, 6014–6028 (2010).\n\n\n\nV. Garaniya and L. Goldsworthy. Heavy Fuel Oil Combustion Modelling Using Continuous Thermodynamics. Marine Engineering 47, 871–877 (2012).\n\n\n\nR. J. Kee, M. E. Coltrin, P. Glarborg and H. Zhu. Chemically reacting flow theory, modeling, and simulation (Wiley & Sons, Incorporated, John, 2017); p. 792.\n\n\n\nH. S. Fogler. Elements of Chemical Reaction Engineering (Prentice Hall International Series in Physical and Chemical Engineering \tSciences, 1999).\n\n\n\nB. E. Launder and D. B. Spalding. The numerical computation of turbulent flows. Computer Methods in Applied Mechanics and Engineering 3, 269–289 (1974).\n\n\n\nD. Gidaspow. Multiphase flow and fluidization: continuum and kinetic theory descriptions with applications (Academic Press, 1994).\n\n\n\nJ. P. Du Plessis and J. H. Masliyah. Mathematical modelling of flow through consolidated isotropic porous media. Transport in Porous Media 3, 145–161 (1988).\n\n\n\nA. Haider and O. Levenspiel. Drag coefficient and terminal velocity of spherical and nonspherical particles. Powder Technology 58, 63–70 (1989).\n\n\n\nD. C. Lay. Linear algebra and its applications. Fourth Edition (Addison-Wesley, 2012).\n\n\n\n","category":"page"},{"location":"References/@Schneider1978a/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Schneider1978a/","page":"-","title":"-","text":"title: \"Molecular-dynamics study of a three-dimensional one-component model for distortive phase transitions\" authors: T. Schneider, E. Stoll year: 1978 –-","category":"page"},{"location":"Software/LAMMPS/#LAMMPS","page":"LAMMPS","title":"LAMMPS","text":"","category":"section"},{"location":"Software/LAMMPS/","page":"LAMMPS","title":"LAMMPS","text":"Large-scale Atomic/Molecular Massively Parallel Simulator or simply LAMMPS is a popular molecular dynamics software. It has probably the largest community and is highly mature, reasons why I have chosen this software to learn molecular dynamics at first. Later on I intend learning Molly.jl and maybe GROMACS or some other popular package.","category":"page"},{"location":"Software/LAMMPS/","page":"LAMMPS","title":"LAMMPS","text":"In what follows I will be mostly guided by the LAMMPS tutorials by Simon Gravelle in what concerns the contents, with some touches of automation by myself. Interesting materials are also inspired in what is provided by the MEJK Course. There are also interesting links in the LAMMPS Tutorials. The official documentation of LAMMPS can be found here.","category":"page"},{"location":"Software/LAMMPS/#Resources","page":"LAMMPS","title":"Resources","text":"","category":"section"},{"location":"Software/LAMMPS/","page":"LAMMPS","title":"LAMMPS","text":"These are complementary to LAMMPS and might be required in some cases, mainly for post-processing and rendering of simulation results as nice videos.","category":"page"},{"location":"Software/LAMMPS/","page":"LAMMPS","title":"LAMMPS","text":"colvars\nMAICoS\nMDAnalysis\nPyVista\nTopoTools\nVMD","category":"page"},{"location":"Software/LAMMPS/#Workflow-of-a-simulation","page":"LAMMPS","title":"Workflow of a simulation","text":"","category":"section"},{"location":"Software/LAMMPS/#System-initialization","page":"LAMMPS","title":"System initialization","text":"","category":"section"},{"location":"Software/LAMMPS/","page":"LAMMPS","title":"LAMMPS","text":"Comprises all basic definitions, such as domain boundaries specification, types of atoms, potentials, etc. This step is common to most simulations and it is worth writing parts of it as shared scripts in larger projects.","category":"page"},{"location":"Software/LAMMPS/","page":"LAMMPS","title":"LAMMPS","text":"The basic building blocks of a simulation include the definition of units, dimension and boundary; these are followed by a number of styles, which are responsible by defining the types of particles, how they interact between themselves, bond types, …, etc. The following snippet provides a minimal setup for a system consisting of atoms only, the simplest atom_style.","category":"page"},{"location":"Software/LAMMPS/","page":"LAMMPS","title":"LAMMPS","text":"units lj\ndimension 3\nboundary p p p\n\natom_style atomic\npair_style lj/cut 2.5","category":"page"},{"location":"Software/LAMMPS/","page":"LAMMPS","title":"LAMMPS","text":"For simple diatomic molecules, one needs to add a bond_style:","category":"page"},{"location":"Software/LAMMPS/","page":"LAMMPS","title":"LAMMPS","text":"...\natom_style      molecular\nbond_style      harmonic\n...","category":"page"},{"location":"Software/LAMMPS/","page":"LAMMPS","title":"LAMMPS","text":"And when going towards multiatomic molecules, an angle_style is also needed:","category":"page"},{"location":"Software/LAMMPS/","page":"LAMMPS","title":"LAMMPS","text":"...\natom_style      molecular\nbond_style      harmonic\nangle_style     harmonic\n...","category":"page"},{"location":"Software/LAMMPS/","page":"LAMMPS","title":"LAMMPS","text":"For the creation of simulation domain one needs to declare one or more0 region entities; it is possible then to perform logical operations to select intersections, …, etc. The simplest of the regions is a trivial block, with dimensions xyz given as a sequence of pairs of minimum and maximum as follows.","category":"page"},{"location":"Software/LAMMPS/","page":"LAMMPS","title":"LAMMPS","text":"# \nregion          simulation_box block -20 20 -20 20 -20 20\ncreate_box      3 the_box","category":"page"},{"location":"Software/LAMMPS/","page":"LAMMPS","title":"LAMMPS","text":"In the above cell we also used create_box with argument 3, meaning we intend to have 3 atom types in the simulation domain. Next we can create a cylinder of radius 10 along z-axis:","category":"page"},{"location":"Software/LAMMPS/","page":"LAMMPS","title":"LAMMPS","text":"region cylinder_in cylinder z 0 0 10 INF INF side in\nregion cylinder_out cylinder z 0 0 10 INF INF side out","category":"page"},{"location":"Software/LAMMPS/","page":"LAMMPS","title":"LAMMPS","text":"To be able to use an INF (infinite) dimension along a direction on must have created the block the_box ahead of the cylinder. Fortunately the error messages of LAMMPS are pretty expressive and one can quickly find a fix. Try commenting out the create_box in the script and check it. You can check the region command for more.","category":"page"},{"location":"Software/LAMMPS/","page":"LAMMPS","title":"LAMMPS","text":"Note: here we will use a more complex version of create_box because this tutorial simulation aims at considering molecular species. The simplest version above is valid for atoms only.","category":"page"},{"location":"Software/LAMMPS/","page":"LAMMPS","title":"LAMMPS","text":"create_box      3 simulation_box &\n    bond/types             1     &\n    angle/types            1     &\n    extra/bond/per/atom    1     &\n    extra/angle/per/atom   2     &\n    extra/special/per/atom 5","category":"page"},{"location":"Software/LAMMPS/","page":"LAMMPS","title":"LAMMPS","text":"Molecule creation syntax is provided here.","category":"page"},{"location":"Software/LAMMPS/#Energy-minimization","page":"LAMMPS","title":"Energy minimization","text":"","category":"section"},{"location":"Software/LAMMPS/","page":"LAMMPS","title":"LAMMPS","text":"When atoms are placed randomly in a domain there is a high probability of explosion of interaction forces due to overlap; a minimization step is generally required to search a sane starting point before time integration.","category":"page"},{"location":"Software/LAMMPS/#Integration-of-the-equations-of-motion","page":"LAMMPS","title":"Integration of the equations of motion","text":"","category":"section"},{"location":"Software/LAMMPS/","page":"LAMMPS","title":"LAMMPS","text":"With all interaction forces and a reasonable initial condition defined during minimization, time integration can be performed. This is generally done through the Verlet algorithm, although there are other methods available in LAMMPS. The key factor here is finding a suitable time step; as a rule-of-thumb, it is ideally about 5% of the time between collisions.","category":"page"},{"location":"Software/LAMMPS/#Trajectory-visualization","page":"LAMMPS","title":"Trajectory visualization","text":"","category":"section"},{"location":"Software/LAMMPS/","page":"LAMMPS","title":"LAMMPS","text":"Prior to integration one defines the data to be stored with the simulation. A common tool (freeware but not open source) in this field is VMD, for which a tutorial is provided here.","category":"page"},{"location":"Software/LAMMPS/#LAMMPS-usage","page":"LAMMPS","title":"LAMMPS usage","text":"","category":"section"},{"location":"Software/LAMMPS/","page":"LAMMPS","title":"LAMMPS","text":"A simulation script is simply parsed and run with lmp -in inputs.lammps.\nLAMMPS supports some regular expressions, i.e. you can set all masses to unity by calling mass * 1.0, where the * evaluates to all atom types already created.\nOmitted pairwise interaction parameters are by default computed by geometric averaging; Lorentz-Berthelot arithmetic rule is more common, though there is no rigorous argument for justifying any of them and they should be used with care in the absence of better data.","category":"page"},{"location":"Software/LAMMPS/#Key-concepts","page":"LAMMPS","title":"Key concepts","text":"","category":"section"},{"location":"Software/LAMMPS/","page":"LAMMPS","title":"LAMMPS","text":"Langevin thermostat, see Schneider1978a [22].","category":"page"},{"location":"Software/LAMMPS/#Tutorials","page":"LAMMPS","title":"Tutorials","text":"","category":"section"},{"location":"Software/LAMMPS/#Lennard-Jones-fluid","page":"LAMMPS","title":"Lennard-Jones fluid","text":"","category":"section"},{"location":"Software/LAMMPS/","page":"LAMMPS","title":"LAMMPS","text":"In this tutorial the following concepts are dealt with:","category":"page"},{"location":"Software/LAMMPS/","page":"LAMMPS","title":"LAMMPS","text":"Basic setup of a simulation with atomic types only.\nConcept of box and regions for system definition and random initialization of atoms inside region volumes, e.g. using cylinders to define where each type of atom must be.\nTracking of thermodynamics during minimization run and finding a suitable initial condition though minimization before proceeding with molecular dynamics simulation properly said.","category":"page"},{"location":"Software/LAMMPS/","page":"LAMMPS","title":"LAMMPS","text":"The Lennard-Jones potential is defined as","category":"page"},{"location":"Software/LAMMPS/","page":"LAMMPS","title":"LAMMPS","text":"E(r) = 4epsilon_ijleft\n\tleft(fracsigma_ijRright)^12\n\t-left(fracsigma_ijRright)^6\nright","category":"page"},{"location":"Software/LAMMPS/","page":"LAMMPS","title":"LAMMPS","text":"This potential can be implemented in an efficient way by introducing r=(sigma_ijR^-1)^6:","category":"page"},{"location":"Software/LAMMPS/","page":"LAMMPS","title":"LAMMPS","text":"ljpotential(r, ϵ) = 4ϵ * r * (r - 1)\n\nnothing; # hide","category":"page"},{"location":"Software/LAMMPS/","page":"LAMMPS","title":"LAMMPS","text":"The evaluation of this is can be managed by a type as provided below; notice the use of a function object operator for accessing the internals of PairInterLJ:","category":"page"},{"location":"Software/LAMMPS/","page":"LAMMPS","title":"LAMMPS","text":"struct PairInterLJ\n    ϵ::Float64\n    σ::Float64\nend\n\n(self::PairInterLJ)(R::Float64) = ljpotential((self.σ / R)^6, self.ϵ)\n\nnothing; # hide","category":"page"},{"location":"Software/LAMMPS/","page":"LAMMPS","title":"LAMMPS","text":"In the simulations we have used default parameters for interactions between different types of atoms; that implies geometric mean of both interaction potential epsilon_ij and distance parameter sigma_ij. An alternative would be a Lorentz-Berthelot arithmetic mean (for distance parameter only). To compare these we overload the structure constructor:","category":"page"},{"location":"Software/LAMMPS/","page":"LAMMPS","title":"LAMMPS","text":"function PairInterLJ(p::PairInterLJ, q::PairInterLJ; method = :arithmetic)\n method ∈ [:arithmetic, :geometric] || throw(\"Unknown method $(method)\")\n \n σ = (method == :arithmetic) ? (p.σ + q.σ) / 2.0 : sqrt(p.σ * q.σ)\n \n return PairInterLJ(sqrt(p.ϵ * q.ϵ), σ)\nend\n\nnothing; # hide","category":"page"},{"location":"Software/LAMMPS/","page":"LAMMPS","title":"LAMMPS","text":"Using the case data we can compute the following interaction potentials:","category":"page"},{"location":"Software/LAMMPS/","page":"LAMMPS","title":"LAMMPS","text":"pair11 = PairInterLJ(1.0, 1.0)\npair22 = PairInterLJ(0.5, 3.0)\n\npair12_g = PairInterLJ(pair11, pair22; method = :geometric)\npair12_a = PairInterLJ(pair11, pair22; method = :arithmetic)\n\nnothing; # hide","category":"page"},{"location":"Software/LAMMPS/","page":"LAMMPS","title":"LAMMPS","text":"pair12_g","category":"page"},{"location":"Software/LAMMPS/","page":"LAMMPS","title":"LAMMPS","text":"pair12_a","category":"page"},{"location":"Software/LAMMPS/","page":"LAMMPS","title":"LAMMPS","text":"Visualization is straightforward with Makie:","category":"page"},{"location":"Software/LAMMPS/","page":"LAMMPS","title":"LAMMPS","text":"using CairoMakie\n\nR = LinRange(0.9, 6, 500)\n\nfig = with_theme() do\t\n f = Figure()\n ax = Axis(f[1, 1]; xlabel = L\"R\", ylabel = L\"E(R)\")\n lines!(ax, R, pair11.(R); label = L\"E_{11}\", color = :red)\n lines!(ax, R, pair22.(R); label = L\"E_{22}\", color = :blue)\n lines!(ax, R, pair12_g.(R); label = L\"E_{12,g}\", color = :black)\n lines!(ax, R, pair12_a.(R); label = L\"E_{12,a}\", color = :green)\n ax.xticks = 1.0:1.0:6.0\n xlims!(ax, 0.95, 6.0)\n ylims!(ax, -1.02, 1.0)\n axislegend(ax; position = :rt)\n f\nend\n\nfig","category":"page"},{"location":"Software/LAMMPS/","page":"LAMMPS","title":"LAMMPS","text":"For proper representation of results, following the VDM tutorial one can further:","category":"page"},{"location":"Software/LAMMPS/","page":"LAMMPS","title":"LAMMPS","text":"Learn to represent atoms with proper scaling using VWD representation and after manipulation dump the state in the same directory as the trajectories file for ease of reloading; in this case it is simply a matter of File > Load Visualization State....\nGenerate animation using the included Internal Tachyon (unless you have a local Tachyon installation) library and process with FFmpeg with command ffmpeg -framerate 30 -i \"results.%05d.bmp\" -vf \"select=not(mod(n\\,3)),scale=372x360\" animation.gif. For selecting every n-th frame use this approach.","category":"page"},{"location":"References/@Cuomo2022a/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Cuomo2022a/","page":"-","title":"-","text":"title: \"Scientific machine learning through physics-informed neural networks: Where we are and what's next\" authors: Salvatore Cuomo, Vincenzo Schiano di Cola, Fabio Giampaolo, Gianluigi Rozza, Maziar Raissi, Francesco Piccialli year: 2022 DOI: https://doi.org/10.48550/arXiv.2201.05624 –-","category":"page"},{"location":"References/@Nowruzi2014/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Nowruzi2014/","page":"-","title":"-","text":"title: Numerical simulation of non-evaporating and non-reacting heavy fuel oil injection spray in medium speed engines using OpenFOAM authors: Hashem Nowruzi, Parviz Ghadimi, Mehdi Yousefifard, Mohammad A. Feiz Chekab year: 2014 URL: https://doi.org/10.14810/ijmech.2014.3206 Drive: https://1drv.ms/b/s!Ar4x-UlrYAiZlbEf-L95SgshO8_Nhg?e=jKpxyO –-","category":"page"},{"location":"References/@Grosshandler1993/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Grosshandler1993/","page":"-","title":"-","text":"title: Radcal – a narrow-band model for radiation calculations in a combustion environment authors: William L. Grosshandler year: 1993 –-","category":"page"},{"location":"References/@Hindmarsh2005/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Hindmarsh2005/","page":"-","title":"-","text":"title: \"SUNDIALS: Suite of nonlinear and Differential/Algebraic equation solvers\" authors: Alan C. Hindmarsh, Peter N. Brown, Keith E. Grant, Steven L. Lee, Radu Serban, Dan E. Shumaker, Carol S. Woodward year: 2005 –-","category":"page"},{"location":"References/@Shirzad2023/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Shirzad2023/","page":"-","title":"-","text":"title: \"A critical review on applications of the Avrami equation beyond materials science\" authors: Kiana Shirzad, Christopher Viney year: 2023 –-","category":"page"},{"location":"Computing/06-Domain-Specific-Software/#Domain-specific-software","page":"Domain specific software","title":"Domain specific software","text":"","category":"section"},{"location":"Computing/06-Domain-Specific-Software/#Transport-phenomena","page":"Domain specific software","title":"Transport phenomena","text":"","category":"section"},{"location":"Computing/06-Domain-Specific-Software/","page":"Domain specific software","title":"Domain specific software","text":"The list below provides useful links for learning transport phenomena simulation:","category":"page"},{"location":"Computing/06-Domain-Specific-Software/","page":"Domain specific software","title":"Domain specific software","text":"CFD Online (forum)\nNASA Turbulence LARC\nCFD General Notation System (CGNS)\nCFD Support (list of software)\nCFDyna","category":"page"},{"location":"Computing/06-Domain-Specific-Software/","page":"Domain specific software","title":"Domain specific software","text":"And below you find some supporting tools for setting up a CFD simulation:","category":"page"},{"location":"Computing/06-Domain-Specific-Software/","page":"Domain specific software","title":"Domain specific software","text":"Y-Plus\nSkin friction\nFluid Mechanics 101","category":"page"},{"location":"Computing/06-Domain-Specific-Software/","page":"Domain specific software","title":"Domain specific software","text":"The following is a list of water property calculators for use in detailed simulations:","category":"page"},{"location":"Computing/06-Domain-Specific-Software/","page":"Domain specific software","title":"Domain specific software","text":"IAPWS-95\niapws\nCoolProp\nfreesteam\nqingfengxia/freesteam","category":"page"},{"location":"Computing/06-Domain-Specific-Software/","page":"Domain specific software","title":"Domain specific software","text":"It is also interesting to have access to some combustion-related materials:","category":"page"},{"location":"Computing/06-Domain-Specific-Software/","page":"Domain specific software","title":"Domain specific software","text":"Methane/air combustion","category":"page"},{"location":"Computing/06-Domain-Specific-Software/#SU2","page":"Domain specific software","title":"SU2","text":"","category":"section"},{"location":"Computing/06-Domain-Specific-Software/","page":"Domain specific software","title":"Domain specific software","text":"SU2 webpage","category":"page"},{"location":"Computing/06-Domain-Specific-Software/#OpenFOAM","page":"Domain specific software","title":"OpenFOAM","text":"","category":"section"},{"location":"Computing/06-Domain-Specific-Software/","page":"Domain specific software","title":"Domain specific software","text":"OpenFOAM distributions","category":"page"},{"location":"Computing/06-Domain-Specific-Software/","page":"Domain specific software","title":"Domain specific software","text":"OpenFOAM.org (CFD Direct)\nOpenFOAM.com (ESI)","category":"page"},{"location":"Computing/06-Domain-Specific-Software/","page":"Domain specific software","title":"Domain specific software","text":"General purpose, tutorials, and documentation:","category":"page"},{"location":"Computing/06-Domain-Specific-Software/","page":"Domain specific software","title":"Domain specific software","text":"OpenFOAM Wiki\nTU Wien tutorials\n3-week series tutorials\nTutorials by author\nFEA for All tutorials of OpenFOAM\nCEMF tutorials","category":"page"},{"location":"Computing/06-Domain-Specific-Software/","page":"Domain specific software","title":"Domain specific software","text":"External solvers:","category":"page"},{"location":"Computing/06-Domain-Specific-Software/","page":"Domain specific software","title":"Domain specific software","text":"catalyticFoam\nCEMF solvers","category":"page"},{"location":"Computing/06-Domain-Specific-Software/","page":"Domain specific software","title":"Domain specific software","text":"Conjugate heat transfer:","category":"page"},{"location":"Computing/06-Domain-Specific-Software/","page":"Domain specific software","title":"Domain specific software","text":"Tutorial of chtMultiRegionFoam\nTutorial - Heat sink","category":"page"},{"location":"Computing/06-Domain-Specific-Software/","page":"Domain specific software","title":"Domain specific software","text":"Volume of fluid (VoF):","category":"page"},{"location":"Computing/06-Domain-Specific-Software/","page":"Domain specific software","title":"Domain specific software","text":"interFoam tutorial - raising bubble","category":"page"},{"location":"Computing/06-Domain-Specific-Software/","page":"Domain specific software","title":"Domain specific software","text":"Moving reference frame (MRF):","category":"page"},{"location":"Computing/06-Domain-Specific-Software/","page":"Domain specific software","title":"Domain specific software","text":"Video tutorial by Asmaa Hadane","category":"page"},{"location":"Computing/06-Domain-Specific-Software/#Reduced-order-modeling-(ROM)","page":"Domain specific software","title":"Reduced order modeling (ROM)","text":"","category":"section"},{"location":"Computing/06-Domain-Specific-Software/","page":"Domain specific software","title":"Domain specific software","text":"GeN-ROM paper\nITHACA-FV ROM for OpenFOAM\nBYU-PRISM/Seeq","category":"page"},{"location":"Computing/06-Domain-Specific-Software/#Lattice-Boltzmann-method","page":"Domain specific software","title":"Lattice-Boltzmann method","text":"","category":"section"},{"location":"Computing/06-Domain-Specific-Software/","page":"Domain specific software","title":"Domain specific software","text":"The following links provide simple implementations to learn DEM development:","category":"page"},{"location":"Computing/06-Domain-Specific-Software/","page":"Domain specific software","title":"Domain specific software","text":"LBM in Python from scratch\nRepository with implementation samples","category":"page"},{"location":"Computing/06-Domain-Specific-Software/#Smooth-Particle-Hydrodynamics","page":"Domain specific software","title":"Smooth Particle Hydrodynamics","text":"","category":"section"},{"location":"Computing/06-Domain-Specific-Software/","page":"Domain specific software","title":"Domain specific software","text":"Several projects","category":"page"},{"location":"Computing/06-Domain-Specific-Software/","page":"Domain specific software","title":"Domain specific software","text":"","category":"page"},{"location":"Computing/06-Domain-Specific-Software/#Systems-modeling","page":"Domain specific software","title":"Systems modeling","text":"","category":"section"},{"location":"Computing/06-Domain-Specific-Software/#DWSIM","page":"Domain specific software","title":"DWSIM","text":"","category":"section"},{"location":"Computing/06-Domain-Specific-Software/","page":"Domain specific software","title":"Domain specific software","text":"Generical chemical process simulation software.","category":"page"},{"location":"Computing/06-Domain-Specific-Software/","page":"Domain specific software","title":"Domain specific software","text":"DWSIM\nDWSIM: Curso (Pr. Felix Monteiro Pereira)\nDWSIM: Curso (Pr. Delano Mendes de Santana)\nDWSIM: YouTube Playlist","category":"page"},{"location":"Computing/06-Domain-Specific-Software/#Dyssol","page":"Domain specific software","title":"Dyssol","text":"","category":"section"},{"location":"Computing/06-Domain-Specific-Software/","page":"Domain specific software","title":"Domain specific software","text":"Dyssol is process unit operations simulator conceived from granular processes.","category":"page"},{"location":"Computing/06-Domain-Specific-Software/","page":"Domain specific software","title":"Domain specific software","text":"Dyssol repository\nDyssol documentation","category":"page"},{"location":"Computing/06-Domain-Specific-Software/#Modelica","page":"Domain specific software","title":"Modelica","text":"","category":"section"},{"location":"Computing/06-Domain-Specific-Software/","page":"Domain specific software","title":"Domain specific software","text":"Modelica is an acausal programming language for systems modeling:","category":"page"},{"location":"Computing/06-Domain-Specific-Software/","page":"Domain specific software","title":"Domain specific software","text":"Modelica Association\nModelica Documentation\nModelica Specification\nOpenModelica (FOSS implementation)\nModelica University\nThermoSysPro package","category":"page"},{"location":"Computing/06-Domain-Specific-Software/","page":"Domain specific software","title":"Domain specific software","text":"","category":"page"},{"location":"Computing/06-Domain-Specific-Software/#Combustion-and-kinetics","page":"Domain specific software","title":"Combustion and kinetics","text":"","category":"section"},{"location":"Computing/06-Domain-Specific-Software/#Cantera","page":"Domain specific software","title":"Cantera","text":"","category":"section"},{"location":"Computing/06-Domain-Specific-Software/","page":"Domain specific software","title":"Domain specific software","text":"Cantera is the standard package for modeling reacting systems. As it was my main toolkit in the final parts of my PhD and still is a major part of my professional life, I am quite knowledgeable on this software. It can be considered the final replacement of classical Chemkin. I am currently working in a Julia interface to its core library.","category":"page"},{"location":"Computing/06-Domain-Specific-Software/#Fire-Models","page":"Domain specific software","title":"Fire Models","text":"","category":"section"},{"location":"Computing/06-Domain-Specific-Software/","page":"Domain specific software","title":"Domain specific software","text":"GitHub - firemodels/fds: Fire Dynamics Simulator\nFDS-SMV Manuals","category":"page"},{"location":"Computing/06-Domain-Specific-Software/#OpenSmoke","page":"Domain specific software","title":"OpenSmoke++","text":"","category":"section"},{"location":"Computing/06-Domain-Specific-Software/","page":"Domain specific software","title":"Domain specific software","text":"OpenSmoke++ is a framework for detailed kinetics modeling of large reacting systems. This paper might be of interest: Dalili (2020) - modeling of a single droplet evaporation and combustion.","category":"page"},{"location":"Computing/06-Domain-Specific-Software/","page":"Domain specific software","title":"Domain specific software","text":"","category":"page"},{"location":"Computing/06-Domain-Specific-Software/#Mathematical-software","page":"Domain specific software","title":"Mathematical software","text":"","category":"section"},{"location":"Computing/06-Domain-Specific-Software/","page":"Domain specific software","title":"Domain specific software","text":"Mathics\nMaxima","category":"page"},{"location":"Computing/06-Domain-Specific-Software/","page":"Domain specific software","title":"Domain specific software","text":"","category":"page"},{"location":"Computing/06-Domain-Specific-Software/#Computational-thermodynamics","page":"Domain specific software","title":"Computational thermodynamics","text":"","category":"section"},{"location":"Computing/06-Domain-Specific-Software/","page":"Domain specific software","title":"Domain specific software","text":"sundmanbo/opencalphad\npycalphad/pycalphad\nmaterialsgenomefoundation/kawin\nORNL-CEES/thermochimica\nORNL/Equilipy\nhasundue/Calmato.jl\nnpaulson/pduq","category":"page"},{"location":"Computing/06-Domain-Specific-Software/","page":"Domain specific software","title":"Domain specific software","text":"","category":"page"},{"location":"Computing/06-Domain-Specific-Software/#Entering","page":"Domain specific software","title":"Entering","text":"","category":"section"},{"location":"Computing/06-Domain-Specific-Software/","page":"Domain specific software","title":"Domain specific software","text":"This section contains other software to check; I don't necessarily know them and as I might them useful or consider the projects abandoned they might be dropped from the list until they find their right place in this file.","category":"page"},{"location":"Computing/06-Domain-Specific-Software/","page":"Domain specific software","title":"Domain specific software","text":"ASL GitHub\nDymos\nGitHub - flame-code/FLAME: FLAME: a library for atomistic modeling environments\nstitching/stitching at main · lukasalexanderweber/stitching\n[usnistgov/atomman: Atomistic Manipulation Toolkit](https://github.com/usnistgov/atomman\nGrossfieldLab/loos: LOOS: a lightweight object-oriented structure analysis library\nglotzerlab/freud: Powerful, efficient particle trajectory analysis in scientific Python.\nGitHub - xiaoh/sediFoam: CFD-DEM Solver with emphasis on sediment transport\nGitHub - CoolProp/CoolProp: Thermophysical properties for the masses\nGitHub - fwitte/fluprodia: Fluid property diagrams\nshiftkey/desktop\nbjodah/chempy: A package useful for chemistry written in Python\n[BenLand100/chroma: Ultra-fast Photon Monte Carlo](https://github.com/BenLand100/chroma\npreCICE: coupling between different solutions\nASALI\nCSIRO","category":"page"},{"location":"References/@Malinen2013a/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Malinen2013a/","page":"-","title":"-","text":"title: \"Elmer finite element solver for multiphysics and multiscale problems\" authors: Mika Malinen, Peter Råback year: 2013 –-","category":"page"},{"location":"Notebooks/01-Composite-Conduction/#Steady-state-heat-transfer","page":"Steady-state heat transfer","title":"Steady-state heat transfer","text":"","category":"section"},{"location":"Notebooks/01-Composite-Conduction/","page":"Steady-state heat transfer","title":"Steady-state heat transfer","text":"No further words, let's start by importing the required toolset:","category":"page"},{"location":"Notebooks/01-Composite-Conduction/","page":"Steady-state heat transfer","title":"Steady-state heat transfer","text":"using CairoMakie\nusing LinearAlgebra\nusing Printf\nusing Unitful\n\n# Stefan-Boltzmann constant.\nconst σ = 5.67e-08u\"W/(m^2*K^4)\"\n\nnothing; #hide","category":"page"},{"location":"Notebooks/01-Composite-Conduction/#Linear-problem","page":"Steady-state heat transfer","title":"Linear problem","text":"","category":"section"},{"location":"Notebooks/01-Composite-Conduction/","page":"Steady-state heat transfer","title":"Steady-state heat transfer","text":"Implementation of section 2.2.1 of Nithiarasu et al. (2016) of steady state heat transfer across a composite slab of materials with different thermal conductivities. In one side the slab is irradiated with a heat flux density q_1 while the opposite face is subjected to a convective heat transfer with coefficient h and ambient temperature T_a. The model to be solved can be stated as","category":"page"},{"location":"Notebooks/01-Composite-Conduction/","page":"Steady-state heat transfer","title":"Steady-state heat transfer","text":"fracd^2Tdx^2=0\nqquad q_1 = -k_1fracdTdx\nqquad q_2 = h (T_3 -\nT_a)","category":"page"},{"location":"Notebooks/01-Composite-Conduction/","page":"Steady-state heat transfer","title":"Steady-state heat transfer","text":"Our goal in what follows is to implement equation (2.12) of the reference to be able to solve for nodal temperatures. To this end we need both the stiffness matrix and the forcing vector of the problem. The code that follows tries to mimic the mathematical implementation rather than following a general programming approach given the introductory level of this example.","category":"page"},{"location":"Notebooks/01-Composite-Conduction/","page":"Steady-state heat transfer","title":"Steady-state heat transfer","text":"Since each component of the composite slab is characterized by a conductivity across the element we provide a function conductivity for computing K=kAL^-1. This is more expressive than simply hard-coding its definition directly in the stiffness matrix.","category":"page"},{"location":"Notebooks/01-Composite-Conduction/","page":"Steady-state heat transfer","title":"Steady-state heat transfer","text":"function conductivity(k, A, L)\n return k * A / L\nend\n\nnothing; #hide","category":"page"},{"location":"Notebooks/01-Composite-Conduction/","page":"Steady-state heat transfer","title":"Steady-state heat transfer","text":"Below we implement the stiffness matrix constructor in terms of the required parameters:","category":"page"},{"location":"Notebooks/01-Composite-Conduction/","page":"Steady-state heat transfer","title":"Steady-state heat transfer","text":"function stiffness(h, k1, k2, L1, L2; A=1)\n a1 = conductivity(k1, A, L1)\n a2 = conductivity(k2, A, L2)\n b0 = 0u\"W/(m^2*K)\"\n\n return [ a1 -a1 b0\n -a1 a1+a2 -a2\n b0 -a2 a2+h*A ];\nend\n\nnothing; #hide","category":"page"},{"location":"Notebooks/01-Composite-Conduction/","page":"Steady-state heat transfer","title":"Steady-state heat transfer","text":"Similarly, the column forcing vector is given as:","category":"page"},{"location":"Notebooks/01-Composite-Conduction/","page":"Steady-state heat transfer","title":"Steady-state heat transfer","text":"function forcing(q, h, Ta; A=1)\n return [ q*A; 0u\"W/m^2\"; h*A*Ta ];\nend\n\nnothing; #hide","category":"page"},{"location":"Notebooks/01-Composite-Conduction/","page":"Steady-state heat transfer","title":"Steady-state heat transfer","text":"As model parameters one needs to specity the thermal conductivities k and associated thicknesses L of plates and the known heat transfer coefficient h on the side the slab is exposed to convective heat transfer. All these values are provided below with respective physical units.","category":"page"},{"location":"Notebooks/01-Composite-Conduction/","page":"Steady-state heat transfer","title":"Steady-state heat transfer","text":"h = 5u\"W/(m^2*K)\"\nk1 = 5.0u\"W/(m*K)\"\nk2 = 0.5u\"W/(m*K)\"\nL1 = 1.0u\"m\"\nL2 = 1.0u\"m\"\n\nnothing; #hide","category":"page"},{"location":"Notebooks/01-Composite-Conduction/","page":"Steady-state heat transfer","title":"Steady-state heat transfer","text":"To complete the boundary conditions, the heat flux q_1 and environment temperature T_a are given below.","category":"page"},{"location":"Notebooks/01-Composite-Conduction/","page":"Steady-state heat transfer","title":"Steady-state heat transfer","text":"q1 = 20.0u\"W/m^2\"\nTa = 300.0u\"K\"\n\nnothing; #hide","category":"page"},{"location":"Notebooks/01-Composite-Conduction/","page":"Steady-state heat transfer","title":"Steady-state heat transfer","text":"Now we are able to create the problem and inspect elements.","category":"page"},{"location":"Notebooks/01-Composite-Conduction/","page":"Steady-state heat transfer","title":"Steady-state heat transfer","text":"M = stiffness(h, k1, k2, L1, L2)","category":"page"},{"location":"Notebooks/01-Composite-Conduction/","page":"Steady-state heat transfer","title":"Steady-state heat transfer","text":"f = forcing(q1, h, Ta)","category":"page"},{"location":"Notebooks/01-Composite-Conduction/","page":"Steady-state heat transfer","title":"Steady-state heat transfer","text":"Solution is found by solving the linear system with the backslash operator. Because the default operator does not support Unitful units, an overload required here. Since the problem is small we will use a matrix inverse here as an alternative.","category":"page"},{"location":"Notebooks/01-Composite-Conduction/","page":"Steady-state heat transfer","title":"Steady-state heat transfer","text":"T = inv(M) * f","category":"page"},{"location":"Notebooks/01-Composite-Conduction/","page":"Steady-state heat transfer","title":"Steady-state heat transfer","text":"Below we inspect the solution at the nodal positions (filled dots). Since thermal conductivities were assumed constant in this case, dashed lines extrapolating the linear solution between the nodes are also provided.","category":"page"},{"location":"Notebooks/01-Composite-Conduction/","page":"Steady-state heat transfer","title":"Steady-state heat transfer","text":"Temperature profile across plate with convection boundary condition.","category":"page"},{"location":"Notebooks/01-Composite-Conduction/","page":"Steady-state heat transfer","title":"Steady-state heat transfer","text":"with_theme() do\n fig = Figure(size = (700, 300))\n ax = Axis(fig[1, 1])\n lines!(ax, ustrip(T); color = :red, linestyle = :dash)\n scatter!(ax, ustrip(T); color = :red)\n ax.xlabel = \"Node\"\n ax.ylabel = \"Temperature [K]\"\n ax.xticks = 1:3\n xlims!(ax, (0.95, 3.05))\n ylims!(ax, (300, 350))\n fig\nend","category":"page"},{"location":"Notebooks/01-Composite-Conduction/#Nonlinear-problem","page":"Steady-state heat transfer","title":"Nonlinear problem","text":"","category":"section"},{"location":"Notebooks/01-Composite-Conduction/","page":"Steady-state heat transfer","title":"Steady-state heat transfer","text":"Solving the linear problem of steady heat conduction was trivial, but for practical cases (even at low temperatures in many situations) radiation losses should also be taken into account in the currently convective side of the plate. Here we introduce a modification to the boundary condition q_2 accounting for this heat transfer mode. Notice that another source of nonlinearity could be introduced through non-constant thermal conductivities of the media, but we let the reader implement this as an excercise since it is a trivial exntesion to what is provided in what follows.","category":"page"},{"location":"Notebooks/01-Composite-Conduction/","page":"Steady-state heat transfer","title":"Steady-state heat transfer","text":"fracd^2Tdx^2=0\nqquad\nq_1 = -k_1fracdTdx\nqquad\nq_2 = h (T_3 - T_a) + εσ(T_3^4-T_a^4)","category":"page"},{"location":"Notebooks/01-Composite-Conduction/","page":"Steady-state heat transfer","title":"Steady-state heat transfer","text":"There are many ways of handling the nonlinearity introduced by the radiation term. A common approach is the factorization of T_3^4-T_a^4 and reformulation of the boundary condition in terms of a global heat transfer coefficient U. Because U depends on the last known temperature τ_3 the problem needs to be solved iterativelly. The choice of τ_3 notation is to distinguish it from the value T_3 found by the linear problem solution.","category":"page"},{"location":"Notebooks/01-Composite-Conduction/","page":"Steady-state heat transfer","title":"Steady-state heat transfer","text":"q_2 = U (T_3 - T_a)\nqquadtextwhereqquad\nU = h + εσ(tau_3+T_a)(tau_3^2+T_a^2)","category":"page"},{"location":"Notebooks/01-Composite-Conduction/","page":"Steady-state heat transfer","title":"Steady-state heat transfer","text":"The radiation terms introduce the need to provide the surface emissivity ε:","category":"page"},{"location":"Notebooks/01-Composite-Conduction/","page":"Steady-state heat transfer","title":"Steady-state heat transfer","text":"ε = 0.9\n\nnothing; #hide","category":"page"},{"location":"Notebooks/01-Composite-Conduction/","page":"Steady-state heat transfer","title":"Steady-state heat transfer","text":"An one-liner globalhtc is provided to evaluate U at each iteration.","category":"page"},{"location":"Notebooks/01-Composite-Conduction/","page":"Steady-state heat transfer","title":"Steady-state heat transfer","text":"globalhtc(τ, Ta, h, ε) = h + ε * σ * (τ + Ta) * (τ^2 + Ta^2)\n\n@show globalhtc(300u\"K\", Ta, h, ε)","category":"page"},{"location":"Notebooks/01-Composite-Conduction/","page":"Steady-state heat transfer","title":"Steady-state heat transfer","text":"Since the problem now needs to be solved iterativelly, it is worth creating a simple function that encapsulates the steps to be repeated at each iteration, i.e update the heat transfer coefficient, update stiffness matrix and forcing vector, solve for the new temperature estimate. Because this is a dummy problem we will not get an optimized matrix update, but simply call stiffness and forcing every iteration with the new value of U. Because there are many parameters, we create a function that returns another function with the fixed values allowing for a single update:","category":"page"},{"location":"Notebooks/01-Composite-Conduction/","page":"Steady-state heat transfer","title":"Steady-state heat transfer","text":"function createproblem(Ta, h, ε, k1, k2, L1, L2)\n function step(τ)\n U = globalhtc(τ, Ta, h, ε)\n M = stiffness(U, k1, k2, L1, L2)\n f = forcing(q1, U, Ta)\n return inv(M) * f\n end\n return step\nend\n\nnothing; #hide","category":"page"},{"location":"Notebooks/01-Composite-Conduction/","page":"Steady-state heat transfer","title":"Steady-state heat transfer","text":"The solution of the problem now is rather simple. One provides an initial guess which is used to compute a new solution estimate. Because under some circumstances the estimate could start wiggling and diverge, it is worth implementing a relaxation step interpolating the new and previous approximations as T_n=βT_n+(1-β)T_n-1. In case beta1 solution is slowly updated by giving a higher weigth to the previous estimate and the problem is said to be underrelaxed. Overelaxation is the opposite scenario but can be problematic in some cases. Some metric, here the maximum relative change in absolute value, must be used to determine solution convergence.","category":"page"},{"location":"Notebooks/01-Composite-Conduction/","page":"Steady-state heat transfer","title":"Steady-state heat transfer","text":"function solveproblem(T, step; maxiter = 20, rtol = 1.0e-15, β = 1.0)\n τ = copy(T)\n\n for i in range(1, maxiter)\n τ[:] = β * step(T[3]) + (1 - β) * T\n Δ = maximum(abs.(τ .- T) ./ T)\n T[:] = τ\n\n println(\"Residual $(i) ..... $(@sprintf(\"%.6e\", Δ))\")\n\n if Δ < rtol\n break\n end\n end\n\n return T\nend\n\nnothing; #hide","category":"page"},{"location":"Notebooks/01-Composite-Conduction/","page":"Steady-state heat transfer","title":"Steady-state heat transfer","text":"Below we make use of the created tooling to solve the model.","category":"page"},{"location":"Notebooks/01-Composite-Conduction/","page":"Steady-state heat transfer","title":"Steady-state heat transfer","text":"guess = [Ta; Ta; Ta]\n\nstep = createproblem(Ta, h, ε, k1, k2, L1, L2)\n\nT = solveproblem(guess, step)","category":"page"},{"location":"Notebooks/01-Composite-Conduction/","page":"Steady-state heat transfer","title":"Steady-state heat transfer","text":"Temperature profile across plate with radiation enabled.","category":"page"},{"location":"Notebooks/01-Composite-Conduction/","page":"Steady-state heat transfer","title":"Steady-state heat transfer","text":"with_theme() do\n fig = Figure(size = (700, 300))\n ax = Axis(fig[1, 1])\n lines!(ax, ustrip(T); color = :red, linestyle = :dash)\n scatter!(ax, ustrip(T); color = :red)\n ax.xlabel = \"Node\"\n ax.ylabel = \"Temperature [K]\"\n ax.xticks = 1:3\n xlims!(ax, (0.95, 3.05))\n ylims!(ax, (300, 350))\n fig\nend","category":"page"},{"location":"References/@Sanyal2022a/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Sanyal2022a/","page":"-","title":"-","text":"title: \"RAMP-Net: A robust adaptive MPC for quadrotors via physics-informed neural network\" authors: Sourav Sanyal, Kaushik Roy year: 2022 URL: https://doi.org/10.48550/arXiv.2209.09025 –-","category":"page"},{"location":"Notes/Drafts/#Drafts","page":"Drafts","title":"Drafts","text":"","category":"section"},{"location":"Notes/Drafts/#LAMMPS","page":"Drafts","title":"LAMMPS","text":"","category":"section"},{"location":"Notes/Drafts/","page":"Drafts","title":"Drafts","text":"Do exercises\ncreate a diffusion cell (one side initialized to a different type of atoms)","category":"page"},{"location":"Notes/Drafts/#Julia-para-cientistas","page":"Drafts","title":"Julia para cientistas","text":"","category":"section"},{"location":"Notes/Drafts/","page":"Drafts","title":"Drafts","text":"Lacos E Condicionais\nFuncoes E Despacho\nPacotes E Ecossistema\nAvaliando Performance\nAlgebra Linear\nExpressoes Regulares\nExecucao Concorrente\nTrabalhando Com Arquivos\nBibliotecas Graficas\nGraficos Para Publicacoes\nTipos De Dados E Estruturas\nMetaprogramacao E Macros\nInteroperacao Com C\nEquações diferenciais ordinárias\nEquações diferenciais parciais\nRedes neuronais clássicas\nAprendizado com suporte físico\nAnálise quantitativa de imagens\nCriando seus próprios pacotes","category":"page"},{"location":"Notes/Drafts/#Basilisk","page":"Drafts","title":"Basilisk","text":"","category":"section"},{"location":"Notes/Drafts/#Planned-studies","page":"Drafts","title":"Planned studies","text":"","category":"section"},{"location":"Notes/Drafts/","page":"Drafts","title":"Drafts","text":"Learning steps","category":"page"},{"location":"Notes/Drafts/","page":"Drafts","title":"Drafts","text":"- [x] [Base tutorial](http://basilisk.fr/Tutorial)\n- [ ] [Review of main examples](http://basilisk.fr/src/examples/README)\n- [ ] [Review of extra examples (1)](http://basilisk.fr/sandbox/Antoonvh/README)\n- [ ] [Review of extra examples (2)](http://basilisk.fr/sandbox/M1EMN/README)\n- [ ] [Review of main tests](http://basilisk.fr/src/test/README)\n- [ ] [Review of built-it solvers](http://basilisk.fr/src/README)\n- [ ] [Dimensional analysis tutorial](http://basilisk.fr/Tutorial.dimensions)\n- [ ] [Basilisk C](http://basilisk.fr/Basilisk%20C)\n- [ ] [Past papers](http://basilisk.fr/Bibliography)","category":"page"},{"location":"Notes/Drafts/","page":"Drafts","title":"Drafts","text":"Concluding projects","category":"page"},{"location":"Notes/Drafts/","page":"Drafts","title":"Drafts","text":"- [ ] Convection equation ([samples](http://basilisk.fr/sandbox/M1EMN/README))\n- [ ] Diffusion equation ([samples](http://basilisk.fr/sandbox/M1EMN/README))\n- [ ] Burgers equation\n- [ ] Cavity flow Navier-Stokes","category":"page"},{"location":"Notes/Drafts/","page":"Drafts","title":"Drafts","text":"Advanced projects","category":"page"},{"location":"Notes/Drafts/","page":"Drafts","title":"Drafts","text":"- [ ] Carbonitriding of low alloy steels\n- [ ] JMAK kinetics and heat transfer\n- [ ] Drag-out flow in plate coating\n- [ ] Graf's acetylene decomposition flow\n- [ ] Rising bubble in fluid","category":"page"},{"location":"Notes/Drafts/","page":"Drafts","title":"Drafts","text":"Things to check","category":"page"},{"location":"Notes/Drafts/","page":"Drafts","title":"Drafts","text":"- [ ] Running simulations in parallel\n- [ ] Evaporation and combustion in sandbox\n- [ ] Examples with [granular flows](http://basilisk.fr/sandbox/M1EMN/README#examples-of-granular-flows) and [silos](http://basilisk.fr/sandbox/M1EMN/Exemples/granular_sandglass.c)\n- [ ] Rising bubble with granular flow","category":"page"},{"location":"Notes/Drafts/#Teaching-plan","page":"Drafts","title":"Teaching plan","text":"","category":"section"},{"location":"Notes/Drafts/#Week-1","page":"Drafts","title":"Week 1","text":"","category":"section"},{"location":"Notes/Drafts/","page":"Drafts","title":"Drafts","text":"In-class: Fundamentals of scientific computing (history, basics of hardware, number representations, numerical solvers, parallel computing, etc.)\nTutorial: Basics of Linux command line, VIM text editor, programming in C (with mini-projects), and Basilisk C.","category":"page"},{"location":"Notes/Drafts/#Using-ElmerGUI","page":"Drafts","title":"Using ElmerGUI","text":"","category":"section"},{"location":"Notes/Drafts/#Creating-a-case","page":"Drafts","title":"Creating a case","text":"","category":"section"},{"location":"Notes/Drafts/","page":"Drafts","title":"Drafts","text":"It is counter-intuitive, but to load a mesh in GUI one goes to File > Open, which can load several formats. Here we are using only UNV meshes generated by gmsh.\nActivate heat equation for all bodies in system and rename it to Conduction.\nAdd two materials (Portland and Refractory) and configure properties are needed.","category":"page"},{"location":"Notes/Drafts/","page":"Drafts","title":"Drafts","text":"- Under `General` provide density and heat capacity\n- Under `Heat Equation` set heat conductivity","category":"page"},{"location":"Notes/Drafts/","page":"Drafts","title":"Drafts","text":"Create an initial condition and set temperature to 298.15 K for all bodies.\nCreate boundary conditions:","category":"page"},{"location":"Notes/Drafts/","page":"Drafts","title":"Drafts","text":"- `Heat Source`at boundary 8 and set a Dirichlet condition for temperature of 813.15 K\n- `Symmetry` at boundaries 6/7 and set heat flux to 0 W (no gradient).\n- `Soil` at boundaries 1/2 and set a Dirichlet condition for temperature of 298.15 K.\n- `Environment` at boundary 3 and provide an HTC of 10 W/m/K and temperature of 298.15 K.","category":"page"},{"location":"Notes/Drafts/","page":"Drafts","title":"Drafts","text":"Go to Model > Setup and check it defaults to steady state simulation.\nInspect Model > Summary... before generating SIF file.","category":"page"},{"location":"Notes/Drafts/","page":"Drafts","title":"Drafts","text":"Generate SIF with Sif > Generate.\nNow simulation is ready to Run > Start solver, inspect logs after finish.\nBefore serious postprocessing, inspect solution with Run > Start ElmerVTK","category":"page"},{"location":"Software/OpenFOAM11/#OpenFOAM-11","page":"OpenFOAM 11","title":"OpenFOAM 11","text":"","category":"section"},{"location":"Software/OpenFOAM11/#Tips-and-reminders","page":"OpenFOAM 11","title":"Tips and reminders","text":"","category":"section"},{"location":"Software/OpenFOAM11/#General-topics","page":"OpenFOAM 11","title":"General topics","text":"","category":"section"},{"location":"Software/OpenFOAM11/","page":"OpenFOAM 11","title":"OpenFOAM 11","text":"When converting to OpenFOAM v11 viscosityModel instead of transportModel in physicalProperties files. Currently setting transportModel Newtonian does not raise any errors.\nWhen working with a 2-D extruded mesh (1-cell in thickness), the mass flow rate must be scaled by the width of the domain to keep consistency with what would be expected in 3-D.","category":"page"},{"location":"Software/OpenFOAM11/#Granular-flows","page":"OpenFOAM 11","title":"Granular flows","text":"","category":"section"},{"location":"Software/OpenFOAM11/","page":"OpenFOAM 11","title":"OpenFOAM 11","text":"It is a good idea to set SOI to a value higher than zero (dimensioned to match the global time-scale of the problem) so that flow is fully developed before particles arrive.\nIf it makes sense to do so, make parameter U0 in the entries of injectionModels of cloudProperties identical to the velocity specified for the corresponding path. In most cases this applies, except when modeling a particle jet that originates from another source outside of the computational domain.","category":"page"},{"location":"Software/OpenFOAM11/#Troubleshooting","page":"OpenFOAM 11","title":"Troubleshooting","text":"","category":"section"},{"location":"Software/OpenFOAM11/","page":"OpenFOAM 11","title":"OpenFOAM 11","text":"Wedge patch '' is not planar.: in some cases a warning regarding the precision of face normal vectors might be issued in axisymmetric cases. As it has been reported by Gerhard Holzinger, when generating the mesh the value of writePrecision in controlDict might be the cause of this problem. Increasing its value should be enough for solving the problem, and if you want to save disk space with unnecessary precision, it can be decreased back for problem solution. Notice that if running in parallel, renumberMesh and decomposePar must be run before falling back to the lower write precision.","category":"page"},{"location":"Software/OpenFOAM11/#Solver-modules","page":"OpenFOAM 11","title":"Solver modules","text":"","category":"section"},{"location":"Software/OpenFOAM11/#multicomponentFluid","page":"OpenFOAM 11","title":"multicomponentFluid","text":"","category":"section"},{"location":"Software/OpenFOAM11/","page":"OpenFOAM 11","title":"OpenFOAM 11","text":"In OpenFOAM v11 solver module multicomponentFluid provides approaches for setting up the simulation of fluids with multiple species, including combustion.","category":"page"},{"location":"Software/OpenFOAM11/#Tutorial-cases","page":"OpenFOAM 11","title":"Tutorial cases","text":"","category":"section"},{"location":"Software/OpenFOAM11/","page":"OpenFOAM 11","title":"OpenFOAM 11","text":"DLRALTS\nSandiaD_LTS\naachenBomb: global combustion kinetics of droplets released in a box.\ncounterFlowFlame2D\ncounterFlowFlame2DLTS\ncounterFlowFlame2DLTSGRITDAC\ncounterFlowFlame2D_GRI\ncounterFlowFlame2DGRITDAC\nfilter\nlockExchange\nmembrane\nnc7h16: zero dimensional model of homogeneous kinetics.\nparcelInBox: evaporation of a single water particle in a closed box.\nsimplifiedSiwek: co-combustion of coal and limestone clouds in Siwek chamber.\nsmallPoolFire2D\nsmallPoolFire3D\nverticalChannel: water droplet evaporation in a vertical channel.\nverticalChannelLTS: same as verticalChannel but with local time-stepping.\nverticalChannelSteady: same as verticalChannel but at steady state.","category":"page"},{"location":"Software/OpenFOAM11/#Built-cases","page":"OpenFOAM 11","title":"Built cases","text":"","category":"section"},{"location":"Software/OpenFOAM11/","page":"OpenFOAM 11","title":"OpenFOAM 11","text":"aachenBombSteady: this case was created as a tentative to simulate a steady spray combustion starting from aachenBomb tutorial but after several failures it became a case of its own. The case we have today was built bottom-up, from a simple flow in a box to the level of combustion, including several intermediate steps used to understand how the different options and models interacted. For now its name will remain like this in reference to where it started, but in the future I might come up with a better one.","category":"page"},{"location":"Software/OpenFOAM11/#incompressibleDenseParticleFluid","page":"OpenFOAM 11","title":"incompressibleDenseParticleFluid","text":"","category":"section"},{"location":"Software/OpenFOAM11/","page":"OpenFOAM 11","title":"OpenFOAM 11","text":"In OpenFOAM v11 solver module incompressibleDenseParticleFluid provides approaches for setting up a transient flow interacting with particles. It handles incompressible isothermal flows with fluid-particle interactions, including cases with dense packing of particles, such as packed beds or initialization of fluidized beds for solution with other approaches.","category":"page"},{"location":"Software/OpenFOAM11/#Tutorial-cases-2","page":"OpenFOAM 11","title":"Tutorial cases","text":"","category":"section"},{"location":"Software/OpenFOAM11/","page":"OpenFOAM 11","title":"OpenFOAM 11","text":"Goldschmidt\nGoldschmidtMPPIC\ncolumn\ncyclone\ninjectionChannel","category":"page"},{"location":"Software/OpenFOAM11/#Boundary-fields","page":"OpenFOAM 11","title":"Boundary fields","text":"","category":"section"},{"location":"Software/OpenFOAM11/","page":"OpenFOAM 11","title":"OpenFOAM 11","text":"Boundary fields in general are almost the same as any case in pure fluid simulations but transported quantities must be named by appending the name of the continuous phase specified in constant/physicalProperties as continuousPhaseName . To make it simple let's call this phase air in what follows. Notice that pressure file name remains unchanged since it is not really transported as you don't have an equation in the form of Reynolds transport theorem for it.","category":"page"},{"location":"Software/OpenFOAM11/","page":"OpenFOAM 11","title":"OpenFOAM 11","text":"That said, we have things as k.air and U.air. The particularity here is that you must provide phi for all hydrodynamic solution variables (such as k.air, U.air) in outlets, what is implicit in single phase flow models. That means that an outlet for velocity should include something as","category":"page"},{"location":"Software/OpenFOAM11/","page":"OpenFOAM 11","title":"OpenFOAM 11","text":"outlet\n{\n\ttype pressureInletOutletVelocity;\n\tphi phi.air;\n\tinletValue uniform (0 0 0);\n\tvalue uniform (0 0 0);\n}","category":"page"},{"location":"Software/OpenFOAM11/#Creating-cloudProperties","page":"OpenFOAM 11","title":"Creating cloudProperties","text":"","category":"section"},{"location":"Software/OpenFOAM11/","page":"OpenFOAM 11","title":"OpenFOAM 11","text":"Most default values in solution dictionary should be fine for typical fluid-particle applications, but for phase interaction it is important to configure coupled as true so that drag forces are applied to the particles and conversely, particles disturb the fluid. ","category":"page"},{"location":"Software/OpenFOAM11/","page":"OpenFOAM 11","title":"OpenFOAM 11","text":"We must also turn on cellValueSourceCorrection, which will correct cell values using latest transfer information. These elements as given in the following block (you can check the full dictionary in the official OpenFOAM tutorials for other details).","category":"page"},{"location":"Software/OpenFOAM11/","page":"OpenFOAM 11","title":"OpenFOAM 11","text":"solution\n{\n\tcoupled                   true;\n\ttransient                 yes;\n\tcellValueSourceCorrection on;\n\tmaxCo                     0.7;\n\n\t...\n}","category":"page"},{"location":"Software/OpenFOAM11/","page":"OpenFOAM 11","title":"OpenFOAM 11","text":"Being a momentum cloud, MPPICCloud makes use only of patchInteractionModel localInteraction for interaction with the environment and collisions between particles are not taken into account (that is not completely true if you consider the packing effects that can be enabled as collisions). Again, it is better to go deeper in the case studies.","category":"page"},{"location":"Software/OpenFOAM11/","page":"OpenFOAM 11","title":"OpenFOAM 11","text":"The main models for setting up a particle simulation in constant/cloudProperties are the [[Physical Models#Injection models|InjectionModel]] and the ParticleForce to be used. Notice that when dealing with incompressibleDenseParticleFluid the main ParticleForce models other than gravity are inherited by DenseDragForce.","category":"page"},{"location":"Software/OpenFOAM11/#Drag-models","page":"OpenFOAM 11","title":"Drag models","text":"","category":"section"},{"location":"Software/OpenFOAM11/","page":"OpenFOAM 11","title":"OpenFOAM 11","text":"The simplest drag model supported by discrete phase models in OpenFOAM is the sphereDrag option implemented as described by Amsden1989 [6]. Its application domain is targeted to describe fuel droplet particles in air. The drag coefficient in this case is defined in terms of particle Reynolds number mathrmRe_d as","category":"page"},{"location":"Software/OpenFOAM11/","page":"OpenFOAM 11","title":"OpenFOAM 11","text":"C_D = begincases\ndfrac24mathrmRe_dleft(1 + dfracmathrmRe_d^236right) mathrmRe_dle100012pt\n\n0424textotherwise\nendcases","category":"page"},{"location":"Software/OpenFOAM11/","page":"OpenFOAM 11","title":"OpenFOAM 11","text":"where mathrmRe_d is expressed as","category":"page"},{"location":"Software/OpenFOAM11/","page":"OpenFOAM 11","title":"OpenFOAM 11","text":"mathrmRe_d = dfracrhovertu+u^prime-vdmu(hatT)quadtextwherequadhatT=dfracT+2T_d3","category":"page"},{"location":"Software/OpenFOAM11/","page":"OpenFOAM 11","title":"OpenFOAM 11","text":"With these expressions and making C_D^prime=C_DmathrmRe_d we have the drag force over a particle of diameter d expressed as","category":"page"},{"location":"Software/OpenFOAM11/","page":"OpenFOAM 11","title":"OpenFOAM 11","text":"vecF=dfrac34dfracmmu(hatT)C_D^primerho_dd^2","category":"page"},{"location":"Software/OpenFOAM11/","page":"OpenFOAM 11","title":"OpenFOAM 11","text":"[!todo] The code implementation already provides both mu(hatT) and mathrmRe_d computed to the drag model. Additional inspection on how these quantities are evaluated is required. Also note that Amsden1989 [6] provides the equations formulated in the radius, not diameter, what might generate some confusion.","category":"page"},{"location":"Software/OpenFOAM11/","page":"OpenFOAM 11","title":"OpenFOAM 11","text":"This formulation is also used as part of distortedSphereDrag implementation , which makes use of the same C_D now referred to as C_Dsphere with a modified law accounting for particle distortion in the breakup mechanism of fuel sprays, as discussed by Liu1993 [14]. The updated drag coefficient is then expressed in terms of drop distortion y from TAB (Taylor Analogy Breakup) model from Reitz1987 [15].","category":"page"},{"location":"Software/OpenFOAM11/","page":"OpenFOAM 11","title":"OpenFOAM 11","text":"C_D = C_Dsphere(1+2632y)","category":"page"},{"location":"Software/OpenFOAM11/","page":"OpenFOAM 11","title":"OpenFOAM 11","text":"[!info] The distortedSphereDrag model is not available for MPPIC clouds and it is also not used anywhere in the tutorials or source code. For not it does not work yet apparently.","category":"page"},{"location":"Software/OpenFOAM11/#Combustion-models","page":"OpenFOAM 11","title":"Combustion models","text":"","category":"section"},{"location":"Software/OpenFOAM11/","page":"OpenFOAM 11","title":"OpenFOAM 11","text":"Models inheriting from combustionModel base class. If you are reading this section you might also be interested in building the case and testing the combustion with OpenSmoke++ or Cantera.","category":"page"},{"location":"Software/OpenFOAM11/","page":"OpenFOAM 11","title":"OpenFOAM 11","text":"Type Group Description\nEDC Turbulent Eddy Dissipation Concept turbulent combustion model. Probably the most popular approach for simulation of gas combustion in industrial processes.\nlaminar Laminar \nPaSR Laminar \nFDS Single-step \ninfinitelyFastChemistry Single-step \ndiffusion Single-step \nzoneCombustion Filter Enable the reactions within the specified list of cell-zones and set to zero elsewhere.\nnoCombustion Dummy Dummy combustion model for 'no combustion'.","category":"page"},{"location":"Software/OpenFOAM11/#Cloud-models","page":"OpenFOAM 11","title":"Cloud models","text":"","category":"section"},{"location":"Software/OpenFOAM11/","page":"OpenFOAM 11","title":"OpenFOAM 11","text":"In OpenFOAM, a cloud designate the injection of a secondary phase, generally solid particles or droplets, in a primary continuous carrier phase. The dictionary cloudProperties is identified in tutorials related to the following solver modules:","category":"page"},{"location":"Software/OpenFOAM11/","page":"OpenFOAM 11","title":"OpenFOAM 11","text":"incompressibleDenseParticleFluid\nincompressibleFluid\nmulticomponentFluid\nmultiRegion","category":"page"},{"location":"Software/OpenFOAM11/","page":"OpenFOAM 11","title":"OpenFOAM 11","text":"The default version of the dictionary provided here is not yet documented as of OpenFOAM v11 and does not contain any solver specific configurations, so the users must refer to the tutorial cases for setting up their studies. A post-processing particle tracking function associated to the dictionary is provided here (untested).","category":"page"},{"location":"Software/OpenFOAM11/","page":"OpenFOAM 11","title":"OpenFOAM 11","text":"Currently OpenFOAM implements the following cloud types:","category":"page"},{"location":"Software/OpenFOAM11/","page":"OpenFOAM 11","title":"OpenFOAM 11","text":"Cloud Description\nCollidingCloud Adds collisions to clouds.\nMomentumCloud Templated base class for momentum cloud. Adds particle forces and dispersion, injection, patch interaction, stochastic collision, and surface film models to clouds.\nParcelCloud Outermost template for parcel clouds.\nThermoCloud Templated base class for thermodynamic cloud. Adds heat transfer.\nMPPICCloud Adds MPPIC modelling to clouds.\nReactingCloud Templated base class for reacting cloud. Supports single phase with variable composition and phase change modeling.\nReactingMultiphaseCloud Templated base class for multiphase reacting cloud. Supports multiphase composition, devolatilization, and surface reactions.\nSprayCloud Templated base class for spray cloud. Supports atomization and break-up models.","category":"page"},{"location":"Software/OpenFOAM11/#[CollidingCloud](https://cpp.openfoam.org/v11/classFoam_1_1CollidingCloud.html)-models","page":"OpenFOAM 11","title":"CollidingCloud models","text":"","category":"section"},{"location":"Software/OpenFOAM11/#Collision-models","page":"OpenFOAM 11","title":"Collision models","text":"","category":"section"},{"location":"Software/OpenFOAM11/","page":"OpenFOAM 11","title":"OpenFOAM 11","text":"These inherit from CollisionModel.","category":"page"},{"location":"Software/OpenFOAM11/","page":"OpenFOAM 11","title":"OpenFOAM 11","text":"Type Description\nNoCollision Dummy class for the none option.\nPairCollision Material properties can be set in detail in sub-dictionary constantProperties. Notice that this is computationally expensive","category":"page"},{"location":"Software/OpenFOAM11/#[MomentumCloud](https://cpp.openfoam.org/v11/classFoam_1_1MomentumCloud.html)-models","page":"OpenFOAM 11","title":"MomentumCloud models","text":"","category":"section"},{"location":"Software/OpenFOAM11/#Dispersion-models","page":"OpenFOAM 11","title":"Dispersion models","text":"","category":"section"},{"location":"Software/OpenFOAM11/#Injection-models","page":"OpenFOAM 11","title":"Injection models","text":"","category":"section"},{"location":"Software/OpenFOAM11/","page":"OpenFOAM 11","title":"OpenFOAM 11","text":"These inherit from InjectionModel and implement how particles are injected into a continuous medium. The following table summarizes some of the available models.","category":"page"},{"location":"Software/OpenFOAM11/","page":"OpenFOAM 11","title":"OpenFOAM 11","text":"Type Description\nconeInjection Inject particles in a number of oriented cones. Particles can be generated from a single point or over a disk. Injection can be made at constant velocity, pressure, or with a flow rate and discharge coefficient.","category":"page"},{"location":"Software/OpenFOAM11/#Patch-interaction-models","page":"OpenFOAM 11","title":"Patch interaction models","text":"","category":"section"},{"location":"Software/OpenFOAM11/#Stochastic-collision-models","page":"OpenFOAM 11","title":"Stochastic collision models","text":"","category":"section"},{"location":"Software/OpenFOAM11/#Surface-film-models","page":"OpenFOAM 11","title":"Surface film models","text":"","category":"section"},{"location":"Software/OpenFOAM11/#[ThermoCloud](https://cpp.openfoam.org/v11/classFoam_1_1ThermoCloud.html)-models","page":"OpenFOAM 11","title":"ThermoCloud models","text":"","category":"section"},{"location":"Software/OpenFOAM11/#Heat-transfer-models","page":"OpenFOAM 11","title":"Heat transfer models","text":"","category":"section"},{"location":"Software/OpenFOAM11/","page":"OpenFOAM 11","title":"OpenFOAM 11","text":"These inherit from HeatTransferModel. It is possible to provide a Stefan flow approximation to the models by using flag BirdCorrection in the models dictionaries.","category":"page"},{"location":"Software/OpenFOAM11/","page":"OpenFOAM 11","title":"OpenFOAM 11","text":"Type Description\nNoHeatTransfer Dummy class for the none option.\nRanzMarshall The Ranz-Marshall Ranz1952 [16] correlation for heat transfer. For a more recent review, see e.g. Aissa2015a [17].","category":"page"},{"location":"Software/OpenFOAM11/#[MPPICCloud](https://cpp.openfoam.org/v11/classFoam_1_1MPPICCloud.html)-models","page":"OpenFOAM 11","title":"MPPICCloud models","text":"","category":"section"},{"location":"Software/OpenFOAM11/#Packing-models","page":"OpenFOAM 11","title":"Packing models","text":"","category":"section"},{"location":"Software/OpenFOAM11/#Isotropy-models","page":"OpenFOAM 11","title":"Isotropy models","text":"","category":"section"},{"location":"Software/OpenFOAM11/#Damping-models","page":"OpenFOAM 11","title":"Damping models","text":"","category":"section"},{"location":"Software/OpenFOAM11/#[ReactingCloud](https://cpp.openfoam.org/v11/classFoam_1_1ReactingCloud.html)-models","page":"OpenFOAM 11","title":"ReactingCloud models","text":"","category":"section"},{"location":"Software/OpenFOAM11/#Phase-change-models","page":"OpenFOAM 11","title":"Phase change models","text":"","category":"section"},{"location":"Software/OpenFOAM11/","page":"OpenFOAM 11","title":"OpenFOAM 11","text":"These inherit from PhaseChangeModel. ","category":"page"},{"location":"Software/OpenFOAM11/","page":"OpenFOAM 11","title":"OpenFOAM 11","text":"Type Description\nNoPhaseChange Dummy class for the none option.\nLiquidEvaporation Liquid evaporation model using ideal gas assumption.\nLiquidEvaporationBoil Liquid evaporation model using ideal gas assumption and includes boiling model based on Zuo2000a [18].","category":"page"},{"location":"Software/OpenFOAM11/#[ReactingMultiphaseCloud](https://cpp.openfoam.org/v11/classFoam_1_1ReactingMultiphaseCloud.html)-models","page":"OpenFOAM 11","title":"ReactingMultiphaseCloud models","text":"","category":"section"},{"location":"Software/OpenFOAM11/#Devolatilization-models","page":"OpenFOAM 11","title":"Devolatilization models","text":"","category":"section"},{"location":"Software/OpenFOAM11/#Surface-reaction-models","page":"OpenFOAM 11","title":"Surface reaction models","text":"","category":"section"},{"location":"Software/OpenFOAM11/#[SprayCloud](https://cpp.openfoam.org/v11/classFoam_1_1SprayCloud.html)-models","page":"OpenFOAM 11","title":"SprayCloud models","text":"","category":"section"},{"location":"Software/OpenFOAM11/#Atomization-models","page":"OpenFOAM 11","title":"Atomization models","text":"","category":"section"},{"location":"Software/OpenFOAM11/#Breakup-models","page":"OpenFOAM 11","title":"Breakup models","text":"","category":"section"},{"location":"Software/OpenFOAM11/","page":"OpenFOAM 11","title":"OpenFOAM 11","text":"These inherit from BreakupModel for handling particle breakup.","category":"page"},{"location":"Software/OpenFOAM11/","page":"OpenFOAM 11","title":"OpenFOAM 11","text":"Type Description\nNoBreakup \nPilchErdman \nReitzDiwakar Secondary breakup model adapted to high pressure fuel sprays.\nReitzKHRT Secondary breakup model which uses the Kelvin-Helmholtz instability theory to predict the stripped droplets and the Raleigh-Taylor instability as well.\nSHF \nETAB Enhanced TAB model for non-evaporating fuel sprays.\nTAB ","category":"page"},{"location":"Software/OpenFOAM11/#Composition-models","page":"OpenFOAM 11","title":"Composition models","text":"","category":"section"},{"location":"Software/OpenFOAM11/","page":"OpenFOAM 11","title":"OpenFOAM 11","text":"These inherit from CompositionModel and consists of carrier species (via thermo package), and additional liquids and solids. They are not attached to a type of cloud and each model supports their own cloud types.","category":"page"},{"location":"Software/OpenFOAM11/","page":"OpenFOAM 11","title":"OpenFOAM 11","text":"Type Description Support\nNoComposition Dummy class for the none option. \nSingleMixtureFraction Templated parcel multi-phase, multi-component class. ReactingMultiphaseCloud\nSinglePhaseMixture Templated parcel single phase, multi-component class. SprayCloud, ReactingCloud","category":"page"},{"location":"References/@Wang2022a/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Wang2022a/","page":"-","title":"-","text":"title: Respecting causality is all you need for training physics-informed neural networks authors: Sifan Wang, Shyam Sankaran, Paris Perdikaris year: 2022 URL: https://doi.org/10.48550/arXiv.2203.07404 Drive: https://1drv.ms/b/s!Ar4x-UlrYAiZla8hHROyjqNuK7otnA?e=U8kabk –-","category":"page"},{"location":"References/@Wang2022a/","page":"-","title":"-","text":"Supporting materials at GitHub.","category":"page"},{"location":"References/@Kee2017/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Kee2017/","page":"-","title":"-","text":"title: \"Chemically reacting flow theory, modeling, and simulation\" authors: Robert J. Kee, Michael E. Coltrin, Peter Glarborg, Huayang Zhu year: 2017 –-","category":"page"},{"location":"References/@Nabian2021a/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Nabian2021a/","page":"-","title":"-","text":"title: Efficient training of physics-informed neural networks via importance sampling authors: Mohammad Amin Nabian, Rini Jasmine Gladstone, Hadi Meidani year: 2021 URL: https://doi.org/10.48550/arXiv.2104.12325 –-","category":"page"},{"location":"References/@Shomate1954/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Shomate1954/","page":"-","title":"-","text":"title: A method for evaluating and correlating thermodynamic data authors: C. Howard Shomate year: 1954 –-","category":"page"},{"location":"Software/Fluent/#Ansys-Fluent","page":"Ansys Fluent","title":"Ansys Fluent","text":"","category":"section"},{"location":"Software/Fluent/#General-purpose","page":"Ansys Fluent","title":"General purpose","text":"","category":"section"},{"location":"Software/Fluent/","page":"Ansys Fluent","title":"Ansys Fluent","text":"Macro Notes\nData_Valid_P Test if parameters required by UDF have been initialized. It is a good practice to use this macro on top of UDF's to avoid crashes.\nMessage Displays a message, to be used from host.\nError Display and throw an error message. Compiled only.","category":"page"},{"location":"Software/Fluent/#Macro-parallelization","page":"Ansys Fluent","title":"Macro parallelization","text":"","category":"section"},{"location":"Software/Fluent/","page":"Ansys Fluent","title":"Ansys Fluent","text":"Macro Notes\nPRINCIPAL_FACE_P When looping across faces in a thread using begin_f_loop (or another equivalent macro) in a parallel setting, we might access elements that actually belong to other nodes (because of how MPI works). This macro allows us to check the current face is part of the chunk belonging to current node, what allows us to avoid computing a quantity multiple times, leading to wrong results. Compiled only.\nRP_HOST Used in #if directives to tell code must be evaluated only in host.\nRP_NODE Used in #if directives to tell code must be evaluated only in nodes.\nPRF_GRSUM1 Performs aggregation of real R values through sum SUM1. This function is called in nodes and there are other cousins for different aggregations.\nnode_to_host_{type}_{n} Pass n values of type from node to host. It is called after, e.g. aggregations such as PRF_GRSUM1 are used in node. There is also an equivalent host_to_node_{type}_{n}.","category":"page"},{"location":"References/@Guo2023a/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Guo2023a/","page":"-","title":"-","text":"title: \"Unraveling the design pattern of physics-informed neural networks: Series 01\" authors: Shuai Guo year: 2023 URL: https://towardsdatascience.com/unraveling-the-design-pattern-of-physics-informed-neural-networks-series-01-8190df459527 –-","category":"page"},{"location":"References/@Guo2023a/","page":"-","title":"-","text":"In this post, the author discusses the work by [[@Wu2022a]] in what concerns the adaptive (resampling and refinement) residual point distribution to boost training and accuracy.","category":"page"},{"location":"References/@Guo2023a/","page":"-","title":"-","text":"Approaches:","category":"page"},{"location":"References/@Guo2023a/","page":"-","title":"-","text":"RAD: residual-based adaptive distribution (more expensive)\nRAR-D: residual-based adaptive refinement with distribution (robust)\nBoth are less useful under smooth solutions (activate when required)","category":"page"},{"location":"References/@Guo2023a/","page":"-","title":"-","text":"Key idea: resample with a probability proportional to residual","category":"page"},{"location":"References/@Guo2023a/","page":"-","title":"-","text":"p(x) propto fracvarepsilon^k(x)𝔼varepsilon^k(x)+C","category":"page"},{"location":"References/@Guo2023a/","page":"-","title":"-","text":"Other references of interest are:","category":"page"},{"location":"References/@Guo2023a/","page":"-","title":"-","text":"[[@Lu2019a]]: residual-based adaptive refinement (RAR-D with high k)\n[[@Nabian2021a]]: importance sampling (RAD with k=1 and c=0)","category":"page"},{"location":"References/@Fiedler2007a/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Fiedler2007a/","page":"-","title":"-","text":"title: \"Calculation of the effective thermal conductivity in composites using finite element and monte carlo methods\" authors: Thomas Fiedler, Andreas Öchsner, Nilindu Muthubandara, Irina V. Belova, Graeme E. Murch year: 2007 –-","category":"page"},{"location":"References/@Koh1973a/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Koh1973a/","page":"-","title":"-","text":"title: \"Prediction of thermal conductivity and electrical resistivity of porous metallic materials\" authors: J. C. Y. Koh, Anthony Fortini year: 1973 –-","category":"page"},{"location":"References/@Aparicio1994/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Aparicio1994/","page":"-","title":"-","text":"title: \"Ammonia synthesis kinetics: Surface chemistry, rate expressions, and kinetic analysis\" authors: Luis M. Aparicio, James A. Dumesic year: 1994 –-","category":"page"},{"location":"References/@Chikhi2020a/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Chikhi2020a/","page":"-","title":"-","text":"title: \"Effective thermal conductivity of porous biomaterials: Numerical investigation\" authors: M. Chikhi year: 2020 –-","category":"page"},{"location":"References/@Guo2023f/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Guo2023f/","page":"-","title":"-","text":"title: \"Unraveling the design pattern of physics-informed neural networks: Series 06\" authors: Shuai Guo year: 2023 URL: https://towardsdatascience.com/unraveling-the-design-pattern-of-physics-informed-neural-networks-part-06-bcb3557199e2 –-","category":"page"},{"location":"References/@Lagaris1997a/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Lagaris1997a/","page":"-","title":"-","text":"title: Artificial neural networks for solving ordinary and partial differential equations authors: I. E. Lagaris, A. Likas, D. I. Fotiadis year: 1997 –-","category":"page"},{"location":"References/@Pia2016a/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Pia2016a/","page":"-","title":"-","text":"title: \"Porosity and pore size distribution influence on thermal conductivity of yttria-stabilized zirconia: Experimental findings and model predictions\" authors: Giorgio Pia, Ludovica Casnedi, Ulrico Sanna year: 2016 –-","category":"page"},{"location":"References/@Gidaspow1994/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Gidaspow1994/","page":"-","title":"-","text":"title: \"Multiphase flow and fluidization: continuum and kinetic theory descriptions with applications\" authors: Dimitri Gidaspow year: 1994 URL: TODO –-","category":"page"},{"location":"Science/01-Theoretical-Physics/#Theoretical-Physics","page":"Theoretical Physics","title":"Theoretical Physics","text":"","category":"section"},{"location":"Science/01-Theoretical-Physics/","page":"Theoretical Physics","title":"Theoretical Physics","text":"This notes track my studies of theoretical physics rather than providing content by themselves. Currently I am following the text by Joos1958 [23] because of its self-contained aspects. The text assumes previous knowledge of Calculus, and the reader familiar with the subject may simply skim the first part; in some topics the author provide better physical context than normal Calculus textbooks, what may be interesting.","category":"page"},{"location":"Modules/DryFlowsheet/#DryFlowsheet","page":"DryFlowsheet","title":"DryFlowsheet","text":"","category":"section"},{"location":"Modules/DryFlowsheet/","page":"DryFlowsheet","title":"DryFlowsheet","text":"CurrentModule = DryFlowsheet\nEditURL = \"https://github.com/wallytutor/WallyToolbox.jl/blob/main/docs/src/Modules/DryFlowsheet.md\"","category":"page"},{"location":"Modules/DryFlowsheet/","page":"DryFlowsheet","title":"DryFlowsheet","text":"Modules = [ DryFlowsheet ]","category":"page"},{"location":"Modules/DryFlowsheet/#DryFlowsheet.CooledCrushingMill","page":"DryFlowsheet","title":"DryFlowsheet.CooledCrushingMill","text":"Represents a crushing device with cooling system.\n\nModels\n\n:TARGET_COOLANT_TEMP evaluates the heat transfer lost to coolant provided a target final stream temperature given by keyword argument temp_out. Product temperature is updated through an EnergyStream built with energy exchange computed through exchanged_heat, so that numerical value can be slightly different from target value.\n:USING_GLOBAL_HTC makes use of a global heat transfer coefficient to evaluate heat flux across the cooling stream.\n\nAttributes\n\nrawmeal: The input meal applied to crushing process.\nproduct: The output material stream at the end of product pipeline.\ncoolant: The output material stream at the end of cooling pipeline.\npower: The power applied to the crushing process [W]\nloss: The heat exchanged in between product and cooling pipelines [W].\nglobalhtc: Global heat transfer coefficient [W/K].\n\n\n\n\n\n","category":"type"},{"location":"Modules/DryFlowsheet/#DryFlowsheet.EnergyStream","page":"DryFlowsheet","title":"DryFlowsheet.EnergyStream","text":"Represents an energy stream.\n\nAttributes\n\nḣ: Energy flow provided by stream [W].\n\n\n\n\n\n","category":"type"},{"location":"Modules/DryFlowsheet/#DryFlowsheet.MaterialStream","page":"DryFlowsheet","title":"DryFlowsheet.MaterialStream","text":"Represents a material stream.\n\nAttributes\n\nṁ: Material mass flow rate [kg/s].\nT: Stream temperature [K].\nP: Stream pressure [Pa].\nY: Components mass fractions [-].\npipeline: Materials pipeline associated to Y.\n\n\n\n\n\n","category":"type"},{"location":"Modules/DryFlowsheet/#DryFlowsheet.SolidsSeparator","page":"DryFlowsheet","title":"DryFlowsheet.SolidsSeparator","text":"Represents a solids separator with efficiency η.\n\nTo-do's\n\nAdd inverse model to automatically tune efficiency η.\n\nAttributes\n\nη: Solids separation efficiency [-].\nsource: The stream to be separated into solids and others.\nsolids: The output solids stream.\nothers: The output remaining stream.\n\n\n\n\n\n","category":"type"},{"location":"Modules/DryFlowsheet/#DryFlowsheet.StreamPipeline","page":"DryFlowsheet","title":"DryFlowsheet.StreamPipeline","text":"Array of materials to include in a stream.\n\n\n\n\n\n","category":"type"},{"location":"Modules/DryFlowsheet/#DryFlowsheet.TransportPipeline","page":"DryFlowsheet","title":"DryFlowsheet.TransportPipeline","text":"Represents a pipeline with heat transfer.\n\nModels\n\n:TARGET_EXIT_TEMP evaluates the heat transfer lost to environment provided a target final stream temperature given by keyword argument temp_out. Product temperature is updated through an EnergyStream built with energy exchange computed through exchanged_heat, so that numerical value can be slightly different from target value.\n:USING_GLOBAL_HTC makes use of a global heat transfer coefficient to evaluate heat flux across the pipe.\n\nTo-do's\n\nImplement heat transfer losses through a convective heat transfer coefficient (HTC) computed from a suitable Nusselt number, for use of pipeline in simulation mode.\n\nAttributes\n\nproduct: The output material stream at the end of pipeline.\npower: The heat exchanged in pipeline [W].\n\n\n\n\n\n","category":"type"},{"location":"Modules/DryFlowsheet/#DryFlowsheet.cooled_crushing-Tuple{}","page":"DryFlowsheet","title":"DryFlowsheet.cooled_crushing","text":"Manage use of CooledCrushingMill with different models.\n\n\n\n\n\n","category":"method"},{"location":"Modules/DryFlowsheet/#DryFlowsheet.enthalpyflowrate","page":"DryFlowsheet","title":"DryFlowsheet.enthalpyflowrate","text":"Enthalpy flow rate of given stream [W].\n\n\n\n\n\n","category":"function"},{"location":"Modules/DryFlowsheet/#DryFlowsheet.exchanged_heat-Tuple{MaterialStream, Any}","page":"DryFlowsheet","title":"DryFlowsheet.exchanged_heat","text":"Heat exchanged with stream to match outlet temperature.\n\n\n\n\n\n","category":"method"},{"location":"Modules/DryFlowsheet/#DryFlowsheet.transport_pipe-NTuple{4, Any}","page":"DryFlowsheet","title":"DryFlowsheet.transport_pipe","text":"Manage use of TransportPipeline with different models.\n\n\n\n\n\n","category":"method"},{"location":"References/@MaierKelley1932/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@MaierKelley1932/","page":"-","title":"-","text":"title: \"An equation for the representation of high-temperature heat content data\" authors: Charles G. Maier, Kenneth Keith Kelley year: 1932 –-","category":"page"},{"location":"Notebooks/06-Heat-Transfer-FVM/#Heat-transfer-with-FVM","page":"Heat transfer with FVM","title":"Heat transfer with FVM","text":"","category":"section"},{"location":"Notebooks/06-Heat-Transfer-FVM/","page":"Heat transfer with FVM","title":"Heat transfer with FVM","text":"using CairoMakie\nusing DelaunayTriangulation\nusing DifferentialEquations\nusing FiniteVolumeMethod\nnothing; #hide","category":"page"},{"location":"Notebooks/06-Heat-Transfer-FVM/","page":"Heat transfer with FVM","title":"Heat transfer with FVM","text":"# Values at boundaries:\nTxl = 813.15\nTxr = 298.15\n\n# Domain physical dimensions:\nLx = (0.0, 0.15)\nLy = (0.0, 0.05)\n\n# Number of cells over each direction:\nnx = 25\nny = 5\n\n# Integration time:\nfinal_time = 2.0\nnothing; #hide","category":"page"},{"location":"Notebooks/06-Heat-Transfer-FVM/","page":"Heat transfer with FVM","title":"Heat transfer with FVM","text":"# Position dependent initial condition:\nf_ic = (x, y) -> 298.15\n\n# Diffusion coefficient:\ndiffusion_function = (x, y, t, u, p) -> begin\n (x < 0.05) ? 1.0 : 5.0\nend\nnothing; #hide","category":"page"},{"location":"Notebooks/06-Heat-Transfer-FVM/","page":"Heat transfer with FVM","title":"Heat transfer with FVM","text":"# XXX: documentation of single_boundary is wrong!\ntri = triangulate_rectangle(Lx..., Ly..., nx, ny, single_boundary = false)\n\n# Create finite volume mesh:\nmesh = FVMGeometry(tri)\n\n# Display grid\nwith_theme() do\n fig, ax, sc = triplot(tri)\n fig\nend","category":"page"},{"location":"Notebooks/06-Heat-Transfer-FVM/","page":"Heat transfer with FVM","title":"Heat transfer with FVM","text":"# Set boundary conditions: bottom, right, top, left\nBCs = let\n functions = (\n (x, y, t, u, p) -> zero(u),\n (x, y, t, u, p) -> Txr * one(u),\n (x, y, t, u, p) -> zero(u),\n (x, y, t, u, p) -> Txl * one(u),\n )\n\n conditions = (\n Neumann,\n Dirichlet,\n Neumann,\n Dirichlet,\n )\n\n BoundaryConditions(mesh, functions, conditions)\nend\n\ninitial_condition = [f_ic(x, y) for (x, y) in DelaunayTriangulation.each_point(tri)]\nnothing; #hide","category":"page"},{"location":"Notebooks/06-Heat-Transfer-FVM/","page":"Heat transfer with FVM","title":"Heat transfer with FVM","text":"prob = FVMProblem(mesh, BCs;\n diffusion_function,\n initial_condition,\n final_time)\n\nsol = solve(prob, saveat=1.0)","category":"page"},{"location":"Notebooks/06-Heat-Transfer-FVM/","page":"Heat transfer with FVM","title":"Heat transfer with FVM","text":"with_theme() do\n levels = 250:50.0:850\n limits = extrema(levels)\n colormap = :turbo\n flipaxis = true\n\n width = 450\n height = 150\n xlabel = \"x [m]\"\n ylabel = \"y [m]\"\n\n n_sol = size(sol.u)[1]\n m_sol = div(n_sol, 2)\n\n fig = Figure(fontsize = 24, figure_padding = 35)\n\n for (i, j) in zip(1:3, (1, m_sol, n_sol))\n ax = Axis(fig[i, 1]; width, height, xlabel, ylabel,\n title = \"t = $(sol.t[j])\", titlealign = :left)\n\n tricontourf!(ax, tri, sol.u[j]; levels, colormap,)\n tightlimits!(ax)\n\n hideydecorations!(ax)\n end\n \n Colorbar(fig[:, end+3]; limits, colormap, flipaxis,\n ticks=(300:100:900, string.(300:100:900)))\n\n resize_to_layout!(fig)\n fig\nend","category":"page"},{"location":"References/@Saario2005a/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Saario2005a/","page":"-","title":"-","text":"title: Heavy fuel oil combustion in a cylindrical laboratory furnace: measurements and modeling authors: A. Saario, A. Rebola, P. Coelho, M. Costa, A. Oksanen year: 2005 –-","category":"page"},{"location":"Notebooks/08-Kramers-Model-Validation/#Kramers'-model","page":"Kramers' model","title":"Kramers' model","text":"","category":"section"},{"location":"Notebooks/08-Kramers-Model-Validation/","page":"Kramers' model","title":"Kramers' model","text":"using WallyToolbox\n\nusing CairoMakie\nusing CSV\nusing DataFrames\nusing Latexify\nusing Printf","category":"page"},{"location":"Notebooks/08-Kramers-Model-Validation/#Reference-data","page":"Kramers' model","title":"Reference data","text":"","category":"section"},{"location":"Notebooks/08-Kramers-Model-Validation/","page":"Kramers' model","title":"Kramers' model","text":"Below we provide a set of partial data from Kramers (1952) Table 3.","category":"page"},{"location":"Notebooks/08-Kramers-Model-Validation/","page":"Kramers' model","title":"Kramers' model","text":"const DATA_TABLE3 = \"\"\"\\\nρ,γ,tan(β),n,ṁ,prod_dimless,η̄ᵣ,hold_real\n1480.0,36.0,0.0094,0.059,5.15e-03,18.3,0.111,8.10\n1480.0,36.0,0.0094,0.090,2.68e-03,6.25,0.054,5.00\n1480.0,36.0,0.0094,0.195,1.32e-02,14.2,0.088,7.75\n1480.0,36.0,0.0094,0.232,7.24e-03,6.55,0.043,3.85\n1480.0,36.0,0.0100,0.040,6.38e-03,29.7,0.169,13.3\n1480.0,36.0,0.0100,0.040,5.00e-03,23.2,0.144,11.2\n1480.0,36.0,0.0100,0.069,9.20e-03,24.8,0.150,10.6\n1480.0,36.0,0.0100,0.069,6.53e-03,17.6,0.113,8.50\n1480.0,36.0,0.0100,0.106,1.50e-02,27.8,0.162,12.2\n1480.0,36.0,0.0100,0.159,1.20e-02,14.0,0.092,7.49\n1480.0,36.0,0.0100,0.238,1.55e-02,12.1,0.083,7.48\n1480.0,36.0,0.0100,0.238,1.19e-02,9.22,0.068,6.13\n\"\"\"\nnothing; #hide","category":"page"},{"location":"Notebooks/08-Kramers-Model-Validation/","page":"Kramers' model","title":"Kramers' model","text":"\"Compares approximate analytical to numerical solution.\"#hide\nfunction solvekiln(; L, D, Φ, ω, β, γ, d, show = true)#hide\n model = RotaryKilnBedSolution(;#hide\n model = SymbolicLinearKramersModel(),#hide\n L = L,#hide\n R = D / 2.0,#hide\n Φ = Φ / 3600.0,#hide\n ω = ω / 60.0,#hide\n β = deg2rad(β),#hide\n γ = deg2rad(γ),#hide\n d = d / 1000.0#hide\n )#hide\n#hide\n optim = kramersnlapprox(;#hide\n z = model.z,#hide\n R = D / 2.0,#hide\n Φ = Φ / 3600.0,#hide\n ω = ω / 60.0,#hide\n β = deg2rad(β),#hide\n γ = deg2rad(γ),#hide\n d = d / 1000.0#hide\n )#hide\n#hide\n f = nothing#hide\n ax = nothing#hide\n#hide\n if show#hide\n f = Figure()#hide\n ax = Axis(f[1, 1])#hide\n#hide\n lines!(ax, 100model.z/L, 100model.h, linewidth = 3, label = \"Numerical\")#hide\n lines!(ax, 100optim.z/L, 100optim.h, linewidth = 3, label = \"Analytical\")#hide\n#hide\n a = @sprintf(\"%.1f\", model.ηₘ)#hide\n b = @sprintf(\"%.1f\", optim.ηₘ)#hide\n title = \"Loading: $(a)% (numerical) | $(b)% (analytical)\"#hide\n#hide\n ax.title = title#hide\n ax.xlabel = \"Coordinate [%]\"#hide\n ax.ylabel = \"Bed height [cm]\"#hide\n ax.xticks = 0.0:20.0:100.0#hide\n xlims!(ax, extrema(ax.xticks.val))#hide\n end#hide\n#hide\n return model, optim, f, ax#hide\nend#hide\nnothing; # hide","category":"page"},{"location":"Notebooks/08-Kramers-Model-Validation/","page":"Kramers' model","title":"Kramers' model","text":"\"Reference case for alumina kiln testing.\"# hide\nfunction aluminakiln(ṁ, ω; show = false)# hide\n # Density of bed [kg/m³]# hide\n ρ = 800.0# hide\n L = 34.0# hide\n D = 1.5# hide\n β = atan(0.025)# hide\n# hide\n model, optim, f, ax = solvekiln(# hide\n L = L,# hide\n D = D,# hide\n Φ = (1000// 24) * ṁ / ρ,# hide\n ω = ω,# hide\n β = rad2deg(β),# hide\n γ = 33.0,# hide\n d = 0.050,# hide\n show = show# hide\n )# hide\n# hide\n τₚ = perryresidence(L, ω, D, β)# hide\n# hide\n return model, optim, f, ax, τₚ# hide\nend# hide\nnothing; # hide","category":"page"},{"location":"Notebooks/08-Kramers-Model-Validation/","page":"Kramers' model","title":"Kramers' model","text":"\"Run `aluminakiln` against some known conditions.\"# hide\nfunction scanaluminakiln()# hide\n ṁlist = [33.6, 43.2]# hide\n ωlist = [0.85, 1.20]# hide\n# hide\n df = DataFrame(# hide\n ṁ = Float64[],# hide\n ω = Float64[],# hide\n η̄ = Float64[],# hide\n τᵢ = Float64[],# hide\n τₚ = Float64[]# hide\n )# hide\n# hide\n for ṁ ∈ ṁlist, ω ∈ ωlist# hide\n model, _, _, _, τ = aluminakiln(ṁ, ω, show = false)# hide\n η̄ = round(model.ηₘ, digits = 0)# hide\n τᵢ = round(model.τ / 60.0, digits = 0)# hide\n τₚ = round(τ, digits = 0)# hide\n push!(df, [ṁ ω η̄ τᵢ τₚ])# hide\n end# hide\n# hide\n return df# hide\nend# hide\nnothing; # hide","category":"page"},{"location":"Notebooks/08-Kramers-Model-Validation/","page":"Kramers' model","title":"Kramers' model","text":"in1_to_m1(v) = 0.0254 * v# hide\nft1_to_m1(v) = in1_to_m1(12.0) * v# hide\nft3_to_m3(v) = ft1_to_m1(1.0)^3 * v# hide\n# hide\n# Kiln length [m]# hide\nL = ft1_to_m1(45.0)# hide\n# hide\n# Kiln diameter [m]# hide\nD = 2 * ft1_to_m1(3.1)# hide\n# hide\n# Volume flow rate [m³/h]# hide\nΦ = ft3_to_m3(6.1) * 60# hide\n# hide\n# Rotation rate (+0.0005) [rev/min]# hide\nω = 0.0505 * 60.0# hide\n# hide\n# Kiln slope (0.5in/ft) [°]# hide\nβ = rad2deg(atan(0.5 / 12))# hide\n# hide\n# Repose angle [°]# hide\nγ = 45.0# hide\n# hide\n# Particle size [mm]# hide\nd = 0.050# hide\n# hide\n# Conversions to match model inputs.# hide\nR = D / 2.0# hide\nΦ = Φ / 3600.0# hide\nω = ω / 60.0# hide\nβ = deg2rad(β)# hide\nγ = deg2rad(γ)# hide\nd = d / 1000.0# hide\n# hide\n# Create problem container.# hide\nkramers = RotaryKilnBedSolution(;# hide\n model = SymbolicLinearKramersModel(),# hide\n L = L,# hide\n R = R,# hide\n Φ = Φ,# hide\n ω = ω,# hide\n β = β,# hide\n γ = γ,# hide\n d = d# hide\n)# hide\n# hide\noptim = kramersnlapprox(;# hide\n z = kramers.z,# hide\n R = R,# hide\n Φ = Φ,# hide\n ω = ω,# hide\n β = β,# hide\n γ = γ,# hide\n d = d# hide\n)# hide\n# hide\nkramers_NΦ = dimlessNΦ(R, β, ω, Φ, γ)# hide\nkramers_Nₖ = dimlessNₖ(L, R, β, γ)# hide\nkramers_η̄ₛ = sullivansηₘ(R, β, ω, Φ, γ)# hide\nkramers_ref = kramers# hide\noptim_ref = optim# hide\nnothing;# hide","category":"page"},{"location":"Notebooks/08-Kramers-Model-Validation/#Sample-reference-case","page":"Kramers' model","title":"Sample reference case","text":"","category":"section"},{"location":"Notebooks/08-Kramers-Model-Validation/","page":"Kramers' model","title":"Kramers' model","text":"Here we make use of the current implementation to check if it correctly approximates the last example provided in reference paper from [[@Kramers1952]]. To minimize rounding errors causes by unit conversions, we provide the required functions to convert from imperial to international system in the solution process.","category":"page"},{"location":"Notebooks/08-Kramers-Model-Validation/","page":"Kramers' model","title":"Kramers' model","text":"The next table summarizes the results. It is seen that the dimensionless numbers are well approximated. It must be emphasized that the reference estimates η̄ᵣ by a graphical method – it was 1952 – and the current value is considered a good enough approximation. Additionally, the equation was not integrated numerically as done here, but engineering relationships were used in the approximation. That said, the proper loading to be considered in our days is η̄ᵢ.","category":"page"},{"location":"Notebooks/08-Kramers-Model-Validation/","page":"Kramers' model","title":"Kramers' model","text":"DataFrame(# hide\n Quantity = [# hide\n \"NΦ\",# hide\n \"Nₖ\",# hide\n \"η̄ᵣ\",# hide\n \"η̄ᵢ\",# hide\n ],# hide\n Reference = [# hide\n \"1.15\",# hide\n \"1.17\",# hide\n \"5.65\",# hide\n @sprintf(\"%.2f\", optim_ref.ηₘ)# hide\n ],# hide\n Computed = [# hide\n @sprintf(\"%.2f\", kramers_NΦ),# hide\n @sprintf(\"%.2f\", kramers_Nₖ),# hide\n @sprintf(\"%.2f\", kramers_η̄ₛ),# hide\n @sprintf(\"%.2f\", kramers_ref.ηₘ)# hide\n ]# hide\n)# hide","category":"page"},{"location":"Notebooks/08-Kramers-Model-Validation/","page":"Kramers' model","title":"Kramers' model","text":"Note: the last value in column Reference above is not provided in Kramers' paper but computed from the approximate analytical solution provided by the authors. As we see here, it may get >20% error under some circumstances.","category":"page"},{"location":"Notebooks/08-Kramers-Model-Validation/#Verification-of-*Table-3*","page":"Kramers' model","title":"Verification of Table 3","text":"","category":"section"},{"location":"Notebooks/08-Kramers-Model-Validation/","page":"Kramers' model","title":"Kramers' model","text":"In the next cell we provide the kiln dimensions used by Kramers (1952) to experimentally validate the model. Some data from their Tab. 3 is then loaded and all rows are simulated with current model. Fractional hold-up seems to be well correlated at least to a few percent of the reference value.","category":"page"},{"location":"Notebooks/08-Kramers-Model-Validation/","page":"Kramers' model","title":"Kramers' model","text":"let# hide\n Dₖ = 0.197# hide\n Lₖ = 1.780# hide\n dₖ = 0.0012# hide\n# hide\n table3 = DataFrame(CSV.File(IOBuffer(DATA_TABLE3)))# hide\n table3[!, \"η̄ᵢ\"] = zeros(length(table3[!, \"η̄ᵣ\"]))# hide\n table3[!, \"η̄ᵣ\"] *= 100# hide\n# hide\n model = SymbolicLinearKramersModel()# hide\n# hide\n for (i, row) in enumerate(eachrow(table3))# hide\n Φ = 3600.0 * row[\"ṁ\"] / row[\"ρ\"]# hide\n ω = row[\"n\"] * 60.0# hide\n β = rad2deg(atan(row[\"tan(β)\"]))# hide\n γ = row[\"γ\"]# hide\n# hide\n kramers = RotaryKilnBedSolution(;# hide\n model = model,# hide\n L = Lₖ,# hide\n R = Dₖ / 2.0,# hide\n Φ = Φ / 3600.0,# hide\n ω = ω / 60.0,# hide\n β = deg2rad(β),# hide\n γ = deg2rad(γ),# hide\n d = dₖ / 1000.0# hide\n )# hide\n# hide\n table3[i, \"η̄ᵢ\"] = round(kramers.ηₘ, digits = 1)# hide\n end# hide\n# hide\n exclude = [\"ρ\", \"γ\", \"prod_dimless\", \"hold_real\"]# hide\n select(table3, Not(exclude))# hide\nend# hide","category":"page"},{"location":"Notebooks/08-Kramers-Model-Validation/#Dimensionless-profiles","page":"Kramers' model","title":"Dimensionless profiles","text":"","category":"section"},{"location":"Notebooks/08-Kramers-Model-Validation/","page":"Kramers' model","title":"Kramers' model","text":"Next step in validation is to check profiles in dimensionless format, as done by Kramers in their Fig. 3. Notice that here we used the numerical integration curves instead of the analytical approximation of profiles, so reproduction and consequences of results are not exactly the same.","category":"page"},{"location":"Notebooks/08-Kramers-Model-Validation/","page":"Kramers' model","title":"Kramers' model","text":"let# hide\n ρ = 1480.0# hide\n L = 20.0# hide\n D = 0.197# hide\n Φ = 5.15e-03 / ρ * 3600# hide\n ω = 0.059 * 60# hide\n β = rad2deg(atan(0.0094))# hide\n γ = 36.0# hide\n# hide\n # Conversions to match model inputs.# hide\n R = D / 2.0# hide\n Φ = Φ / 3600.0# hide\n ω = ω / 60.0# hide\n β = deg2rad(β)# hide\n γ = deg2rad(γ)# hide\n# hide\n # Things held constant in loop.# hide\n NΦ = dimlessNΦ(R, β, ω, Φ, γ)# hide\n Nₖ = dimlessNₖ(L, R, β, γ)# hide\n model = SymbolicLinearKramersModel()# hide\n# hide\n f = Figure()# hide\n ax = Axis(f[1, 1])# hide\n# hide\n for d in [0.05, 0.10, 0.15, 0.193, 0.25]# hide\n kramers = RotaryKilnBedSolution(;# hide\n model = model,# hide\n L = L,# hide\n R = R,# hide\n Φ = Φ,# hide\n ω = ω,# hide\n β = β,# hide\n γ = γ,# hide\n d = d * R * NΦ# hide\n )# hide\n# hide\n # Dimensionless axes.# hide\n z = kramers.z# hide\n h = kramers.h / (R * NΦ)# hide\n z = @. (L - z) / L * 1 / (NΦ * Nₖ)# hide\n z = @. z[1] - z# hide\n# hide\n label = @sprintf(\"%.3f\", d)# hide\n lines!(ax, z, h; linewidth = 2, label = label)# hide\n end# hide\n# hide\n ax.title = \"Dimensionless loading curves\"# hide\n ax.xlabel = \"Coordinate\"# hide\n ax.ylabel = \"Bed height\"# hide\n ax.xticks.val = 0.0:0.1:0.5# hide\n ax.yticks.val = 0.05:0.05:0.25# hide\n xlims!(ax, extrema(ax.xticks.val))# hide\n ylims!(ax, extrema(ax.yticks.val))# hide\n axislegend(ax; position = :rb)# hide\n# hide\n f# hide\nend# hide","category":"page"},{"location":"Notebooks/08-Kramers-Model-Validation/#Comparison-with-analytical","page":"Kramers' model","title":"Comparison with analytical","text":"","category":"section"},{"location":"Notebooks/08-Kramers-Model-Validation/","page":"Kramers' model","title":"Kramers' model","text":"The final step in model validation is to compare the approximate analytical solution proposed by Kramers and the results of numerical integration. It is worth mentioning that numerical integration remains the recommended method because one does not need to verify the ranges of validity of analytical approximation for every use case.","category":"page"},{"location":"Notebooks/08-Kramers-Model-Validation/","page":"Kramers' model","title":"Kramers' model","text":"let# hide\n _, _, f, ax = solvekiln(# hide\n L = 10.0,# hide\n D = 1.0,# hide\n Φ = 1.0,# hide\n ω = 1.0,# hide\n β = 3.0,# hide\n γ = 45.0,# hide\n d = 0.001# hide\n )# hide\n# hide\n ax.yticks = 0.0:4.0:20.0# hide\n ylims!(ax, extrema(ax.yticks.val))# hide\n f# hide\nend# hide","category":"page"},{"location":"Notebooks/08-Kramers-Model-Validation/#Industrial-cases","page":"Kramers' model","title":"Industrial cases","text":"","category":"section"},{"location":"Notebooks/08-Kramers-Model-Validation/","page":"Kramers' model","title":"Kramers' model","text":"The following illustrates a practical use case of the model. Next we scan a parameter space to confirm once again the model suitability as an alternative to analytical engineering estimations as per Perry's .","category":"page"},{"location":"Notebooks/08-Kramers-Model-Validation/","page":"Kramers' model","title":"Kramers' model","text":"let# hide\n ṁ = 33.6# hide\n ω = 0.85# hide\n _, _, f, ax, _ = aluminakiln(ṁ, ω, show = true)# hide\n ax.yticks = 0.0:6.0:30.0# hide\n ylims!(ax, extrema(ax.yticks.val))# hide\n f# hide\nend# hide","category":"page"},{"location":"Notebooks/08-Kramers-Model-Validation/","page":"Kramers' model","title":"Kramers' model","text":"The following table confirms the expected values as per Perry's handbook.","category":"page"},{"location":"Notebooks/08-Kramers-Model-Validation/","page":"Kramers' model","title":"Kramers' model","text":"scanaluminakiln() # hide","category":"page"},{"location":"References/@Luikov1968a/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Luikov1968a/","page":"-","title":"-","text":"title: \"Thermal conductivity of porous systems\" authors: A.V. Luikov, A.G. Shashkov, L.L. Vasiliev, Yu.E. Fraiman year: 1968 –-","category":"page"},{"location":"References/@Lu2019a/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Lu2019a/","page":"-","title":"-","text":"title: \"DeepXDE: A deep learning library for solving differential equations\" authors: Lu Lu, Xuhui Meng, Zhiping Mao, George E. Karniadakis year: 2019 URL: https://doi.org/10.48550/arXiv.1907.04502 Drive: https://1drv.ms/b/s!Ar4x-UlrYAiZla8eg-cL7mDKg_muqQ?e=hcIqTb –-","category":"page"},{"location":"Software/Basilisk/#Basilisk","page":"Basilisk","title":"Basilisk","text":"","category":"section"},{"location":"Software/Basilisk/","page":"Basilisk","title":"Basilisk","text":"The goal of this material is to provide support to teaching introductory computational fluid mechanics with aid of Basilisk. The studies are based on commented tutorials and a documentation guide extending what is already provided with the package.","category":"page"},{"location":"Software/Basilisk/","page":"Basilisk","title":"Basilisk","text":"Before going over the tutorials, you need some C knowledge. In the future I intend to provide a synthetic version applied to Basilisk students only. For now, the referred one is pretty good.","category":"page"},{"location":"Software/Basilisk/#First-steps","page":"Basilisk","title":"First steps","text":"","category":"section"},{"location":"Software/Basilisk/","page":"Basilisk","title":"Basilisk","text":"The source code for the studies is provided here. The repository keeps a copy of Basilisk at a version that will work with all modified tutorials. It may be eventually updated, but in that case functioning of tutorials will be tested. You will need to clone it then following the steps to compile Basilisk before starting. After building Basilisk, instead of adding variables to your environment, consider sourcing them temporarily with help of source activate.sh using the provided script.","category":"page"},{"location":"Software/Basilisk/","page":"Basilisk","title":"Basilisk","text":"All tutorials are found under src. Just enter the tutorials you want to follow using the command line and run make. This not only will compile, but will also run and post-process results.","category":"page"},{"location":"Software/Basilisk/#Project-management","page":"Basilisk","title":"Project management","text":"","category":"section"},{"location":"Software/Basilisk/","page":"Basilisk","title":"Basilisk","text":"Although Basilisk is a very interesting dialect of C, its documentation is still old-fashioned and lack some structuration. Also sample programs are not written to be easily managed and extended for use in variant cases. Here we propose a structure for creating better projects with Basilisk:","category":"page"},{"location":"Software/Basilisk/","page":"Basilisk","title":"Basilisk","text":"A Basilisk project lives in its own folder: one executable means one directory.\nA simpler Makefile than Basilisk's default one is used for project building.\nThe main file is called app.c and contains a very simple structure as provided in the dummy listing bellow. All the logic of a project, i.e. the events, is implemented in separate header files that are included after Basilisk includes.","category":"page"},{"location":"Software/Basilisk/","page":"Basilisk","title":"Basilisk","text":"// Definitions\n#define LEVEL 7\n#define ...\n\n// Basilisk includes.\n#include \"grid/multigrid.h\"\n#include \"run.h\"\n#include ... \n\n// Project includes.\n#include \"project-base.h\"\n#include \"project-init.h\"\n#include \"project-post.h\"\n#include \"project-exec.h\"\n\nint main() {\n\tinit_grid(1 << LEVEL);\n\t...\n\trun();\n}","category":"page"},{"location":"Software/Basilisk/#Parallel-computing","page":"Basilisk","title":"Parallel computing","text":"","category":"section"},{"location":"Software/Basilisk/","page":"Basilisk","title":"Basilisk","text":"Currently I have not tried Basilisk in parallel (actually I did so a few years back but don't really remember the steps). Since there is no dedicated tutorial for going parallel, here are the notes I am taking for writing something in that sense:","category":"page"},{"location":"Software/Basilisk/","page":"Basilisk","title":"Basilisk","text":"Tutorial isotropic.c has notes on how to run parallel in some of its parent universities supercomputers. Probably some steps there might be recycled here.","category":"page"},{"location":"Software/Basilisk/","page":"Basilisk","title":"Basilisk","text":"","category":"page"},{"location":"Software/Basilisk/#Introductory-tutorials","page":"Basilisk","title":"Introductory tutorials","text":"","category":"section"},{"location":"Software/Basilisk/#Basilisk-basics","page":"Basilisk","title":"Basilisk basics","text":"","category":"section"},{"location":"Software/Basilisk/","page":"Basilisk","title":"Basilisk","text":"Reference Tutorial\nCode 01-Tutorial-Basics\nNotes Basilisk is a conceptual solver for investigating problems in a Cartesian domain.

Different steps of the simulations are set by event's, which use a specific syntax do indicate whether they depend on a time or iteration condition. These steps might include setup of initial conditions, storage of intermediate results or solution, grid refinement, etc.

For iterating over arrays Basilisk provides a foreach()loop extending the C-language.

A standard Makefile is provided by Basilisk for managing common workflows.

Check the tips.","category":"page"},{"location":"Software/Basilisk/#Game-of-life","page":"Basilisk","title":"Game of life","text":"","category":"section"},{"location":"Software/Basilisk/","page":"Basilisk","title":"Basilisk","text":"Reference Conway’s game of life\nCode 02-Game-of-life\nNotes A simple implementation of Conway's game of life to get used with syntax.","category":"page"},{"location":"Software/Basilisk/#Brusselator","page":"Basilisk","title":"Brusselator","text":"","category":"section"},{"location":"Software/Basilisk/","page":"Basilisk","title":"Basilisk","text":"Reference Coupled reaction-diffusion equations\nCode 03-Brusselator\nNotes Solves the 2D Brusselator, a theoretical autocatalytic reaction diffusion system. The set of parameters used in the study for the stable Turin points where the ones proposed by Pena2001a [19]. Interesting material for preparing courses extending this to other oscillating systems can be found here.","category":"page"},{"location":"Software/Basilisk/#Ginzburg-Landau","page":"Basilisk","title":"Ginzburg-Landau","text":"","category":"section"},{"location":"Software/Basilisk/","page":"Basilisk","title":"Basilisk","text":"Reference The complex Ginzburg-Landau equation\nCode 04-Ginzburg-Landau\nNotes Solves the complex Ginzburg-Landau equation describing the nonlinear evolution of disturbances near the transition from a stable to unstable state of a system. Additional materials are provided here. It would be a good project to include the term alpha in the equation and the Laplacian term that goes with it.","category":"page"},{"location":"Software/Basilisk/#Distance-field","page":"Basilisk","title":"Distance field","text":"","category":"section"},{"location":"Software/Basilisk/","page":"Basilisk","title":"Basilisk","text":"Reference Distance field computation from a 3D model\nCode 05-Distance-Field\nNotes This can be seen as a particular case of pre-/post-processing. It can prove useful when initializing domains with scanned surfaces in STL or other compatible format. Additional steps must be taken for compilation with rendering (modifications to Makefile). Iteration over dimensions can be done with foreach_dimension().","category":"page"},{"location":"Software/Basilisk/#Wavelet-transform","page":"Basilisk","title":"Wavelet transform","text":"","category":"section"},{"location":"Software/Basilisk/","page":"Basilisk","title":"Basilisk","text":"Reference Wavelet transforms and filtering\nCode 06-Wavelet-Transform\nNotes Provides a tutorial on wavelet transform and associated filters. It is presented as the basis to understand mesh adaptation in Basilisk. Recommended reading of Sweldens1998a [20].","category":"page"},{"location":"Software/Basilisk/#Navier-Stokes-equation","page":"Basilisk","title":"Navier-Stokes equation","text":"","category":"section"},{"location":"Software/Basilisk/#Decaying-turbulence","page":"Basilisk","title":"Decaying turbulence","text":"","category":"section"},{"location":"Software/Basilisk/","page":"Basilisk","title":"Basilisk","text":"Reference Decaying two-dimensional turbulence\nCode 07-Decaying-Turbulence\nNotes For solving Euler equation with vorticity-stream formulation one uses header file navier-stokes/stream.h. The examples makes a first usage of dimensional quantities for vorticity initialization.","category":"page"},{"location":"Software/Basilisk/#Vortex-street","page":"Basilisk","title":"Vortex street","text":"","category":"section"},{"location":"Software/Basilisk/","page":"Basilisk","title":"Basilisk","text":"Reference Bénard–von Kármán Vortex Street for flow around a cylinder\nCode 08-Vortex-Street\nNotes Solves the flow around a solid object using the navier-stokes/centered.h solver and introduced the use of passive scalars (tracer). Notice we modify L0, which among many other magic variables is defined in common.h. Illustrates the use of solid and intersection to accomplish complex domains.","category":"page"},{"location":"Software/Basilisk/#Vortex-shedding","page":"Basilisk","title":"Vortex shedding","text":"","category":"section"},{"location":"Software/Basilisk/","page":"Basilisk","title":"Basilisk","text":"Reference Vortex shedding behind a sphere\nCode 09-Vortex-Shedding\nNotes Solution of Navier-Stokes equations in an adaptive domain embedding an sphere. Vortex detection is made with functionalities from lambda2.h implemented following Jeong1995a [21].","category":"page"},{"location":"Software/Basilisk/#Porous-medium","page":"Basilisk","title":"Porous medium","text":"","category":"section"},{"location":"Software/Basilisk/","page":"Basilisk","title":"Basilisk","text":"Reference Stokes flow through a complex 3D porous medium\nCode 10-Porous-Medium\nNotes ","category":"page"},{"location":"Software/Basilisk/#Periodic-box","page":"Basilisk","title":"Periodic box","text":"","category":"section"},{"location":"Software/Basilisk/","page":"Basilisk","title":"Basilisk","text":"Reference Forced isotropic turbulence in a triply-periodic box\nCode 11-Periodic-Box\nNotes ","category":"page"},{"location":"Software/Basilisk/#Two-phase-flows","page":"Basilisk","title":"Two-phase flows","text":"","category":"section"},{"location":"Software/Basilisk/#Pulsed-atomization","page":"Basilisk","title":"Pulsed atomization","text":"","category":"section"},{"location":"Software/Basilisk/","page":"Basilisk","title":"Basilisk","text":"Reference Atomisation of a pulsed liquid jet\nCode 12-Pulsed-Atomisation\nNotes ","category":"page"},{"location":"Software/Basilisk/#Bubble-rising","page":"Basilisk","title":"Bubble rising","text":"","category":"section"},{"location":"Software/Basilisk/","page":"Basilisk","title":"Basilisk","text":"Reference Bubble rising in a large tank\nCode 13-Bubble-Rising\nNotes ","category":"page"},{"location":"Software/Basilisk/#Rotating-cylinder","page":"Basilisk","title":"Rotating cylinder","text":"","category":"section"},{"location":"Software/Basilisk/","page":"Basilisk","title":"Basilisk","text":"Reference Flow in a rotating bottom-driven cylindrical container\nCode 14-Rotating-Cylinder\nNotes ","category":"page"},{"location":"Software/Basilisk/#Moving-Tangaroa","page":"Basilisk","title":"Moving Tangaroa","text":"","category":"section"},{"location":"Software/Basilisk/","page":"Basilisk","title":"Basilisk","text":"Reference Two-phase flow around RV Tangaroa\nCode 15-Moving-Tangaroa\nNotes ","category":"page"},{"location":"Software/Basilisk/#Geophysical-applications","page":"Basilisk","title":"Geophysical applications","text":"","category":"section"},{"location":"Software/Basilisk/#Indian-Tsunami","page":"Basilisk","title":"Indian Tsunami","text":"","category":"section"},{"location":"Software/Basilisk/","page":"Basilisk","title":"Basilisk","text":"Reference The 2004 Indian Ocean tsunami\nCode 16-Indian-Tsunami\nNotes ","category":"page"},{"location":"Software/Basilisk/#Tohoku-Tsunami","page":"Basilisk","title":"Tohoku Tsunami","text":"","category":"section"},{"location":"Software/Basilisk/","page":"Basilisk","title":"Basilisk","text":"Reference The 2011 Tohoku tsunami\nCode 17-Tohoku-Tsunami\nNotes ","category":"page"},{"location":"Software/Basilisk/#Train-of-Solitons","page":"Basilisk","title":"Train of Solitons","text":"","category":"section"},{"location":"Software/Basilisk/","page":"Basilisk","title":"Basilisk","text":"Reference Breakup of a rectangular perturbation into a train of solitons\nCode 18-Train-of-Solitons\nNotes ","category":"page"},{"location":"Software/Basilisk/#Lee-Waves","page":"Basilisk","title":"Lee Waves","text":"","category":"section"},{"location":"Software/Basilisk/","page":"Basilisk","title":"Basilisk","text":"Reference Tidally-induced internal lee waves\nCode 19-Lee-Waves\nNotes ","category":"page"},{"location":"Software/Basilisk/#Ellipsoidal-Shoal","page":"Basilisk","title":"Ellipsoidal Shoal","text":"","category":"section"},{"location":"Software/Basilisk/","page":"Basilisk","title":"Basilisk","text":"Reference Periodic wave propagation over an ellipsoidal shoal\nCode 20-Ellipsoidal-Shoal\nNotes ","category":"page"},{"location":"Software/Basilisk/#Ellipsoidal-Shoal-Multilayer","page":"Basilisk","title":"Ellipsoidal Shoal Multilayer","text":"","category":"section"},{"location":"Software/Basilisk/","page":"Basilisk","title":"Basilisk","text":"Reference Periodic wave propagation over an ellipsoidal shoal (multilayer)\nCode 21-Ellipsoidal-Shoal-Multilayer\nNotes Check for source code in current version.","category":"page"},{"location":"Software/Basilisk/#Stokes-Wave","page":"Basilisk","title":"Stokes Wave","text":"","category":"section"},{"location":"Software/Basilisk/","page":"Basilisk","title":"Basilisk","text":"Reference 3D breaking Stokes wave (multilayer solver)\nCode 22-Stokes-Wave\nNotes ","category":"page"},{"location":"Software/Basilisk/#Transcritical-Flow","page":"Basilisk","title":"Transcritical Flow","text":"","category":"section"},{"location":"Software/Basilisk/","page":"Basilisk","title":"Basilisk","text":"Reference Transcritical flow over a bump\nCode 23-Transcritical-Flow\nNotes ","category":"page"},{"location":"Software/Basilisk/#Shock-Instability","page":"Basilisk","title":"Shock Instability","text":"","category":"section"},{"location":"Software/Basilisk/","page":"Basilisk","title":"Basilisk","text":"Reference A Shallow Water Analogue for the Standing Accretion Shock Instability\nCode 24-Shock-Instability\nNotes ","category":"page"},{"location":"Software/Basilisk/#Python-interface","page":"Basilisk","title":"Python interface","text":"","category":"section"},{"location":"Software/Basilisk/#Basic-usage","page":"Basilisk","title":"Basic usage","text":"","category":"section"},{"location":"Software/Basilisk/","page":"Basilisk","title":"Basilisk","text":"Reference Python interface\nCode 25-Python-Interface\nNotes ","category":"page"},{"location":"Software/Basilisk/#Poisson-equation","page":"Basilisk","title":"Poisson equation","text":"","category":"section"},{"location":"Software/Basilisk/","page":"Basilisk","title":"Basilisk","text":"Reference Poisson problem with Python\nCode 26-Python-Poisson\nNotes ","category":"page"},{"location":"Software/Basilisk/","page":"Basilisk","title":"Basilisk","text":"","category":"page"},{"location":"Software/Basilisk/#Built-in-solvers","page":"Basilisk","title":"Built-in solvers","text":"","category":"section"},{"location":"Software/Basilisk/","page":"Basilisk","title":"Basilisk","text":"Basic component solvers:","category":"page"},{"location":"Software/Basilisk/","page":"Basilisk","title":"Basilisk","text":"advection.h\ndiffusion.h\npoisson.h","category":"page"},{"location":"Software/Basilisk/","page":"Basilisk","title":"Basilisk","text":"It is upon these that the Navier-Stokes equation can be assembled in:","category":"page"},{"location":"Software/Basilisk/","page":"Basilisk","title":"Basilisk","text":"Header Description\nnavier-stokes/stream.h Solves a 2D incompressible, constant density, constant viscosity Navier-Stokes equation formulated in the vorticity omega. This is and advection-diffusion equation solved with a flux-based advection scheme in advection.h. Given its form, the stream function psi is solver through the poisson.h solver.\nnavier-stokes/centered.h \nnavier-stokes/perfs.h Not a solver by itself, it supports other headers under the Navier-Stokes family to follow performance during solution.","category":"page"},{"location":"Software/Basilisk/","page":"Basilisk","title":"Basilisk","text":"Other equations:","category":"page"},{"location":"Software/Basilisk/","page":"Basilisk","title":"Basilisk","text":"saint-venant.h","category":"page"},{"location":"Software/Basilisk/#Headers-files","page":"Basilisk","title":"Headers files","text":"","category":"section"},{"location":"Software/Basilisk/","page":"Basilisk","title":"Basilisk","text":"File Usage\ncommon.h \ndistance.h \nembed.h Allow the creation of general shape boundary conditions inside the domain.\nfractions.h \nlambda2.h Detection of vortex using the criteria by Jeong1995a [21]\nrun.h A generic time loop which executes until termination (to be avoided!).\ntracer.h Provides an event to integrate the advection of tracer elements.\nutils.h \nview.h ","category":"page"},{"location":"Software/Basilisk/","page":"Basilisk","title":"Basilisk","text":"File Usage\ngrid/cartesian.h \ngrid/multigrid.h \ngrid/octree.h \ngrid/bitree.h ","category":"page"},{"location":"Software/Basilisk/#Data-types","page":"Basilisk","title":"Data types","text":"","category":"section"},{"location":"Software/Basilisk/","page":"Basilisk","title":"Basilisk","text":"scalar\nvector\nface\nmsgstats convergence statistics of (multigrid?) solver.","category":"page"},{"location":"Software/Basilisk/#Functions","page":"Basilisk","title":"Functions","text":"","category":"section"},{"location":"Software/Basilisk/","page":"Basilisk","title":"Basilisk","text":"Function Definition Uses\norigin common.h Set the origin of cartesian system.\ninit_grid grid/ (overloaded) Level of refinement (size) of initial grid.\nsize \nperiodic Set periodic boundary conditions.\nstatsf utils.h Retrieve statistics of a scalar field.\noutput_ppm output.h Generate a image and video output.\nadapt_wavelet grid/tree-common.h Adaptive grid refinement routine.\nrun run.h (overloaded) Generic time loop for events execution.\nnoise Generate random noise in -1 1.\nswap Swap values of two scalar arrays.\ninput_stl distance.h Read an STL file as an array of triplets.\nbounding_box distance.h Determines the bounding box of inputs (segments or triangles).\ndistance distance.h Distance to coordinate.\nview draw.h Setup of viewing (camera) parameters.\nisosurface draw.h Displays an isosurface of a field.\ndraw_vof draw.h Display VOF reconstructed interfaces.\nclear draw.h Removes previous objects.\nsave view.h Dumps image(s) to file.\nrefine_biquadradic grid/multigrid-common.h \nwavelet grid/multigrid-common.h \ninverse_wavelet grid/multigrid-common.h \nboundary_level \nunrefine \nvorticity utils.h Computes the vorticity from a velocity field.","category":"page"},{"location":"References/@Mehrer2007/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Mehrer2007/","page":"-","title":"-","text":"title: \"Diffusion in solids : Fundamentals, methods, materials, diffusion-controlled processes\" authors: Helmut Mehrer year: 2007 –-","category":"page"},{"location":"WallyToolbox/transport/#Transport","page":"Transport","title":"Transport","text":"","category":"section"},{"location":"WallyToolbox/transport/","page":"Transport","title":"Transport","text":"\"https://github.com/wallytutor/WallyToolbox.jl/blob/main/docs/src/WallyToolbox/transport.md\"\nCurrentModule = WallyToolbox\nDocTestSetup = quote\n using WallyToolbox\nend","category":"page"},{"location":"WallyToolbox/transport/#Dimensionless-groups","page":"Transport","title":"Dimensionless groups","text":"","category":"section"},{"location":"WallyToolbox/transport/","page":"Transport","title":"Transport","text":"When dealing with fluid flow and reactor models, it is always useful to be able to quickly compute approximate dimensionless numbers for the studied case. In what follows we provide a brief description of some of these quantities and some context for their use whenever possible. Definitions might vary according to the author or field of application and here we follow mostly Bird2001 [4].","category":"page"},{"location":"WallyToolbox/transport/","page":"Transport","title":"Transport","text":"Although quite unusual, it seems it is time to start this list with the Knudsen number, which evaluates the particles mean free path over system characteristic dimension. Division between rarefied gas (Boltzmann) and continuum mechanics (Navier-Stokes). ","category":"page"},{"location":"WallyToolbox/transport/","page":"Transport","title":"Transport","text":"Although an implementation is not yet provided here, users are encouraged to estimate its value based on some mean free path estimation for their system before following with the analysis of a transport problem. Generally speaking, if continuum mechanics hypothesis is not valid, i.e Knudsen number is too high, most of what follows cannot be applied, thus justifying why this group comes first.","category":"page"},{"location":"WallyToolbox/transport/#Common-dimensionless-groups","page":"Transport","title":"Common dimensionless groups","text":"","category":"section"},{"location":"WallyToolbox/transport/#Reynolds","page":"Transport","title":"Reynolds","text":"","category":"section"},{"location":"WallyToolbox/transport/","page":"Transport","title":"Transport","text":"Reynolds dimensionless group is named for Osborne Reynolds (1842-1912), professor of engineering at the University of Manchester. He studied the laminar-turbulent transition, turbulent heat transfer, and theory of lubrication Bird2001 [4]. In general we denote Reynolds number by mathrmRe and it is used to delineate flow regimes. For circular tubes it is defined as:","category":"page"},{"location":"WallyToolbox/transport/","page":"Transport","title":"Transport","text":"mathrmRe = fracrho langle v_z rangle Dmu","category":"page"},{"location":"WallyToolbox/transport/","page":"Transport","title":"Transport","text":"where langlev_zrangle is the average flow velocity in axial direction and D is the tube diameter. For values up 2100 the flow is assumed laminar if steady state is established and density is constant. For more, see Bird2001 [4], Chapter 2.","category":"page"},{"location":"WallyToolbox/transport/","page":"Transport","title":"Transport","text":"WallyToolbox.reynolds","category":"page"},{"location":"WallyToolbox/transport/#WallyToolbox.reynolds","page":"Transport","title":"WallyToolbox.reynolds","text":"Evaluate Reynolds number relationship.\n\n\n\n\n\n","category":"function"},{"location":"WallyToolbox/transport/#Nusselt","page":"Transport","title":"Nusselt","text":"","category":"section"},{"location":"WallyToolbox/transport/","page":"Transport","title":"Transport","text":"The Nusselt number provides the ratio of convective to conductive heat transfer at a boundary in a fluid, defined as","category":"page"},{"location":"WallyToolbox/transport/","page":"Transport","title":"Transport","text":"mathrmNu=frachLk","category":"page"},{"location":"WallyToolbox/transport/","page":"Transport","title":"Transport","text":"Often in buoyancy-driven flow analysis it is correlated as mathrmNu=amathrmRa^b. A Nusselt number of value one represents heat transfer by pure conduction. Increasing this number implies a laminar conductive-dominant flow and then a convective dominant turbulent flow.","category":"page"},{"location":"WallyToolbox/transport/","page":"Transport","title":"Transport","text":"WallyToolbox.nusselt","category":"page"},{"location":"WallyToolbox/transport/#WallyToolbox.nusselt","page":"Transport","title":"WallyToolbox.nusselt","text":"Evaluate Nusselt number relationship.\n\n\n\n\n\n","category":"function"},{"location":"WallyToolbox/transport/#Prandtl","page":"Transport","title":"Prandtl","text":"","category":"section"},{"location":"WallyToolbox/transport/","page":"Transport","title":"Transport","text":"Prandtl represents the ratio of momentum diffusivity to thermal diffusivity mathrmPr=fracnualpha. High mathrmPr indicates that momentum transfer is more effective than heat transfer (oils), while low values (liquid metals) indicate thermal boundary layer is more important than viscous one.","category":"page"},{"location":"WallyToolbox/transport/","page":"Transport","title":"Transport","text":"Ludwig Prandtl (1875-1953) (pronounced \"Prahn-t'), who taught in Hannover and Gottingen and later served as the Director of the Kaiser Wilhelm Institute for Fluid Dynamics, was one of the people who shaped the future of his field at the beginning of the twentieth century; he made contributions to turbulent flow and heat transfer, but his development of the boundary-layer equations was his crowning achievement Bird2001 [4]. The dimensionless quantity appear under two forms of interest for the analysis of reactors: its thermal and its chemical versions. In thermal version, this number compares the kinematic viscosity nu to the thermal diffusivity alpha, which is replaced by species diffusivity in its chemical version, which is more often referred to as Schmidt number. Ernst Heinrich Wilhelm Schmidt (1892-1975), who taught at the universities in Gdansk, Braunschweig, and Munich (where he was the successor to Nusselt) Bird2001 [4]_. The ratio fracnualpha indicates the relative ease of momentum and energy or species transport in flow systems. This dimensionless ratio in thermal form is given by","category":"page"},{"location":"WallyToolbox/transport/","page":"Transport","title":"Transport","text":"mathrmPr = fracnualpha = fracC_p muk","category":"page"},{"location":"WallyToolbox/transport/","page":"Transport","title":"Transport","text":"If transport properties for a gas are not available, thermal Prandtl number can be estimated at low pressure and non-polar molecules mixtures with help of Eucken formula as","category":"page"},{"location":"WallyToolbox/transport/","page":"Transport","title":"Transport","text":"mathrmPr = fracC_pC_p + frac54R","category":"page"},{"location":"WallyToolbox/transport/","page":"Transport","title":"Transport","text":"WallyToolbox.prandtl","category":"page"},{"location":"WallyToolbox/transport/#WallyToolbox.prandtl","page":"Transport","title":"WallyToolbox.prandtl","text":"Evaluate Prandtl number relationship.\n\n\n\n\n\n","category":"function"},{"location":"WallyToolbox/transport/#Péclet","page":"Transport","title":"Péclet","text":"","category":"section"},{"location":"WallyToolbox/transport/","page":"Transport","title":"Transport","text":"Péclet Jean-Claude-Eugene Peclet (pronounced \"Pay-clay\" with the second syllable accented) (1793-1857) authored several books including one on heat conduction Bird2001 [4]. This number is nothing more than the multiplication of Reynolds and Prandtl or Schmidt numbers. By simplifying factors one easily determines that it represents the ratio of convective by diffusive transport (thermal or species). High mathrmPe limit represents the #plug-flow behavior. ","category":"page"},{"location":"WallyToolbox/transport/","page":"Transport","title":"Transport","text":"mathrmPe_th = mathrmRe mathrmPrqquad\nmathrmPe_ch = mathrmRe mathrmSc","category":"page"},{"location":"WallyToolbox/transport/#Convection-related-groups","page":"Transport","title":"Convection-related groups","text":"","category":"section"},{"location":"WallyToolbox/transport/#Grashof","page":"Transport","title":"Grashof","text":"","category":"section"},{"location":"WallyToolbox/transport/","page":"Transport","title":"Transport","text":"Grashof number named after Franz Grashof (1826-1893) (pronounced \"Grahss-hoff). He was professor of applied mechanics in Karlsruhe and one of the founders of the Verein Deutscher Ingenieure in 1856 Bird2001 [4]. The Grashof number is the characteristic group occurring in analyses of free convection. It approximates the ratio of the buoyancy to viscous force acting on a fluid, defined as","category":"page"},{"location":"WallyToolbox/transport/","page":"Transport","title":"Transport","text":"mathrmGr=fracgbeta(T_s-T_infty)L^3nu^2","category":"page"},{"location":"WallyToolbox/transport/","page":"Transport","title":"Transport","text":"and is analogous to Reynolds number in natural convection. Increasing the value of this number above a given threshold promotes buoyancy driven flow.","category":"page"},{"location":"WallyToolbox/transport/","page":"Transport","title":"Transport","text":"WallyToolbox.grashof","category":"page"},{"location":"WallyToolbox/transport/#WallyToolbox.grashof","page":"Transport","title":"WallyToolbox.grashof","text":"Evaluate Grashof number relationship.\n\n\n\n\n\n","category":"function"},{"location":"WallyToolbox/transport/#Rayleigh","page":"Transport","title":"Rayleigh","text":"","category":"section"},{"location":"WallyToolbox/transport/","page":"Transport","title":"Transport","text":"Rayleigh number is the product of Grashof mathrmGr and Prandtl mathrmPr numbers. Related to the transition from laminar to turbulent in buoyancy-driven flows. Laminar to turbulent is assumed to take place at 10^9 Balaji2014 [5].","category":"page"},{"location":"WallyToolbox/transport/#Mass-transfer-groups","page":"Transport","title":"Mass transfer groups","text":"","category":"section"},{"location":"WallyToolbox/transport/#Schmidt","page":"Transport","title":"Schmidt","text":"","category":"section"},{"location":"WallyToolbox/transport/","page":"Transport","title":"Transport","text":"Schmidt number is the mass diffusion equivalent of Prandtl's. Its range can be much broader than its thermal relative, Prandtl number. This is given by the effects of cross-section and molar weight determining mass diffusivity of gas species. For more, see Bird2001 [4], Chapter 9.","category":"page"},{"location":"WallyToolbox/transport/","page":"Transport","title":"Transport","text":"mathrmSc = fracnuD","category":"page"},{"location":"WallyToolbox/transport/#Sherwood","page":"Transport","title":"Sherwood","text":"","category":"section"},{"location":"WallyToolbox/transport/","page":"Transport","title":"Transport","text":"Sherwood number, also called the mass transfer Nusselt number is a dimensionless number used in mass-transfer operation. It represents the ratio of the total mass transfer rate (convection + diffusion) to the rate of diffusive mass transport, and is named in honor of Thomas Kilgore Sherwood.","category":"page"},{"location":"WallyToolbox/transport/#Multiphase-specific","page":"Transport","title":"Multiphase-specific","text":"","category":"section"},{"location":"WallyToolbox/transport/#Weber","page":"Transport","title":"Weber","text":"","category":"section"},{"location":"WallyToolbox/transport/","page":"Transport","title":"Transport","text":"Weber group is often found in applications of multiphase flows where strongly curved surfaces are present. It represents the ratio of drag forces to cohesion forces, and can be thought of as a measure of the relative importance of the fluid's inertia compared to its surface tension. As reminded by Amsden1989 [6], for mathrmWe1, drop oscillations, distortions, and breakup must be considered, requiring other sub-models other than simple drag to describe the flow.","category":"page"},{"location":"WallyToolbox/transport/#Groups-by-application","page":"Transport","title":"Groups by application","text":"","category":"section"},{"location":"WallyToolbox/transport/","page":"Transport","title":"Transport","text":"WallyToolbox.ConstantPrandtl","category":"page"},{"location":"WallyToolbox/transport/#WallyToolbox.ConstantPrandtl","page":"Transport","title":"WallyToolbox.ConstantPrandtl","text":"Prandtl number set to a constant value.\n\n\n\n\n\n","category":"type"},{"location":"WallyToolbox/transport/","page":"Transport","title":"Transport","text":"WallyToolbox.ReynoldsPipeFlow\nWallyToolbox.NusseltGnielinski\nWallyToolbox.NusseltDittusBoelter","category":"page"},{"location":"WallyToolbox/transport/#WallyToolbox.ReynoldsPipeFlow","page":"Transport","title":"WallyToolbox.ReynoldsPipeFlow","text":"Reynolds number applied to internal pipe flow.\n\n\n\n\n\n","category":"type"},{"location":"WallyToolbox/transport/#WallyToolbox.NusseltGnielinski","page":"Transport","title":"WallyToolbox.NusseltGnielinski","text":"Gnielinski's relationship for Nusselt number.\n\n\n\n\n\n","category":"type"},{"location":"WallyToolbox/transport/#WallyToolbox.NusseltDittusBoelter","page":"Transport","title":"WallyToolbox.NusseltDittusBoelter","text":"Dittus-Boelter's relationship for Nusselt number.\n\n\n\n\n\n","category":"type"},{"location":"WallyToolbox/transport/#Heat-transfer-coefficients","page":"Transport","title":"Heat transfer coefficients","text":"","category":"section"},{"location":"WallyToolbox/transport/","page":"Transport","title":"Transport","text":"WallyToolbox.HtcPipeFlow\nWallyToolbox.htc","category":"page"},{"location":"WallyToolbox/transport/#WallyToolbox.HtcPipeFlow","page":"Transport","title":"WallyToolbox.HtcPipeFlow","text":"Heat transfer coefficient for internal pipe flow.\n\n\n\n\n\n","category":"type"},{"location":"WallyToolbox/transport/#WallyToolbox.htc","page":"Transport","title":"WallyToolbox.htc","text":"Implements the interface for heat transfer coefficient evaluation.\n\nNotice that although temperature is provided in this interface, it is used only for Pr calculation. Other properties might have arbitrarily complex dependencies and types, so it was chosen by design to keep their evaluation to the user before calling this.\n\nAlso, to ensure internal consistency because of Nusselt number dependency on Prandtl number, thermal conductivity is evaluated from specific heat and viscosity. It is up to the user to make sure the provided Prandtl number is compatible.\n\n\n\n\n\n","category":"function"},{"location":"WallyToolbox/transport/#Property-models","page":"Transport","title":"Property models","text":"","category":"section"},{"location":"WallyToolbox/transport/","page":"Transport","title":"Transport","text":"Medium properties often are non-constant and require description through different sorts of models for representing their dependence on solution quantities, such as temperature, pressure, composition, etc. This section is devoted to document such models.","category":"page"},{"location":"WallyToolbox/transport/#Polynomial-properties","page":"Transport","title":"Polynomial properties","text":"","category":"section"},{"location":"WallyToolbox/transport/","page":"Transport","title":"Transport","text":"The most commonly used representation of thermal conductivity of materials is through polynomial fits of temperature. Although this approach does not provide any physical-based representation, it is easy to use and fast to evaluate in most computational science problems. A common interface for polynomial properties is given by the following structure.","category":"page"},{"location":"WallyToolbox/transport/","page":"Transport","title":"Transport","text":"WallyToolbox.TempPolynomialHeatConductivity\nWallyToolbox.constheatconductivity","category":"page"},{"location":"WallyToolbox/transport/#WallyToolbox.TempPolynomialHeatConductivity","page":"Transport","title":"WallyToolbox.TempPolynomialHeatConductivity","text":"Wrapper for a polynomial temperature-dependent heat conductivity.\n\nFields\n\np::Polynomials.Polynomial: Heat conductivity polynomial.\n\nExamples\n\nThe general use case of this is to create objects compatible with the function object approach employed for properties evaluation across the module.\n\njulia> k = TempPolynomialHeatConductivity([1.5, -0.001])\nTempPolynomialHeatConductivity(Polynomial(1.5 - 0.001*T))\n\njulia> k(1000.0)\n0.5\n\nAlthough not the most efficienty way, a simple wrapper for providing constant heat conductivity remaining compatible with other funcionalities is provided:\n\njulia> k = constheatconductivity(5.0)\nTempPolynomialHeatConductivity(Polynomial(5.0))\n\n\n\n\n\n","category":"type"},{"location":"WallyToolbox/transport/#WallyToolbox.constheatconductivity","page":"Transport","title":"WallyToolbox.constheatconductivity","text":"Constant heat conductivity wrapper compatible with temperature dependency.\n\n\n\n\n\n","category":"function"},{"location":"WallyToolbox/transport/","page":"Transport","title":"Transport","text":"An analogous interface is also provided for viscosity temperature dependence.","category":"page"},{"location":"WallyToolbox/transport/","page":"Transport","title":"Transport","text":"WallyToolbox.TempPolynomialFluidViscosity\nWallyToolbox.constfluidviscosity","category":"page"},{"location":"WallyToolbox/transport/#WallyToolbox.TempPolynomialFluidViscosity","page":"Transport","title":"WallyToolbox.TempPolynomialFluidViscosity","text":"Wrapper for a polynomial temperature-dependent fluid viscosity.\n\nFields\n\np::Polynomials.Polynomial: Fluid viscosity polynomial.\n\nUsage is analogous to TempPolynomialHeatConductivity.\n\n\n\n\n\n","category":"type"},{"location":"WallyToolbox/transport/#WallyToolbox.constfluidviscosity","page":"Transport","title":"WallyToolbox.constfluidviscosity","text":"Constant heat conductivity wrapper compatible with temperature dependency.\n\n\n\n\n\n","category":"function"},{"location":"WallyToolbox/transport/#Other-temperature-dependences","page":"Transport","title":"Other temperature dependences","text":"","category":"section"},{"location":"WallyToolbox/transport/","page":"Transport","title":"Transport","text":"In numerical simulation one often faces the task to represent melting of solution solids that soften over a temperature range. An easy way to set this up with a volume-of-fluid (VOF) approach is to have some sort of exponential temperature-dependent viscosity. This structure encapsulates the evaluation of a viscosity function based on Fermi distribution - a sort of sigmoid function - to this end. This can be expressed as (definitions in the structure documentation):","category":"page"},{"location":"WallyToolbox/transport/","page":"Transport","title":"Transport","text":"mu(T) = mu_infty +\ndfracmu_0-mu_infty1+expleft(dfracT-ThetaDeltaright)\n\nquadtextwherequad\n\nbegincases\nTheta = dfracT_e+T_s212pt\nDelta = dfracT_e-T_skappa\nendcases","category":"page"},{"location":"WallyToolbox/transport/","page":"Transport","title":"Transport","text":"WallyToolbox.TempFermiLikeMeltingViscosity\nWallyToolbox.fermilike_viscosity","category":"page"},{"location":"WallyToolbox/transport/#WallyToolbox.TempFermiLikeMeltingViscosity","page":"Transport","title":"WallyToolbox.TempFermiLikeMeltingViscosity","text":"Temperature-dependent viscosity with a Fermi-like distribution dependency.\n\nFields\n\nΘ::Float64: Center temperature of melting range [K].\nΔ::Float64: Spread factor over melting range [K].\nδ::Float64: Viscosity change during melting [Pa.s].\nμ∞::Float64: High temperature viscosity [Pa.s].\nμ₀::Float64: Low temperature viscosity [Pa.s].\nκ::Float64: Spread coefficient used to compute Δ.\nTs::Float64: Melting start temperature [K].\nTe::Float64: Melting end temperature [K].\n\nExamples\n\nThe following example shows the evaluation of such a function below, in the middle, and above melting range.\n\njulia> μ = TempFermiLikeMeltingViscosity(1300.0, 1700.0, 1000.0, 0.1, 10);\n\njulia> μ(300.0)\n999.9999999999065\n\njulia> μ(1500.0)\n500.05\n\njulia> μ(2000.0)\n0.10372626662025815\n\n\n\n\n\n","category":"type"},{"location":"WallyToolbox/transport/#WallyToolbox.fermilike_viscosity","page":"Transport","title":"WallyToolbox.fermilike_viscosity","text":"fermilike_viscosity(T, μ∞, δ, Θ, Δ)\n\nEvaluation of Fermi-distribution-alike viscosity function.\n\n\n\n\n\n","category":"function"},{"location":"WallyToolbox/transport/#Granular-media","page":"Transport","title":"Granular media","text":"","category":"section"},{"location":"WallyToolbox/transport/","page":"Transport","title":"Transport","text":"According to Hanein2017 [7] the representation of effective thermal conductivity of a solids bed in a rotary kiln can be approximated through a Maxell model based on effective medium theory. To keep track of eventually temperature-dependent properties and make use of this model, the following interfaces are provided.","category":"page"},{"location":"WallyToolbox/transport/","page":"Transport","title":"Transport","text":"WallyToolbox.GranularMediumHeatConductivity\nWallyToolbox.maxwell_eff_conductivity","category":"page"},{"location":"WallyToolbox/transport/#WallyToolbox.GranularMediumHeatConductivity","page":"Transport","title":"WallyToolbox.GranularMediumHeatConductivity","text":"Provides the heat conductivity of a solids granular medium embeded in gas.\n\nFields\n\nks::WallyToolbox.AbstractHeatCondTemperatureDep: Heat conductivity model for solid phase.\nkg::WallyToolbox.AbstractHeatCondTemperatureDep: Heat conductivity model for gas phase.\nϕ::Float64: Solids packing fraction.\n\nExamples\n\nThis composite type relies on a gas and a solid; below we illustrate how to evaluate a granular medium effective heat conductivity using this structure.\n\njulia> ks = constheatconductivity(5.0);\n\njulia> kg = constheatconductivity(0.092);\n\njulia> kb = GranularMediumHeatConductivity(ks, kg, 0.36);\n\njulia> kb(300.0)\n0.23471049304677621\n\n\n\n\n\n","category":"type"},{"location":"WallyToolbox/transport/#WallyToolbox.maxwell_eff_conductivity","page":"Transport","title":"WallyToolbox.maxwell_eff_conductivity","text":"maxwell_eff_conductivity(kg, ks, ϕ)\n\nMaxwell effective medium theory of thermal conductivity computed in terms of gas thermal conductivity kg, solids thermal conductivity ks, and solids packing fraction ϕ.\n\n\n\n\n\n","category":"function"},{"location":"WallyToolbox/transport/#Air-properties","page":"Transport","title":"Air properties","text":"","category":"section"},{"location":"WallyToolbox/transport/","page":"Transport","title":"Transport","text":"For the simulation of rotary kilns, Mujumdar2006i [8] proposes some data for air properties implemented by the following interfaces. It must be noted that the thermal conductivity proposed by the authors quickly diverges above 1500 K and users must be aware of its implications.","category":"page"},{"location":"WallyToolbox/transport/","page":"Transport","title":"Transport","text":"WallyToolbox.AirHeatConductivityMujumdar2006\nWallyToolbox.AirViscosityMujumdar2006","category":"page"},{"location":"WallyToolbox/transport/#WallyToolbox.AirHeatConductivityMujumdar2006","page":"Transport","title":"WallyToolbox.AirHeatConductivityMujumdar2006","text":"Air heat conductivity for rotary kiln simulation - Mujumdar (2006).\n\njulia> k = AirHeatConductivityMujumdar2006();\n\njulia> k(300)\n0.027600315300000004\n\n\n\n\n\n","category":"type"},{"location":"WallyToolbox/transport/#WallyToolbox.AirViscosityMujumdar2006","page":"Transport","title":"WallyToolbox.AirViscosityMujumdar2006","text":"Air viscosity for rotary kiln simulation - Mujumdar (2006).\n\njulia> μ = AirViscosityMujumdar2006();\n\njulia> μ(300)\n1.837988950255163e-5\n\n\n\n\n\n","category":"type"},{"location":"WallyToolbox/transport/#General-porous-media","page":"Transport","title":"General porous media","text":"","category":"section"},{"location":"WallyToolbox/transport/","page":"Transport","title":"Transport","text":"Modeling of geometrical characteristics of porous beds is required for including both their thermal effect or role over chemistry in chemical reactors. A classical approach used in several commercial and open source tools is that of Gunn1978 [9]. In what follows we develop the ideas that lead to an analogous model which is implemented by this structure.","category":"page"},{"location":"WallyToolbox/transport/","page":"Transport","title":"Transport","text":"To build the model we will assume a reactor of constant rectangular cross-section A_r=bw and volume V_R=bwh. Its cross-section perimeter is then P_R=2(b+w). Inside this reactor we randomly pack cubic particles beta of surface area A_beta=6l_beta^2 and volume V_beta=l_beta^3 at a porosity level phi. Thus the total volume of solids inside the reactor is V_S=(1-phi)V_R and the approximate number of particles N=fracV_SV_beta. Following a similar reasoning the total surface area of particles is A_S=NA_beta. Performing all the substitutions so far one finds the following expression","category":"page"},{"location":"WallyToolbox/transport/","page":"Transport","title":"Transport","text":"A_S=frac6(1-phi)bwhl_beta","category":"page"},{"location":"WallyToolbox/transport/","page":"Transport","title":"Transport","text":"Since the differential dA=Pdl holds for the surface of a body over its length l, one can divide the above expression by the reactor length to get the perimeter of particles in a cross-section. We can further divide by the cross-section area itself and find the perimeter density which is a more general result, and find the expression proposed by Gunn1978 [9]. This result is summarized in the next equation where the subscript of particle size was dropped for generality.","category":"page"},{"location":"WallyToolbox/transport/","page":"Transport","title":"Transport","text":"P = frac6(1-phi)l","category":"page"},{"location":"WallyToolbox/transport/","page":"Transport","title":"Transport","text":"An estimator of the number of channels per unit cross-section of reactor N can be related to the porosity through NpiR^2=phi. Because the above perimeter is shared between the fluid volume and solids, it holds that N2piR=P. Using these expressions one can solve for the porosity channels characteristic radius R as given below, which is also a result reported by Gunn1978 [9].","category":"page"},{"location":"WallyToolbox/transport/","page":"Transport","title":"Transport","text":"R=fracphil3(1-phi)","category":"page"},{"location":"WallyToolbox/transport/","page":"Transport","title":"Transport","text":"This model is provided in PackedBedPorosityDescriptor.","category":"page"},{"location":"WallyToolbox/transport/","page":"Transport","title":"Transport","text":"WallyToolbox.PackedBedPorosityDescriptor","category":"page"},{"location":"WallyToolbox/transport/#WallyToolbox.PackedBedPorosityDescriptor","page":"Transport","title":"WallyToolbox.PackedBedPorosityDescriptor","text":"Provides description of porosity parameters with stochastic behavior.\n\nFields\n\nϕ::Union{Float64, Vector{Float64}}: Porosity volume fraction in medium [-].\nl::Union{Float64, Vector{Float64}}: Characteristic particle size in medium [m].\nσϕ::Union{Nothing, Float64}: Optional standard deviation of porosity volume fraction [-].\nσl::Union{Nothing, Float64}: Optional standard deviation of characteristic particle size [m].\nP::Union{Float64, Vector{Float64}}: Perimeter in reactor cross-section [m].\nD::Union{Float64, Vector{Float64}}: Characteristic diameter of porosity channels [m].\nA::Float64: Reactor area used for scaling perimeter [m²].\n\nExamples\n\nPackedBedPorosityDescriptor can be used to describe the geometry of exchange section of a packed bed for a single set of arguments.\n\njulia> PackedBedPorosityDescriptor(; ϕ = 0.65, l = 0.10, area = 1.0)\nPackedBedPorosityDescriptor(P = 21.000000 m, D = 0.123810 m)\n\nIt can also be used to describe randomly varying reactors, what is a more realistic thing to do when using this structure to simulate real world systems.\n\njulia> PackedBedPorosityDescriptor(;\n ϕ = 0.65, l = 0.10,\n σϕ = 0.03, σl = 0.01,\n N = 2,\n ϕlims = (0.4, 0.8),\n llims = (0.0, 0.3),\n seed = 42,\n area = 1.0\n )\nPackedBedPorosityDescriptor(\n P from 21.455749 m to 24.370742 m\n D from 0.125589 m to 0.102353 m\n)\n\n\n\n\n\n","category":"type"},{"location":"WallyToolbox/transport/#Rotary-kiln-models","page":"Transport","title":"Rotary kiln models","text":"","category":"section"},{"location":"WallyToolbox/transport/","page":"Transport","title":"Transport","text":"In a rotary kiln as proposed by Kramers1952 [10]. Its goal is to be used as a process support tool or to integrate more complex models requiring integration of the bed profile. In its classical statement, the bed height profile h(z) can be evaluated from volume of flowing material conservation through the following equations. Coordinate z=0 represents the discharge position where initial condition must be applied. This is given by the dam height, if any, or particle size.","category":"page"},{"location":"WallyToolbox/transport/","page":"Transport","title":"Transport","text":"beginaligned\ndfracdhdz = C₁ leftfrachRleft(2 - frachRright)right^-frac32 - C₂6pt\nC₁ = frac34dfracΦtanγπ R^3 ω6pt\nC₂ = dfractanβcosγ\nendaligned","category":"page"},{"location":"WallyToolbox/transport/","page":"Transport","title":"Transport","text":"The structure SymbolicLinearKramersModel implements the Kramers' ordinary differential equation for prediction of bed height profile in a rotary kiln. This equation is implemented under the formalism of ModelingToolkit.","category":"page"},{"location":"WallyToolbox/transport/","page":"Transport","title":"Transport","text":"WallyToolbox.SymbolicLinearKramersModel","category":"page"},{"location":"WallyToolbox/transport/#WallyToolbox.SymbolicLinearKramersModel","page":"Transport","title":"WallyToolbox.SymbolicLinearKramersModel","text":"Creates a reusable linear Kramers model for rotary kiln simulation.\n\nFields\n\nR::Symbolics.Num: Symbolic kiln internal radius\nΦ::Symbolics.Num: Symbolic kiln feed rate\nω::Symbolics.Num: Symbolic kiln rotation rate\nβ::Symbolics.Num: Symbolic kiln slope\nγ::Symbolics.Num: Symbolic solids repose angle\nz::Symbolics.Num: Symbolic kiln axial coordinates\nh::Symbolics.Num: Symbolic bed height profile\nsys::ModelingToolkit.ODESystem: Problem ordinary differential equation\n\n\n\n\n\n","category":"type"},{"location":"WallyToolbox/transport/","page":"Transport","title":"Transport","text":"For integration of this model we implement RotaryKilnBedSolution. It provides the solved description of a rotary kiln bed geometry computed from the solution of bed height along the kiln length. The main goal of the quantities computed here is their use with heat and mass transfer models for the simulation of rotary kiln process. A simple post-processing utilitiy plotlinearkramersmodel is also provided.","category":"page"},{"location":"WallyToolbox/transport/","page":"Transport","title":"Transport","text":"WallyToolbox.RotaryKilnBedSolution\nWallyToolbox.plotlinearkramersmodel","category":"page"},{"location":"WallyToolbox/transport/#WallyToolbox.RotaryKilnBedSolution","page":"Transport","title":"WallyToolbox.RotaryKilnBedSolution","text":"General geometric description of a bed from Kramers equation solution.\n\nFields\n\nz::Vector{Float64}: Solution coordinates [m]\nh::Vector{Float64}: Solution bed height [m]\nθ::Vector{Float64}: View angle from kiln center [rad]\nl::Vector{Float64}: Bed-freeboard cord length [m]\nA::Vector{Float64}: Local bed cross section area [m²]\nη::Vector{Float64}: Local loading based on height [-]\nηₘ::Float64: Mean loading of kiln [%]\nV::Float64: Bed integral volume [m³]\nτ::Float64: Residence time of particles\nβ::Float64: Kiln slope [rad]\n\nArguments\n\nInternal elements are initialized through the following constructor:\n\nRotaryKilnBedSolution(z, h, β, R, Φ)\n\nWhere parameters are given as:\n\nz: solution coordinates over length, [m].\nh: bed profile solution over length, [m].\nR: kiln internal radius, [m].\nΦ: kiln feed rate, [m³/s].\n\nAn outer constructor is also provided for managing the integration of an instance of SymbolicLinearKramersModel. This is the recommended usage that is illustrated below.\n\nImportant: inputs must be provided in international system (SI) units as a better physical practice. The only exception is the rotation rate ω provided in revolution multiples. If the discharge end is held by a dam, its height must be provided instead of the particle size, as it is used as the ODE initial condition.\n\nmodel: a symbolic kiln model.\nL: kiln length, [m].\nR: kiln internal radius, [m].\nΦ: kiln feed rate, [m³/s].\nω: kiln rotation rate, [rev/s].\nβ: kiln slope, [rad].\nγ: solids repose angle, [rad].\nd: particle size or dam height, [m].\nsolver: Solver for DifferentialEquations. Defaults to Tsit5.\nrtol: Relative integration tolerance. Defaults to 1.0e-08.\natol: Absolute integration tolerance. Defaults to 1.0e-08.\n\nExamples\n\nData in next example is an SI conversion of an example from ([[@Kramers1952]]).\n\njulia> L = 13.715999999999998; # Kiln length [m]\n\njulia> D = 1.8897599999999999; # Kiln diameter [m]\n\njulia> β = 2.3859440303888126; # Kiln slope [°]\n\njulia> γ = 45.0; # Repose angle [°]\n\njulia> d = 1.0; # Particle/dam size [mm]\n\njulia> Φ = 10.363965852671996; # Feed rate [m³/h]\n\njulia> ω = 3.0300000000000002; # Rotation rate [rev/min]\n\njulia> bed = RotaryKilnBedSolution(;\n model = SymbolicLinearKramersModel(),\n L = L,\n R = D / 2.0,\n Φ = Φ / 3600.0,\n ω = ω / 60.0,\n β = deg2rad(β),\n γ = deg2rad(γ),\n d = d / 1000.0\n );\n\njulia> bed\nRotaryKilnBedSolution(τ = 13.169938 min, ηₘ = 5.913271 %)\n\njulia> bed.τ\n790.1963002204403\n\nIn the following dummy example we force a very thick analytical bed solution, filling the radius of the rotary drum. Next we confirm the internal evaluations of the model match the expected analytical values.\n\njulia> R = 1.0e+00;\n\njulia> Φ = 1.0e-02;\n\njulia> z = collect(0.0:0.1:10.0);\n\njulia> h = R * ones(size(z));\n\njulia> Aₐ = π * R^2 / 2;\n\njulia> Vₐ = Aₐ * z[end];\n\njulia> bed = RotaryKilnBedSolution(z, h, 0, R, Φ)\nRotaryKilnBedSolution(τ = 26.179939 min, ηₘ = 50.000000 %)\n\njulia> mean(bed.θ) ≈ π\ntrue\n\njulia> mean(bed.l) ≈ 2R\ntrue\n\njulia> mean(bed.A) ≈ Aₐ\ntrue\n\njulia> mean(bed.η) ≈ 0.5\ntrue\n\njulia> bed.ηₘ ≈ 50.0\ntrue\n\njulia> bed.V ≈ Vₐ\ntrue\n\njulia> bed.τ ≈ Vₐ / Φ\ntrue\n\n\n\n\n\n","category":"type"},{"location":"WallyToolbox/transport/#WallyToolbox.plotlinearkramersmodel","page":"Transport","title":"WallyToolbox.plotlinearkramersmodel","text":"plotlinearkramersmodel(\n model::RotaryKilnBedSolution;\n normz::Bool = false,\n normh::Bool = false\n)::Figure\n\nStandardized plotting of RotaryKilnBedSolution bed profile. It supports normalization of axes throught keywords normz for axial coordinate and normh for bed depth.\n\n\n\n\n\n","category":"function"},{"location":"WallyToolbox/transport/","page":"Transport","title":"Transport","text":"Validation of Kramers' model is provided here.","category":"page"},{"location":"WallyToolbox/transport/","page":"Transport","title":"Transport","text":"Finally a set of basic equations provided for process analysis.","category":"page"},{"location":"WallyToolbox/transport/","page":"Transport","title":"Transport","text":"WallyToolbox.sullivansηₘ\nWallyToolbox.dimlessNΦ\nWallyToolbox.dimlessNₖ\nWallyToolbox.perryresidence\nWallyToolbox.kramersnlapprox","category":"page"},{"location":"WallyToolbox/transport/#WallyToolbox.sullivansηₘ","page":"Transport","title":"WallyToolbox.sullivansηₘ","text":"Sullivans approximation to kiln filling.\n\n\n\n\n\n","category":"function"},{"location":"WallyToolbox/transport/#WallyToolbox.dimlessNΦ","page":"Transport","title":"WallyToolbox.dimlessNΦ","text":"Kramers (1952) dimensionless group NΦ.\n\n\n\n\n\n","category":"function"},{"location":"WallyToolbox/transport/#WallyToolbox.dimlessNₖ","page":"Transport","title":"WallyToolbox.dimlessNₖ","text":"Kramers (1952) dimensionless group Nₖ.\n\n\n\n\n\n","category":"function"},{"location":"WallyToolbox/transport/#WallyToolbox.perryresidence","page":"Transport","title":"WallyToolbox.perryresidence","text":"Compute residence time from Perry's equation.\n\n\n\n\n\n","category":"function"},{"location":"WallyToolbox/transport/#WallyToolbox.kramersnlapprox","page":"Transport","title":"WallyToolbox.kramersnlapprox","text":"Nonlinear formulation of Kramers model approximate solution.\n\n\n\n\n\n","category":"function"},{"location":"Notes/Conductivity-in-Porous-Media/","page":"Excalidraw Data","title":"Excalidraw Data","text":"","category":"page"},{"location":"Notes/Conductivity-in-Porous-Media/","page":"Excalidraw Data","title":"Excalidraw Data","text":"excalidraw-plugin: raw tags: [excalidraw]","category":"page"},{"location":"Notes/Conductivity-in-Porous-Media/","page":"Excalidraw Data","title":"Excalidraw Data","text":"","category":"page"},{"location":"Notes/Conductivity-in-Porous-Media/","page":"Excalidraw Data","title":"Excalidraw Data","text":"==⚠ Switch to EXCALIDRAW VIEW in the MORE OPTIONS menu of this document. ⚠==","category":"page"},{"location":"Notes/Conductivity-in-Porous-Media/#Excalidraw-Data","page":"Excalidraw Data","title":"Excalidraw Data","text":"","category":"section"},{"location":"Notes/Conductivity-in-Porous-Media/#Text-Elements","page":"Excalidraw Data","title":"Text Elements","text":"","category":"section"},{"location":"Notes/Conductivity-in-Porous-Media/","page":"Excalidraw Data","title":"Excalidraw Data","text":"%%","category":"page"},{"location":"Notes/Conductivity-in-Porous-Media/#Drawing","page":"Excalidraw Data","title":"Drawing","text":"","category":"section"},{"location":"Notes/Conductivity-in-Porous-Media/","page":"Excalidraw Data","title":"Excalidraw Data","text":"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","category":"page"},{"location":"Notes/Conductivity-in-Porous-Media/","page":"Excalidraw Data","title":"Excalidraw Data","text":"%%","category":"page"},{"location":"References/@ORourke2010/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@ORourke2010/","page":"-","title":"-","text":"title: An improved collision damping time for MP-PIC calculations of dense particle flows with applications to polydisperse sedimenting beds and colliding particle jets authors: Peter J. O’Rourke, Dale M. Snider year: 2010 URL: https://doi.org/10.1016/j.ces.2010.08.032 –-","category":"page"},{"location":"References/@Cai2021a/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Cai2021a/","page":"-","title":"-","text":"title: Physics-informed neural networks for heat transfer problems authors: Shengze Cai, Zhicheng Wang, Sifan Wang, Paris Perdikaris, George Em Karniadakis year: 2021 URL: https://doi.org/10.1115/1.4050542 –-","category":"page"},{"location":"References/@Lu2021a/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Lu2021a/","page":"-","title":"-","text":"title: Physics-informed neural networks with hard constraints for inverse design authors: Lu Lu, Raphael Pestourie, Wenjie Yao, Zhicheng Wang, Francesc Verdugo, Steven G. Johnson year: 2021 URL: https://doi.org/10.48550/arXiv.2102.04626 –-","category":"page"},{"location":"Articles/How-corporate-IT-is-killing-innovation/#How-corporate-IT-is-killing-innovation","page":"How corporate IT is killing innovation","title":"How corporate IT is killing innovation","text":"","category":"section"},{"location":"Articles/How-corporate-IT-is-killing-innovation/","page":"How corporate IT is killing innovation","title":"How corporate IT is killing innovation","text":"For the past decade I have constantly worked with innovation. That's all I know to do with my life. A day without creating is mostly not worth it. Whether it was in academic or corporate settings, I generally got along with teammates and most stakeholders. But no matter where I go I am followed by a constant ghost , the enemy, the corporate IT. I known I don't fit in, I don't belong in the system, I don't fall into the listen-pray-obey-loop-herd, but that is not the reason why I should be guilty of how bad my interactions with corporate IT (not specifically with IT people, I have met very nice people there) have been for more than one decade.","category":"page"},{"location":"Articles/How-corporate-IT-is-killing-innovation/","page":"How corporate IT is killing innovation","title":"How corporate IT is killing innovation","text":"So far, my words might seem harsh and full of anger to the uneager reader. As I scientist I am prompt to expect hateful reactions from the conservatives and religiously aligned corporate people. But as a scientist I shall recur to the reason and argumentation to expose, solely based on observations, my conclusions on the matter. Time to end the vague wording, let's get to the anecdotes.","category":"page"},{"location":"Articles/How-corporate-IT-is-killing-innovation/#Installing-a-compiler,-but-you-no-admin","page":"How corporate IT is killing innovation","title":"Installing a compiler, but you no admin","text":"","category":"section"},{"location":"Articles/How-corporate-IT-is-killing-innovation/","page":"How corporate IT is killing innovation","title":"How corporate IT is killing innovation","text":"Early in my PhD days I was told I should model some chemically reacting flows to better understand some processes I was studying. As usual, you start that by a literature review cause you are told so or because you are not dumb enough to think you can reinvent the wheel.","category":"page"},{"location":"Articles/How-corporate-IT-is-killing-innovation/","page":"How corporate IT is killing innovation","title":"How corporate IT is killing innovation","text":"After some reading I realized there was nothing to add to that field under my research scope and it was time to use the numbers that were already available in the literature. Yay, time to code! Well, not so fun... In fact, that nothing-moment is when PhD students realize how humble they have to be in face of existing knowledge. It is also often the point where the cracks appear in the system, the small spots where they can make a small contribution.","category":"page"},{"location":"Articles/How-corporate-IT-is-killing-innovation/","page":"How corporate IT is killing innovation","title":"How corporate IT is killing innovation","text":"My lab was a standard Windows-only environment, although later on I discovered that there were more exceptions than rules in the system. I was actually in the wrong side of the building, most students in the other wing had everything I dreamt of. Since the libraries I was aiming to use at the time were not portable from Nix, I had to start my crusade to show IT I was not the standard user and that I was worth Baloo048 (Baloo048 was the name of my workstation once I got authorized a CentOS 5 system)!","category":"page"},{"location":"Articles/How-corporate-IT-is-killing-innovation/#Security-above-obscurity-(and-overall)","page":"How corporate IT is killing innovation","title":"Security above obscurity (and overall)","text":"","category":"section"},{"location":"Articles/How-corporate-IT-is-killing-innovation/","page":"How corporate IT is killing innovation","title":"How corporate IT is killing innovation","text":"Here I am not making a reference to security through obscurity and I will actually cite several unrelated events that I have seen so far.","category":"page"},{"location":"Articles/How-corporate-IT-is-killing-innovation/","page":"How corporate IT is killing innovation","title":"How corporate IT is killing innovation","text":"IT has always been considered guilty of major failures in security systems. Nonetheless, trespassers often get inside by errors committed by standard network users. Keep that repeating for more than 40 years and you've got what we have today: an overprotective IT mother. – You don't know how to use a computer! You are an irresponsible m-word! – And the list goes on... so a monster was born. All because of repeated wrong root-cause analysis.","category":"page"},{"location":"Articles/How-corporate-IT-is-killing-innovation/","page":"How corporate IT is killing innovation","title":"How corporate IT is killing innovation","text":"With the rise of social networks, machine learning, and everything that dominated the web since 2010, IT gained power in major corporations and in some situations their choices come above technical or commercial ones. Naturally, the overly repressed IT people raised their concerns about every living and digital thing and started locking all paths to standard users.","category":"page"},{"location":"Articles/How-corporate-IT-is-killing-innovation/","page":"How corporate IT is killing innovation","title":"How corporate IT is killing innovation","text":"What companies forgot is how that building walls also block your views to the outside world. Innovation has always been a matter of who copies the best part of what others are doing. Mankind never created a single thing, we copied from nature, and then, putting bricks together, we copied from one another with varying levels of complexity. That to say, every single patent is somehow dishonest. But we keep protecting them, they are the status quo basis of competition. That's the case probably because we are less intelligent than we think we are.","category":"page"},{"location":"Articles/How-corporate-IT-is-killing-innovation/","page":"How corporate IT is killing innovation","title":"How corporate IT is killing innovation","text":"The moment IT obfuscates the view of technical people, the copy-edit-paste cycle is broken: innovation is, at least, strongly hurt. And there is no lack of examples of how this actually happens.","category":"page"},{"location":"Articles/How-corporate-IT-is-killing-innovation/","page":"How corporate IT is killing innovation","title":"How corporate IT is killing innovation","text":"I will stick to what concerns my technical field of expertise.","category":"page"},{"location":"Articles/How-corporate-IT-is-killing-innovation/","page":"How corporate IT is killing innovation","title":"How corporate IT is killing innovation","text":"In numerical simulation it is fundamental to sandbox everything, especially systems. Creativity comes with destruction, it's always oblivion. Numerical people like hard access to perform their best (and sometimes even to perform at all). Working with containers or, even worse, the cloud, are nightmarish. In our world a sandbox is nothing more than a good old workstation without company network access. We make magic there. Every single time an engineer has to beat themselves to have the right to work their best, they get damaged. Some withstand for years, some simply get aligned, what is even worse than quiet quitting. Give us sandboxes to play!","category":"page"},{"location":"Articles/How-corporate-IT-is-killing-innovation/","page":"How corporate IT is killing innovation","title":"How corporate IT is killing innovation","text":"In an average corporation (not talking about sizes here!), there are just a few people working on cutting edge technologies. Sometimes they go beyond the academic state-of-the-art (what is often the situation in semi-conductor industry, for instance). Because they are a minority, they get statistically forgotten by IT as standard users. Needless to say, these are also the people who know what they are doing with a computer. Based on what I said before, you get that we enter an infinite recursion here: you user no know how to use computer, but me user statistical minority, and so on...","category":"page"},{"location":"Articles/How-corporate-IT-is-killing-innovation/#The-open-source-battles-till-the-end-of-the-world","page":"How corporate IT is killing innovation","title":"The open-source battles till the end of the world","text":"","category":"section"},{"location":"Articles/How-corporate-IT-is-killing-innovation/#We-have-found-this-great-startup-selling-dreams","page":"How corporate IT is killing innovation","title":"We have found this great startup selling dreams","text":"","category":"section"},{"location":"Articles/How-corporate-IT-is-killing-innovation/#Non-technical-project-managers-everywhere","page":"How corporate IT is killing innovation","title":"Non-technical project managers everywhere","text":"","category":"section"},{"location":"Articles/How-corporate-IT-is-killing-innovation/","page":"How corporate IT is killing innovation","title":"How corporate IT is killing innovation","text":"Too-much governance and too little governance leading to no governance at all.","category":"page"},{"location":"Notebooks/07-Air-Properties/#Fitting-air-properties","page":"Fitting air properties","title":"Fitting air properties","text":"","category":"section"},{"location":"Notebooks/07-Air-Properties/","page":"Fitting air properties","title":"Fitting air properties","text":"In this note we show how to use Cantera to retrieve mixture properties for use in external simulations. This approach should be used only when composition dependency may be neglected or real-time evaluation becomes to expensive.","category":"page"},{"location":"Notebooks/07-Air-Properties/","page":"Fitting air properties","title":"Fitting air properties","text":"using WallyToolbox\n\nusing CairoMakie\nusing CondaPkg\nusing Polynomials\nusing PythonCall\n\nCondaPkg.add(\"cantera\")\n# CondaPkg.add(\"numpy\")\n\nct = pyimport(\"cantera\")\nnp = pyimport(\"numpy\")\nnothing; #hide","category":"page"},{"location":"Notebooks/07-Air-Properties/","page":"Fitting air properties","title":"Fitting air properties","text":"Since Cantera is not yet available from Julia (I am working on that!), we wrap the interfacing with Python code in function fit_gas_properties provided below.","category":"page"},{"location":"Notebooks/07-Air-Properties/","page":"Fitting air properties","title":"Fitting air properties","text":"For display of results, we also provide a standardized plotting function plot_gas_properties.","category":"page"},{"location":"Notebooks/07-Air-Properties/","page":"Fitting air properties","title":"Fitting air properties","text":"function fit_gas_properties(sol; orders = Dict())\n T = pyconvert(Vector{Float64}, sol.T)\n\n mu = pyconvert(Vector{Float64}, sol.viscosity)\n kg = pyconvert(Vector{Float64}, sol.thermal_conductivity)\n cp = pyconvert(Vector{Float64}, sol.cp_mass)\n\n poly_mu = Polynomials.fit(T, mu, get(orders, :mu, 4))\n poly_kg = Polynomials.fit(T, kg, get(orders, :kg, 4))\n poly_cp = Polynomials.fit(T, cp, get(orders, :cp, 4))\n\n return (mu, kg, cp, poly_mu, poly_kg, poly_cp)\nend\n\nfunction plot_gas_properties(\n T, mu, kg, cp, poly_mu, poly_kg, poly_cp;\n every = 10\n )\n Ts = T[begin:every:end]\n\n f = Figure(size = (700, 800))\n\n ax1 = Axis(f[1, 1]; xgridstyle=:dash, ygridstyle=:dash)\n ax2 = Axis(f[2, 1]; xgridstyle=:dash, ygridstyle=:dash)\n ax3 = Axis(f[3, 1]; xgridstyle=:dash, ygridstyle=:dash)\n\n lines!(ax1, T, mu; color = :red)\n lines!(ax2, T, kg; color = :red)\n lines!(ax3, T, cp; color = :red)\n\n scatter!(ax1, Ts, poly_mu.(Ts); color = :black)\n scatter!(ax2, Ts, poly_kg.(Ts); color = :black)\n scatter!(ax3, Ts, poly_cp.(Ts); color = :black)\n\n ax1.ylabel = \"Viscosity [Pa.s]\"\n ax2.ylabel = \"Conductivity [W/(m.K)]\"\n ax3.ylabel = \"Specific heat [J/(kg.K)]\"\n ax3.xlabel = \"Temperature [K]\"\n\n return f, (ax1, ax2, ax3)\nend\n\nnothing; #hide","category":"page"},{"location":"Notebooks/07-Air-Properties/","page":"Fitting air properties","title":"Fitting air properties","text":"For illustration purposes we make use of a typical composition of air over a broad range of temperatures.","category":"page"},{"location":"Notebooks/07-Air-Properties/","page":"Fitting air properties","title":"Fitting air properties","text":"Finally we visualize the results; verification is performed against values proposed in the literature by Mujumdar2006i [8].","category":"page"},{"location":"Notebooks/07-Air-Properties/","page":"Fitting air properties","title":"Fitting air properties","text":"let\n orders = Dict(:mu => 4, :kg => 4, :cp => 4)\n\n T = LinRange(200, 3000, 200)\n\n X = Dict(\"O2\" => 0.21, \"H2O\" => 0.006, \"Ar\" => 0.012, \"CO2\" => 0.04)\n X[\"N2\"] = 1.0 - sum(values(X))\n\n gas = ct.Solution(\"gri30.yaml\")\n sol = ct.SolutionArray(gas, shape=length(T))\n sol.TPX = pylist(T), ct.one_atm, pydict(X)\n\n rets = fit_gas_properties(sol; orders)\n\n μmuj = AirViscosityMujumdar2006()\n kmuj = AirHeatConductivityMujumdar2006()\n\n f, ax = plot_gas_properties(T, rets...)\n\n lines!(ax[1], T, μmuj.(T); color = :blue)\n lines!(ax[2], T, kmuj.(T); color = :blue)\n\n ax[1].yticks = 1.0e-05:3.0e-05:1.0e-04\n ax[2].yticks = 0.0:0.05:0.2\n ax[3].yticks = 900:100:1400\n\n xlims!(ax[1], 300, 3000)\n xlims!(ax[2], 300, 3000)\n xlims!(ax[3], 300, 3000)\n\n ylims!(ax[1], 1.0e-05, 10.0e-05)\n ylims!(ax[2], 0.0, 0.2)\n ylims!(ax[3], 900.0, 1400)\n\n f\nend","category":"page"},{"location":"Notebooks/07-Air-Properties/","page":"Fitting air properties","title":"Fitting air properties","text":"Another typical application of this approach would be to evaluate the properties of combustion flue gases for a post-combustion simulation, as follows:","category":"page"},{"location":"Notebooks/07-Air-Properties/","page":"Fitting air properties","title":"Fitting air properties","text":"let\n fuel = \"C2H2: 1.0\"\n oxid = \"O2: 1.0\"\n nums = 100\n\n gas = ct.Solution(\"gri30.yaml\")\n gas.set_equivalence_ratio(1.0, fuel=fuel, oxidizer=oxid, basis=\"mole\")\n gas.equilibrate(\"HP\")\n\n sol = ct.SolutionArray(gas, shape=(nums,))\n sol.TP = np.linspace(200, 3800, nums), ct.one_atm\n\n rets = fit_gas_properties(sol)\n\n for p in rets[end-2:end]\n println(repr(p))\n end\n\n T = pyconvert(Vector{Float64}, sol.T)\n\n f, ax = plot_gas_properties(T, rets...)\n f\nend","category":"page"},{"location":"WallyToolbox/setup-guide/#Setup-guide","page":"Setup guide","title":"Setup guide","text":"","category":"section"},{"location":"WallyToolbox/setup-guide/","page":"Setup guide","title":"Setup guide","text":"EditURL = \"https://github.com/wallytutor/WallyToolbox.jl/blob/main/docs/src/WallyToolbox/setup-guide.md\"","category":"page"},{"location":"WallyToolbox/setup-guide/","page":"Setup guide","title":"Setup guide","text":"You probably ended up here because you are looking for a full working setup of a reasonable computing environment under Windows and that is exactly the goal of this guide: to provide an easy way to setup a portable toolbox for working with scientific computing and development under Windows. It is intended to leave minimal track on host system[1], but I am not enforcing this in its development, so take care if you are not allowed to execute some software in a given computer. Except for the fact that you will probably want Microsoft MPI to be able to perform parallel computations, everything else can be deployed without administration rights.","category":"page"},{"location":"WallyToolbox/setup-guide/","page":"Setup guide","title":"Setup guide","text":"warn: Warn\nNotice that this guide is under development and instructions may still be incomplete; do not hesitate to reach me for more detailed instructions.","category":"page"},{"location":"WallyToolbox/setup-guide/","page":"Setup guide","title":"Setup guide","text":"[1]: Probably a few files and directories on your user home directory or under AppData.","category":"page"},{"location":"WallyToolbox/setup-guide/#Workflow-description","page":"Setup guide","title":"Workflow description","text":"","category":"section"},{"location":"WallyToolbox/setup-guide/","page":"Setup guide","title":"Setup guide","text":"First of all, you have to clone WallyToolbox.jl somewhere in the target computer. You can consider using GitHub Desktop at this stage, assuming you do not have Git yet. Everything else we perform here will be done under its tools/ directory. Before anything, read all the elements provided below, simply trying to follow them in order will certainly lead to errors or confusion.","category":"page"},{"location":"WallyToolbox/setup-guide/","page":"Setup guide","title":"Setup guide","text":"For each of the applications you will install, make sure to perform the following generic steps:","category":"page"},{"location":"WallyToolbox/setup-guide/","page":"Setup guide","title":"Setup guide","text":"Download the portable (often a compressed file) version of the application; the links to the currently supported applications are provided in the next section. It is recommended to create a sandbox/ directory under tools/ to save these files, it is ignored by version control.\nIf it is a compressed file, inspect it to check whether the software is contained in a compressed directory or if files are straight at the container root; in the later case create a directory with the software name and version under tools/bin/ and copy the file inside before extraction; otherwise extract it to that same directory. Several packages are stored directly at zip roots and that may be messy to clean. Once finished, you can delete the copy of the compressed file to free space.\nUnder tools/bin/ you find source.bat which is responsible by making sure all the executables may be found in your newly created environment. This file is a batch script and modifying it is the trickiest step of this guide. To open it you cannot click the file, but right-click and edit, as Windows see these as executables. First you need to find the section marked by the comment @REM NEW SYMBOLS and identify the variable associated to the software you are trying to install. Modify its value to the name of the directory you just created, that is everything you need to for most software.","category":"page"},{"location":"WallyToolbox/setup-guide/","page":"Setup guide","title":"Setup guide","text":"Once you have finished installing everything, comment out all set PATH related to software you are not installing; this way you avoid telling the system to search for executables under non-existing directories. Other commands such as call to non-existing scripts might break your system. Also remove any REG ADD that is not being used.","category":"page"},{"location":"WallyToolbox/setup-guide/","page":"Setup guide","title":"Setup guide","text":"Now you can launch the editor with access to the deployed software by clicking tools/code.vbs. It is recommended you create a symbolic link to this file in your desktop for each of use later, as navigating to this directory every time may be excruciating.","category":"page"},{"location":"WallyToolbox/setup-guide/#Minimal-working-environment","page":"Setup guide","title":"Minimal working environment","text":"","category":"section"},{"location":"WallyToolbox/setup-guide/","page":"Setup guide","title":"Setup guide","text":"These are required to get your system working for the first time. After installing VS Code, enable its portable mode and install required extensions (Python and Julia support, ...). Also notice that there is a tools/vscode/ directory for keeping user configurations in a version controlled way.","category":"page"},{"location":"WallyToolbox/setup-guide/","page":"Setup guide","title":"Setup guide","text":"VS Code\nGit\nJulia\nPython","category":"page"},{"location":"WallyToolbox/setup-guide/","page":"Setup guide","title":"Setup guide","text":"From a VS Code terminal launched using code.vbs script you can run wjulia as an alias to launch the toolbox; notice that launching this way is the only meaningful way to work with the toolbox as described here since that script will set all the required environment variables.","category":"page"},{"location":"WallyToolbox/setup-guide/","page":"Setup guide","title":"Setup guide","text":"To be able to use module WallyToolbox.Notebook or launch its exported interface for literate programming in the utilities, an user-defined value of environment variable JUPYTER_DATA_DIR must be provided to avoid conflict with system files. It must be noticed that this utility module is intentionally undocumented.","category":"page"},{"location":"WallyToolbox/setup-guide/","page":"Setup guide","title":"Setup guide","text":"Python modules are currently second-grade citizens to WallyToolbox; they consist mostly of domain-specific code that I did not yet migrate to Julia. Nonetheless, some code will remain in Python because fields such as computer vision and overall machine learning have a much broader community and thus quality tools. Wrapping these in Julia through PythonCall is not considered as an alternative for now. ","category":"page"},{"location":"WallyToolbox/setup-guide/","page":"Setup guide","title":"Setup guide","text":"# Install `virtualenv`:\npip install virtualenv\n\n# Create a virtual environment:\nvirtualenv venv\n\n# Alternativelly use built-in `venv`:\n# python -m venv venv\n\n# Activate the environment:\n./venv/Scripts/activate\n\n# Install dependencies, if any:\npip install -r requirements.txt","category":"page"},{"location":"WallyToolbox/setup-guide/#LaTeX-and-related","page":"Setup guide","title":"LaTeX and related","text":"","category":"section"},{"location":"WallyToolbox/setup-guide/","page":"Setup guide","title":"Setup guide","text":"Although LaTeX is not mandatory, it is highly encouraged; otherwise, what is the point of doing any scientific computing and not publishing its results? Also for a fully operational Jupyter notebook environment you need both pandoc and inkscape. ","category":"page"},{"location":"WallyToolbox/setup-guide/","page":"Setup guide","title":"Setup guide","text":"MikTeX\ntexstudio\nJabRef\npandoc\ninkscape","category":"page"},{"location":"WallyToolbox/setup-guide/","page":"Setup guide","title":"Setup guide","text":"Globally install pip install Pygments for enabling syntax highlight in LaTeX using minted; that is the most flexible highlighting method for adding code snippets to your documents.","category":"page"},{"location":"WallyToolbox/setup-guide/","page":"Setup guide","title":"Setup guide","text":"To append to TEXMF variable one can use the MiKTeX Console graphical interface and under Settings > Directories navigate and select the local path. Alternativelly on can add to bin//texmfs/install/miktex/config/miktexstartup.ini a line as","category":"page"},{"location":"WallyToolbox/setup-guide/","page":"Setup guide","title":"Setup guide","text":"CommonRoots=C:/Path/To/Local/TeX/Tree","category":"page"},{"location":"WallyToolbox/setup-guide/","page":"Setup guide","title":"Setup guide","text":"pointing to a directory implementing the user's TeX Directory Structure.","category":"page"},{"location":"WallyToolbox/setup-guide/#Domain-specific","page":"Setup guide","title":"Domain-specific","text":"","category":"section"},{"location":"WallyToolbox/setup-guide/#Science-and-Engineering","page":"Setup guide","title":"Science and Engineering","text":"","category":"section"},{"location":"WallyToolbox/setup-guide/","page":"Setup guide","title":"Setup guide","text":"Since these are mostly domain-specific, it is up to you to select from the list.","category":"page"},{"location":"WallyToolbox/setup-guide/","page":"Setup guide","title":"Setup guide","text":"DualSPHysics\nCantera\nCasADi\nDWSIM\nElmerFEM\nFreeFem++\nLAMMPS\nOpenModelica\nSU2","category":"page"},{"location":"WallyToolbox/setup-guide/","page":"Setup guide","title":"Setup guide","text":"For DualSPHysics one might also want to install this FreeCAD addon and this Blender addon.","category":"page"},{"location":"WallyToolbox/setup-guide/","page":"Setup guide","title":"Setup guide","text":"Read comments in tools/bin/source.bat for additional instructions, e.g. how to setup a Frankenstein LAMMPS installation. It requires a good familiarity with the inner workings of software and libraries; in the future I will reach LAMMPS maintainers to make this simpler and part of the official releases.","category":"page"},{"location":"WallyToolbox/setup-guide/#Geometry-and-preprocessing","page":"Setup guide","title":"Geometry and preprocessing","text":"","category":"section"},{"location":"WallyToolbox/setup-guide/","page":"Setup guide","title":"Setup guide","text":"Again some domain-specific software, select what you need.","category":"page"},{"location":"WallyToolbox/setup-guide/","page":"Setup guide","title":"Setup guide","text":"Blender\nFreeCAD\ngmsh\ngnuplot\nParaView\nSalome","category":"page"},{"location":"WallyToolbox/setup-guide/#Additional-languages","page":"Setup guide","title":"Additional languages","text":"","category":"section"},{"location":"WallyToolbox/setup-guide/","page":"Setup guide","title":"Setup guide","text":"It is highly discouraged to use Octave for any large project, but it might be interesting to use it for teaching linear algebra and the basics of numerical mathematics, so it is also supported.","category":"page"},{"location":"WallyToolbox/setup-guide/","page":"Setup guide","title":"Setup guide","text":"Octave","category":"page"},{"location":"WallyToolbox/setup-guide/#Possible-roadmap","page":"Setup guide","title":"Possible roadmap","text":"","category":"section"},{"location":"WallyToolbox/setup-guide/","page":"Setup guide","title":"Setup guide","text":"7-zip\nDyssol\nFiji\nFileZilla\nIpopt\nlazarus\nMSYS2\nMUSEN\nNotepad\nnteract\nnvim\nOpenCALPHAD\nOrange3\npuTTy\nScilab\nstrawberry-perl\nTabby\nZeroBraneStudio","category":"page"},{"location":"WallyToolbox/setup-guide/#Documentation-build","page":"Setup guide","title":"Documentation build","text":"","category":"section"},{"location":"WallyToolbox/setup-guide/","page":"Setup guide","title":"Setup guide","text":"Documentation is generated by a GitHub Actions workflow at every commit to the main branch. Because of the multiple modules in a repository structure, this documentation follows intrinsically a rolling release logic. Because the package and modules are not registered, they also do not appear in the docs/Project.toml. So it is up to the maintainers to ensure that section [deps] of docs/Project.toml points to ALL dependencies of ALL sub-packages.","category":"page"},{"location":"WallyToolbox/setup-guide/","page":"Setup guide","title":"Setup guide","text":"For generating the documentation locally, run julia --project=docs/ and in REPL run the following command:","category":"page"},{"location":"WallyToolbox/setup-guide/","page":"Setup guide","title":"Setup guide","text":"julia> include(\"docs/make.jl\")\n Resolving package versions...\n ...","category":"page"},{"location":"Modules/Cantera/#Cantera","page":"Cantera","title":"Cantera","text":"","category":"section"},{"location":"Modules/Cantera/","page":"Cantera","title":"Cantera","text":"This page documents the wrapper written around the C-API of Cantera. The status of development is documented here. Its goal is not to mimic the original API or provide an interface equivalent to the Python package, but something in line with the functioning of the parent toolbox.","category":"page"},{"location":"Modules/Cantera/#Status-of-Cantera-wrapper","page":"Cantera","title":"Status of Cantera wrapper","text":"","category":"section"},{"location":"Modules/Cantera/","page":"Cantera","title":"Cantera","text":"This is an experimental interface to Cantera library based on its C-API version 3.0. This interface is at its early days and has developped for Julia >= 1.9.0 under Windows 10/11. When it is stable enough it will be published as a package and tested under other platforms.","category":"page"},{"location":"Modules/Cantera/#Useful-links","page":"Cantera","title":"Useful links","text":"","category":"section"},{"location":"Modules/Cantera/","page":"Cantera","title":"Cantera","text":"Source files\nHeader files","category":"page"},{"location":"Modules/Cantera/#API-of-ct.h","page":"Cantera","title":"API of ct.h","text":"","category":"section"},{"location":"Modules/Cantera/","page":"Cantera","title":"Cantera","text":"Documentation here.","category":"page"},{"location":"Modules/Cantera/","page":"Cantera","title":"Cantera","text":"Status Header Function Module\nTested ct.h ct_appdelete inlined\nStruct ct.h soln_newSolution wrapped\n ct.h soln_newInterface waitlist\nTested ct.h soln_del inlined\nTested ct.h soln_name inlined\nStruct ct.h soln_thermo inlined\nStruct ct.h soln_kinetics inlined\nStruct ct.h soln_transport inlined\nTested ct.h soln_setTransportModel wrapped\nTested ct.h soln_nAdjacent inlined\n ct.h soln_adjacent waitlist\nTested ct.h thermo_newFromFile wrapped\nTested ct.h thermo_del inlined\nStruct ct.h thermo_nElements inlined\nStruct ct.h thermo_nSpecies inlined\nTested ct.h thermo_temperature inlined\nStruct ct.h thermo_setTemperature inlined\nTested ct.h thermo_density inlined\nTested ct.h thermo_setDensity inlined\nTested ct.h thermo_molarDensity inlined\nTested ct.h thermo_setMolarDensity inlined\nTested ct.h thermo_meanMolecularWeight inlined\nTested ct.h thermo_moleFraction inlined\nTested ct.h thermo_massFraction inlined\nStruct ct.h thermo_getMoleFractions inlined\nTested ct.h thermo_getMassFractions inlined\nStruct ct.h thermo_setMoleFractions inlined\nTested ct.h thermo_setMassFractions inlined\n ct.h thermo_setMoleFractionsByName \n ct.h thermo_setMassFractionsByName \n ct.h thermo_getAtomicWeights \n ct.h thermo_getMolecularWeights \n ct.h thermo_getCharges \n ct.h thermo_getElementName \n ct.h thermo_getSpeciesName \n ct.h thermo_getName \n ct.h thermo_setName \n ct.h thermo_elementIndex \n ct.h thermo_speciesIndex \n ct.h thermo_report \nTested ct.h thermo_print \n ct.h thermo_nAtoms \n ct.h thermo_addElement \n ct.h thermo_getEosType \nTo test ct.h thermo_refPressure inlined\nTo test ct.h thermo_minTemp inlined\nTo test ct.h thermo_maxTemp inlined\nTo test ct.h thermoenthalpymole inlined\nTo test ct.h thermointEnergymole inlined\nTo test ct.h thermoentropymole inlined\nTo test ct.h thermogibbsmole inlined\nTo test ct.h thermocpmole inlined\nTo test ct.h thermocvmole inlined\nTo test ct.h thermo_pressure inlined\nStruct ct.h thermo_setPressure inlined\nTo test ct.h thermoenthalpymass inlined\nTo test ct.h thermointEnergymass inlined\nTo test ct.h thermoentropymass inlined\nTo test ct.h thermogibbsmass inlined\nTo test ct.h thermocpmass inlined\nTo test ct.h thermocvmass inlined\nTo test ct.h thermo_electricPotential inlined\nTo test ct.h thermo_thermalExpansionCoeff inlined\nTo test ct.h thermo_isothermalCompressibility inlined\n ct.h thermo_chemPotentials \n ct.h thermogetEnthalpiesRT \n ct.h thermogetEntropiesR \n ct.h thermogetCpR \n ct.h thermo_setElectricPotential \n ct.h thermosetTP \n ct.h thermosetTD \n ct.h thermosetRP \n ct.h thermosetDP \n ct.h thermosetHP \n ct.h thermosetUV \n ct.h thermosetSV \n ct.h thermosetSP \n ct.h thermosetST \n ct.h thermosetTV \n ct.h thermosetPV \n ct.h thermosetUP \n ct.h thermosetVH \n ct.h thermosetTH \n ct.h thermosetSH \nTested ct.h thermo_equilibrate \nTo test ct.h thermo_critTemperature inlined\nTo test ct.h thermo_critPressure inlined\nTo test ct.h thermo_critDensity inlined\nTo test ct.h thermo_vaporFraction inlined\n ct.h thermo_satTemperature \n ct.h thermo_satPressure \n ct.h thermosetStatePsat \n ct.h thermosetStateTsat \n ct.h kin_newFromFile \nTo test ct.h kin_del inlined\nTo test ct.h kin_nSpecies inlined\nTo test ct.h kin_nReactions inlined\nTo test ct.h kin_nPhases inlined\n ct.h kin_phaseIndex \nTo test ct.h kin_reactionPhaseIndex inlined\n ct.h kin_reactantStoichCoeff \n ct.h kin_productStoichCoeff \n ct.h kin_getReactionType \n ct.h kin_getFwdRatesOfProgress \n ct.h kin_getRevRatesOfProgress \n ct.h kin_getNetRatesOfProgress \n ct.h kin_getEquilibriumConstants \n ct.h kin_getFwdRateConstants \n ct.h kin_getRevRateConstants \n ct.h kin_getDelta \n ct.h kin_getCreationRates \n ct.h kin_getDestructionRates \n ct.h kin_getNetProductionRates \n ct.h kin_getSourceTerms \nTo test ct.h kin_multiplier inlined\n ct.h kin_getReactionString \n ct.h kin_setMultiplier \nTo test ct.h kin_isReversible inlined\n ct.h kin_getType \nTo test ct.h kin_start inlined\n ct.h kin_speciesIndex \nTo test ct.h kin_advanceCoverages inlined\nTo test ct.h kin_phase inlined\nTo test ct.h trans_newDefault inlined\n ct.h trans_new \nTo test ct.h trans_del inlined\nTo test ct.h trans_transportModel inlined\nTo test ct.h trans_viscosity inlined\nTo test ct.h trans_electricalConductivity inlined\n ct.h trans_thermalConductivity \n ct.h trans_getThermalDiffCoeffs \n ct.h trans_getMixDiffCoeffs \n ct.h trans_getBinDiffCoeffs \n ct.h trans_getMultiDiffCoeffs \n ct.h trans_setParameters \n ct.h trans_getMolarFluxes \n ct.h trans_getMassFluxes \n ct.h ct_getCanteraError \n ct.h ct_setLogWriter \n ct.h ct_setLogCallback \n ct.h ct_addCanteraDirectory \n ct.h ct_getDataDirectories \n ct.h ct_getCanteraVersion \n ct.h ct_getGitCommit \nTested ct.h ctsuppressthermo_warnings inlined\nTested ct.h ctuselegacyrateconstants inlined\nTested ct.h ct_clearStorage inlined\nTested ct.h ct_resetStorage inlined","category":"page"},{"location":"Modules/Cantera/#API-of-ctfunc.h","page":"Cantera","title":"API of ctfunc.h","text":"","category":"section"},{"location":"Modules/Cantera/","page":"Cantera","title":"Cantera","text":"Documentation here.","category":"page"},{"location":"Modules/Cantera/","page":"Cantera","title":"Cantera","text":"Status Header Function Module\n ctfunc.h func_new \n ctfunc.h funcnewbasic \n ctfunc.h funcnewadvanced \n ctfunc.h funcnewcompound \n ctfunc.h funcnewmodified \nTo test ctfunc.h func_del inlined\n ctfunc.h func_type \nTo test ctfunc.h func_value inlined\nTo test ctfunc.h func_derivative inlined\nTo test ctfunc.h func_duplicate inlined\n ctfunc.h func_write \nTo test ctfunc.h ct_clearFunc inlined","category":"page"},{"location":"Modules/Cantera/#API-of-ctmultiphase.h","page":"Cantera","title":"API of ctmultiphase.h","text":"","category":"section"},{"location":"Modules/Cantera/","page":"Cantera","title":"Cantera","text":"Documentation here.","category":"page"},{"location":"Modules/Cantera/","page":"Cantera","title":"Cantera","text":"Status Header Function Module\nTo test ctmultiphase.h mix_new inlined\nTo test ctmultiphase.h mix_del inlined\nTo test ctmultiphase.h ct_clearMix inlined\n ctmultiphase.h mix_addPhase \nTo test ctmultiphase.h mix_init inlined\nTo test ctmultiphase.h mix_updatePhases inlined\nTo test ctmultiphase.h mix_nElements inlined\n ctmultiphase.h mix_elementIndex \n ctmultiphase.h mix_speciesIndex \nTo test ctmultiphase.h mix_nSpecies inlined\nTo test ctmultiphase.h mix_setTemperature inlined\nTo test ctmultiphase.h mix_temperature inlined\nTo test ctmultiphase.h mix_minTemp inlined\nTo test ctmultiphase.h mix_maxTemp inlined\nTo test ctmultiphase.h mix_charge inlined\nTo test ctmultiphase.h mix_phaseCharge inlined\nTo test ctmultiphase.h mix_setPressure inlined\nTo test ctmultiphase.h mix_pressure inlined\nTo test ctmultiphase.h mix_nAtoms inlined\nTo test ctmultiphase.h mix_nPhases inlined\nTo test ctmultiphase.h mix_phaseMoles inlined\n ctmultiphase.h mix_setPhaseMoles \n ctmultiphase.h mix_setMoles \n ctmultiphase.h mix_setMolesByName \nTo test ctmultiphase.h mix_speciesMoles inlined\nTo test ctmultiphase.h mix_elementMoles inlined\n ctmultiphase.h mix_equilibrate \n ctmultiphase.h mix_getChemPotentials \nTo test ctmultiphase.h mix_enthalpy inlined\nTo test ctmultiphase.h mix_entropy inlined\nTo test ctmultiphase.h mix_gibbs inlined\nTo test ctmultiphase.h mix_cp inlined\nTo test ctmultiphase.h mix_volume inlined\nTo test ctmultiphase.h mix_speciesPhaseIndex inlined\nTo test ctmultiphase.h mix_moleFraction inlined","category":"page"},{"location":"Modules/Cantera/#API-of-ctonedim.h","page":"Cantera","title":"API of ctonedim.h","text":"","category":"section"},{"location":"Modules/Cantera/","page":"Cantera","title":"Cantera","text":"Documentation here.","category":"page"},{"location":"Modules/Cantera/","page":"Cantera","title":"Cantera","text":"Status Header Function Module\nTo test ctonedim.h ct_clearOneDim inlined\n ctonedim.h domain_new \nTo test ctonedim.h domain_del inlined\nTo test ctonedim.h domain_type inlined\n ctonedim.h domain_type3 \nTo test ctonedim.h domain_index inlined\nTo test ctonedim.h domain_nComponents inlined\nTo test ctonedim.h domain_nPoints inlined\n ctonedim.h domain_componentName \n ctonedim.h domain_componentIndex \n ctonedim.h domain_setBounds \nTo test ctonedim.h domain_lowerBound inlined\nTo test ctonedim.h domain_upperBound inlined\n ctonedim.h domain_setSteadyTolerances \n ctonedim.h domain_setTransientTolerances \nTo test ctonedim.h domain_rtol inlined\nTo test ctonedim.h domain_atol inlined\n ctonedim.h domain_setupGrid \n ctonedim.h domain_setID \nTo test ctonedim.h domain_grid inlined\nTo test ctonedim.h bdry_setMdot inlined\nTo test ctonedim.h bdry_setTemperature inlined\nTo test ctonedim.h bdry_setSpreadRate inlined\n ctonedim.h bdry_setMoleFractions \nTo test ctonedim.h bdry_temperature inlined\nTo test ctonedim.h bdry_spreadRate inlined\nTo test ctonedim.h bdry_massFraction inlined\nTo test ctonedim.h bdry_mdot inlined\nTo test ctonedim.h reactingsurf_setkineticsmgr inlined\nTo test ctonedim.h reactingsurf_enableCoverageEqs inlined\nTo test ctonedim.h inlet_new inlined\nTo test ctonedim.h outlet_new inlined\nTo test ctonedim.h outletres_new inlined\nTo test ctonedim.h symm_new inlined\nTo test ctonedim.h surf_new inlined\nTo test ctonedim.h reactingsurf_new inlined\nTo test ctonedim.h inlet_setSpreadRate inlined\n ctonedim.h stflow_new \nTo test ctonedim.h stflow_setTransport inlined\nTo test ctonedim.h stflow_enableSoret inlined\nTo test ctonedim.h stflow_setPressure inlined\nTo test ctonedim.h stflow_pressure inlined\n ctonedim.h stflow_setFixedTempProfile \nTo test ctonedim.h stflow_solveEnergyEqn inlined\n ctonedim.h sim1D_new \nTo test ctonedim.h sim1D_del inlined\n ctonedim.h sim1D_setValue \n ctonedim.h sim1D_setProfile \n ctonedim.h sim1D_setFlatProfile \n ctonedim.h sim1D_show \n ctonedim.h sim1D_showSolution \n ctonedim.h sim1D_setTimeStep \nTo test ctonedim.h sim1D_getInitialSoln inlined\n ctonedim.h sim1D_solve \nTo test ctonedim.h sim1D_refine inlined\n ctonedim.h sim1D_setRefineCriteria \n ctonedim.h sim1D_setGridMin \n ctonedim.h sim1D_save \n ctonedim.h sim1D_restore \nTo test ctonedim.h sim1D_writeStats inlined\n ctonedim.h sim1D_domainIndex \n ctonedim.h sim1D_value \n ctonedim.h sim1D_workValue \nTo test ctonedim.h sim1D_eval inlined\nTo test ctonedim.h sim1D_setMaxJacAge inlined\nTo test ctonedim.h sim1D_setFixedTemperature inlined","category":"page"},{"location":"Modules/Cantera/#API-of-ctreactor.h","page":"Cantera","title":"API of ctreactor.h","text":"","category":"section"},{"location":"Modules/Cantera/","page":"Cantera","title":"Cantera","text":"Documentation here.","category":"page"},{"location":"Modules/Cantera/","page":"Cantera","title":"Cantera","text":"Status Header Function Module\n ctreactor.h reactor_new \nTo test ctreactor.h reactor_del inlined\nTo test ctreactor.h reactor_setInitialVolume inlined\nTo test ctreactor.h reactor_setChemistry inlined\nTo test ctreactor.h reactor_setEnergy inlined\nTo test ctreactor.h reactor_setThermoMgr inlined\nTo test ctreactor.h reactor_setKineticsMgr inlined\nTo test ctreactor.h reactor_insert inlined\nTo test ctreactor.h reactor_mass inlined\nTo test ctreactor.h reactor_volume inlined\nTo test ctreactor.h reactor_density inlined\nTo test ctreactor.h reactor_temperature inlined\nTo test ctreactor.h reactorenthalpymass inlined\nTo test ctreactor.h reactorintEnergymass inlined\nTo test ctreactor.h reactor_pressure inlined\nTo test ctreactor.h reactor_massFraction inlined\nTo test ctreactor.h reactor_nSensParams inlined\nTo test ctreactor.h reactor_addSensitivityReaction inlined\nTo test ctreactor.h flowReactor_setMassFlowRate inlined\nTo test ctreactor.h reactornet_new inlined\nTo test ctreactor.h reactornet_del inlined\nTo test ctreactor.h reactornet_setInitialTime inlined\nTo test ctreactor.h reactornet_setMaxTimeStep inlined\nTo test ctreactor.h reactornet_setTolerances inlined\nTo test ctreactor.h reactornet_setSensitivityTolerances inlined\nTo test ctreactor.h reactornet_addreactor inlined\nTo test ctreactor.h reactornet_advance inlined\nTo test ctreactor.h reactornet_step inlined\nTo test ctreactor.h reactornet_time inlined\nTo test ctreactor.h reactornet_rtol inlined\nTo test ctreactor.h reactornet_atol inlined\n ctreactor.h reactornet_sensitivity \n ctreactor.h flowdev_new \nTo test ctreactor.h flowdev_del inlined\nTo test ctreactor.h flowdev_install inlined\nTo test ctreactor.h flowdev_setMaster inlined\nTo test ctreactor.h flowdev_setPrimary inlined\nTo test ctreactor.h flowdev_massFlowRate inlined\nTo test ctreactor.h flowdev_setMassFlowCoeff inlined\nTo test ctreactor.h flowdev_setValveCoeff inlined\nTo test ctreactor.h flowdev_setPressureCoeff inlined\nTo test ctreactor.h flowdev_setPressureFunction inlined\nTo test ctreactor.h flowdev_setTimeFunction inlined\n ctreactor.h wall_new \nTo test ctreactor.h wall_del inlined\nTo test ctreactor.h wall_install inlined\nTo test ctreactor.h wall_vdot inlined\nTo test ctreactor.h wall_expansionRate inlined\nTo test ctreactor.h wall_Q inlined\nTo test ctreactor.h wall_heatRate inlined\nTo test ctreactor.h wall_area inlined\nTo test ctreactor.h wall_setArea inlined\nTo test ctreactor.h wall_setThermalResistance inlined\nTo test ctreactor.h wall_setHeatTransferCoeff inlined\nTo test ctreactor.h wall_setHeatFlux inlined\nTo test ctreactor.h wall_setExpansionRateCoeff inlined\nTo test ctreactor.h wall_setVelocity inlined\nTo test ctreactor.h wall_setEmissivity inlined\nTo test ctreactor.h wall_ready inlined\nTo test ctreactor.h reactorsurface_new inlined\nTo test ctreactor.h reactorsurface_del inlined\nTo test ctreactor.h reactorsurface_install inlined\nTo test ctreactor.h reactorsurface_setkinetics inlined\nTo test ctreactor.h reactorsurface_area inlined\nTo test ctreactor.h reactorsurface_setArea inlined\nTo test ctreactor.h reactorsurface_addSensitivityReaction inlined\nTo test ctreactor.h ct_clearReactors inlined","category":"page"},{"location":"Modules/Cantera/#API-of-ctrpath.h","page":"Cantera","title":"API of ctrpath.h","text":"","category":"section"},{"location":"Modules/Cantera/","page":"Cantera","title":"Cantera","text":"Documentation here.","category":"page"},{"location":"Modules/Cantera/","page":"Cantera","title":"Cantera","text":"Status Header Function Module\nTo test ctrpath.h rdiag_new inlined\nTo test ctrpath.h rdiag_del inlined\nTo test ctrpath.h rdiag_detailed inlined\nTo test ctrpath.h rdiag_brief inlined\nTo test ctrpath.h rdiag_setThreshold inlined\n ctrpath.h rdiag_setBoldColor \n ctrpath.h rdiag_setNormalColor \n ctrpath.h rdiag_setDashedColor \n ctrpath.h rdiag_setDotOptions \nTo test ctrpath.h rdiag_setBoldThreshold inlined\nTo test ctrpath.h rdiag_setNormalThreshold inlined\nTo test ctrpath.h rdiag_setLabelThreshold inlined\nTo test ctrpath.h rdiag_setScale inlined\nTo test ctrpath.h rdiag_setFlowType inlined\nTo test ctrpath.h rdiag_setArrowWidth inlined\n ctrpath.h rdiag_setTitle \n ctrpath.h rdiag_write \nTo test ctrpath.h rdiag_add inlined\n ctrpath.h rdiag_findMajor \n ctrpath.h rdiag_setFont \nTo test ctrpath.h rdiag_displayOnly inlined\nTo test ctrpath.h rbuild_new inlined\nTo test ctrpath.h rbuild_del inlined\n ctrpath.h rbuild_init \n ctrpath.h rbuild_build \nTo test ctrpath.h ct_clearReactionPath inlined","category":"page"},{"location":"Modules/Cantera/#API-of-ctsurf.h","page":"Cantera","title":"API of ctsurf.h","text":"","category":"section"},{"location":"Modules/Cantera/","page":"Cantera","title":"Cantera","text":"Documentation here.","category":"page"},{"location":"Modules/Cantera/","page":"Cantera","title":"Cantera","text":"Status Header Function Module\n ctsurf.h surf_setCoverages \n ctsurf.h surf_getCoverages \n ctsurf.h surf_setConcentrations \n ctsurf.h surf_getConcentrations \nTo test ctsurf.h surf_setSiteDensity inlined\nTo test ctsurf.h surf_siteDensity inlined\n ctsurf.h surf_setCoveragesByName ","category":"page"},{"location":"Modules/Cantera/#Cantera-samples","page":"Cantera","title":"Cantera samples","text":"","category":"section"},{"location":"Modules/Cantera/","page":"Cantera","title":"Cantera","text":"# cantera = \"C:\\\\Program Files\\\\Cantera\\\\bin\\\\cantera_shared.dll\"\n#\n# ENV[\"CANTERA_SHARED\"] = cantera\n# @assert haskey(ENV, \"CANTERA_SHARED\")\n#\n# FIXME: how to run this in GitHub???\n#\n# @assert ct.appdelete()\n# @assert ct.resetstorage()\n# @assert ct.clearstorage()\n# @assert ct.suppress_thermo_warnings(true)\n# @assert ct.use_legacy_rate_constants(false)\n#\n# sol = ct.Solution(\"gri30.yaml\", \"gri30\", \"mixture-averaged\")\n# gas = ct.Solution(\"gri30.yaml\", \"gri30\", \"mixture-averaged\")\n#\n# Xᵣ = zeros(sol.nspecies)\n# Xᵣ[1] = 1.0\n#\n# Tᵣ = 3500.0\n# Pᵣ = 50000.0\n#\n# ct.set_TPX!(sol, Tᵣ, Pᵣ, Xᵣ; norm = true)\n#\n# @assert ct.gettemperature(sol) ≈ Tᵣ\n# @assert ct.getpressure(sol) ≈ Pᵣ\n# @assert all(ct.getmolefractions(sol) ≈ Xᵣ)\n#\n# ct.equilibrate!(sol, \"HP\", print_results = true)","category":"page"},{"location":"Notebooks/A2-Ciencia-Colaborativa-e-Julia/#Ciência-colaborativa-e-Julia","page":"Ciência colaborativa e Julia","title":"Ciência colaborativa e Julia","text":"","category":"section"},{"location":"Notebooks/A2-Ciencia-Colaborativa-e-Julia/","page":"Ciência colaborativa e Julia","title":"Ciência colaborativa e Julia","text":"Uma dificuldade recorrente encontrada em projetos científicos contendo uma componente numérica é o despreparo dos colaboradores para a gestão de dados e documentos. Essa dificuldade não é somente técnica, mas frequentemente a origem de discórdias nos projetos.","category":"page"},{"location":"Notebooks/A2-Ciencia-Colaborativa-e-Julia/","page":"Ciência colaborativa e Julia","title":"Ciência colaborativa e Julia","text":"O estudo de Julia ou qualquer outra ferramenta para suporte computacional em ciência não tem sentido sem o caráter aplicativo no contexto de um projeto, seja ele acadêmico ou industrial. Neste anexo vamos abordar algumas ferramentas complementares ao uso de Julia úteis para o cientista e apontar os caminhos para encontrá-las e aprender mais sobre elas sem entrar nos detalhes de seus usos. A lista provida não é exaustiva mas contém um esqueleto mínimo que toda pesquisa séria deveria adotar para prover materiais com controle de qualidade e versionagem adequada.","category":"page"},{"location":"Notebooks/A2-Ciencia-Colaborativa-e-Julia/","page":"Ciência colaborativa e Julia","title":"Ciência colaborativa e Julia","text":"Para estudar aspectos computacionais em ciência você precisa de alguns componentes de suporte à linguagem de programação usada, em nosso caso Julia. No que se segue vamos apresentar:","category":"page"},{"location":"Notebooks/A2-Ciencia-Colaborativa-e-Julia/","page":"Ciência colaborativa e Julia","title":"Ciência colaborativa e Julia","text":"O editor de texto recomendado VS Code e a extensão requerida.\nA linguagem LaTeX usada para a entrada de equações nos notebooks e artigos.\nAs ferramentas necessárias para editar LaTeX fora do contexto de Julia.\nE finalmente o sistema de versionagem Git.\nOutras ferramentas de suporte.","category":"page"},{"location":"Notebooks/A2-Ciencia-Colaborativa-e-Julia/#VS-Code","page":"Ciência colaborativa e Julia","title":"VS Code","text":"","category":"section"},{"location":"Notebooks/A2-Ciencia-Colaborativa-e-Julia/","page":"Ciência colaborativa e Julia","title":"Ciência colaborativa e Julia","text":"Nos últimos anos VSCode se tornou o editor mais popular da comunidade open source e com toda razão. A qualidade da ferramenta provida pela Microsoft chegou a um nível que é difícil justificar o uso de um editor de código comercial. Aliado a isso, com a extensão Julia VSCode um suporte avançado a edição de código e documentação da linguagem é disponível. Além disso, a ferramenta provê integração com o sistema de controle de versões Git que vamos discutir no que se segue.","category":"page"},{"location":"Notebooks/A2-Ciencia-Colaborativa-e-Julia/#\\LaTeX","page":"Ciência colaborativa e Julia","title":"LaTeX","text":"","category":"section"},{"location":"Notebooks/A2-Ciencia-Colaborativa-e-Julia/","page":"Ciência colaborativa e Julia","title":"Ciência colaborativa e Julia","text":"Para a entrada de equações nos notebooks, Julia markdown provê suporte à renderização de LaTeX. É fundamental ter algum domínio desta linguagem para a elaborção de documentos científicos. As distribuições mais populares são MiKTeX para Windows e TeX Live para os demais sistemas operacionais. Ademais, artigos escritos usando a linguagem são aceitos pelas publicações mais relevantes em várias áreas do conhecimento. Outra razão para o uso de LaTeX é a estocagem de documentos em formato de texto bruto, o que permite um controle de versões com Git.","category":"page"},{"location":"Notebooks/A2-Ciencia-Colaborativa-e-Julia/#TeXStudio","page":"Ciência colaborativa e Julia","title":"TeXStudio","text":"","category":"section"},{"location":"Notebooks/A2-Ciencia-Colaborativa-e-Julia/","page":"Ciência colaborativa e Julia","title":"Ciência colaborativa e Julia","text":"Em complemento à distribuição de LaTeX é necessário um editor de texto adaptado. Embora existam extensões excelentes para realizar a compilação dos documentos [1] para VS Code, elas não são muito fáceis de se compreender para um iniciante. Por isso recomendamos TeXStudio para editar e compilar documentos escritos em LaTeX.","category":"page"},{"location":"Notebooks/A2-Ciencia-Colaborativa-e-Julia/","page":"Ciência colaborativa e Julia","title":"Ciência colaborativa e Julia","text":"[1]: Por compilação entende-se em nossos dias transformar o documento em PDF.","category":"page"},{"location":"Notebooks/A2-Ciencia-Colaborativa-e-Julia/#JabRef","page":"Ciência colaborativa e Julia","title":"JabRef","text":"","category":"section"},{"location":"Notebooks/A2-Ciencia-Colaborativa-e-Julia/","page":"Ciência colaborativa e Julia","title":"Ciência colaborativa e Julia","text":"Embora as referências bibliográficas possam ser inseridas diretamente em documentos LaTeX, o ideal é utilizar uma base de dados comum que possa ser reutilizada ao longo da carreira de pesquisa. JabRef é um gestor de bibliografia para o formato BibTeX suportado por LaTeX que estoca dados diretamente em formato textual. A interface gráfica é fácil de interagir e dado o formato de documento, as bases .bib são compatíveis com Git. ","category":"page"},{"location":"Notebooks/A2-Ciencia-Colaborativa-e-Julia/#Git","page":"Ciência colaborativa e Julia","title":"Git","text":"","category":"section"},{"location":"Notebooks/A2-Ciencia-Colaborativa-e-Julia/","page":"Ciência colaborativa e Julia","title":"Ciência colaborativa e Julia","text":"Falamos bastante em Git até o momento sem entrar em mais detalhes de que é uma ferramenta de controle de versões. Git elimina a prática insana de se salvar manualmente várias cópias de um mesmo documento para gerir versões. O sistema basea-se na comparação de conteúdos e propõe de se salvar unicamente os documentos modificados em um projeto. Embora seu uso básico seja bastante simples e plausível de se aprender em uma tarde de estudo, a ferramenta é bastante complexa e complexa, permitindo de voltar em pontos históricos de um projeto, publicar releases, etc. Para uma pesquisa sã e durável, o uso de documentos em formatos aceitando texto bruto em conjunto com Git é ideal.","category":"page"},{"location":"Notebooks/A2-Ciencia-Colaborativa-e-Julia/#Python","page":"Ciência colaborativa e Julia","title":"Python","text":"","category":"section"},{"location":"Notebooks/A2-Ciencia-Colaborativa-e-Julia/","page":"Ciência colaborativa e Julia","title":"Ciência colaborativa e Julia","text":"Embora esse seja um curso de Julia, é importante que o cientista também tenha conhecimento de Python. Python é uma linguagem generalista que também é bastante rica em termos de pacotes para aplicações científicas. Em termos de aprendizado é relativamente mais simples que Julia, com o porém que código nativo em Python é extremamente lento, requerindo sempre o uso de bibliotecas que na verdade são implementadas em C, Fortran, Rust, etc. Para a concepção de aplicações web especialmente a linguagem encontra-se num estado de maturidade bastante superior à Julia e não deve ser negligenciada. Ademais, encontra-se entre as linguagens mais utilizadas no mundo, enquanto Julia é uma linguagem de nicho.","category":"page"},{"location":"Notebooks/A2-Ciencia-Colaborativa-e-Julia/#GNUPlot","page":"Ciência colaborativa e Julia","title":"GNUPlot","text":"","category":"section"},{"location":"Notebooks/A2-Ciencia-Colaborativa-e-Julia/","page":"Ciência colaborativa e Julia","title":"Ciência colaborativa e Julia","text":"Embora tratemos da temática de gráficos para publicações no curso, uma alternativa sempre é interessante. GNUPlot é uma ferramenta open source contando com sua própria linguagem para geração de gráficos. É uma ferramenta interessante principalmente quando se deseja padronizar todas as figuras em um projeto através de arquivos de configuração.","category":"page"},{"location":"References/@Raissi2017/","page":"-","title":"-","text":"","category":"page"},{"location":"References/@Raissi2017/","page":"-","title":"-","text":"title: \"Physics informed deep learning (part I): Data-driven solutions of nonlinear partial differential equations\" authors: Maziar Raissi, Paris Perdikaris, George Em Karniadakis year: 2017 DOI: https://doi.org/10.48550/arXiv.1711.10561 Drive: https://1drv.ms/b/s!Ar4x-UlrYAiZla5YwhmbwapFcSs-8A?e=XiDCyF –-","category":"page"},{"location":"Notebooks/10-Note-Sublatice-Model/#CALPHAD:-site-fractions-in-3-sublattice-phase","page":"CALPHAD: site-fractions in 3 sublattice phase","title":"CALPHAD: site-fractions in 3 sublattice phase","text":"","category":"section"},{"location":"Notebooks/10-Note-Sublatice-Model/","page":"CALPHAD: site-fractions in 3 sublattice phase","title":"CALPHAD: site-fractions in 3 sublattice phase","text":"In this notebook we show that a 3 sublattice phase with 2 components in a binary system introduces a new variable to the optimization, i.e. minimization of Gibbs energy, of the system.","category":"page"},{"location":"Notebooks/10-Note-Sublatice-Model/","page":"CALPHAD: site-fractions in 3 sublattice phase","title":"CALPHAD: site-fractions in 3 sublattice phase","text":"Assume a phase such as gamma-AlMg with a model (Mg)_5(MgAl)_12(AlMg)_12. For simplicity in what follows we denote it as (A)_5(AB)_12(BA)_12.","category":"page"},{"location":"Notebooks/10-Note-Sublatice-Model/","page":"CALPHAD: site-fractions in 3 sublattice phase","title":"CALPHAD: site-fractions in 3 sublattice phase","text":"The calculations are done under the framework of Symbolics.jl.","category":"page"},{"location":"Notebooks/10-Note-Sublatice-Model/","page":"CALPHAD: site-fractions in 3 sublattice phase","title":"CALPHAD: site-fractions in 3 sublattice phase","text":"using Symbolics: @variables\nusing Symbolics: substitute, simplify\nusing Symbolics: solve_for","category":"page"},{"location":"Notebooks/10-Note-Sublatice-Model/","page":"CALPHAD: site-fractions in 3 sublattice phase","title":"CALPHAD: site-fractions in 3 sublattice phase","text":"In terms of composition, such a binary system is defined by a single molar fraction of, say, component A, x_A, the amount of x_B determined by balance:","category":"page"},{"location":"Notebooks/10-Note-Sublatice-Model/","page":"CALPHAD: site-fractions in 3 sublattice phase","title":"CALPHAD: site-fractions in 3 sublattice phase","text":"@variables x_A\n\nx_B = 1 - x_A\n\nx_A, x_B","category":"page"},{"location":"Notebooks/10-Note-Sublatice-Model/","page":"CALPHAD: site-fractions in 3 sublattice phase","title":"CALPHAD: site-fractions in 3 sublattice phase","text":"Since in the first sublattice only element A is present, it has unit site fraction. Just to keep formal we introduce symbols for the site fractions in this first sublattice.","category":"page"},{"location":"Notebooks/10-Note-Sublatice-Model/","page":"CALPHAD: site-fractions in 3 sublattice phase","title":"CALPHAD: site-fractions in 3 sublattice phase","text":"y_A1 = 1\ny_B1 = 1 - y_A1\n\ny_A1, y_B1","category":"page"},{"location":"Notebooks/10-Note-Sublatice-Model/","page":"CALPHAD: site-fractions in 3 sublattice phase","title":"CALPHAD: site-fractions in 3 sublattice phase","text":"The remaining unknowns are the site fractions in sublattice 2 and 3. Again, the sum of fractions is unit and a single value per sublattice completely defines the system:","category":"page"},{"location":"Notebooks/10-Note-Sublatice-Model/","page":"CALPHAD: site-fractions in 3 sublattice phase","title":"CALPHAD: site-fractions in 3 sublattice phase","text":"@variables y_A2 y_A3\n\ny_B2 = 1 - y_A2\ny_B3 = 1 - y_A3\n\ny_A2, y_B2, y_A3, y_B3","category":"page"},{"location":"Notebooks/10-Note-Sublatice-Model/","page":"CALPHAD: site-fractions in 3 sublattice phase","title":"CALPHAD: site-fractions in 3 sublattice phase","text":"The site fraction being defined as the occupancy of a given sublattice k with N_s sites by the element in question, say y_A^(k) = N_a N_s, then the number of moles N_a = y_A^(k) N_s. The mole fraction x_A is then sum N_AN_t, with N_t=sum N_s, the number of sites in the phase. For the phase in question N_t=29 and the mole fraction balances for both elements can be written as:","category":"page"},{"location":"Notebooks/10-Note-Sublatice-Model/","page":"CALPHAD: site-fractions in 3 sublattice phase","title":"CALPHAD: site-fractions in 3 sublattice phase","text":"expr1 = 29 * x_A - (5 * y_A1 + 12 * y_A2 + 12 * y_A3)\nexpr2 = 29 * x_B - (5 * y_B1 + 12 * y_B2 + 12 * y_B3)\nnothing; #hide","category":"page"},{"location":"Notebooks/10-Note-Sublatice-Model/","page":"CALPHAD: site-fractions in 3 sublattice phase","title":"CALPHAD: site-fractions in 3 sublattice phase","text":"expr1","category":"page"},{"location":"Notebooks/10-Note-Sublatice-Model/","page":"CALPHAD: site-fractions in 3 sublattice phase","title":"CALPHAD: site-fractions in 3 sublattice phase","text":"expr2","category":"page"},{"location":"Notebooks/10-Note-Sublatice-Model/","page":"CALPHAD: site-fractions in 3 sublattice phase","title":"CALPHAD: site-fractions in 3 sublattice phase","text":"From the constraints previously introduced, these expressions obviously add up to zero. We have nonetheless the constraint of y_A^(3) in terms of y_A^(2)","category":"page"},{"location":"Notebooks/10-Note-Sublatice-Model/","page":"CALPHAD: site-fractions in 3 sublattice phase","title":"CALPHAD: site-fractions in 3 sublattice phase","text":"y_A3_expr = solve_for(expr2, y_A3)","category":"page"},{"location":"Notebooks/10-Note-Sublatice-Model/","page":"CALPHAD: site-fractions in 3 sublattice phase","title":"CALPHAD: site-fractions in 3 sublattice phase","text":"Which can be replaced in first expression and show the indeterminacy of the system:","category":"page"},{"location":"Notebooks/10-Note-Sublatice-Model/","page":"CALPHAD: site-fractions in 3 sublattice phase","title":"CALPHAD: site-fractions in 3 sublattice phase","text":"mapping = Dict([y_A3 => y_A3_expr])\n\nsimplify(substitute(expr1, mapping); expand=true)","category":"page"}] } diff --git a/dev/toc/index.html b/dev/toc/index.html index 80e2fa76e..019d3a3e3 100644 --- a/dev/toc/index.html +++ b/dev/toc/index.html @@ -1,2 +1,2 @@ -Table of contents · WallyToolbox.jl

Table of contents

+Table of contents · WallyToolbox.jl

Table of contents