C# Implementation of the Finite Element method


I have just published the source code for Finite element method at GitHub. You can find it at https://github.com/bhrnjica/bhmke.

The project is at very beginign stage, and contains very few samples and implementation.

Currently you can solve simple plane load problem, and calculate node displacement.

The more code will be added soon.

The project will be Cross OS and Cross Platform, and will be complatible with .NET Core.

 

Šta je bilo prvo, kompjuter ili program, ko je prvi programer koji je živio na zemlji?


Blog post objavljen uz najavu MSNetwork 4 konferencije. msnetwork5

MS NetWork konferencija predstavlja najbolji i najmasovniji IT događaj u našoj zemlji, sa najvećom koncentracijom IT stručnjaka na jednom mjestu. Iz godine u godinu postaje sve bolja i bolja, a siguran sam da će se u tom pravcu nastaviti i po četvrti put. Ono po čemu ova konferencija ostaje zapamćena jeste po ljudima koje sretneš, idejama koje razmjenjuješ, i diskusijama koje vodiš. I sve to se dešava vrlo neformalno i opušteno pa diskusije nekad odu u vrlo čudnom, ali svakako zanimljivom smjeru.

Prije par dana razmišljao sam o tome šta je bilo prvo, kompjuter ili program? Vjerojatno su neki već čuli ovu priču. Kako se može napraviti program, a da kompjuter ne postoji? To je svakako jedno je od logičkih pitanja ovdje. Ali, ko je bio prvi programer?

Ovdje ćemo pokušati odgovoriti na pitanje iz naslova, a diskusija će biti vjerojatno predmet nekih kružoka na konferenciji. Činjenica da smo generacija koja živi u doba personalnih kompjutera, interneta i pametnih telefona, čini nas privilegovanom generacijom. Današnji stepen razvoja tehnologije, koja je prisutna u svakodnevnom životu, rezultat je evolucije ljudskog bića, a prije svega istrajnog rada i odricanja stotina nadarenih ljudi tokom hiljada godina ove civilizacije. Samo možemo pretpostaviti koliko je genijalnih ljudi živjelo na zemlji koji su doprinijeli današnjem naučnom stepenu, a koji su pali u historijski zaborav zbog nepostojanja zapisa o njima ili zbog činjenice da su skončali život zato što se nekom lokalnom vladaru nisu svidjela njihova promišljanja. Bilo kako bilo, danas se historija tumači na osnovu ostavštine pisanih i stvaralačkih djela koja svjedoče o permanentnoj genijalnosti ljudskog roda. Kao što je poznato, zanimanja softverskog inženjera, programera ili IT inženjera, prvenstveno se percipiraju kao muški posao, iako imamo mnogo primjera gdje su žene razvile sjajne karijere u IT industriji, no ogromnu većinu ipak čini muška populacija.

Nakon ovakvog faktičkog stanja danas, ne možemo ni pomisliti da je prvi programer bila žena, i to kakva žena. Priča o prvoj programerki dosta dugo je bila daleko od javnosti, jer to tada uopće nije bilo važno. Međutim, kada je kompjuterska nauka počela da postaje nešto oko čega se vrti veliki novac, i kada su počeli da se razvijaju programski jezici visokog nivoa, tek tada su ljudi počeli kopati po starim arhivama i tražiti ko je to bio prvi programer u historiji čovječanstva, i šta je prvo nastalo, kompjuter ili program.

Mnogo prije prvih programskih jezika, nije bilo popularno praviti razliku između hardvera i softvera, pa na primjer kad se kaže „isprogramirati“ bilo je slično kao kad se kaže „zalemiti“ ili „zavariti“ Možete zamisliti kako bi ljudi prije 100 ili više godina pomislili kad bi kazali da ste našli bug u programu. Historija kaže da je prvi uređaj koji se mogao isprogramirati konstruisao Charless Babbage, dok se za prvog programera tog istog uređaja smatra kćerka engleskog poete i lorda, Augusta Ada King Lovelance (1815-1852.). Ova mlada žena bila je privržena prirodnim naukama, prvenstveno matematici, a otac ju je iz milja zvao „Princeza paralelograma“. Danas kad bi nekoj ljepšoj polovini dao kompliment da je kao paralelogram, vjerojatno bi dobio „petaka iza ušiju“.

