{"id":4926,"date":"2021-03-26T11:10:11","date_gmt":"2021-03-26T10:10:11","guid":{"rendered":"http:\/\/roboblog.fatal-fury.de\/?p=4926"},"modified":"2021-03-26T13:25:32","modified_gmt":"2021-03-26T12:25:32","slug":"c-fortran-array-types","status":"publish","type":"post","link":"http:\/\/roboblog.fatal-fury.de\/?p=4926","title":{"rendered":"C++ Fortran - Array &#038; Types"},"content":{"rendered":"<table>\n<tr>\n<td>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\nstruct Point3D{\r\n    double x,y, z, w;\r\n};\r\n\r\nstruct Mesh {\r\n    std::vector&lt;Point3D&gt; nodes;\r\n};\r\n<\/pre>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\ndouble func(const Mesh&amp; mesh, int IP) {\r\n    return mesh.nodes&#x5B;IP].x;\r\n}\r\n<\/pre>\n<\/td>\n<td>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\nfunc(Mesh const&amp;, int):\r\n        movslq  %esi, %rsi      # convert IP vom 32bit integer to 64bit integer\r\n        salq    $5, %rsi        # rsi = 32*rsi  calculate offset in array. sizeof(Point3D) == 32\r\n        addq    (%rdi), %rsi    # add vector base pointer\r\n        movsd   (%rsi), %xmm0   # copy value into return register\r\n        ret\r\n<\/pre>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\ndouble func2(const std::vector&lt;Point3D&gt;&amp; nodes, int IP) {\r\n    return nodes&#x5B;IP].x;\r\n}\r\n<\/pre>\n<\/td>\n<td>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\nfunc2(std::vector&lt;Point3D, std::allocator&lt;Point3D&gt; &gt; const&amp;, int):\r\n        movslq  %esi, %rsi      \r\n        salq    $5, %rsi        \r\n        addq    (%rdi), %rsi\r\n        movsd   (%rsi), %xmm0\r\n        ret\r\n<\/pre>\n<\/td>\n<\/tr>\n<tr>\n<td>\nFortran<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\nmodule test_m\r\n  type Point3D_t\r\n    real(8) :: xyz(4)\r\n  end type\r\n\r\n  type Mesh_t\r\n    type(Point3D_t), allocatable :: nodes(:)\r\n  end type\r\n\r\n  type Mesh2_t\r\n    real(8), allocatable :: nodes(:,:)\r\n  end type\r\nend module\r\n<\/pre>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\n  function func(mesh, IP) result(x)\r\n    implicit none\r\n    type(Mesh_t), intent(in) :: mesh\r\n    integer, intent(in) :: IP\r\n    real(8) :: x\r\n\r\n    x = mesh%nodes(IP)%xyz(1)\r\n  end function\r\n<\/pre>\n<\/td>\n<td>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\n__test_m_MOD_func:\r\n        movslq  (%rsi), %rax\r\n        addq    8(%rdi), %rax\r\n        salq    $5, %rax\r\n        addq    (%rdi), %rax\r\n        movsd   (%rax), %xmm0\r\n        ret\r\n<\/pre>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\n  function func2(nodes, IP) result(x)\r\n    implicit none\r\n    type(Point3D_t), intent(in) :: nodes(:)\r\n    integer, intent(in) :: IP\r\n    real(8) :: x\r\n\r\n    x = nodes(IP)%xyz(1)\r\n  end function\r\n<\/pre>\n<\/td>\n<td>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\n__test_m_MOD_func2:\r\n        movq    40(%rdi), %rcx\r\n        movslq  (%rsi), %rdx\r\n        movl    $1, %eax\r\n        testq   %rcx, %rcx\r\n        cmove   %rax, %rcx\r\n        leaq    -1(%rdx), %rax\r\n        imulq   %rcx, %rax\r\n        salq    $5, %rax\r\n        addq    (%rdi), %rax\r\n        movsd   (%rax), %xmm0\r\n        ret\r\n<\/pre>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\nfunction func3(MNP, nodes, IP) result(x)\r\n    implicit none\r\n    integer, intent(in) :: MNP\r\n    type(Point3D_t), intent(in) :: nodes(MNP)\r\n    integer, intent(in) :: IP\r\n    real(8) :: x\r\n\r\n    x = nodes(IP)%xyz(1)\r\n  end function\r\n<\/pre>\n<\/td>\n<td>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\n__test_m_MOD_func3:\r\n        movslq  (%rdx), %rax\r\n        salq    $5, %rax\r\n        movsd   -32(%rax,%rsi), %xmm0\r\n        ret\r\n<\/pre>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\n  function func4(mesh, IP) result(x)\r\n    implicit none\r\n    type(Mesh2_t), intent(in) :: mesh\r\n    integer, intent(in) :: IP\r\n    real(8) :: x\r\n\r\n    x = mesh%nodes(1,IP)\r\n  end function\r\n<\/pre>\n<\/td>\n<td>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\n__test_m_MOD_func4:\r\n        movq    (%rdi), %rdx\r\n        movslq  (%rsi), %rax\r\n        imulq   64(%rdi), %rax\r\n        addq    8(%rdi), %rax\r\n        movsd   8(%rdx,%rax,8), %xmm0\r\n        ret\r\n<\/pre>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\n  function func5(nodes, IP) result(x)\r\n    implicit none\r\n    real(8), intent(in) :: nodes(:,:)\r\n    integer, intent(in) :: IP\r\n    real(8) :: x\r\n\r\n    x = nodes(1,IP)\r\n  end function\r\n<\/pre>\n<\/td>\n<td>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\n__test_m_MOD_func5:\r\n        movq    40(%rdi), %rax\r\n        testq   %rax, %rax\r\n        je      .L58\r\n        movq    %rax, %rdx\r\n        negq    %rdx\r\n.L57:\r\n        movq    64(%rdi), %r8\r\n        movslq  (%rsi), %rcx\r\n        movq    (%rdi), %rdi\r\n        imulq   %r8, %rcx\r\n        subq    %r8, %rdx\r\n        addq    %rcx, %rax\r\n        addq    %rdx, %rax\r\n        movsd   (%rdi,%rax,8), %xmm0\r\n        ret\r\n.L58:\r\n        movq    $-1, %rdx\r\n        movl    $1, %eax\r\n        jmp     .L57\r\n<\/pre>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\n  function func6(MNP, nodes, IP) result(x)\r\n    implicit none\r\n    integer, intent(in) :: MNP\r\n    real(8), intent(in) :: nodes(3,MNP)\r\n    integer, intent(in) :: IP\r\n    real(8) :: x\r\n\r\n    x = nodes(1,IP)\r\n  end function\r\n<\/pre>\n<\/td>\n<td>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\n__test_m_MOD_func6:\r\n        movslq  (%rdx), %rax\r\n        leaq    -3(%rax,%rax,2), %rax\r\n        movsd   (%rsi,%rax,8), %xmm0\r\n        ret\r\n<\/pre>\n<\/td>\n<\/tr>\n<\/table>\n","protected":false},"excerpt":{"rendered":"<p>struct Point3D{ double x,y, z, w; }; struct Mesh { std::vector&lt;Point3D&gt; nodes; }; double func(const Mesh&amp; mesh, int IP) { return mesh.nodes&#x5B;IP].x; } func(Mesh const&amp;, int): movslq %esi, %rsi # convert IP vom 32bit integer to 64bit integer salq $5, %rsi # rsi = 32*rsi calculate offset in array. sizeof(Point3D) == 32 addq (%rdi), %rsi [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[17,30],"class_list":["post-4926","post","type-post","status-publish","format-standard","hentry","category-allgemein","tag-cpp","tag-fortran"],"_links":{"self":[{"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/posts\/4926","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=4926"}],"version-history":[{"count":18,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/posts\/4926\/revisions"}],"predecessor-version":[{"id":4944,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/posts\/4926\/revisions\/4944"}],"wp:attachment":[{"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=4926"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=4926"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=4926"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}