<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"
xmlns:rawvoice="http://www.rawvoice.com/rawvoiceRssModule/"
>

<channel>
	<title>Yohan Jasdid&#039;s Blog &#38; Stories</title>
	<atom:link href="http://yohan.jasdid.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://yohan.jasdid.com</link>
	<description>Around the world..</description>
	<lastBuildDate>Fri, 11 Nov 2011 17:20:26 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
<!-- podcast_generator="Blubrry PowerPress/4.0" -->
	<itunes:summary>Around the world..</itunes:summary>
	<itunes:author>Yohan Jasdid&#039;s Blog &amp; Stories</itunes:author>
	<itunes:explicit>no</itunes:explicit>
	<itunes:image href="http://yohan.jasdid.com/wp-content/plugins/powerpress/itunes_default.jpg" />
	<itunes:subtitle>Around the world..</itunes:subtitle>
	<image>
		<title>Yohan Jasdid&#039;s Blog &amp; Stories</title>
		<url>http://yohan.jasdid.com/wp-content/plugins/powerpress/rss_default.jpg</url>
		<link>http://yohan.jasdid.com</link>
	</image>
		<item>
		<title>Richard Feynman</title>
		<link>http://yohan.jasdid.com/2011/11/richard-feynman/</link>
		<comments>http://yohan.jasdid.com/2011/11/richard-feynman/#comments</comments>
		<pubDate>Thu, 10 Nov 2011 16:31:12 +0000</pubDate>
		<dc:creator>yohan.jasdid</dc:creator>
				<category><![CDATA[Life]]></category>

		<guid isPermaLink="false">http://yohan.jasdid.com/?p=1961</guid>
		<description><![CDATA[I don’t know what’s the matter with people: they don’t learn by understanding, they learn by some other way— by rote or something. Their knowledge is so fragile! —Richard Feynman Esta entrada del blog me recordará de forma efectiva que tengo que seguir la recomendación de mi asesor y leer libros de Feynman Saludos!]]></description>
			<content:encoded><![CDATA[<blockquote><p>I don’t know what’s the matter with people: they don’t<br />
learn by understanding, they learn by some other way—<br />
by rote or something. Their knowledge is so fragile!<br />
—Richard Feynman</p></blockquote>
<p>Esta entrada del blog me recordará de forma efectiva que tengo que seguir la recomendación de mi asesor y leer libros de Feynman <img src='http://yohan.jasdid.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Saludos!</p>
<div class="tweetthis" style="text-align:left;"><p> <a target="_blank" rel="nofollow" class="tt" href="http://twitter.com/intent/tweet?text=Richard+Feynman+http%3A%2F%2Fis.gd%2F3M7bhb" title="Post to Twitter"><img class="nothumb" src="http://yohan.jasdid.com/wp-content/plugins/tweet-this/icons/en/twitter/tt-twitter-micro3.png" alt="Post to Twitter" /></a> <a target="_blank" rel="nofollow" class="tt" href="http://delicious.com/post?url=http://yohan.jasdid.com/2011/11/richard-feynman/&amp;title=Richard+Feynman" title="Post to Delicious"><img class="nothumb" src="http://yohan.jasdid.com/wp-content/plugins/tweet-this/icons/en/delicious/tt-delicious-micro3.png" alt="Post to Delicious" /></a> <a target="_blank" rel="nofollow" class="tt" href="http://www.facebook.com/share.php?u=http://yohan.jasdid.com/2011/11/richard-feynman/&amp;t=Richard+Feynman" title="Post to Facebook"><img class="nothumb" src="http://yohan.jasdid.com/wp-content/plugins/tweet-this/icons/en/facebook/tt-facebook-micro3.png" alt="Post to Facebook" /></a> <a target="_blank" rel="nofollow" class="tt" href="https://mail.google.com/mail/?ui=2&amp;view=cm&amp;fs=1&amp;tf=1&amp;su=Richard+Feynman&amp;body=Link:+http://yohan.jasdid.com/2011/11/richard-feynman/%0D%0A%0D%0A----%0D%0A+I+don%E2%80%99t+know+what%E2%80%99s+the+matter+with+people%3A+they+don%E2%80%99t%0D%0Alearn+by+understanding%2C+they+learn+by+some+other+way%E2%80%94%0D%0Aby+rote+or+something.+Their+knowledg..." title="Send Gmail"><img class="nothumb" src="http://yohan.jasdid.com/wp-content/plugins/tweet-this/icons/en/gmail/tt-gmail-micro3.png" alt="Send Gmail" /></a></p></div>]]></content:encoded>
			<wfw:commentRss>http://yohan.jasdid.com/2011/11/richard-feynman/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Suma de Riemann</title>
		<link>http://yohan.jasdid.com/2011/10/suma-de-riemann/</link>
		<comments>http://yohan.jasdid.com/2011/10/suma-de-riemann/#comments</comments>
		<pubDate>Sat, 29 Oct 2011 00:51:28 +0000</pubDate>
		<dc:creator>yohan.jasdid</dc:creator>
				<category><![CDATA[Articles]]></category>
		<category><![CDATA[Bits]]></category>
		<category><![CDATA[Ph.D.]]></category>

		<guid isPermaLink="false">http://yohan.jasdid.com/?p=1939</guid>
		<description><![CDATA[En matemáticas, la suma de Riemann es un método de integración numérica que nos sirve para calcular el valor de una integral definida es decir el área bajo una curva, este metodo es muy útil cuando no es posible utilizar el Teorema Fundamental del Cálculo. Estas sumas toman su nombre del matemático alemán Bernhard Riemann. [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">En matemáticas, la suma de Riemann es un método de integración numérica que nos sirve para calcular el valor de una integral definida es decir el<a href="http://yohan.jasdid.com/wp-content/uploads/2011/10/riemann.gif"><img class="alignright size-full wp-image-1943" title="riemann" src="http://yohan.jasdid.com/wp-content/uploads/2011/10/riemann.gif" alt="" width="312" height="312" /></a> área bajo una curva, este metodo es muy útil cuando no es posible utilizar el Teorema Fundamental del Cálculo. Estas sumas toman su nombre del matemático alemán Bernhard Riemann.</p>
<p style="text-align: justify;">La suma de Riemann consiste básicamente en trazar un número finito de rectangulos dentro de un área irregular, calcular el área de cada uno de los rectangulos y sumarlos. El problema de este método de integración numérica es que al sumar las áreas se obtiene un margen de error muy grande.</p>
<p style="text-align: justify;">Fuente: <a href="http://es.wikipedia.org/wiki/Suma_de_Riemann" target="_blank">Wikipedia</a></p>
<p>Últimamente estuve trabajando en un programa para resolver cuestiones de integración numéricamente ya que fue una de las encomiendas de mi asesor el Dr. Jesus Manzanares creo que este es un &#8220;Baby Step&#8221; que nos llevara a resolver algo mucho mas complejo, creí que era relevante incluir la descripción de la integración numérica por lo que incluí la definición de wikipedia que es buena,</p>
<p>Cabe complementar un poco la definición y agregar que entre mas rectangulos se le agreguen al problema la aproximación de la solución es mucho mas exacta, y de acuerdo a pruebas hechas llegando a 100 ó poco mas de esa cantidad se logra tener una aproximación de la solución bastante aceptable <img src='http://yohan.jasdid.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Bueno creo que ya fue demasiada teoría aunque realmente la teoría nunca es suficiente, a continuación se presenta una implementación en web de la Suma de Riemann, para tener información mas amplia de como realizar un programa en web puedes visitar el post <a title="¿Como portar una aplicacion existente a una solucion web?" href="http://yohan.jasdid.com/2011/10/%C2%BFcomo-portar-una-aplicacion-existente-a-una-solucion-web/" rel="bookmark" target="_blank">¿Como portar una aplicacion existente a una solucion web?</a></p>
<p>La aplicación esta diseñada para resolver 3 tipos de integrales, las siguientes:</p>
<p class="ql-center-displayed-equation" style="line-height: 58px;"><span class="ql-right-eqno"> &nbsp; </span><span class="ql-left-eqno"> &nbsp; </span><img src="http://yohan.jasdid.com/wp-content/ql-cache/quicklatex.com-a9e209f50affd9c1ab7434564d30521c_l3.png"class="ql-img-displayed-equation" alt="&#92;&#91; &#92;&#98;&#111;&#120;&#101;&#100;&#123;&#102;&#40;&#120;&#41;&#61;&#92;&#105;&#110;&#116;&#95;&#48;&#94;&#49;&#123;&#120;&#94;&#50;&#125;&#92;&#44;&#92;&#109;&#97;&#116;&#104;&#114;&#109;&#123;&#100;&#125;&#120;&#125; &#92;&#93;" title="Rendered by QuickLaTeX.com"/></p>
<p class="ql-center-displayed-equation" style="line-height: 58px;"><span class="ql-right-eqno"> &nbsp; </span><span class="ql-left-eqno"> &nbsp; </span><img src="http://yohan.jasdid.com/wp-content/ql-cache/quicklatex.com-05fcc68b1a270e81e21ed8c2146f923d_l3.png"class="ql-img-displayed-equation" alt="&#92;&#91; &#92;&#98;&#111;&#120;&#101;&#100;&#123;&#102;&#40;&#120;&#41;&#61;&#92;&#105;&#110;&#116;&#95;&#48;&#94;&#49;&#123;&#120;&#94;&#51;&#125;&#92;&#44;&#92;&#109;&#97;&#116;&#104;&#114;&#109;&#123;&#100;&#125;&#120;&#125; &#92;&#93;" title="Rendered by QuickLaTeX.com"/></p>
<p class="ql-center-displayed-equation" style="line-height: 58px;"><span class="ql-right-eqno"> &nbsp; </span><span class="ql-left-eqno"> &nbsp; </span><img src="http://yohan.jasdid.com/wp-content/ql-cache/quicklatex.com-528e1d408f749f29baf613d7246c1ea4_l3.png"class="ql-img-displayed-equation" alt="&#92;&#91; &#92;&#98;&#111;&#120;&#101;&#100;&#123;&#102;&#40;&#120;&#41;&#61;&#92;&#105;&#110;&#116;&#95;&#48;&#94;&#49;&#92;&#99;&#111;&#115;&#40;&#120;&#41;&#92;&#44;&#92;&#109;&#97;&#116;&#104;&#114;&#109;&#123;&#100;&#125;&#120;&#125; &#92;&#93;" title="Rendered by QuickLaTeX.com"/></p>
<p>Donde el rango de la integral es totalmente parametrizable en la implementacion, y en donde para realizar la integración numérica se deberá hacer una sumatoria, a continuación se enlista el código en C++ de la implementación, seguido de la aplicación en sí corriendo en web.</p>
<pre class="brush: cpp; title: ; notranslate">
/*
 * File:   NumericalIntegral.cpp
 * Author: Yohan Jasdid
 *
 * Created on October 15, 2011, 4:36 PM
 */
#include
#include
#include
#include

#include
#include
#include
#include
#include
#include

#include &quot;getpost.h&quot;
#include &quot;json/reader.h&quot;
#include &quot;json/writer.h&quot;
#include &quot;json/elements.h&quot;

using namespace std;
using namespace json;

string exec(char* cmd);
void ReturnError(string error);

/**
 * Main function
 * @return
 */
int main()
{
    map  Post;
    initializePost(Post);   //notice that the variable are passed by reference!

    cout &lt;&lt; &quot;content-type: application/json&quot; &lt;&lt; endl &lt;&lt; endl;

    string userData;
    string message = &quot;&quot;;
    if (Post.find(&quot;UserData&quot;) != Post.end())
    {
        userData = Post[&quot;UserData&quot;].c_str();
    }
    else
    {
        ReturnError(&quot;Some requiered parameters were not provided, try again.
&quot;);
        return 1;
    }

    Object objDocument;
    try
    {
        std::istringstream jsonData(userData);
        Reader::Read(objDocument, jsonData);

        // Get and parse parameters
        String jsonSX = objDocument[&quot;SX&quot;];
        String jsonEX = objDocument[&quot;EX&quot;];
        String jsonN = objDocument[&quot;N&quot;];
        String jsonFnc = objDocument[&quot;Fnc&quot;];

        double start_x = atof(jsonSX.Value().c_str());
        double end_x = atof(jsonEX.Value().c_str());
        double interval = end_x - (start_x);
        double max_n = atof(jsonN.Value().c_str());
        int fnction = atoi(jsonFnc.Value().c_str());

        // We must generate a unique ID for naming our data graph file
        char uuidgen[] = &quot;uuidgen&quot;;
        string uuid = exec(uuidgen);

        // Define files and folders
        string gpFolder = &quot;../gnuplot/&quot;;
        string gpDataFile = gpFolder + uuid + &quot;.dat&quot;;          // data file
        string gpGraphFile =  gpFolder + uuid + &quot;.png&quot;;        // graph file
        string gpCommandFile =  gpFolder + uuid + &quot;.gnuplot&quot;;  // gnuplot command file

        // Create data file
        ofstream gpData;
        gpData.open((gpDataFile).c_str());
        if(!gpData)
        {
            ReturnError(&quot;** Failed to create the graph file.
&quot;);
            return 1;
        }

        // search for all n..
        stringstream data;
        for (double i = 1; i         {
            double n = i;
            double delta_x = interval / n;
            double x_i = start_x;
            double total = 0.0;
            double function = 0.0;

            for (double j = 1; j             {
                x_i = x_i + delta_x;
                switch (fnction)
                {
                    case 1:
                        function = x_i * x_i;
                        break;
                    case 2:
                        function = x_i * x_i * x_i;
                        break;
                    case 3:
                        function = cos(x_i);
                        break;
                }
                total = total + ((function) * delta_x);
            }

            data &lt;&lt; data &lt;&lt; i &lt;&lt; &quot; &quot; &lt;&lt; total &lt;&lt; endl;
            gpData &lt;&lt; i &lt;&lt; &quot; &quot; &lt;&lt; total &lt;&lt; &quot;\n&quot;;
        }
        gpData.close();

        // We must build a gnuplot commands file
        ofstream gpCommands;
        gpCommands.open((gpCommandFile).c_str());
        if(!gpCommands)
        {
            ReturnError(&quot;** Failed to create the graph file.
&quot;);
            return 1;
        }

        gpCommands &lt;&lt; &quot;set title 'Integral Numerica'&quot; &lt;&lt; &quot;\n&quot;;
        gpCommands &lt;&lt; &quot;set term png small&quot; &lt;&lt; &quot;\n&quot;;
        gpCommands &lt;&lt; &quot;set output &quot; &lt;&lt; &quot;'&quot; &lt;&lt; gpGraphFile &lt;&lt; &quot;'&quot; &lt;&lt; &quot;\n&quot;;
        gpCommands &lt;&lt; &quot;set nokey&quot; &lt;&lt; &quot;\n&quot;;
        gpCommands &lt;&lt; &quot;plot '&quot; &lt;&lt; gpDataFile &lt;&lt; &quot;' using 1:2 with lines&quot; &lt;&lt; &quot;\n&quot;;
        gpCommands.close();

        // Execute gnuplot and generate graph
        string commds = &quot;gnuplot '&quot; + gpCommandFile + &quot;'&quot;;
        char *cmds = (char*)commds.c_str();
        exec(cmds);

        // Results ***
        // Build a json object to return as response of the request
        message += &quot;Calculations finished without errors.
&quot;;
        Object objResponse;
        objResponse[&quot;Error&quot;] = String(&quot;&quot;);
        objResponse[&quot;Message&quot;] = String(message.c_str());
        objResponse[&quot;DataFile&quot;] = String(gpDataFile.c_str());
        objResponse[&quot;CommandFile&quot;] = String(gpCommandFile.c_str());
        objResponse[&quot;GraphFile&quot;] = String(gpGraphFile.c_str());
        objResponse[&quot;PlainData&quot;] = String(data.str());

        std::stringstream jsonStream;
        Writer::Write(objResponse, jsonStream);
        cout &lt;&lt; jsonStream.str();
    }
    catch (exception&amp; e)
    {
        ReturnError(&quot;** Something went wrong, please report this problem to the system administrator.
&quot;);
        return 1;
    }
    return 0;
}

/**
 * @brief Returns an error in json format
 * @error The error description to be returned
 *
 * This method executes a bash command using a pipe and a buffer to capture the
 * result of the execution, then return the execution to client code.
 */
void ReturnError(string error)
{
  Object objResponse;
  objResponse[&quot;Error&quot;] = String(error.c_str());

  std::stringstream jsonStream;
  Writer::Write(objResponse, jsonStream);
  cout &lt;&lt; jsonStream.str();
}

/**
 * @brief Executes a shell command
 * @param cmd The command to execute
 * @return The result of the execution
 *
 * This method executes a bash command using a pipe and a buffer to capture the
 * result of the execution, then return the execution to client code.
 */
string exec(char* cmd)
{
    FILE* pipe = popen(cmd, &quot;r&quot;);
    if (!pipe)
        return &quot;ERROR&quot;;

    char buffer[128];
    string result = &quot;&quot;;
    while(!feof(pipe))
    {
        if(fgets(buffer, 128, pipe) != NULL)
            result += buffer;
    }
    pclose(pipe);

    // remove carriage return (new lines)
    result.erase(std::remove(result.begin(), result.end(), '\n'), result.end());
    return result;
}
</pre>
<p style="text-align: justify;">Los resultados del programa muestran la resolución de la integral numérica para un numero de particiones (n) dado, que son los rectángulos a resolver y sumar, entre mayor sea el número de rectángulos mayor sera la exactitud del resultado, a continuación se muestran los resultados para n=5, n=50 y n=100.</p>
<p style="text-align: justify;">N=5</p>
<p style="text-align: justify;"><a href="http://yohan.jasdid.com/wp-content/uploads/2011/10/n51.png"><img class="aligncenter size-full wp-image-1957" title="n5" src="http://yohan.jasdid.com/wp-content/uploads/2011/10/n51.png" alt="" width="640" height="480" /></a>N=50</p>
<p style="text-align: justify;"><a href="http://yohan.jasdid.com/wp-content/uploads/2011/10/n50.png"><img class="aligncenter size-full wp-image-1958" title="n50" src="http://yohan.jasdid.com/wp-content/uploads/2011/10/n50.png" alt="" width="640" height="480" /></a>N=100</p>
<p style="text-align: justify;"><a href="http://yohan.jasdid.com/wp-content/uploads/2011/10/n100.png"><img class="aligncenter size-full wp-image-1959" title="n100" src="http://yohan.jasdid.com/wp-content/uploads/2011/10/n100.png" alt="" width="640" height="480" /></a></p>
<p style="text-align: justify;">Como se puede ver en los resultados anteriores el resultado converge rápidamente con el resultado real lo cual es bueno ya que se puede obtener una aproximación muy decente utilizando el poder de procesamiento y la fuerza bruta de la computadora..</p>
<p style="text-align: justify;">Como punto final se anexa a continuación la implementación de dicha integral numérica donde se puede jugar con los parámetros de entrada para obtener un resultado deseado y su gráfica correspondiente.</p>
<div class="pageview">
	
  <iframe src="http://phoxonics.dyndns.org:8080/NumericalIntegral.htm" frameborder="0" style="" scrolling="auto" height="100%" width="100%">Get a better browser!</iframe>
</div>

<p>enjoy! <img src='http://yohan.jasdid.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<div class="tweetthis" style="text-align:left;"><p> <a target="_blank" rel="nofollow" class="tt" href="http://twitter.com/intent/tweet?text=Suma+de+Riemann+http%3A%2F%2Fis.gd%2FKhMa4Y" title="Post to Twitter"><img class="nothumb" src="http://yohan.jasdid.com/wp-content/plugins/tweet-this/icons/en/twitter/tt-twitter-micro3.png" alt="Post to Twitter" /></a> <a target="_blank" rel="nofollow" class="tt" href="http://delicious.com/post?url=http://yohan.jasdid.com/2011/10/suma-de-riemann/&amp;title=Suma+de+Riemann" title="Post to Delicious"><img class="nothumb" src="http://yohan.jasdid.com/wp-content/plugins/tweet-this/icons/en/delicious/tt-delicious-micro3.png" alt="Post to Delicious" /></a> <a target="_blank" rel="nofollow" class="tt" href="http://www.facebook.com/share.php?u=http://yohan.jasdid.com/2011/10/suma-de-riemann/&amp;t=Suma+de+Riemann" title="Post to Facebook"><img class="nothumb" src="http://yohan.jasdid.com/wp-content/plugins/tweet-this/icons/en/facebook/tt-facebook-micro3.png" alt="Post to Facebook" /></a> <a target="_blank" rel="nofollow" class="tt" href="https://mail.google.com/mail/?ui=2&amp;view=cm&amp;fs=1&amp;tf=1&amp;su=Suma+de+Riemann&amp;body=Link:+http://yohan.jasdid.com/2011/10/suma-de-riemann/%0D%0A%0D%0A----%0D%0A+En+matem%C3%A1ticas%2C+la+suma+de+Riemann+es+un+m%C3%A9todo+de+integraci%C3%B3n+num%C3%A9rica+que+nos+sirve+para+calcular+el+valor+de+una+integral+definida+es+decir+el+%C3%A1..." title="Send Gmail"><img class="nothumb" src="http://yohan.jasdid.com/wp-content/plugins/tweet-this/icons/en/gmail/tt-gmail-micro3.png" alt="Send Gmail" /></a></p></div>]]></content:encoded>
			<wfw:commentRss>http://yohan.jasdid.com/2011/10/suma-de-riemann/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>La dosis perfecta!</title>
		<link>http://yohan.jasdid.com/2011/10/la-dosis-perfecta/</link>
		<comments>http://yohan.jasdid.com/2011/10/la-dosis-perfecta/#comments</comments>
		<pubDate>Sun, 23 Oct 2011 09:14:40 +0000</pubDate>
		<dc:creator>yohan.jasdid</dc:creator>
				<category><![CDATA[Life]]></category>

		<guid isPermaLink="false">http://yohan.jasdid.com/?p=1929</guid>
		<description><![CDATA[A este juego le llame ¨la dosis perfecta¨, ni mas ni menos que por la cancion que estaba escuchando mientras jugaba esta partida, donde se dio un bonito mate gracias a la experiencia o inexperiencia de ambos jugadores, aqui les dejo la partida y la cancion pd. Que tiempos los de Monterrey!&#8230; enjoy! http://www.youtube.com/watch?v=o0H2IZLc9dY [Event [...]]]></description>
			<content:encoded><![CDATA[<p>A este juego le llame <strong>¨la dosis perfecta¨</strong>, ni mas ni menos que por la cancion que estaba escuchando mientras jugaba esta partida, donde se dio un bonito mate gracias a la experiencia o inexperiencia de ambos jugadores, aqui les dejo la partida y la cancion <img src='http://yohan.jasdid.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>pd. Que tiempos los de Monterrey!&#8230;</p>
<p>enjoy!</p>
<p style="text-align: center;">
<p><a href="http://www.youtube.com/watch?v=o0H2IZLc9dY">http://www.youtube.com/watch?v=o0H2IZLc9dY</a></p>
</p>
<div class="CBB-board" style="display: none;">[Event "Partida evaluada, 15m + 5s"]<br />
[Site "Sala principal"]<br />
[Date "2011.10.23"]<br />
[Round "?"]<br />
[White "Yohan Jasdid"]<br />
[Black "Poko56789"]<br />
[Result "1-0"]<br />
[ECO "C45"]<br />
[Annotator "user"]<br />
[PlyCount "77"]<br />
[EventDate "2011.10.23"]<br />
[TimeControl "900+5"]<br />
1. e4 e5<br />
2. Nf3 Nc6<br />
3. d4 exd4<br />
4. Nxd4 Nxd4<br />
5. Qxd4 d6<br />
6. Nc3 Qf6<br />
7. Be3 Be6<br />
8. Nd5 Qxd4<br />
9. Bxd4 Bxd5<br />
10. exd5 O-O-O<br />
11. O-O-O Nf6<br />
12. c4 Be7<br />
13. Kb1 Ne4<br />
14. f3 Nc5<br />
15. Bxg7 Rhg8<br />
16. Bd4  f5<br />
17. Bxc5 dxc5<br />
18. g3 Bf6 19. Bh3 Kb8<br />
20. Bxf5 Bd4<br />
21. Be6 Rg5<br />
22. f4 Rg6<br />
23. Kc2 c6<br />
24. b3 cxd5<br />
25. Bxd5 b6<br />
26. Be4 Rh6<br />
27. g4 Rdd6<br />
28. f5 Kc7<br />
29. h4 Rhf6<br />
30. g5 Rf7<br />
31. f6 Bf2<br />
32. Rxd6 Kxd6<br />
33. Bd5 Rf8<br />
34. Kd3 Ke5<br />
35. Ke2 Bd4<br />
36. Kf3 Kf5<br />
37. Re1  Bc3<br />
38. Re7 Bxf6<br />
39. Be4# 1-0</div>
<div class="tweetthis" style="text-align:left;"><p> <a target="_blank" rel="nofollow" class="tt" href="http://twitter.com/intent/tweet?text=La+dosis+perfecta%21+http%3A%2F%2Fis.gd%2F2PmBzj" title="Post to Twitter"><img class="nothumb" src="http://yohan.jasdid.com/wp-content/plugins/tweet-this/icons/en/twitter/tt-twitter-micro3.png" alt="Post to Twitter" /></a> <a target="_blank" rel="nofollow" class="tt" href="http://delicious.com/post?url=http://yohan.jasdid.com/2011/10/la-dosis-perfecta/&amp;title=La+dosis+perfecta%21" title="Post to Delicious"><img class="nothumb" src="http://yohan.jasdid.com/wp-content/plugins/tweet-this/icons/en/delicious/tt-delicious-micro3.png" alt="Post to Delicious" /></a> <a target="_blank" rel="nofollow" class="tt" href="http://www.facebook.com/share.php?u=http://yohan.jasdid.com/2011/10/la-dosis-perfecta/&amp;t=La+dosis+perfecta%21" title="Post to Facebook"><img class="nothumb" src="http://yohan.jasdid.com/wp-content/plugins/tweet-this/icons/en/facebook/tt-facebook-micro3.png" alt="Post to Facebook" /></a> <a target="_blank" rel="nofollow" class="tt" href="https://mail.google.com/mail/?ui=2&amp;view=cm&amp;fs=1&amp;tf=1&amp;su=La+dosis+perfecta%21&amp;body=Link:+http://yohan.jasdid.com/2011/10/la-dosis-perfecta/%0D%0A%0D%0A----%0D%0A+A+este+juego+le+llame+%C2%A8la+dosis+perfecta%C2%A8%2C+ni+mas+ni+menos+que+por+la+cancion+que+estaba+escuchando+mientras+jugaba+esta+partida%2C+donde+se+dio+un+b..." title="Send Gmail"><img class="nothumb" src="http://yohan.jasdid.com/wp-content/plugins/tweet-this/icons/en/gmail/tt-gmail-micro3.png" alt="Send Gmail" /></a></p></div>]]></content:encoded>
			<wfw:commentRss>http://yohan.jasdid.com/2011/10/la-dosis-perfecta/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>La  Cacería</title>
		<link>http://yohan.jasdid.com/2011/10/la-caceria/</link>
		<comments>http://yohan.jasdid.com/2011/10/la-caceria/#comments</comments>
		<pubDate>Tue, 11 Oct 2011 23:31:06 +0000</pubDate>
		<dc:creator>yohan.jasdid</dc:creator>
				<category><![CDATA[Life]]></category>

		<guid isPermaLink="false">http://yohan.jasdid.com/?p=1906</guid>
		<description><![CDATA[Hoy, por accidente al momento de archivar algunos mails que tenia en la bandeja de entrada, me encontré con este escrito un tanto raro y místico, con fecha del 2006, de pronto se me vinieron a la mente muchos recuerdos y anécdotas de los amigos cuando nos poníamos a filosofar, entre ellos, el buen amigo Erick, a quien le [...]]]></description>
			<content:encoded><![CDATA[<p>Hoy, por accidente al momento de archivar algunos mails que tenia en la bandeja de entrada, me encontré con este escrito un tanto raro y místico, con fecha del 2006, de pronto se me vinieron a la mente muchos recuerdos y anécdotas de los amigos cuando nos poníamos a filosofar, entre ellos, el buen amigo Erick, a quien le gustaba escribir y traía una onda entre psicodelica y religiosa en ese entonces,</p>
<p>Aqui les dejo un escrito de mi buen amigo Erick que en ese entonces me envió al correo y lo recordé de pronto por habermelo encontrado por accidente..</p>
<p>Saludos a Erick y toda la banda que nos frecuentabamos en ese entonces..</p>
<p>pd.. veré si puedo recuperar los cortometrajes que se hicieron en aquellos tiempos..</p>
<p><strong>La  Cacería: por Erick Mendoza </strong><span class="Apple-style-span" style="font-size: 15px;"><strong>Peña</strong></span></p>
<p>En una noche fría y de tinieblas donde solo se pueden escuchar los chillidos de las criaturas nocturnas, se enfrentan un cazador y su presa, una bruja que a lo largo de los años ha hecho mucho mal…</p>
<p>-por fin estas en mis manos diana…</p>
<p>-crees que podrás vencer, mas estas muy equivocado pues aquí</p>
<p>Vas a perecer…</p>
<p>-suficiente…</p>
<p>Dijo el cazador y lanzo un disparo de su arma</p>
<p>-acaso eso es todo lo que puedes hacer…</p>
<p>-en el nombre de mi señor te ordeno que te rindas y perdonare tu vida…</p>
<p>-y yo te digo a ti que en el nombre de los 776 de la primera generación que yo no me apiadare ni de tu alma…</p>
<p>-no puedes hacer nada pues yo me revisto con la armadura de Jehová…</p>
<p>Se escucho un estruendo y los cielos empezaron a llorar…</p>
<p>-y la palabra de mi dios es mas cortante que cualquier espada de dos filos penetrando carne, hueso, tuétano y espíritu…</p>
<p>En ese momento la bruja sintió dolor en su alma pues no solo estaban los estragos físicos sino que una guerra espiritual y un confrontamiento muy fuerte estaba sucediendo…</p>
<p>-si quieres vivir tendrás que huir.</p>
<p>-el que teme huye, mas a que he de temer si mi dios es conmigo…</p>
<p>El espíritu del caballero de la antigua orden era fuerte y no temía a nada, mientras que el espíritu que yacía en la bruja se retorcía y debilitaba, pues escrito esta que los demonios creen en dios y tiemblan y mientras continuaba el combate espiritual el caballero se iba acercando poco a poco a la bruja, quien cada vez se veía mas amenazada pues su magia no surtía gran efecto en el y no podía encontrar duda o temor en su corazón…</p>
<p>-ciertamente eres valiente y confías en tu dios caballero, ¡mas tu señor no te ha dado autoridad para matar!…</p>
<p>-el deber de un caballero es exterminar la maldad y los medios no importan, ya sea que te redimas o que mueras con mi hoja…</p>
<p>-debes saber que ninguno de nuestra raza se da jamás por vencido…</p>
<p>-y conocerán mi nombre como el señor cuando desate mi ira sobre ellos…</p>
<p>El caballero continuo avanzando poco a poco mientras la bruja retrocedía y se exhaustaba lentamente.</p>
<p>-ya no tienes a donde huir bruja, acepta al señor y deja que tu alma sea perdonada para que puedas llegar a la gloria de Dios…</p>
<p>-ese no es el destino de mi raza y tu lo sabes…</p>
<p>-pues la salvación es por gracia para que nadie se glorié por tanto es para todos… que así sea…</p>
<p>Estando a unos cuantos metros de ella desenvaino su espada, se disponía a darle el golpe de muerte cuando en ese momento ella conjuro a uno de los espíritus de los garuo o como se les conoce mejor en el léxico común “licántropos”.</p>
<p>-espíritu de la noche dame un protector pues temo sentir la ira de este señor</p>
<p>y  en ese momento como de la nada apareció la bestia…</p>
<p>-déjala en paz…</p>
<p>Grito la bestia con gran furia…</p>
<p>-pues he aquí que os doy potestad de hollar sobre serpientes y potestades… y tu no eres excepción alguna… pues eres un espíritu demoníaco por lo tanto caerás ante el nombre de Jehová rey de reyes y dios de dioses…</p>
<p>-suficiente mortal… te desollare y me alimentare con tus entrañas…</p>
<p>El caballero se preparo para una feroz batalla de la cual solo saldría vivo sino dudaba de que su señor estaba con el… en un enfrentamiento que pocos ojos han presenciado se manifestó una gran batalla en la cual enviados de Dios y Satanás eran los contendientes…</p>
<p>-tu raza de garous es tan maldita y despreciada como la de Aradia y la de los cainitas…</p>
<p>ni si quiera se pueden soportar entre ustedes… sus guerras particulares han llegado a mi raza durante mucho tiempo y ahora nosotros los hijos de Dios estamos reclamando lo que nos corresponde… pues ustedes espíritus inmundos solo nos han envidiado pues el nos ha favorecido de entre toda la creación… envidia y malicia es lo único que existe en sus corazones desde el nacimiento del hombre le han envidiado… pero ahora en el nombre de dios todos ustedes están cayendo…</p>
<p>Pues desde el principio el señor dijo que nosotros los mallugaremos en la cabeza y ustedes nos mallugaran en el calcañar…</p>
<p>-tu raza es tan débil que tienen que mantenerse con eso para poder sobrevivir…</p>
<p>-tu veneno no sirve pues mi señor dice que comeremos cosa mortífera y no nos hará daño… ahora prepárate para volver de donde viniste…</p>
<p>-es hora de acabar con toda tu alarderia caballero…</p>
<p>el lobo arremetió feroz contra el caballero quien fue herido por sus garras, mas eso no fue suficiente pues en menos tiempo del que su enemigo lo imagino, la espada del cazador atravesó el pecho de la bestia dejándola sin aliento , así con un garuo muerto y sangre en su cuerpo el cazador se dirigía a su principal presa… mas la noche aun era joven y lloraba la caída de uno de sus hijos pues ya eran pocos… mas el joven cazador también comprendió que no debía morir pues los de su orden también eran pocos…</p>
<p>-muy bien bruja aceptas a dios en tu vida y le pedirás perdón?</p>
<p>-creo que no caballero, pero no dudes en hacer tu deber pues ya estoy cansada y la noche llora, mi raza se extingue y debilita, pero solo te haré una pregunta antes de que uses tu hoja, que vas a hacer cuando ya no existan los de mi raza o la raza de los garou y de los cainitas…</p>
<p>-me temo que ese día no llegara, pero si acaso llegase a pasar solo viviré hasta reunirme con mi dios…</p>
<p>-valiente cazador gloriosa es tu noche pues has acabado con dos de los hijos de la oscuridad…</p>
<p>-no hay gloria en mis actos sino en mi Dios quien me da la fuerza y a quien ruego por tu alma…</p>
<p>-que así sea cazador…</p>
<p>El caballero hizo una pequeña oración y después de eso clavo su espada en el frágil corazón de una bruja… la noche se estremeció y en medio de un bosque estaban los cuerpos de dos criaturas de las tinieblas…</p>
<p>-perdóname señor pues he pecado…</p>
<p>y entonces se retiro del lugar…</p>
<div class="tweetthis" style="text-align:left;"><p> <a target="_blank" rel="nofollow" class="tt" href="http://twitter.com/intent/tweet?text=La+Cacer%C3%ADa+http%3A%2F%2Fis.gd%2F74k6K0" title="Post to Twitter"><img class="nothumb" src="http://yohan.jasdid.com/wp-content/plugins/tweet-this/icons/en/twitter/tt-twitter-micro3.png" alt="Post to Twitter" /></a> <a target="_blank" rel="nofollow" class="tt" href="http://delicious.com/post?url=http://yohan.jasdid.com/2011/10/la-caceria/&amp;title=La++Cacer%C3%ADa" title="Post to Delicious"><img class="nothumb" src="http://yohan.jasdid.com/wp-content/plugins/tweet-this/icons/en/delicious/tt-delicious-micro3.png" alt="Post to Delicious" /></a> <a target="_blank" rel="nofollow" class="tt" href="http://www.facebook.com/share.php?u=http://yohan.jasdid.com/2011/10/la-caceria/&amp;t=La++Cacer%C3%ADa" title="Post to Facebook"><img class="nothumb" src="http://yohan.jasdid.com/wp-content/plugins/tweet-this/icons/en/facebook/tt-facebook-micro3.png" alt="Post to Facebook" /></a> <a target="_blank" rel="nofollow" class="tt" href="https://mail.google.com/mail/?ui=2&amp;view=cm&amp;fs=1&amp;tf=1&amp;su=La++Cacer%C3%ADa&amp;body=Link:+http://yohan.jasdid.com/2011/10/la-caceria/%0D%0A%0D%0A----%0D%0A+Hoy%2C+por+accidente+al+momento+de+archivar+algunos+mails+que+tenia+en+la+bandeja+de+entrada%2C+me+encontr%C3%A9+con+este+escrito+un+tanto+raro+y+m%C3%ADstico%2C+c..." title="Send Gmail"><img class="nothumb" src="http://yohan.jasdid.com/wp-content/plugins/tweet-this/icons/en/gmail/tt-gmail-micro3.png" alt="Send Gmail" /></a></p></div>]]></content:encoded>
			<wfw:commentRss>http://yohan.jasdid.com/2011/10/la-caceria/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cristales Fotónicos</title>
		<link>http://yohan.jasdid.com/2011/10/cristales-fotonicos/</link>
		<comments>http://yohan.jasdid.com/2011/10/cristales-fotonicos/#comments</comments>
		<pubDate>Tue, 11 Oct 2011 18:29:32 +0000</pubDate>
		<dc:creator>yohan.jasdid</dc:creator>
				<category><![CDATA[Articles]]></category>
		<category><![CDATA[Ph.D.]]></category>

		<guid isPermaLink="false">http://yohan.jasdid.com/?p=1894</guid>
		<description><![CDATA[A continuación me complace compartir con la gente que de pronto se da una vuelta por el blog una presentación que hice acerca de este tan interesante tema como lo son los Cristales Fotónicos, imaginen la era en que se pueda controlar totalmente la luz y se puedan guiar los fotónes, la era en que [...]]]></description>
			<content:encoded><![CDATA[<p>A continuación me complace compartir con la gente que de pronto se da una vuelta por el blog una presentación que hice acerca de este tan interesante tema como lo son los Cristales Fotónicos, imaginen la era en que se pueda controlar totalmente la luz y se puedan guiar los fotónes, la era en que los transistores fotónicos se vuelvan una realidad industrial y en donde ocurra una nueva revolución electrónica, no ha de faltar mucho para eso..</p>
<p>Saludos <img src='http://yohan.jasdid.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>

<iframe src="http://docs.google.com/viewer?url=http://yohan.jasdid.com/wp-content/uploads/2011/10/photonic_crystals_optimized.ppt&hl=en_US&embedded=true" class="gde-frame" style="width:100%; height:500px; border: none;" scrolling="no"></iframe>

<p class="gde-text"><a href="http://yohan.jasdid.com/wp-content/uploads/2011/10/photonic_crystals_optimized.ppt" target="_self" class="gde-link">Download (PPT, 999KB)</a></p>
<div class="tweetthis" style="text-align:left;"><p> <a target="_blank" rel="nofollow" class="tt" href="http://twitter.com/intent/tweet?text=Cristales+Fot%C3%B3nicos+http%3A%2F%2Fis.gd%2FVomujJ" title="Post to Twitter"><img class="nothumb" src="http://yohan.jasdid.com/wp-content/plugins/tweet-this/icons/en/twitter/tt-twitter-micro3.png" alt="Post to Twitter" /></a> <a target="_blank" rel="nofollow" class="tt" href="http://delicious.com/post?url=http://yohan.jasdid.com/2011/10/cristales-fotonicos/&amp;title=Cristales+Fot%C3%B3nicos" title="Post to Delicious"><img class="nothumb" src="http://yohan.jasdid.com/wp-content/plugins/tweet-this/icons/en/delicious/tt-delicious-micro3.png" alt="Post to Delicious" /></a> <a target="_blank" rel="nofollow" class="tt" href="http://www.facebook.com/share.php?u=http://yohan.jasdid.com/2011/10/cristales-fotonicos/&amp;t=Cristales+Fot%C3%B3nicos" title="Post to Facebook"><img class="nothumb" src="http://yohan.jasdid.com/wp-content/plugins/tweet-this/icons/en/facebook/tt-facebook-micro3.png" alt="Post to Facebook" /></a> <a target="_blank" rel="nofollow" class="tt" href="https://mail.google.com/mail/?ui=2&amp;view=cm&amp;fs=1&amp;tf=1&amp;su=Cristales+Fot%C3%B3nicos&amp;body=Link:+http://yohan.jasdid.com/2011/10/cristales-fotonicos/%0D%0A%0D%0A----%0D%0A+A+continuaci%C3%B3n+me+complace+compartir+con+la+gente+que+de+pronto+se+da+una+vuelta+por+el+blog+una+presentaci%C3%B3n+que+hice+acerca+de+este+tan+interesan..." title="Send Gmail"><img class="nothumb" src="http://yohan.jasdid.com/wp-content/plugins/tweet-this/icons/en/gmail/tt-gmail-micro3.png" alt="Send Gmail" /></a></p></div>]]></content:encoded>
			<wfw:commentRss>http://yohan.jasdid.com/2011/10/cristales-fotonicos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>¿Como portar una aplicacion existente a una solucion web?</title>
		<link>http://yohan.jasdid.com/2011/10/%c2%bfcomo-portar-una-aplicacion-existente-a-una-solucion-web/</link>
		<comments>http://yohan.jasdid.com/2011/10/%c2%bfcomo-portar-una-aplicacion-existente-a-una-solucion-web/#comments</comments>
		<pubDate>Tue, 11 Oct 2011 02:54:02 +0000</pubDate>
		<dc:creator>yohan.jasdid</dc:creator>
				<category><![CDATA[Articles]]></category>
		<category><![CDATA[Ph.D.]]></category>

		<guid isPermaLink="false">http://yohan.jasdid.com/?p=1860</guid>
		<description><![CDATA[En el presente trabajo se plasma un tutorial detallado de como portar una aplicación existente al web y de como sacar ventaja de una gran variedad de tecnologías, paradigmas y técnicas tanto de iteracción con el usuario final así como de estándares de comunicación entre aplicaciones, librerías y código re utilizable. Introducción La creciente demanda por soluciones accesibles y fáciles de utilizar desde internet ha motivado el desarrollo y la migración de cada vez mas [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">En el presente trabajo se plasma un tutorial detallado de como portar una aplicación existente al web y de como sacar ventaja de una gran variedad de tecnologías, paradigmas y técnicas tanto de iteracción con el usuario final así como de estándares de comunicación entre aplicaciones, librerías y código re utilizable.</p>
<h3>Introducción</h3>
<p style="text-align: justify;">La creciente demanda por soluciones accesibles y fáciles de utilizar desde internet ha motivado el desarrollo y la migración de cada vez mas sistemas a ambientes online lo que implica un incremento en la complejidad de los desarrollos actuales e inversión de tiempo en la curva de aprendizaje y adopción de nuevas tecnologías.</p>
<p style="text-align: justify;">Con esto en mente, se trata de plasmar una forma sencilla y directa en forma de tutorial paso a paso de como hacer esta transformación tratando de disminuir en la medida de lo posible la complejidad agregada a los desarrollos así como el tiempo invertido para lograr dicha transformación.</p>
<p style="text-align: justify;">Para la mejor organización del presente documento, se han establecido varias etapas donde se irán definiendo detalladamente y de forma incremental cada uno de los pasos para lograr la transformación de desarrollos actuales a soluciones en linea.</p>
<h3>Requerimientos y Definiciones</h3>
<p style="text-align: justify;">Es bien sabido que en base a las tecnologías empleadas en los desarrollos actuales se eligen las tecnologías que se pueden utilizar en la transformación del desarrollo actual a solución en linea ya que por lo regular la plataforma y los lenguajes de programación involucrados en los desarrollos están directamente relacionados con las tecnologías web a utilizar para la transformación.</p>
<h3>Requerimientos</h3>
<p style="text-align: justify;">A continuación se presenta una breve descripción de los requerimientos para la conversión, así como también se enlistan los paradigmas, técnicas y estándares a utilizar en todo el proceso.</p>
<ul>
<li style="text-align: justify;"><strong><em>Plataforma</em></strong>: Se ha establecido que la plataforma sobre la cual debe de ejecutarse la solución sea de tipo linux, este es un sistema operativo muy robusto y flexible que permite la utilización de una gran variedad de tecnologías tanto en linea como de forma local. Existe una gran diversidad de &#8220;sabores&#8221; o distribuciones en el mercado y las diferencias entre versiones destaca mayormente en cuanto a sistemas de resolución de dependencias, sistemas de instalación, paquetes disponibles y gustos, pero todos comparten el corazón de la plataforma, el kernel. Las instrucciones de instalación funcionan tanto para Ubuntu como para Debian que han sido las plataformas elegidas por su estabilidad y madurez.</li>
<li style="text-align: justify;"><strong><em>Servidor Web</em></strong>: Para ejecutar una aplicación en linea se necesita un servidor web que se encargue de atender las peticiones generadas por parte de los usuarios y sea capaz de procesar y producir resultados visibles al código que realizo la petición, se ha elegido Apache como servidor web ya que es robusto, flexible y permite exponer una gran variedad de tecnologías en linea.</li>
<li style="text-align: justify;"><em><strong>CGI</strong></em>: La tecnología de preferencia para dar soporte en linea a C++ y Fortran es CGI (Common Gateway Interface) protocolo de extensión que funciona en conjunto con el servidor web y permite la ejecución de código C++ y Fortran mediante peticiones HTTP de Apache, para utilizar  correctamente CGI se deben realizar algunas modificaciones al código fuente actual tanto para extraer datos de las peticiones web así como para retornar resultados al navegador o al código que hizo la peticion.</li>
<li style="text-align: justify;"><em><strong>Perl</strong></em>: Perl (Practical Extracting and Reporting Languaje) es un lenguaje de programación interpretado, dinámico y de alto nivel que se ejecuta del lado del servidor y hace que ciertas rutinas de programación sean mas fáciles de escribir, se ha utilizado dicho lenguaje para facilitar y simplificar ciertas rutinas que se detallan mas adelante.</li>
<li style="text-align: justify;"><em><strong>gnuplot</strong></em>: gnuplot es una utileria portable orientada a la consola para graficar, utiliza una gran variedad de herramientas como lineas, puntos, cajas, contornos, vectores, superficies etc, para utilizar esta herramienta en una solución online se tendrá que hacer uso de técnicas personalizadas las cuales se enlistan mas adelante.</li>
</ul>
<h3>Instalación de software</h3>
<p style="text-align: justify;">En la presente sección se presentan los comandos de instalación y las librerías necesarias para crear el ambiente funcional para ejecutar aplicaciones web de forma local, se asume que se tiene una plataforma ya instalada de tipo linux para lo cual se recomienda instalar Ubuntu o Debian por ser flexible y robusto.</p>
<ul>
<li><em><strong>Compiladores y Herramientas</strong></em>: De inicio se procede a instalar los compiladores básicos para dar soporte a programas de Fortran y C++ utilizando la consola de linux, los comandos requeridos se enlistan en el orden antes mencionado.</li>
</ul>
<pre class="brush: bash; title: ; notranslate">
$sudo apt-get install gfortran
$sudo apt-get install build-essential
</pre>
<ul>
<li><em><strong>Perl</strong></em>: Se procede a instalar Perl, que es uno de los lenguajes que se utilizan del lado del servidor para dar soporte de graficos online, se instala mediante el siguiente comando.</li>
</ul>
<pre class="brush: bash; title: ; notranslate">
$sudo apt-get install perl
</pre>
<ul>
<li><em><strong>Servidor Web Apache</strong></em>: A continuación se procede a instalar el servidor web apache el cual se encarga de dar soporte a las peticiones de los programas clientes, se instala mediante el siguiente comando.</li>
</ul>
<pre class="brush: bash; title: ; notranslate">
$sudo apt-get install apache2
</pre>
<p>Una vez instalado, se debe reiniciar el servidor Apache para asegurarse de que se ha instalado correctamente.</p>
<pre class="brush: bash; title: ; notranslate">
$/etc/init.d/apache2 restart
</pre>
<p>Una vez que se tiene Apache, se debe instalar el soporte para CGI y Perl con el siguiente comando</p>
<pre class="brush: bash; title: ; notranslate">
$sudo apt-get install libapache2-mod-perl2
</pre>
<p>Y se reinicia Apache para que este reconozca los cambios agregados.</p>
<pre class="brush: bash; title: ; notranslate">
$/etc/init.d/apache2 restart
</pre>
<p>A continuación, se procede a configurar el usuario con el que Apache se ejecuta, por default Apache se ejecuta con el usuario (www-data) pero se quiere cambiar este comportamiento ya que esta planeado crear archivos desde los programas CGI lo que causaria que estos se crearan con el usuario default (www-data) y esto seria un problema al momento de tratar de leer dichos archivos por cuestiones de permisos y seguridad, para cambiar el usuario default se tendrá que editar uno de los archivos de configuración de Apache con el siguiente comando.</p>
<pre class="brush: bash; title: ; notranslate">
$sudo nano /etc/apache2/envvars
</pre>
<p style="text-align: justify;">Donde nano es el programa de edición de preferencia, se puede usar gedit, vi etc. dependiendo de los gustos, el programa de edición muestra a continuación el archivo de configuracion de Apache, una vez mostrado se procede a buscar el usuario con el que Apache se ejecuta, algo similar a lo siguiente.</p>
<pre class="brush: plain; title: ; notranslate">
export APACHE_RUN_USER=www-data
export APACHE_RUN_GROUP=www-data
</pre>
<p style="text-align: justify;">Una vez identificado el usuario con el que Apache se ejecuta se procede a reemplazar el usuario por el usuario actual, es buena practica que en vez de reemplazar las lineas anteriores con el usuario nuevo sean creadas dos nuevas lineas y las anteriores simplemente sean comentadas, el resultado seria similar a lo siguiente.</p>
<pre class="brush: plain; title: ; notranslate">
#export APACHE_RUN_USER=www-data
#export APACHE_RUN_GROUP=www-data
export APACHE_RUN_USER=[usuario]
export APACHE_RUN_GROUP=[usuario]
</pre>
<p style="text-align: justify;">Una vez teniendo hechos los cambios y guardado el archivo de configuración se procede a reiniciar el servidor web para asegurarse de que el servidor funciona correctamente con las modificaciones introducidas.</p>
<pre class="brush: bash; title: ; notranslate">
$/etc/init.d/apache2 restart
</pre>
<p style="text-align: justify;">A continuación y una vez configurado el usuario con que apache se ejecuta, se define una carpeta especializada la cual sera utilizada para albergar los archivos que contienen la lógica CGI así como los archivos que se ejecutan como programas cliente tipicamente en un navegador, dicha carpeta se debe crear dentro de la carpeta del usuario actual y es necesaria para evitar problemas de permisos y seguridad al momento de estar creando y probando el código CGI modificado del desarrollo actual, también, dentro de la carpeta publica se debe crear un directorio el cual contendrá los archivos de datos y de comandos que se generaran automáticamente, la carpeta se llama gnuplot, las carpetas antes mencionadas se crean con los siguientes comandos.</p>
<pre class="brush: bash; title: ; notranslate">
$sudo mkdir /home/[usuario]/public_html
$sudo mkdir /home/[usuario]/public_html/cgi-bin
$sudo mkdir /home/[usuario]/public_html/gnuplot
</pre>
<p style="text-align: justify;">Donde (public_html) es un nombre opcional el cual es totalmente modificable, una vez que se tienen definidas y creadas las carpetas se procede a configurar nuevamente Apache para que reconozca dichas carpetas como contenedores de archivos públicos, para lograr esto, se debe editar otro archivo de configuración de Apache con el siguiente comando.</p>
<pre class="brush: bash; title: ; notranslate">
$sudo nano /etc/apache2/sites-available/default
</pre>
<p>Con dicho comando se tendrá visible el archivo de configuración de Apache, y se procede a buscar el siguiente apartado en donde se encuentra la seccion ”ScriptAlias” para modificar la ruta default por la nueva creada en pasos anteriores (cgi-bin), el apartado es similar al siguiente.</p>
<pre class="brush: plain; title: ; notranslate">
ScriptAlias /cgi-bin/ /var/www/cgi-bin/
&lt;Directory &quot;/var/www/cgi-bin/&quot;&gt;
    AllowOverride None
    Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
    Order allow, deny
    Allow from all
&lt;/Directory&gt;
</pre>
<p style="text-align: justify;">Una vez modificada la ruta donde [usuario] es el usuario actual el resultado es similar a lo siguiente.</p>
<pre class="brush: plain; title: ; notranslate">
ScriptAlias /cgi-bin/ /home/[usuario]/public_html/cgi-bin/
&lt;Directory &quot;/home/[usuario]/public_html/cgi-bin/&quot;&gt;
    AllowOverride None
    Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
    Order allow, deny
    Allow from all
&lt;/Directory&gt;
</pre>
<p style="text-align: justify;">El siguiente paso es agregar el soporte para que sean identificadas las tecnologías CGI y Perl en el directorio actual, por lo que se agrega .AddHandler cgi- script .cgi .pl ”justo debajo de las opciones para finalizar con algo similar a lo siguiente.</p>
<pre class="brush: plain; title: ; notranslate">
ScriptAlias /cgi-bin/ /home/[usuario]/public_html/cgi-bin/
&lt;Directory &quot;/home/[usuario]/public_html/cgi-bin/&quot;&gt;
    AllowOverride None
    Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
    AddHandler cgi-script .cgi .pl
    Order allow, deny
    Allow from all
&lt;/Directory&gt;
</pre>
<p style="text-align: justify;">Una vez terminadas las modificaciones para la carpeta (cgi-bin) se procede a configurar el ”Document Root”que es el directorio raiz que contendra los archivos públicos y para el cual se definió la ruta en pasos anteriores (public html), esta vez el apartado a modificar es similar a lo siguiente.</p>
<pre class="brush: plain; title: ; notranslate">
DocumentRoot /var/www/
&lt;Directory/&gt;
    Options FollowSymLinks
    AllowOverride None
&lt;/Directory&gt;
&lt;Directory /var/www/&gt;
    Options Indexes FollowSymLinks MultiViews
    AllowOverride None
    Order allow, deny
    allow from all
&lt;/Directory&gt;
</pre>
<p style="text-align: justify;">Se modifica la ruta de tal forma que la nueva ruta apunte a la carpeta que se creo anteriormente para nuestro directorio publico de archivos, al final se tendrá algo similar a lo siguiente.</p>
<pre class="brush: plain; title: ; notranslate">
DocumentRoot /home/[usuario]/public_html/
&lt;Directory/&gt;
    Options FollowSymLinks
    AllowOverride None
&lt;/Directory&gt;
&lt;Directory /home/[usuario]/public_html/&gt;
    Options Indexes FollowSymLinks MultiViews
    AllowOverride None
    Order allow, deny
    allow from all
&lt;/Directory&gt;
</pre>
<p style="text-align: justify;">Una vez modificados y guardados los archivos de configuración, se reinicia Apache para verificar que los cambios introducidos a los archivos de configuración son correctos.</p>
<pre class="brush: bash; title: ; notranslate">
$/etc/init.d/apache2 restart
</pre>
<p style="text-align: justify;"><em><strong>gnuplot</strong></em>: Una vez finalizada la instalación y configuración de apache, se procede a instalar gnuplot como ultimo paquete necesario para terminar el ambiente funcional y ejecutar aplicaciones en linea localmente, para instalar gnuplot se debe descargar primero de la siguiente direccion  (<a href="http://www.gnuplot.info" target="_blank">http://www.gnuplot.info</a>/) cabe mencionar que en caso de que se tenga instalado el paquete &#8220;Octave&#8221; no sera necesario instalar gnuplot ya que Octave lo instala por default, en caso de no tenerlo y una vez descargado y descomprimido, se ejecutan los siguientes comandos para instalarlo.</p>
<pre class="brush: bash; title: ; notranslate">
$./configure
$make
$make install
</pre>
<h3>Estandares, Técnicas y Paradigmas</h3>
<p style="text-align: justify;">A continuación se enlistan los estándares, técnicas y paradigmas que se utilizan a lo largo del proceso de transformación de una aplicación tradicional a una solución en linea, se recomienda utilizar este tipo de practicas y librerías para que el software producido sea de alta calidad y lo mas estandarizado posible.</p>
<h3>Paradigma Cliente-Servidor</h3>
<p style="text-align: justify;">El paradigma Cliente-Servidor consiste en que un programa Cliente realiza peticiones a un programa Servidor el cual realiza un trabajo y al final regresa un resultado al programa Cliente, en este caso el programa Cliente es la pagina web que contiene la solución en linea y el cual hace uso de JavaScipt para realizar peticiones al programa Servidor pudiendo también enviar parámetros y todo tipo de información para que el programa Servidor utilice en su proceso de calculo.</p>
<p style="text-align: justify;">El programa Servidor en este caso se define como los programas C++ o Fortran modificados que se quieren tener en linea, este programa servidor es expuesto a Internet por medio de el servidor web y se encarga de atender las peticiones del programa cliente, cabe mencionar que en una solución típica el programa servidor atiende peticiones de muchos programas clientes y la capacidad de numero de clientes soportados depende del la infraestructura con que el programa servidor dispone.</p>
<h3>JQuery</h3>
<p style="text-align: justify;">JQuery (http://jquery.com/) es una librería JavaScipt que simplifica la forma de manipular e interactuar con los objetos contenidos en HTML, tiene grandes ventajas y aplicaciones, se ha decidido utilizar esta librería para transformar de manera mas dinámica la iteraccion con los usuarios en las aplicaciones cliente que se ejecutan desde el navegador.</p>
<h3>AJAX</h3>
<p style="text-align: justify;">AJAX (Asynchronous JavaScript and XML) Es un grupo de técnicas y métodos que se ejecutan del lado del cliente y que sirven para hacer llamados a código del lado del servidor de una manera asíncrona, usualmente este grupo de técnicas abarcan mas de una tecnología que en un escenario común se mezclan para lograr un objetivo, se ha decidido utilizar este grupo de técnicas utilizando la librería JQuery para hacer que los llamados a los programas CGI modificados sean de manera asíncrona y esto no impacte en otras partes del código cliente.</p>
<h3>JSON</h3>
<p style="text-align: justify;">JSON (JavaScript Object Notation &#8211; http://www.json.org/) Es un formato ligero utilizado para intercambio de datos entre programas Cliente-Servidor el cual hace que los datos intercambiados entre programas sean fácilmente interpretados por personas, JSON es independiente de plataformas y muchos de los usuarios que lo utilizan lo consideran como un estándar para intercambio de datos entre diversas tecnologías y programas.</p>
<h3>Serialización</h3>
<p style="text-align: justify;">Es el proceso mediante el cual se transforma un objeto de un programa para ser transmitido fácilmente por Internet o para ser almacenado en disco, en este caso la serializacion se usa para codificar los objetos JSON de tal manera que estos puedan transmitirse por Internet en forma de peticiones al programa servidor el cual también utiliza esta técnica para devolver un resultado al programa cliente una vez que ha completado y procesado la peticion, cabe mencionar que al proceso de decodificar y regenerar el objeto una vez recibido por el programa se le llama deserializacion.</p>
<h3>Getpost y Cajun</h3>
<p style="text-align: justify;">Getpost y Cajun son librerías que se utilizan en C++ para hacer que el desarrollo sea mas rápido y robusto, la funcion de Getpost es la de extraer fácilmente información o parámetros contenidos en las peticiones que son enviadas desde el programa cliente al programa servidor, dicha información permite la iteraccion dinámica entre programas, por otro lado, Cajun nos permite regenerar los objetos JSON y deserializarlos en C++, esta librería es necesaria ya que por decisión se ha utilizado el estandar de comunicación JSON y una de las maneras mas sencillas de cumplir con este requisito es utilizando esta sencilla librería.</p>
<h3>UUID</h3>
<p style="text-align: justify;">UUID (Universally Unique Identifier) Es un identificador estándar definido por la OSF (Open Software Foundation) y consiste en la construcción de una llave única haciendo uso de una serie de reglas que aseguran que dicho identificador no se repita en todo el mundo, se hace uso de este estándar para definir identificadores únicos a lo largo de la transformación.</p>
<h3>Transformaciones</h3>
<p style="text-align: justify;">Se inician las transformaciones en el programa tradicional en C++ con el que ya se cuenta, este programa se transformara de manera tal que recibirá, atenderá y procesara peticiones, las cuales contendrán datos, es decir, contendrán parámetros que el programa utilizara, este programa tradicional se convertirá en el programa ”Servidor deberá modificarse para recibir cuatro parámetros de entrada por parte del cliente, na, nb, fa y fb.</p>
<h3>Programa Servidor</h3>
<p style="text-align: justify;">Se ha utilizado una libreria sencilla llamada getpost.h la cual sirve de ayuda en el procesamiento de datos en las peticiones que recibirá el programa Servidor, también se ha utilizado Cajun como herramienta de regeneración y creación de objetos JSON. Para iniciar se agrega la cabecera de las librerías para poder utilizarlas en el desarrollo actual.</p>
<pre class="brush: cpp; title: ; notranslate">
#include &quot;getpost.h&quot;
#include &quot;json/reader.h&quot;
#include &quot;json/writer.h&quot;
#include &quot;json/elements.h&quot;
</pre>
<p style="text-align: justify;">A continuación se modifica el método main para utilizar Getpost, recuperar los datos de la petición y utilizarlos en variables locales.</p>
<pre class="brush: cpp; title: ; notranslate">
  map &lt;string,string&gt; Post;
  initializePost(Post);   //notice that the variable are passed by reference!
</pre>
<p style="text-align: justify;">Notese que se utiliza el método InitializePost(Post); en donde Post es el tipo de petición que se estará esperando del lado del servidor, después, se establece que el resultado de nuestro desarrollo actual estará en formato JSON, es decir, que la nueva aplicación servidor utilizara un objeto JSON para responder a las peticiones.</p>
<pre class="brush: cpp; title: ; notranslate">
cout &lt;&lt; &quot;content-type: application/json&quot; &lt;&lt; endl &lt;&lt; endl;
</pre>
<p style="text-align: justify;">Y finalmente se define la manera de extraer la información de la petición para utilizarla en el programa servidor utilizando el método &#8221;find&#8221; de la librería.</p>
<pre class="brush: cpp; title: ; notranslate">
  string userData;
  string message = &quot;&quot;;
  if (Post.find(&quot;UserData&quot;) != Post.end())
  {
     userData = Post[&quot;UserData&quot;].c_str();
  } else
  {
     ReturnError(&quot;Some requiered parameters were not provided, try again. &lt;br /&gt;&quot;);
     return 1;
  }
</pre>
<p style="text-align: justify;">Con este código ya se cuenta con un objeto JSON que esta asignado a la variable userData y que proviene de la petición POST del programa cliente, el siguiente paso sera el de extraer y regenerar el objeto JSON utilizando Cajun como se muestra a continuación.</p>
<pre class="brush: cpp; title: ; notranslate">
  Object objDocument;
  try
   {
      std::istringstream jsonData(userData);
      Reader::Read(objDocument, jsonData);

  String jsonNa = objDocument[&quot;Na&quot;];
  String jsonNb = objDocument[&quot;Nb&quot;];
  String jsonFa = objDocument[&quot;Fa&quot;];
  String jsonFb = objDocument[&quot;Fb&quot;];

  double na, nb, fa, fb;
  na = atof(jsonNa.Value().c_str());  //na        = 2.3495;
  nb = atof(jsonNb.Value().c_str());  //nb        = 1.4595;
  fa = atof(jsonFa.Value().c_str());  //fa        = 0.5;
  fb = atof(jsonFb.Value().c_str());  //fb        = 0.5;
</pre>
<p style="text-align: justify;">Notese como utilizando el Reader de Cajun se lee el objeto y automáticamente se deserializa y se regenera en un objeto document de Cajun para después asignar ahora si a variables locales los valores enviados desde el cliente.</p>
<p style="text-align: justify;">Una vez que se tienen las variables locales definidas con los valores que el cliente ha enviado, el proceso de calculo de la ecuación en el programa tradicional ocurre y no hay ninguna modificacion o transformación necesaria en este código, diciéndolo de otra manera, todo el código que hace las operaciones importantes de calculo, resolución de ecuaciones u otro tipo de operacaciones complejas prácticamente NO se modifica a lo largo de la transformación por lo que el tiempo invertido de desarrollo de la funcionalidad clave de la aplicación permanece siendo el mismo.</p>
<p style="text-align: justify;">Uno de los cambios no menos importante en cuestiones de transformaciones a soluciones en linea es la concurrencia, la concurrencia se refiere a múltiples procesos accediendo a un mismo recurso, pueden surgir problemas de concurrencia debido a que en aplicaciones en linea existen una cantidad indefinida de programas clientes accesando simultáneamente a un mismo programa servidor y este atendiendo peticiones de todos estos programas cliente, por lo que si no se tiene esto presente al momento de hacer la transformación podrían aparecer problemas como por ejemplo el tratar de escribir simultáneamente un mismo archivo al mismo tiempo, o el tratar de grabar al mismo tiempo en una columna de la misma fila de una tabla en una base de datos, entre otros.</p>
<p style="text-align: justify;">En el caso de esta transformación se debe tener en cuenta que el programa tradicional genera datos los cuales son escritos a disco en forma de un archivo ASCII, el nombre del archivo siempre es el mismo actualmente por lo que existen riesgos de concurrencia conforme vaya aumentando el numero de clientes que accesan al programa servidor simultáneamente, para solucionar esto se necesita idear una forma creativa para prevenir riesgos de este tipo por lo que se opta por generar un nombre de archivo ÚNICO el cual cada petición independiente utilizara sin ningún riesgo de acceso por parte de otra petición, para concretar esta idea se hará uso del estándar UUID para generar identificadores únicos que serán utilizados como los nombres de los archivos de datos para mitigar el riesgo de concurrencia.</p>
<p style="text-align: justify;">La técnica utilizada para hacer uso del estándar UUID es haciendo uso de la herramienta de linux llamada &#8220;uuidgen” que se encarga de construir y regresar como resultado un nuevo identificador UUID, para poder establecer comunicación con la consola de linux y hacer uso de esta valiosa herramienta en linea, habrá que utilizar un código especial que ejecute comandos de la consola de linux y recupere los resultados como se muestra a continuación.</p>
<p style="text-align: justify;">Primero agregamos la definición a la función que se definió para ejecutar comandos de la siguiente forma.</p>
<pre class="brush: cpp; title: ; notranslate">
std::string exec(char* cmd);
</pre>
<p>Para despues agregar la funcion que hace el trabajo de ejecutar el comando.</p>
<pre class="brush: cpp; title: ; notranslate">
std::string exec(char* cmd)
{
    FILE* pipe = popen(cmd, &quot;r&quot;);
    if (!pipe)
        return &quot;ERROR&quot;;

    char buffer[128];
    std::string result = &quot;&quot;;
    while(!feof(pipe))
    {
        if(fgets(buffer, 128, pipe) != NULL)
                result += buffer;
    }

    pclose(pipe);
    result.erase(std::remove(result.begin(), result.end(), '\n'), result.end()); // remove carriage return (new lines)
    return result;
}
</pre>
<p style="text-align: justify;">Y para finalizar agregamos el código que llama a la función a para pedir un nuevo UUID y utilizarlo como nombre de archivo de datos.</p>
<pre class="brush: cpp; title: ; notranslate">
  // We must generate a unique ID for naming our data graph file
  char uuidgen[] = &quot;uuidgen&quot;;
  string uuid = exec(uuidgen);
</pre>
<p style="text-align: justify;">Otra cosa que se ha agregado en la transformación es que se ha definido una carpeta especial que contendrá todos los archivos de datos generados por nuestro programa servidor, la carpeta de datos lleva por nombre ”gnuplot&#8221; deberá estar ubicada en el ”Document Root”, a continuación se define el código para la ubicación de la carpeta y el nombre del archivo de datos generado.</p>
<pre class="brush: cpp; title: ; notranslate">
  string gpFolder = &quot;../gnuplot/&quot;;
  string gpDataFile =  uuid + &quot;.dat&quot;;
</pre>
<p style="text-align: justify;">A continuación y debido a que se estara utilizando el programa gnuplot como graficador en linea, se debe de crear un archivo con los comandos que gnuplot ejecutara de la siguiente manera.</p>
<pre class="brush: cpp; title: ; notranslate">
  string gpCommandFile =  uuid + &quot;.gnuplot&quot;;
  ofstream gpCommands;
  gpCommands.open((gpFolder + gpCommandFile).c_str());
  if(!gpCommands)
  {
    ReturnError(&quot;** Failed to create the graph file. &lt;br /&gt;&quot;);
    return 1;
  }

  gpCommands &lt;&lt; &quot;set terminal png small&quot; &lt;&lt; &quot;\n&quot;;
  gpCommands &lt;&lt; &quot;set title 'Graph by GnuPlot'&quot; &lt;&lt; &quot;\n&quot;;
  gpCommands &lt;&lt; &quot;set nokey&quot; &lt;&lt; &quot;\n&quot;;
  gpCommands &lt;&lt; &quot;plot '&quot; &lt;&lt; gpFolder &lt;&lt; gpDataFile &lt;&lt; &quot;' u 3:1 w p&quot; &lt;&lt; &quot;\n&quot;;
  gpCommands.close();
</pre>
<p style="text-align: justify;">Y para finalizar se debe construir un objeto JSON que sera enviado de regreso al código que realizo la petición para informar de los resultados del procesamiento del programa servidor, este objeto debe de contener por definición lo siguiente:</p>
<ol>
<li>Una cadena de error en caso de que haya ocurrido algún error en la ejecución</li>
<li>Una cadena de mensaje adicional que envía la aplicación servidor al cliente</li>
<li>El UUID único que se genero para el proceso de esta peticion independiente</li>
<li>Un enlace al archivo de datos generado por la aplicación servidor</li>
<li>Un enlace al archivo de comandos que gnuplot ejecuto en el proceso</li>
</ol>
<div>
<p style="text-align: justify;">Y el código de construcción del objeto JSON con los datos requeridos por definición se enlista a continuacion.</p>
<pre class="brush: cpp; title: ; notranslate">
  string linkToData = &quot;&lt;a href='/gnuplot/&quot; + gpDataFile + &quot;'&gt;Download Data File&lt;/a&gt;&lt;br /&gt;&quot;;
  string linkToCommands = &quot;&lt;a href='/gnuplot/&quot; + gpCommandFile + &quot;'&gt;Download Command File&lt;/a&gt;&lt;br /&gt;&quot;;
  message += &quot;Calculations finished without errors. &lt;br /&gt;&quot;;

  // this is the script response
  Object objResponse;
  objResponse[&quot;Error&quot;] = String(&quot;&quot;);
  objResponse[&quot;Message&quot;] = String(message.c_str());
  objResponse[&quot;GraphID&quot;] = String(uuid.c_str());
  objResponse[&quot;LinkToData&quot;] = String(linkToData.c_str());
  objResponse[&quot;LinkToCommands&quot;] = String(linkToCommands.c_str());

  std::stringstream jsonStream;
  Writer::Write(objResponse, jsonStream);
  cout &lt;&lt; jsonStream.str();
</pre>
<p style="text-align: justify;">A continuación y para terminar con los programas Servidor se enlista el programa sencillo hecho en Perl que se encarga de ejecutar los comandos generados de gnuplot utilizando para esto la consola y especificando el nombre del archivo de comandos a utilizar así como los datos a graficar para después recuperar de manera dinámica la gráfica generada por gnuplot y enviarla al programa Cliente el cual asignara de manera interactiva los datos a una imagen HTML para que la gráfica sea inmediatamente visible por el usuario final.</p>
<pre class="brush: perl; title: ; notranslate">
#!/usr/bin/perl -w
use strict;
use CGI qw(:standard);
use CGI::Pretty qw( :html3 );
use CGI::Carp qw(fatalsToBrowser);

# define some variables
my ( $gp_file ) = ( param('gp_id') );

unless ($gp_file)
{
  die &quot;ERROR: gp_file parameter required&quot;;
}

plot();

# call gnuplot
sub plot
{
   print header(&quot;image/PNG&quot;);
   #my $graph = `gnuplot ../gnuplot/$gp_file.gnuplot`;
   print $graph;
}
</pre>
<p style="text-align: justify;">En la próxima sección (Programa Cliente) se muestra la creación de un nuevo programa cliente, el cual consiste básicamente en una pagina web HTML utilizando JavaScript por medio de JQuery para hacer peticiones asíncronas a los programas de Servidor y de esa manera recuperar resultados en formato JSON, graficarlos dinamicamente y manejar los eventos que suceden de el lado del cliente.</p>
<h3>Programa Cliente</h3>
<p style="text-align: justify;">A continuación se presenta el programa Cliente, que básicamente es la pagina que utilizara el usuario como punto de inicio para ejecutar programas, la pagina consiste en código HTML y código JavaScript que es este ultimo el que se encarga de realizar las llamadas asíncronas a los programas Servidor, a continuación se muestra el código HTML personalizado de la pagina omitiendo la estructura general de una pagina por cuestiones de simplicidad.</p>
<pre class="brush: xml; title: ; notranslate">
&lt;div id=&quot;divError&quot; /&gt;

&lt;div id=&quot;divDataContainer&quot;&gt;
	&lt;label&gt;Na: &lt;/label&gt;
	&lt;input type='text' id='txtNa' maxlength=&quot;6&quot; size=&quot;5&quot; /&gt;
	&lt;label&gt;Nb: &lt;/label&gt;
	&lt;input type='text' id='txtNb' maxlength=&quot;6&quot; size=&quot;5&quot; /&gt;
	&lt;label&gt;Fa: &lt;/label&gt;
	&lt;input type='text' id='txtFa' maxlength=&quot;6&quot; size=&quot;5&quot; /&gt;
	&lt;label&gt;Fb: &lt;/label&gt;
	&lt;input type='text' id='txtFb' maxlength=&quot;6&quot; size=&quot;5&quot; /&gt;
&lt;/div&gt;

&lt;div id=&quot;divCopyright&quot;&gt;
	&amp;copy; 2011 Software developed by &lt;a href=&quot;http://www.phoxonics.com&quot;&gt;phoxonics&lt;/a&gt;
&lt;/div&gt;

&lt;div id=&quot;divActions&quot;&gt;
	&lt;input type='button' value='Clear' id='btnClearData' /&gt;
	&lt;input type='button' value='Process..' id='btnProcessData' /&gt;
&lt;/div&gt;

&lt;div id=&quot;divImageResult&quot;&gt;
   &lt;table&gt;
      &lt;tr&gt;&lt;td&gt;&lt;div id=&quot;divLinks&quot; /&gt;&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;&lt;img id=&quot;imgResult&quot; /&gt;&lt;/td&gt;&lt;/tr&gt;
   &lt;/table&gt;
&lt;/div&gt;

&lt;div id=&quot;divStatus&quot; /&gt;
</pre>
<p style="text-align: justify;">Como primera instancia se ha agregado un elemento de error, dicho elemento esta posicionado en la parte superior del documento personalizado y sirve como contenedor para mostrar errores, es decir, en caso de que suceda algun error en el proceso de programa de servidor es en esta sección donde se despliega dicho error.</p>
<p style="text-align: justify;">A <strong>continuacion</strong> se ha agregado el contenedor de parametros y contiene cuatro cuadros de texto que permiten la introduccion de datos de parametros por parte del usuario seguido de una secciona Copyright y de un contenedor de acciones, el cual contiene los botones de acciones a realizar sobre el presente programa.</p>
<p>Se prosigue con un contenedor de resultados el cual desplegara los enlaces a los archivos de datos asi como la imagen generada por gnuplot de la grafica de los datos del calculo.</p>
<p style="text-align: justify;">A continuación se agrega y describe paso a paso todo el código JavaScript que se encarga por medio de JQuery de los llamados asíncronos, primero se agrega una referencia a la librería de JQuery a utilizar, esta vez utilizamos una que ya esta en linea para no tener que agregar el código de la librería manualmente, se agrega con la siguiente linea de código, se estará utilizando JQuery version 1.5 que se encuentra alojado en los servidores de google.</p>
<pre class="brush: xml; title: ; notranslate">
&lt;script type=&quot;text/javascript&quot; src=&quot;http://ajax.googleapis.com/ajax/libs/jquery/1.5/jquery.min.js&quot;&gt;&lt;/script&gt;
</pre>
<p style="text-align: justify;">A continuación se define el método principal que sera ejecutado al momento de que el documento esta cargado y sus elementos listos para ser accesados, el método se llama ”.ready es un método de JQuery.</p>
<pre class="brush: jscript; title: ; notranslate">
&lt;script type=&quot;text/javascript&quot;&gt;
$(document).ready(function()
{
	$.ajaxSetup({
		  type: &quot;POST&quot;,
		  async: true,
	      timeout: 5000,
	      contentType: &quot;application/x-www-form-urlencoded; charset=utf-8&quot;,
		  data: &quot;{}&quot;
		});
</pre>
<p style="text-align: justify;">Como se muestra en el código anterior, se ha definido un método de JQuery llamado ”.ajaxSetup.el cual se encarga de configurar las opciones que serán comunes entre todas las llamadas que se harán al servidor utilizando AJAX en este programa Cliente, se han definido algunos valores default los cuales pueden ser modificados dependiendo de las necesidades, como se puede ver se ha definido POST como el tipo de peticiones a utilizar.</p>
<p style="text-align: justify;">Cabe mencionar que la mayoría de el código JavaScript se ha desarrollado utilizando la librería JQuery, a continuación se muestra la rutina para limpiar campos y resultados.</p>
<pre class="brush: jscript; title: ; notranslate">
/* Clear data */
    $(&quot;#btnClearData&quot;).click(function ()
	{
		$('#txtNa').val(&quot;&quot;);
		$('#txtNb').val(&quot;&quot;);
		$('#txtFa').val(&quot;&quot;);
		$('#txtFb').val(&quot;&quot;);

		$('#divStatus').empty();
		$('#divImageResult').empty();
	});
</pre>
<p>En el codigo que se muestra a continuacion suceden una gran variedad de cosas, una vez que se han introducido los datos para los parametros na, nb, fa, fb, los datos se validan y en caso de ser validos se construye un objeto JSON que contiene todos los valores de los parametros que seran enviados como peticion al programa servidor, a continuacion se define una funcion ”.ajax”de JQuery cuya funcion es hacer el llamado asincrono al programa servidor, en la funcion ”.ajax”se han definido algunas directivas como las siguietes.</p>
<p style="text-align: justify;">beforeSend : Se ejecuta antes de enviar la peticion al servidor, complete: Se ejecuta al momento de que el llamado al servidor se complete, error : Se ejecuta solo en caso de que ocurran errores en la llamada al servidor, success: Se ejecuta cuando la llamada al servidor tuvo exito. Tambien se puede ob- servar al inicio de la llamada AJAX que esta se configura con datos basicos para poder realizar la conexion con el servidor, datos como type: tipo de peticion, url: direccion donde reside el programa servidor (vease: Compilando y Ejecutando Soluciones en Linea), contentType: tipo de contenido que reside</p>
<p style="text-align: justify;">en los datos que se enviaran con la peticion al servidor, dataType: Tipo de datos que seran recibidos como resultado de los programas Servidor. El codigo dentro de los manejadores de eventos descritos anteriormente utiliza JQery para dependiendo del evento ocurrido sean los objetos HTML manipulados para borrar o mostrar resultados y graficas.</p>
<pre class="brush: jscript; title: ; notranslate">
	/* Process data */
    $(&quot;#btnProcessData&quot;).click(function ()
	{
		if (!IsDataValid())
		{
			return false;
		}

		var data =
		{
		    'Na': $('#txtNa').val(),
		    'Nb': $('#txtNb').val(),
		    'Fa': $('#txtFa').val(),
		    'Fb': $('#txtFb').val()
		};

		$('#divStatus').empty();
		$('#divStatus').append(&quot;&lt;br /&gt;Started ajax request..&lt;br /&gt;&quot;);
		$.ajax({
		     type: &quot;POST&quot;,
	        url:  &quot;cgi-bin/BlackBoxWeb.cgi&quot;,
	        data: &quot;UserData=&quot; + JSON.stringify(data),
			  contentType: &quot;application/json; charset=utf-8&quot;,
	        dataType: &quot;json&quot;,
	        beforeSend: function (obj)
	        {
	        	$('#divStatus').append(&quot;Before send..&lt;br /&gt;&quot;);
	        },
	        complete: function (obj, status)
	        {
	        	$('#divStatus').append(&quot;Completed..&lt;br /&gt;&quot;);
	            if (status == &quot;success&quot;)
	            {
	            	$('#divStatus').append(&quot;With success..&lt;br /&gt;&quot;);
	            }
	        },
	        error: function (obj, status, obj2)
	        {
	        	$('#divStatus').append(&quot;Error calling server: &quot; + obj + &quot;-&quot; + status + &quot;&lt;br /&gt;&quot;);
	        },
	        success: function(data)
	        {
            if (data.Error != &quot;&quot;)
            {
				   $(&quot;#divError&quot;).css(color) = &quot;red&quot;;
    	        	$(&quot;#divError&quot;).text(data.Error);
				   return false;
            }

	        	$(&quot;#divStatus&quot;).append(data.Message);
	        	$(&quot;#divLinks&quot;).append(data.LinkToData);
	        	$(&quot;#divLinks&quot;).append(data.LinkToCommands);			   

				var d = new Date();
				var cache = d.getTime();
				$('#imgResult').attr(&quot;src&quot;, &quot;cgi-bin/gnuplot.pl?gp_id=&quot; + data.GraphID + &quot;&amp;cache=&quot; + cache);
	        }
		});
	});
</pre>
<p style="text-align: justify;">Cabe mencionar que en la función success cuando el llamado al servidor es exitoso se recibe el objeto JSON que es enviado como resultado por el programa servidor y del cual se extrae la información y los resultados a mostrar, es también en esta parte donde se utiliza el programa de servidor Perl para ejecutar dinamicamente el llamado a gnuplot pasandole como parámetro el ID único de los datos que fueron generados y están guardados del lado del servidor en archivos con el nombre del ID, de esta forma, Perl llama a gnuplot enviándole tanto el archivo de comandos que gnuplot debe ejecutar asi como el archivo de datos que fue resultado de los cálculos realizados en el programa servidor, como resultado se reciben los datos de una imagen los cuales son asignados dinamicamente por JQuery a la objeto imagen de resultados para ser visible al usuario final.</p>
<p style="text-align: justify;">Por ultimo pero no menos importante y para finalizar con la descripción de el programa cliente se tienen los métodos que se encargan de las validaciones los cuales se enlistan a continuación y no requieren de una explicación detallada ya que solamente son funciones JavaScript estandares para validar números decimales.</p>
<pre class="brush: jscript; title: ; notranslate">
 	/* Checks if we have a valid matrix */
	function IsDataValid()
	{
		var data =
		{
		    'Na': $('#txtNa').val(),
		    'Nb': $('#txtNb').val(),
		    'Fa': $('#txtFa').val(),
		    'Fb': $('#txtFb').val()
		};

		for (name in data)
		{
		    if (ValidateDecimal(data[name]) == false)
			{
		    	alert(&quot;The value for &quot; + name + &quot;: &quot; + data[name] + &quot; is not valid, please fix it and try again.&quot;);
		    	return false;
		    }
		}

		return true;
	}

	/* Validate decimal */
	function ValidateDecimal(str)
	{
    	str = alltrim(str);
    	return /^[-+]?[0-9]+(\.[0-9]+)?$/.test(str);
	}

	/* all trim */
	function alltrim(str)
	{
    	return str.replace(/^\s+|\s+$/g, '');
    }

});
&lt;/script&gt;
</pre>
<p style="text-align: justify;">Se ha recorrido un camino de tecnologías, técnicas, paradigmas, lenguajes y estándares y se ha definido con detalle el funcionamiento de cada una de estas entidades, en el siguiente apartado se describe de forma clara la manera en que todas estas tecnologías interactuan entre si para lograr un fin común y desplegar resultados tangibles para el usuario.</p>
<h3>Compilando y Ejecutando Soluciones en Linea</h3>
<p style="text-align: justify;">En prototipos anteriores al BlackBox se ha creado un script personalizado en bash para la compilación y la creación automática de el programa servidor en forma de CGI, cabe mencionar que un programa CGI no es mas que el programa que contiene las modificaciones enlistadas en la sección”Programa Servidor”de C++ o Fortran compilado y con extensión CGI.</p>
<p style="text-align: justify;">El archivo bash con el que se contaba también fue modificado y adaptado para esta versión del BlackBox el cual se incluye a continuación.</p>
<pre class="brush: bash; title: ; notranslate">
#!/bin/bash
#
#  Compile the BLACKBOX solution.
#

# Compile C++ program
g++ BlackBoxWeb.cpp
if [ $? -ne 0 ]; then
  echo &quot;Errors executing g++ -c BlackBox.cpp&quot;
  exit
fi

# Rename the generated file to CGI
mv a.out BlackBoxWeb.cgi

# Clean logic
#rm BlackBoxWeb.o

echo &quot;Ended script flow&quot;

#  Terminate.
exit
</pre>
<p style="text-align: justify;">El script anterior compila el programa en C++ modicado y a continuacion lo renombra a CGI, como se puede apreciar es un proceso bastante sencillo que pudiera realizarse por medio de la consola pero se ha optado por un script para hacer mas rapido el proceso de compilacion.</p>
<p style="text-align: justify;"> Una vez compilado el programa &#8220;Servidor&#8221;se copia a la carpeta CGI-BIN que se ha creado en la seccion de instalacion y conguracion de software, y una vez copiado habra que darle permisos de ejecucion para tener la capacidad de ejecutar el archivo desde el servidor web, para dar permisos de ejecucion se utiliza el siguiente comando.</p>
<pre class="brush: bash; title: ; notranslate">
$sudo chmod +x BlackBox.cgi
</pre>
<p style="text-align: justify;">Una vez copiado a la carpeta cgi-bin y contando con permisos de ejecucion el programa ya es accesible desde el servidor web. El programa de Perl debe ser copiado tambien al directorio cgi-bin para ser accesible por medio del servidor web, este no necesita compilarse ya que Perl es un lenguaje interpretado pero si se necesita darle los permisos de ejecucion similares a los del programa cgi.</p>
<p style="text-align: justify;">A continuacion procedemos a copiar el programa C liente&#8221;que basicamente consta de un archivo HTML al directorio &#8220;Document Root&#8221;que se ha creado en la seccion de Instalacion de Software&#8221;, una vez copiado el programa cliente podra ser accedido desde el servidor web.</p>
<p style="text-align: justify;">Una vez terminados estos pasos la solucion sera accesible desde un navegador de internet y navegando a una URL en la forma de:</p>
<pre class="brush: plain; title: ; notranslate">

http://localhost/BlackBoxWeb.html
</pre>
<p style="text-align: justify;">Lo que invocara al cliente y lo presentara en el navegador como pagina web.</p>
<h3 style="text-align: justify;">Flujo Global de la Solucion</h3>
<p>A continuacion se describe el ujo global de la solucion en linea y la manera en que esta funciona para brindar al cyber usuario una serie de resultados y gracas que se procesan del lado del servidor, esta serie de datos y gracas se producen de acuerdo a los parametros ingresados por el usuario y al calculo de una ecuacion que esta contenida en el programa servidor.</p>
<p>Basicamente la manera de como funciona la solucion web es la siguiente:</p>
<ul>
<li style="text-align: justify;">El usuario teclea la URL en un navegador de internet.</li>
<li style="text-align: justify;">El programa cliente es invocado por el servidor web y presentado al usuario en forma de una pagina web en el navegador.</li>
<li style="text-align: justify;">El usuario ingresa valores para los parametros na, nb, fa, fb y presiona el boton procesar.</li>
<li style="text-align: justify;">El programa cliente valida los datos.</li>
<li style="text-align: justify;">En caso de que los datos no sean validos el programa envia una noticacion al usuario en el navegador pidiendo que los datos sean arreglados.</li>
<li style="text-align: justify;">En caso de que los datos sean validos, el programa cliente borra cualquier resultado previo si existiese para despues construir un objeto JSON con los datos que el usuario ha ingresado.</li>
<li style="text-align: justify;">El programa Cliente construye una nueva peticion al usuario y ejecuta el codigo que se encuentre en el evento &#8220;beforeSend&#8221;</li>
<li style="text-align: justify;">El programa Cliente envia los datos serializados y de manera asincrona al programa Servidor.</li>
<li style="text-align: justify;">En caso de originarse un error el programa Cliente ejecuta el codigo que se encuentre en el evento .error&#8221;.</li>
<li style="text-align: justify;">Si no hay errores en la peticion el programa Cliente ejecuta el codigo que se encuentre en el evento complete 2 queda a la espera de resultados por parte del programa Servidor.</li>
<li style="text-align: justify;">El programa Servidor es invocado y este verica que en la peticion se haya incluido un objeto JSON con los datos que el programa necesita para hacer el calculo.</li>
<li style="text-align: justify;">En caso de no tener los datos que el programa Servidor requiere, este aborta la operacion y construye y envia un objeto JSON que contiene la descripcion del error para que el programa Cliente lo despliegue en el navegador.</li>
<li style="text-align: justify;">En caso de que la peticion si cuente con los datos requeridos, el programa Servidor deserializa el objeto JSON y lo regenera en el ambiente C++.</li>
<li style="text-align: justify;">Una vez regenerado el objeto JSON del lado del servidor el programa nalmente extrae los valores para na, nb, fa y fb y los valida para corroborar que son datos reales.</li>
<li style="text-align: justify;">Una vez asignados los valores a variables locales el programa pide a la plataforma base un nuevo identicador universal unico el cual utilizara para dar nombre a los archivos de datos y comandos que generara.</li>
<li style="text-align: justify;">El programa Servidor realiza los calculos matematicos originales que fueron programados en la aplicacion tradicional.</li>
<li style="text-align: justify;">El programa Servidor crea un archivo de datos con el nombre del identicador unico y extension &#8220;.dat&#8221;donde escribe los resultados obtenidos.</li>
<li style="text-align: justify;">El programa Servidor guarda el archivo de datos en el directorio gnuplot.</li>
<li style="text-align: justify;">El programa Servidor crea otro archivo adicional con el nombre del identicador unico y con extension &#8220;.gnuplot&#8221;</li>
<li style="text-align: justify;">El programa Servidor escribe los datos basicos de los comandos que gnuplot debe ejecutar para generar la graca de este especico calculo, agregando como parametro el nombre del archivo &#8220;.dat&#8221;que acaba de generar y que contiene los resultados de los calculos.</li>
<li style="text-align: justify;">El programa Servidor guarda el archivo de comandos gnuplot en el directorio gnuplot.</li>
<li style="text-align: justify;">El programa crea un nuevo objeto JSON y le agrega informacion sobre mensajes al usuario, el identicador unico generado, un enlace creado dinamicamente que apunta al archivo de datos generado, un enlace creado dinamicamente que apunta al archivo de comandos gnuplot generado.</li>
<li style="text-align: justify;">El programa Servidor serializa el objeto JSON generado y lo envia de regreso al cliente, cabe mencionar que si sucede un error en el programa servidor en cualquier momento este genera un objeto JSON con el error y lo envia al programa Cliente.</li>
<li style="text-align: justify;">El programa Cliente recibe los resultados enviados por parte del programa Servidor en el evento &#8220;success&#8221;.</li>
<li style="text-align: justify;">El programa Cliente deserializa y regenera el objeto JSON en el ambiente JavaScript.</li>
<li style="text-align: justify;">El programa Cliente verica si el objeto JSON de los resultados contiene mensajes de error.</li>
<li style="text-align: justify;">En caso de contener errores el programa cliente los despliega en el objeto divError.</li>
<li style="text-align: justify;">En caso de no contener errores el programa Cliente muestra los mensajes y los enlaces en los objetos creados para cada mensaje.</li>
<li style="text-align: justify;">El programa cliente hace un llamado al programa Servidor Perl y le pasa como parametro el identicador unico que recibio del programa Servidor C++.</li>
<li style="text-align: justify;">El programa Servidor Perl es invocado y verica que la peticion contenga el identicador que necesita para poder gracar.</li>
<li style="text-align: justify;">En caso de que la peticion no contenga el identicador el programa Servidor Perl aborta la operacion.</li>
<li style="text-align: justify;">En caso de que la peticion sea correcta el programa Servidor Perl hace un llamado a gnuplot utilizando la consola y le pasa como parametros el archivo de comandos y el archivo de datos que el programa C++ genero.</li>
<li style="text-align: justify;">Gnuplot es invocado y ejecuta los comandos que el programa Servidor C++ ha generado y tambien utiliza los datos de los resultados que el programa Servidor C++ genero.</li>
<li style="text-align: justify;">Gnuplot genera una graca de los datos generados y la regresa como resultado al programa Servidor Perl.</li>
<li style="text-align: justify;">El programa Servidor Perl toma el resultado que Gnuplot genero y lo envia de regreso al programa Cliente.</li>
<li style="text-align: justify;">El programa Cliente recibe los resultados en forma de contenido y se los asigna dinamicamente al objeto imagen construido en HTML para desplegar los gracos.</li>
<li style="text-align: justify;">Los gracos se despliegan en el programa Cliente.</li>
<li style="text-align: justify;">Fin de la ejecucion.</li>
</ul>
<h3>Recomendaciones</h3>
<p style="text-align: justify;">Las recomendaciones basicas para cualquier usuario en cuanto a desarrollo se reere es que se contemple instalar entornos de desarrollo integrados IDE tanto para JavaScipt asi como para C++, Perl, Fortran y cualquier otro lenguaje que se este utilizando. Actualmente existen muy buenos entornos de desarrollo para Linux como lo es: Eclipse, Netbeans, Oracle Studio, Aptana, Code::Blocks, BlueFish entre otros, ya es cuestion de gustos personales el utilizar uno u otro pero la mayoria son bastante recomentables.</p>
</div>
<h3>Conclusiones</h3>
<p style="text-align: justify;">Se ha presentado una forma sencilla de transformar desarrollos tradicionales en soluciones en linea, se incluyeron simples deniciones y conceptos que se utilizan en todo el proceso de transformacion de un programa para que funcione en un ambiente web, tambien, se presentaron instrucciones y comandos para congurar un ambiente web y toda la conguracion que esto implica.</p>
<p style="text-align: justify;">Se detallaron tecnicas, estandares y paradigmas que deberian ser utilizados y tener en cuenta al momento de realizar una transformacion de este tipo, se describio la forma de evitar problemas en soluciones en linea y las diferencias principales entre una solucion tradicional y una solucion web, se presento una forma novedosa y creativa de gracar sin dejar de utilizar el software tradicional para este tipo de cuestiones y se incluyeron los detalles de la transformacion en forma de codigo fuente y la manera en que se hace uso de una gran variedad de tecnologias que interactuan entre si de manera estandar para lograr un n comun.</p>
<p style="text-align: justify;">Al nal el usuario puede distinguir claramente entre una aplicacion tradicional y una aplicacion web, asi como de todo lo que implica el exponer la aplicacion tradicional a un ambiente en linea, tambien, el usuario ahora entiende las enormes ventajas de tener una solucion en linea y la posibilidad de atender multiples clientes simultaneamente por un programa servidor.</p>
<p style="text-align: justify;">Enjoy!</p>
<div class="tweetthis" style="text-align:left;"><p> <a target="_blank" rel="nofollow" class="tt" href="http://twitter.com/intent/tweet?text=%C2%BFComo+portar+una+aplicacion+existente+a+una+solucion+web%3F+http%3A%2F%2Fis.gd%2FeIL84s" title="Post to Twitter"><img class="nothumb" src="http://yohan.jasdid.com/wp-content/plugins/tweet-this/icons/en/twitter/tt-twitter-micro3.png" alt="Post to Twitter" /></a> <a target="_blank" rel="nofollow" class="tt" href="http://delicious.com/post?url=http://yohan.jasdid.com/2011/10/%c2%bfcomo-portar-una-aplicacion-existente-a-una-solucion-web/&amp;title=%C2%BFComo+portar+una+aplicacion+existente+a+una+solucion+web%3F" title="Post to Delicious"><img class="nothumb" src="http://yohan.jasdid.com/wp-content/plugins/tweet-this/icons/en/delicious/tt-delicious-micro3.png" alt="Post to Delicious" /></a> <a target="_blank" rel="nofollow" class="tt" href="http://www.facebook.com/share.php?u=http://yohan.jasdid.com/2011/10/%c2%bfcomo-portar-una-aplicacion-existente-a-una-solucion-web/&amp;t=%C2%BFComo+portar+una+aplicacion+existente+a+una+solucion+web%3F" title="Post to Facebook"><img class="nothumb" src="http://yohan.jasdid.com/wp-content/plugins/tweet-this/icons/en/facebook/tt-facebook-micro3.png" alt="Post to Facebook" /></a> <a target="_blank" rel="nofollow" class="tt" href="https://mail.google.com/mail/?ui=2&amp;view=cm&amp;fs=1&amp;tf=1&amp;su=%C2%BFComo+portar+una+aplicacion+existente+a+una+solucion+web%3F&amp;body=Link:+http://yohan.jasdid.com/2011/10/%c2%bfcomo-portar-una-aplicacion-existente-a-una-solucion-web/%0D%0A%0D%0A----%0D%0A+En+el+presente+trabajo+se+plasma+un+tutorial+detallado+de+como+portar+una%C2%A0aplicaci%C3%B3n%C2%A0existente+al+web+y+de+como+sacar+ventaja+de+una+gran+variedad+..." title="Send Gmail"><img class="nothumb" src="http://yohan.jasdid.com/wp-content/plugins/tweet-this/icons/en/gmail/tt-gmail-micro3.png" alt="Send Gmail" /></a></p></div>]]></content:encoded>
			<wfw:commentRss>http://yohan.jasdid.com/2011/10/%c2%bfcomo-portar-una-aplicacion-existente-a-una-solucion-web/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Muchas gracias Dr. Manzanares!</title>
		<link>http://yohan.jasdid.com/2011/10/muchas-gracias-dr-manzanares/</link>
		<comments>http://yohan.jasdid.com/2011/10/muchas-gracias-dr-manzanares/#comments</comments>
		<pubDate>Thu, 06 Oct 2011 01:29:58 +0000</pubDate>
		<dc:creator>yohan.jasdid</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Ph.D.]]></category>

		<guid isPermaLink="false">http://yohan.jasdid.com/?p=1880</guid>
		<description><![CDATA[Gracias!, Primero que nada quiero dar las gracias a mi asesor y amigo, el Dr. Jesus Manzanares Martinez por su post y sus felicitaciones, me considero afortunado de tener la oportunidad de contar con un asesor con tanto nivel intelectual, académico y humano que me guíe en los estudios de doctorado que actualmente estoy realizando, Enseguida quiero replicar tal cual [...]]]></description>
			<content:encoded><![CDATA[<p>Gracias!,</p>
<p>Primero que nada quiero dar las gracias a mi asesor y amigo, el <a href="http://http://jesusmanzanares.org/" target="_blank">Dr. Jesus Manzanares Martinez</a> por su <a href="http://jesusmanzanares.org/2011/10/%C2%A1publican-su-primer-articulo-de-doctorado/" target="_blank">post</a> y sus felicitaciones, me considero afortunado de tener la oportunidad de contar con un asesor con tanto nivel intelectual, académico y humano que me guíe en los estudios de doctorado que actualmente estoy realizando,</p>
<p>Enseguida quiero replicar tal cual el post de el Dr. Manzanares ya que es algo que deberia quedar grabado tambien en este mi espacio,</p>
<blockquote>
<h1>¡Publican su primer artículo de doctorado!</h1>
<p>Los entusiastas jugadores de ajedrez Damian Moctezuma Enriquez y Yohan Jasdid Viveros Rodriguez han publicado el primer artículo en su Doctorado en Nanotecnología que cursan en la Universidad de Sonora.</p>
<p>Cabe destacar que es un gran gusto felicitar a Yohan por este medio, ya que el fue el creador de nuestra querida pagina &#8221;ajedrezensonora.com&#8221;.</p>
<p>El articulo &#8221;Existence of a giant hypersonic elastic mirror in porous silicon superlattices&#8221; ha sido publicado en la prestigiosa  revista &#8221;Applied Physics Letters&#8221;, la cual tiene un alto factor de impacto. Este factor de impacto seria un equivalente ajedrecístico al &#8221;rating&#8221; de la publicación, y en esos términos, estaríamos hablando de niveles de &#8221;gran maestro&#8221;. Sin lugar a dudas, este trabajo esta entre las cinco  publicaciones más importantes de la Universidad de Sonora en este 2011.</p>
<p>? Como podemos explicar el contenido de este articulo ? Mas propiamente, ?como nos gustaría contarle a un amigo ajedrecista como vemos este artículo ?.</p>
<p>Pues la cosa se puede contar  más o menos así. Un científico en Canadá publicó en el 2009  (en la misma revista) una serie de experimentos con los cuales demostraba que el podía construir unos ciertos materiales. Digamos que cada uno de estos materiales son materiales A, B, C, etc. Eureka!, con imaginación podemos pensar que cada uno de estos materiales son… ¡como piezas de ajedrez! Y si son piezas de ajedrez&#8230;, pues se pueden hacer combinaciones.</p>
<p>Pues la publicación es una cierta variante en donde combinamos piezas para hacer algo impresionante: un espejo perfecto para ondas elásticas.</p>
<p>Claro que ya metidos en nuestra perspectiva, aun nos quedan muchas cosas en el tintero. Muchas combinaciones por descubrir. Nuevas configuraciones que explorar. Muchas divertidas variantes por analizar…</p>
<p>Así que enhorabuena por este primer logro a nuestros aprendices de doctores en ciencia y les deseamos muchos mas éxitos.</p>
<p><a href="http://jesusmanzanares.org/wp-content/uploads/2011/10/fig1.png"><img title="Estructura de Bandas" src="http://jesusmanzanares.org/wp-content/uploads/2011/10/fig1.png" alt="" width="436" height="596" /></a><a href="http://dl.dropbox.com/u/34923868/bibliography/APL_2011.pdf" target="_blank">Liga al preprint</a></p></blockquote>
<p>Gracias de Nuevo!<br />
Saludos! <img src='http://yohan.jasdid.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
Yohan</p>
<div class="tweetthis" style="text-align:left;"><p> <a target="_blank" rel="nofollow" class="tt" href="http://twitter.com/intent/tweet?text=Muchas+gracias+Dr.+Manzanares%21+http%3A%2F%2Fis.gd%2FMEOgCi" title="Post to Twitter"><img class="nothumb" src="http://yohan.jasdid.com/wp-content/plugins/tweet-this/icons/en/twitter/tt-twitter-micro3.png" alt="Post to Twitter" /></a> <a target="_blank" rel="nofollow" class="tt" href="http://delicious.com/post?url=http://yohan.jasdid.com/2011/10/muchas-gracias-dr-manzanares/&amp;title=Muchas+gracias+Dr.+Manzanares%21" title="Post to Delicious"><img class="nothumb" src="http://yohan.jasdid.com/wp-content/plugins/tweet-this/icons/en/delicious/tt-delicious-micro3.png" alt="Post to Delicious" /></a> <a target="_blank" rel="nofollow" class="tt" href="http://www.facebook.com/share.php?u=http://yohan.jasdid.com/2011/10/muchas-gracias-dr-manzanares/&amp;t=Muchas+gracias+Dr.+Manzanares%21" title="Post to Facebook"><img class="nothumb" src="http://yohan.jasdid.com/wp-content/plugins/tweet-this/icons/en/facebook/tt-facebook-micro3.png" alt="Post to Facebook" /></a> <a target="_blank" rel="nofollow" class="tt" href="https://mail.google.com/mail/?ui=2&amp;view=cm&amp;fs=1&amp;tf=1&amp;su=Muchas+gracias+Dr.+Manzanares%21&amp;body=Link:+http://yohan.jasdid.com/2011/10/muchas-gracias-dr-manzanares/%0D%0A%0D%0A----%0D%0A+Gracias%21%2C%0D%0A%0D%0APrimero+que+nada+quiero+dar+las+gracias+a+mi+asesor+y+amigo%2C+el+Dr.+Jesus+Manzanares+Martinez%C2%A0por+su+post%C2%A0y+sus+felicitaciones%2C+me+con..." title="Send Gmail"><img class="nothumb" src="http://yohan.jasdid.com/wp-content/plugins/tweet-this/icons/en/gmail/tt-gmail-micro3.png" alt="Send Gmail" /></a></p></div>]]></content:encoded>
			<wfw:commentRss>http://yohan.jasdid.com/2011/10/muchas-gracias-dr-manzanares/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Feliz cumpleaños Beib!</title>
		<link>http://yohan.jasdid.com/2011/09/feliz-cumpleanos-beib-2/</link>
		<comments>http://yohan.jasdid.com/2011/09/feliz-cumpleanos-beib-2/#comments</comments>
		<pubDate>Mon, 26 Sep 2011 05:57:39 +0000</pubDate>
		<dc:creator>yohan.jasdid</dc:creator>
				<category><![CDATA[Life]]></category>

		<guid isPermaLink="false">http://yohan.jasdid.com/?p=1872</guid>
		<description><![CDATA[Este post es exclusivamente para felicitar a mi novia en su aniversario, hemos hecho cosas increibles juntos y me haz hecho vivir momentos muy agradables a tu lado, gracias por tu paciencia, tu forma de decir las cosas y mas que nada por estar conmigo.. Te dedico este Poema: EL DULCE SABOR DE UNA MUJER [...]]]></description>
			<content:encoded><![CDATA[<p>Este post es exclusivamente para felicitar a mi novia en su aniversario, hemos hecho cosas increibles juntos y me haz hecho vivir momentos muy agradables a tu lado, gracias por tu paciencia, tu forma de decir las cosas y mas que nada por estar conmigo..</p>
<p>Te dedico este Poema:</p>
<blockquote>
<h3>EL DULCE SABOR DE UNA MUJER EXQUISITA</h3>
<p>‘Una mujer exquisita no es aquella que más hombres tiene a sus pies, si no aquella que tiene uno solo que la hace realmente feliz.Una mujer hermosa no es la más joven, ni la más flaca, ni la que tiene el cutis más terso o el cabello más llamativo, es aquella que con tan sólo una franca y abierta sonrisa y un buen consejo puede alegrarte la vida.</p>
<p>Una mujer valiosa no es aquella que tiene más títulos, ni más cargos académicos, es aquella que sacrifica su sueño temporalmente por hacer felices a los demás.</p>
<p>Una mujer exquisita no es la más ardiente (aunque si me preguntan a mí, todas las mujeres son muy ardientes…Los que estamos fuera de foco somos los hombres)</p>
<p>Una mujer interesante no es aquella que se siente halagada al ser admirada por su belleza y elegancia, es aquella mujer firme de carácter que puede decir NO.</p>
<p>Y un HOMBRE……..UN HOMBRE EXQUISITO es aquel que valora a una mujer así………….. Que se siente orgulloso de tenerla como compañera…. Que sabe tocarla como un músico virtuosísimo toca su amado instrumento… Que lucha a su lado compartiendo todos sus roles, desde lavar platos y atender tripones, hasta devolverle los masajes y cuidados que ella le prodigó antes…</p>
<p>La verdad, compañeros hombres, es que las mujeres en eso de ser ‘Muy machas’ nos llevan gran recorrido… ¡Qué tontos hemos sido -y somos- cuando valoramos el regalo solamente por la vistosidad de su empaque…</p>
<p>¡Tonto y mil veces tonto el hombre que come basura en la calle, teniendo un exquisito manjar en casa’.</p></blockquote>
<p>Por ultimo pongo unas fotos de nuestra velada, me gusto mucho como la pasamos, con la música, el delicioso sabor de un corte fino y por supuesto con tu compania <img src='http://yohan.jasdid.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><img class="aligncenter size-medium wp-image-1873" title="IMG_0090" src="http://yohan.jasdid.com/wp-content/uploads/2011/09/IMG_0090-409x450.png" alt="" width="409" height="450" /></p>
<p><img class="aligncenter size-medium wp-image-1874" title="IMG_0084" src="http://yohan.jasdid.com/wp-content/uploads/2011/09/IMG_0084-437x450.jpg" alt="" width="437" height="450" /></p>
<h3 style="text-align: center;">F  E  L  I  C  I  D  A  D  E  S !!!</h3>
<h3 style="text-align: center;">TE AMO!</h3>
<div class="tweetthis" style="text-align:left;"><p> <a target="_blank" rel="nofollow" class="tt" href="http://twitter.com/intent/tweet?text=Feliz+cumplea%C3%B1os+Beib%21+http%3A%2F%2Fis.gd%2Fu8TCwW" title="Post to Twitter"><img class="nothumb" src="http://yohan.jasdid.com/wp-content/plugins/tweet-this/icons/en/twitter/tt-twitter-micro3.png" alt="Post to Twitter" /></a> <a target="_blank" rel="nofollow" class="tt" href="http://delicious.com/post?url=http://yohan.jasdid.com/2011/09/feliz-cumpleanos-beib-2/&amp;title=Feliz+cumplea%C3%B1os+Beib%21" title="Post to Delicious"><img class="nothumb" src="http://yohan.jasdid.com/wp-content/plugins/tweet-this/icons/en/delicious/tt-delicious-micro3.png" alt="Post to Delicious" /></a> <a target="_blank" rel="nofollow" class="tt" href="http://www.facebook.com/share.php?u=http://yohan.jasdid.com/2011/09/feliz-cumpleanos-beib-2/&amp;t=Feliz+cumplea%C3%B1os+Beib%21" title="Post to Facebook"><img class="nothumb" src="http://yohan.jasdid.com/wp-content/plugins/tweet-this/icons/en/facebook/tt-facebook-micro3.png" alt="Post to Facebook" /></a> <a target="_blank" rel="nofollow" class="tt" href="https://mail.google.com/mail/?ui=2&amp;view=cm&amp;fs=1&amp;tf=1&amp;su=Feliz+cumplea%C3%B1os+Beib%21&amp;body=Link:+http://yohan.jasdid.com/2011/09/feliz-cumpleanos-beib-2/%0D%0A%0D%0A----%0D%0A+Este+post+es+exclusivamente+para+felicitar+a+mi+novia+en+su+aniversario%2C+hemos+hecho+cosas+increibles+juntos+y+me+haz+hecho+vivir+momentos+muy+agra..." title="Send Gmail"><img class="nothumb" src="http://yohan.jasdid.com/wp-content/plugins/tweet-this/icons/en/gmail/tt-gmail-micro3.png" alt="Send Gmail" /></a></p></div>]]></content:encoded>
			<wfw:commentRss>http://yohan.jasdid.com/2011/09/feliz-cumpleanos-beib-2/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Como invocar una subrutina de Fortran desde C++?</title>
		<link>http://yohan.jasdid.com/2011/08/como-invocar-una-subrutina-de-fortran-desde-c/</link>
		<comments>http://yohan.jasdid.com/2011/08/como-invocar-una-subrutina-de-fortran-desde-c/#comments</comments>
		<pubDate>Thu, 01 Sep 2011 05:59:04 +0000</pubDate>
		<dc:creator>yohan.jasdid</dc:creator>
				<category><![CDATA[Articles]]></category>
		<category><![CDATA[Ph.D.]]></category>

		<guid isPermaLink="false">http://yohan.jasdid.com/?p=1664</guid>
		<description><![CDATA[En el presente trabajo se plasma una forma sencilla así como los detalles paso a paso de como invocar una subrutina de Fortran desde C++, lo cual sera de utilidad para cuando se quiera reutilizar código de Fortran y al mismo tiempo aprovechar las bondades de C++, lo anterior, debido a que Fortran cuenta con un numero valioso de funciones las [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">En el presente trabajo se plasma una forma sencilla así como los detalles paso a paso de como invocar una subrutina de Fortran desde C++, lo cual sera de utilidad para cuando se quiera reutilizar código de Fortran y al mismo tiempo aprovechar las bondades de C++, lo anterior, debido a que Fortran cuenta con un numero valioso de funciones las cuales C++ no soporta y otros aspectos relacionados con la velocidad que Fortran puede llegar a alcanzar trabajando con tipos de datos complejos.</p>
<h3>Introduccion</h3>
<p style="text-align: justify;">A medida que la tecnología avanza, nuevos lenguajes de programación han aparecido en el mercado, se han popularizado los lenguajes de alto nivel debido a que las grandes empresas han hecho disponible una cantidad muy grande de librerías y frameworks para facilitar el desarrollo en aplicaciones de media complejidad en donde solo se requiere la manipulación de datos y reglas de negocio sencillas, este no ha sido el caso de las aplicaciones cientificas y matemáticas debido a la gran demanda de recursos de procesamiento que este tipo de aplicaciones requieren. Teniendo esto en cuenta y pensando en las bondades que Fortran ofrece para aplicaciones de tipo cientifico, un gran numero de personas entre cientificos, investigadores, matemáticos, académicos entre otros han adoptado el lenguaje de programación Fortran como su lenguaje primario para aplicaciones que resuelven problemas matemáticos complejos y que requieren una gran cantidad de procesamiento, muchas de estas aplicaciones se han hecho disponibles para resolver cuestiones complejas y han sido probadas a lo largo de los anos por lo que se tiene la confianza de que son rutinas robustas y que proveen al usuario con los resultados deseados.</p>
<p style="text-align: justify;">Es de ahí de donde surge la necesidad de buscar la manera de invocar rutinas de Fortran desde C++, C++ se ha convertido en un lenguaje de programacion que puede combinar aspectos tanto de alto nivel como de bajo nivel, es un lenguaje muy flexible y poderoso el cual también soporta el paradigma de la programación orientada a objetos lo que lo hace mas atractivo para desarrollos modernos.</p>
<p style="text-align: justify;">Con la comunicación de los lenguajes C++ y Fortran, se logra proveer al usuario con los resultados y las capacidades de ambos mundos, sin contar con que se agiliza el tiempo de desarrollo ya que se vuelve innecesario re programar las subrutinas ya hechas en Fortran, se promueve la reutilizacion de código y se aprovecha mejor las inversiones de desarrollo que ya se hicieron en ese lenguaje.</p>
<h3 style="text-align: justify;">Limitaciones</h3>
<p style="text-align: justify;">Hay cuestiones que se deben tener en cuenta al momento de tratar de invocar un lenguaje desde otro lenguaje, las grandes limitaciones que impiden que esto sea posible se enlistan a continuación:</p>
<ol>
<li>Manejo de Interrupciones</li>
<li>Manejo de Entradas / Salidas</li>
<li>Manejo de memoria asignada dinamicamente</li>
</ol>
<p style="text-align: justify;">Estas cuestiones solo las podrá contener uno de los dos programas que se van a enlazar debido a la naturaleza de ellas, pero afortunadamente la mayoria de las subrutinas o librerías disponibles en el mercado cuentan con un muy buen diseño por lo que los puntos anteriores no son un problema, un gran numero de rutinas numéricas y de resolución de ecuaciones integran un buen diseño en sus estructuras lo que las hace altamente re utilizables tanto desde un mismo lenguaje como desde lenguajes externos.</p>
<h3>Algunas Diferencias entre C++ y Fortran</h3>
<p style="text-align: justify;">A continuación se muestran algunas diferencias entre lenguajes C++ y Fortran asi como también la manera correcta de manejar estas diferencias para poder tener éxito invocando un lenguaje desde otro.</p>
<ul>
<li style="text-align: justify;"><strong>Parámetros</strong>: Una de las grandes diferencias a tener en cuenta cuando se quiere construir una interface entre C++ y Fortran es que C++ pasa los parámetros comunes por valor en donde Fortran pasa dichos parámetros por Referencia esto significa que al momento de definir las subrutinas que serán llamadas desde C++ habrá que definir y pasarle a las rutinas de Fortran los parámetros por Referencia para que estas puedan funcionar, pasar un parámetro por referencia significa pasar la dirección de memoria donde este parámetro se encuentra localizado en vez del valor del parámetro como C++ lo hace por defecto.</li>
<li style="text-align: justify;"><strong>Nombre de la Subrutina</strong>: Otro de los aspectos a tener en cuenta en la construcción de la interface C++-Fortran son los nombres de las subrutinas, una de las cuestiones que el compilador de fortran realiza al momento de generar los objetos a partir del código fuente es que agrega un guion bajo a todas las subrutinas, esto se tiene que tener presente ya que al momento de definir la subrutina de Fortran que sera invocada se tendrá que concatenar un guion bajo a la subrutina ya que de otra forma C++ no sera capaz de llamar la subrutina ya que en el proceso de compilación /&#8217;esta cambio de nombre.</li>
<li style="text-align: justify;"><strong>Tipo de Datos</strong>: Los tipos de datos en C++ y Fortran NO son similares, por lo que se tendrá que encontrar el tipo de datos equivalente de C++ cuando se llama una subrutina de Fortran, esto se refiere a que si los tipos de datos no concuerdan en capacidad habra errores al momento de hacer el llamado desde C++ a Fortran, en la siguiente sección se incluye una tabla de equivalencias de tipos de datos entre C++ y Fortran esta sera sumamente necesaria para definir las subrutinas Fortran que serán invocadas.</li>
<li style="text-align: justify;"><strong>Orden en Arreglos</strong>: Es importante notar que el orden en que se almacenan los valores en los arreglos cambia de acuerdo al lenguaje que se este utilizando, pero esto se puede manejar de manera sencilla cambiando en orden de las posiciones del arreglo, es decir Arr(i,j) en Fortran seria en C++ algo similar a Arr[j][i].</li>
<li style="text-align: justify;"><strong>Indice en Arreglos</strong>: Es importante recordar que los indices de los arreglos y matrices en Fortran empiezan con el uno a diferencia de C++ el cual empieza con el cero, es decir, que si en Fortran se dene una matriz de una longitud de n elementos entonces los indices de dicha matriz irán de 1 a n a diferencia de C++ en donde los indices serian de 0 a n-1.</li>
</ul>
<div style="text-align: justify;">
<h3>Equivalencia de Tipos entre C++ y Fortran</h3>
<table border="0" frame="VOID" rules="NONE" cellspacing="0">
<colgroup>
<col width="186" />
<col width="237" /></colgroup>
<tbody>
<tr>
<td align="LEFT" width="186" height="17"><strong>Fortran</strong></td>
<td align="LEFT" width="237"><strong>C++</strong></td>
</tr>
<tr>
<td align="LEFT" height="17">byte</td>
<td align="LEFT">unsigned char</td>
</tr>
<tr>
<td align="LEFT" height="17">integer*2</td>
<td align="LEFT">short int</td>
</tr>
<tr>
<td align="LEFT" height="17">integer</td>
<td align="LEFT">long int or int</td>
</tr>
<tr>
<td align="LEFT" height="17">integer iabc(2,3)</td>
<td align="LEFT">int iabc[3][2]</td>
</tr>
<tr>
<td align="LEFT" height="17">logical</td>
<td align="LEFT">long int or int</td>
</tr>
<tr>
<td align="LEFT" height="17">logical*1</td>
<td align="LEFT">bool (C++, One byte)</td>
</tr>
<tr>
<td align="LEFT" height="17">real</td>
<td align="LEFT">float</td>
</tr>
<tr>
<td align="LEFT" height="17">real*8</td>
<td align="LEFT">double</td>
</tr>
<tr>
<td align="LEFT" height="17">real*16</td>
<td align="LEFT">long double</td>
</tr>
<tr>
<td align="LEFT" height="17">complex</td>
<td align="LEFT">struct{float realnum; float imagnum;}</td>
</tr>
<tr>
<td align="LEFT" height="17">double complex</td>
<td align="LEFT">struct{double dr; double di;}</td>
</tr>
<tr>
<td align="LEFT" height="17">character*6 abc</td>
<td align="LEFT">char abc[6]</td>
</tr>
<tr>
<td align="LEFT" height="17">character*6 abc(4)</td>
<td align="LEFT">char abc[4][6]</td>
</tr>
<tr>
<td align="LEFT" height="17">parameter</td>
<td align="LEFT">#define PARAMETER value</td>
</tr>
</tbody>
</table>
</div>
<h3>extern</h3>
<p style="text-align: justify;">extern es una palabra reservada de C++ la cual nos permite hacer uso de rutinas definidas en otros lenguajes, el requerimiento mas importante para a utilización de rutinas escritas en diferentes lenguajes es que se defina la función que se va a utilizar con la palabra reservada &#8220;extern&#8221;, de esta forma el compilador (conoce) el tipo de datos que va a enviar a la funcion externa.</p>
<h3>Ejemplo, C++ llama a Fortran</h3>
<p style="text-align: justify;">El ejemplo sencillo que se expondrá a continuación consiste en llamar a una rutina bien conocida de Fortran la cual se encarga de calcular los eigenvalores de una matriz dada, lo interesante de este ejemplo es que se estará llamando a dicha rutina desde un programa hecho en C++ y se mostrara la manera de hacer el enlace entre los dos lenguajes, a continuación se enlista la definición del encabezado para la subrutina de Fortran.</p>
<pre class="brush: plain; title: ; notranslate">
subroutine cg(nm,n,ar,ai,wr,wi,matz,zr,zi,fv1,fv2,fv3,ierr)
c
      integer n,nm,is1,is2,ierr,matz
      double precision ar(nm,n),ai(nm,n),wr(n),wi(n),zr(nm,n),zi(nm,n),
     x       fv1(n),fv2(n),fv3(n)
c
c     this subroutine calls the recommended sequence of
c     subroutines from the eigensystem subroutine package (eispack)
c     to find the eigenvalues and eigenvectors (if desired)
c     of a complex general matrix.

c
c ... omitido por simplicidad
c
</pre>
<p style="text-align: justify;">Una vez que se tiene la subrutina a llamar de fortran y de acuerdo a la tabla de equivalencias que se definió en la parte de arriba, se utiliza la palabra clave extern para declarar esta función desde dentro de la rutina C++ como se muestra a continuación.</p>
<pre class="brush: cpp; title: ; notranslate">
//  Interfaces to FORTRAN77 routines.
//  The names now have underscores appended, and
//  scalar parameters are passed by reference.
//  The EXTERN statement used here stops C++ from &amp;quot;name mangling&amp;quot;, which
//  would have destroyed the correspondence between the symbolic names
//  of the subroutines as recorded in the C++ and FORTRAN77 compiled codes.
//
extern &amp;quot;C&amp;quot; {
  void cg_ (int *nr, int *nc, double ar[CONST_ROWS][CONST_COLS], double ai[CONST_ROWS][CONST_COLS], double wr[],
    double wi[], int *flag, double zr[CONST_ROWS][CONST_COLS], double zi[CONST_ROWS][CONST_COLS], double fv1[],
    double fv2[], double fv3[], int *ierr);
}
</pre>
<p style="text-align: justify;">Utilizando la tabla de equivalencia de tipos se determinan los tipos de cada parámetro que la subrutina de Fortran esta esperando a su similar en C++ y tomando en cuenta las reglas para poder hacer el llamado se define el tipo de datos y en caso de ser escalar se define que se pasara por referencia y no por valor ya que el comportamiento de fortran es manejar referencias en vez de valores, también, notese como se le ha agregado un guion bajo al nombre de la subrutina de fortran en la definición extern, esto debido a que el compilador Fortran como se ha mencionado anteriormente al momento de compilar y generar el objeto le agrega de forma automática este tipo de prefijo al nombre de la subrutina por lo que es necesario para que el compilador C++ pueda comunicarse con Fortran.</p>
<p style="text-align: justify;">A continuación se muestra como se construye una matriz y se pasa a fortran tomando en cuenta los indices así como el orden en que se pasa la matriz, se muestra como enviar parámetros escalares por referencia, y la manera de hacer el llamado a nuestra función extern para obtener un resultado.</p>
<pre class="brush: cpp; title: ; notranslate">
int main ( )
{
  cout &amp;lt;&amp;lt; &amp;quot;content-type: text/html&amp;quot; &amp;lt;&amp;lt; endl &amp;lt;&amp;lt; endl;
  cout &amp;lt;&amp;lt; &amp;quot;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&amp;quot; &amp;lt;&amp;lt; endl;
  cout &amp;lt;&amp;lt; &amp;quot;&amp;lt;h1&amp;gt;*** Program that calls a Fortran subroutine ***&amp;lt;/h1&amp;gt;&amp;quot; &amp;lt;&amp;lt; endl &amp;lt;&amp;lt; endl;  

  int ierr, flag, i, j;
  flag = 0;              // no need extra results from [cg_] fortran subroutine 

  double ar[ROWS][COLS], ai[ROWS][COLS], zr[ROWS][COLS], zi[ROWS][COLS];
  double wr[ROWS], wi[ROWS];
  double fv1[ROWS], fv2[ROWS], fv3[ROWS];

  for (i = 0; i &amp;lt; ROWS; i++)
  {
    for (j = 0; j &amp;lt; COLS; j++)
    {
      ar[j][i] = (i + 1) + (j + 1);  // (+1) this is because of fortran indexes changes
      ai[j][i] = 0.0;
      zr[j][i] = 0.0;
      zi[j][i] = 0.0;
    }
  }

  // print matrix
  cout &amp;lt;&amp;lt; &amp;quot;+ Matrix to pass to Fortran&amp;quot; &amp;lt;&amp;lt; &amp;quot;&amp;lt;br /&amp;gt;&amp;quot;;
  cout &amp;lt;&amp;lt; &amp;quot;&amp;lt;p&amp;gt;&amp;quot;;
  for (i = 0; i &amp;lt; ROWS; i++)
  {
    for (j = 0; j &amp;lt; COLS; j++)
    {
      cout &amp;lt;&amp;lt; ar[i][j] &amp;lt;&amp;lt; &amp;quot;&amp;amp;nbsp;&amp;amp;nbsp;&amp;quot;;
    }
    cout &amp;lt;&amp;lt; &amp;quot;&amp;lt;br /&amp;gt;&amp;quot;;
  }
  cout &amp;lt;&amp;lt; &amp;quot;&amp;lt;/p&amp;gt;&amp;quot;;

  cout &amp;lt;&amp;lt; &amp;quot;EIGEN BlackBox:&amp;quot; &amp;lt;&amp;lt; &amp;quot;&amp;lt;br /&amp;gt;&amp;quot;;
  cout &amp;lt;&amp;lt; &amp;quot;  Combination C++ and FORTRAN77 version.&amp;quot; &amp;lt;&amp;lt; &amp;quot;&amp;lt;br /&amp;gt;&amp;quot;;
  cout &amp;lt;&amp;lt; &amp;quot;  Demonstrate how a C++ main program can call&amp;quot; &amp;lt;&amp;lt; &amp;quot;&amp;lt;br /&amp;gt;&amp;quot;;
  cout &amp;lt;&amp;lt; &amp;quot;  a FORTRAN77 library.&amp;quot; &amp;lt;&amp;lt; &amp;quot;&amp;lt;br /&amp;gt;&amp;quot;;

  int rows, cols;  // we have to pass the COLS and ROWS by reference to fortran
  rows = ROWS;
  cols = COLS;

  cg_ (&amp;amp;rows, &amp;amp;cols, ar, ai, wr, wi, &amp;amp;flag, zr, zi, fv1, fv2, fv3, &amp;amp;ierr);

  // results
  cout &amp;lt;&amp;lt; &amp;quot;&amp;lt;br /&amp;gt;&amp;quot;;
  cout &amp;lt;&amp;lt; &amp;quot;Results: &amp;quot; &amp;lt;&amp;lt; &amp;quot;&amp;lt;br /&amp;gt;&amp;quot; &amp;lt;&amp;lt; wr[0] &amp;lt;&amp;lt; &amp;quot;&amp;lt;br /&amp;gt;&amp;quot; &amp;lt;&amp;lt;  wr[1] &amp;lt;&amp;lt; &amp;quot;&amp;lt;br /&amp;gt;&amp;quot; &amp;lt;&amp;lt; wr[2] &amp;lt;&amp;lt; &amp;quot;&amp;lt;br /&amp;gt;&amp;quot; &amp;lt;&amp;lt; wr[3] &amp;lt;&amp;lt; &amp;quot;&amp;lt;br /&amp;gt;&amp;quot;;

  cout &amp;lt;&amp;lt; &amp;quot;&amp;lt;br /&amp;gt;&amp;quot;;
  cout &amp;lt;&amp;lt; &amp;quot;EIGEN BlackBox: &amp;quot; &amp;lt;&amp;lt; &amp;quot;&amp;lt;br /&amp;gt;&amp;quot;;
  cout &amp;lt;&amp;lt; &amp;quot;  Normal end of execution. &amp;quot; &amp;lt;&amp;lt; &amp;quot;&amp;lt;br /&amp;gt;&amp;quot;;
  cout &amp;lt;&amp;lt; &amp;quot;&amp;lt;br /&amp;gt;&amp;quot;;

  cout &amp;lt;&amp;lt; &amp;quot;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&amp;quot; &amp;lt;&amp;lt; &amp;quot;&amp;lt;br /&amp;gt;&amp;quot;;
  return 0;
}
</pre>
<p style="text-align: justify;">Como se puede observar en el ejemplo, los resultados calculados de la función son accesibles a través de el vector wr, los cuales son mostrados en pantalla al finalizar la ejecución del programa, en el siguiente listado se muestran los comandos que se tienen que ejecutar para compilar y hacer el enlace de los programas C++ y Fortran y la manera de ejecutar la solución final.</p>
<pre class="brush: bash; title: ; notranslate">
#!/bin/bash
#
#  Compile the FORTRAN90 library.
#
gfortran -c eigen_f.f
if [ $? -ne 0 ]; then
  echo &amp;quot;Errors executing gfortran -c eigen_f.f&amp;quot;
  exit
fi
#
#  Compile the C++ main program.
#
g++ -c eigen_c_cgi.cpp
if [ $? -ne 0 ]; then
  echo &amp;quot;Errors executing g++ -c eigen_c.C&amp;quot;
  exit
fi
#
#  Link the main program and library.
#  OR, you can use the G++ command to link,
#  if you include the -lgfortran library,
#
g++ eigen_c_cgi.o eigen_f.o -lgfortran
if [ $? -ne 0 ]; then
  echo &amp;quot;Errors executing gcc -c eigen_c.c&amp;quot;
  exit
fi
#
#  Run the program.
#
mv a.out eigen_c_cgi.cgi
#./eigen_c_cgi &amp;gt; eigen_c_cgi_output.txt
#
#  Clean up.
#
rm eigen_f.o
rm eigen_c_cgi.o
rm eigen_c_cgi
echo &amp;quot;Test output written to eigen_c_cgi_output.txt&amp;quot;
#
#  Terminate.
#
exit
</pre>
<p style="text-align: justify;">Como se puede observar en el script anterior, el primer paso a dar sera el de compilar la librería Fortran a la que se quiere acceder, a continuacion se debe compilar el programa principal el cual llamara a su vez a la rutina Fortran para finalmente hacer el enlace entre los programas compilados de de Fortran y C++ utilizando para esto el compilador g++, una vez que se tiene un resultado del enlace anterior este se re nombra y ejecuta y los resultados de la ejecución son enviados a un archivo de texto para mayor comodidad, por ultimo se borran los objetos generados en el proceso se imprime una etiqueta final y el script queda listo para otra ejecución si fuese necesaria.</p>
<p style="text-align: justify;">Para compilar, linkear y ejecutar el programa solo se deben ejecutar el script bash con los siguientes comandos, (el primero le da permiso de ejecucion al archivo).</p>
<pre class="brush: bash; title: ; notranslate">
chmod +x eigenfunc.sh
sh eigenfunc.sh
</pre>
<p style="text-align: justify;">Y a continuación se enlistan los resultados de la ejecución.</p>
<pre class="brush: plain; title: ; notranslate">
Started ajax request..
Before send..

+ Matrix to pass to Fortran
2   3   4   5
3   4   5   6
4   5   6   7
5   6   7   8   

EIGEN BlackBox:
Combination C++ and FORTRAN77 version.
Demonstrate how a C++ main program can call
a FORTRAN77 library.

Matrix Eigenvalues:
20.9545
-0.954451
-8.14465e-17
-8.14465e-17

Matrix Reduced Frequency Eigenvalues:
7.28546
nan
nan
nan

EIGEN BlackBox:
Normal end of execution. 

Completed..
With success..
</pre>
<h3>Conclusiones</h3>
<p style="text-align: justify;">En esta sección se ha presentado una forma sencilla de hacer una relacion entre C++ y Fortran para hacer posible el compartir lógica entre ambos lenguajes, con esto, se ha logrado el tener una alternativa para cuando se quieren aprovechar rutinas tanto matemáticas como científicas así como librerías desarrolladas por terceros en un lenguaje y utilizarlas desde otro.</p>
<p style="text-align: justify;">Cabe mencionar que este procedimiento es similar y aplicable a otros lenguajes con pocas modificaciones, lo que tal vez se exponga en un apartado futuro, también, cabe mencionar que en futuros apartados se describirá cuales son las ventajas de utilizar Fortran frente a C++ en cierto tipo de desarrollos y aprovechar esas bondades por medio del enlace de estos lenguajes.</p>
<div class="tweetthis" style="text-align:left;"><p> <a target="_blank" rel="nofollow" class="tt" href="http://twitter.com/intent/tweet?text=Como+invocar+una+subrutina+de+Fortran+desde+C%2B%2B%3F+http%3A%2F%2Fis.gd%2FTQU7ya" title="Post to Twitter"><img class="nothumb" src="http://yohan.jasdid.com/wp-content/plugins/tweet-this/icons/en/twitter/tt-twitter-micro3.png" alt="Post to Twitter" /></a> <a target="_blank" rel="nofollow" class="tt" href="http://delicious.com/post?url=http://yohan.jasdid.com/2011/08/como-invocar-una-subrutina-de-fortran-desde-c/&amp;title=Como+invocar+una+subrutina+de+Fortran+desde+C%2B%2B%3F" title="Post to Delicious"><img class="nothumb" src="http://yohan.jasdid.com/wp-content/plugins/tweet-this/icons/en/delicious/tt-delicious-micro3.png" alt="Post to Delicious" /></a> <a target="_blank" rel="nofollow" class="tt" href="http://www.facebook.com/share.php?u=http://yohan.jasdid.com/2011/08/como-invocar-una-subrutina-de-fortran-desde-c/&amp;t=Como+invocar+una+subrutina+de+Fortran+desde+C%2B%2B%3F" title="Post to Facebook"><img class="nothumb" src="http://yohan.jasdid.com/wp-content/plugins/tweet-this/icons/en/facebook/tt-facebook-micro3.png" alt="Post to Facebook" /></a> <a target="_blank" rel="nofollow" class="tt" href="https://mail.google.com/mail/?ui=2&amp;view=cm&amp;fs=1&amp;tf=1&amp;su=Como+invocar+una+subrutina+de+Fortran+desde+C%2B%2B%3F&amp;body=Link:+http://yohan.jasdid.com/2011/08/como-invocar-una-subrutina-de-fortran-desde-c/%0D%0A%0D%0A----%0D%0A+En+el+presente+trabajo+se+plasma+una+forma+sencilla%C2%A0as%C3%AD%C2%A0como+los+detalles+paso+a+paso+de+como+invocar+una+subrutina+de+Fortran+desde+C%2B%2B%2C+lo+cual%C2%A0s..." title="Send Gmail"><img class="nothumb" src="http://yohan.jasdid.com/wp-content/plugins/tweet-this/icons/en/gmail/tt-gmail-micro3.png" alt="Send Gmail" /></a></p></div>]]></content:encoded>
			<wfw:commentRss>http://yohan.jasdid.com/2011/08/como-invocar-una-subrutina-de-fortran-desde-c/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Meep: Fuente Continua y Punta &#8211; Simulacion</title>
		<link>http://yohan.jasdid.com/2011/08/meep-fuente-continua-y-punta-simulacion/</link>
		<comments>http://yohan.jasdid.com/2011/08/meep-fuente-continua-y-punta-simulacion/#comments</comments>
		<pubDate>Wed, 31 Aug 2011 05:14:05 +0000</pubDate>
		<dc:creator>yohan.jasdid</dc:creator>
				<category><![CDATA[Meep]]></category>
		<category><![CDATA[Ph.D.]]></category>
		<category><![CDATA[Sources]]></category>

		<guid isPermaLink="false">http://yohan.jasdid.com/?p=1651</guid>
		<description><![CDATA[Para continuar con la serie de artículos del Meep se presenta la primera fuente para poder realizar una simulación mas acorde con lo que se quiere hacer, una fuente es simplemente una emisión del campo electromagnético, en Meep una fuente es separable en espacio y tiempo y es calculada por medio de las ecuaciones de Maxwell cada vez que exista un paso [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Para continuar con la serie de artículos del Meep se presenta la primera fuente para poder realizar una simulación mas acorde con lo que se quiere hacer, una fuente es simplemente una emisión del campo electromagnético, en Meep una fuente es separable en espacio y tiempo y es calculada por medio de las ecuaciones de Maxwell cada vez que exista un paso en el tiempo,</p>
<p style="text-align: justify;">Existen tres tipos de fuentes en Meep que se enlistan a continuación:</p>
<ul>
<li style="text-align: justify;"><strong>Fuente Continua</strong>: Se refiere a una onda continua puede ser prendida o apagada y tiene propiedades como frecuencia, tiempo de inicio, tiempo final y ancho.</li>
<li style="text-align: justify;"><strong>Fuente Gaussiana</strong>: Un pulso gaussiano que basicamente es el derivado en el tiempo de la función gaussiana, tiene propiedades como la frecuencia, el ancho, el tiempo de inicio y el numero de corte.</li>
<li style="text-align: justify;"><strong>Fuente Custom</strong>: Es donde el usuario especifica una función como fuente y tiene propiedades como tiempo de inicio y tiempo final.</li>
</ul>
<p>A continuación se enlistan los cambios necesarios para agregar una fuente continua y al mismo tiempo utilizando la figura geométrica de la punta para ver el comportamiento y la tendencia de la onda,</p>
<p>Primero que nada se declara la fuente continua para lo cual se define la frecuencia, el ancho, el tiempo de inicio y el tiempo final, el código correspondiente se enlista a continuación:</p>
<pre class="brush: cpp; title: ; notranslate">
	double freq = 0.5, fwidth = 0.5;
	double start_time = 0, end_time = 100;
	continuous_src_time src(freq, fwidth, start_time, end_time);
</pre>
<p style="text-align: justify;">Una vez que se tiene declarada la fuente continua con todos sus parámetros, se procede a agregar la fuente a la clase field que contiene la estructura general en donde a su vez contiene la malla y la función para la geometría, para agregar la fuente en forma de punto en el componente Ez se utiliza el siguiente código:</p>
<pre class="brush: cpp; title: ; notranslate">
	field.add_point_source(Ez, src, vec(2, -4.5));
</pre>
<p style="text-align: justify;">En la declaración se define el componente, en este caso Ez, a continuación la fuente continua que ya se había declarado y para finalizar se define un punto en donde la fuente vivirá por medio de un vector.</p>
<p style="text-align: justify;">A continuación se define el archivo HDF5 en donde se guardaran todos los datos para después generar imágenes o videos a partir de los datos,  la manera en que Meep funciona es que utiliza todo un mecanismo interno para por medio de una serie de herramientas generar datos en formato HDF5, dichos datos contienen el epsilon de cada material en cada punto de la malla, dichos datos y por medio de algunas utilerias del MIT son convertidos a distintos formatos para volverse gráficos, a continuación se enlista el código para definir un archivo personalizado de HDF5 por medio de la librería de Meep:</p>
<pre class="brush: cpp; title: ; notranslate">
	h5file *h5_file = field.open_h5file(&quot;ez&quot;, h5file::WRITE, &quot;&quot;, true);
</pre>
<p style="text-align: justify;">Los parámetros que se definen para crear y abrir el archivo en formato HDF5 son: primero el nombre del archivo, el modo en que el archivo se abrirá, un prefijo para el archivo y si se define un identificador de tiempo.</p>
<p style="text-align: justify;">A continuación se define el ciclo de tiempo que generara los datos HDF5 y la forma en que se guardan en el archivo que se acaba de crear:</p>
<pre class="brush: cpp; title: ; notranslate">
	while (field.time() &lt; field.last_source_time())
	{
		field.output_hdf5(Ez, grid_vol.surroundings(), h5_file, true, false, &quot;&quot;);
		field.step();
	}
</pre>
<p style="text-align: justify;">El ciclo básicamente le dice a la clase field que haga pequeños pasos por default de .1 en C++ desde el tiempo de inicio de la simulación definido y hasta el tiempo final, dentro del ciclo se define un output en donde se especifica el componente, el volumen, el archivo que se acaba de crear en modo de escritura, una bandera para definir si se agregan los datos o se crean un archivo HDF5 cada vez, si se tendrá soporte de precisión y por ultimo algún prefijo deseado.</p>
<p style="text-align: justify;">A continuación se enlista el código de la simulación completo:</p>
<pre class="brush: cpp; title: ; notranslate">
#include &lt;meep.hpp&gt;
#include &lt;iostream&gt;
using namespace meep;

double PuntaObject(const vec &amp;p)
{
    if ((p.x() &gt;= 0 &amp;&amp; p.x() &lt;= 4) &amp;&amp; (p.y() &gt;= -4 &amp;&amp; p.y() &lt;= 8))
    {
    	if (p.x() == 2 &amp;&amp; p.y() == 4)
    		return 1.0;

    	// define area for end point
    	if (p.y() &gt;= 4)
    	{
        	if (p.x() &lt;= (p.y()/2)-2)
        		return 1.0;

        	if (p.x() &gt;= (p.y()/2)-(p.y()-6))
        		return 1.0;
    	}

    	return 8.0;
    }
    return 1.0;
}

int main(int argc, char **argv)
{
    meep::initialize mpi(argc, argv);   // Do this even for non-MPI Meep
    double resolution = 10;             // pixels per distance
    const double pml_thickness = 1.0;
    const double x = 30 + pml_thickness;
    const double y = 30 + pml_thickness;

	grid_volume grid_vol = vol2d(x, y, resolution);  // 30x30 2d cell
	grid_vol.center_origin();                        // set the origin as the center of cell

	structure strct(grid_vol, PuntaObject, pml(pml_thickness));  // structure punta
	fields field(&amp;strct);
	field.use_real_fields();     // this is for optimization purposes
	field.output_hdf5(Dielectric, grid_vol.surroundings());

	double freq = 0.5, fwidth = 0.5;
	double start_time = 0, end_time = 100;
	continuous_src_time src(freq, fwidth, start_time, end_time);
	field.add_point_source(Ez, src, vec(2, -4.5));

	h5file *h5_file = field.open_h5file(&quot;ez&quot;, h5file::WRITE, &quot;&quot;, true);
	while (field.time() &lt; field.last_source_time())
	{
		field.output_hdf5(Ez, grid_vol.surroundings(), h5_file, true, false, &quot;&quot;);
		field.step();
	}
	return 0;
}
</pre>
<p style="text-align: justify;">Para ejecutar la simulación anterior es necesario crear un shell script en donde se especifican algunos paquetes que ayudaran en la conversión de datos en formato HDF5 a formato de imagen asi como tambien hara todo el compilado del codigo anterior y la generacion de la animacion para obtener los resultados deseados, para el caso anterior y suponiendo que el programa se llama _punta.cpp se crea el siguiente archivo bash:</p>
<pre class="brush: bash; title: ; notranslate">
make _punta.dac
./_punta.dac

h5ls eps-000000.00.h5
h5ls ez-000000.00.h5
h5topng -Zc dkbluered eps-000000.00.h5
h5topng -t 0:1999 -R -Zc dkbluered -a yarg -A eps-000000.00.h5 ez-000000.00.h5
convert ez-000000.00.t*.png ez-000000.00.mpg

rm eps-000000.00.h5
rm ez-000000.00.h5
rm _punta.dac
rm ez-000000.00.t*.png
</pre>
<p style="text-align: justify;">El shell script anterior compila el programa C++ mediante la instrucción make y crea un archivo de ejecución con extensión &#8220;.dac&#8221; la cual se ejecuta en la siguiente instrucción, a continuación se utiliza un comando propio de el paquete h5utils desarrollado también por el MIT, el comando h5ls enlista el tamaño del dataset creado que vive en el archivo con extensión H5 y en formato HDF5 este enlistado es solamente con fines informativos, a continuación se ejecuta el comando h5topng el cual como describe su nombre hace una conversión de los datos en formato HDF5 a una imagen en formato PNG,</p>
<p style="text-align: justify;">Despues, se utilizan los datos de la geometría asi como los datos de el campo generado para generar una serie de archivos en formato PNG que representan una imagen en el tiempo en cada uno de los pasos de la simulación, después se utiliza un paquete llamado ImageMagick para convertir la serie de imágenes creadas en formato de video y se finaliza removiendo archivos que ya no serán utilizados al final de la simulación ya que lo que nos interesa por ahora es el video.</p>
<p style="text-align: justify;">Para concluir con la ejecución del programa Meep creado, se debe ejecutar el shell script que hara todo el trabajo de escribir todos esos comandos por nosotros con la siguiente instrucción, suponiendo que nuestro script se llame _punta.sh.</p>
<pre class="brush: bash; title: ; notranslate">
chmod +x _punta.sh
sh _punta.sh
</pre>
<p style="text-align: justify;">Listo!, el video resultante de la simulacion anterior se enlista a continuacion:</p>
<p><a href="http://www.youtube.com/watch?v=lSjUKYDrB-0">http://www.youtube.com/watch?v=lSjUKYDrB-0</a></p>
<p style="text-align: justify;">Enjoy!</p>
<div class="tweetthis" style="text-align:left;"><p> <a target="_blank" rel="nofollow" class="tt" href="http://twitter.com/intent/tweet?text=Meep%3A+Fuente+Continua+y+Punta+%E2%80%93+Simulacion+http%3A%2F%2Fis.gd%2F7a7fLC" title="Post to Twitter"><img class="nothumb" src="http://yohan.jasdid.com/wp-content/plugins/tweet-this/icons/en/twitter/tt-twitter-micro3.png" alt="Post to Twitter" /></a> <a target="_blank" rel="nofollow" class="tt" href="http://delicious.com/post?url=http://yohan.jasdid.com/2011/08/meep-fuente-continua-y-punta-simulacion/&amp;title=Meep%3A+Fuente+Continua+y+Punta+%E2%80%93+Simulacion" title="Post to Delicious"><img class="nothumb" src="http://yohan.jasdid.com/wp-content/plugins/tweet-this/icons/en/delicious/tt-delicious-micro3.png" alt="Post to Delicious" /></a> <a target="_blank" rel="nofollow" class="tt" href="http://www.facebook.com/share.php?u=http://yohan.jasdid.com/2011/08/meep-fuente-continua-y-punta-simulacion/&amp;t=Meep%3A+Fuente+Continua+y+Punta+%E2%80%93+Simulacion" title="Post to Facebook"><img class="nothumb" src="http://yohan.jasdid.com/wp-content/plugins/tweet-this/icons/en/facebook/tt-facebook-micro3.png" alt="Post to Facebook" /></a> <a target="_blank" rel="nofollow" class="tt" href="https://mail.google.com/mail/?ui=2&amp;view=cm&amp;fs=1&amp;tf=1&amp;su=Meep%3A+Fuente+Continua+y+Punta+%E2%80%93+Simulacion&amp;body=Link:+http://yohan.jasdid.com/2011/08/meep-fuente-continua-y-punta-simulacion/%0D%0A%0D%0A----%0D%0A+Para+continuar+con+la+serie+de%C2%A0art%C3%ADculos%C2%A0del+Meep+se+presenta+la+primera+fuente+para+poder+realizar+una%C2%A0simulaci%C3%B3n%C2%A0mas+acorde+con+lo+que+se+quiere+..." title="Send Gmail"><img class="nothumb" src="http://yohan.jasdid.com/wp-content/plugins/tweet-this/icons/en/gmail/tt-gmail-micro3.png" alt="Send Gmail" /></a></p></div>]]></content:encoded>
			<wfw:commentRss>http://yohan.jasdid.com/2011/08/meep-fuente-continua-y-punta-simulacion/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>I Need a Doctor</title>
		<link>http://yohan.jasdid.com/2011/08/i-need-a-doctor/</link>
		<comments>http://yohan.jasdid.com/2011/08/i-need-a-doctor/#comments</comments>
		<pubDate>Thu, 25 Aug 2011 07:28:10 +0000</pubDate>
		<dc:creator>yohan.jasdid</dc:creator>
				<category><![CDATA[Fun & Entertainment]]></category>

		<guid isPermaLink="false">http://yohan.jasdid.com/?p=1643</guid>
		<description><![CDATA[http://www.youtube.com/watch?v=VA770wpLX-Q]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.youtube.com/watch?v=VA770wpLX-Q">http://www.youtube.com/watch?v=VA770wpLX-Q</a></p>
<div class="tweetthis" style="text-align:left;"><p> <a target="_blank" rel="nofollow" class="tt" href="http://twitter.com/intent/tweet?text=I+Need+a+Doctor+http%3A%2F%2Fis.gd%2FbhgaLJ" title="Post to Twitter"><img class="nothumb" src="http://yohan.jasdid.com/wp-content/plugins/tweet-this/icons/en/twitter/tt-twitter-micro3.png" alt="Post to Twitter" /></a> <a target="_blank" rel="nofollow" class="tt" href="http://delicious.com/post?url=http://yohan.jasdid.com/2011/08/i-need-a-doctor/&amp;title=I+Need+a+Doctor" title="Post to Delicious"><img class="nothumb" src="http://yohan.jasdid.com/wp-content/plugins/tweet-this/icons/en/delicious/tt-delicious-micro3.png" alt="Post to Delicious" /></a> <a target="_blank" rel="nofollow" class="tt" href="http://www.facebook.com/share.php?u=http://yohan.jasdid.com/2011/08/i-need-a-doctor/&amp;t=I+Need+a+Doctor" title="Post to Facebook"><img class="nothumb" src="http://yohan.jasdid.com/wp-content/plugins/tweet-this/icons/en/facebook/tt-facebook-micro3.png" alt="Post to Facebook" /></a> <a target="_blank" rel="nofollow" class="tt" href="https://mail.google.com/mail/?ui=2&amp;view=cm&amp;fs=1&amp;tf=1&amp;su=I+Need+a+Doctor&amp;body=Link:+http://yohan.jasdid.com/2011/08/i-need-a-doctor/%0D%0A%0D%0A----%0D%0A+httpv%3A%2F%2Fyoutu.be%2FVA770wpLX-Q" title="Send Gmail"><img class="nothumb" src="http://yohan.jasdid.com/wp-content/plugins/tweet-this/icons/en/gmail/tt-gmail-micro3.png" alt="Send Gmail" /></a></p></div>]]></content:encoded>
			<wfw:commentRss>http://yohan.jasdid.com/2011/08/i-need-a-doctor/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Prefieres Coronar</title>
		<link>http://yohan.jasdid.com/2011/08/prefieres-coronar/</link>
		<comments>http://yohan.jasdid.com/2011/08/prefieres-coronar/#comments</comments>
		<pubDate>Thu, 25 Aug 2011 06:57:01 +0000</pubDate>
		<dc:creator>yohan.jasdid</dc:creator>
				<category><![CDATA[Chess]]></category>

		<guid isPermaLink="false">http://yohan.jasdid.com/?p=1637</guid>
		<description><![CDATA[A esta partida de 15 min. le llame, &#8220;Prefieres Coronar&#8221; [Event "Partida evaluada, 15m + 5s"] [Event "Partida evaluada, 15m + 8s"] [Site "Sala principal"] [Date "2011.08.24"] [Round "?"] [White "Rabbit2001"] [Black "Yohan"] [Result "0-1"] [ECO "C47"] [WhiteElo "1561"] [BlackElo "1501"] [Annotator "YR"] [PlyCount "80"] [EventDate "2011.08.24"] [TimeControl "900+8"] 1. e4 e5 2. Nf3 d6 [...]]]></description>
			<content:encoded><![CDATA[<p>A esta partida de 15 min. le llame, &#8220;Prefieres Coronar&#8221; <img src='http://yohan.jasdid.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<div class="CBB-board" style="display: none;">[Event "Partida evaluada, 15m + 5s"]<br />
[Event "Partida evaluada, 15m + 8s"]<br />
[Site "Sala principal"]<br />
[Date "2011.08.24"]<br />
[Round "?"]<br />
[White "Rabbit2001"]<br />
[Black "Yohan"]<br />
[Result "0-1"]<br />
[ECO "C47"]<br />
[WhiteElo "1561"]<br />
[BlackElo "1501"]<br />
[Annotator "YR"]<br />
[PlyCount "80"]<br />
[EventDate "2011.08.24"]<br />
[TimeControl "900+8"]</p>
<p>1. e4 e5<br />
2. Nf3 d6<br />
3. d4 exd4<br />
4. Nxd4 Nf6<br />
5. Nc3 Nc6<br />
6. Bg5 h6<br />
7. Bh4 Be7<br />
8. Bb5 Bd7<br />
9. O-O O-O<br />
10. Bxc6 bxc6<br />
11. Qf3 Rb8<br />
12. Rab1 a6<br />
13. a4 c5<br />
14. Nde2 Bc6<br />
15. Bxf6 Bxf6<br />
16. b3 Qd7<br />
17. Nd5 Be5<br />
18. Nef4 Rbe8<br />
19. Qd3 Bxd5<br />
20. Nxd5 f5<br />
21. f3 c6<br />
22. Nb6 Qe6<br />
23. exf5 Qxf5<br />
24. Qxa6 Qxc2<br />
25. Nd7 Bd4+<br />
26. Kh1 Rf7<br />
27. Qxc6 Qf5<br />
28. Nf6+ Rxf6<br />
29. Qxe8+ Kh7<br />
30. Qe2 Rg6<br />
31. a5 Re6<br />
32. Qc4 d5<br />
33. Qb5 Qc2<br />
34. a6 Rg6<br />
35. g3 Bf2<br />
36. a7 Bxg3<br />
37. hxg3 Rxg3<br />
38. Qd3+ Qxd3<br />
39. a8=Q Qe2<br />
40. Rg1 Rh3# 0-1
</p></div>
<div class="tweetthis" style="text-align:left;"><p> <a target="_blank" rel="nofollow" class="tt" href="http://twitter.com/intent/tweet?text=Prefieres+Coronar+http%3A%2F%2Fis.gd%2FwlJwkR" title="Post to Twitter"><img class="nothumb" src="http://yohan.jasdid.com/wp-content/plugins/tweet-this/icons/en/twitter/tt-twitter-micro3.png" alt="Post to Twitter" /></a> <a target="_blank" rel="nofollow" class="tt" href="http://delicious.com/post?url=http://yohan.jasdid.com/2011/08/prefieres-coronar/&amp;title=Prefieres+Coronar" title="Post to Delicious"><img class="nothumb" src="http://yohan.jasdid.com/wp-content/plugins/tweet-this/icons/en/delicious/tt-delicious-micro3.png" alt="Post to Delicious" /></a> <a target="_blank" rel="nofollow" class="tt" href="http://www.facebook.com/share.php?u=http://yohan.jasdid.com/2011/08/prefieres-coronar/&amp;t=Prefieres+Coronar" title="Post to Facebook"><img class="nothumb" src="http://yohan.jasdid.com/wp-content/plugins/tweet-this/icons/en/facebook/tt-facebook-micro3.png" alt="Post to Facebook" /></a> <a target="_blank" rel="nofollow" class="tt" href="https://mail.google.com/mail/?ui=2&amp;view=cm&amp;fs=1&amp;tf=1&amp;su=Prefieres+Coronar&amp;body=Link:+http://yohan.jasdid.com/2011/08/prefieres-coronar/%0D%0A%0D%0A----%0D%0A+A+esta+partida+de+15+min.+le+llame%2C+%22Prefieres+Coronar%22+%3A%29%0D%0A%0D%0A%5BEvent+%22Partida+evaluada%2C+15m+%2B+5s%22%5D%0D%0A%5BEvent+%22Partida+evaluada%2C+15m+%2B+8s%22%5D%0D%0A%5BSite+%22Sa..." title="Send Gmail"><img class="nothumb" src="http://yohan.jasdid.com/wp-content/plugins/tweet-this/icons/en/gmail/tt-gmail-micro3.png" alt="Send Gmail" /></a></p></div>]]></content:encoded>
			<wfw:commentRss>http://yohan.jasdid.com/2011/08/prefieres-coronar/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Meep: Geometrias – Punta</title>
		<link>http://yohan.jasdid.com/2011/08/meep-geometrias-%e2%80%93-punta/</link>
		<comments>http://yohan.jasdid.com/2011/08/meep-geometrias-%e2%80%93-punta/#comments</comments>
		<pubDate>Mon, 22 Aug 2011 07:17:35 +0000</pubDate>
		<dc:creator>yohan.jasdid</dc:creator>
				<category><![CDATA[Geometries]]></category>
		<category><![CDATA[Meep]]></category>
		<category><![CDATA[Ph.D.]]></category>
		<category><![CDATA[end]]></category>
		<category><![CDATA[punta]]></category>

		<guid isPermaLink="false">http://yohan.jasdid.com/?p=1612</guid>
		<description><![CDATA[A continuacion se muestra una geometria de &#8220;Punta&#8221; hecha con C++ y Meep Considere el siguiente diagrama: La simulacion sencilla que se quiere lograr es simplemente dibujar una figura geométrica de una Punta en un plano X, Y, dicho plano X, Y representara el área de la malla en la que se estará trabajando, imagine que se quiere dibujar una Punta en [...]]]></description>
			<content:encoded><![CDATA[<p>A continuacion se muestra una geometria de &#8220;Punta&#8221; hecha con C++ y <a href="http://ab-initio.mit.edu/wiki/index.php/Main_Page" target="_blank">Meep</a></p>
<p>Considere el siguiente diagrama:</p>
<p><a href="http://yohan.jasdid.com/wp-content/uploads/2011/08/puntavertical.jpg"><img class="aligncenter size-medium wp-image-1613" title="puntavertical" src="http://yohan.jasdid.com/wp-content/uploads/2011/08/puntavertical-450x414.jpg" alt="" width="450" height="414" /></a></p>
<p style="text-align: justify;">La simulacion sencilla que se quiere lograr es simplemente dibujar una figura geométrica de una Punta en un plano X, Y, dicho plano X, Y representara el área de la malla en la que se estará trabajando, imagine que se quiere dibujar una Punta en el centro del plano, para proceder con dicha geometría se siguen los pasos sugeridos en el <a href="http://yohan.jasdid.com/2011/08/estructura-de-un-programa-meep-con-c/" target="_blank">post anterior</a>.</p>
<p>Primero que nada se inicializa la función <a href="http://en.wikipedia.org/wiki/Message_Passing_Interface" target="_blank">MPI</a>, esto es necesario aunque no se tenga contemplado hacer cálculos en paralelo</p>
<pre class="brush: cpp; title: ; notranslate">
    meep::initialize mpi(argc, argv);   // Do this even for non-MPI Meep
</pre>
<p style="text-align: justify;">Después, se definen algunas variables de resolucion y se define que que se utilizara un <a href="http://ab-initio.mit.edu/wiki/index.php/Perfectly_matched_layers" target="_blank">PML</a> para el área de frontera de la malla, en esta simulación no es necesario hacer esto pero de todas formas se definirá ya que en la mayoría de las simulaciones se necesitara una condición de frontera que absorba las ondas electromagnéticas</p>
<pre class="brush: cpp; title: ; notranslate">
    double resolution = 20;             // pixels per distance
    const double pml_thickness = 1.0;
    const double x = 40 + pml_thickness;
    const double y = 20 + pml_thickness;
</pre>
<p style="text-align: justify;">Después, se crea el Volumen que contiene el tamaño de la malla y la resolución y se especifica que el origen de la malla sera exactamente en el centro, esto se tiene que definir de esta forma ya que en C++ el origen por default de la malla se encuentra ubicado en a partir de la parte positiva del plano, es decir, la coordenada 0,0 estará en la esquina izquierda inferior.</p>
<pre class="brush: cpp; title: ; notranslate">
	grid_volume grid_vol = vol2d(x, y, resolution);  // 40x20 2d cell
	grid_vol.center_origin();                        // set the origin as the center of cell
</pre>
<p style="text-align: justify;">Después, se define la estructura en donde se agrega una referencia al Volumen o malla que se ha creado, también se agrega una referencia con la función que define la geometría que se estará dibujando y por ultimo se le agrega el PML que se definió, esto con la finalidad de definir condiciones de frontera con un material de absorción perfecto aunque esto no es necesario en esta simulación se define por cuestiones ilustrativas ya que la mayoría de las simulaciones contendrán algun tipo de excitación en donde se requerirá contar con un material de absorción en los limites del volumen que nos de la ilusión de continuidad infinita en el campo electromagnético.</p>
<pre class="brush: cpp; title: ; notranslate">
	structure struct_punta(grid_vol, PuntaObject, pml(pml_thickness));  // structure punta
</pre>
<p style="text-align: justify;">Después, se define un Field que esta vinculado con la estructura y se agrega una instrucción de optimizacion, cabe mencionar que esta instrucción de optimizacion no esta dada por default en Meep C++ contrariamente a lo que ocurre con Scheme.</p>
<pre class="brush: cpp; title: ; notranslate">
	fields field_punta(&amp;struct_punta);
	field_punta.use_real_fields();     // this is for optimization purposes
</pre>
<p style="text-align: justify;">Por ultimo, se define el nombre del archivo en estandard <a href="http://en.wikipedia.org/wiki/Hierarchical_Data_Format" target="_blank">HDF5</a> a generar, es decir, el archivo en donde se escribiran todos los datos de la simulacion en el estandar H5, y se finaliza indicandole a Meep que escriba todos los datos de la simulacion en dicho archivo por medio del objeto Field.</p>
<pre class="brush: cpp; title: ; notranslate">
	h5file *h5_file = field_punta.open_h5file(&quot;punta&quot;, h5file::WRITE, &quot;&quot;, true);
	field_punta.output_hdf5(Dielectric, grid_vol.surroundings(), h5_file, false, false, &quot;&quot;);
</pre>
<p style="text-align: justify;">Una de las partes importantes de un programa Meep es la funcion en donde se definen las geometrias, en este caso la función se ve de la siguiente manera:</p>
<pre class="brush: cpp; title: ; notranslate">
double PuntaObject(const vec &amp;p)
{
    if ((p.x() &gt;= 0 &amp;&amp; p.x() &lt;= 4) &amp;&amp; (p.y() &gt;= -4 &amp;&amp; p.y() &lt;= 8))
    {
    	if (p.x() == 2 &amp;&amp; p.y() == 4)
    		return 0.0;

    	// define area for end point
    	if (p.y() &gt;= 4)
    	{
        	if (p.x() &lt;= (p.y()/2)-2)
        		return 0.0;

        	if (p.x() &gt;= (p.y()/2)-(p.y()-6))
        		return 0.0;
    	}

    	return 12.0;
    }
    return 0.0;
}
</pre>
<p style="text-align: justify;">La forma en que la función de la geometría trabaja es la siguiente: Meep hace un barrido internamente punto por punto en donde evalúa si dicho punto se encuentra en la ecuación que se define dentro de esta función, si el punto pertenece al rango de puntos dentro de la función Meep asignara un epsilon de material definido dentro de la condicional, de otra forma Meep asignara el epsilon de material que se le especifique al final de la función, con esta metodología se puede dibujar prácticamente cualquier cosa.</p>
<p>A continuación se enlista el código de la geometría completo:</p>
<pre class="brush: cpp; title: ; notranslate">
/*
 * _punta.cpp
 *
 * In order to run a simulation using the MEEP C++ interface, the following steps are necessary:
 * initialize mpi(argc, argv); // do this even for non-MPI Meep
 * create a meep::volume
 * create a meep::structure using that volume
 * create a meep::fields object
 * add some kind of excitation.
 * time step the code. Of course, you'll have to create measurements and output whatever data
 * you are interested in as well.
 *
 *  Created on: Jul 22, 2011
 *      Author: ubuntu
 */

#include
#include
using namespace meep;

double PuntaObject(const vec &amp;p)
{
    if ((p.x() &gt;= 0 &amp;&amp; p.x() &lt;= 4) &amp;&amp; (p.y() &gt;= -4 &amp;&amp; p.y() &lt;= 8))
    {
    	if (p.x() == 2 &amp;&amp; p.y() == 4)
    		return 0.0;

    	// define area for end point
    	if (p.y() &gt;= 4)
    	{
        	if (p.x() &lt;= (p.y()/2)-2)
        		return 0.0;

        	if (p.x() &gt;= (p.y()/2)-(p.y()-6))
        		return 0.0;
    	}

    	return 12.0;
    }
    return 0.0;
}

int main(int argc, char **argv)
{
    meep::initialize mpi(argc, argv);   // Do this even for non-MPI Meep
    double resolution = 20;             // pixels per distance
    const double pml_thickness = 1.0;
    const double x = 40 + pml_thickness;
    const double y = 20 + pml_thickness;

	grid_volume grid_vol = vol2d(x, y, resolution);  // 40x20 2d cell
	grid_vol.center_origin();                        // set the origin as the center of cell

	structure struct_punta(grid_vol, PuntaObject, pml(pml_thickness));  // structure punta
	fields field_punta(&amp;struct_punta);
	field_punta.use_real_fields();     // this is for optimization purposes

	h5file *h5_file = field_punta.open_h5file(&quot;punta&quot;, h5file::WRITE, &quot;&quot;, true);
	field_punta.output_hdf5(Dielectric, grid_vol.surroundings(), h5_file, false, false, &quot;&quot;);
	return 0;
}
</pre>
<p style="text-align: justify;">Para ejecutar la simulación anterior es necesario crear un shell script en donde se especifican algunos paquetes que ayudaran en la conversión de datos en formato HDF5 a formato de imagen asi como tambien hara todo el compilado del codigo anterior para obtener los resultados deseados, para el caso del bloque y suponiendo que nuestro programa se llama _bloque.cpp se crea el siguiente archivo bash:</p>
<pre class="brush: bash; title: ; notranslate">
make _punta.dac
./_punta.dac

h5ls punta-000000.00.h5
h5topng -Zc dkbluered punta-000000.00.h5

rm punta-000000.00.h5
rm _punta.dac
</pre>
<p style="text-align: justify;">El shell script anterior compila el programa C++ mediante la instrucción make y crea un archivo de ejecución con extensión &#8221;.dac&#8221; la cual se ejecuta en la siguiente instrucción, a continuación se utiliza un comando propio de el paquete h5utils desarrollado también por el MIT, el comando h5ls enlista el tamaño del dataset creado que vive en el archivo con extensión H5 y en formato HDF5 este enlistado es solamente con fines informativos, a continuación se ejecuta el comando h5topng el cual como describe su nombre hace una conversión de los datos en formato HDF5 a una imagen en formato PNG, y se finaliza removiendo archivos que ya no serán utilizados al final de la simulación ya que lo que nos interesa por ahora es la imagen.</p>
<p style="text-align: justify;">Para concluir con la ejecución del programa Meep creado, se debe ejecutar el shell script que hara todo el trabajo de escribir todos esos comandos por nosotros con la siguiente instrucción, suponiendo que nuestro script se llame _punta.sh.</p>
<pre class="brush: bash; title: ; notranslate">
chmod +x _punta.sh
sh _punta.sh
</pre>
<p>Listo!, la simulacion nos arrojara el diagrama esperado que se anexa a continuacion:</p>
<p><a href="http://yohan.jasdid.com/wp-content/uploads/2011/08/punta-000000.00.png"><img class="aligncenter size-medium wp-image-1615" title="punta-000000.00" src="http://yohan.jasdid.com/wp-content/uploads/2011/08/punta-000000.00-450x230.png" alt="" width="450" height="230" /></a></p>
<p>Enjoy!</p>
<div class="tweetthis" style="text-align:left;"><p> <a target="_blank" rel="nofollow" class="tt" href="http://twitter.com/intent/tweet?text=Meep%3A+Geometrias+%E2%80%93+Punta+http%3A%2F%2Fis.gd%2FiRQ0JO" title="Post to Twitter"><img class="nothumb" src="http://yohan.jasdid.com/wp-content/plugins/tweet-this/icons/en/twitter/tt-twitter-micro3.png" alt="Post to Twitter" /></a> <a target="_blank" rel="nofollow" class="tt" href="http://delicious.com/post?url=http://yohan.jasdid.com/2011/08/meep-geometrias-%e2%80%93-punta/&amp;title=Meep%3A+Geometrias+%E2%80%93+Punta" title="Post to Delicious"><img class="nothumb" src="http://yohan.jasdid.com/wp-content/plugins/tweet-this/icons/en/delicious/tt-delicious-micro3.png" alt="Post to Delicious" /></a> <a target="_blank" rel="nofollow" class="tt" href="http://www.facebook.com/share.php?u=http://yohan.jasdid.com/2011/08/meep-geometrias-%e2%80%93-punta/&amp;t=Meep%3A+Geometrias+%E2%80%93+Punta" title="Post to Facebook"><img class="nothumb" src="http://yohan.jasdid.com/wp-content/plugins/tweet-this/icons/en/facebook/tt-facebook-micro3.png" alt="Post to Facebook" /></a> <a target="_blank" rel="nofollow" class="tt" href="https://mail.google.com/mail/?ui=2&amp;view=cm&amp;fs=1&amp;tf=1&amp;su=Meep%3A+Geometrias+%E2%80%93+Punta&amp;body=Link:+http://yohan.jasdid.com/2011/08/meep-geometrias-%e2%80%93-punta/%0D%0A%0D%0A----%0D%0A+A+continuacion+se+muestra+una+geometria+de+%22Punta%22+hecha+con+C%2B%2B+y%C2%A0Meep%0D%0A%0D%0AConsidere+el+siguiente+diagrama%3A%0D%0A%0D%0A%0D%0ALa+simulacion+sencilla+que+se+quie..." title="Send Gmail"><img class="nothumb" src="http://yohan.jasdid.com/wp-content/plugins/tweet-this/icons/en/gmail/tt-gmail-micro3.png" alt="Send Gmail" /></a></p></div>]]></content:encoded>
			<wfw:commentRss>http://yohan.jasdid.com/2011/08/meep-geometrias-%e2%80%93-punta/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Meep: Geometrias – Corte</title>
		<link>http://yohan.jasdid.com/2011/08/meep-geometrias-%e2%80%93-corte/</link>
		<comments>http://yohan.jasdid.com/2011/08/meep-geometrias-%e2%80%93-corte/#comments</comments>
		<pubDate>Mon, 22 Aug 2011 03:00:38 +0000</pubDate>
		<dc:creator>yohan.jasdid</dc:creator>
				<category><![CDATA[Geometries]]></category>
		<category><![CDATA[Meep]]></category>
		<category><![CDATA[Ph.D.]]></category>

		<guid isPermaLink="false">http://yohan.jasdid.com/?p=1603</guid>
		<description><![CDATA[A continuacion se muestra una geometria &#8220;Cortada&#8221; hecha con C++ y Meep Considere el siguiente diagrama: La simulacion sencilla que se quiere lograr es simplemente dibujar una figura geométrica de un rectángulo y cortarlo en un plano X, Y, dicho plano X, Y representara el área de la malla en la que se estará trabajando, imagine que se quiere dibujar un rectángulo con un corte en [...]]]></description>
			<content:encoded><![CDATA[<p>A continuacion se muestra una geometria &#8220;Cortada&#8221; hecha con C++ y <a href="http://ab-initio.mit.edu/wiki/index.php/Main_Page" target="_blank">Meep</a></p>
<p>Considere el siguiente diagrama:</p>
<p><a href="http://yohan.jasdid.com/wp-content/uploads/2011/08/punta.jpg"><img class="aligncenter size-medium wp-image-1604" title="punta" src="http://yohan.jasdid.com/wp-content/uploads/2011/08/punta-450x377.jpg" alt="" width="450" height="377" /></a></p>
<p style="text-align: justify;">La simulacion sencilla que se quiere lograr es simplemente dibujar una figura geométrica de un rectángulo y cortarlo en un plano X, Y, dicho plano X, Y representara el área de la malla en la que se estará trabajando, imagine que se quiere dibujar un rectángulo con un corte en el centro del plano, para proceder con dicha geometría se siguen los pasos sugeridos en el <a href="http://yohan.jasdid.com/2011/08/estructura-de-un-programa-meep-con-c/" target="_blank">post anterior</a>.</p>
<p style="text-align: justify;">Primero que nada se inicializa la función <a href="http://en.wikipedia.org/wiki/Message_Passing_Interface" target="_blank">MPI</a>, esto es necesario aunque no se tenga contemplado hacer cálculos en paralelo</p>
<pre class="brush: cpp; title: ; notranslate">
    meep::initialize mpi(argc, argv);   // Do this even for non-MPI Meep
</pre>
<p style="text-align: justify;">Después, se definen algunas variables de resolucion y se define que que se utilizara un <a href="http://ab-initio.mit.edu/wiki/index.php/Perfectly_matched_layers" target="_blank">PML</a> para el área de frontera de la malla, en esta simulación no es necesario hacer esto pero de todas formas se definirá ya que en la mayoría de las simulaciones se necesitara una condición de frontera que absorba las ondas electromagnéticas</p>
<pre class="brush: cpp; title: ; notranslate">
    double resolution = 20;             // pixels per distance
    const double pml_thickness = 1.0;
    const double x = 40 + pml_thickness;
    const double y = 20 + pml_thickness;
</pre>
<p style="text-align: justify;">Después, se crea el Volumen que contiene el tamaño de la malla y la resolución y se especifica que el origen de la malla sera exactamente en el centro, esto se tiene que definir de esta forma ya que en C++ el origen por default de la malla se encuentra ubicado en a partir de la parte positiva del plano, es decir, la coordenada 0,0 estará en la esquina izquierda inferior.</p>
<pre class="brush: cpp; title: ; notranslate">
	grid_volume grid_vol = vol2d(x, y, resolution);  // 40x20 2d cell
	grid_vol.center_origin();                        // set the origin as the center of cell
</pre>
<p style="text-align: justify;">Después, se define la estructura en donde se agrega una referencia al Volumen o malla que se ha creado, también se agrega una referencia con la función que define la geometría que se estará dibujando y por ultimo se le agrega el PML que se definió, esto con la finalidad de definir condiciones de frontera con un material de absorción perfecto aunque esto no es necesario en esta simulación se define por cuestiones ilustrativas ya que la mayoría de las simulaciones contendrán algun tipo de excitación en donde se requerirá contar con un material de absorción en los limites del volumen que nos de la ilusión de continuidad infinita en el campo electromagnético.</p>
<pre class="brush: cpp; title: ; notranslate">
	structure struct_fiberend(grid_vol, FiberObject, pml(pml_thickness));  // structure fiber
</pre>
<p style="text-align: justify;">Después, se define un Field que esta vinculado con la estructura y se agrega una instrucción de optimizacion, cabe mencionar que esta instrucción de optimizacion no esta dada por default en Meep C++ contrariamente a lo que ocurre con Scheme.</p>
<pre class="brush: cpp; title: ; notranslate">
	fields field_fiberend(&amp;struct_fiberend);
	field_fiberend.use_real_fields();     // this is for optimization purposes
</pre>
<p style="text-align: justify;">Por ultimo, se define el nombre del archivo en estandard <a href="http://en.wikipedia.org/wiki/Hierarchical_Data_Format" target="_blank">HDF5</a> a generar, es decir, el archivo en donde se escribiran todos los datos de la simulacion en el estandar H5, y se finaliza indicandole a Meep que escriba todos los datos de la simulacion en dicho archivo por medio del objeto Field.</p>
<pre class="brush: cpp; title: ; notranslate">
	h5file *h5_file = field_fiberend.open_h5file(&quot;fiberend&quot;, h5file::WRITE, &quot;&quot;, true);
	field_fiberend.output_hdf5(Dielectric, grid_vol.surroundings(), h5_file, false, false, &quot;&quot;);
</pre>
<p style="text-align: justify;">Una de las partes importantes de un programa Meep es la funcion en donde se definen las geometrias, en este caso la función se ve de la siguiente manera:</p>
<pre class="brush: cpp; title: ; notranslate">
double FiberObject(const vec &amp;p)
{
    if ((p.x() &gt;= -10 &amp;&amp; p.x() &lt;= 10) &amp;&amp; (p.y() &gt;= 0 &amp;&amp; p.y() &lt;= 5))
    {
    	if (p.x() &gt;= 5 &amp;&amp; p.y() &lt;= p.x()-5)
    		return 0.0;
    	else
    		return 12.0;
    }
    return 0.0;
}
</pre>
<p style="text-align: justify;">La forma en que la función de la geometría trabaja es la siguiente: Meep hace un barrido internamente punto por punto en donde evalúa si dicho punto se encuentra en la ecuación que se define dentro de esta función, si el punto pertenece al rango de puntos dentro de la función Meep asignara un epsilon de material definido dentro de la condicional, de otra forma Meep asignara el epsilon de material que se le especifique al final de la función, con esta metodología se puede dibujar prácticamente cualquier cosa.</p>
<p style="text-align: justify;">A continuación se enlista el código de la geometría completo:</p>
<pre class="brush: cpp; title: ; notranslate">
/*
 * _fiberend.cpp
 *
 * In order to run a simulation using the MEEP C++ interface, the following steps are necessary:
 * initialize mpi(argc, argv); // do this even for non-MPI Meep
 * create a meep::volume
 * create a meep::structure using that volume
 * create a meep::fields object
 * add some kind of excitation.
 * time step the code. Of course, you'll have to create measurements and output whatever data
 * you are interested in as well.
 *
 *  Created on: Jul 22, 2011
 *      Author: ubuntu
 */

#include
#include
using namespace meep;

double FiberObject(const vec &amp;p)
{
    if ((p.x() &gt;= -10 &amp;&amp; p.x() &lt;= 10) &amp;&amp; (p.y() &gt;= 0 &amp;&amp; p.y() &lt;= 5))
    {
    	if (p.x() &gt;= 5 &amp;&amp; p.y() &lt;= p.x()-5)
    		return 0.0;
    	else
    		return 12.0;
    }
    return 0.0;
}

int main(int argc, char **argv)
{
    meep::initialize mpi(argc, argv);   // Do this even for non-MPI Meep
    double resolution = 20;             // pixels per distance
    const double pml_thickness = 1.0;
    const double x = 40 + pml_thickness;
    const double y = 20 + pml_thickness;

	grid_volume grid_vol = vol2d(x, y, resolution);  // 40x20 2d cell
	grid_vol.center_origin();                        // set the origin as the center of cell

	structure struct_fiberend(grid_vol, FiberObject, pml(pml_thickness));  // structure fiber
	fields field_fiberend(&amp;struct_fiberend);
	field_fiberend.use_real_fields();     // this is for optimization purposes

	h5file *h5_file = field_fiberend.open_h5file(&quot;fiberend&quot;, h5file::WRITE, &quot;&quot;, true);
	field_fiberend.output_hdf5(Dielectric, grid_vol.surroundings(), h5_file, false, false, &quot;&quot;);
	return 0;
}
</pre>
<p style="text-align: justify;">Para ejecutar la simulación anterior es necesario crear un shell script en donde se especifican algunos paquetes que ayudaran en la conversión de datos en formato HDF5 a formato de imagen asi como tambien hara todo el compilado del codigo anterior para obtener los resultados deseados, para el caso del bloque y suponiendo que nuestro programa se llama _bloque.cpp se crea el siguiente archivo bash:</p>
<pre class="brush: bash; title: ; notranslate">
make _fiberend.dac
./_fiberend.dac

h5ls fiberend-000000.00.h5
h5topng -Zc dkbluered fiberend-000000.00.h5

rm fiberend-000000.00.h5
rm _fiberend.dac
</pre>
<p style="text-align: justify;">El shell script anterior compila el programa C++ mediante la instrucción make y crea un archivo de ejecución con extensión &#8221;.dac&#8221; la cual se ejecuta en la siguiente instrucción, a continuación se utiliza un comando propio de el paquete h5utils desarrollado también por el MIT, el comando h5ls enlista el tamaño del dataset creado que vive en el archivo con extensión H5 y en formato HDF5 este enlistado es solamente con fines informativos, a continuación se ejecuta el comando h5topng el cual como describe su nombre hace una conversión de los datos en formato HDF5 a una imagen en formato PNG, y se finaliza removiendo archivos que ya no serán utilizados al final de la simulación ya que lo que nos interesa por ahora es la imagen.</p>
<p style="text-align: justify;">Para concluir con la ejecución del programa Meep creado, se debe ejecutar el shell script que hara todo el trabajo de escribir todos esos comandos por nosotros con la siguiente instrucción, suponiendo que nuestro script se llame _fiberend.sh.</p>
<pre class="brush: bash; title: ; notranslate">
chmod +x _fiberend.sh
sh _fiberend.sh
</pre>
<p>Listo!, la simulacion nos arrojara el diagrama esperado que se anexa a continuacion:</p>
<p><a href="http://yohan.jasdid.com/wp-content/uploads/2011/08/fiberend-000000.00.png"><img class="aligncenter size-medium wp-image-1606" title="fiberend-000000.00" src="http://yohan.jasdid.com/wp-content/uploads/2011/08/fiberend-000000.00-450x230.png" alt="" width="450" height="230" /></a></p>
<p>Agregando unos poco cambios en la función de la geometría se puede obtener un triangulo facilmente:</p>
<pre class="brush: cpp; title: ; notranslate">
double FiberObject(const vec &amp;p)
{
    if ((p.x() &gt;= -10 &amp;&amp; p.x() &lt;= 10) &amp;&amp; (p.y() &gt;= 0 &amp;&amp; p.y() &lt;= 5))
    {
    	if (p.x() &gt;= 5 &amp;&amp; p.y() &lt;= p.x()-5)
    		return 12.0;
    	else
    		return 0.0;
    }
    return 0.0;
}
</pre>
<p>Y el resultado se vería de la siguiente manera:</p>
<p><a href="http://yohan.jasdid.com/wp-content/uploads/2011/08/fiberend-000000.001.png"><img class="aligncenter size-medium wp-image-1607" title="fiberend-000000.00" src="http://yohan.jasdid.com/wp-content/uploads/2011/08/fiberend-000000.001-450x230.png" alt="" width="450" height="230" /></a></p>
<p>Enjoy!</p>
<div class="tweetthis" style="text-align:left;"><p> <a target="_blank" rel="nofollow" class="tt" href="http://twitter.com/intent/tweet?text=Meep%3A+Geometrias+%E2%80%93+Corte+http%3A%2F%2Fis.gd%2F8n892L" title="Post to Twitter"><img class="nothumb" src="http://yohan.jasdid.com/wp-content/plugins/tweet-this/icons/en/twitter/tt-twitter-micro3.png" alt="Post to Twitter" /></a> <a target="_blank" rel="nofollow" class="tt" href="http://delicious.com/post?url=http://yohan.jasdid.com/2011/08/meep-geometrias-%e2%80%93-corte/&amp;title=Meep%3A+Geometrias+%E2%80%93+Corte" title="Post to Delicious"><img class="nothumb" src="http://yohan.jasdid.com/wp-content/plugins/tweet-this/icons/en/delicious/tt-delicious-micro3.png" alt="Post to Delicious" /></a> <a target="_blank" rel="nofollow" class="tt" href="http://www.facebook.com/share.php?u=http://yohan.jasdid.com/2011/08/meep-geometrias-%e2%80%93-corte/&amp;t=Meep%3A+Geometrias+%E2%80%93+Corte" title="Post to Facebook"><img class="nothumb" src="http://yohan.jasdid.com/wp-content/plugins/tweet-this/icons/en/facebook/tt-facebook-micro3.png" alt="Post to Facebook" /></a> <a target="_blank" rel="nofollow" class="tt" href="https://mail.google.com/mail/?ui=2&amp;view=cm&amp;fs=1&amp;tf=1&amp;su=Meep%3A+Geometrias+%E2%80%93+Corte&amp;body=Link:+http://yohan.jasdid.com/2011/08/meep-geometrias-%e2%80%93-corte/%0D%0A%0D%0A----%0D%0A+A+continuacion+se+muestra+una+geometria+%22Cortada%22+hecha+con+C%2B%2B+y%C2%A0Meep%0D%0A%0D%0AConsidere+el+siguiente+diagrama%3A%0D%0A%0D%0A%0D%0ALa+simulacion+sencilla+que+se+quier..." title="Send Gmail"><img class="nothumb" src="http://yohan.jasdid.com/wp-content/plugins/tweet-this/icons/en/gmail/tt-gmail-micro3.png" alt="Send Gmail" /></a></p></div>]]></content:encoded>
			<wfw:commentRss>http://yohan.jasdid.com/2011/08/meep-geometrias-%e2%80%93-corte/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Meep: Geometrias – Cilindro</title>
		<link>http://yohan.jasdid.com/2011/08/meep-geometrias-%e2%80%93-cilindro/</link>
		<comments>http://yohan.jasdid.com/2011/08/meep-geometrias-%e2%80%93-cilindro/#comments</comments>
		<pubDate>Mon, 22 Aug 2011 00:55:26 +0000</pubDate>
		<dc:creator>yohan.jasdid</dc:creator>
				<category><![CDATA[Geometries]]></category>
		<category><![CDATA[Meep]]></category>
		<category><![CDATA[Ph.D.]]></category>

		<guid isPermaLink="false">http://yohan.jasdid.com/?p=1592</guid>
		<description><![CDATA[A continuacion se muestra la geometria &#8220;Cilindro&#8221; hecha con C++ y Meep, para ver informacion sobre esta geometría pero utilizando el lenguaje funcional Scheme favor de visitar el siguiente enlace: http://jesusmanzanares.org/manual-del-meep/geometrias/cilindro/ Considere el siguiente diagrama: La simulacion sencilla que se quiere lograr es simplemente dibujar una figura geométrica de un cilindro en un plano X, Y, dicho plano X, Y representara [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">A continuacion se muestra la geometria &#8220;Cilindro&#8221; hecha con C++ y <a href="http://ab-initio.mit.edu/wiki/index.php/Main_Page" target="_blank">Meep</a>, para ver informacion sobre esta geometría pero utilizando el lenguaje funcional Scheme favor de visitar el siguiente enlace: <a href="http://jesusmanzanares.org/manual-del-meep/geometrias/cilindro/" target="_blank">http://jesusmanzanares.org/manual-del-meep/geometrias/cilindro/</a></p>
<p style="text-align: justify;">Considere el siguiente diagrama:</p>
<p><a href="http://yohan.jasdid.com/wp-content/uploads/2011/08/cilindro.jpg"><img class="aligncenter size-medium wp-image-1594" title="cilindro" src="http://yohan.jasdid.com/wp-content/uploads/2011/08/cilindro-450x358.jpg" alt="" width="450" height="358" /></a></p>
<p style="text-align: justify;">La simulacion sencilla que se quiere lograr es simplemente dibujar una figura geométrica de un cilindro en un plano X, Y, dicho plano X, Y representara el área de la malla en la que se estará trabajando, imagine que se quiere dibujar un cilindro en el centro del plano, para proceder con dicha geometría se siguen los pasos sugeridos en el <a href="http://yohan.jasdid.com/2011/08/estructura-de-un-programa-meep-con-c/" target="_blank">post anterior</a>.</p>
<p>Primero que nada se inicializa la función <a href="http://en.wikipedia.org/wiki/Message_Passing_Interface" target="_blank">MPI</a>, esto es necesario aunque no se tenga contemplado hacer cálculos en paralelo</p>
<pre class="brush: cpp; title: ; notranslate">
    meep::initialize mpi(argc, argv);   // Do this even for non-MPI Meep
</pre>
<p style="text-align: justify;">Después, se definen algunas variables de resolucion y se define que que se utilizara un <a href="http://ab-initio.mit.edu/wiki/index.php/Perfectly_matched_layers" target="_blank">PML</a> para el área de frontera de la malla, en esta simulación no es necesario hacer esto pero de todas formas se definirá ya que en la mayoría de las simulaciones se necesitara una condición de frontera que absorba las ondas electromagnéticas</p>
<pre class="brush: cpp; title: ; notranslate">
    double resolution = 20;             // pixels per distance
    const double pml_thickness = 1.0;
    const double x = 20 + pml_thickness;
    const double y = 20 + pml_thickness;
</pre>
<p style="text-align: justify;">Después, se crea el Volumen que contiene el tamaño de la malla y la resolución y se especifica que el origen de la malla sera exactamente en el centro, esto se tiene que definir de esta forma ya que en C++ el origen por default de la malla se encuentra ubicado en a partir de la parte positiva del plano, es decir, la coordenada 0,0 estará en la esquina izquierda inferior.</p>
<pre class="brush: cpp; title: ; notranslate">
	grid_volume grid_vol = vol2d(x, y, resolution);  // 20x20 2d cell
	grid_vol.center_origin();                        // set the origin as the center of cell
</pre>
<p style="text-align: justify;">Después, se define la estructura en donde se agrega una referencia al Volumen o malla que se ha creado, también se agrega una referencia con la función que define la geometría que se estará dibujando y por ultimo se le agrega el PML que se definió, esto con la finalidad de definir condiciones de frontera con un material de absorción perfecto aunque esto no es necesario en esta simulación se define por cuestiones ilustrativas ya que la mayoría de las simulaciones contendrán algun tipo de excitación en donde se requerirá contar con un material de absorción en los limites del volumen que nos de la ilusión de continuidad infinita en el campo electromagnético.</p>
<pre class="brush: cpp; title: ; notranslate">
	structure struct_cylinder(grid_vol, Cylinder, pml(pml_thickness));  // structure cylinder
</pre>
<p style="text-align: justify;">Después, se define un Field que esta vinculado con la estructura y se agrega una instrucción de optimizacion, cabe mencionar que esta instrucción de optimizacion no esta dada por default en Meep C++ contrariamente a lo que ocurre con Scheme.</p>
<pre class="brush: cpp; title: ; notranslate">
	fields field_cylinder(&amp;struct_cylinder);
	field_cylinder.use_real_fields();     // this is for optimization purposes
</pre>
<p style="text-align: justify;">Por ultimo, se define el nombre del archivo en estandard <a href="http://en.wikipedia.org/wiki/Hierarchical_Data_Format" target="_blank">HDF5</a> a generar, es decir, el archivo en donde se escribiran todos los datos de la simulacion en el estandar H5, y se finaliza indicandole a Meep que escriba todos los datos de la simulacion en dicho archivo por medio del objeto Field.</p>
<pre class="brush: cpp; title: ; notranslate">
	h5file *h5_file = field_cylinder.open_h5file(&quot;cylinder&quot;, h5file::WRITE, &quot;&quot;, true);
	field_cylinder.output_hdf5(Dielectric, grid_vol.surroundings(), h5_file, false, false, &quot;&quot;);
</pre>
<p style="text-align: justify;">Una de las partes importantes de un programa Meep es la funcion en donde se definen las geometrias, en este caso la función se ve de la siguiente manera:</p>
<pre class="brush: cpp; title: ; notranslate">
double Cylinder(const vec &amp;p)
{
	double width = 4.0;
	double x2 = p.x() * p.x();
	double y2 = p.y() * p.y();
	double r = sqrt(x2 + y2);

	if (r &lt;= width)
		return 12.0;

	return 1.0;
}
</pre>
<p style="text-align: justify;">La forma en que la función de la geometría trabaja es la siguiente: Meep hace un barrido internamente punto por punto en donde evalúa si dicho punto se encuentra en la ecuación que se define dentro de esta función, si el punto pertenece al rango de puntos dentro de la función Meep asignara un epsilon de material definido dentro de la condicional, de otra forma Meep asignara el epsilon de material que se le especifique al final de la función, con esta metodología se puede dibujar prácticamente cualquier cosa.</p>
<p style="text-align: justify;">A continuación se enlista el código de la geometría completo:</p>
<pre class="brush: cpp; title: ; notranslate">
/*
 * _cylinder.cpp
 *
 * In order to run a simulation using the MEEP C++ interface, the following steps are necessary:
 * initialize mpi(argc, argv); // do this even for non-MPI Meep
 * create a meep::volume
 * create a meep::structure using that volume
 * create a meep::fields object
 * add some kind of excitation.
 * time step the code. Of course, you'll have to create measurements and output whatever data
 * you are interested in as well.
 *
 *  Created on: Jul 22, 2011
 *      Author: yohan
 */

#include &lt;meep.hpp&gt;
#include &lt;iostream&gt;
using namespace meep;

double Cylinder(const vec &amp;p)
{
	double width = 4.0;

	double x2 = p.x() * p.x();
	double y2 = p.y() * p.y();
	double r = sqrt(x2 + y2);

	if (r &lt;= width)
		return 12.0;

	return 1.0;
}

int main(int argc, char **argv)
{
    meep::initialize mpi(argc, argv);   // Do this even for non-MPI Meep
    double resolution = 20;             // pixels per distance
    const double pml_thickness = 1.0;
    const double x = 20 + pml_thickness;
    const double y = 20 + pml_thickness;

	grid_volume grid_vol = vol2d(x, y, resolution);  // 20x20 2d cell
	grid_vol.center_origin();                        // set the origin as the center of cell

	structure struct_cylinder(grid_vol, Cylinder, pml(pml_thickness));  // structure cylinder
	fields field_cylinder(&amp;struct_cylinder);
	field_cylinder.use_real_fields();     // this is for optimization purposes

	h5file *h5_file = field_cylinder.open_h5file(&quot;cylinder&quot;, h5file::WRITE, &quot;&quot;, true);
	field_cylinder.output_hdf5(Dielectric, grid_vol.surroundings(), h5_file, false, false, &quot;&quot;);
	return 0;
}
</pre>
<p style="text-align: justify;">Para ejecutar la simulación anterior es necesario crear un shell script en donde se especifican algunos paquetes que ayudaran en la conversión de datos en formato HDF5 a formato de imagen asi como tambien hara todo el compilado del codigo anterior para obtener los resultados deseados, para el caso del bloque y suponiendo que nuestro programa se llama _bloque.cpp se crea el siguiente archivo bash:</p>
<pre class="brush: bash; title: ; notranslate">
make _cylinder.dac
./_cylinder.dac

h5ls cylinder-000000.00.h5
h5topng -Zc dkbluered cylinder-000000.00.h5

rm cylinder-000000.00.h5
rm _cylinder.dac
</pre>
<p style="text-align: justify;">El shell script anterior compila el programa C++ mediante la instrucción make y crea un archivo de ejecución con extensión &#8221;.dac&#8221; la cual se ejecuta en la siguiente instrucción, a continuación se utiliza un comando propio de el paquete h5utils desarrollado también por el MIT, el comando h5ls enlista el tamaño del dataset creado que vive en el archivo con extensión H5 y en formato HDF5 este enlistado es solamente con fines informativos, a continuación se ejecuta el comando h5topng el cual como describe su nombre hace una conversión de los datos en formato HDF5 a una imagen en formato PNG, y se finaliza removiendo archivos que ya no serán utilizados al final de la simulación ya que lo que nos interesa por ahora es la imagen.</p>
<p style="text-align: justify;">Para concluir con la ejecución del programa Meep creado, se debe ejecutar el shell script que hara todo el trabajo de escribir todos esos comandos por nosotros con la siguiente instrucción, suponiendo que nuestro script se llame _cylinder.sh.</p>
<pre class="brush: bash; title: ; notranslate">
chmod +x _cylinder.sh
sh _cylinder.sh
</pre>
<p>Listo!, la simulacion nos arrojara el diagrama esperado que se anexa a continuacion:</p>
<p><a href="http://yohan.jasdid.com/wp-content/uploads/2011/08/cylinder-000000.00.png"><img class="aligncenter size-full wp-image-1596" title="cylinder-000000.00" src="http://yohan.jasdid.com/wp-content/uploads/2011/08/cylinder-000000.00.png" alt="" width="420" height="420" /></a></p>
<p>Agregando unos poco cambios en la función de la geometría se puede obtener un anillo facilmente:</p>
<pre class="brush: cpp; title: ; notranslate">
double Cylinder(const vec &amp;p)
{
	double width = 2.0;
	double inner_radius = 3.0;
	double outer_radius = inner_radius + width;

	double x2 = p.x() * p.x();
	double y2 = p.y() * p.y();
	double r = sqrt(x2 + y2);
	if ((r &gt; inner_radius) &amp;&amp; (r &lt;= outer_radius))
		return 12;

	return 1.0;
}
</pre>
<p>Y el resultado se vería de la siguiente manera:</p>
<p><a href="http://yohan.jasdid.com/wp-content/uploads/2011/08/cylinder-000000.002.png"><img class="aligncenter size-full wp-image-1598" title="cylinder-000000.00" src="http://yohan.jasdid.com/wp-content/uploads/2011/08/cylinder-000000.002.png" alt="" width="420" height="420" /></a></p>
<p>Enjoy!</p>
<div class="tweetthis" style="text-align:left;"><p> <a target="_blank" rel="nofollow" class="tt" href="http://twitter.com/intent/tweet?text=Meep%3A+Geometrias+%E2%80%93+Cilindro+http%3A%2F%2Fis.gd%2FGi2ukj" title="Post to Twitter"><img class="nothumb" src="http://yohan.jasdid.com/wp-content/plugins/tweet-this/icons/en/twitter/tt-twitter-micro3.png" alt="Post to Twitter" /></a> <a target="_blank" rel="nofollow" class="tt" href="http://delicious.com/post?url=http://yohan.jasdid.com/2011/08/meep-geometrias-%e2%80%93-cilindro/&amp;title=Meep%3A+Geometrias+%E2%80%93+Cilindro" title="Post to Delicious"><img class="nothumb" src="http://yohan.jasdid.com/wp-content/plugins/tweet-this/icons/en/delicious/tt-delicious-micro3.png" alt="Post to Delicious" /></a> <a target="_blank" rel="nofollow" class="tt" href="http://www.facebook.com/share.php?u=http://yohan.jasdid.com/2011/08/meep-geometrias-%e2%80%93-cilindro/&amp;t=Meep%3A+Geometrias+%E2%80%93+Cilindro" title="Post to Facebook"><img class="nothumb" src="http://yohan.jasdid.com/wp-content/plugins/tweet-this/icons/en/facebook/tt-facebook-micro3.png" alt="Post to Facebook" /></a> <a target="_blank" rel="nofollow" class="tt" href="https://mail.google.com/mail/?ui=2&amp;view=cm&amp;fs=1&amp;tf=1&amp;su=Meep%3A+Geometrias+%E2%80%93+Cilindro&amp;body=Link:+http://yohan.jasdid.com/2011/08/meep-geometrias-%e2%80%93-cilindro/%0D%0A%0D%0A----%0D%0A+A+continuacion+se+muestra+la+geometria+%22Cilindro%22+hecha+con+C%2B%2B+y%C2%A0Meep%2C+para+ver+informacion+sobre+esta%C2%A0geometr%C3%ADa%C2%A0pero+utilizando+el+lenguaje+funci..." title="Send Gmail"><img class="nothumb" src="http://yohan.jasdid.com/wp-content/plugins/tweet-this/icons/en/gmail/tt-gmail-micro3.png" alt="Send Gmail" /></a></p></div>]]></content:encoded>
			<wfw:commentRss>http://yohan.jasdid.com/2011/08/meep-geometrias-%e2%80%93-cilindro/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Meep: Geometrias &#8211; Bloque</title>
		<link>http://yohan.jasdid.com/2011/08/meep-geometrias-bloque/</link>
		<comments>http://yohan.jasdid.com/2011/08/meep-geometrias-bloque/#comments</comments>
		<pubDate>Sun, 21 Aug 2011 07:15:08 +0000</pubDate>
		<dc:creator>yohan.jasdid</dc:creator>
				<category><![CDATA[Geometries]]></category>
		<category><![CDATA[Meep]]></category>
		<category><![CDATA[Ph.D.]]></category>

		<guid isPermaLink="false">http://yohan.jasdid.com/?p=1564</guid>
		<description><![CDATA[A continuacion se muestra la geometria &#8220;Bloque&#8221; hecha con C++ y Meep, para ver informacion sobre esta geometria pero utilizando el lenguaje funcional Scheme favor de visitar el siguiente enlace: http://jesusmanzanares.org/manual-del-meep/geometrias/block/ Considere el siguiente diagrama: La simulacion sencilla que se quiere lograr es simplemente dibujar una figura geométrica de un bloque en un plano X, Y, dicho plano [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">A continuacion se muestra la geometria &#8220;Bloque&#8221; hecha con C++ y <a href="http://ab-initio.mit.edu/wiki/index.php/Main_Page" target="_blank">Meep</a>, para ver informacion sobre esta geometria pero utilizando el lenguaje funcional Scheme favor de visitar el siguiente enlace: <a href="http://jesusmanzanares.org/manual-del-meep/geometrias/block/" target="_blank">http://jesusmanzanares.org/manual-del-meep/geometrias/block/</a></p>
<p>Considere el siguiente diagrama:</p>
<p><a href="http://yohan.jasdid.com/wp-content/uploads/2011/08/bloque.jpg"><img class="aligncenter size-medium wp-image-1568" title="bloque" src="http://yohan.jasdid.com/wp-content/uploads/2011/08/bloque-450x358.jpg" alt="" width="450" height="358" /></a></p>
<p style="text-align: justify;">La simulacion sencilla que se quiere lograr es simplemente dibujar una figura geométrica de un bloque en un plano X, Y, dicho plano X, Y representara el área de la malla en la que se estará trabajando, imagine que se quiere dibujar un bloque o cuadro de 2X2 en el centro del plano, para proceder con dicha geometría se siguen los pasos sugeridos en el <a href="http://yohan.jasdid.com/2011/08/estructura-de-un-programa-meep-con-c/" target="_blank">post anterior</a>.</p>
<p style="text-align: justify;">Primero que nada se inicializa la función <a href="http://en.wikipedia.org/wiki/Message_Passing_Interface" target="_blank">MPI</a>, esto es necesario aunque no se tenga contemplado hacer cálculos en paralelo</p>
<pre class="brush: cpp; title: ; notranslate">
    meep::initialize mpi(argc, argv);   // Do this even for non-MPI Meep
</pre>
<p style="text-align: justify;">Después, se definen algunas variables de resolucion y se define que que se utilizara un <a href="http://ab-initio.mit.edu/wiki/index.php/Perfectly_matched_layers" target="_blank">PML</a> para el área de frontera de la malla, en esta simulación no es necesario hacer esto pero de todas formas se definirá ya que en la mayoría de las simulaciones se necesitara una condición de frontera que absorba las ondas electromagnéticas</p>
<pre class="brush: cpp; title: ; notranslate">
    double resolution = 20;             // pixels per distance
    const double pml_thickness = 1.0;
    const double x = 20 + pml_thickness;
    const double y = 20 + pml_thickness;
</pre>
<p style="text-align: justify;">Después, se crea el Volumen que contiene el tamaño de la malla y la resolución y se especifica que el origen de nuestra malla sera exactamente en el centro, esto se tiene que definir de esta forma ya que en C++ el origen por default de la malla se encuentra ubicado en a partir de la parte positiva del plano, es decir, la coordenada 0,0 estará en la esquina izquierda inferior.</p>
<pre class="brush: cpp; title: ; notranslate">
	grid_volume grid_vol = vol2d(x, y, resolution);  // 20x20 2d cell
	grid_vol.center_origin();                        // set the origin as the center of cell
</pre>
<p style="text-align: justify;">Después, se define la estructura en donde se agrega una referencia al Volumen o malla que se ha creado, también se agrega una referencia con la función que define la geometría que se estará dibujando y por ultimo se le agrega el PML que se definió, esto con la finalidad de definir condiciones de frontera con un material de absorción perfecto aunque esto no es necesario en esta simulación se define por cuestiones ilustrativas ya que la mayoría de las simulaciones contendrán algun tipo de excitación en donde se requerirá contar con un material de absorción en los limites del volumen que nos de la ilusión de continuidad infinita en el campo electromagnético.</p>
<pre class="brush: cpp; title: ; notranslate">
	structure struct_block(grid_vol, Block, pml(pml_thickness));  // structure block
</pre>
<p style="text-align: justify;">Después, se define un Field que esta vinculado con la estructura y se agrega una instrucción de optimizacion, cabe mencionar que esta instrucción de optimizacion no esta dada por default en Meep C++ contrariamente a lo que ocurre con Scheme.</p>
<pre class="brush: cpp; title: ; notranslate">
	fields field_block(&amp;struct_block);
	field_block.use_real_fields();     // this is for optimization purposes
</pre>
<p style="text-align: justify;">Por ultimo, se define el nombre del archivo en estandard <a href="http://en.wikipedia.org/wiki/Hierarchical_Data_Format" target="_blank">HDF5</a> a generar, es decir, el archivo en donde se escribiran todos los datos de la simulacion en el estandar H5, y se finaliza indicandole a Meep que escriba todos los datos de la simulacion en dicho archivo por medio del objeto Field.</p>
<pre class="brush: cpp; title: ; notranslate">
	h5file *h5_file = field_block.open_h5file(&quot;block&quot;, h5file::WRITE, &quot;&quot;, true);
	field_block.output_hdf5(Dielectric, grid_vol.surroundings(), h5_file, false, false, &quot;&quot;);
</pre>
<p>Una de las partes importantes de un programa Meep es la funcion en donde se definen las geometrias, en este caso la función se ve de la siguiente manera:</p>
<pre class="brush: cpp; title: ; notranslate">
double Block(const vec &amp;p)
{
	if ((p.x() &gt;= -2 &amp;&amp; p.x() = -2 &amp;&amp; p.y()
            return 6.0;
	return 1.0;
}
</pre>
<p style="text-align: justify;">La forma en que la función de la geometría trabaja es la siguiente: Meep hace un barrido internamente punto por punto en donde evalúa si dicho punto se encuentra en la ecuación que se define dentro de esta función, si el punto pertenece al rango de puntos dentro de la función Meep asignara un epsilon de material definido dentro de la condicional, de otra forma Meep asignara el epsilon de material que se le especifique al final de la función, con esta metodología se puede dibujar prácticamente cualquier cosa.</p>
<p style="text-align: justify;">A continuación se enlista el código de la geometría completo:</p>
<pre class="brush: cpp; title: ; notranslate">
/*
 * _block.cpp
 *
 * In order to run a simulation using the MEEP C++ interface, the following steps are necessary:
 * initialize mpi(argc, argv); // do this even for non-MPI Meep
 * create a meep::volume
 * create a meep::structure using that volume
 * create a meep::fields object
 * add some kind of excitation.
 * time step the code. Of course, you'll have to create measurements and output whatever data
 * you are interested in as well.
 *
 *  Created on: Jul 22, 2011
 *      Author: yohan
 */

#include
#include
using namespace meep;

double Block(const vec &amp;p)
{
	if ((p.x() &gt;= -2 &amp;&amp; p.x() = -2 &amp;&amp; p.y()
          return 6.0;

	return 1.0;
}

int main(int argc, char **argv)
{
    meep::initialize mpi(argc, argv);   // Do this even for non-MPI Meep
    double resolution = 20;             // pixels per distance
    const double pml_thickness = 1.0;
    const double x = 20 + pml_thickness;
    const double y = 20 + pml_thickness;

	grid_volume grid_vol = vol2d(x, y, resolution);  // 20x20 2d cell
	grid_vol.center_origin();                        // set the origin as the center of cell

	structure struct_block(grid_vol, Block, pml(pml_thickness));  // structure block
	fields field_block(&amp;struct_block);
	field_block.use_real_fields();     // this is for optimization purposes

	h5file *h5_file = field_block.open_h5file(&quot;block&quot;, h5file::WRITE, &quot;&quot;, true);
	field_block.output_hdf5(Dielectric, grid_vol.surroundings(), h5_file, false, false, &quot;&quot;);
	return 0;
}
</pre>
<p style="text-align: justify;">Para ejecutar la simulación anterior es necesario crear un shell script en donde se especifican algunos paquetes que ayudaran en la conversión de datos en formato HDF5 a formato de imagen asi como tambien hara todo el compilado del codigo anterior para obtener los resultados deseados, para el caso del bloque y suponiendo que nuestro programa se llama _bloque.cpp se crea el siguiente archivo bash:</p>
<pre class="brush: bash; title: ; notranslate">
make _block.dac
./_block.dac

h5ls block-000000.00.h5
h5topng -Zc dkbluered block-000000.00.h5

rm block-000000.00.h5
rm _block.dac
</pre>
<p style="text-align: justify;">El shell script anterior compila el programa C++ mediante la instrucción make y crea un archivo de ejecución con extensión &#8221;.dac&#8221; la cual se ejecuta en la siguiente instrucción, a continuación se utiliza un comando propio de el paquete h5utils desarrollado también por el MIT, el comando h5ls enlista el tamaño del dataset creado que vive en el archivo con extensión H5 y en formato HDF5 este enlistado es solamente con fines informativos, a continuación se ejecuta el comando h5topng el cual como describe su nombre hace una conversión de los datos en formato HDF5 a una imagen en formato PNG, y se finaliza removiendo archivos que ya no serán utilizados al final de la simulación ya que lo que nos interesa por ahora es la imagen.</p>
<p style="text-align: justify;">Para concluir con la ejecución del programa Meep creado, se debe ejecutar el shell script que hara todo el trabajo de escribir todos esos comandos por nosotros con la siguiente instrucción, suponiendo que nuestro script se llame _bloque.sh.</p>
<pre class="brush: bash; title: ; notranslate">
chmod +x _bloque.sh
sh _bloque.sh
</pre>
<p>Listo!, la simulacion nos arrojara el diagrama esperado que se anexa a continuacion:</p>
<p><a href="http://yohan.jasdid.com/wp-content/uploads/2011/08/block-000000.00.png"><img class="aligncenter size-full wp-image-1581" title="block-000000.00" src="http://yohan.jasdid.com/wp-content/uploads/2011/08/block-000000.00.png" alt="" width="420" height="420" /></a></p>
<p style="text-align: justify;">Agregando una condicional en la función Block se puede fácilmente agregar un nuevo bloque en una coordenada distina a la inicial, el código se vería de esta forma:</p>
<pre class="brush: cpp; title: ; notranslate">
double Block(const vec &amp;p)
{
	if ((p.x() &gt;= -2 &amp;&amp; p.x() &lt;= 2) &amp;&amp; (p.y() &gt;= -2 &amp;&amp; p.y() &lt;= 2))
		return 6.0;
	if ((p.x() &gt;= -8 &amp;&amp; p.x() &lt;= -4) &amp;&amp; (p.y() &gt;= 5 &amp;&amp; p.y() &lt;= 9))
		return 6.0;

	return 1.0;
}
</pre>
<p>Y el resultado se vería de la siguiente manera:</p>
<p><a href="http://yohan.jasdid.com/wp-content/uploads/2011/08/block-000000.001.png"><img class="aligncenter size-full wp-image-1585" title="block-000000.00" src="http://yohan.jasdid.com/wp-content/uploads/2011/08/block-000000.001.png" alt="" width="420" height="420" /></a></p>
<p>Y por que no?? mejor agregamos 5 bloques solo por diversion!</p>
<pre class="brush: cpp; title: ; notranslate">
double Block(const vec &amp;p)
{
	if ((p.x() &gt;= -2 &amp;&amp; p.x() &lt;= 2) &amp;&amp; (p.y() &gt;= -2 &amp;&amp; p.y() &lt;= 2))
		return 6.0;
	if ((p.x() &gt;= -8 &amp;&amp; p.x() &lt;= -4) &amp;&amp; (p.y() &gt;= 5 &amp;&amp; p.y() &lt;= 9))
		return 6.0;
	if ((p.x() &gt;= -8 &amp;&amp; p.x() &lt;= -4) &amp;&amp; (p.y() &gt;= -9 &amp;&amp; p.y() &lt;= -5))
		return 6.0;
	if ((p.x() &gt;= 4 &amp;&amp; p.x() &lt;= 7) &amp;&amp; (p.y() &gt;= -9 &amp;&amp; p.y() &lt;= -5))
		return 6.0;
	if ((p.x() &gt;= 4 &amp;&amp; p.x() &lt;= 7) &amp;&amp; (p.y() &gt;= 5 &amp;&amp; p.y() &lt;= 9))
		return 6.0;

	return 1.0;
}
</pre>
<p><a href="http://yohan.jasdid.com/wp-content/uploads/2011/08/block-000000.002.png"><img class="aligncenter size-full wp-image-1586" title="block-000000.00" src="http://yohan.jasdid.com/wp-content/uploads/2011/08/block-000000.002.png" alt="" width="420" height="420" /></a><br />
Enjoy!</p>
<div class="tweetthis" style="text-align:left;"><p> <a target="_blank" rel="nofollow" class="tt" href="http://twitter.com/intent/tweet?text=Meep%3A+Geometrias+%E2%80%93+Bloque+http%3A%2F%2Fis.gd%2FTKF05r" title="Post to Twitter"><img class="nothumb" src="http://yohan.jasdid.com/wp-content/plugins/tweet-this/icons/en/twitter/tt-twitter-micro3.png" alt="Post to Twitter" /></a> <a target="_blank" rel="nofollow" class="tt" href="http://delicious.com/post?url=http://yohan.jasdid.com/2011/08/meep-geometrias-bloque/&amp;title=Meep%3A+Geometrias+%E2%80%93+Bloque" title="Post to Delicious"><img class="nothumb" src="http://yohan.jasdid.com/wp-content/plugins/tweet-this/icons/en/delicious/tt-delicious-micro3.png" alt="Post to Delicious" /></a> <a target="_blank" rel="nofollow" class="tt" href="http://www.facebook.com/share.php?u=http://yohan.jasdid.com/2011/08/meep-geometrias-bloque/&amp;t=Meep%3A+Geometrias+%E2%80%93+Bloque" title="Post to Facebook"><img class="nothumb" src="http://yohan.jasdid.com/wp-content/plugins/tweet-this/icons/en/facebook/tt-facebook-micro3.png" alt="Post to Facebook" /></a> <a target="_blank" rel="nofollow" class="tt" href="https://mail.google.com/mail/?ui=2&amp;view=cm&amp;fs=1&amp;tf=1&amp;su=Meep%3A+Geometrias+%E2%80%93+Bloque&amp;body=Link:+http://yohan.jasdid.com/2011/08/meep-geometrias-bloque/%0D%0A%0D%0A----%0D%0A+A+continuacion+se+muestra+la+geometria+%22Bloque%22+hecha+con+C%2B%2B+y+Meep%2C+para+ver+informacion+sobre+esta+geometria+pero+utilizando+el+lenguaje+funcion..." title="Send Gmail"><img class="nothumb" src="http://yohan.jasdid.com/wp-content/plugins/tweet-this/icons/en/gmail/tt-gmail-micro3.png" alt="Send Gmail" /></a></p></div>]]></content:encoded>
			<wfw:commentRss>http://yohan.jasdid.com/2011/08/meep-geometrias-bloque/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Meep: Estructura de un programa Meep con C++</title>
		<link>http://yohan.jasdid.com/2011/08/estructura-de-un-programa-meep-con-c/</link>
		<comments>http://yohan.jasdid.com/2011/08/estructura-de-un-programa-meep-con-c/#comments</comments>
		<pubDate>Sun, 21 Aug 2011 03:20:19 +0000</pubDate>
		<dc:creator>yohan.jasdid</dc:creator>
				<category><![CDATA[Basic Concepts]]></category>
		<category><![CDATA[Meep]]></category>
		<category><![CDATA[Ph.D.]]></category>
		<category><![CDATA[definiciones]]></category>
		<category><![CDATA[estructura]]></category>
		<category><![CDATA[volumen]]></category>

		<guid isPermaLink="false">http://yohan.jasdid.com/?p=1554</guid>
		<description><![CDATA[Como se ha visto anteriormente en el programa de ejemplo, la estructura de un programa en Meep debe seguir ciertas reglas y construirse de manera tal que Meep entienda lo que se quiere simular, los pasos a seguir para la estructura básica de un programa en Meep son los siguientes: Inicializar la función de MPI, esto se tendra que hacer [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Como se ha visto anteriormente en el programa de ejemplo, la estructura de un programa en Meep debe seguir ciertas reglas y construirse de manera tal que Meep entienda lo que se quiere simular, los pasos a seguir para la estructura básica de un programa en Meep son los siguientes:</p>
<ol>
<li style="text-align: justify;">Inicializar la función de MPI, esto se tendra que hacer aunque no se este planeado paralelizar</li>
<li style="text-align: justify;">Crear un <em>Volume</em></li>
<li style="text-align: justify;">Crear una <em>Estructura</em> utilizando el <em>Volume</em> creado</li>
<li style="text-align: justify;">Agregar <em>Fields</em> utilizando la estructura creada</li>
<li style="text-align: justify;">Agregar Fuentes, Flujos y Detectores</li>
<li style="text-align: justify;">Correr la simulacion</li>
</ol>
<h2 style="text-align: justify;"><strong>Conceptos Fundamentales</strong></h2>
<p><strong>Volume:</strong> El objeto Volume es un area tipo cuadrada en donde toda la simulación ocurrirá, existen dos tipos de Volumen, el Grid_Volume y en Volume la diferencia es que el Grid_Volume es un area de pixeles en donde se almacena la resolución, la cantidad de pixeles, el origen y el Volumen relacionado.</p>
<p><strong>Structure:</strong> El objeto Structure contiene información estructural de la simulación como los valores dieléctricos en puntos específicos o información sobre la polarización , la estructura debe conocer ciertos valores como la resolución de la malla a utilizar etc.</p>
<p><strong>Fields: </strong>Basicamente el objeto Fields es el que se encarga de la mayoria del trabajo y en donde toda la animacion se desarrolla, tambien es el encargado de generar todos los datos pertenecientes a la simulacion.</p>
<p><strong>Fuentes: </strong>Existen diversas definiciones para las fuentes, entre ellas figuran la fuente gausiana, la fuente continua y la fuente puntual, generalmente las fuentes se utilizan utilizando el objeto Field y definiendo un tiempo sobre el cual se ejecutara dicha fuente.</p>
<p><strong>Saltos de Tiempo: </strong>Generalmente los saltos de tiempo se definen automáticamente por Meep.</p>
<p><strong>Condiciones de Frontera: </strong>Meep soporta <a href="http://ab-initio.mit.edu/wiki/index.php/Perfectly_matched_layers" target="_blank">PML (Perfectlty Matched Layer) </a>que a grandes rasgos consta de un material perfecto que absorbe las ondas electromagneticas y sin ningun tipo de refleccion en todas las frecuencias y angulos, el PML da la ilusion de una condicion de propagacion perfecta del campo electromangetico fuera de las fronteras del Volumen de la malla.</p>
<p>En esta sección se han descrito algunos de los conceptos fundamentales para realizar simulaciones sencillas, este articulo se estará actualizando mientras se avance sobre el desarrollo de simulaciones mas complejas  y resulte la necesidad de definir mas conceptos.</p>
<div class="tweetthis" style="text-align:left;"><p> <a target="_blank" rel="nofollow" class="tt" href="http://twitter.com/intent/tweet?text=Meep%3A+Estructura+de+un+programa+Meep+con+C%2B%2B+http%3A%2F%2Fis.gd%2F1LqME1" title="Post to Twitter"><img class="nothumb" src="http://yohan.jasdid.com/wp-content/plugins/tweet-this/icons/en/twitter/tt-twitter-micro3.png" alt="Post to Twitter" /></a> <a target="_blank" rel="nofollow" class="tt" href="http://delicious.com/post?url=http://yohan.jasdid.com/2011/08/estructura-de-un-programa-meep-con-c/&amp;title=Meep%3A+Estructura+de+un+programa+Meep+con+C%2B%2B" title="Post to Delicious"><img class="nothumb" src="http://yohan.jasdid.com/wp-content/plugins/tweet-this/icons/en/delicious/tt-delicious-micro3.png" alt="Post to Delicious" /></a> <a target="_blank" rel="nofollow" class="tt" href="http://www.facebook.com/share.php?u=http://yohan.jasdid.com/2011/08/estructura-de-un-programa-meep-con-c/&amp;t=Meep%3A+Estructura+de+un+programa+Meep+con+C%2B%2B" title="Post to Facebook"><img class="nothumb" src="http://yohan.jasdid.com/wp-content/plugins/tweet-this/icons/en/facebook/tt-facebook-micro3.png" alt="Post to Facebook" /></a> <a target="_blank" rel="nofollow" class="tt" href="https://mail.google.com/mail/?ui=2&amp;view=cm&amp;fs=1&amp;tf=1&amp;su=Meep%3A+Estructura+de+un+programa+Meep+con+C%2B%2B&amp;body=Link:+http://yohan.jasdid.com/2011/08/estructura-de-un-programa-meep-con-c/%0D%0A%0D%0A----%0D%0A+Como+se+ha+visto+anteriormente+en+el+programa+de+ejemplo%2C+la+estructura+de+un+programa+en+Meep+debe+seguir+ciertas+reglas+y+construirse+de+manera+t..." title="Send Gmail"><img class="nothumb" src="http://yohan.jasdid.com/wp-content/plugins/tweet-this/icons/en/gmail/tt-gmail-micro3.png" alt="Send Gmail" /></a></p></div>]]></content:encoded>
			<wfw:commentRss>http://yohan.jasdid.com/2011/08/estructura-de-un-programa-meep-con-c/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Meep: Probando la Instalacion de Meep</title>
		<link>http://yohan.jasdid.com/2011/08/probando-la-instalacion-de-meep/</link>
		<comments>http://yohan.jasdid.com/2011/08/probando-la-instalacion-de-meep/#comments</comments>
		<pubDate>Fri, 19 Aug 2011 21:56:51 +0000</pubDate>
		<dc:creator>yohan.jasdid</dc:creator>
				<category><![CDATA[Introduction]]></category>
		<category><![CDATA[Meep]]></category>
		<category><![CDATA[Ph.D.]]></category>
		<category><![CDATA[prueba de instalacion]]></category>
		<category><![CDATA[simulacion]]></category>

		<guid isPermaLink="false">http://yohan.jasdid.com/?p=1542</guid>
		<description><![CDATA[Una vez que se tiene el Meep instalado siguiendo las instrucciones del post anterior, se procede a hacer el primer ejemplo que viene en el C++ Tutorial de la pagina del Meep, con esto se comprobara que la instalacion este correcta y no haga falta ninguna libreria o paquete por instalar, en el presente escrito [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Una vez que se tiene el Meep instalado siguiendo las instrucciones del <a href="http://yohan.jasdid.com/2011/08/meep-instalacion/" target="_blank">post anterior</a>, se procede a hacer el primer ejemplo que viene en el<a href="http://ab-initio.mit.edu/wiki/index.php/Meep_C-plus-plus_Tutorial" target="_blank"> C++ Tutorial</a> de la pagina del Meep, con esto se comprobara que la instalacion este correcta y no haga falta ninguna libreria o paquete por instalar, en el presente escrito solo se pretende probar la instalacion del Meep por lo que no se hara una descripcion detallada de cada uno de los comandos ya que esa descripcion detallada fluira a medida que se avanza en el desarrollo utilizando esta interesante libreria,</p>
<p style="text-align: justify;">No se hable mas y veamos algo de codigo.. a continuacion enlisto un programa sencillo, solamente para probar que se ejecuta correctamente utilizando Meep..</p>
<pre class="brush: cpp; title: ; notranslate">
#include
using namespace meep;

int main(int argc, char **argv)
{
	initialize mpi(argc, argv);	// do this even for non-MPI Meep
	double resolution = 20;		// pixels per distance
	grid_volume v = vol2d(5,10, resolution);  // 5x10 2d cell
	structure s(v, eps, pml(1.0));
	fields f(&amp;s);

	f.output_hdf5(Dielectric, v.surroundings());
	double freq = 0.3, fwidth = 0.1;
	gaussian_src_time src(freq, fwidth);
	f.add_point_source(Ey, src, vec(1.1, 2.3));
	while (f.time() &lt; f.last_source_time())
	{
		f.step();
	}

	f.output_hdf5(Hz, v.surroundings());
	return 0;
}

double eps(const vec &amp;p)
{
	if (p.x() &lt; 2 &amp;&amp; p.y() &lt; 3)
		return 12.0;
	return 1.0;
}
</pre>
<p style="text-align: justify;">Los pasos para ejecutar el programa anterior son los siguientes:</p>
<ul>
<li style="text-align: justify;">Primero que nada se crea un archivo que se llame overview.cpp con el codigo C++ anterior</li>
<li style="text-align: justify;">Se navega al directorio del Meep que se ha bajado y compilado anteriormente, usualmente el directorio se llamara &#8220;meep-1.1.1&#8243; ya que es la version actual de Meep</li>
<li style="text-align: justify;">Se navega a la carpeta tests y movemos el programa que hemos creado hacia esta carpeta</li>
<li style="text-align: justify;">A continuacion se enlista en programa overview.sh que es un shell script que tambien se debe colocar en la carpeta tests</li>
</ul>
<pre class="brush: bash; title: ; notranslate">
make overview.dac
./overview.dac

h5ls eps-000000.00.h5
h5topng -Zc dkbluered eps-000000.00.h5

rm eps-000000.00.h5
rm overview.dac
</pre>
<ul>
<li style="text-align: justify;">Por ultimo abrimos la consola en modo de &#8220;root&#8221; para despues ceder permisos de ejecucion al bash scripty ejecutarlo como se muestra a continuacion</li>
</ul>
<pre class="brush: bash; title: ; notranslate">
su root
chmod +x overview.sh
sh overview.sh
</pre>
<p style="text-align: justify;">Al final de la ejecucion de el script anterior deberiamos haber llegado al resultado que es la imagen que enseguida agrego en la parte de abajo, si se ha llegado a este punto significa que tenemos el ambiente idoneo para empezar a programar en C++ utilizando Meep, de otra forma se debera hacer una verificacion de todos los pasos anteriores hasta llagar a este resultado.</p>
<p style="text-align: justify;"><img class="size-full wp-image-1547 aligncenter" title="eps-000000.00" src="http://yohan.jasdid.com/wp-content/uploads/2011/08/eps-000000.00.png" alt="" width="100" height="200" /></p>
<p style="text-align: justify;">En este escrito se agregaron ciertos programas para verificar el correcto funcionamiento de la instalacion Meep, se utilizaron algunos comandos de la libreria del Meep para generar una imagen de la simulacion y se verifico que todo funcione como se esperaba, en los siguientes posts se estara viendo a detalle cada parte de la cual se constituye un programa de simulacion Meep utilizando C++,</p>
<p>Enjoy!</p>
<pre></pre>
<div class="tweetthis" style="text-align:left;"><p> <a target="_blank" rel="nofollow" class="tt" href="http://twitter.com/intent/tweet?text=Meep%3A+Probando+la+Instalacion+de+Meep+http%3A%2F%2Fis.gd%2FNp920B" title="Post to Twitter"><img class="nothumb" src="http://yohan.jasdid.com/wp-content/plugins/tweet-this/icons/en/twitter/tt-twitter-micro3.png" alt="Post to Twitter" /></a> <a target="_blank" rel="nofollow" class="tt" href="http://delicious.com/post?url=http://yohan.jasdid.com/2011/08/probando-la-instalacion-de-meep/&amp;title=Meep%3A+Probando+la+Instalacion+de+Meep" title="Post to Delicious"><img class="nothumb" src="http://yohan.jasdid.com/wp-content/plugins/tweet-this/icons/en/delicious/tt-delicious-micro3.png" alt="Post to Delicious" /></a> <a target="_blank" rel="nofollow" class="tt" href="http://www.facebook.com/share.php?u=http://yohan.jasdid.com/2011/08/probando-la-instalacion-de-meep/&amp;t=Meep%3A+Probando+la+Instalacion+de+Meep" title="Post to Facebook"><img class="nothumb" src="http://yohan.jasdid.com/wp-content/plugins/tweet-this/icons/en/facebook/tt-facebook-micro3.png" alt="Post to Facebook" /></a> <a target="_blank" rel="nofollow" class="tt" href="https://mail.google.com/mail/?ui=2&amp;view=cm&amp;fs=1&amp;tf=1&amp;su=Meep%3A+Probando+la+Instalacion+de+Meep&amp;body=Link:+http://yohan.jasdid.com/2011/08/probando-la-instalacion-de-meep/%0D%0A%0D%0A----%0D%0A+Una+vez+que+se+tiene+el+Meep+instalado+siguiendo+las+instrucciones+del+post+anterior%2C+se+procede+a+hacer+el+primer+ejemplo+que+viene+en+el+C%2B%2B+Tuto..." title="Send Gmail"><img class="nothumb" src="http://yohan.jasdid.com/wp-content/plugins/tweet-this/icons/en/gmail/tt-gmail-micro3.png" alt="Send Gmail" /></a></p></div>]]></content:encoded>
			<wfw:commentRss>http://yohan.jasdid.com/2011/08/probando-la-instalacion-de-meep/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Corriendo hacia la Muerte</title>
		<link>http://yohan.jasdid.com/2011/08/corriendo-hacia-la-muerte/</link>
		<comments>http://yohan.jasdid.com/2011/08/corriendo-hacia-la-muerte/#comments</comments>
		<pubDate>Thu, 18 Aug 2011 21:20:37 +0000</pubDate>
		<dc:creator>yohan.jasdid</dc:creator>
				<category><![CDATA[Chess]]></category>

		<guid isPermaLink="false">http://yohan.jasdid.com/?p=1537</guid>
		<description><![CDATA[Siempre he sido una persona muy aficionado al ajedrez en linea y acostumbro a jugar regularmente aunque estos ultimos meses lo he dejado un poco debido a tareas del Doctorado, hoy en mi hora de comida aproveche para jugar una partida de 15 min. la verdad que la partida me gusto mucho y la exporte [...]]]></description>
			<content:encoded><![CDATA[<p>Siempre he sido una persona muy aficionado al ajedrez en linea y acostumbro a jugar regularmente aunque estos ultimos meses lo he dejado un poco debido a tareas del Doctorado, hoy en mi hora de comida aproveche para jugar una partida de 15 min. la verdad que la partida me gusto mucho y la exporte con el fritz para guardarla aqui en el blog, a esta partida le llame &#8220;Corriendo hacia la Muerte&#8221;, espero la disfruten como yo jugandola..</p>
<p>Saludos! <img src='http://yohan.jasdid.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<div class="CBB-board" style="display: none;">[Event "Partida evaluada, 15m + 5s"]<br />
[Site "Sala principal"]<br />
[Date "2011.08.18"]<br />
[Round "?"]<br />
[White "Yohan"]<br />
[Black "MrHobbit"]<br />
[Result "1-0"]<br />
[ECO "C62"]<br />
[WhiteElo "1400"]<br />
[Annotator "YR"]<br />
[PlyCount "57"]<br />
[EventDate "2011.08.18"]<br />
[TimeControl "900+5"]1. e4 e5<br />
2. Nc3 Nc6<br />
3. Nf3 d6<br />
4. Bb5 Bd7<br />
5. d3 h6<br />
6. Be3 f5<br />
7. exf5 Nf6<br />
8. h3 a6<br />
9. Ba4 b5<br />
10. Bb3 Bxf5<br />
11. O-O Qd7<br />
12. d4 e4<br />
13. d5 Ne7<br />
14. Nd4 Bxh3<br />
15. gxh3 Qxh3<br />
16. Ne6 Ng4<br />
17. Bf4 Ng6<br />
18. Bg3 Nh4<br />
19. Nf4 Qxf1+<br />
20. Qxf1 Nf3+<br />
21. Kh1 h5<br />
22. Qh3 h4<br />
23. Qxg4 hxg3+<br />
24. Kg2 gxf2<br />
25. Qg6+ Kd8<br />
26. Ne6+ Kc8<br />
27. Qe8+ Kb7<br />
28. Qc6+ Ka7<br />
29. Qxc7# 1-0</div>
<div class="tweetthis" style="text-align:left;"><p> <a target="_blank" rel="nofollow" class="tt" href="http://twitter.com/intent/tweet?text=Corriendo+hacia+la+Muerte+http%3A%2F%2Fis.gd%2FKllYiY" title="Post to Twitter"><img class="nothumb" src="http://yohan.jasdid.com/wp-content/plugins/tweet-this/icons/en/twitter/tt-twitter-micro3.png" alt="Post to Twitter" /></a> <a target="_blank" rel="nofollow" class="tt" href="http://delicious.com/post?url=http://yohan.jasdid.com/2011/08/corriendo-hacia-la-muerte/&amp;title=Corriendo+hacia+la+Muerte" title="Post to Delicious"><img class="nothumb" src="http://yohan.jasdid.com/wp-content/plugins/tweet-this/icons/en/delicious/tt-delicious-micro3.png" alt="Post to Delicious" /></a> <a target="_blank" rel="nofollow" class="tt" href="http://www.facebook.com/share.php?u=http://yohan.jasdid.com/2011/08/corriendo-hacia-la-muerte/&amp;t=Corriendo+hacia+la+Muerte" title="Post to Facebook"><img class="nothumb" src="http://yohan.jasdid.com/wp-content/plugins/tweet-this/icons/en/facebook/tt-facebook-micro3.png" alt="Post to Facebook" /></a> <a target="_blank" rel="nofollow" class="tt" href="https://mail.google.com/mail/?ui=2&amp;view=cm&amp;fs=1&amp;tf=1&amp;su=Corriendo+hacia+la+Muerte&amp;body=Link:+http://yohan.jasdid.com/2011/08/corriendo-hacia-la-muerte/%0D%0A%0D%0A----%0D%0A+Siempre+he+sido+una+persona+muy+aficionado+al+ajedrez+en+linea+y+acostumbro+a+jugar+regularmente+aunque+estos+ultimos+meses+lo+he+dejado+un+poco+de..." title="Send Gmail"><img class="nothumb" src="http://yohan.jasdid.com/wp-content/plugins/tweet-this/icons/en/gmail/tt-gmail-micro3.png" alt="Send Gmail" /></a></p></div>]]></content:encoded>
			<wfw:commentRss>http://yohan.jasdid.com/2011/08/corriendo-hacia-la-muerte/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Meep: Instalacion</title>
		<link>http://yohan.jasdid.com/2011/08/meep-instalacion/</link>
		<comments>http://yohan.jasdid.com/2011/08/meep-instalacion/#comments</comments>
		<pubDate>Thu, 18 Aug 2011 07:26:20 +0000</pubDate>
		<dc:creator>yohan.jasdid</dc:creator>
				<category><![CDATA[Introduction]]></category>
		<category><![CDATA[Meep]]></category>
		<category><![CDATA[Ph.D.]]></category>

		<guid isPermaLink="false">http://yohan.jasdid.com/?p=1529</guid>
		<description><![CDATA[A continuacion, se enlistan los comandos necesarios para instalar todos los paquetes que necesita Meep en sus versiones tanto de desarrollo así como de documentación y ejecutables para poder funcionar en modo de desarrollo, cabe mencionar que esta lista de comandos fue probada en una instalación de Debian Squeeze asi como en una instalación de Ubuntu 11.04, los comandos se deben ejecutar con [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">A continuacion, se enlistan los comandos necesarios para instalar todos los paquetes que necesita Meep en sus versiones tanto de desarrollo así como de documentación y ejecutables para poder funcionar en modo de desarrollo, cabe mencionar que esta lista de comandos fue probada en una instalación de Debian Squeeze asi como en una instalación de Ubuntu 11.04, los comandos se deben ejecutar con el usuario &#8220;root&#8221; para poder tener acceso a instalar software por lo que si se esta utilizando Ubuntu tal vez se tenga que cambiar el password de root y hacer un switch del user &#8220;su root&#8221; de otra manera se le tendra que agregar el comando &#8220;sudo&#8221; (del cual no soy muy fanático) al inicio de cada instrucción.</p>
<pre class="brush: bash; title: ; notranslate">
#########################################################################################################
### This package contains an informational list of packages which are
### considered essential for building Debian packages.  This package also
### depends on the packages on that list, to make it easy to have the
### build-essential packages installed.

apt-get install build-essential

#########################################################################################################
### BLAS (Basic Linear Algebra Subroutines) is a set of efficient
### routines for most of the basic vector and matrix operations.
### They are widely used as the basis for other high quality linear
### algebra software, for example lapack and linpack.  This
### implementation is the Fortran 77 reference implementation found
### at netlib.

apt-get install libblas3gf libblas-test libblas-dev libblas-doc

##########################################################################################################
### LAPACK version 3.X is a comprehensive FORTRAN library that does
### linear algebra operations including matrix inversions, least
### squared solutions to linear sets of equations, eigenvector
### analysis, singular value decomposition, etc. It is a very
### comprehensive and reputable package that has found extensive
### use in the scientific community.

apt-get install liblapack3gf liblapack-test liblapack-doc liblapack-pic liblapack-dev

##########################################################################################################
### harminv is a free library to solve the problem of harmonic inversion,
### given a discrete-time, finite-length signal that consists of a sum of
### finitely-many sinusoids (possibly exponentially decaying) in a given
### bandwidth, it determines the frequencies, decay constants, amplitudes, and
### phases of those sinusoids.

apt-get install libharminv2 harminv libharminv-dev

##########################################################################################################
### Guile is a Scheme implementation designed for real world programming,
### providing a rich Unix interface, a module system, an interpreter, and
### many extension languages.  Guile can be used as a standard #! style
### interpreter, via #!/usr/bin/guile, or as an extension language for
### other applications via libguile.

apt-get install guile-1.8 guile-1.8-libs guile-1.8-dev

##########################################################################################################
### libctl is a free Guile-based library implementing flexible control files for
### scientific simulations. It was written to support the MIT Photonic-Bands
### program, but will hopefully prove useful in other programs too.

apt-get install libctl3 libctl-dev libctl-doc

##########################################################################################################
### Open MPI is a project combining technologies and resources from several other
### projects (FT-MPI, LA-MPI, LAM/MPI, and PACX-MPI) in order to build the best
### MPI library available. A completely new MPI-2 compliant implementation, Open
### MPI offers advantages for system and software vendors, application developers
### and computer science researchers.

apt-get install openmpi-bin libopenmpi-dev openmpi-doc libopenmpi-dbg openmpi-common openmpi-checkpoint libopenmpi1.3

##########################################################################################################
### HDF5 (Hierarchical Data Format 5) is a file format for storing
### scientific data. These tools allow to convert other formats to
### HDF5 and to visualize HDF5 files. They include:
###  - h5topng, which extracts a 2d slice of an HDF5 file and
###    outputs a corresponding image in PNG format;
###  - h5totxt, which extracts 2d slices and outputs comma-delimited
###    text (suitable for import into a spreadsheet);
###  - h5fromtxt, which converts simple text input into
###    multi-dimensional numeric HDF5 datasets;
###  - h5fromh4, which converts HDF4 data to HDF5;
###  - h5tovtk, which converts HDF5 files to VTK files for
###    visualization with VTK-aware programs;
###  - h5read, a plugin for the Octave numerical language.

apt-get install h5utils hdf5-tools libhdf5-doc libhdf5-serial-1.8.4 libhdf5-serial-dev hdfview

##########################################################################################################
### ATLAS is an approach for the automatic generation and optimization of
### numerical software. Currently ATLAS supplies optimized versions for the
### complete set of linear algebra kernels known as the Basic Linear Algebra
### Subroutines (BLAS), and a subset of the linear algebra routines in the
### LAPACK library.

apt-get install libatlas3gf-base libatlas-doc libatlas-dev libatlas-test libatlas-base-dev

##########################################################################################################
### MPB - The MIT Photonic-Bands package is a free program for computing the band
### structures (dispersion relations) and electromagnetic modes of periodic
### dielectric structures, on both serial and parallel computers. It was
### developed by Steven G. Johnson at MIT in the Joannopoulos Ab Initio
### Physics group, and designed to study photonic crystal structures.

apt-get install mpb mpb-doc

##########################################################################################################
### This library computes Fast Fourier Transforms (FFT) in one or more dimensions.
### It is extremely fast. This package contains the shared library version of the
### fftw libraries in double precision.

apt-get install fftw2 libfftw3-3 fftw-docs fftw-dev

##########################################################################################################
### The GNU Scientific Library (GSL) is a collection of routines for
### numerical analysis.  The routines are written from scratch by the GSL
### team in C, and present a modern API for C programmers, while allowing
### wrappers to be written for very high level languages.

apt-get install libgsl0ldbl libgsl0-dbg gsl-bin libgsl0-dev gsl-ref-html

##########################################################################################################
### Meep (or MEEP) is a free finite-difference time-domain (FDTD) simulation
### software package developed at MIT to model electromagnetic systems.
### Its features include:
###   * Simulation in 1d, 2d, 3d, and cylindrical coordinates.
###   * Dispersive (including loss/gain) and nonlinear (Kerr &amp; Pockels) materials.
###     Magnetic permeability and electric/magnetic conductivities.
###   * PML absorbing boundaries and/or perfect conductor and/or Bloch-periodic
###     boundary conditions.
###   * Exploitation of symmetries to reduce the computation size .
###     even/odd mirror symmetries and 90/180 degree rotations.
###   * Complete scriptability - either via a Scheme scripting front-end
###     (as in libctl and MPB), or callable as a C++ library.
###   * Field output in the HDF5 standard scientific data format, supported by
###     many visualization tools.
###   * Arbitrary material and source distributions.
###   * Field analyses including flux spectra, frequency extraction, and energy
###     integrals; completely programmable.
###   * Multi-parameter optimization, root-finding, integration, etcetera
###     (via libctl).

apt-get install meep libmeep6 libmeep-dev

##########################################################################################################
### these are used to create the Makefiles and configure scripts,
### and to build shared libraries.

apt-get install autoconf autoconf-doc automake pkg-config libtool libtool-doc latex2html

##########################################################################################################
### SWIG is a compiler that makes it easy to integrate C and C++ code
### with other languages including Perl, PHP, Tcl, Ruby, Python, Java,
### Guile, Mzscheme, Chicken, OCaml, Pike, and C#.

apt-get install swig swig-doc swig-examples

##########################################################################################################
</pre>
<p style="text-align: justify;">Una vez que se han instalado todos los paquetes anteriores necesarios para que Meep funcione en modo de desarrollo (de entre los cuales se encuentra un interesante visor de formato <a href="http://en.wikipedia.org/wiki/Hierarchical_Data_Format" target="_blank">hdf5</a>) se procede a descargar el software para poder compilarlo, aunque ya se tienen los paquetes del meep instalados la idea de descargar el código fuente, compilarlo y ejecutar los programas desde ahí es bastante atractiva y a mi punto de vista flexible, teniendo en cuenta que se estaran programando las simulaciones directamente desde el core de la libreria, cabe mencionar que todos los paquetes anteriores se instalaran como librerías compartidas lo que nos da la ventaja de tener &#8220;<a href="http://en.wikipedia.org/wiki/Autocompletion" target="_blank">Intellisense</a>&#8221; si se estan haciendo programas utilizando el <a href="http://www.eclipse.org/" target="_blank">Eclipse</a> por ejemplo, la direccion de descarga de el código fuente del meep es la siguiente:</p>
<p style="text-align: justify;"><a title="http://ab-initio.mit.edu/meep/meep-1.1.1.tar.gz" href="http://ab-initio.mit.edu/meep/meep-1.1.1.tar.gz" rel="nofollow" target="_blank">http://ab-initio.mit.edu/meep/<wbr>meep-1.1.1.tar.gz</wbr></a></p>
<p style="text-align: justify;">Una vez descargado se descomprime a algún directorio deseado, ya que se tiene extraido se navega en la consola hasta el directorio del Meep, el directorio se llamara meep-1.1.1 que es la versión actual de la herramienta, y después de eso se ejecuta el script de configuración de la herramienta estando en el directorio antes mencionado con el siguiente comando.</p>
<pre class="brush: bash; title: ; notranslate">
./configure
</pre>
<p style="text-align: justify;">El script de la herramienta hace una serie de chequeos para ver si se tienen todos los paquetes instalados y en este caso imprimirá mensajes de estado en la consola similares a los siguientes:</p>
<pre class="brush: plain; title: ; notranslate">
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /bin/mkdir -p
checking for gawk... no
checking for mawk... mawk
checking whether make sets $(MAKE)... yes
checking whether to enable maintainer-specific portions of Makefiles... no
checking for g++... g++
checking for C++ compiler default output file name... a.out
checking whether the C++ compiler works... yes
checking whether we are cross compiling... no
checking for suffix of executables...
checking for suffix of object files... o
checking whether we are using the GNU C++ compiler... yes
checking whether g++ accepts -g... yes
checking for style of include used by make... GNU
checking dependency style of g++... gcc3
checking build system type... i686-pc-linux-gnu
checking host system type... i686-pc-linux-gnu
checking for gcc... gcc
checking whether we are using the GNU C compiler... yes
checking whether gcc accepts -g... yes
checking for gcc option to accept ISO C89... none needed
checking dependency style of gcc... gcc3
checking for C++ compiler vendor... gnu
checking whether C++ compiler accepts -malign-double... yes
checking whether C++ compiler accepts -fstrict-aliasing... yes
checking whether C++ compiler accepts -ffast-math... yes
checking for gcc architecture flag...
checking for x86 cpuid 0 output... d:756e6547:6c65746e:49656e69
checking for x86 cpuid 1 output... 206a7:3100800:1dbae3bf:bfebfbff
checking whether C++ compiler accepts -march=pentium2... yes
checking for gcc architecture flag... -march=pentium2
checking whether C++ compiler accepts -O3 -malign-double -fstrict-aliasing -march=pentium2... yes
checking for a sed that does not truncate output... /bin/sed
checking for grep that handles long lines and -e... /bin/grep
checking for egrep... /bin/grep -E
checking for fgrep... /bin/grep -F
checking for ld used by gcc... /usr/bin/ld
checking if the linker (/usr/bin/ld) is GNU ld... yes
checking for BSD- or MS-compatible name lister (nm)... /usr/bin/nm -B
checking the name lister (/usr/bin/nm -B) interface... BSD nm
checking whether ln -s works... yes
checking the maximum length of command line arguments... 1572864
checking whether the shell understands some XSI constructs... yes
checking whether the shell understands &quot;+=&quot;... yes
checking for /usr/bin/ld option to reload object files... -r
checking for objdump... objdump
checking how to recognize dependent libraries... pass_all
checking for ar... ar
checking for strip... strip
checking for ranlib... ranlib
checking command to parse /usr/bin/nm -B output from gcc object... ok
checking how to run the C preprocessor... gcc -E
checking for ANSI C header files... yes
checking for sys/types.h... yes
checking for sys/stat.h... yes
checking for stdlib.h... yes
checking for string.h... yes
checking for memory.h... yes
checking for strings.h... yes
checking for inttypes.h... yes
checking for stdint.h... yes
checking for unistd.h... yes
checking for dlfcn.h... yes
checking whether we are using the GNU C++ compiler... (cached) yes
checking whether g++ accepts -g... (cached) yes
checking dependency style of g++... (cached) gcc3
checking how to run the C++ preprocessor... g++ -E
checking for objdir... .libs
checking if gcc supports -fno-rtti -fno-exceptions... no
checking for gcc option to produce PIC... -fPIC -DPIC
checking if gcc PIC flag -fPIC -DPIC works... yes
checking if gcc static flag -static works... yes
checking if gcc supports -c -o file.o... yes
checking if gcc supports -c -o file.o... (cached) yes
checking whether the gcc linker (/usr/bin/ld) supports shared libraries... yes
checking dynamic linker characteristics... GNU/Linux ld.so
checking how to hardcode library paths into programs... immediate
checking whether stripping libraries is possible... yes
checking if libtool supports shared libraries... yes
checking whether to build shared libraries... no
checking whether to build static libraries... yes
checking for ld used by g++... /usr/bin/ld
checking if the linker (/usr/bin/ld) is GNU ld... yes
checking whether the g++ linker (/usr/bin/ld) supports shared libraries... yes
checking for g++ option to produce PIC... -fPIC -DPIC
checking if g++ PIC flag -fPIC -DPIC works... yes
checking if g++ static flag -static works... yes
checking if g++ supports -c -o file.o... yes
checking if g++ supports -c -o file.o... (cached) yes
checking whether the g++ linker (/usr/bin/ld) supports shared libraries... yes
checking dynamic linker characteristics... GNU/Linux ld.so
checking how to hardcode library paths into programs... immediate
checking for latex2html... latex2html
checking for sin in -lm... yes
checking for fftw_plan_dft_1d in -lfftw3... no
checking for fftw_create_plan in -ldfftw... no
checking for fftw_create_plan in -lfftw... yes
checking for pkg-config... /usr/bin/pkg-config
checking for harminv &gt;= 1.1... yes
checking HARMINV_CFLAGS...
checking HARMINV_LIBS... -lharminv
checking mpb.h usability... no
checking mpb.h presence... no
checking for mpb.h... no
checking for cblas_cgemm... yes
checking for gsl_sf_bessel_Jn in -lgsl... yes
checking for deflate in -lz... yes
checking for H5Pcreate in -lhdf5... yes
checking hdf5.h usability... yes
checking hdf5.h presence... yes
checking for hdf5.h... yes
checking for guile-config... guile-config
checking if linking to guile works... yes
checking for scm_make_smob_type... yes
checking for SCM_SMOB_PREDICATE... no
checking for SCM_SMOB_DATA... no
checking for SCM_NEWSMOB... no
checking how to activate readline in Guile... ice-9 readline
checking for libctl dir... /usr/share/libctl3
checking for gen-ctl-io... gen-ctl-io
checking for ctl_get_vector3 in -lctl... yes
checking ctl.h usability... yes
checking ctl.h presence... yes
checking for ctl.h... yes
checking whether libctl version is at least 3.0.3... ok
checking for basename in -lgen... no
checking for feenableexcept... yes
checking whether feenableexcept declaration is usable... yes
checking whether to catch and ignore SIGFPE signals... no
checking whether time.h and sys/time.h may both be included... yes
checking sys/time.h usability... yes
checking sys/time.h presence... yes
checking for sys/time.h... yes
checking for BSDgettimeofday... no
checking for gettimeofday... yes
checking for cblas_ddot... yes
checking for cblas_daxpy... yes
checking for C/C++ restrict keyword... __restrict
configure: creating ./config.status
config.status: creating Makefile
config.status: creating meep-pkgconfig
config.status: creating src/Makefile
config.status: creating tests/Makefile
config.status: creating examples/Makefile
config.status: creating libctl/Makefile
config.status: creating libctl/meep.scm
config.status: creating config.h
config.status: config.h is unchanged
config.status: executing depfiles commands
config.status: executing libtool commands
</pre>
<p style="text-align: justify;">Se asegura de que el script de configuración no marque ningún &#8221;warning&#8221; para proceder con la compilación, en este caso no aparecerá ninguno ya que ya se han instalado todos los paquetes necesarios previamente..</p>
<p style="text-align: justify;">Por ultimo se procede a hacer el compilado de la herramienta para generar los ejecutables con la siguientes instrucciones:</p>
<pre class="brush: bash; title: ; notranslate">
make
make install
</pre>
<div style="text-align: justify;">En este punto ya se tiene el parque de diversiones listo para utilizarse! <img src='http://yohan.jasdid.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> , en el siguiente post se hara el primer programa de simulacion sencillo mediante C++ para probar todo el nuevo entorno que se acaba de instalar, tal vez sea prudente hacer otro post con informacion de la instalacion de un entorno de desarrollo amigable como C++, se da por asentado que el lector interesado esta utilizando una plataforma Linux basada en Debian..</div>
<div class="tweetthis" style="text-align:left;"><p> <a target="_blank" rel="nofollow" class="tt" href="http://twitter.com/intent/tweet?text=Meep%3A+Instalacion+http%3A%2F%2Fis.gd%2FXiwwU2" title="Post to Twitter"><img class="nothumb" src="http://yohan.jasdid.com/wp-content/plugins/tweet-this/icons/en/twitter/tt-twitter-micro3.png" alt="Post to Twitter" /></a> <a target="_blank" rel="nofollow" class="tt" href="http://delicious.com/post?url=http://yohan.jasdid.com/2011/08/meep-instalacion/&amp;title=Meep%3A+Instalacion" title="Post to Delicious"><img class="nothumb" src="http://yohan.jasdid.com/wp-content/plugins/tweet-this/icons/en/delicious/tt-delicious-micro3.png" alt="Post to Delicious" /></a> <a target="_blank" rel="nofollow" class="tt" href="http://www.facebook.com/share.php?u=http://yohan.jasdid.com/2011/08/meep-instalacion/&amp;t=Meep%3A+Instalacion" title="Post to Facebook"><img class="nothumb" src="http://yohan.jasdid.com/wp-content/plugins/tweet-this/icons/en/facebook/tt-facebook-micro3.png" alt="Post to Facebook" /></a> <a target="_blank" rel="nofollow" class="tt" href="https://mail.google.com/mail/?ui=2&amp;view=cm&amp;fs=1&amp;tf=1&amp;su=Meep%3A+Instalacion&amp;body=Link:+http://yohan.jasdid.com/2011/08/meep-instalacion/%0D%0A%0D%0A----%0D%0A+A+continuacion%2C+se+enlistan+los+comandos+necesarios+para+instalar+todos+los+paquetes+que+necesita+Meep+en+sus+versiones+tanto+de+desarrollo%C2%A0as%C3%AD%C2%A0com..." title="Send Gmail"><img class="nothumb" src="http://yohan.jasdid.com/wp-content/plugins/tweet-this/icons/en/gmail/tt-gmail-micro3.png" alt="Send Gmail" /></a></p></div>]]></content:encoded>
			<wfw:commentRss>http://yohan.jasdid.com/2011/08/meep-instalacion/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>