babbage

Babbageov dizajn mehaničkog kompjutera služio je za izračunavanje polinomskih funkcija, a mogao se instruirati da izvršava zapisani program. Program zapisan na karticama sekvencijalno bi izvršavao mehanički kompjuter. Zanimljivo da se ova mašina za računanje sastojala od mlina (eng. mill) i skladišta (eng. storage), koji po funkciji koji su obavljali odgovaraju današnjim procesorima i memoriji. Ovakva mašina trebala je posebno educirane ljude koji bi izrađivali programe, a tu dolazimo do Ade i njene uloge u svemu ovom.

babbageengine

Babbageova mašina koja se mogle programirati.

Kako navode izvori u periodu 1842-43, Ada je radila na prevodu Babbagovih predavanja oko najnovijeg mehaničkog kompjutera tzv. analitičke mašine, koju je Babbage dizajnirao poslije neuspjeha sa prvom mašinom iz 1822. godine. Kako je Ada bila upoznata s njegovim radom na prvoj mašini, napravila je posebnu sekciju u kojoj je elaborirala razlike u dizajnu. U tu svrhu napravila je primjer programa koji računa Bernulijeve brojeve. Njena implementacija računanja Bernulijevog niza racionalnih brojeva smatra se prvom implementacijom kompjuterskog programa, a Ada kao prvi programer, odnosno programerka.

Augusta Ada King Lovelance (1815-1852.)

Augusta Ada King Lovelance (1815-1852.)

Ada se 1842. godine našla u službi prevodioca Babbagovih predavanja, koje je držao na Univerzitetu u Torinu. Naime, ova predavanja posredno su bila prevedena na francuski jezik i objavljena u Ženevskoj biblioteci, kada je Ada bila zamoljena da ova predavanja prevede na engleski jezik. Tokom prevođenja Ada je davala određene komentare i pojašnjenja na prevod, a njena posebna Sekcija G sadržavala je program napisan za računanje Bernulijevih brojeva.

Slučajno ili ne, prevod Babbagovih predavanja koje je Ada prevela čekali su više od 100 godina da ponovo vide svjetlo dana i da postanu historija. Naime, 1953. godine nacrti Babbagove analitičke mašine postali su i formalno najstariji zapisi koji govore o prvom modelu kompjutera, a Adini zapisi kao prvi napisani kompjuterski program. Na žalost, Charless Babbage nikad nije završio svoj mašinski kompjuter. Mnogo godina kasnije, tačnije 2008. godine, Babbagov prvi kompjuter ipak je konstruisan i nalazi se u Computer Museum History u Kaliforniji.

Konačno, dolazimo do odgovora, šta je prvo nastalo kompjuter ili program? Vjerojatno ste se pitali kako se može napraviti program za kompjuter koji ne postoji. Ipak, tako se i desilo, Ada napravila program za kompjuter koji nikad nije bio napravljen, a prvi programer u stvari je bio žena. Krajem sedamdesetih i početkom osamdesetih godina prošlog stoljeća, u čast prvog programera nastao je programski jezik nazvan ADA. Historija se poigrala sa prvim programiranim kompjuterom i prvim programom, na način da kompjuter nije bio napravljen, a program testiran. Radujem se nastavku diskusije na konferenciji!

PS: pictures are taken from http://www.computerhistory.org/babbage/

How to run code daily at specific time in C# Part 2


dailyruncode

Few months ago I wrote blog post about how to run code daily at specific time. I dint know that the post will be the most viewed post on my blog. Also there were several questions how to implement complete example. So today I have decided to write another post, and extend my previous post in order to answer thise question as well as to generalize this subject in to cool demo called Scheduler DEMO.

The post is presenting simple Windows Forms application which calls a method for every minute, day, week, month or year. Also demo shows how to cancel the scheduler at any time.

The picture above shows simple Windows Forms application with two  numeric control which you can set starting hour and minute for the scheduler. Next there is a button Start to activate timer for running code, as well as Cancel button to cancel the scheduler. When the time is come application writes the message on the Scheduler Log.

Implementation of the scheduler

Scheduler is started by clicking the Start button which is implemented with the following code:

/// <summary>
/// Setting up time for running the code
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void startBtn_Click(object sender, EventArgs e)
{

    //retrieve hour and minute from the form
    int hour = (int)numHours.Value;
    int minutes = (int)numMins.Value;

    //create next date which we need in order to run the code
    var dateNow = DateTime.Now;
    var date = new DateTime(dateNow.Year, dateNow.Month, dateNow.Day, hour, minutes, 0);

    listBox1.Items.Add("**********Scheduler has been started!*****");

    //get nex date the code need to run
    var nextDateValue=getNextDate(date,getScheduler());

    runCodeAt(nextDateValue, getScheduler());

}

When the time is defined then the runCodeAt method is called which implementation can be like the following;

/// <summary>
/// Determine the timeSpan Dalay must wait before run the code
/// </summary>
/// <param name="date"></param>
/// <param name="scheduler"></param>
private void runCodeAt(DateTime date,Scheduler scheduler )
{
    m_ctSource = new CancellationTokenSource();

    var dateNow = DateTime.Now;
    TimeSpan ts;
    if (date > dateNow)
        ts = date - dateNow;
    else
    {
        date = getNextDate(date, scheduler);
        ts = date - dateNow;
    }

    //enable the progressbar
    prepareControlForStart();

    //waits certan time and run the code, in meantime you can cancel the task at anty time
    Task.Delay(ts).ContinueWith((x) =>
        {
            //run the code at the time
                methodToCall(date);

                //setup call next day
                runCodeAt(getNextDate(date, scheduler), scheduler);

        },m_ctSource.Token);
}

The method above creates the cancelationToken needed for cancel the scheduler, calculate timeSpan – total waiting time, then when the time is come call the method methodToCall and calculate the next time for running the scheduler.

This demo also shows how to wait certain amount of time without blocking the UI thread.

The full demo code can be found on OneDrive.

Analitička geometrija i C# programiranje dio 6/n


Problem 6: Ugao između prave i ravni.

Pretpostavimo da imamo pravu p na kojoj poznajemo koordinate tačaka A i B. Također pretpostavimo da imamo ravan Π koja je definisana tačkom na ravni R i vektorom normale V. Potrebno je izračunati ugao alpha  kojeg obrazuje prava i ravan.

angprogr_slproblem6

Rješenje: Rješenje zadatka svodi se na izračunavanje ugla između vekktora prave p i njene projektcije na ravan Π p'. Kako već imamo vektor prave p, još je samo potrebno da se odredi vektor prave p’ koja predstavlja projekciju prave na ravan. S druge strane znamo da je vektor normale okomut na vektor smijera projektovane prave, pa je traženi ugao komplement ugla koji zatvara parava i vektor normale. Na osnovu ovog imamo:

cos (90- \alpha) = \frac {|p \cdot V|}{\left | p \right |\left | V \right |}

Implementacija u C# izgleda kao na sljedećem listingu:

static void Main(string[] args)
{
    //Zadatak 1: data je ravan 2x-y+z-6=0 i prava (x)/-1 = (y-1)/-1 ) (z-6)/1
    //ulazni podaci za zadatak 1.
    Point B  = new Point(2f,  4f,  0f);      //tacka na pravoj
    Point A  = new Point(0f,  1f, -1f);   //tačka na pravoj
    Point R  = new Point(0f,  0f,  6f);     //tacka na ravni
    Point Vn = new Point(2f, -1f,  1f);   //vektor normalne ravni

    //izracunavanje ugla
    //Vektor pravca kojeg obrazuju tacke A i B
    Point zraka = Point.Vector(A,B);
    //
    var vec = Point.CrossProduct(zraka, Vn);
    float scos_alpha = (float)(Point.Modul(vec) / (Point.Modul(Vn) * Point.Modul(zraka)));
    Console.WriteLine("Cosinus ugla alpha iznosi={0}", scos_alpha);
    Console.Read();
}

Klasa Point je implementirana u prethodnom postu.